Skip to content

bundler: remove export * of a disabled import instead of printing __reExport - #47449

Open
robobun wants to merge 4 commits into
mainfrom
robobun/a59a4496/disabled-export-star
Open

robobun wants to merge 4 commits into
mainfrom
robobun/a59a4496/disabled-export-star

Conversation

@robobun

@robobun robobun commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

  • With ESM output, a browser build prints __reExport(exports_re, fs) for export * from "fs" in a non-entry module: ReferenceError: fs is not defined. @aws-sdk/credential-provider-web-identity 3.664.0 throws ReferenceError: fromTokenFile is not defined.
  • cjs and iife output export the stub's length and name. A wrapped entry point keeps the statement in its wrapper: SyntaxError.
  • convert_stmts_for_chunk (src/bundler/linker_context/convertStmtsForChunk.rs:184) handles a disabled import as an external module.

Fix

  • convert_stmts_for_chunk removes the statement of a disabled record with no source index, where it would become __reExport or sit in a wrapper.
  • Correct: no module is behind that record. Its named imports are already undefined.
  • Verified: test/bundler/bundler_browser.test.ts, 13 new cases. 8 fail on main's src/. The other 5 pin the conditions.
  • Self-reviewed: 35 concerns on an earlier cut, 26 addressed, 1 for js_printer: print the ; between the two vars of a disabled import d, * as ns #47435, 8 in Downsides.

Background

  • A browser build disables the import of a Node.js builtin with no polyfill, and of a "browser" map false entry. The printer prints the stub (() => ({})).
  • __reExport(target, mod) copies the property names of mod to target at run time, for an export * target outside the bundle.
  • Considered bundler: name the namespace of an external export * in a non-entry module #41220 (it declares the namespace for that call): alone, it stops only the two ReferenceErrors. See Notes.

Downsides

  • cjs and iife: export * from "fs" no longer exports length and name.
  • Not repaired (8 concerns): an unwrapped entry point of ESM output prints the statement as written. A maintainer must decide (Notes).
  • The unused __reExport helper stays in the bundle (775 B in a one-module probe). .text: +112 B.
Notes

No linked issue.

What each change does. Release builds (--lto=off) of main 9fe1cd6, of main with the source change of #41220, of this PR, and of both. Browser target, output run with Node.js 26.3.0.

Input main #41220 alone this PR both
ESM. export * from "fs" in a module that is imported statically ReferenceError: fs is not defined keys ["b"] ["b"] ["b"]
ESM. The same in a module loaded with require() or import() the same throw ["c","length","name"] ["c"] ["c"]
cjs and iife. Each of the two ["b","length","name"] as main ["b"] ["b"]
cjs and iife. export * from "node:fs"; export * from "pkg", and pkg exports name: "pkg" name is "" as main "pkg" "pkg"
ESM. A wrapped entry point SyntaxError as main loads loads
The AWS files, ESM, --external '@aws-sdk/client-sts' ReferenceError: fromTokenFile is not defined loads loads loads

Question for a maintainer. Should this statement also go away where main prints it as written? This PR does not change that output. It is an unwrapped entry point of ESM output. With --splitting, a module that import() loads is one too.

  • export * from "node:fs" there re-exports the 104 names of the host module under Node.js. A browser cannot load the file.
  • export * from "./from-file" of a "browser" map false file is printed with that path. The AWS package, loaded with import() under --splitting, fails with ERR_MODULE_NOT_FOUND.
  • esbuild 0.21.5 prints no export * for the "browser" map case. For the builtin it stops with Could not resolve "fs".
  • Exact --external fs does not keep the import (Flagging Node Dependencies with --external does not work #2701, resolver: check user externals before browser node builtin polyfills #35212). --external 'fs*' does.
  • A wrapped entry point printed a SyntaxError on main. This PR removes the statement there.

Not changed here. Each row gives the same output on main and on this PR.

Case Output Tracker
A name read through a disabled export * in a "sideEffects": false package ReferenceError: exports_barrel is not defined #46903, #18008
export * of a real external in a non-entry module, ESM output ReferenceError #41220, #15997
export * of a real external in a wrapped entry point SyntaxError: Unexpected token 'export' none found
A "browser" map entry set to false #40832 bundles it as an empty module. This change then applies to the builtin stubs. #40832
The dev server It has its own function, convert_stmts_for_chunk_for_dev_server. #46579
Exact --external fs The stub wins. #35212, #2701
import("fs") of a stubbed builtin Printed as written. none. A first version of this work printed Promise.resolve(<stub>) and broke await import("node:fs") in a default-target bundle under Node.js.
A CommonJS module whose module.exports is a function, through export * The keys length, name and prototype are exports. #46594
The missing ; of import d, * as ns #47435

Other readers of a disabled record are not changed: an unused import * as fs from "fs" still prints var fs = (() => ({}));, and the metafile lists the import with "external": true. Related: #46548 builds the page of a server build with the options of the browser target.

The condition.

  • record.path.is_disabled && !record.source_index.is_valid(): a plugin module with the path fs gets linked to a later import of "fs". That record is disabled and has a module behind it, so its export * stays. 12 of 12 bundles of that state are byte-identical to main.

  • !is_module_exports_of_wrapped_file: module.exports = require("fs") in a file of an unwrapped package (react-dom 18) is an export * inside the bundler. The wrapper still assigns the stub.

  • wrap != WrapKind::None || CALLS_RUNTIME_RE_EXPORT_FN: scan_imports_and_exports sets the flag where it plans the __reExport call. The condition reads that plan and does not repeat the entry point test.

  • Five release builds, each with one clause deleted, and the case that then fails:

    • no source_index test: the 3 PluginModuleWithBuiltinPathExportStar cases
    • no is_module_exports_of_wrapped_file test: NodeBuiltinStubModuleExportsRequire
    • no third clause: NodeBuiltinStubExportStarEntryPointESM
    • no wrap test: NodeBuiltinStubExportStarWrappedEntryPoint
    • no flag test: 7 of the 8 cases that fail on main

    esbuild/importstar.test.ts has 99 pass on each of the five.

  • scan_imports_and_exports is not changed. A guard there keeps the helper out of the bundle, but it rewrites the lines that bundler: name the namespace of an external export * in a non-entry module #41220 changes.

Measurements. Release builds with --lto=off of main 9fe1cd6 and of main with this change, in one build directory. ThinLTO was not measured.

  • .text: 103,985,936 to 103,986,048 B (+112 B, size -A). convert_stmts_for_chunk: 6,350 to 6,455 B (nm -S). scan_imports_and_exports: 56,344 B on both. The size of the bun file does not change.
  • The new test runs once for each export * from statement that the linker converts: 2 hits for a 9-module bundle with two such statements (gdb breakpoint count, debug build). A record that is not disabled leaves after one byte test. No allocation.
  • 25 of 25 bundles with no disabled record are byte-identical to main: 3 targets, 3 formats, plain and --minify, with and without --splitting, and --no-bundle. The libraries.js corpus of bundler_bytecode_portable.test.ts has the same sha256 on both builds.
  • Of 43 bundles with a stub, 22 differ from main. Each is an export * output. The outputs of import(), of import d, * as ns and of an ESM entry point with export * are byte-identical.
  • The unused helper: a one-module probe is 1,310 B on main and 1,282 B here. With a guard in scan_imports_and_exports it is 507 B. Minified: 595, 588 and 235 B.

Tests.

  • Debug build (ASAN) of this branch: bundler_browser.test.ts 36 pass, 0 fail. Also 0 fail and 838 pass in esbuild/importstar, esbuild/importstar_ts, esbuild/default, esbuild/dce, esbuild/splitting, bundler_barrel, bundler_cjs2esm, bundler_edgecase and bundler_plugin.
  • Release builds, all of test/bundler (161 files, 10,171 tests). Main: 10 failures. This PR: the 8 new cases pass, and 2 failures stay. Both fail on main too when each file runs alone: --cpu-prof attributes native time to the calling function, and encoder output is identical on every platform, whose snapshot does not match in my container (both builds print the same hashes). In the full run of this PR, a third test of that file failed after a 5 s time limit killed its shared child.
  • The other files of test/bundler did not run on a debug build.
  • Main's src/ with this test file: the 8 cases fail (release build of 9fe1cd6).

[human-review] gate passed · iteration 0 · 2 files touched

fails on main (without fix)
ASAN without fix: 8 failed, 2 skipped
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/pr_gate.xml" test/bundler/bundler_browser.test.ts
bun test v1.4.4 (367d939d9)

test/bundler/bundler_browser.test.ts:
(pass) bundler > browser/NodeBuffer#21522 [903.49ms]
(pass) bundler > browser/NodeBuffer#12272 [479.12ms]
(pass) bundler > browser/NodeFS [295.14ms]
(pass) bundler > browser/NodeTTY [297.71ms]
(pass) bundler > browser/NodeEventsOnce [367.81ms]
(pass) bundler > browser/NodeUrlProtocolTablesIgnorePrototype [374.31ms]
(pass) bundler > browser/NodePolyfills [4260.61ms]
(todo) bundler > browser/NodePolyfillExternal
(pass) bundler > browser/BrowserFieldDisablesPolyfilledBuiltin#4928 [292.49ms]
(pass) bundler > browser/BrowserFieldDisablesPolyfilledBuiltinNodePrefix#4928 [297.69ms]
(pass) bundler > browser/BrowserFieldRemapsPolyfilledBuiltin#4928 [290.64ms]
(pass) bundler > browser/BrowserFieldDisabledBuiltinStillPolyfillsOutsideScope [313.13ms]
1920 |           }
1921 |         } else if (!success) {
1922 |           if (run.exitCode) {
1923 |             expect([exitCode, signalCode]).toEqual([run.exitCode, undefined]);
1924 |           } 
... (truncated)

release without fix: 8 failed, 2 skipped
bun test v1.4.3-canary.1 (367d939d9)

test/bundler/bundler_browser.test.ts:
(pass) bundler > browser/NodeBuffer#21522 [48.91ms]
(pass) bundler > browser/NodeBuffer#12272 [18.23ms]
(pass) bundler > browser/NodeFS [12.25ms]
(pass) bundler > browser/NodeTTY [11.05ms]
(pass) bundler > browser/NodeEventsOnce [14.45ms]
(pass) bundler > browser/NodeUrlProtocolTablesIgnorePrototype [12.42ms]
(pass) bundler > browser/NodePolyfills [127.61ms]
(todo) bundler > browser/NodePolyfillExternal
(pass) bundler > browser/BrowserFieldDisablesPolyfilledBuiltin#4928 [12.80ms]
(pass) bundler > browser/BrowserFieldDisablesPolyfilledBuiltinNodePrefix#4928 [9.76ms]
(pass) bundler > browser/BrowserFieldRemapsPolyfilledBuiltin#4928 [10.99ms]
(pass) bundler > browser/BrowserFieldDisabledBuiltinStillPolyfillsOutsideScope [11.37ms]
1920 |           }
1921 |         } else if (!success) {
1922 |           if (run.exitCode) {
1923 |             expect([exitCode, signalCode]).toEqual([run.exitCode, undefined]);
1924 |           } else {
1925 |             throw new Error(prefix + "Runtime failed\n" + stdout!.toUnixString() + "\n" + stderr!.toUnixString());
                             ^
error: Runti
... (truncated)
passes on PR (with fix)
ASAN with fix: 2 skipped
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/pr_gate.xml" test/bundler/bundler_browser.test.ts
bun test v1.4.4 (367d939d9)

test/bundler/bundler_browser.test.ts:
(pass) bundler > browser/NodeBuffer#21522 [928.94ms]
(pass) bundler > browser/NodeBuffer#12272 [499.31ms]
(pass) bundler > browser/NodeFS [329.34ms]
(pass) bundler > browser/NodeTTY [379.42ms]
(pass) bundler > browser/NodeEventsOnce [418.06ms]
(pass) bundler > browser/NodeUrlProtocolTablesIgnorePrototype [401.69ms]
(pass) bundler > browser/NodePolyfills [4296.17ms]
(todo) bundler > browser/NodePolyfillExternal
(pass) bundler > browser/BrowserFieldDisablesPolyfilledBuiltin#4928 [339.09ms]
(pass) bundler > browser/BrowserFieldDisablesPolyfilledBuiltinNodePrefix#4928 [335.35ms]
(pass) bundler > browser/BrowserFieldRemapsPolyfilledBuiltin#4928 [329.21ms]
(pass) bundler > browser/BrowserFieldDisabledBuiltinStillPolyfillsOutsideScope [372.00ms]
(pass) bundler > browser/NodeBuiltinStubExportStarESM [375.46ms]
(pass) bundler > browser/BrowserFieldDisabledExportStarESM [319.92ms]
(pass) bundler > browser/PluginModuleWithBuiltinPathExportStarES
... (truncated)

release with fix: 2 skipped
$ bun scripts/build.ts --profile=release
[configured] bun-profile → bun (stripped) in 651ms (unchanged)
ninja: Entering directory `/workspace/bun/build/release'
[1/118] build.rs build_script_build
[2/118] rustc bun_safety 
[3/118] rustc bun_output 
[4/118] rustc bun_zlib_sys 
[5/118] rustc bun_perf 
[6/118] rustc bun_boringssl_sys 
[7/118] rustc bun_brotli 
[8/118] rustc bun_errno 
[9/118] rustc bun_zstd 
[10/118] rustc bun_cares_sys 
[11/118] rustc bun_base64 
[12/118] rustc bun_picohttp 
[13/118] rustc bun_ptr 
[14/118] rustc bun_lsquic_sys 
[15/118] rustc bun_tcc_sys 
[16/118] rustc bun_clap 
[17/118] rustc bun_valkey 
[18/118] rustc bun_text_diff 
[19/118] rustc bun_paths 
[20/118] rustc bun_zlib 
[21/118] rustc bun_collections 
[22/118] rustc bun_url 
[23/118] rustc bun_shell_parser 
[24/118] rustc bun_semver 
[25/118] rustc bun_analytics 
[26/118] rustc bun_tar 
[27/118] rustc bun_which 
[28/118] rustc bun_http_types 
[29/118] rustc bun_node_path 
[30/118] rustc bun_sha_hmac 
[31/118] rustc bun_boringssl 
[32/118] rustc bun_dns 
[33/118] rustc bun_spawn_sys 
[34/118] rustc bun_threading 
[35/118] rustc bun_archive 
[36/118] rustc bun_csrf 
[37/118] rustc bun
... (truncated)
diff hotspot
src/bundler/linker_context/convertStmtsForChunk.rs |  14 ++
 test/bundler/bundler_browser.test.ts               | 231 +++++++++++++++++++++
 2 files changed, 245 insertions(+)

gate history · 1 passed · 0 rejected · iteration 0

evidence per changed file
file                                                reads  edits  tests
src/bundler/linker_context/convertStmtsForChunk.rs      8      9     63
test/bundler/bundler_browser.test.ts                   11     11     62

`export * from "fs"` in a browser build names a disabled import record:
no module is behind it. The linker handled it as a real external module.

- In a module that is not an entry point, ESM output had
  `__reExport(exports_re, fs)` and never declared `fs`.
- cjs and iife output re-exported the stub function itself, so the
  module got its `length` and `name` as exports.
- A wrapped entry point kept `export * from "fs"` inside its wrapper,
  which does not parse.

convert_stmts_for_chunk now removes the statement in these cases. Two
cases stay as they are: a lifted `module.exports = require()`, and an
unwrapped entry point of ESM output, where the statement prints as
written.
…each condition

The condition now reads `CALLS_RUNTIME_RE_EXPORT_FN`, which
`scan_imports_and_exports` sets, and the wrap kind. It no longer
repeats the entry point and format test of that function.

New cases: a file whose names are only imported by name, a plugin module
with the path "fs", and an unwrapped entry point of ESM output. The
`module.exports = require("fs")` case now checks the printed
assignment.
@robobun

robobun commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator Author

Status: ready for review.

CI build 135694 on b658c55: 183 jobs passed. The 5 failed jobs have one failing test, test/aot/engine/ir-6.test.ts. This PR does not touch it, and it fails on main too (build 135526).

How I reproduced it

echo 'export * from "fs"; export const b = 1;' > re.js
echo 'import * as r from "./re.js"; console.log(Object.keys(r));' > entry.js
bun build entry.js --target=browser --outfile=out.mjs
bun out.mjs
  • On main (f7607a3) out.mjs has __reExport(exports_re, fs); with no declaration of fs, and bun out.mjs fails with ReferenceError: fs is not defined.
  • With this PR the call is gone and it prints [ "b" ].

PR: #47449

@coderabbitai

coderabbitai Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review.

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between f7607a3 and b658c55.

Files selected for processing: 2
  • src/bundler/linker_context/convertStmtsForChunk.rs
  • test/bundler/bundler_browser.test.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.

Walkthrough

The linker now skips selected export * statements when their import records are disabled and have no valid source, with exceptions for specified CommonJS and runtime re-export cases. Browser bundler tests cover these conditions across ESM, CJS, and IIFE output.

Changes

Browser export-star handling

Layer / File(s) Summary
Filter export-star records and verify core cases
src/bundler/linker_context/convertStmtsForChunk.rs, test/bundler/bundler_browser.test.ts
The linker skips qualifying export-star records. Tests cover stubbed builtins and browser-disabled modules across output formats.
Verify plugin and entry-point cases
test/bundler/bundler_browser.test.ts
Tests cover plugin resolution to fs, entry points with and without wrappers, and a dependency that assigns require("fs") to module.exports.

Suggested reviewers: jarred-sumner, alii

Priority: Normal

Merge Risk: Minimal · up to b658c

The change removes qualifying disabled re-exports while preserving existing entry-point behavior. No concrete merge-blocking issue remains established; merge after normal checks pass.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title clearly and concisely describes the main linker change: removing export-star output for disabled imports.
Description check Passed The description explains the problem, fix, scope, trade-offs, and verification results. It does not use the template headings exactly, but it provides the required change summary and verification deta…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Description check

Explanation

The description explains the problem, fix, scope, trade-offs, and verification results. It does not use the template headings exactly, but it provides the required change summary and verification details.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Finishing Touches: 💡 1
🛠️ Fix failing CI checks: 💡
  • Commit to this branch
  • Create a new PR

@robobun

robobun commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator Author
Updated 4:07 AM PT - Oct 30th, 2026

❌ @robobun, your commit b658c55 has 1 failures in Build #135694 (All Failures):


🧪   To try this PR locally:

bunx bun-pr 47449

That installs a local version of the PR into your bun-47449 executable, so you can run:

bun-47449 --bun

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nothing blocking. The comments below are optional suggestions. There is no need to push a fix for them before merging.

Beyond the inline findings, I also checked two things that turned out fine: every other place the bundler sets is_disabled on an import record outside the browser target comes with a resolve error (or HANDLES_IMPORT_ERRORS, which an export * record never carries), so the new guard in convert_stmts_for_chunk cannot drop an export * from a successful node/bun build; and a lifted-CommonJS module.exports = require("fs") is forced to a __commonJS wrap by has_dynamic_exports_due_to_export_star whenever it is not an unwrapped ESM entry, so the is_module_exports_of_wrapped_file exclusion covers that shape.

Extended reasoning...

The change is a 14-line early-continue in the bundler linker's export-star handling plus browser-target bundler tests; it touches no security-sensitive surface. Two inline findings (a pre-existing --splitting gap and a test nit) are already posted, and the note above records the sibling producers of is_disabled and the lifted-CommonJS wrap path that were traced and ruled out.

Comment thread test/bundler/bundler_browser.test.ts Resolved
Comment on lines +174 to +181
if record.path.is_disabled
&& !record.source_index.is_valid()
&& !is_module_exports_of_wrapped_file
&& (wrap != WrapKind::None
|| record
.flags
.contains(ImportRecordFlags::CALLS_RUNTIME_RE_EXPORT_FN))
{

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟣 pre-existing, not blocking: pre-existing: browser builds with --splitting still emit export * from "fs" verbatim in a lazily loaded chunk, so the import() of that chunk fails in a browser. The new condition at src/bundler/linker_context/convertStmtsForChunk.rs:177-180 needs wrap != None or CALLS_RUNTIME_RE_EXPORT_FN, and neither holds for an unwrapped ESM entry point, which a dynamic-import target becomes under splitting. Fix: drop a disabled, source-less export * in every ESM entry point too (user-specified and DynamicImport kinds), since no module is behind the record in any of them; the pin in browser/NodeBuiltinStubExportStarEntryPointESM should then assert no fs import remains. [also at: src/bundler/linker_context/convertStmtsForChunk.rs:180 - Pre-existing, left by this partial fix: a browser ESM bundle whose entry point has export * from "fs" still ships that statement verbatim, so the browser fails to resolve "fs" at load.]
A small fix can ride a push you are already making; otherwise a short reply is enough.

Why this was flagged

Trigger: bun build --target=browser --format=esm --splitting where a module reached only through import() contains export * from "fs" (or export * from "./x" with a browser map false entry). Under splitting that module gets EntryPoint::Kind::DynamicImport (src/bundler/LinkerGraph.rs:49), so scan_imports_and_exports leaves happens_at_runtime false (src/bundler/linker_context/scanImportsAndExports.rs:1351-1352) and never sets CALLS_RUNTIME_RE_EXPORT_FN; wrap is None. The new guard at convertStmtsForChunk.rs:174-181 therefore does not fire, the statement falls through to stmts.append at line 665, and the printer writes export * from "fs" as written (src/js_printer/lib.rs:5608-5618). In a browser the chunk fails to resolve the bare specifier and the import() rejects. The base branch prints the same verbatim statement here, so this is pre-existing. The new test browser/NodeBuiltinStubExportStarEntryPointESM (test/bundler/bundler_browser.test.ts) pins this output as expected.

Verification: pre-existing; acknowledged in diff. Under --splitting an import() target is an unwrapped ESM entry point, so CALLS_RUNTIME_RE_EXPORT_FN is never inserted and the guard at src/bundler/linker_context/convertStmtsForChunk.rs:174-183 does not fire; export * from "fs" is printed as written. The base branch takes the identical fall-through, so merging makes nothing worse.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Confirmed. This PR leaves that output as it is on main, on purpose.

The mechanism is as you describe. scan_imports_and_exports plans no run-time re-export for an entry point of ESM output (src/bundler/linker_context/scanImportsAndExports.rs:1351), and with --splitting a module that import() loads is an entry point. So the flag is not set, the file is not wrapped, and the statement prints as written.

Why the change is not here: for a builtin, that output loads in a Node.js host today. An entry point with export * from "node:fs" re-exports the 104 names of the host module under Node.js 26.3.0, and none after the change. That changes a bundle that works, so a maintainer must decide it first. The description has the question and the facts under "Question for a maintainer": the AWS package under --splitting (ERR_MODULE_NOT_FOUND), what esbuild 0.21.5 prints, and the --external spellings.

If the answer is yes, the change is small: delete the last clause of the condition, and make browser/NodeBuiltinStubExportStarEntryPointESM expect no import. I then add --splitting cases for import() of a builtin and of a "browser" map false file. A release build with that clause deleted fails only that one case today.

The plugin case depends on the path map, which is keyed by path text
alone. The entry point case pins output that the change leaves as it
was. Each comment now says so.

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code review completed

Nothing new to post: everything this review found is already covered by existing comments on this pull request or didn't merit a separate one.

Still open from earlier reviews (1):

  • Unresolved: 1 minor or pre-existing.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant