Skip to content

test(javascript): assert what load() owes, not what Deno can import - #22252

Merged
alexander-akait merged 1 commit into
mainfrom
test/deno-terser-phases-assertion
Sep 22, 2026
Merged

alexander-akait merged 1 commit into
mainfrom
test/deno-terser-phases-assertion

Conversation

@alexander-akait

@alexander-akait alexander-akait commented Sep 22, 2026 •

Copy link
Copy Markdown
Member

Summary

syntax-printer.unittest.js › should install onto terser asserted that phases is empty under Deno, because Deno could not import terser's own sources when it was written. It sometimes can, and the test then fails — it went red once on #22243, a pull request touching only CSS fixtures, and took a re-run of a 21-minute job to establish it wasn't that change's doing. Which sources a runtime reaches is precisely what load() is written to tolerate, so it asserts the installation contract instead: phases this build declares and nothing else, with Node still owing the whole set.

What kind of change does this PR introduce?

test

Did you add tests for your changes?

n/a — this is the test change; the should mangle exactly as terser does cases already cover the fallback path by comparing webpack's minify against terser's however load() resolved.

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

AI was used: it diagnosed the failure from the runtimes (deno) log, established it was unrelated to the pull request it appeared on, wrote the replacement assertion, and checked it is load-bearing by making load() report a phase name the build does not declare and confirming the test fails.


Generated by Claude Code

Summary by CodeRabbit

  • Tests
    • Updated syntax printer integration tests to validate declared processing phases against the loaded Terser instance.
    • Removed environment-specific expectations that processing phases would be empty in Deno.
    • Continued validating mangle support conditionally based on the runtime environment.

`should install onto terser` asserted that under Deno `phases` is empty,
because Deno could not import terser's own sources when the test was
written. It sometimes can, and then the test fails — it went red once on
#22243, a pull request touching only CSS fixtures, and cost a re-run of a
21-minute job to establish it was not that change's doing.

Which sources a runtime reaches is the one thing `load` is written to
tolerate: it catches any failure and hands back terser's published entry
point. So the runtime is the wrong thing to assert. What `load` owes
everywhere is that it installed phases this build declares and nothing
else, and Node, which always reaches the sources, still owes the whole
set — both of which this now states.

The fallback path stays covered by behaviour rather than by a hardcoded
outcome: every `should mangle exactly as terser does` case compares
webpack's `minify` against terser's own, whichever way `load` resolved.
@changeset-bot

changeset-bot Bot commented Sep 22, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 76aafc1

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai

coderabbitai Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: webpack/webpack/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 87e1ae3e-9da9-4e53-9b38-a6d36af431d3

📥 Commits

Reviewing files that changed from the base of the PR and between e2023b0 and 76aafc1.

📒 Files selected for processing (1)
  • test/unitCases/syntax-printer.unittest.js

Included review availability: Your plan provides up to 10 included reviews per hour; 6 remain after this review.


📝 Walkthrough

Walkthrough

Changes

Syntax printer test update

Layer / File(s) Summary
Phase installation assertion
test/unitCases/syntax-printer.unittest.js
The test imports PHASES and verifies that declared phases contain the loaded Terser phases. The Deno-specific empty-phase assertion was removed. The non-Deno mangle assertion remains.

Priority: ⬇️ Low

Change: Other

Merge Risk: ⚪ Minimal · up to 76aaf

This test-only update removes a runtime-specific assumption and aligns expectations with declared phases, without changing product behavior. It is ready to merge.

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title uses the required Conventional Commit form and describes the test change. The branch prefix is not provided, so its required match with the test type cannot be verified. Provide the branch name or branch prefix. Confirm that it uses the test prefix.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
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.

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

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

This PR is packaged and the instant preview is available (95930fd).

Install it locally:

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

@github-actions

Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging test/deno-terser-phases-assertion into main will be
98.32%
Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
bin
   webpack.js98.82%100%100%98.82%103
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.js100%100%100%100%
examples/markdown
   webpack.config.mjs100%100%100%100%
examples/module-federation
   test.filter.js100%100%100%100%
examples/reexport-components
   test.filter.js100%100%100%100%
examples/typescript
   test.filter.js100%100%100%100%
examples/typescript-non-erasable
   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-emscripten
   test.filter.js100%100%100%100%
examples/wasm-simple
   test.filter.js100%100%100%100%
examples/wasm-simple-source-phase
   test.filter.js100%100%100%100%
lib
   Chunk.js100%100%100%100%
   Compilation.js98.59%100%100%98.59%1759, 2080, 2087, 2095, 2117, 2120, 23, 3056, 3535–3536, 3568, 4157, 4161, 4260, 4281, 4406, 4443, 4450, 4503–4504, 4508, 4513, 4529–4530, 4544–4545, 4550–4551, 5074, 5100, 5930, 5947, 5965, 5981, 5996, 6021, 6024, 6392, 6395–6396, 6401, 6416, 6499, 6523, 6637, 839–840
   Compiler.js98.81%100%100%98.81%1116, 1153, 1156, 1336–1337, 1345, 848, 934, 975
   Dependency.js100%100%100%100%
   DependencyTemplate.js100%100%100%100%
   EntryPlugin.js100%100%100%100%
   Entrypoint.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FileSystemInfo.js100%100%100%100%
   InitFragment.js100%100%100%100%
   LibraryTemplatePlugin.js100%100%100%100%
   ModuleFilenameHelpers.js100%100%100%100%
   ModuleNotFoundError.js100%100%100%100%
   MultiCompiler.js98.88%100%100%98.88%460, 532, 719, 784
   NormalModule.js100%100%100%100%
   NullFactory.js100%100%100%100%
   ProgressPlugin.js100%100%100%100%
   RawModule.js100%100%100%100%
   RequestShortener.js100%100%100%100%
   SingleEntryPlugin.js100%100%100%100%
   WebpackError.js100%100%100%100%
   index.js99.74%100%100%99.74%204
   webpack.js97.12%100%100%97.12%10, 274, 296, 298
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModule.js100%100%100%100%
   AssetModulesPlugin.js98.15%100%100%98.15%338, 362, 365, 495, 57, 62
   AssetParser.js100%100%100%100%
   AssetSourceGenerator.js100%100%100%100%
   AssetSourceParser.js100%100%100%100%
   RawDataUrlModule.js100%100%100%100%
   WebManifestGenerator.js100%100%100%100%
   WebManifestParser.js100%100%100%100%
lib/async-modules
   AsyncModuleHelpers.js100%100%100%100%
   AwaitDependenciesInitFragment.js100%100%100%100%
   InferAsyncModulesPlugin.js100%100%100%100%
   isGeneratorLowered.js100%100%100%100%
lib/bun
   BunTargetPlugin.js100%100%100%100%
lib/cache
   AddBuildDependenciesPlugin.js100%100%100%100%
   AddManagedPathsPlugin.js100%100%100%100%
   Cache.js96.49%100%100%96.49%10, 104
   CacheFacade.js100%100%100%100%
   IdleFileCachePlugin.js97.92%100%100%97.92%75, 87, 95
   MemoryCachePlugin.js92%100%100%92%33, 42
   MemoryWithGcCachePlugin.js93.42%100%100%93.42%106, 120–121, 130, 88
   PackFileCacheStrategy.js96.54%100%100%96.54%1304, 1404, 1408, 1470, 1716, 1800, 1823, 1853, 682, 701, 711–713, 715, 731–732, 737, 740, 742, 747, 752, 777, 783, 817, 823, 829, 834, 845, 854, 859–860, 862, 879, 885–886, 888
   ResolverCachePlugin.js100%100%100%100%
   getLazyHashedEtag.js100%100%100%100%
   mergeEtags.js100%100%100%100%
lib/config
   OptionsApply.js100%100%100%100%
   PlatformPlugin.js100%100%100%100%
   WebpackOptionsApply.js100%100%100%100%
   WebpackOptionsDefaulter.js100%100%100%100%
   browserslistTargetHandler.js100%100%100%100%
   cli.js98.61%100%100%98.61%116, 546, 578, 628, 9
   defaults.js99.44%100%100%99.44%1619–1621, 1629, 283, 286, 291, 295
   defineConfig.js100%100%100%100%
   getClaimedAssetTypes.js100%100%100%100%
   normalization.js99.12%100%100%99.12%279–280, 346, 361
   target.js100%100%100%100%
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
lib/container
   ContainerEntryDependency.js100%100%100%100%
   ContainerEntryModule.js100%100%100%100%
   ContainerEntryModuleFactory.js100%100%100%100%
   ContainerExposedDependency.js100%100%100%100%
   ContainerPlugin.js100%100%100%100%
   ContainerReferencePlugin.js100%100%100%100%
   FallbackDependency.js100%100%100%100%
   FallbackItemDependency.js100%100%100%100%
   FallbackModule.js100%100%100%100%
   FallbackModuleFactory.js100%100%100%100%
   HoistContainerReferencesPlugin.js100%100%100%100%
   ModuleFederationPlugin.js100%100%100%100%
   RemoteModule.js100%100%100%100%
   RemoteRuntimeModule.js100%100%100%100%
   RemoteToExternalDependency.js100%100%100%100%
   declaredRemotes.js100%100%100%100%
   moduleFederationHooks.js100%100%100%100%
   options.js100%100%100%100%
lib/context
   ContextExclusionPlugin.js100%100%100%100%
   ContextModule.js99.88%100%100%99.88%1495
   ContextModuleFactory.js95.66%100%100%95.66%230, 257, 276, 280–281, 289, 465, 486, 491, 532, 541, 543, 547, 550, 556–557
   ContextReplacementPlugin.js100%100%100%100%
lib/css
   CssGenerator.js99.47%100%100%99.47%1085, 136, 842
   CssInjectStyleRuntimeModule.js100%100%100%100%
   CssLoadingRuntimeModule.js100%100%100%100%
   CssModule.js83.16%100%100%83.16%197, 202–210, 212–217
   CssModulesPlugin.js99.85%100%100%99.85%826
   CssParser.js99.44%100%100%99.44%2225, 24, 2859, 2862, 2868, 2909, 2912, 2951, 2954, 3291, 4696, 4699, 841, 957, 988
   CssServerStylesRuntimeModule.js100%100%100%100%
   conventions.js98.65%100%100%98.65%93
   cssMinify.js96.30%100%100%96.30%127, 136
   data.js99.83%100%100%99.83%224, 4041
   syntax-parser.js99.69%100%100%99.69%11661, 12122, 12475, 13804, 2370, 3062, 3064, 3069, 3088, 3830, 3836, 6816, 6854, 6861, 9248–9249, 9783–9784, 9818, 9940, 9986
   syntax-printer.js99.18%100%100%99.18%2050–2051, 2053–2054, 2056–2057, 2062, 2323–2326, 3109, 3242, 3351, 3782, 4014, 4716, 589, 84
   syntax.js100%100%100%100%
lib/debug
   ProfilingPlugin.js96.22%100%100%96.22%162, 418, 547, 554, 563, 567, 576, 581, 587, 592, 85
lib/define
   DefinePlugin.js98.85%100%100%98.85%1495, 268–269, 285, 304, 378, 936, 938, 943, 967
   DotenvPlugin.js98.07%100%100%98.07%391, 439, 452–453
   EnvironmentPlugin.js97.14%100%100%97.14%49
lib/deno
   DenoTargetPlugin.js100%100%100%100%
lib/dependencies
   AMDDefineDependency.js100%100%100%100%
   AMDDefineDependencyParserPlugin.js100%100%100%100%
   AMDPlugin.js99.31%100%100%99.31%54
   AMDRequireArrayDependency.js100%100%100%100%
   AMDRequireContextDependency.js100%100%100%100%
   AMDRequireDependenciesBlock.js100%100%100%100%
   AMDRequireDependenciesBlockParserPlugin.js100%100%100%100%
   AMDRequireDependency.js100%100%100%100%
   AMDRequireItemDependency.js100%100%100%100%
   AMDRuntimeModules.js95.45%100%100%95.45%65
   BuildTimeConstDependency.js100%100%100%100%
   CachedConstDependency.js100%100%100%100%
   CommonJsDependencyHelpers.js98.65%100%100%98.65%44
   CommonJsExportRequireDependency.js99.04%100%100%99.04%386, 388,

@codecov

codecov Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 95.03%. Comparing base (e2023b0) to head (76aafc1).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #22252   +/-   ##
=======================================
  Coverage   95.03%   95.03%           
=======================================
  Files         762      762           
  Lines      105728   105728           
  Branches    32541    32541           
=======================================
+ Hits       100480   100483    +3     
+ Misses       5248     5245    -3     
Flag Coverage Δ
css-parsing 24.67% <ø> (ø)
html5lib 27.38% <ø> (ø)
integration 84.03% <ø> (+<0.01%) ⬆️
syntax-equivalence 76.77% <ø> (ø)
test262 45.08% <ø> (-0.01%) ⬇️
unit 75.07% <ø> (ø)

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

☔ View full report in Codecov by Harness.
📢 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.

@github-actions

Copy link
Copy Markdown
Contributor

Generated code size

Comparing base (e2023b0) to head (76aafc1). Merging this pull request will not change the code webpack generates.

What moved Tests Assets Gzip Raw Test edit
Changed, test untouched 0 0 — — —
Changed, test edited 0 0 — — —
New 0 0 — — —
Deleted 0 0 — — —
Unchanged — 8087 — — —

Read Changed, test untouched first: the test is byte-identical on both sides, so webpack generated the difference. Changed, test edited moved partly because the test did — Test edit is how many bytes the test gained, and a bundle that grew by less is not a regression. New and Deleted are whole files, not deltas, so adding tests cannot bury a real change. Gzip decides, because that is what users download; raw is the tiebreak, and brotli and zstd are per asset below.

No asset changed size.

No runtime gained or lost a runtime module.

Built test/configCases with the defaults a user gets: 2240 test(s), 8087 asset(s), 96 emitted nothing.

@codspeed

codspeed Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Merging this PR will degrade performance by 27.3%

⚠️ 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
✅ 397 untouched benchmarks
⏩ 6 skipped benchmarks1

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
❌ Memory benchmark "many-modules-interop-runtime", scenario '{"name":"mode-development","mode":"development"}', measure 'exec' 56.5 KB 141 KB -59.9%
❌ Memory benchmark "asset-modules-bytes", scenario '{"name":"mode-production","mode":"production"}' 6.6 MB 8.4 MB -21.18%
⚡ Memory benchmark "hmr", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 967.5 KB 795.8 KB +21.58%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing test/deno-terser-phases-assertion (76aafc1) with main (e2023b0)

Open in CodSpeed

Footnotes

  1. 6 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. ↩

@alexander-akait
alexander-akait merged commit 95930fd into main Sep 22, 2026
119 of 120 checks passed
@alexander-akait
alexander-akait deleted the test/deno-terser-phases-assertion branch September 22, 2026 08:51
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.

1 participant