webpack 5.108.4 → 5.109.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/bin/webpack.js +12 -0
  2. package/lib/APIPlugin.js +48 -29
  3. package/lib/CacheFacade.js +8 -0
  4. package/lib/ChunkGraph.js +17 -15
  5. package/lib/ChunkGroup.js +1 -0
  6. package/lib/CompatibilityPlugin.js +62 -29
  7. package/lib/Compilation.js +58 -6
  8. package/lib/ConstPlugin.js +11 -11
  9. package/lib/ContextModule.js +239 -6
  10. package/lib/ContextModuleFactory.js +139 -14
  11. package/lib/DefinePlugin.js +433 -112
  12. package/lib/Entrypoint.js +1 -1
  13. package/lib/ExportsInfo.js +22 -5
  14. package/lib/ExportsInfoApiPlugin.js +2 -2
  15. package/lib/ExternalModule.js +107 -5
  16. package/lib/ExternalModuleFactoryPlugin.js +20 -1
  17. package/lib/FileSystemInfo.js +256 -100
  18. package/lib/FlagDependencyUsagePlugin.js +33 -12
  19. package/lib/HotModuleReplacementPlugin.js +18 -15
  20. package/lib/InitFragment.js +20 -32
  21. package/lib/Module.js +3 -0
  22. package/lib/ModuleFilenameHelpers.js +2 -2
  23. package/lib/ModuleTypeConstants.js +8 -1
  24. package/lib/MultiCompiler.js +13 -2
  25. package/lib/MultiWatching.js +1 -0
  26. package/lib/NodeStuffPlugin.js +51 -33
  27. package/lib/NormalModule.js +175 -401
  28. package/lib/NormalModuleFactory.js +76 -2
  29. package/lib/ProgressPlugin.js +211 -119
  30. package/lib/ProvidePlugin.js +2 -2
  31. package/lib/RuntimeGlobals.js +47 -0
  32. package/lib/RuntimePlugin.js +67 -107
  33. package/lib/RuntimeTemplate.js +304 -16
  34. package/lib/Template.js +23 -3
  35. package/lib/UseStrictPlugin.js +1 -1
  36. package/lib/WebpackIsIncludedPlugin.js +1 -1
  37. package/lib/WebpackOptionsApply.js +24 -19
  38. package/lib/asset/AssetGenerator.js +110 -28
  39. package/lib/asset/AssetModulesPlugin.js +92 -2
  40. package/lib/asset/WebManifestGenerator.js +164 -0
  41. package/lib/asset/WebManifestParser.js +130 -0
  42. package/lib/async-modules/AwaitDependenciesInitFragment.js +14 -4
  43. package/lib/async-modules/isGeneratorLowered.js +26 -0
  44. package/lib/cache/PackFileCacheStrategy.js +9 -3
  45. package/lib/config/browserslistTargetHandler.js +40 -0
  46. package/lib/config/defaults.js +219 -29
  47. package/lib/config/normalization.js +26 -0
  48. package/lib/config/target.js +9 -1
  49. package/lib/container/HoistContainerReferencesPlugin.js +47 -55
  50. package/lib/css/CssGenerator.js +40 -31
  51. package/lib/css/CssLoadingRuntimeModule.js +5 -1
  52. package/lib/css/CssModulesPlugin.js +13 -0
  53. package/lib/css/CssParser.js +729 -313
  54. package/lib/css/syntax.js +1371 -861
  55. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -6
  56. package/lib/dependencies/AMDPlugin.js +2 -2
  57. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +13 -13
  58. package/lib/dependencies/CommonJsDependencyHelpers.js +39 -0
  59. package/lib/dependencies/CommonJsExportRequireDependency.js +19 -0
  60. package/lib/dependencies/CommonJsExportsDependency.js +47 -2
  61. package/lib/dependencies/CommonJsExportsParserPlugin.js +10 -10
  62. package/lib/dependencies/CommonJsImportsParserPlugin.js +18 -18
  63. package/lib/dependencies/CommonJsPlugin.js +2 -2
  64. package/lib/dependencies/CommonJsRequireDependency.js +26 -1
  65. package/lib/dependencies/CommonJsSelfReferenceDependency.js +32 -1
  66. package/lib/dependencies/ContextDependencyHelpers.js +3 -3
  67. package/lib/dependencies/CreateRequireParserPlugin.js +6 -6
  68. package/lib/dependencies/CssIcssExportDependency.js +162 -71
  69. package/lib/dependencies/CssUrlDependency.js +35 -4
  70. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +2 -2
  71. package/lib/dependencies/HarmonyCompatibilityDependency.js +32 -14
  72. package/lib/dependencies/HarmonyDetectionParserPlugin.js +43 -13
  73. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +2 -1
  74. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +7 -19
  75. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +17 -9
  76. package/lib/dependencies/HarmonyImportDependency.js +13 -2
  77. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +11 -11
  78. package/lib/dependencies/HarmonyImportSpecifierDependency.js +10 -7
  79. package/lib/dependencies/HarmonyModulesPlugin.js +6 -0
  80. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -1
  81. package/lib/dependencies/HtmlEntryDependency.js +797 -172
  82. package/lib/dependencies/HtmlSourceDependency.js +26 -0
  83. package/lib/dependencies/ImportDependency.js +43 -1
  84. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +31 -18
  85. package/lib/dependencies/ImportMetaContextPlugin.js +38 -7
  86. package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
  87. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
  88. package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
  89. package/lib/dependencies/ImportMetaPlugin.js +532 -180
  90. package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
  91. package/lib/dependencies/ImportParserPlugin.js +80 -17
  92. package/lib/dependencies/ImportPhase.js +10 -8
  93. package/lib/dependencies/LoaderPlugin.js +5 -1
  94. package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
  95. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +3 -6
  96. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +4 -11
  97. package/lib/dependencies/SystemPlugin.js +2 -4
  98. package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
  99. package/lib/dependencies/URLDependency.js +141 -21
  100. package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +324 -112
  101. package/lib/dependencies/WorkerDependency.js +86 -18
  102. package/lib/dependencies/WorkletDependency.js +278 -0
  103. package/lib/dll/DelegatedModuleFactoryPlugin.js +19 -0
  104. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +1 -1
  105. package/lib/errors/LoaderLoadingError.js +20 -0
  106. package/lib/errors/ModuleParseError.js +39 -22
  107. package/lib/errors/NodeStuffInWebError.js +1 -1
  108. package/lib/esm/ModuleChunkFormatPlugin.js +47 -14
  109. package/lib/esm/ModuleChunkLoadingPlugin.js +8 -1
  110. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +29 -1
  111. package/lib/hmr/lazyCompilationBackend.js +51 -12
  112. package/lib/html/HtmlGenerator.js +907 -15
  113. package/lib/html/HtmlModule.js +2 -2
  114. package/lib/html/HtmlModulesPlugin.js +610 -166
  115. package/lib/html/HtmlParser.js +603 -247
  116. package/lib/html/favicon.svg +1 -0
  117. package/lib/html/syntax.js +3451 -2762
  118. package/lib/ids/IdHelpers.js +25 -11
  119. package/lib/index.js +6 -0
  120. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +4 -5
  121. package/lib/javascript/BasicEvaluatedExpression.js +366 -48
  122. package/lib/javascript/JavascriptGenerator.js +197 -49
  123. package/lib/javascript/JavascriptModulesPlugin.js +178 -24
  124. package/lib/javascript/JavascriptParser.js +704 -355
  125. package/lib/javascript/JavascriptParserHelpers.js +3 -6
  126. package/lib/javascript/syntax.js +5037 -0
  127. package/lib/library/ModuleLibraryPlugin.js +38 -1
  128. package/lib/loaders/LoaderRunner.js +714 -0
  129. package/lib/loaders/loadLoader.js +100 -0
  130. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +29 -2
  131. package/lib/node/ReadFileCompileWasmPlugin.js +24 -2
  132. package/lib/optimize/AggressiveMergingPlugin.js +19 -15
  133. package/lib/optimize/ConcatenatedModule.js +139 -31
  134. package/lib/optimize/FlagIncludedChunksPlugin.js +13 -3
  135. package/lib/optimize/InnerGraphPlugin.js +50 -30
  136. package/lib/optimize/ModuleConcatenationPlugin.js +139 -24
  137. package/lib/optimize/SideEffectsFlagPlugin.js +86 -43
  138. package/lib/optimize/SplitChunksPlugin.js +146 -44
  139. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +15 -0
  140. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +24 -13
  141. package/lib/prefetch/ResourceHintPlugin.js +687 -0
  142. package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
  143. package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
  144. package/lib/prefetch/parseResourceHintOptions.js +103 -0
  145. package/lib/rules/RuleSetCompiler.js +114 -0
  146. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
  147. package/lib/runtime/AsyncModuleRuntimeModule.js +24 -8
  148. package/lib/runtime/AutoPublicPathRuntimeModule.js +7 -1
  149. package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
  150. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
  151. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +204 -8
  152. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +4 -1
  153. package/lib/schemes/HttpUriPlugin.js +40 -1
  154. package/lib/schemes/VirtualUrlPlugin.js +1 -2
  155. package/lib/serialization/BinaryMiddleware.js +270 -938
  156. package/lib/serialization/FileMiddleware.js +29 -3
  157. package/lib/stats/DefaultStatsFactoryPlugin.js +229 -194
  158. package/lib/stats/DefaultStatsPresetPlugin.js +2 -0
  159. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -168
  160. package/lib/stats/StatsFactory.js +46 -17
  161. package/lib/url/URLParserPlugin.js +66 -13
  162. package/lib/util/AsyncQueue.js +122 -72
  163. package/lib/util/SetHelpers.js +1 -1
  164. package/lib/util/StackedMap.js +122 -48
  165. package/lib/util/binarySearchBounds.js +2 -2
  166. package/lib/util/concatenate.js +40 -14
  167. package/lib/util/createHooksRegistry.js +13 -5
  168. package/lib/util/dataURL.js +2 -2
  169. package/lib/util/deterministicGrouping.js +7 -5
  170. package/lib/util/formatSize.js +6 -2
  171. package/lib/util/globUtils.js +710 -0
  172. package/lib/util/identifier.js +23 -6
  173. package/lib/util/implicitTypeLoaderFallback.js +62 -0
  174. package/lib/util/internalSerializables.js +88 -71
  175. package/lib/util/magicComment.js +121 -25
  176. package/lib/util/numberHash.js +2 -2
  177. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +24 -18
  178. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +33 -22
  179. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +79 -16
  180. package/lib/web/FetchCompileAsyncWasmPlugin.js +19 -0
  181. package/lib/web/FetchCompileWasmPlugin.js +14 -0
  182. package/lib/web/JsonpChunkLoadingRuntimeModule.js +2 -0
  183. package/lib/webpack.js +65 -0
  184. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +3 -0
  185. package/module.d.ts +21 -0
  186. package/package.json +12 -11
  187. package/schemas/WebpackOptions.check.js +1 -1
  188. package/schemas/WebpackOptions.json +759 -36
  189. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  190. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  191. package/schemas/plugins/ProgressPlugin.json +17 -1
  192. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  193. package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
  194. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  195. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  196. package/schemas/plugins/container/ModuleFederationPlugin.json +1 -0
  197. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  198. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  199. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  200. package/types.d.ts +1212 -99
@@ -64,6 +64,9 @@ class ModuleChunkLoadingPlugin {
64
64
  compilation.hooks.runtimeRequirementInTree
65
65
  .for(RuntimeGlobals.externalInstallChunk)
66
66
  .tap(PLUGIN_NAME, handler);
67
+ compilation.hooks.runtimeRequirementInTree
68
+ .for(RuntimeGlobals.analyzableChunkImport)
69
+ .tap(PLUGIN_NAME, handler);
67
70
  compilation.hooks.runtimeRequirementInTree
68
71
  .for(RuntimeGlobals.onChunksLoaded)
69
72
  .tap(PLUGIN_NAME, handler);
@@ -83,12 +86,15 @@ class ModuleChunkLoadingPlugin {
83
86
  );
84
87
  });
85
88
 
86
- // We need public path only when we prefetch/preload chunk or public path is not `auto`
89
+ // The prefetch/preload handlers build the chunk URL themselves, so they need
90
+ // the public path and script filename directly — without relying on
91
+ // `ensureChunkHandlers` to pull them in (an analyzable `import()` may replace it).
87
92
  compilation.hooks.runtimeRequirementInTree
88
93
  .for(RuntimeGlobals.prefetchChunkHandlers)
89
94
  .tap(PLUGIN_NAME, (chunk, set) => {
90
95
  if (!isEnabledForChunk(chunk)) return;
91
96
  set.add(RuntimeGlobals.publicPath);
97
+ set.add(RuntimeGlobals.getChunkScriptFilename);
92
98
  });
93
99
 
94
100
  compilation.hooks.runtimeRequirementInTree
@@ -96,6 +102,7 @@ class ModuleChunkLoadingPlugin {
96
102
  .tap(PLUGIN_NAME, (chunk, set) => {
97
103
  if (!isEnabledForChunk(chunk)) return;
98
104
  set.add(RuntimeGlobals.publicPath);
105
+ set.add(RuntimeGlobals.getChunkScriptFilename);
99
106
  });
100
107
 
101
108
  compilation.hooks.runtimeRequirementInTree
@@ -82,6 +82,9 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
82
82
  const withExternalInstallChunk = this._runtimeRequirements.has(
83
83
  RuntimeGlobals.externalInstallChunk
84
84
  );
85
+ const withAnalyzableImport = this._runtimeRequirements.has(
86
+ RuntimeGlobals.analyzableChunkImport
87
+ );
85
88
  const withLoading = this._runtimeRequirements.has(
86
89
  RuntimeGlobals.ensureChunkHandlers
87
90
  );
@@ -147,7 +150,7 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
147
150
  : installedChunksObject
148
151
  };`,
149
152
  "",
150
- withLoading || withExternalInstallChunk
153
+ withLoading || withExternalInstallChunk || withAnalyzableImport
151
154
  ? `${cst} installChunk = ${runtimeTemplate.basicFunction("data", [
152
155
  runtimeTemplate.destructureObject(
153
156
  [
@@ -333,6 +336,31 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
333
336
  ])
334
337
  : "// no external install chunk",
335
338
  "",
339
+ withAnalyzableImport
340
+ ? `${
341
+ RuntimeGlobals.analyzableChunkImport
342
+ } = ${runtimeTemplate.basicFunction("chunkId, importFn", [
343
+ // A literal `import()` a foreign bundler can follow, wrapped to keep
344
+ // `ensureChunk` timing and deduplication: resolved chunk → resolve now, in-flight →
345
+ // reuse its promise, else run `importFn()` and install it.
346
+ `${lt} installedChunkData = ${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;`,
347
+ "if(installedChunkData === 0) return Promise.resolve();",
348
+ "if(installedChunkData) return installedChunkData[1];",
349
+ `${lt} promise = importFn().then(installChunk, ${runtimeTemplate.basicFunction(
350
+ "e",
351
+ [
352
+ "if(installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;",
353
+ "throw e;"
354
+ ]
355
+ )});`,
356
+ `promise = Promise.race([promise, new Promise(${runtimeTemplate.expressionFunction(
357
+ "installedChunkData = installedChunks[chunkId] = [resolve]",
358
+ "resolve"
359
+ )})]);`,
360
+ "return (installedChunkData[1] = promise);"
361
+ ])};`
362
+ : "// no analyzable chunk import",
363
+ "",
336
364
  withOnChunkLoad
337
365
  ? `${
338
366
  RuntimeGlobals.onChunksLoaded
@@ -27,6 +27,9 @@ module.exports = (options) => (compiler, callback) => {
27
27
  const logger = compiler.getInfrastructureLogger("LazyCompilationBackend");
28
28
  /** @type {Map<string, number>} */
29
29
  const activeModules = new Map();
30
+ /** @type {Set<NodeJS.Timeout>} */
31
+ const idleTimers = new Set();
32
+ let isClosing = false;
30
33
  const prefix = "/lazy-compilation-using-";
31
34
 
32
35
  const isHttps =
@@ -67,19 +70,33 @@ module.exports = (options) => (compiler, callback) => {
67
70
  if (req.url === undefined) return;
68
71
  const keys = req.url.slice(prefix.length).split("@");
69
72
  req.socket.on("close", () => {
70
- setTimeout(() => {
73
+ // Shutting down: skip the idle-decrement timer entirely.
74
+ if (isClosing) return;
75
+ const timer = setTimeout(() => {
76
+ idleTimers.delete(timer);
71
77
  for (const key of keys) {
72
78
  const oldValue = activeModules.get(key) || 0;
73
- activeModules.set(key, oldValue - 1);
74
- if (oldValue === 1) {
75
- logger.log(
76
- `${key} is no longer in use. Next compilation will skip this module.`
77
- );
79
+ // Drop the entry at zero so the map doesn't retain idle modules
80
+ // and the count can't drift negative.
81
+ if (oldValue <= 1) {
82
+ activeModules.delete(key);
83
+ if (oldValue === 1) {
84
+ logger.log(
85
+ `${key} is no longer in use. Next compilation will skip this module.`
86
+ );
87
+ }
88
+ } else {
89
+ activeModules.set(key, oldValue - 1);
78
90
  }
79
91
  }
80
92
  }, 120000);
93
+ // Don't keep the process alive just to decrement idle counters.
94
+ if (timer.unref) timer.unref();
95
+ idleTimers.add(timer);
81
96
  });
82
- req.socket.setNoDelay(true);
97
+ // Not all runtimes expose `setNoDelay` on the request socket (e.g. Deno's
98
+ // HTTP server); it's only a latency optimization, so skip it when absent.
99
+ if (req.socket.setNoDelay) req.socket.setNoDelay(true);
83
100
  res.writeHead(200, {
84
101
  "content-type": "text/event-stream",
85
102
  "Access-Control-Allow-Origin": "*",
@@ -102,7 +119,6 @@ module.exports = (options) => (compiler, callback) => {
102
119
  const server = createServer();
103
120
  server.on("request", requestListener);
104
121
 
105
- let isClosing = false;
106
122
  /** @type {Set<import("net").Socket>} */
107
123
  const sockets = new Set();
108
124
  server.on("connection", (socket) => {
@@ -113,7 +129,15 @@ module.exports = (options) => (compiler, callback) => {
113
129
  if (isClosing) socket.destroy();
114
130
  });
115
131
  server.on("clientError", (e) => {
116
- if (e.message !== "Server is disposing") logger.warn(e);
132
+ // A closing browser tab or a test tearing down aborts the request and
133
+ // resets the socket; that surfaces here as ECONNRESET and is benign.
134
+ if (
135
+ e.message === "Server is disposing" ||
136
+ /** @type {NodeJS.ErrnoException} */ (e).code === "ECONNRESET"
137
+ ) {
138
+ return;
139
+ }
140
+ logger.warn(e);
117
141
  });
118
142
 
119
143
  server.on(
@@ -142,14 +166,29 @@ module.exports = (options) => (compiler, callback) => {
142
166
  callback(null, {
143
167
  dispose(callback) {
144
168
  isClosing = true;
169
+ for (const timer of idleTimers) clearTimeout(timer);
170
+ idleTimers.clear();
145
171
  // Removing the listener is a workaround for a memory leak in node.js
146
172
  server.off("request", requestListener);
147
- server.close((err) => {
148
- callback(err);
149
- });
150
173
  for (const socket of sockets) {
151
174
  socket.destroy(new Error("Server is disposing"));
152
175
  }
176
+ // Some runtimes (e.g. Deno) don't emit "connection", so `sockets`
177
+ // misses the open SSE connections and `server.close` would hang;
178
+ // force-close everything before waiting for it.
179
+ if (server.closeAllConnections) server.closeAllConnections();
180
+ server.close((err) => {
181
+ // `closeAllConnections()` already stops the server on some runtimes
182
+ // (e.g. Bun), so `close` then reports ERR_SERVER_NOT_RUNNING; the
183
+ // server is closed either way, so that's not a dispose failure.
184
+ callback(
185
+ err &&
186
+ /** @type {NodeJS.ErrnoException} */ (err).code !==
187
+ "ERR_SERVER_NOT_RUNNING"
188
+ ? err
189
+ : null
190
+ );
191
+ });
153
192
  },
154
193
  module(originalModule) {
155
194
  const key = `${encodeURIComponent(