Repository navigation
fix(cjs): flag exports used through a CommonJS namespace re-export - #22791
Conversation
A namespace re-export's nested exports info redirects to the required module's exports, so marking an export used through it never queued that module, leaving its self-references unused. Fixes #22788
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Priority: ⬆️ High Change: Bug fix · Severity of issue fixed: Medium Merge Risk: ⚪ Minimal · up to
|
Types CoverageCoverage after merging fix/cjs-namespace-reexport-self-reference into main will be
Coverage Report |
|
This PR is packaged and the instant preview is available (b90cb59). Install it locally:
npm i -D webpack@https://pkg.pr.new/webpack@b90cb59
yarn add -D webpack@https://pkg.pr.new/webpack@b90cb59
pnpm add -D webpack@https://pkg.pr.new/webpack@b90cb59 |
Generated code sizeComparing base (
Read No asset that both runs emit changed size — everything below is new or deleted. 1 asset(s) this pull request adds
No runtime gained or lost a runtime module. Built |
Merging this PR will degrade performance by 50.24%
|
| Mode | Benchmark | BASE |
HEAD |
Efficiency | |
|---|---|---|---|---|---|
| ❌ | Memory | unit benchmark "css-parser-tailwind-unit", process (expanded, no visitors) |
30.8 KB | 232 KB | -86.72% |
| ❌ | Memory | unit benchmark "js-parser-unit", sourceType 'module' |
634.8 KB | 964.7 KB | -34.2% |
| ⚡ | Memory | unit benchmark "html-parser-document-unit", parseHtml |
459.4 KB | 325.9 KB | +40.97% |
Tip
Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.
Comparing fix/cjs-namespace-reexport-self-reference (d71943a) with main (701dab6)
Footnotes
-
212 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩
Both failed with "Self-reference dependency has unused export name" before the fix; run the case with and without module concatenation.
🦋 Changeset detectedLatest commit: d71943a The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
…case CommonJS modules concatenate only with `concatenateModules.commonjs` from an ESM root, so both variants emitted identical bundles.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #22791 +/- ##
==========================================
- Coverage 96.50% 96.50% -0.01%
==========================================
Files 778 778
Lines 137816 137823 +7
Branches 46836 46838 +2
==========================================
+ Hits 133003 133009 +6
- Misses 4813 4814 +1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [webpack](https://github.com/webpack/webpack) | [`5.112.0` → `5.112.2`](https://renovatebot.com/diffs/npm/webpack/5.112.0/5.112.2) |  |  | --- >⚠️ **Warning** > > Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/99) for more information. --- ### Release Notes <details> <summary>webpack/webpack (webpack)</summary> ### [`v5.112.2`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51122) [Compare Source](webpack/webpack@v5.112.1...v5.112.2) ##### Patch Changes - Reduce repeated scans when concatenating imported modules. (by [@​xiaoxiaojx](https://github.com/xiaoxiaojx) in [#​22865](webpack/webpack#22865)) - Avoid allocating CSS module sets for single-group chunks. (by [@​xiaoxiaojx](https://github.com/xiaoxiaojx) in [#​22866](webpack/webpack#22866)) - Return the value of every module type loaded with `importModule()`. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22869](webpack/webpack#22869)) ### [`v5.112.1`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51121) [Compare Source](webpack/webpack@v5.112.0...v5.112.1) ##### Patch Changes - Rebuild a lazy barrel in watch when what it defers changes, and keep the imports and re-exports it still runs. (by [@​aryanraj45](https://github.com/aryanraj45) in [#​22699](webpack/webpack#22699)) - Rebuild under `cacheUnaffected` a module whose re-export target goes or returns. (by [@​aryanraj45](https://github.com/aryanraj45) in [#​22749](webpack/webpack#22749)) - Fix "Self-reference dependency has unused export name" for CommonJS namespace re-exports. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22791](webpack/webpack#22791)) - Fix `exportType: "style"` CSS modules throwing outside the runtime chunk. (by [@​lazerg](https://github.com/lazerg) in [#​22833](webpack/webpack#22833)) - Fix crash when a CSS module with `exportType: "style"` imports an ignored stylesheet. (by [@​codeXsidd](https://github.com/codeXsidd) in [#​22846](webpack/webpack#22846)) - Keep empty process environment variables that `.env` files don't define in `DotenvPlugin`. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22794](webpack/webpack#22794)) - Rehash an ESM entry chunk when a chunk it imports by file name changes. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22804](webpack/webpack#22804)) - Handle a NUL inside an HTML CDATA section the way the parsing spec does. (by [@​dependabot](https://github.com/apps/dependabot) in [#​22811](webpack/webpack#22811)) - Keep module exports live across chunks, runtimes, HMR and eval, sparing globals. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22733](webpack/webpack#22733)) - Await asynchronous modules that `ProvidePlugin` injects into ES modules. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22728](webpack/webpack#22728)) - Keep a resolve that ends after the compiler closed from throwing. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22795](webpack/webpack#22795)) - Preserve string names passed to SharedWorker constructors. (by [@​bjohansebas](https://github.com/bjohansebas) in [#​22770](webpack/webpack#22770)) - Preserve string contents when extracting source map comments. (by [@​bjohansebas](https://github.com/bjohansebas) in [#​22768](webpack/webpack#22768)) - Scope strict-mode, async and generator block function declarations to their block. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22800](webpack/webpack#22800)) - Preserve raw dotenv values when reusing cached environment files. (by [@​Eshiv-Pandey](https://github.com/Eshiv-Pandey) in [#​22787](webpack/webpack#22787)) - Preserve assigned or patched built-ins, conversions and pattern targets. (by [@​aryanraj45](https://github.com/aryanraj45) in [#​22761](webpack/webpack#22761)) - Keep globals a `globalThis` write replaces, and `slice` on a patched array. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22862](webpack/webpack#22862)) - Skip HTML script tags for shared chunks that emit no JavaScript. (by [@​bjohansebas](https://github.com/bjohansebas) in [#​22779](webpack/webpack#22779)) - Keep the digits Firefox lays out a minified CSS percentage with. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22718](webpack/webpack#22718)) - Reject a second `srcset` descriptor after a `0x` density descriptor. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22741](webpack/webpack#22741)) - Minify JavaScript faster, folding string methods on constants and `x -= 1`. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22823](webpack/webpack#22823)) - Shorten minified JavaScript, and keep it running like its source. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22717](webpack/webpack#22717)) - Drop more unused functions, arguments, calls, global reads and variable copies when minifying JavaScript. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22789](webpack/webpack#22789)) - Minify JavaScript smaller where swc does, and fold a function's `length` right. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22826](webpack/webpack#22826)) - Reduce JavaScript output size where oxc or swc produce smaller output. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22829](webpack/webpack#22829)) - Update watchpack to 2.6.3 and rebuild on a `node_modules` created mid-build. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22743](webpack/webpack#22743)) - Support `concatenateModules` with `cacheUnaffected`. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22746](webpack/webpack#22746)) - Update schema-utils to 4.8.1. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22774](webpack/webpack#22774)) - Keep CSS fallbacks, vendor overrides, `oklch()` hues and HTML elements. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22753](webpack/webpack#22753)) - Validate `CleanPlugin` and `DotenvPlugin` options with a precompiled check, so valid options no longer compile their schema at startup. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22758](webpack/webpack#22758)) - Speed up startup and CSS minification, sharing the compile cache with workers. (by [@​xiaoxiaojx](https://github.com/xiaoxiaojx) in [#​22706](webpack/webpack#22706)) - Use precise, generic types for modules, parsers, generators, stats and loaders. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22731](webpack/webpack#22731)) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - "before 9am on tuesday" - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNzUuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE3NS4xIiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJyZW5vdmF0ZSJdfQ==--> Reviewed-on: https://code.futo.org/harbor/harbor/pulls/2035
Summary
Fixes #22788, a 5.112.0 regression from #22276.
For
exports.Sig = require("./sig")wheresigsets__esModule, the re-export's nested exports info now owns__esModuleand redirects everything else tosig's exports. WhenFlagDependencyUsagePluginmarkedSig.wrapused through that redirect, it looked up the owning module of the redirecting exports info, found none, and never queuedsig. Sosig's self-references (exports.magicBytesinsidewrap()) and its own requires stayed unused, and code generation threw.The lookup now follows the redirect for names the nested exports info doesn't own:
Before/after on
require("viem").parseEther("1")(viem 2.57.7, production, the issue's graph):Self-reference dependency has unused export name: This should not happen(@scure/base,@scure/bip32,ox/_cjs/…)1000000000000000000nWhat kind of change does this PR introduce?
fix
Did you add tests for your changes?
Yes:
test/configCases/cjs-tree-shaking/reexport-namespace-self-reference/(fails before the fix with the same error).Does this PR introduce a breaking change?
No
If relevant, what needs to be documented once your changes are merged or what have you already documented?
n/a
Use of AI
Claude Code reproduced the issue against the real
viemgraph, traced the root cause, wrote the fix and the regression test, and drafted this description; reviewed by the author.Generated by Claude Code
Summary by CodeRabbit