Skip to content

fix: set .name to "default" for anonymous default exports per ES spec#20773

Merged
alexander-akait merged 1 commit intomainfrom
fix/anonymous-default-export-name
Apr 6, 2026
Merged

fix: set .name to "default" for anonymous default exports per ES spec#20773
alexander-akait merged 1 commit intomainfrom
fix/anonymous-default-export-name

Conversation

@xiaoxiaojx
Copy link
Copy Markdown
Member

Summary
export default class {} and export default function() {} should have .name === "default" per the ES specification. Webpack's renaming to __WEBPACK_DEFAULT_EXPORT__ caused name inference to assign the wrong name.

What kind of change does this PR introduce?
fix

Did you add tests for your changes?
Existing

Does this PR introduce a breaking change?
No

`export default class {}` and `export default function() {}` should
have `.name === "default"` per the ES specification. Webpack's renaming
to `__WEBPACK_DEFAULT_EXPORT__` caused name inference to assign the
wrong name.
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 4, 2026

🦋 Changeset detected

Latest commit: 9634b37

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
webpack Patch

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 4, 2026

This PR is packaged and the instant preview is available (390333f).

Install it locally:

  • npm
npm i -D webpack@https://pkg.pr.new/webpack@390333f
  • yarn
yarn add -D webpack@https://pkg.pr.new/webpack@390333f
  • pnpm
pnpm add -D webpack@https://pkg.pr.new/webpack@390333f

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 4, 2026

Types Coverage

Coverage after merging fix/anonymous-default-export-name into main will be
98.95%
Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
bin
   webpack.js98.77%100%100%98.77%91
examples
   build-common.js100%100%100%100%
   buildAll.js100%100%100%100%
   examples.js100%100%100%100%
   template-common.js98.21%100%100%98.21%72
examples/custom-javascript-parser
   test.filter.js100%100%100%100%
examples/custom-javascript-parser/internals
   acorn-parse.js100%100%100%100%
   meriyah-parse.js100%100%100%100%
   oxc-parse.js91.30%100%100%91.30%140, 142–143, 145, 147, 153–154, 161, 168, 90
examples/markdown
   webpack.config.mjs100%100%100%100%
examples/typescript
   test.filter.js50%100%100%50%5
examples/virtual-modules
   test.filter.js100%100%100%100%
examples/wasm-bindgen-esm
   test.filter.js100%100%100%100%
examples/wasm-complex
   test.filter.js100%100%100%100%
examples/wasm-simple
   test.filter.js100%100%100%100%
lib
   APIPlugin.js100%100%100%100%
   AbstractMethodError.js100%100%100%100%
   AsyncDependenciesBlock.js100%100%100%100%
   AsyncDependencyToInitialChunkError.js100%100%100%100%
   AutomaticPrefetchPlugin.js100%100%100%100%
   BannerPlugin.js100%100%100%100%
   Cache.js98.21%100%100%98.21%87
   CacheFacade.js100%100%100%100%
   CaseSensitiveModulesWarning.js100%100%100%100%
   Chunk.js99.72%100%100%99.72%37
   ChunkGraph.js100%100%100%100%
   ChunkGroup.js100%100%100%100%
   ChunkRenderError.js100%100%100%100%
   ChunkTemplate.js100%100%100%100%
   CleanPlugin.js98.72%100%100%98.72%196, 216, 371
   CodeGenerationError.js100%100%100%100%
   CodeGenerationResults.js100%100%100%100%
   CommentCompilationWarning.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.55%100%100%98.55%1511, 1800, 1807, 1815, 1837, 2713, 3131, 3779, 3808, 3860–3861, 3865, 3870, 3886–3887, 3901–3902, 3907–3908, 4370, 4396, 470, 475, 5091, 5171, 5186, 5211–5212, 5214, 5530, 5535, 5541, 5544, 5556, 5558, 5562, 5578, 5593, 5624, 5678, 5702, 5812, 681–682
   Compiler.js99.56%100%100%99.56%1091–1092, 1100
   ConcatenationScope.js98.59%100%100%98.59%166
   ConcurrentCompilationError.js100%100%100%100%
   ConditionalInitFragment.js100%100%100%100%
   ConstPlugin.js100%100%100%100%
   ContextExclusionPlugin.js100%100%100%100%
   ContextModule.js100%100%100%100%
   ContextModuleFactory.js97.75%100%100%97.75%253, 385, 410, 435, 439, 450
   ContextReplacementPlugin.js100%100%100%100%
   CssModule.js81.32%100%100%81.32%152, 157–172
   DefinePlugin.js98.92%100%100%98.92%153–154, 170, 189, 263
   DelegatedModule.js95.24%100%100%95.24%240–244
   DelegatedModuleFactoryPlugin.js98.15%100%100%98.15%103
   DelegatedPlugin.js100%100%100%100%
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.13%100%100%98.13%351, 381
   DependencyTemplate.js100%100%100%100%
   DependencyTemplates.js100%100%100%100%
   DllEntryPlugin.js100%100%100%100%
   DllModule.js100%100%100%100%
   DllModuleFactory.js100%100%100%100%
   DllPlugin.js100%100%100%100%
   DllReferencePlugin.js100%100%100%100%
   DotenvPlugin.js97.88%100%100%97.88%235, 375, 388–389
   DynamicEntryPlugin.js100%100%100%100%
   EntryOptionPlugin.js100%100%100%100%
   EntryPlugin.js100%100%100%100%
   Entrypoint.js100%100%100%100%
   EnvironmentNotSupportAsyncWarning.js100%100%100%100%
   EnvironmentPlugin.js97.14%100%100%97.14%48
   ErrorHelpers.js100%100%100%100%
   EvalDevToolModulePlugin.js100%100%100%100%
   EvalSourceMapDevToolPlugin.js100%100%100%100%
   ExportsInfo.js100%100%100%100%
   ExportsInfoApiPlugin.js100%100%100%100%
   ExternalModule.js98.89%100%100%98.89%385–389, 526
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FalseIIFEUmdWarning.js100%100%100%100%
   FileSystemInfo.js99.49%100%100%99.49%168, 2142–2143, 2146, 2157, 2168, 2179, 261, 3497, 3512, 3536
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.74%100%100%98.74%396, 398, 402
   FlagDependencyUsagePlugin.js100%100%100%100%
   FlagEntryExportAsUsedPlugin.js100%100%100%100%
   Generator.js100%100%100%100%
   GraphHelpers.js100%100%100%100%
   HarmonyLinkingError.js100%100%100%100%
   HookWebpackError.js100%100%100%100%
   HotModuleReplacementPlugin.js100%100%100%100%
   HotUpdateChunk.js100%100%100%100%
   IgnoreErrorModuleFactory.js100%100%100%100%
   IgnorePlugin.js100%100%100%100%
   IgnoreWarningsPlugin.js100%100%100%100%
   InitFragment.js100%100%100%100%
   InvalidDependenciesModuleWarning.js100%100%100%100%
   JavascriptMetaInfoPlugin.js100%100%100%100%
   LibManifestPlugin.js97.14%100%100%97.14%114, 117
   LibraryTemplatePlugin.js100%100%100%100%
   LoaderOptionsPlugin.js100%100%100%100%
   LoaderTargetPlugin.js100%100%100%100%
   MainTemplate.js100%100%100%100%
   ManifestPlugin.js100%100%100%100%
   Module.js98.50%100%100%98.50%1186, 1191, 1249, 1262, 1319, 1327
   ModuleBuildError.js100%100%100%100%
   ModuleDependencyError.js100%100%100%100%
   ModuleDependencyWarning.js100%100%100%100%
   ModuleError.js100%100%100%100%
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.85%100%100%98.85%105, 107
   ModuleGraph.js99.73%100%100%99.73%942
   ModuleGraphConnection.js100%100%100%100%
   ModuleHashingError.js100%100%100%100%
   ModuleInfoHeaderPlugin.js100%100%100%100%
   ModuleNotFoundError.js100%100%100%100%
   ModuleParseError.js100%100%100%100%
   ModuleProfile.js100%100%100%100%
   ModuleRestoreError.js100%100%100%100%
   ModuleSourceTypeConstants.js100%100%100%100%
   ModuleStoreError.js100%100%100%100%
   ModuleTemplate.js100%100%100%100%
   ModuleTypeConstants.js100%100%100%100%
   ModuleWarning.js100%100%100%100%
   MultiCompiler.js99.69%100%100%99.69%619
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NoModeWarning.js100%100%100%100%
   NodeStuffInWebError.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.78%100%100%97.78%1032, 1048, 1135, 1765, 1770–1780, 214, 722, 740, 757, 998
   NormalModuleFactory.js99.46%100%100%99.46%1032, 1337, 447, 459
   NormalModuleReplacementPlugin.js100%100%100%100%
   NullFactory.js100%100%100%100%
   OptimizationStages.js100%100%100%100%
   OptionsApply.js100%100%100%100%
   Parser.js100%100%100%100%
   PlatformPlugin.js100%100%100%100%
   PrefetchPlugin.js100%100%100%100%
   ProgressPlugin.js98.75%100%100%98.75%431–432, 437, 439, 503
   ProvidePlugin.js100%100%100%100%
   RawModule.js100%100%100%100%
   RecordIdsPlugin.js100%100%100%100%
   RequestShortener.js100%100%100%100%
   RequireJsStuffPlugin.js100%100%100%100%
   ResolverFactory.js100%100%100%100%
   RuntimeGlobals.js100%100%100%100%
   RuntimeModule.js100%100%100%100%
   RuntimePlugin.js100%100%100%100%
   RuntimeTemplate.js100%100%100%100%
   SelfModuleFactory.js100%100%100%100%
   SingleEntryPlugin.js100%100%100%100%
   SizeFormatHelpers.js100%100%100%100%
   SourceMapDevToolModuleOptionsPlugin.js100%100%100%100%
   SourceMapDevToolPlugin.js99.16%100%100%99.16%265–266, 608
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js98.85%100%100%98.85%128–129
   UnhandledSchemeError.js100%100%100%100%
   UnsupportedFeatureWarning.js100%100%100%100%
   UseStrictPlugin.js100%100%100%100%
   WarnCaseSensitiveModulesPlugin.js100%100%100%100%
   WarnDeprecatedOptionPlugin.js100%100%100%100%
   WarnNoModeSetPlugin.js100%100%100%100%
   WatchIgnorePlugin.js100%100%100%100%
   Watching.js100%100%100%100%
   WebpackError.js96.97%100%100%96.97%43
   WebpackIsIncludedPlugin.js100%100%100%100%
   WebpackOptionsApply.js100%100%100%100%
   WebpackOptionsDefaulter.js100%100%100%100%
   buildChunkGraph.js99.87%100%100%99.87%317
   cli.js98.71%100%100%98.71%109, 453, 485, 527, 787
   formatLocation.js100%100%100%100%
   index.js100%100%100%100%
   validateSchema.js94.67%100%100%94.67%86, 88, 97, 99
   webpack.js97.22%100%100%97.22%186, 208, 210
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModulesPlugin.js97.77%100%100%97.77%282, 306, 309, 361, 39
   AssetParser.js100%100%100%100%
   AssetSourceGenerator.js100%100%100%100%
   AssetSourceParser.js100%100%100%100%
   RawDataUrlModule.js100%100%100%100%
lib/async-modules
   AsyncModuleHelpers.js100%100%100%100%
   AwaitDependenciesInitFragment.js100%100%100%100%
   InferAsyncModulesPlugin.js100%100%100%100%
lib/cache
   AddBuildDependenciesPlugin.js100%100%100%100%
   AddManagedPathsPlugin.js100%100%100%100%
   IdleFileCachePlugin.js97.92%100%100%97.92%70, 82, 90
   MemoryCachePlugin.js95.83%100%100%95.83%33
   MemoryWithGcCachePlugin.js93.15%100%100%93.15%104, 111–112, 120, 87
   PackFileCacheStrategy.js96.40%100%100%96.40%1225,

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 4, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 91.43%. Comparing base (60f7e4a) to head (9634b37).
⚠️ Report is 8 commits behind head on main.

❌ Your changes status has failed because you have indirect coverage changes. Learn more about Unexpected Coverage Changes and reasons for indirect coverage changes.

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #20773   +/-   ##
=======================================
  Coverage   91.42%   91.43%           
=======================================
  Files         559      559           
  Lines       55103    55150   +47     
  Branches    14529    14556   +27     
=======================================
+ Hits        50380    50427   +47     
  Misses       4723     4723           
Flag Coverage Δ
integration 90.42% <100.00%> (+<0.01%) ⬆️
test262 41.95% <88.23%> (-0.02%) ⬇️
unit 36.17% <5.88%> (-0.05%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 4, 2026

Merging this PR will degrade performance by 51.51%

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

⚡ 1 improved benchmark
❌ 2 regressed benchmarks
✅ 141 untouched benchmarks

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "react", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 645.3 KB 865.3 KB -25.42%
Memory benchmark "many-chunks-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 535.9 KB 1,105 KB -51.51%
Memory benchmark "many-chunks-esm", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 1,104.8 KB 710.4 KB +55.52%

Comparing fix/anonymous-default-export-name (9634b37) with main (91aa5da)

Open in CodSpeed

@alexander-akait alexander-akait merged commit 390333f into main Apr 6, 2026
56 of 57 checks passed
@alexander-akait alexander-akait deleted the fix/anonymous-default-export-name branch April 6, 2026 14:19
xiaoxiaojx added a commit that referenced this pull request Apr 9, 2026
When `output.environment.const` is false and the default export slot is
used, the harmony default export template assigns directly to
`__webpack_exports__["default"]` without declaring any local
`__WEBPACK_DEFAULT_EXPORT__` binding. The anonymous-default `.name`
fix-up introduced in #20773 still referenced that undeclared binding,
causing a `ReferenceError` at module load time.

Reference the actual assignment target in that branch. Also add
regression tests covering anonymous arrow / async arrow / class /
class-extends default exports under ES5 environment, plus an anonymous
function default export under module concatenation.

Fixes #20793
xiaoxiaojx added a commit that referenced this pull request Apr 9, 2026
When `output.environment.const` is false and the default export slot is
used, the harmony default export template assigns directly to
`__webpack_exports__["default"]` without declaring any local
`__WEBPACK_DEFAULT_EXPORT__` binding. The anonymous-default `.name`
fix-up introduced in #20773 still referenced that undeclared binding,
causing a `ReferenceError` at module load time.

Reference the actual assignment target in that branch. Also add
regression tests covering anonymous arrow / async arrow / class /
class-extends default exports under ES5 environment, plus an anonymous
function default export under module concatenation.

Fixes #20793
xiaoxiaojx added a commit that referenced this pull request Apr 9, 2026
When `output.environment.const` is false and the default export slot is
used, the harmony default export template assigns directly to
`__webpack_exports__["default"]` without declaring any local
`__WEBPACK_DEFAULT_EXPORT__` binding. The anonymous-default `.name`
fix-up introduced in #20773 still referenced that undeclared binding,
causing a `ReferenceError` at module load time.

Reference the actual assignment target in that branch. Also add
regression tests covering anonymous arrow / async arrow / class /
class-extends default exports under ES5 environment, plus an anonymous
function default export under module concatenation.

Fixes #20793
xiaoxiaojx added a commit that referenced this pull request Apr 9, 2026
When `output.environment.const` is false and the default export slot is
used, the harmony default export template assigns directly to
`__webpack_exports__["default"]` without declaring any local
`__WEBPACK_DEFAULT_EXPORT__` binding. The anonymous-default `.name`
fix-up introduced in #20773 still referenced that undeclared binding,
causing a `ReferenceError` at module load time.

Reference the actual assignment target in that branch. Also add
regression tests covering anonymous arrow / async arrow / class /
class-extends default exports under ES5 environment, plus an anonymous
function default export under module concatenation.

Fixes #20793
xiaoxiaojx added a commit that referenced this pull request Apr 9, 2026
When `output.environment.const` is false and the default export slot is
used, the harmony default export template assigns directly to
`__webpack_exports__["default"]` without declaring any local
`__WEBPACK_DEFAULT_EXPORT__` binding. The anonymous-default `.name`
fix-up introduced in #20773 still referenced that undeclared binding,
causing a `ReferenceError` at module load time.

Also replaces `Reflect.*` with `Object.*` so the emitted code does not
depend on ES2015 `Reflect` in ES5 target runtimes, and guards against
an undefined descriptor so Node 10 (and other legacy V8 versions that
do not set an own `name` property on anonymous class expressions
assigned to a MemberExpression) does not throw.

Adds regression tests covering anonymous arrow / async arrow / class /
class-extends default exports under ES5 environment, plus an anonymous
function default export under module concatenation.

Fixes #20793
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants