Repository navigation
js_parser: attach the generated default name to an anonymous default function only in a bundle - #34932
js_parser: attach the generated default name to an anonymous default function only in a bundle#34932robobun wants to merge 10 commits into
Conversation
The visit pass was writing the generated default-export binding symbol
(`<basename>_default`) into `func.func.name` for `export default function () {}`
(and its async/generator variants), so the printer emitted
`export default function <basename>_default() {}` and the function's
observable `.name` became `"<basename>_default"` instead of `"default"`.
Per ES2015 15.2.3.11, an anonymous `export default` function declaration
gets its name via SetFunctionName(F, "default"); node prints "default".
The class path already only injects a name when decorator lowering
requires it; this brings the function path in line.
`data.default_name` is still recorded via `record_on_exit!()`, and the
bundler's own conversion in convertStmtsForChunk assigns the name
separately, so nothing else relies on this assignment.
|
Reproduced with: $ printf 'export default function () {}\nimport self from "./mod.mjs";\nconsole.log(JSON.stringify(self.name));\n' > /tmp/mod.mjs
$ bun /tmp/mod.mjs # bun 1.4.4
"mod_default"
$ node /tmp/mod.mjs
"default"PR: #34932 Status: draft, on purpose. The change is complete. The generated name is set only in a bundle (
|
WalkthroughChangesDefault export naming
Possibly related PRs
Pre-merge checks:
|
|
Updated 2:59 AM PT - Oct 30th, 2026
❌ @robobun, your commit 4e94d84 has 2 failures in
🧪 To try this PR locally: bunx bun-pr 34932That installs a local version of the PR into your bun-34932 --bun |
…ests
The React Fast Refresh transform emits $RefreshReg$(default_name_ref, ...)
for an anonymous default-exported function, and the HMR export lowering
relies on func.func.name being set to produce a binding for that ref.
Keep the name injection on that dev-only path so bake/dev react-spa
works, while the runtime transpiler (bun run / --no-bundle) still leaves
the function anonymous.
Also:
- 31401.test.ts: the third case asserted the --no-bundle identifier;
switch it to a bundled build, which still surfaces _1_default via
convertStmtsForChunk and preserves the original leading-digit check.
- runtime-transpiler.test.ts: assert {stdout, stderr, exitCode} as one
object instead of expect(stderr).toBe("").
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/js_parser/visit/visit_stmt.rs`:
- Around line 584-587: Shorten the comment near the generated function-name
handling to no more than three lines while preserving the essential points:
leave the name unset for default assignment, and inject it only for the React
Fast Refresh binding path.
In `@test/regression/issue/31401.test.ts`:
- Around line 48-49: Remove the prose comments in the regression test, including
the comment describing --no-bundle and convertStmtsForChunk; retain only the
issue URL comment required by the project’s regression-test convention.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 0525b3dc-1123-4c95-a29b-faf7034d3681
📒 Files selected for processing (3)
src/js_parser/visit/visit_stmt.rstest/bundler/transpiler/runtime-transpiler.test.tstest/regression/issue/31401.test.ts
runtime-transpiler.test.ts has an in-process dynamic .hbs import that is sensitive to the release transpiler cache; keep the new subprocess-based tests in a separate file so the gate's release lane stays deterministic.
There was a problem hiding this comment.
Beyond the inline nit, I re-checked the downstream consumers after the react_fast_refresh gating: convertStmtsForChunk.rs:525 still force-assigns s.default_name to func.name when stripping exports (so bundled output and the updated 31401 test are covered), and opts.features.react_fast_refresh is only ever set true on bundler/bake paths (ParseTask.rs:2475, bake/*) — never on the runtime transpiler — so the .name === "default" fix holds for bun run and --no-bundle while HMR keeps its binding.
Extended reasoning...
The only finding this run is a test-organization nit; the substantive concerns from my earlier passes (31401 breakage, HMR ReferenceError) were addressed in e4da3ef and I verified the current head still satisfies them: the bundler linker unconditionally names the function when lowering SExportDefault, and the feature flag the new gate reads is exclusively a bundler/dev-server flag. Deferring rather than approving because this is a parser visit-pass change that fans out to four output modes; the gating choice (keep name-injection under react_fast_refresh vs. teaching ConvertESMExportsForHmr to handle the anonymous case) is a small design call worth a maintainer glance.
There was a problem hiding this comment.
No issues found in this pass; all earlier feedback (HMR/$RefreshReg$ binding, 31401 test, stderr assertion, comment length, test-file placement) has been addressed. Deferring to a human because this is a user-observable parser output change whose first revision broke the Fast Refresh / HMR export-lowering path — someone familiar with bake/HMR should confirm the react_fast_refresh gate is the right seam.
Checked: the else { data.default_name.ref_ } arm in the fast-refresh block is now only reachable when func.func.name was set (gate matches), so ConvertESMExportsForHmr still gets a binding.
Checked: convertStmtsForChunk assigns default_name itself when stripping exports, and the updated 31401 test exercises that.
Checked: the server_components.wraps_exports() path without fast-refresh now wraps an anonymous function expr — the reference uses the "default" string arg, not .name, so no behavior loss.
The one CI failure (bun-server.test.ts on macOS aarch64) is unrelated to the parser.
Extended reasoning...
Overview
The PR gates a single assignment in src/js_parser/visit/visit_stmt.rs (s_export_default → SFunction arm): func.func.name = Some(data.default_name) now only fires when p.options.features.react_fast_refresh is set. This keeps export default function () {} anonymous in runtime-transpiler and --no-bundle output so the engine's SetFunctionName assigns .name = "default", matching Node and the ES2015 spec. A new test file covers function/async/generator/async-generator/class/arrow/named variants, and test/regression/issue/31401.test.ts is re-expressed against bundled output where convertStmtsForChunk still emits _1_default.
Security risks
None. This changes emitted identifier presence for anonymous default-exported functions; if anything it stops leaking the source file's basename via .name. No untrusted-input parsing, no allocation, no FFI.
Level of scrutiny
Moderate-to-high. The production diff is ~6 lines, but it sits in the parser visit pass and the removed assignment was doing double duty — it was both the source of the .name bug and the thing ConvertESMExportsForHmr relied on to produce a binding for $RefreshReg$. The first revision of this PR unconditionally removed the assignment and would have caused a runtime ReferenceError under bake HMR for anonymous default components in .tsx files; the current revision gates it correctly and test/bake/dev/react-spa.test.ts was verified locally. That history is exactly why a maintainer who owns bake/HMR should confirm react_fast_refresh is the right flag to gate on (vs. e.g. hot_module_reloading or checking both).
Other factors
- All four inline findings from earlier passes are resolved and marked as such in the thread.
- Test coverage is good: the variant matrix (all four function forms, class, arrow, named regression guard) is covered via subprocess spawns with combined
{stdout, stderr, exitCode}assertions; the bundler path's name-injection is still exercised by the updated 31401 test. - The separate
export-default-name.test.tsfile was justified by the author (a pre-existing cache-poisoning bug inruntime-transpiler.test.ts). - The one CI failure (
test/js/bun/http/bun-server.test.ts, macOS aarch64) is an HTTP test with no plausible connection to a parser identifier-emission change.
|
Findings from work on the same hunk, while I looked at #44721. I ran each item on release builds of main bd599f5 and of the branch below, except where it says "read". Gate. This PR sets the name only under Labels. Without a name, JSC binds the function to its private name
JavaScriptCore composes the last two itself ( Cache version. The printed text of a module changes, so One more effect. The runtime transpiler cache keys an entry on the content, not on the path. On main, a 73 KB |
The default export name fix changes the text that the runtime transpiler prints. An entry that an older build wrote holds the old text. With the same version, the new build reads that entry and the fix does not reach the file.
There was a problem hiding this comment.
Nothing blocking. The comments below are optional suggestions. There is no need to push a fix for them before merging.
Beyond the inline finding, I re-traced the react_fast_refresh gate through the HMR export lowering (src/js_parser/lower/lower_esm_exports_hmr.rs) in both flag states: with Fast Refresh on, the function keeps data.default_name so the $RefreshReg$ binding and the componentish-name edge case still resolve; with it off (including the bake server graph), the now-anonymous function takes the can_be_moved_to_inner_scope path and lands in export_props as an expression, so the default export is not lost. I also checked that bundled output still naming the function <file>_default is expected — the linker assigns the name in convertStmtsForChunk, independent of this parser change.
Extended reasoning...
The diff gates one line in s_export_default on react_fast_refresh, bumps EXPECTED_VERSION 43 to 44, adds a seven-case subprocess test, and reworks the --no-bundle case of test/regression/issue/31401.test.ts into a bundled case. No security-sensitive surface is touched. A verified inline finding is posted and further verified findings were not posted, so approval is withheld; the note above records only what this run additionally ruled out.
Additional findings (outside the current diff — GitHub can't attach inline comments there):
-
🟣
src/js_parser/visit/visit_stmt.rs— pre-existing: callers of Bun.Transpiler or bun build targeting browser or node lose the default export when a module has a top-levelusingand anexport default functionorexport default class. The SFunction arm at src/js_parser/visit/visit_stmt.rs:851 pushes the SExportDefault statement unchanged, and the using lowering at src/js_parser/p.rs:9964 drops every SExportDefault, expecting an export clause that only the Expr arm (visit_stmt.rs:591-627) emits. Fix: whenp.will_wrap_module_in_try_catch_for_usingholds at module scope, emitvar <default_name> = function…plusexport { <default_name> as default }in both the SFunction arm and the SClass arm (visit_stmt.rs:933), as the Expr arm does and as esbuild does for all three forms.Why this was flagged
Input: a module such as
using a = b;\nexport default function () {}transpiled withnew Bun.Transpiler({ target: "browser" }).transformSync(...)or bundled withbun build --target=browser;lower_usingis set to!target.is_bun()at src/bundler/transpiler.rs:1550.should_lower_using_declarations(src/js_parser/p.rs:8336) returns true, so visit/mod.rs:1771-1784 runsLowerUsingDeclarationsContext::finalize. In s_export_default the SFunction arm only pushes the original SExportDefault statement (visit_stmt.rs:851); the SClass arm does the same at visit_stmt.rs:933.finalizeat src/js_parser/p.rs:9964 hasSExportDefault(_) => continue, but that var-plus-export-clause pair is created only in the Expr arm (visit_stmt.rs:591-627). So the function or class default export is dropped from the output: Bun.Transpiler returns code with no default export, and the bundler records no "default" export so importers fail to link. The base branch behaves the same; this diff touches the SFunction arm but does not change this path, so it is pre-existing.Verification: pre-existing. Trigger: a module with a top-level
usingplusexport default function () {}transpiled or bundled for a non-Bun target. TheStmtarms ofs_export_defaultpush theSExportDefaultstatement unchanged (src/js_parser/visit/visit_stmt.rs:851, 933).finalizethen dropsSExportDefaultat src/js_parser/p.rs:9964, so the default export is removed from the output. The base branch fails by the same route.
|
The finding about a top-level The defect is on main and this PR does not change that path. This PR does not fix it. |
`s_export_default` set the generated `<file>_default` name only under `react_fast_refresh`. Every other bundler parse then lost the name until the linker set it again. The React Compiler stopped compiling an anonymous default function in `App.tsx`, and `--minify` and the dev server printed other text than main. The condition is now `p.options.bundle`. Every bundler parse runs the statements of main. A parse without a bundle leaves the function anonymous, so its `.name` is "default". The tests move into the test files of the transpiler, the runtime transpiler and the transpiler cache. The condition and the `Bun.Transpiler` case come from 33ef9bd.
export default function anonymous so .name is "default"|
Findings from a second design review of this change. It ran on the state before cb7101f, and it agrees with that commit on the condition ( Order. The review ranks this PR as the second of two parts. The first part is a rule that shows the private name
An assertion for the condition. Nothing states today that each reader of the name is a bundler feature. The review asks for one debug_assert!(
p.options.bundle
|| !(p.options.features.hot_module_reloading
|| p.options.features.react_fast_refresh
|| p.options.features.react_compiler.is_enabled()
|| p.options.features.server_components.wraps_exports())
);I built it. With one of the four features forced on in a parse without a bundle, the debug build stops at that line. The four features are set only in
Two more numbers from the same builds:
The assertion and the test case can go in with the push that takes this PR out of draft, after the rule of the first part is on main. That push also adds the rows of the function forms to the label tests. |
…bundle `s_export_default` names an anonymous default function only when `p.options.bundle` is set. Hot module reloading, React Fast Refresh, the React Compiler and the server components wrapper read that name. Only `ParseTask` turns them on, after it sets `bundle`, and nothing stated that. A debug assertion at the start of the parse states it now: a parse without a bundle that turns one of them on stops there in a debug or ASAN build. Tests: - react-compiler: an anonymous default function in `App.jsx` is compiled in a bundle. The case fails when the name is set under `react_fast_refresh` and not under `bundle`. - 31401: a decorated anonymous default class in `1.ts` keeps a valid generated name without a bundle. No other case prints a generated name without a bundle now. - transpiler-cache: the title of the case names the function form.
The two comment lines above the assertion said why the features need a bundle. The assertion now says it in its message, where the build that stops there prints it.
|
The rule for the label is now proposed in JavaScriptCore: oven-sh/WebKit#950 stores the name This pull request lands after that change reaches Bun. Without it, a declaration that reaches JavaScriptCore with no name shows |
|
The Bun pull request for the labels is #47502 (draft, on the preview build of oven-sh/WebKit#950). This pull request lands after it. |
Problem
export default functionhas the.name"<file>_default"("mod_default"formod.mjs). ECMA-262, node and two test262 files say"default".s_export_default(src/js_parser/visit/visit_stmt.rs:666) writes the generated binding into the function name.Fix
p.options.bundleis set. Without a bundle JSC names the function"default".Background
<file>_default. In a bundle the linker, HMR, Fast Refresh and the React Compiler read it.*default*, printedstarDefault.<file>_defaultbinding of an anonymous default export has no collision guard without a bundle #44721 (the collision of that symbol) was closed as not planned.react_fast_refresh: 15 of 77 bundle outputs change.Downsides
*default*asdefaultis on main (Name anonymous export default functions and classes "default" in stack traces and inspect #38517, in conflict today). Alone, a frame readsat starDefaultbefore a read of.nameandat defaultafter. Main shows<file>_default."", a CPU profile saysdefaultwith no file hint, and a stored snapshot of such a function fails underCI=1.Notes
Repro.
The
async, generator and async generator forms have the same defect.export default class {}andexport default () => 1are already right on main.Scope. The claim is for the four forms of an anonymous
export default functiondeclaration: plain,async, generator and async generator. Two test262 files cover it,test/language/module-code/instn-named-bndng-dflt-fun-anon.jsandinstn-named-bndng-dflt-gen-anon.js. With a preload that definesassert.sameValue, both fail on bun 1.4.4 and on main da867c6 and pass on this branch. Other cases of function names that Bun gets wrong are not part of this change (see "Not fixed here").Who asked. Nobody reported this. I found no issue from a user about the
.name, aboutString(fn)or about the collision. #44721 described the collision of the generated symbol, and Jarred-Sumner closed it as not planned on 2026-10-08: "GitHub issues are for user-facing issues and a user did not run into this issue". The reach is measurable: d3 7.9.0 exports 696 functions, and 210 of them are anonymous default functions. They are named<file>_defaulton main anddefaulton this branch and on node v26.3.0.The condition.
bundleis set only by the bundler (src/bundler/ParseTask.rs:2438,bundle_v2.rs:7462), in front of the features that read the name. Sobun <file>,bun build --no-bundleandBun.Transpilerleave the function anonymous, and every bundler parse runs the same statements as on main. The linker sets the name again when it strips the export (convertStmtsForChunk.rs), so a bundle keepsfunction mod_default() {}and.namestays the generated name there. The condition and theBun.Transpilertest case come from commit 33ef9bd (branchrobobun/da68edbd/anonymous-default-export-name, described in the comment of 2026-10-08 on this PR).The assertion. Four features read the name: hot module reloading (
lower_esm_exports_hmr.rs:234unwraps it), React Fast Refresh, the React Compiler and the server components wrapper. OnlyParseTaskturns them on (ParseTask.rs:2503,:2507,:2509,:2520), after it setsbundle. Nothing stated that, so a later change could turn one of them on without a bundle and lose the name with no failing test.parse_entry.rsnow has adebug_assert!for it at the start of the parse, beside the assertion abouttree_shaking. Its message gives the reason. Withreact_fast_refreshforced on inTranspiler::parse_internal, the debug build stops at that line for any module. Release builds leavedebug-assertionsoff, so the assertion costs nothing there. The ASAN lanes of CI have it on. #42033 (open) turns the React Compiler on without a bundle, so whichever of the two lands second has to set the name for that case.The first revision. It set the name only under
react_fast_refresh. That flag belongs to one of the readers. The others then lost the name before the linker set it again. The matrix below shows what changed:bun build --react-compilerno longer compiled an anonymous default function inApp.tsxoruseCounter.tsx,--minifyassigned other short names, and--format=internal_bake_devprinted other text.Measurements. Release builds are main da867c6 and this branch at cb7101f, built here with
bun run build:release. The two commits after it (1318657, 4e94d84) add the debug assertion and tests, so these release numbers hold for the head.export default function: breakpoint not hit..text+0 bytes and the stripped binary +0 bytes (nm -S, size -A, main da867c6 vs PR).catch syscall, 3 equal rounds: +2 openat, +2 close, +1 fallocate, +1 pwritev, +1 renameat, +1 unlink, -2 pread64). A same-content twin prints "default" for both paths (main:alpha_defaultfor both).strace,perfandvalgrindare not installed in the container. The system calls are counted with gdb, and the instructions with a gdbstepiloop from the entry of the function to its return, callees included.The bundler matrix. Fixtures:
App.tsxanduseCounter.tsx(anonymous default with hooks),widget.tsx,Named.tsx,Arrow.tsx,route.ts,util.mjs, an entry that imports an anonymous default component fromnode_modules, an entry that imports two anonymous default functions, a"use client"module, an anonymous default class with a decorator. Flags: none,--minify,--react-compiler,--react-fast-refresh, both,--format=internal_bake_dev,--target=bun, each withreactexternal. Each cell is written with--outfileand compared withcmp.Labels.
fn.mjsholdsexport default function () { throw new Error("boom") }. Release builds of main da867c6 and of this branch at cb7101f, and node v26.3.0. "The rule" is the change that shows*default*asdefault(see "Order of landing"). The last column is read from the diff of commit 4e1498f. It is not built here.starDefaultuntil something reads.name, anddefaultafter that. A frame of a resumed async or generator function keepsstarDefault. So a snapshot oferror.stackcan differ betweenbun testandbun test -t. On main the label is wrong and stable.JSMockFunction.cpp:307readsJSFunction::name, which is empty for*default*. Neither Name anonymous export default functions and classes "default" in stack traces and inspect #38517 nor 4e1498f touches that file..namelabel readsdefault, as on node. The file hint of main (<file>_default) is gone from such labels, from a CPU profile and from a stored snapshot value. In a run of the self-review the CPU profile also had astarDefaultrow for the same function. A comment of 2026-10-08 on this PR names heap snapshot class names and debugger call frames too. I did not run those two.Error.captureStackTrace(e, fn). This is a change of a result, not of a label.hide.mjsandouter.mjseach hold an anonymous default function. The stack iscapture < outer < viaOuter < hide < top, andcapturecallsError.captureStackTrace(e, hide).isFrameOfCaller(src/jsc/bindings/ErrorStackTrace.cpp) compares by identity and then by name, and both functions are namedstarDefault. Main has the same false match for two anonymous default arrows or classes. The rule gives both the namedefault, so it does not remove the match.Order of landing. Do not merge this PR before the rule is on main. Two places can hold the rule:
robobun/da68edbd/anonymous-default-export-nameis the same mapping on a newer main (+17/-5 inErrorStackTrace.cpp,ErrorStackTrace.handbindings.cpp). It applies to this branch with no conflict. It has no tests. The tests are in Name anonymous export default functions and classes "default" in stack traces and inspect #38517.When the rule is on main, this PR takes main and adds the rows of the function forms to
test/js/bun/test/stack.test.tsandtest/js/bun/util/inspect.test.js(from commit 33ef9bd). Then CI fails if the order is wrong. Two concerns of the self-review wait for that push: those label rows, and a case that pins thecaptureStackTraceresult.Two questions for a maintainer.
.nameat runtime wanted now, with no report from a user?Two gains, for the function forms.
const fn_default = 1; export default function () {}infn.jsgivesSyntaxError: Cannot declare a const variable twice: 'fn_default'.on bun 1.4.4. This branch and node print1.alpha.mjsandbeta.mjswith the same text both reportalpha_defaultfrom one cache folder. This branch reportsdefaultfor both.Not fixed here.
s_export_default: an anonymous default class with a decorator or anaccessorfield (visit_stmt.rs:906-909), and a default export under a lowered top-levelusing(:592).const cls_default = 1; export default class { accessor x = 1 }still throws the SyntaxError on this branch, and such a class keeps<file>_defaultas its.name. js_parser: name an anonymous decorated export default class "default" #38758 is open for the name of a decorated class. The collision has no open pull request..namestays the generated name, as on main.bun build --react-compilerstill compiles an anonymous default function only when the file name reads as a component or hook name (App.tsxyes,widget.tsxno). That is the behavior of main, and this PR does not change it.(0, function () {}), are in js_parser: don't inline single-use anonymous fn/arrow/class initializers #36313, js_parser: do not fold{ f: () => {} }.fto the bare function #42585 and js_parser: keep(0, value)where a fold would let a binding name an anonymous function or class #42691.Other pull requests. #38287 edits the same function and inserts the name with
get_or_insert, so the two meet in a merge. #42033 turns the React Compiler on without a bundle (see "The assertion"). #47390 adds a source lint for the cache version.Tests.
test/bundler/transpiler/runtime-transpiler.test.ts:.nameof the four function forms through a static import, a re-export,import()andrequire()of the module,String(fn),typeof fn_default, an import cycle that reads.namebefore the body of the module runs, and the module withconst fn_default.test/bundler/transpiler/transpiler.test.js:Bun.Transpilerreturns the four forms unchanged, also withminify.identifiers.test/cli/run/transpiler-cache.test.ts: two files with the same text and one cache folder.test/regression/issue/31401.test.ts: the--no-bundlecase expectsexport default function () {}. A new case keeps the check of js_parser: sanitize auto-generated default export name for digit-named modules #31403 without a bundle: a decorated anonymous default class in1.tsprintsexport default class _1_default {. The bundle case pins that a bundle keeps the valid identifier_1_default.test/bundler/transpiler/react-compiler.test.ts:bun build --react-compilercompiles an anonymous default function inApp.jsx. This case tells the conditionbundlefrom the condition of the first revision: withreact_fast_refreshas the condition it fails (debug build, the output has noreact/compiler-runtime).runtime-transpiler.test.tsand 1 in each oftranspiler.test.js,transpiler-cache.test.tsand31401.test.ts. The React Compiler case, the class case and the bundle case pass on main on purpose.Cache version.
EXPECTED_VERSION(src/jsc/RuntimeTranspilerCache.rs) is 43 in bun 1.4.4 and on main. The rule at the top ofsrc/js_parser/parser.rsasks for a new version when a parser change alters what runs. Probe: a 5 KB module withexport default function () {}that prints its own.name, and one cache folder. The older build runs the file first, then the new build runs it.Other open PRs also change this number, and they do not all take the same one. All of them edit the same line, so each PR that lands after the first one conflicts. The rule for that rebase: take the number that main has at that time plus one, never a lower number. #47390 adds a source lint that fails when a merge lowers the number.
Cost of the new cache version. Measured on bun 1.4.4 (release, linux x64):
require()of one file, a cache miss against a cache hit, 15 interleaved runs, median wall clock. The noise floor is the difference between two interleaved series of hits.The cost occurs once per cached file, on its first run after the upgrade. It is shared with any other change in the same release that takes a new version.
Merge with main. The branch has main da867c6 merged in. Main f7607a3 merges with no conflict and still has
EXPECTED_VERSION43. The diff against main is the condition ins_export_default, the assertion inparse_entry.rs, the cache version and five test files.Suites run on this branch (debug build, 1318657; the quick files again at 4e94d84).
test/regression/issue/31401.test.ts,test/cli/run/transpiler-cache.test.ts,test/bundler/transpiler/runtime-transpiler.test.ts,test/bundler/transpiler/transpiler.test.js: 307 pass, 2 skip, 21 todo.test/bundler/transpiler/react-compiler.test.ts,test/bundler/bundler_jsx.test.ts: 187 pass, 1 skip, 6 todo.test/bake/dev/react-spa.test.ts,hot.test.ts,esm.test.ts,bundle.test.ts,react-response.test.ts: 96 pass. These run hot module reloading, Fast Refresh and server components, and the assertion does not stop them.react-compiler-fixtures.test.ts,react-compiler-fixtures-run.test.ts,es-decorators.test.ts,test/bundler/bundler_minify.test.tsand all oftest/bake/dev/passed, except one 5 s timeout inproduction > works with sourcemaps - error thrown in React component, which also fails 1 of 2 runs on the debug build of main.test/aot/parallel/errors/names-of-functions-behind-export-default/main.mjsneeds a canary build and was not run here. Its stored output is what the executable prints, and the bundler input of that build does not change.Self-review. It raised 24 concerns and asked for no change of the condition. Addressed in this push or in this description: the order of landing, the assertion, the case that tells the two conditions apart, the scope of the claims, the labels that stay, the missing report from a user, and the check of #31403 without a bundle. Two wait for the rule, as "Order of landing" says.
[review] gate passed · iteration 4 · 3 files touched
fails on main (without fix)
passes on PR (with fix)
diff hotspot
gate history · 3 passed · 1 rejected · iteration 4
evidence per changed file