webpack 5.108.4 → 5.109.0

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 (186) hide show
  1. package/lib/APIPlugin.js +48 -29
  2. package/lib/CacheFacade.js +8 -0
  3. package/lib/ChunkGroup.js +1 -0
  4. package/lib/CompatibilityPlugin.js +31 -29
  5. package/lib/Compilation.js +49 -4
  6. package/lib/ConstPlugin.js +11 -11
  7. package/lib/ContextModule.js +239 -6
  8. package/lib/ContextModuleFactory.js +139 -14
  9. package/lib/DefinePlugin.js +396 -101
  10. package/lib/Entrypoint.js +1 -1
  11. package/lib/ExportsInfoApiPlugin.js +2 -2
  12. package/lib/ExternalModule.js +107 -5
  13. package/lib/ExternalModuleFactoryPlugin.js +20 -1
  14. package/lib/FileSystemInfo.js +130 -74
  15. package/lib/HotModuleReplacementPlugin.js +18 -15
  16. package/lib/Module.js +3 -0
  17. package/lib/ModuleFilenameHelpers.js +2 -2
  18. package/lib/ModuleTypeConstants.js +8 -1
  19. package/lib/MultiCompiler.js +13 -2
  20. package/lib/MultiWatching.js +1 -0
  21. package/lib/NodeStuffPlugin.js +51 -33
  22. package/lib/NormalModule.js +169 -401
  23. package/lib/NormalModuleFactory.js +76 -2
  24. package/lib/ProgressPlugin.js +211 -119
  25. package/lib/ProvidePlugin.js +2 -2
  26. package/lib/RuntimeGlobals.js +47 -0
  27. package/lib/RuntimePlugin.js +33 -0
  28. package/lib/RuntimeTemplate.js +304 -16
  29. package/lib/UseStrictPlugin.js +1 -1
  30. package/lib/WebpackIsIncludedPlugin.js +1 -1
  31. package/lib/WebpackOptionsApply.js +24 -19
  32. package/lib/asset/AssetGenerator.js +110 -28
  33. package/lib/asset/AssetModulesPlugin.js +92 -2
  34. package/lib/asset/WebManifestGenerator.js +164 -0
  35. package/lib/asset/WebManifestParser.js +130 -0
  36. package/lib/async-modules/AwaitDependenciesInitFragment.js +14 -4
  37. package/lib/async-modules/isGeneratorLowered.js +26 -0
  38. package/lib/cache/PackFileCacheStrategy.js +9 -3
  39. package/lib/config/browserslistTargetHandler.js +40 -0
  40. package/lib/config/defaults.js +219 -29
  41. package/lib/config/normalization.js +26 -0
  42. package/lib/config/target.js +9 -1
  43. package/lib/css/CssGenerator.js +40 -31
  44. package/lib/css/CssLoadingRuntimeModule.js +5 -1
  45. package/lib/css/CssModulesPlugin.js +13 -0
  46. package/lib/css/CssParser.js +594 -263
  47. package/lib/css/syntax.js +875 -462
  48. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -6
  49. package/lib/dependencies/AMDPlugin.js +2 -2
  50. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +13 -13
  51. package/lib/dependencies/CommonJsDependencyHelpers.js +39 -0
  52. package/lib/dependencies/CommonJsExportsDependency.js +47 -2
  53. package/lib/dependencies/CommonJsExportsParserPlugin.js +10 -10
  54. package/lib/dependencies/CommonJsImportsParserPlugin.js +18 -18
  55. package/lib/dependencies/CommonJsPlugin.js +2 -2
  56. package/lib/dependencies/CommonJsRequireDependency.js +26 -1
  57. package/lib/dependencies/CommonJsSelfReferenceDependency.js +32 -1
  58. package/lib/dependencies/ContextDependencyHelpers.js +3 -3
  59. package/lib/dependencies/CreateRequireParserPlugin.js +6 -6
  60. package/lib/dependencies/CssIcssExportDependency.js +162 -71
  61. package/lib/dependencies/CssUrlDependency.js +35 -4
  62. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +2 -2
  63. package/lib/dependencies/HarmonyCompatibilityDependency.js +32 -14
  64. package/lib/dependencies/HarmonyDetectionParserPlugin.js +43 -13
  65. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +7 -19
  66. package/lib/dependencies/HarmonyImportDependency.js +12 -1
  67. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +11 -11
  68. package/lib/dependencies/HarmonyModulesPlugin.js +6 -0
  69. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -1
  70. package/lib/dependencies/HtmlEntryDependency.js +797 -172
  71. package/lib/dependencies/HtmlSourceDependency.js +26 -0
  72. package/lib/dependencies/ImportDependency.js +43 -1
  73. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +31 -18
  74. package/lib/dependencies/ImportMetaContextPlugin.js +38 -7
  75. package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
  76. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
  77. package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
  78. package/lib/dependencies/ImportMetaPlugin.js +532 -180
  79. package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
  80. package/lib/dependencies/ImportParserPlugin.js +80 -17
  81. package/lib/dependencies/ImportPhase.js +10 -8
  82. package/lib/dependencies/LoaderPlugin.js +5 -1
  83. package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
  84. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +3 -6
  85. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +4 -11
  86. package/lib/dependencies/SystemPlugin.js +2 -4
  87. package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
  88. package/lib/dependencies/URLDependency.js +141 -21
  89. package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +324 -112
  90. package/lib/dependencies/WorkerDependency.js +86 -18
  91. package/lib/dependencies/WorkletDependency.js +278 -0
  92. package/lib/dll/DelegatedModuleFactoryPlugin.js +19 -0
  93. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +1 -1
  94. package/lib/errors/LoaderLoadingError.js +20 -0
  95. package/lib/errors/ModuleParseError.js +39 -22
  96. package/lib/errors/NodeStuffInWebError.js +1 -1
  97. package/lib/esm/ModuleChunkFormatPlugin.js +47 -14
  98. package/lib/esm/ModuleChunkLoadingPlugin.js +8 -1
  99. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +29 -1
  100. package/lib/hmr/lazyCompilationBackend.js +32 -8
  101. package/lib/html/HtmlGenerator.js +887 -15
  102. package/lib/html/HtmlModule.js +2 -2
  103. package/lib/html/HtmlModulesPlugin.js +610 -166
  104. package/lib/html/HtmlParser.js +603 -247
  105. package/lib/html/favicon.svg +1 -0
  106. package/lib/html/syntax.js +1264 -661
  107. package/lib/ids/IdHelpers.js +1 -1
  108. package/lib/index.js +6 -0
  109. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +4 -5
  110. package/lib/javascript/BasicEvaluatedExpression.js +366 -48
  111. package/lib/javascript/JavascriptGenerator.js +197 -49
  112. package/lib/javascript/JavascriptModulesPlugin.js +178 -24
  113. package/lib/javascript/JavascriptParser.js +701 -355
  114. package/lib/javascript/JavascriptParserHelpers.js +3 -6
  115. package/lib/javascript/syntax.js +4380 -0
  116. package/lib/library/ModuleLibraryPlugin.js +38 -1
  117. package/lib/loaders/LoaderRunner.js +714 -0
  118. package/lib/loaders/loadLoader.js +100 -0
  119. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +19 -0
  120. package/lib/node/ReadFileCompileWasmPlugin.js +14 -0
  121. package/lib/optimize/ConcatenatedModule.js +120 -16
  122. package/lib/optimize/FlagIncludedChunksPlugin.js +13 -3
  123. package/lib/optimize/InnerGraphPlugin.js +50 -30
  124. package/lib/optimize/ModuleConcatenationPlugin.js +69 -3
  125. package/lib/optimize/SideEffectsFlagPlugin.js +86 -43
  126. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +15 -0
  127. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +24 -13
  128. package/lib/prefetch/ResourceHintPlugin.js +663 -0
  129. package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
  130. package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
  131. package/lib/prefetch/parseResourceHintOptions.js +103 -0
  132. package/lib/rules/RuleSetCompiler.js +114 -0
  133. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
  134. package/lib/runtime/AsyncModuleRuntimeModule.js +24 -8
  135. package/lib/runtime/AutoPublicPathRuntimeModule.js +7 -1
  136. package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
  137. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
  138. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +204 -8
  139. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +4 -1
  140. package/lib/schemes/HttpUriPlugin.js +40 -1
  141. package/lib/schemes/VirtualUrlPlugin.js +1 -2
  142. package/lib/serialization/FileMiddleware.js +29 -3
  143. package/lib/stats/DefaultStatsFactoryPlugin.js +32 -3
  144. package/lib/stats/DefaultStatsPresetPlugin.js +2 -0
  145. package/lib/stats/DefaultStatsPrinterPlugin.js +12 -2
  146. package/lib/stats/StatsFactory.js +15 -8
  147. package/lib/url/URLParserPlugin.js +66 -13
  148. package/lib/util/AsyncQueue.js +122 -72
  149. package/lib/util/SetHelpers.js +1 -1
  150. package/lib/util/StackedMap.js +122 -48
  151. package/lib/util/binarySearchBounds.js +2 -2
  152. package/lib/util/concatenate.js +40 -14
  153. package/lib/util/createHooksRegistry.js +13 -5
  154. package/lib/util/dataURL.js +2 -2
  155. package/lib/util/deterministicGrouping.js +7 -5
  156. package/lib/util/formatSize.js +6 -2
  157. package/lib/util/globUtils.js +710 -0
  158. package/lib/util/identifier.js +23 -6
  159. package/lib/util/implicitTypeLoaderFallback.js +62 -0
  160. package/lib/util/internalSerializables.js +88 -71
  161. package/lib/util/magicComment.js +121 -25
  162. package/lib/util/numberHash.js +2 -2
  163. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +24 -18
  164. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +33 -22
  165. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +79 -16
  166. package/lib/web/FetchCompileAsyncWasmPlugin.js +19 -0
  167. package/lib/web/FetchCompileWasmPlugin.js +14 -0
  168. package/lib/web/JsonpChunkLoadingRuntimeModule.js +2 -0
  169. package/lib/webpack.js +65 -0
  170. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +3 -0
  171. package/module.d.ts +21 -0
  172. package/package.json +13 -12
  173. package/schemas/WebpackOptions.check.js +1 -1
  174. package/schemas/WebpackOptions.json +759 -36
  175. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  176. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  177. package/schemas/plugins/ProgressPlugin.json +17 -1
  178. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  179. package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
  180. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  181. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  182. package/schemas/plugins/container/ModuleFederationPlugin.json +1 -0
  183. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  184. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  185. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  186. package/types.d.ts +1213 -96
@@ -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,17 +70,29 @@ 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
97
  req.socket.setNoDelay(true);
83
98
  res.writeHead(200, {
@@ -102,7 +117,6 @@ module.exports = (options) => (compiler, callback) => {
102
117
  const server = createServer();
103
118
  server.on("request", requestListener);
104
119
 
105
- let isClosing = false;
106
120
  /** @type {Set<import("net").Socket>} */
107
121
  const sockets = new Set();
108
122
  server.on("connection", (socket) => {
@@ -113,7 +127,15 @@ module.exports = (options) => (compiler, callback) => {
113
127
  if (isClosing) socket.destroy();
114
128
  });
115
129
  server.on("clientError", (e) => {
116
- if (e.message !== "Server is disposing") logger.warn(e);
130
+ // A closing browser tab or a test tearing down aborts the request and
131
+ // resets the socket; that surfaces here as ECONNRESET and is benign.
132
+ if (
133
+ e.message === "Server is disposing" ||
134
+ /** @type {NodeJS.ErrnoException} */ (e).code === "ECONNRESET"
135
+ ) {
136
+ return;
137
+ }
138
+ logger.warn(e);
117
139
  });
118
140
 
119
141
  server.on(
@@ -142,6 +164,8 @@ module.exports = (options) => (compiler, callback) => {
142
164
  callback(null, {
143
165
  dispose(callback) {
144
166
  isClosing = true;
167
+ for (const timer of idleTimers) clearTimeout(timer);
168
+ idleTimers.clear();
145
169
  // Removing the listener is a workaround for a memory leak in node.js
146
170
  server.off("request", requestListener);
147
171
  server.close((err) => {