[tests] Require exact error messages in assertConsole helpers - #35497

Merged
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3
Jan 13, 2026
Merged

[tests] Require exact error messages in assertConsole helpers#35497
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3

Conversation

@rickhanlonii

@rickhanloniirickhanlonii commented Jan 12, 2026

Copy link
Copy Markdown
Contributor

Requires full error message in assert helpers.

Some of the error messages we asset on add a native javascript stack trace, which would be a pain to add to the messages and maintain. This PR allows you to just add \n in <stack> placeholder to the error message to denote a native stack trace is present in the message.


Note: i vibe coded this so it was a pain to backtrack this to break this into a stack, I tried and gave up, sorry.

Update test assertions to include the complete component stack trace
rather than partial stacks. This ensures tests validate the full
owner stack as it would appear in development.
@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Jan 12, 2026
@react-sizebot

react-sizebot commented Jan 12, 2026

Copy link
Copy Markdown

Comparing: 5aec1b2...e61f352

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=607.60 kB607.60 kB=107.53 kB107.53 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=666.83 kB666.83 kB=117.42 kB117.42 kB
facebook-www/ReactDOM-prod.classic.js=692.91 kB692.91 kB=121.92 kB121.92 kB
facebook-www/ReactDOM-prod.modern.js=683.34 kB683.34 kB=120.31 kB120.31 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against e61f352

Add two new placeholders for console error assertions:
1. [Server] - expands to the ANSI escape sequence for server badge
Instead of: '\u001b[0m\u001b[7m Server \u001b[0mError: message'
Write: '[Server] Error: message'
2. \n in <stack> - matches JavaScript Error stack traces
Instead of matching the full error stack manually
Write: 'Error: message\n in <stack>'
The error stack placeholder validates that it's only used for actual
Error stack traces (messages starting with "Error:" that have file:line:col
frames), not for React component stacks.
Also adds validation to catch misuse of these placeholders and provides
helpful error messages guiding developers to the correct usage.

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love it!

Comment on lines +234 to +239
// Error stack traces start with "Error:" and contain "at" frames with file paths
// Component stacks contain "in ComponentName" patterns
// This helps validate that \n in <stack> is used correctly
const isLikelyAnErrorStackTrace = message =>
typeof message === 'string' &&
message.includes('Error:') &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your implementation already accounts for e.g. TypeError() having TypeError: bla when stringified but the comments still says "start". Should prob update the comment to call out that includes is used to handle other kind of errors.

Also the input here is the stringified error instance not just the message. .message doesn't include the error name.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call, I noticed this while vibe coding too and meant to get back to it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated the tests to log an error, showing the behavior (and confirmed with logging).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

That sounds wrong. Maybe you're reading .stack instead of .message? .stack would include name, message, and stacktrace.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it was wrong, then this wouldn't work right? Like this function would noop, but if you noop it then the tests fail. Maybe there's a shim or console override adding it?

Comment threadpackages/react/src/__tests__/ReactChildren-test.js Outdated
Comment threadpackages/internal-test-utils/consoleMock.js Outdated
@rickhanlonii
rickhanlonii merged commit 3e1abcc into react:mainJan 13, 2026
234 checks passed
@rickhanlonii
rickhanlonii deleted the asserts-stack-3 branch January 14, 2026 15:30
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
rickhanlonii added a commit that referenced this pull request Jan 28, 2026
Stacked on #35497
-----
Now that the assert helpers require a component stack, we don't need the
`{withoutStack: true}` option.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rickhanlonii@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[tests] Require exact error messages in assertConsole helpers - #35497

Merged
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3
Jan 13, 2026
Merged

[tests] Require exact error messages in assertConsole helpers#35497
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3

Conversation

@rickhanlonii

@rickhanloniirickhanlonii commented Jan 12, 2026

Copy link
Copy Markdown
Contributor

Requires full error message in assert helpers.

Some of the error messages we asset on add a native javascript stack trace, which would be a pain to add to the messages and maintain. This PR allows you to just add \n in <stack> placeholder to the error message to denote a native stack trace is present in the message.


Note: i vibe coded this so it was a pain to backtrack this to break this into a stack, I tried and gave up, sorry.

Update test assertions to include the complete component stack trace
rather than partial stacks. This ensures tests validate the full
owner stack as it would appear in development.
@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Jan 12, 2026
@react-sizebot

react-sizebot commented Jan 12, 2026

Copy link
Copy Markdown

Comparing: 5aec1b2...e61f352

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=607.60 kB607.60 kB=107.53 kB107.53 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=666.83 kB666.83 kB=117.42 kB117.42 kB
facebook-www/ReactDOM-prod.classic.js=692.91 kB692.91 kB=121.92 kB121.92 kB
facebook-www/ReactDOM-prod.modern.js=683.34 kB683.34 kB=120.31 kB120.31 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against e61f352

Add two new placeholders for console error assertions:
1. [Server] - expands to the ANSI escape sequence for server badge
Instead of: '\u001b[0m\u001b[7m Server \u001b[0mError: message'
Write: '[Server] Error: message'
2. \n in <stack> - matches JavaScript Error stack traces
Instead of matching the full error stack manually
Write: 'Error: message\n in <stack>'
The error stack placeholder validates that it's only used for actual
Error stack traces (messages starting with "Error:" that have file:line:col
frames), not for React component stacks.
Also adds validation to catch misuse of these placeholders and provides
helpful error messages guiding developers to the correct usage.

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love it!

Comment on lines +234 to +239
// Error stack traces start with "Error:" and contain "at" frames with file paths
// Component stacks contain "in ComponentName" patterns
// This helps validate that \n in <stack> is used correctly
const isLikelyAnErrorStackTrace = message =>
typeof message === 'string' &&
message.includes('Error:') &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your implementation already accounts for e.g. TypeError() having TypeError: bla when stringified but the comments still says "start". Should prob update the comment to call out that includes is used to handle other kind of errors.

Also the input here is the stringified error instance not just the message. .message doesn't include the error name.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call, I noticed this while vibe coding too and meant to get back to it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated the tests to log an error, showing the behavior (and confirmed with logging).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

That sounds wrong. Maybe you're reading .stack instead of .message? .stack would include name, message, and stacktrace.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it was wrong, then this wouldn't work right? Like this function would noop, but if you noop it then the tests fail. Maybe there's a shim or console override adding it?

Comment threadpackages/react/src/__tests__/ReactChildren-test.js Outdated
Comment threadpackages/internal-test-utils/consoleMock.js Outdated
@rickhanlonii
rickhanlonii merged commit 3e1abcc into react:mainJan 13, 2026
234 checks passed
@rickhanlonii
rickhanlonii deleted the asserts-stack-3 branch January 14, 2026 15:30
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
rickhanlonii added a commit that referenced this pull request Jan 28, 2026
Stacked on #35497
-----
Now that the assert helpers require a component stack, we don't need the
`{withoutStack: true}` option.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rickhanlonii@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[tests] Require exact error messages in assertConsole helpers - #35497

Merged
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3
Jan 13, 2026
Merged

[tests] Require exact error messages in assertConsole helpers#35497
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3

Conversation

@rickhanlonii

@rickhanloniirickhanlonii commented Jan 12, 2026

Copy link
Copy Markdown
Contributor

Requires full error message in assert helpers.

Some of the error messages we asset on add a native javascript stack trace, which would be a pain to add to the messages and maintain. This PR allows you to just add \n in <stack> placeholder to the error message to denote a native stack trace is present in the message.


Note: i vibe coded this so it was a pain to backtrack this to break this into a stack, I tried and gave up, sorry.

Update test assertions to include the complete component stack trace
rather than partial stacks. This ensures tests validate the full
owner stack as it would appear in development.
@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Jan 12, 2026
@react-sizebot

react-sizebot commented Jan 12, 2026

Copy link
Copy Markdown

Comparing: 5aec1b2...e61f352

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=607.60 kB607.60 kB=107.53 kB107.53 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=666.83 kB666.83 kB=117.42 kB117.42 kB
facebook-www/ReactDOM-prod.classic.js=692.91 kB692.91 kB=121.92 kB121.92 kB
facebook-www/ReactDOM-prod.modern.js=683.34 kB683.34 kB=120.31 kB120.31 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against e61f352

Add two new placeholders for console error assertions:
1. [Server] - expands to the ANSI escape sequence for server badge
Instead of: '\u001b[0m\u001b[7m Server \u001b[0mError: message'
Write: '[Server] Error: message'
2. \n in <stack> - matches JavaScript Error stack traces
Instead of matching the full error stack manually
Write: 'Error: message\n in <stack>'
The error stack placeholder validates that it's only used for actual
Error stack traces (messages starting with "Error:" that have file:line:col
frames), not for React component stacks.
Also adds validation to catch misuse of these placeholders and provides
helpful error messages guiding developers to the correct usage.

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love it!

Comment on lines +234 to +239
// Error stack traces start with "Error:" and contain "at" frames with file paths
// Component stacks contain "in ComponentName" patterns
// This helps validate that \n in <stack> is used correctly
const isLikelyAnErrorStackTrace = message =>
typeof message === 'string' &&
message.includes('Error:') &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your implementation already accounts for e.g. TypeError() having TypeError: bla when stringified but the comments still says "start". Should prob update the comment to call out that includes is used to handle other kind of errors.

Also the input here is the stringified error instance not just the message. .message doesn't include the error name.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call, I noticed this while vibe coding too and meant to get back to it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated the tests to log an error, showing the behavior (and confirmed with logging).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

That sounds wrong. Maybe you're reading .stack instead of .message? .stack would include name, message, and stacktrace.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it was wrong, then this wouldn't work right? Like this function would noop, but if you noop it then the tests fail. Maybe there's a shim or console override adding it?

Comment threadpackages/react/src/__tests__/ReactChildren-test.js Outdated
Comment threadpackages/internal-test-utils/consoleMock.js Outdated
@rickhanlonii
rickhanlonii merged commit 3e1abcc into react:mainJan 13, 2026
234 checks passed
@rickhanlonii
rickhanlonii deleted the asserts-stack-3 branch January 14, 2026 15:30
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
rickhanlonii added a commit that referenced this pull request Jan 28, 2026
Stacked on #35497
-----
Now that the assert helpers require a component stack, we don't need the
`{withoutStack: true}` option.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rickhanlonii@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[tests] Require exact error messages in assertConsole helpers - #35497

Merged
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3
Jan 13, 2026
Merged

[tests] Require exact error messages in assertConsole helpers#35497
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3

Conversation

@rickhanlonii

@rickhanloniirickhanlonii commented Jan 12, 2026

Copy link
Copy Markdown
Contributor

Requires full error message in assert helpers.

Some of the error messages we asset on add a native javascript stack trace, which would be a pain to add to the messages and maintain. This PR allows you to just add \n in <stack> placeholder to the error message to denote a native stack trace is present in the message.


Note: i vibe coded this so it was a pain to backtrack this to break this into a stack, I tried and gave up, sorry.

Update test assertions to include the complete component stack trace
rather than partial stacks. This ensures tests validate the full
owner stack as it would appear in development.
@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Jan 12, 2026
@react-sizebot

react-sizebot commented Jan 12, 2026

Copy link
Copy Markdown

Comparing: 5aec1b2...e61f352

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=607.60 kB607.60 kB=107.53 kB107.53 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=666.83 kB666.83 kB=117.42 kB117.42 kB
facebook-www/ReactDOM-prod.classic.js=692.91 kB692.91 kB=121.92 kB121.92 kB
facebook-www/ReactDOM-prod.modern.js=683.34 kB683.34 kB=120.31 kB120.31 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against e61f352

Add two new placeholders for console error assertions:
1. [Server] - expands to the ANSI escape sequence for server badge
Instead of: '\u001b[0m\u001b[7m Server \u001b[0mError: message'
Write: '[Server] Error: message'
2. \n in <stack> - matches JavaScript Error stack traces
Instead of matching the full error stack manually
Write: 'Error: message\n in <stack>'
The error stack placeholder validates that it's only used for actual
Error stack traces (messages starting with "Error:" that have file:line:col
frames), not for React component stacks.
Also adds validation to catch misuse of these placeholders and provides
helpful error messages guiding developers to the correct usage.

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love it!

Comment on lines +234 to +239
// Error stack traces start with "Error:" and contain "at" frames with file paths
// Component stacks contain "in ComponentName" patterns
// This helps validate that \n in <stack> is used correctly
const isLikelyAnErrorStackTrace = message =>
typeof message === 'string' &&
message.includes('Error:') &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your implementation already accounts for e.g. TypeError() having TypeError: bla when stringified but the comments still says "start". Should prob update the comment to call out that includes is used to handle other kind of errors.

Also the input here is the stringified error instance not just the message. .message doesn't include the error name.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call, I noticed this while vibe coding too and meant to get back to it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated the tests to log an error, showing the behavior (and confirmed with logging).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

That sounds wrong. Maybe you're reading .stack instead of .message? .stack would include name, message, and stacktrace.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it was wrong, then this wouldn't work right? Like this function would noop, but if you noop it then the tests fail. Maybe there's a shim or console override adding it?

Comment threadpackages/react/src/__tests__/ReactChildren-test.js Outdated
Comment threadpackages/internal-test-utils/consoleMock.js Outdated
@rickhanlonii
rickhanlonii merged commit 3e1abcc into react:mainJan 13, 2026
234 checks passed
@rickhanlonii
rickhanlonii deleted the asserts-stack-3 branch January 14, 2026 15:30
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
rickhanlonii added a commit that referenced this pull request Jan 28, 2026
Stacked on #35497
-----
Now that the assert helpers require a component stack, we don't need the
`{withoutStack: true}` option.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rickhanlonii@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[tests] Require exact error messages in assertConsole helpers - #35497

Merged
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3
Jan 13, 2026
Merged

[tests] Require exact error messages in assertConsole helpers#35497
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3

Conversation

@rickhanlonii

@rickhanloniirickhanlonii commented Jan 12, 2026

Copy link
Copy Markdown
Contributor

Requires full error message in assert helpers.

Some of the error messages we asset on add a native javascript stack trace, which would be a pain to add to the messages and maintain. This PR allows you to just add \n in <stack> placeholder to the error message to denote a native stack trace is present in the message.


Note: i vibe coded this so it was a pain to backtrack this to break this into a stack, I tried and gave up, sorry.

Update test assertions to include the complete component stack trace
rather than partial stacks. This ensures tests validate the full
owner stack as it would appear in development.
@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Jan 12, 2026
@react-sizebot

react-sizebot commented Jan 12, 2026

Copy link
Copy Markdown

Comparing: 5aec1b2...e61f352

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=607.60 kB607.60 kB=107.53 kB107.53 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=666.83 kB666.83 kB=117.42 kB117.42 kB
facebook-www/ReactDOM-prod.classic.js=692.91 kB692.91 kB=121.92 kB121.92 kB
facebook-www/ReactDOM-prod.modern.js=683.34 kB683.34 kB=120.31 kB120.31 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against e61f352

Add two new placeholders for console error assertions:
1. [Server] - expands to the ANSI escape sequence for server badge
Instead of: '\u001b[0m\u001b[7m Server \u001b[0mError: message'
Write: '[Server] Error: message'
2. \n in <stack> - matches JavaScript Error stack traces
Instead of matching the full error stack manually
Write: 'Error: message\n in <stack>'
The error stack placeholder validates that it's only used for actual
Error stack traces (messages starting with "Error:" that have file:line:col
frames), not for React component stacks.
Also adds validation to catch misuse of these placeholders and provides
helpful error messages guiding developers to the correct usage.

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love it!

Comment on lines +234 to +239
// Error stack traces start with "Error:" and contain "at" frames with file paths
// Component stacks contain "in ComponentName" patterns
// This helps validate that \n in <stack> is used correctly
const isLikelyAnErrorStackTrace = message =>
typeof message === 'string' &&
message.includes('Error:') &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your implementation already accounts for e.g. TypeError() having TypeError: bla when stringified but the comments still says "start". Should prob update the comment to call out that includes is used to handle other kind of errors.

Also the input here is the stringified error instance not just the message. .message doesn't include the error name.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call, I noticed this while vibe coding too and meant to get back to it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated the tests to log an error, showing the behavior (and confirmed with logging).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

That sounds wrong. Maybe you're reading .stack instead of .message? .stack would include name, message, and stacktrace.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it was wrong, then this wouldn't work right? Like this function would noop, but if you noop it then the tests fail. Maybe there's a shim or console override adding it?

Comment threadpackages/react/src/__tests__/ReactChildren-test.js Outdated
Comment threadpackages/internal-test-utils/consoleMock.js Outdated
@rickhanlonii
rickhanlonii merged commit 3e1abcc into react:mainJan 13, 2026
234 checks passed
@rickhanlonii
rickhanlonii deleted the asserts-stack-3 branch January 14, 2026 15:30
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
rickhanlonii added a commit that referenced this pull request Jan 28, 2026
Stacked on #35497
-----
Now that the assert helpers require a component stack, we don't need the
`{withoutStack: true}` option.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rickhanlonii@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[tests] Require exact error messages in assertConsole helpers - #35497

Merged
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3
Jan 13, 2026
Merged

[tests] Require exact error messages in assertConsole helpers#35497
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3

Conversation

@rickhanlonii

@rickhanloniirickhanlonii commented Jan 12, 2026

Copy link
Copy Markdown
Contributor

Requires full error message in assert helpers.

Some of the error messages we asset on add a native javascript stack trace, which would be a pain to add to the messages and maintain. This PR allows you to just add \n in <stack> placeholder to the error message to denote a native stack trace is present in the message.


Note: i vibe coded this so it was a pain to backtrack this to break this into a stack, I tried and gave up, sorry.

Update test assertions to include the complete component stack trace
rather than partial stacks. This ensures tests validate the full
owner stack as it would appear in development.
@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Jan 12, 2026
@react-sizebot

react-sizebot commented Jan 12, 2026

Copy link
Copy Markdown

Comparing: 5aec1b2...e61f352

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=607.60 kB607.60 kB=107.53 kB107.53 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=666.83 kB666.83 kB=117.42 kB117.42 kB
facebook-www/ReactDOM-prod.classic.js=692.91 kB692.91 kB=121.92 kB121.92 kB
facebook-www/ReactDOM-prod.modern.js=683.34 kB683.34 kB=120.31 kB120.31 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against e61f352

Add two new placeholders for console error assertions:
1. [Server] - expands to the ANSI escape sequence for server badge
Instead of: '\u001b[0m\u001b[7m Server \u001b[0mError: message'
Write: '[Server] Error: message'
2. \n in <stack> - matches JavaScript Error stack traces
Instead of matching the full error stack manually
Write: 'Error: message\n in <stack>'
The error stack placeholder validates that it's only used for actual
Error stack traces (messages starting with "Error:" that have file:line:col
frames), not for React component stacks.
Also adds validation to catch misuse of these placeholders and provides
helpful error messages guiding developers to the correct usage.

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love it!

Comment on lines +234 to +239
// Error stack traces start with "Error:" and contain "at" frames with file paths
// Component stacks contain "in ComponentName" patterns
// This helps validate that \n in <stack> is used correctly
const isLikelyAnErrorStackTrace = message =>
typeof message === 'string' &&
message.includes('Error:') &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your implementation already accounts for e.g. TypeError() having TypeError: bla when stringified but the comments still says "start". Should prob update the comment to call out that includes is used to handle other kind of errors.

Also the input here is the stringified error instance not just the message. .message doesn't include the error name.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call, I noticed this while vibe coding too and meant to get back to it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated the tests to log an error, showing the behavior (and confirmed with logging).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

That sounds wrong. Maybe you're reading .stack instead of .message? .stack would include name, message, and stacktrace.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it was wrong, then this wouldn't work right? Like this function would noop, but if you noop it then the tests fail. Maybe there's a shim or console override adding it?

Comment threadpackages/react/src/__tests__/ReactChildren-test.js Outdated
Comment threadpackages/internal-test-utils/consoleMock.js Outdated
@rickhanlonii
rickhanlonii merged commit 3e1abcc into react:mainJan 13, 2026
234 checks passed
@rickhanlonii
rickhanlonii deleted the asserts-stack-3 branch January 14, 2026 15:30
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
rickhanlonii added a commit that referenced this pull request Jan 28, 2026
Stacked on #35497
-----
Now that the assert helpers require a component stack, we don't need the
`{withoutStack: true}` option.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rickhanlonii@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[tests] Require exact error messages in assertConsole helpers - #35497

Merged
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3
Jan 13, 2026
Merged

[tests] Require exact error messages in assertConsole helpers#35497
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3

Conversation

@rickhanlonii

@rickhanloniirickhanlonii commented Jan 12, 2026

Copy link
Copy Markdown
Contributor

Requires full error message in assert helpers.

Some of the error messages we asset on add a native javascript stack trace, which would be a pain to add to the messages and maintain. This PR allows you to just add \n in <stack> placeholder to the error message to denote a native stack trace is present in the message.


Note: i vibe coded this so it was a pain to backtrack this to break this into a stack, I tried and gave up, sorry.

Update test assertions to include the complete component stack trace
rather than partial stacks. This ensures tests validate the full
owner stack as it would appear in development.
@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Jan 12, 2026
@react-sizebot

react-sizebot commented Jan 12, 2026

Copy link
Copy Markdown

Comparing: 5aec1b2...e61f352

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=607.60 kB607.60 kB=107.53 kB107.53 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=666.83 kB666.83 kB=117.42 kB117.42 kB
facebook-www/ReactDOM-prod.classic.js=692.91 kB692.91 kB=121.92 kB121.92 kB
facebook-www/ReactDOM-prod.modern.js=683.34 kB683.34 kB=120.31 kB120.31 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against e61f352

Add two new placeholders for console error assertions:
1. [Server] - expands to the ANSI escape sequence for server badge
Instead of: '\u001b[0m\u001b[7m Server \u001b[0mError: message'
Write: '[Server] Error: message'
2. \n in <stack> - matches JavaScript Error stack traces
Instead of matching the full error stack manually
Write: 'Error: message\n in <stack>'
The error stack placeholder validates that it's only used for actual
Error stack traces (messages starting with "Error:" that have file:line:col
frames), not for React component stacks.
Also adds validation to catch misuse of these placeholders and provides
helpful error messages guiding developers to the correct usage.

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love it!

Comment on lines +234 to +239
// Error stack traces start with "Error:" and contain "at" frames with file paths
// Component stacks contain "in ComponentName" patterns
// This helps validate that \n in <stack> is used correctly
const isLikelyAnErrorStackTrace = message =>
typeof message === 'string' &&
message.includes('Error:') &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your implementation already accounts for e.g. TypeError() having TypeError: bla when stringified but the comments still says "start". Should prob update the comment to call out that includes is used to handle other kind of errors.

Also the input here is the stringified error instance not just the message. .message doesn't include the error name.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call, I noticed this while vibe coding too and meant to get back to it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated the tests to log an error, showing the behavior (and confirmed with logging).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

That sounds wrong. Maybe you're reading .stack instead of .message? .stack would include name, message, and stacktrace.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it was wrong, then this wouldn't work right? Like this function would noop, but if you noop it then the tests fail. Maybe there's a shim or console override adding it?

Comment threadpackages/react/src/__tests__/ReactChildren-test.js Outdated
Comment threadpackages/internal-test-utils/consoleMock.js Outdated
@rickhanlonii
rickhanlonii merged commit 3e1abcc into react:mainJan 13, 2026
234 checks passed
@rickhanlonii
rickhanlonii deleted the asserts-stack-3 branch January 14, 2026 15:30
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
rickhanlonii added a commit that referenced this pull request Jan 28, 2026
Stacked on #35497
-----
Now that the assert helpers require a component stack, we don't need the
`{withoutStack: true}` option.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rickhanlonii@react-sizebot@eps1lon
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[tests] Require exact error messages in assertConsole helpers - #35497

Merged
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3
Jan 13, 2026
Merged

[tests] Require exact error messages in assertConsole helpers#35497
rickhanlonii merged 16 commits into
react:mainfrom
rickhanlonii:asserts-stack-3

Conversation

@rickhanlonii

@rickhanloniirickhanlonii commented Jan 12, 2026

Copy link
Copy Markdown
Contributor

Requires full error message in assert helpers.

Some of the error messages we asset on add a native javascript stack trace, which would be a pain to add to the messages and maintain. This PR allows you to just add \n in <stack> placeholder to the error message to denote a native stack trace is present in the message.


Note: i vibe coded this so it was a pain to backtrack this to break this into a stack, I tried and gave up, sorry.

Update test assertions to include the complete component stack trace
rather than partial stacks. This ensures tests validate the full
owner stack as it would appear in development.
@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Jan 12, 2026
@react-sizebot

react-sizebot commented Jan 12, 2026

Copy link
Copy Markdown

Comparing: 5aec1b2...e61f352

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=607.60 kB607.60 kB=107.53 kB107.53 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.84 kB6.84 kB+0.05%1.88 kB1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=666.83 kB666.83 kB=117.42 kB117.42 kB
facebook-www/ReactDOM-prod.classic.js=692.91 kB692.91 kB=121.92 kB121.92 kB
facebook-www/ReactDOM-prod.modern.js=683.34 kB683.34 kB=120.31 kB120.31 kB

Significant size changes

Includes any change greater than 0.2%:

(No significant changes)

Generated by 🚫 dangerJS against e61f352

Add two new placeholders for console error assertions:
1. [Server] - expands to the ANSI escape sequence for server badge
Instead of: '\u001b[0m\u001b[7m Server \u001b[0mError: message'
Write: '[Server] Error: message'
2. \n in <stack> - matches JavaScript Error stack traces
Instead of matching the full error stack manually
Write: 'Error: message\n in <stack>'
The error stack placeholder validates that it's only used for actual
Error stack traces (messages starting with "Error:" that have file:line:col
frames), not for React component stacks.
Also adds validation to catch misuse of these placeholders and provides
helpful error messages guiding developers to the correct usage.

@eps1loneps1lon left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love it!

Comment on lines +234 to +239
// Error stack traces start with "Error:" and contain "at" frames with file paths
// Component stacks contain "in ComponentName" patterns
// This helps validate that \n in <stack> is used correctly
const isLikelyAnErrorStackTrace = message =>
typeof message === 'string' &&
message.includes('Error:') &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your implementation already accounts for e.g. TypeError() having TypeError: bla when stringified but the comments still says "start". Should prob update the comment to call out that includes is used to handle other kind of errors.

Also the input here is the stringified error instance not just the message. .message doesn't include the error name.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call, I noticed this while vibe coding too and meant to get back to it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated the tests to log an error, showing the behavior (and confirmed with logging).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the comment - The message does include the error name (and stack trace). I was surprised about this too.

That sounds wrong. Maybe you're reading .stack instead of .message? .stack would include name, message, and stacktrace.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it was wrong, then this wouldn't work right? Like this function would noop, but if you noop it then the tests fail. Maybe there's a shim or console override adding it?

Comment threadpackages/react/src/__tests__/ReactChildren-test.js Outdated
Comment threadpackages/internal-test-utils/consoleMock.js Outdated
@rickhanlonii
rickhanlonii merged commit 3e1abcc into react:mainJan 13, 2026
234 checks passed
@rickhanlonii
rickhanlonii deleted the asserts-stack-3 branch January 14, 2026 15:30
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Jan 17, 2026
…35497)
Requires full error message in assert helpers.
Some of the error messages we asset on add a native javascript stack
trace, which would be a pain to add to the messages and maintain. This
PR allows you to just add `\n in <stack>` placeholder to the error
message to denote a native stack trace is present in the message.
---
Note: i vibe coded this so it was a pain to backtrack this to break this
into a stack, I tried and gave up, sorry.
DiffTrain build for [3e1abcc](react@3e1abcc)
rickhanlonii added a commit that referenced this pull request Jan 28, 2026
Stacked on #35497
-----
Now that the assert helpers require a component stack, we don't need the
`{withoutStack: true}` option.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rickhanlonii@react-sizebot@eps1lon