Skip to content

test: make them stable#20898

Merged
alexander-akait merged 5 commits into
mainfrom
claude/improve-macos-ci-performance-J0ne8
Apr 30, 2026
Merged

test: make them stable#20898
alexander-akait merged 5 commits into
mainfrom
claude/improve-macos-ci-performance-J0ne8

Conversation

@alexander-akait

@alexander-akait alexander-akait commented Apr 30, 2026

Copy link
Copy Markdown
Member

make tests more stable

Copilot AI review requested due to automatic review settings April 30, 2026 15:40
@changeset-bot

changeset-bot Bot commented Apr 30, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: b91111d

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

github-actions Bot commented Apr 30, 2026

Copy link
Copy Markdown
Contributor

This PR is packaged and the instant preview is available (25f937c).

Install it locally:

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

@codecov

codecov Bot commented Apr 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 91.31%. Comparing base (bbcce7f) to head (b91111d).
⚠️ Report is 3 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   #20898      +/-   ##
==========================================
+ Coverage   91.29%   91.31%   +0.02%     
==========================================
  Files         562      562              
  Lines       55615    55661      +46     
  Branches    14705    14719      +14     
==========================================
+ Hits        50772    50829      +57     
+ Misses       4843     4832      -11     
Flag Coverage Δ
integration 90.27% <ø> (+0.02%) ⬆️
test262 45.98% <ø> (-0.04%) ⬇️
unit 36.15% <ø> (-0.03%) ⬇️

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.

expect(link.href).toBe("https://example.com/public/path/chunk1-a.js");
expect(link.crossOrigin).toBe("anonymous");

const promise2 = import(
Comment thread test/configCases/web/prefetch-preload-module-jsonp/index.mjs Fixed
expect(link.href).toBe("https://example.com/public/path/chunk1-a.js");
expect(link.crossOrigin).toBe("anonymous");

const promise2 = import(
Comment thread test/configCases/web/prefetch-preload-module-jsonp/index.mjs Fixed
Comment thread test/configCases/web/prefetch-preload/index.js Fixed
Comment thread test/configCases/web/prefetch-preload/index.js Fixed

Copilot AI 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.

Pull request overview

This PR updates several config-case tests around dynamic imports/prefetch/preload behavior and unhandled-rejection handling. However, the PR title/description indicate a CI change to apply ulimit -n on macOS integration tests, and no such CI/workflow change is present in the reviewed diffs.

Changes:

  • Convert prefetch-preload tests from return promise.then(...) to async/await for clearer sequencing.
  • In the ESM JSONP variant, await import(/* webpackIgnore */ ...) before firing script.onload() to avoid a microtask ordering race on older V8.
  • Add a .catch(() => {}) to a top-level dynamic import in the manifest-plugin config case to prevent unhandled rejections on older Node versions.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

File Description
test/configCases/web/prefetch-preload/index.js Refactors the test to async/await while preserving the existing assertions and sequencing.
test/configCases/web/prefetch-preload-module-jsonp/index.mjs Adds await for webpackIgnore imports to stabilize ordering before script.onload(); converts the rest of the test to async/await.
test/configCases/plugins/manifest-plugin/index-2.js Catches a top-level dynamic import to avoid unhandled rejections in the test harness.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread test/configCases/plugins/manifest-plugin/index-2.js
The .mjs test runs through vm.SourceTextModule's importModuleDynamically
callback. Whether that host callback executes synchronously during the
import() expression or is queued as a microtask is V8-version-dependent.
On Node 22+ V8 it runs synchronously, so the chunk's webpackChunk.push
lands before the next-line script.onload(). On Node 10/12/14/16/18/20 V8
the callback is deferred — script.onload() then runs first, sees
installedChunks[id] still as [resolve, reject, promise], and the JSONP
runtime rejects with "Loading chunk chunk1 failed".

await the import(webpackIgnore) so the chunk install is observed before
script.onload() regardless of V8 version, and flatten the nested then()
chain into async/await.
Mirror the structure of prefetch-preload-module-jsonp so the test no
longer relies on a nested .then() chain that's hard to reason about
across V8 versions. The CJS variant uses __non_webpack_require__ which
is synchronous, but the awaited form makes microtask ordering explicit
and matches the rest of the prefetch-preload tests.
The top-level import("./file.txt?foo") exists so ManifestPlugin records
the chunk in the emitted manifest; nothing awaits it, and on target:web
the JSONP runtime never invokes script.onload in this harness so the
promise sits in [resolve, reject, promise] forever. On older Node the
unhandled-rejection plumbing differs, and any eventual rejection (e.g.
through the chunk-load timeout path) surfaces as a test failure.

.catch keeps the chunk creation while making the dangling promise inert.
@alexander-akait alexander-akait force-pushed the claude/improve-macos-ci-performance-J0ne8 branch from c1d4245 to 881900d Compare April 30, 2026 16:03
@codspeed-hq

codspeed-hq Bot commented Apr 30, 2026

Copy link
Copy Markdown

Merging this PR will degrade performance by 72.73%

⚠️ 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

⚡ 2 improved benchmarks
❌ 7 regressed benchmarks
✅ 135 untouched benchmarks

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

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Simulation benchmark "wasm-modules-sync", scenario '{"name":"mode-development","mode":"development"}' 416.2 ms 340.1 ms +22.36%
Memory benchmark "many-modules-commonjs", scenario '{"name":"mode-production","mode":"production"}' 7.7 MB 10.8 MB -28.1%
Memory benchmark "devtool-source-map", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 141.2 KB 517.8 KB -72.73%
Memory benchmark "future-defaults", scenario '{"name":"mode-production","mode":"production"}' 8.8 MB 12 MB -26.89%
Memory benchmark "devtool-eval-source-map", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 274.6 KB 858.1 KB -68%
Memory benchmark "future-defaults", scenario '{"name":"mode-development","mode":"development"}' 1.8 MB 1.4 MB +36.41%
Memory benchmark "many-chunks-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 460.9 KB 917.3 KB -49.76%
Memory benchmark "asset-modules-inline", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 226.3 KB 680 KB -66.73%
Memory benchmark "context-esm", scenario '{"name":"mode-production","mode":"production"}' 7.3 MB 10 MB -27.35%

Comparing claude/improve-macos-ci-performance-J0ne8 (b91111d) with main (cb66bcf)

Open in CodSpeed

@alexander-akait alexander-akait changed the title ci: actually apply ulimit -n on macOS integration tests test: make them stable Apr 30, 2026
The trailing `import("./chunk1.css")` / `import("./chunk2.css")` in
prefetch-preload-module-jsonp and prefetch-preload each install a
stylesheet link and a <script> for the JS half. The harness never
invokes those scripts' onload, so the JSONP runtime sits on a
setTimeout(onScriptComplete, chunkLoadTimeout=120000ms). On Node 10
the integration suite runs longer than 120s, the timer fires while a
later test is executing, loadingEnded builds

  ChunkLoadError: Loading chunk 945 failed.
  (timeout: https://example.com/public/path/chunk1-css.js)

and the unhandled rejection lands inside the unrelated test
(TestCasesProdGlobalUsed > coffee-loader > should compile). Newer Node
finishes the suite before 120s elapses, which is why this only shows
up on old Node. Attach a no-op catch so the eventual rejection is
observed and dropped.
When __webpack_require__.e iterates ensureChunkHandlers, the prefetch
trigger handler creates Promise.all(promises).then(...) and returns it,
but the reduce in EnsureChunkRuntimeModule discards return values. If
the chunk load rejects (chunkLoadTimeout, network error, etc.) that
discarded chain has no rejection handler and surfaces as an unhandled
rejection — which on Windows + Node 10 lands as 'Test suite failed to
run' in jest-circus, blowing up unrelated suites.

Attach a no-op rejection handler to the .then. Prefetch is best-effort
(browsers don't surface link-prefetch errors either), so silencing the
chain matches user expectation.
@github-actions

Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging claude/improve-macos-ci-performance-J0ne8 into main will be
98.93%
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%
examples/wasm-simple-source-phase
   test.filter.js100%100%100%100%
lib
   APIPlugin.js100%100%100%100%
   AsyncDependenciesBlock.js100%100%100%100%
   AutomaticPrefetchPlugin.js100%100%100%100%
   BannerPlugin.js100%100%100%100%
   Cache.js98.21%100%100%98.21%101
   CacheFacade.js100%100%100%100%
   Chunk.js99.72%100%100%99.72%37
   ChunkGraph.js100%100%100%100%
   ChunkGroup.js100%100%100%100%
   ChunkTemplate.js100%100%100%100%
   CleanPlugin.js98.72%100%100%98.72%206, 226, 382
   CodeGenerationResults.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.55%100%100%98.55%1554, 1850, 1857, 1865, 1887, 2783, 3208, 3870, 3899, 3952–3953, 3957, 3962, 3978–3979, 3993–3994, 3999–4000, 4477, 4503, 493, 498, 5211, 5292, 5307, 5332–5333, 5335, 5659, 5664, 5670, 5673, 5685, 5687, 5691, 5707, 5722, 5754, 5808, 5832, 5946, 712–713
   Compiler.js99.55%100%100%99.55%1116–1117, 1125
   ConcatenationScope.js98.59%100%100%98.59%189
   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%258, 393, 418, 443, 447, 458
   ContextReplacementPlugin.js100%100%100%100%
   DefinePlugin.js98.92%100%100%98.92%158–159, 175, 194, 268
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.13%100%100%98.13%371, 404
   DependencyTemplate.js100%100%100%100%
   DependencyTemplates.js100%100%100%100%
   DotenvPlugin.js97.88%100%100%97.88%237, 378, 391–392
   DynamicEntryPlugin.js100%100%100%100%
   EntryOptionPlugin.js100%100%100%100%
   EntryPlugin.js100%100%100%100%
   Entrypoint.js100%100%100%100%
   EnvironmentPlugin.js97.14%100%100%97.14%49
   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%399–403, 542
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FileSystemInfo.js99.49%100%100%99.49%182, 2213–2214, 2217, 2228, 2239, 2250, 278, 3596, 3611, 3635
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.74%100%100%98.74%399, 401, 405
   FlagDependencyUsagePlugin.js100%100%100%100%
   FlagEntryExportAsUsedPlugin.js100%100%100%100%
   Generator.js100%100%100%100%
   HotModuleReplacementPlugin.js100%100%100%100%
   HotUpdateChunk.js100%100%100%100%
   IgnorePlugin.js100%100%100%100%
   IgnoreWarningsPlugin.js100%100%100%100%
   InitFragment.js100%100%100%100%
   JavascriptMetaInfoPlugin.js100%100%100%100%
   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%1304, 1309, 1370, 1384, 1446, 1455
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.85%100%100%98.85%106, 108
   ModuleGraph.js99.73%100%100%99.73%1004
   ModuleGraphConnection.js100%100%100%100%
   ModuleInfoHeaderPlugin.js100%100%100%100%
   ModuleProfile.js100%100%100%100%
   ModuleSourceTypeConstants.js100%100%100%100%
   ModuleTemplate.js100%100%100%100%
   ModuleTypeConstants.js100%100%100%100%
   MultiCompiler.js99.69%100%100%99.69%645
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.78%100%100%97.78%1020, 1036, 1123, 1774, 1779–1789, 708, 711, 728, 745, 986
   NormalModuleFactory.js99.47%100%100%99.47%1067, 1376, 466, 478
   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%446–447, 452, 454, 518
   ProvidePlugin.js100%100%100%100%
   RawModule.js100%100%100%100%
   RecordIdsPlugin.js100%100%100%100%
   RequestShortener.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%
   SourceMapDevToolModuleOptionsPlugin.js100%100%100%100%
   SourceMapDevToolPlugin.js99.16%100%100%99.16%267–268, 610
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js98.86%100%100%98.86%134–135
   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.js100%100%100%100%
   WebpackIsIncludedPlugin.js100%100%100%100%
   WebpackOptionsApply.js100%100%100%100%
   WebpackOptionsDefaulter.js100%100%100%100%
   buildChunkGraph.js99.87%100%100%99.87%325
   cli.js98.71%100%100%98.71%117, 469, 501, 543, 813
   index.js100%100%100%100%
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
   webpack.js97.22%100%100%97.22%196, 218, 220
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModulesPlugin.js97.77%100%100%97.77%285, 309, 312, 364, 40
   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%71, 83, 91
   MemoryCachePlugin.js95.83%100%100%95.83%33
   MemoryWithGcCachePlugin.js93.15%100%100%93.15%106, 113–114, 122, 89
   PackFileCacheStrategy.js96.40%100%100%96.40%1250, 1350, 1354, 1416, 628, 647, 657–659, 661, 677–678, 683, 686, 688, 693, 698, 722, 728, 762, 768, 774, 779, 790, 799, 804–805, 807, 824, 830–831, 833
   ResolverCachePlugin.js100%100%100%100%
   getLazyHashedEtag.js100%100%100%100%
   mergeEtags.js100%100%100%100%
lib/config
   browserslistTargetHandler.js100%100%100%100%
   defaults.js99.13%100%100%99.13%1297–1299, 1307, 270, 273, 278, 282, 468
   normalization.js99%100%100%99%191–192, 258, 273
   target.js100%100%100%100%
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%
   

@alexander-akait alexander-akait merged commit 25f937c into main Apr 30, 2026
60 of 61 checks passed
@alexander-akait alexander-akait deleted the claude/improve-macos-ci-performance-J0ne8 branch April 30, 2026 19:33
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