Skip to content

Enable HotTestCases on Deno - #21524

Merged
alexander-akait merged 3 commits into
mainfrom
fix/hot-testcases-on-deno
Jul 27, 2026
Merged

Enable HotTestCases on Deno#21524
alexander-akait merged 3 commits into
mainfrom
fix/hot-testcases-on-deno

Conversation

@alexander-akait

Copy link
Copy Markdown
Member

Summary

The HotTestCases suites were entirely skipped under Deno (test:deno) because the run crashed and hung. This enables them. It fixes two real Deno-compat issues and skips the few cases that depend on capabilities Deno doesn't provide:

  • lib/hmr/lazyCompilationBackend.js: force-close connections on dispose (server.closeAllConnections() + destroy sockets before server.close) so compiler.close() doesn't hang on Deno, whose HTTP server doesn't emit "connection"; also guard req.socket.setNoDelay (absent on Deno).
  • test/helpers/createFakeWorker.js: bind the original postMessage before overriding self.postMessage — Deno aliases parentPort.postMessage to the global self.postMessage, so the override recursed infinitely.
  • test/HotTestCases.template.js: skip ESM-output cases where vm.SourceTextModule is unavailable (Deno's node:vm); no-op where it exists (Node).
  • Skip the lazy-compilation/https and lazy-compilation/wasm cases on Deno (HTTPS + WebAssembly interop limitations), matching their existing per-runtime gates.

All five HotTestCases suites now pass on Deno locally (Node/Web/WebWorker/AsyncNode/Universal).

What kind of change does this PR introduce?

fix

Did you add tests for your changes?

Yes — this re-enables the existing HotTestCases suites under Deno; the lazy-compilation backend fixes are exercised by the now-enabled lazy-compilation hot cases.

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

Yes — Claude Code was used to reproduce the Deno failures, identify the root causes, and implement the fixes; all changes were reviewed and verified locally on Node, Bun, and Deno.


Generated by Claude Code

Deno's HTTP request socket has no setNoDelay; calling it unconditionally
crashed the lazy-compilation backend. It's only a latency optimization, so
skip it when absent (mirrors the adjacent timer.unref guard).
- Force-close lazy-compilation backend connections on dispose so compiler.close
  doesn't hang on Deno (its HTTP server doesn't emit "connection").
- Bind the original postMessage in the fake worker bootstrap (Deno aliases
  parentPort.postMessage to the global self.postMessage, causing recursion).
- Skip ESM-output hot cases where vm.SourceTextModule is unavailable (Deno).
- Skip lazy-compilation https/wasm cases on Deno (HTTPS + WebAssembly interop).
- Stop ignoring test/HotTestCases in the Deno test run.
@changeset-bot

changeset-bot Bot commented Jul 26, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0941699

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

@cursor

cursor Bot commented Jul 26, 2026

Copy link
Copy Markdown

PR Summary

Low Risk
Targeted runtime-compat guards and generated-loader output changes; Node behavior is unchanged when APIs exist, with broader HotTestCases coverage on Deno as the main behavioral shift.

Overview
Enables HotTestCases under test:deno by dropping the test/HotTestCases ignore pattern so those suites run with the rest of the Deno Jest matrix.

Lazy-compilation SSE backend (lazyCompilationBackend.js): calls setNoDelay only when the socket exposes it, and on dispose destroys tracked sockets, optionally invokes server.closeAllConnections(), then server.close—so teardown does not hang when Deno never fires "connection".

Node read-file wasm loaders (ReadFileCompileWasmPlugin, ReadFileCompileAsyncWasmPlugin): generated arrayBuffer() now returns a sliced ArrayBuffer from the Node Buffer backing store instead of the Buffer itself, so stricter runtimes accept it for WebAssembly.instantiate.

Test worker shim (createFakeWorker.js): forwards self.postMessage through parentPort.postMessage.bind(parentPort) to avoid infinite recursion where Deno aliases the two.

Patch notes are recorded in the changeset.

Reviewed by Cursor Bugbot for commit 0941699. Bugbot is set up for automated code reviews on this repo. Configure here.

@github-actions

github-actions Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

This PR is packaged and the instant preview is available (4efcd73).

Install it locally:

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

@codecov

codecov Bot commented Jul 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.79%. Comparing base (fbcbe3e) to head (0941699).
⚠️ Report is 4 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #21524   +/-   ##
=======================================
  Coverage   93.79%   93.79%           
=======================================
  Files         620      620           
  Lines       73798    73799    +1     
  Branches    21306    21308    +2     
=======================================
+ Hits        69220    69221    +1     
  Misses       4578     4578           
Flag Coverage Δ
css-parsing 25.53% <ø> (ø)
html5lib 26.96% <ø> (ø)
integration 89.60% <100.00%> (+<0.01%) ⬆️
test262 43.27% <ø> (-0.01%) ⬇️
unit 47.43% <100.00%> (+<0.01%) ⬆️

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.

- Return a real ArrayBuffer from the Node async/sync wasm loader so
  WebAssembly.instantiate accepts it (Deno rejects a Node Buffer view as
  "not a buffer source"); also fixes real Deno users of async-node wasm.
- Drop the vm.SourceTextModule ESM skip: Node (with the flag), Bun and
  Deno all expose it, so the guard was dead code on every CI runtime.
- Un-skip lazy-compilation wasm and https on Deno; the wasm loader fix and
  the earlier setNoDelay guard cover the failures those skips masked.
@codspeed-hq

codspeed-hq Bot commented Jul 26, 2026

Copy link
Copy Markdown

Merging this PR will regress 2 benchmarks

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

⚡ 3 improved benchmarks
❌ 2 regressed benchmarks
✅ 211 untouched benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "asset-modules-resource", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 843.3 KB 1,204.2 KB -29.97%
Memory benchmark "cache-filesystem", scenario '{"name":"mode-production","mode":"production"}' 3.8 MB 4.9 MB -22.12%
Memory benchmark "wasm-modules-async", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 814.3 KB 192.7 KB ×4.2
Memory benchmark "css-modules", scenario '{"name":"mode-production","mode":"production"}' 13.5 MB 10.1 MB +32.96%
Memory benchmark "devtool-eval", scenario '{"name":"mode-production","mode":"production"}' 14.2 MB 11.5 MB +23.98%

Tip

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


Comparing fix/hot-testcases-on-deno (0941699) with main (2f18ee0)

Open in CodSpeed

@github-actions

Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging fix/hot-testcases-on-deno into main will be
99.32%
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.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
   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%39
   ChunkGraph.js100%100%100%100%
   ChunkGroup.js100%100%100%100%
   ChunkTemplate.js100%100%100%100%
   CircularModulesPlugin.js98.81%100%100%98.81%136
   CleanPlugin.js99.12%100%100%99.12%207, 227
   CodeGenerationResults.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.42%100%100%98.42%1639, 1958, 1965, 1973, 1995, 1998, 2937, 3416–3417, 3449, 4149, 4179, 4232–4233, 4237, 4242, 4258–4259, 4273–4274, 4279–4280, 4760, 4786, 527, 532, 5594, 5626, 5643, 5659, 5675, 5690, 5715–5716, 5718, 6048, 6053, 6059, 6062, 6069, 6081, 6083, 6087, 6103, 6118, 6150, 6204, 6228, 6343, 778–779
   Compiler.js99.56%100%100%99.56%1147–1148, 1156
   ConcatenationScope.js98.65%100%100%98.65%195
   ConditionalInitFragment.js100%100%100%100%
   ConstPlugin.js100%100%100%100%
   ContextExclusionPlugin.js100%100%100%100%
   ContextModule.js99.88%100%100%99.88%1461
   ContextModuleFactory.js97.20%100%100%97.20%266, 435, 456, 461, 501, 512, 514, 518, 527–528
   ContextReplacementPlugin.js100%100%100%100%
   DefinePlugin.js99.08%100%100%99.08%1074, 176–177, 193, 212, 286
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.51%100%100%98.51%479, 525
   DependencyTemplate.js100%100%100%100%
   DependencyTemplates.js100%100%100%100%
   DotenvPlugin.js98.41%100%100%98.41%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.65%100%100%98.65%1196, 1199, 514–518, 520, 666
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FileSystemInfo.js99.52%100%100%99.52%182, 2402–2403, 2406, 2417, 2428, 2439, 280, 3876, 3891, 3915
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.21%100%100%98.21%448, 457, 460, 464, 476
   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%
   LazyBarrel.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%1288, 1293, 1353, 1367, 1429, 1438
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.85%100%100%98.85%106, 108
   ModuleGraph.js99.73%100%100%99.73%1005
   ModuleGraphConnection.js100%100%100%100%
   ModuleInfoHeaderPlugin.js100%100%100%100%
   ModuleNotFoundError.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.70%100%100%99.70%663
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.98%100%100%97.98%1014, 1031, 1279, 1313, 1329, 1776, 2073, 2078–2088, 34, 994, 997
   NormalModuleFactory.js98.72%100%100%98.72%1117, 1385, 1396, 1406, 1457–1459, 1466, 520, 532
   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.js99.80%100%100%99.80%691
   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.js98.62%100%100%98.62%220, 224, 226, 419, 430, 889
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js99.43%100%100%99.43%308–309
   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%371
   cli.js98.63%100%100%98.63%10, 119, 549, 581, 631, 905
   index.js99.72%100%100%99.72%184
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
   webpack.js97.10%100%100%97.10%10, 263, 285, 287
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModule.js100%100%100%100%
   AssetModulesPlugin.js97.95%100%100%97.95%295, 319, 322, 42, 452, 47
   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%
   IdleFileCachePlugin.js97.92%100%100%97.92%75, 87, 95
   MemoryCachePlugin.js95.83%100%100%95.83%33
   MemoryWithGcCachePlugin.js93.15%100%100%93.15%107, 114–115, 123, 90
   PackFileCacheStrategy.js96.41%100%100%96.41%1257, 1357, 1361, 1423, 628, 647, 657–659, 661, 677–678, 683, 686, 688, 693, 698, 723, 729, 763, 769, 775, 780, 791, 800, 805–806, 808, 825, 831–832, 834
   ResolverCachePlugin.js100%100%100%100%
   getLazyHashedEtag.js100%100%100%100%
   mergeEtags.js100%100%100%100%
lib/config
   browserslistTargetHandler.js100%100%100%100%
   defaults.js99.37%100%100%99.37%1620–1622, 1630,

Copy link
Copy Markdown
Member Author

The runtimes (bun) job failed with a Bun engine segfault, not a test failure:

panic: Segmentation fault at address 0x4
oh no: Bun has crashed. This indicates a bug in Bun, not your code.

It crashed during the unit-test files (WeakTupleMap/LazyCompilationBackend.unittest) with all preceding tests passing, and is unrelated to this diff — HotTestCases already ran on Bun before this PR (the package.json change only touches test:deno). This looks like flaky Bun instability; a re-run of that job should clear it. Everything else (Node integration matrix, Codecov) is green.


Generated by Claude Code

@alexander-akait
alexander-akait merged commit 4efcd73 into main Jul 27, 2026
62 of 63 checks passed
@alexander-akait
alexander-akait deleted the fix/hot-testcases-on-deno branch July 27, 2026 00:21
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.

3 participants