webpack 5.59.0 → 5.94.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 (570) hide show
  1. package/README.md +48 -38
  2. package/bin/webpack.js +34 -10
  3. package/hot/dev-server.js +19 -5
  4. package/hot/lazy-compilation-node.js +13 -1
  5. package/hot/lazy-compilation-web.js +9 -0
  6. package/hot/log-apply-result.js +5 -0
  7. package/hot/log.js +23 -4
  8. package/hot/only-dev-server.js +3 -2
  9. package/hot/poll.js +5 -2
  10. package/hot/signal.js +6 -2
  11. package/lib/APIPlugin.js +226 -122
  12. package/lib/AbstractMethodError.js +10 -5
  13. package/lib/AsyncDependenciesBlock.js +13 -5
  14. package/lib/AutomaticPrefetchPlugin.js +2 -1
  15. package/lib/BannerPlugin.js +33 -12
  16. package/lib/Cache.js +16 -12
  17. package/lib/CacheFacade.js +13 -16
  18. package/lib/CaseSensitiveModulesWarning.js +8 -8
  19. package/lib/Chunk.js +60 -33
  20. package/lib/ChunkGraph.js +207 -72
  21. package/lib/ChunkGroup.js +40 -20
  22. package/lib/ChunkTemplate.js +43 -0
  23. package/lib/CleanPlugin.js +117 -32
  24. package/lib/CodeGenerationResults.js +8 -7
  25. package/lib/CommentCompilationWarning.js +0 -1
  26. package/lib/CompatibilityPlugin.js +85 -46
  27. package/lib/Compilation.js +712 -392
  28. package/lib/Compiler.js +393 -172
  29. package/lib/ConcatenationScope.js +10 -13
  30. package/lib/ConditionalInitFragment.js +22 -14
  31. package/lib/ConstPlugin.js +104 -64
  32. package/lib/ContextExclusionPlugin.js +3 -3
  33. package/lib/ContextModule.js +283 -108
  34. package/lib/ContextModuleFactory.js +151 -63
  35. package/lib/ContextReplacementPlugin.js +25 -10
  36. package/lib/CssModule.js +166 -0
  37. package/lib/DefinePlugin.js +254 -148
  38. package/lib/DelegatedModule.js +29 -6
  39. package/lib/DelegatedModuleFactoryPlugin.js +42 -22
  40. package/lib/DelegatedPlugin.js +4 -0
  41. package/lib/DependenciesBlock.js +17 -2
  42. package/lib/Dependency.js +58 -29
  43. package/lib/DependencyTemplate.js +24 -3
  44. package/lib/DependencyTemplates.js +2 -2
  45. package/lib/DllEntryPlugin.js +18 -1
  46. package/lib/DllModule.js +21 -4
  47. package/lib/DllModuleFactory.js +2 -1
  48. package/lib/DllPlugin.js +9 -7
  49. package/lib/DllReferencePlugin.js +50 -19
  50. package/lib/EntryOptionPlugin.js +6 -1
  51. package/lib/EntryPlugin.js +7 -4
  52. package/lib/Entrypoint.js +2 -2
  53. package/lib/EnvironmentNotSupportAsyncWarning.js +52 -0
  54. package/lib/EnvironmentPlugin.js +5 -2
  55. package/lib/ErrorHelpers.js +65 -26
  56. package/lib/EvalDevToolModulePlugin.js +37 -13
  57. package/lib/EvalSourceMapDevToolPlugin.js +50 -20
  58. package/lib/ExportsInfo.js +234 -133
  59. package/lib/ExportsInfoApiPlugin.js +31 -15
  60. package/lib/ExternalModule.js +391 -129
  61. package/lib/ExternalModuleFactoryPlugin.js +65 -17
  62. package/lib/FileSystemInfo.js +1038 -523
  63. package/lib/FlagAllModulesAsUsedPlugin.js +27 -27
  64. package/lib/FlagDependencyExportsPlugin.js +352 -349
  65. package/lib/FlagDependencyUsagePlugin.js +10 -10
  66. package/lib/FlagEntryExportAsUsedPlugin.js +26 -23
  67. package/lib/Generator.js +16 -8
  68. package/lib/GraphHelpers.js +3 -2
  69. package/lib/HookWebpackError.js +11 -13
  70. package/lib/HotModuleReplacementPlugin.js +221 -128
  71. package/lib/IgnoreErrorModuleFactory.js +4 -4
  72. package/lib/IgnorePlugin.js +5 -4
  73. package/lib/IgnoreWarningsPlugin.js +6 -9
  74. package/lib/InitFragment.js +39 -15
  75. package/lib/JavascriptMetaInfoPlugin.js +27 -15
  76. package/lib/LibManifestPlugin.js +45 -16
  77. package/lib/LoaderOptionsPlugin.js +13 -3
  78. package/lib/MainTemplate.js +74 -21
  79. package/lib/Module.js +155 -34
  80. package/lib/ModuleBuildError.js +13 -11
  81. package/lib/ModuleDependencyError.js +6 -4
  82. package/lib/ModuleDependencyWarning.js +6 -4
  83. package/lib/ModuleError.js +10 -5
  84. package/lib/ModuleFactory.js +4 -4
  85. package/lib/ModuleFilenameHelpers.js +164 -54
  86. package/lib/ModuleGraph.js +93 -53
  87. package/lib/ModuleGraphConnection.js +27 -13
  88. package/lib/ModuleHashingError.js +29 -0
  89. package/lib/ModuleInfoHeaderPlugin.js +92 -33
  90. package/lib/ModuleNotFoundError.js +5 -2
  91. package/lib/ModuleParseError.js +17 -9
  92. package/lib/ModuleProfile.js +1 -0
  93. package/lib/ModuleRestoreError.js +3 -1
  94. package/lib/ModuleStoreError.js +3 -2
  95. package/lib/ModuleTemplate.js +33 -1
  96. package/lib/ModuleTypeConstants.js +168 -0
  97. package/lib/ModuleWarning.js +10 -5
  98. package/lib/MultiCompiler.js +115 -38
  99. package/lib/MultiStats.js +75 -33
  100. package/lib/MultiWatching.js +6 -2
  101. package/lib/NodeStuffPlugin.js +136 -37
  102. package/lib/NormalModule.js +437 -194
  103. package/lib/NormalModuleFactory.js +313 -116
  104. package/lib/NormalModuleReplacementPlugin.js +10 -4
  105. package/lib/NullFactory.js +1 -1
  106. package/lib/OptimizationStages.js +3 -3
  107. package/lib/Parser.js +1 -1
  108. package/lib/PlatformPlugin.js +39 -0
  109. package/lib/PrefetchPlugin.js +4 -0
  110. package/lib/ProgressPlugin.js +83 -28
  111. package/lib/ProvidePlugin.js +37 -19
  112. package/lib/RawModule.js +18 -5
  113. package/lib/RecordIdsPlugin.js +8 -8
  114. package/lib/RequireJsStuffPlugin.js +22 -15
  115. package/lib/ResolverFactory.js +8 -4
  116. package/lib/RuntimeGlobals.js +99 -65
  117. package/lib/RuntimeModule.js +17 -15
  118. package/lib/RuntimePlugin.js +116 -13
  119. package/lib/RuntimeTemplate.js +304 -102
  120. package/lib/SelfModuleFactory.js +12 -0
  121. package/lib/SizeFormatHelpers.js +2 -4
  122. package/lib/SourceMapDevToolModuleOptionsPlugin.js +4 -0
  123. package/lib/SourceMapDevToolPlugin.js +89 -42
  124. package/lib/Stats.js +12 -7
  125. package/lib/Template.js +30 -33
  126. package/lib/TemplatedPathPlugin.js +102 -34
  127. package/lib/UseStrictPlugin.js +37 -12
  128. package/lib/WarnCaseSensitiveModulesPlugin.js +12 -0
  129. package/lib/WarnDeprecatedOptionPlugin.js +6 -0
  130. package/lib/WatchIgnorePlugin.js +46 -13
  131. package/lib/Watching.js +139 -76
  132. package/lib/WebpackError.js +14 -5
  133. package/lib/WebpackIsIncludedPlugin.js +22 -13
  134. package/lib/WebpackOptionsApply.js +162 -56
  135. package/lib/WebpackOptionsDefaulter.js +10 -3
  136. package/lib/asset/AssetGenerator.js +351 -99
  137. package/lib/asset/AssetModulesPlugin.js +57 -33
  138. package/lib/asset/AssetParser.js +15 -6
  139. package/lib/asset/AssetSourceGenerator.js +30 -10
  140. package/lib/asset/AssetSourceParser.js +8 -2
  141. package/lib/asset/RawDataUrlModule.js +162 -0
  142. package/lib/async-modules/AwaitDependenciesInitFragment.js +16 -13
  143. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  144. package/lib/buildChunkGraph.js +376 -420
  145. package/lib/cache/AddManagedPathsPlugin.js +6 -1
  146. package/lib/cache/IdleFileCachePlugin.js +26 -13
  147. package/lib/cache/MemoryCachePlugin.js +1 -1
  148. package/lib/cache/MemoryWithGcCachePlugin.js +13 -7
  149. package/lib/cache/PackFileCacheStrategy.js +172 -94
  150. package/lib/cache/ResolverCachePlugin.js +115 -43
  151. package/lib/cache/getLazyHashedEtag.js +2 -2
  152. package/lib/cache/mergeEtags.js +16 -21
  153. package/lib/cli.js +195 -110
  154. package/lib/config/browserslistTargetHandler.js +106 -41
  155. package/lib/config/defaults.js +572 -154
  156. package/lib/config/normalization.js +361 -322
  157. package/lib/config/target.js +105 -66
  158. package/lib/container/ContainerEntryDependency.js +2 -1
  159. package/lib/container/ContainerEntryModule.js +27 -11
  160. package/lib/container/ContainerEntryModuleFactory.js +1 -1
  161. package/lib/container/ContainerExposedDependency.js +9 -0
  162. package/lib/container/ContainerPlugin.js +18 -12
  163. package/lib/container/ContainerReferencePlugin.js +1 -1
  164. package/lib/container/FallbackDependency.js +13 -0
  165. package/lib/container/FallbackItemDependency.js +3 -0
  166. package/lib/container/FallbackModule.js +19 -8
  167. package/lib/container/FallbackModuleFactory.js +1 -1
  168. package/lib/container/ModuleFederationPlugin.js +2 -0
  169. package/lib/container/RemoteModule.js +17 -4
  170. package/lib/container/RemoteRuntimeModule.js +31 -17
  171. package/lib/container/RemoteToExternalDependency.js +3 -0
  172. package/lib/container/options.js +18 -4
  173. package/lib/css/CssExportsGenerator.js +203 -0
  174. package/lib/css/CssGenerator.js +151 -0
  175. package/lib/css/CssLoadingRuntimeModule.js +592 -0
  176. package/lib/css/CssModulesPlugin.js +888 -0
  177. package/lib/css/CssParser.js +1049 -0
  178. package/lib/css/walkCssTokens.js +775 -0
  179. package/lib/debug/ProfilingPlugin.js +102 -54
  180. package/lib/dependencies/AMDDefineDependency.js +54 -10
  181. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +204 -61
  182. package/lib/dependencies/AMDPlugin.js +44 -24
  183. package/lib/dependencies/AMDRequireArrayDependency.js +34 -10
  184. package/lib/dependencies/AMDRequireContextDependency.js +15 -0
  185. package/lib/dependencies/AMDRequireDependenciesBlock.js +6 -0
  186. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +185 -54
  187. package/lib/dependencies/AMDRequireDependency.js +21 -6
  188. package/lib/dependencies/AMDRequireItemDependency.js +6 -0
  189. package/lib/dependencies/AMDRuntimeModules.js +4 -4
  190. package/lib/dependencies/CachedConstDependency.js +22 -1
  191. package/lib/dependencies/CommonJsDependencyHelpers.js +16 -2
  192. package/lib/dependencies/CommonJsExportRequireDependency.js +77 -47
  193. package/lib/dependencies/CommonJsExportsDependency.js +28 -5
  194. package/lib/dependencies/CommonJsExportsParserPlugin.js +111 -39
  195. package/lib/dependencies/CommonJsFullRequireDependency.js +42 -8
  196. package/lib/dependencies/CommonJsImportsParserPlugin.js +530 -130
  197. package/lib/dependencies/CommonJsPlugin.js +51 -26
  198. package/lib/dependencies/CommonJsRequireContextDependency.js +23 -2
  199. package/lib/dependencies/CommonJsRequireDependency.js +9 -1
  200. package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -8
  201. package/lib/dependencies/ConstDependency.js +12 -3
  202. package/lib/dependencies/ContextDependency.js +32 -5
  203. package/lib/dependencies/ContextDependencyHelpers.js +92 -62
  204. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -1
  205. package/lib/dependencies/ContextElementDependency.js +41 -4
  206. package/lib/dependencies/CreateScriptUrlDependency.js +22 -1
  207. package/lib/dependencies/CriticalDependencyWarning.js +4 -1
  208. package/lib/dependencies/CssExportDependency.js +156 -0
  209. package/lib/dependencies/CssImportDependency.js +125 -0
  210. package/lib/dependencies/CssLocalIdentifierDependency.js +245 -0
  211. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +111 -0
  212. package/lib/dependencies/CssUrlDependency.js +164 -0
  213. package/lib/dependencies/DelegatedSourceDependency.js +3 -0
  214. package/lib/dependencies/DllEntryDependency.js +14 -0
  215. package/lib/dependencies/DynamicExports.js +15 -11
  216. package/lib/dependencies/ExportsInfoDependency.js +26 -5
  217. package/lib/dependencies/ExternalModuleDependency.js +109 -0
  218. package/lib/dependencies/ExternalModuleInitFragment.js +133 -0
  219. package/lib/dependencies/HarmonyAcceptDependency.js +11 -2
  220. package/lib/dependencies/HarmonyAcceptImportDependency.js +9 -4
  221. package/lib/dependencies/HarmonyCompatibilityDependency.js +6 -5
  222. package/lib/dependencies/HarmonyDetectionParserPlugin.js +29 -3
  223. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +152 -0
  224. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +96 -51
  225. package/lib/dependencies/HarmonyExportExpressionDependency.js +21 -4
  226. package/lib/dependencies/HarmonyExportHeaderDependency.js +13 -0
  227. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +216 -108
  228. package/lib/dependencies/HarmonyExportInitFragment.js +21 -9
  229. package/lib/dependencies/HarmonyExportSpecifierDependency.js +12 -0
  230. package/lib/dependencies/HarmonyExports.js +13 -7
  231. package/lib/dependencies/HarmonyImportDependency.js +65 -19
  232. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +268 -74
  233. package/lib/dependencies/HarmonyImportSideEffectDependency.js +11 -5
  234. package/lib/dependencies/HarmonyImportSpecifierDependency.js +180 -36
  235. package/lib/dependencies/HarmonyModulesPlugin.js +33 -5
  236. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -3
  237. package/lib/dependencies/ImportContextDependency.js +15 -2
  238. package/lib/dependencies/ImportDependency.js +50 -12
  239. package/lib/dependencies/ImportEagerDependency.js +11 -6
  240. package/lib/dependencies/ImportMetaContextDependency.js +42 -0
  241. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +301 -0
  242. package/lib/dependencies/ImportMetaContextPlugin.js +72 -0
  243. package/lib/dependencies/ImportMetaHotAcceptDependency.js +6 -0
  244. package/lib/dependencies/ImportMetaHotDeclineDependency.js +6 -0
  245. package/lib/dependencies/ImportMetaPlugin.js +128 -59
  246. package/lib/dependencies/ImportParserPlugin.js +153 -83
  247. package/lib/dependencies/ImportPlugin.js +21 -7
  248. package/lib/dependencies/ImportWeakDependency.js +11 -6
  249. package/lib/dependencies/JsonExportsDependency.js +38 -30
  250. package/lib/dependencies/LoaderDependency.js +14 -0
  251. package/lib/dependencies/LoaderImportDependency.js +14 -0
  252. package/lib/dependencies/LoaderPlugin.js +54 -40
  253. package/lib/dependencies/LocalModule.js +17 -1
  254. package/lib/dependencies/LocalModuleDependency.js +15 -0
  255. package/lib/dependencies/LocalModulesHelpers.js +22 -4
  256. package/lib/dependencies/ModuleDecoratorDependency.js +9 -1
  257. package/lib/dependencies/ModuleDependency.js +24 -7
  258. package/lib/dependencies/ModuleDependencyTemplateAsId.js +2 -1
  259. package/lib/dependencies/ModuleHotAcceptDependency.js +6 -0
  260. package/lib/dependencies/ModuleHotDeclineDependency.js +6 -0
  261. package/lib/dependencies/PrefetchDependency.js +3 -0
  262. package/lib/dependencies/ProvidedDependency.js +43 -8
  263. package/lib/dependencies/PureExpressionDependency.js +73 -39
  264. package/lib/dependencies/RequireContextDependency.js +6 -16
  265. package/lib/dependencies/RequireContextDependencyParserPlugin.js +14 -6
  266. package/lib/dependencies/RequireContextPlugin.js +20 -7
  267. package/lib/dependencies/RequireEnsureDependenciesBlock.js +7 -0
  268. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +29 -12
  269. package/lib/dependencies/RequireEnsureDependency.js +16 -2
  270. package/lib/dependencies/RequireEnsureItemDependency.js +3 -0
  271. package/lib/dependencies/RequireEnsurePlugin.js +27 -7
  272. package/lib/dependencies/RequireHeaderDependency.js +14 -1
  273. package/lib/dependencies/RequireIncludeDependency.js +6 -1
  274. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +29 -5
  275. package/lib/dependencies/RequireIncludePlugin.js +25 -5
  276. package/lib/dependencies/RequireResolveContextDependency.js +19 -2
  277. package/lib/dependencies/RequireResolveDependency.js +8 -1
  278. package/lib/dependencies/RequireResolveHeaderDependency.js +18 -0
  279. package/lib/dependencies/RuntimeRequirementsDependency.js +9 -1
  280. package/lib/dependencies/StaticExportsDependency.js +8 -0
  281. package/lib/dependencies/SystemPlugin.js +49 -22
  282. package/lib/dependencies/SystemRuntimeModule.js +1 -1
  283. package/lib/dependencies/URLDependency.js +20 -13
  284. package/lib/dependencies/URLPlugin.js +115 -27
  285. package/lib/dependencies/UnsupportedDependency.js +13 -0
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +14 -0
  287. package/lib/dependencies/WebAssemblyImportDependency.js +9 -1
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -1
  289. package/lib/dependencies/WorkerDependency.js +47 -3
  290. package/lib/dependencies/WorkerPlugin.js +143 -59
  291. package/lib/dependencies/getFunctionExpression.js +9 -0
  292. package/lib/dependencies/processExportInfo.js +3 -1
  293. package/lib/electron/ElectronTargetPlugin.js +1 -0
  294. package/lib/esm/ExportWebpackRequireRuntimeModule.js +3 -2
  295. package/lib/esm/ModuleChunkFormatPlugin.js +92 -55
  296. package/lib/esm/ModuleChunkLoadingPlugin.js +12 -1
  297. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +141 -25
  298. package/lib/formatLocation.js +1 -2
  299. package/lib/hmr/HotModuleReplacement.runtime.js +37 -25
  300. package/lib/hmr/HotModuleReplacementRuntimeModule.js +2 -1
  301. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +13 -15
  302. package/lib/hmr/LazyCompilationPlugin.js +94 -41
  303. package/lib/hmr/lazyCompilationBackend.js +107 -44
  304. package/lib/ids/ChunkModuleIdRangePlugin.js +12 -3
  305. package/lib/ids/DeterministicChunkIdsPlugin.js +13 -6
  306. package/lib/ids/DeterministicModuleIdsPlugin.js +59 -35
  307. package/lib/ids/HashedModuleIdsPlugin.js +24 -16
  308. package/lib/ids/IdHelpers.js +59 -49
  309. package/lib/ids/NamedChunkIdsPlugin.js +13 -1
  310. package/lib/ids/NamedModuleIdsPlugin.js +20 -12
  311. package/lib/ids/NaturalModuleIdsPlugin.js +10 -13
  312. package/lib/ids/OccurrenceChunkIdsPlugin.js +6 -2
  313. package/lib/ids/OccurrenceModuleIdsPlugin.js +14 -11
  314. package/lib/ids/SyncModuleIdsPlugin.js +146 -0
  315. package/lib/index.js +44 -5
  316. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +9 -7
  317. package/lib/javascript/BasicEvaluatedExpression.js +133 -19
  318. package/lib/javascript/ChunkHelpers.js +33 -0
  319. package/lib/javascript/CommonJsChunkFormatPlugin.js +18 -15
  320. package/lib/javascript/EnableChunkLoadingPlugin.js +11 -6
  321. package/lib/javascript/JavascriptGenerator.js +37 -6
  322. package/lib/javascript/JavascriptModulesPlugin.js +523 -295
  323. package/lib/javascript/JavascriptParser.js +1591 -574
  324. package/lib/javascript/JavascriptParserHelpers.js +58 -37
  325. package/lib/javascript/StartupHelpers.js +69 -47
  326. package/lib/json/JsonData.js +33 -0
  327. package/lib/json/JsonGenerator.js +29 -21
  328. package/lib/json/JsonModulesPlugin.js +13 -7
  329. package/lib/json/JsonParser.js +30 -16
  330. package/lib/library/AbstractLibraryPlugin.js +6 -2
  331. package/lib/library/AmdLibraryPlugin.js +34 -18
  332. package/lib/library/AssignLibraryPlugin.js +68 -32
  333. package/lib/library/EnableLibraryPlugin.js +39 -14
  334. package/lib/library/ExportPropertyLibraryPlugin.js +14 -5
  335. package/lib/library/JsonpLibraryPlugin.js +4 -3
  336. package/lib/library/ModernModuleLibraryPlugin.js +144 -0
  337. package/lib/library/ModuleLibraryPlugin.js +12 -7
  338. package/lib/library/SystemLibraryPlugin.js +6 -4
  339. package/lib/library/UmdLibraryPlugin.js +119 -100
  340. package/lib/logging/Logger.js +59 -6
  341. package/lib/logging/createConsoleLogger.js +25 -40
  342. package/lib/logging/runtime.js +8 -9
  343. package/lib/logging/truncateArgs.js +9 -8
  344. package/lib/node/CommonJsChunkLoadingPlugin.js +18 -2
  345. package/lib/node/NodeEnvironmentPlugin.js +14 -8
  346. package/lib/node/NodeTargetPlugin.js +7 -0
  347. package/lib/node/NodeTemplatePlugin.js +10 -2
  348. package/lib/node/NodeWatchFileSystem.js +100 -50
  349. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +51 -26
  350. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +13 -2
  351. package/lib/node/ReadFileCompileWasmPlugin.js +21 -3
  352. package/lib/node/RequireChunkLoadingRuntimeModule.js +49 -26
  353. package/lib/node/nodeConsole.js +48 -31
  354. package/lib/optimize/AggressiveMergingPlugin.js +10 -4
  355. package/lib/optimize/AggressiveSplittingPlugin.js +26 -21
  356. package/lib/optimize/ConcatenatedModule.js +353 -212
  357. package/lib/optimize/EnsureChunkConditionsPlugin.js +4 -1
  358. package/lib/optimize/FlagIncludedChunksPlugin.js +14 -8
  359. package/lib/optimize/InnerGraph.js +30 -25
  360. package/lib/optimize/InnerGraphPlugin.js +105 -64
  361. package/lib/optimize/LimitChunkCountPlugin.js +32 -9
  362. package/lib/optimize/MangleExportsPlugin.js +7 -2
  363. package/lib/optimize/MinMaxSizeWarning.js +6 -1
  364. package/lib/optimize/ModuleConcatenationPlugin.js +150 -83
  365. package/lib/optimize/RealContentHashPlugin.js +99 -43
  366. package/lib/optimize/RemoveParentModulesPlugin.js +131 -48
  367. package/lib/optimize/RuntimeChunkPlugin.js +15 -2
  368. package/lib/optimize/SideEffectsFlagPlugin.js +119 -63
  369. package/lib/optimize/SplitChunksPlugin.js +129 -78
  370. package/lib/performance/SizeLimitsPlugin.js +22 -8
  371. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +4 -2
  372. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +4 -1
  373. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +8 -5
  374. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -3
  375. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +5 -3
  376. package/lib/rules/BasicEffectRulePlugin.js +7 -1
  377. package/lib/rules/BasicMatcherRulePlugin.js +8 -1
  378. package/lib/rules/ObjectMatcherRulePlugin.js +19 -2
  379. package/lib/rules/RuleSetCompiler.js +53 -32
  380. package/lib/rules/UseEffectRulePlugin.js +42 -36
  381. package/lib/runtime/AsyncModuleRuntimeModule.js +56 -69
  382. package/lib/runtime/AutoPublicPathRuntimeModule.js +25 -9
  383. package/lib/runtime/BaseUriRuntimeModule.js +35 -0
  384. package/lib/runtime/ChunkNameRuntimeModule.js +1 -1
  385. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +5 -2
  386. package/lib/runtime/CompatRuntimeModule.js +7 -2
  387. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  388. package/lib/runtime/CreateScriptRuntimeModule.js +38 -0
  389. package/lib/runtime/CreateScriptUrlRuntimeModule.js +13 -36
  390. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +6 -3
  391. package/lib/runtime/EnsureChunkRuntimeModule.js +29 -15
  392. package/lib/runtime/GetChunkFilenameRuntimeModule.js +56 -43
  393. package/lib/runtime/GetFullHashRuntimeModule.js +4 -3
  394. package/lib/runtime/GetMainFilenameRuntimeModule.js +5 -2
  395. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +98 -0
  396. package/lib/runtime/GlobalRuntimeModule.js +1 -1
  397. package/lib/runtime/HasOwnPropertyRuntimeModule.js +5 -2
  398. package/lib/runtime/LoadScriptRuntimeModule.js +61 -45
  399. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +5 -2
  400. package/lib/runtime/NonceRuntimeModule.js +24 -0
  401. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -2
  402. package/lib/runtime/PublicPathRuntimeModule.js +9 -2
  403. package/lib/runtime/RelativeUrlRuntimeModule.js +5 -2
  404. package/lib/runtime/RuntimeIdRuntimeModule.js +6 -2
  405. package/lib/runtime/StartupChunkDependenciesPlugin.js +15 -0
  406. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +36 -28
  407. package/lib/runtime/StartupEntrypointRuntimeModule.js +13 -9
  408. package/lib/runtime/SystemContextRuntimeModule.js +1 -1
  409. package/lib/schemes/DataUriPlugin.js +16 -3
  410. package/lib/schemes/HttpUriPlugin.js +336 -120
  411. package/lib/serialization/ArraySerializer.js +22 -6
  412. package/lib/serialization/BinaryMiddleware.js +212 -33
  413. package/lib/serialization/DateObjectSerializer.js +16 -4
  414. package/lib/serialization/ErrorObjectSerializer.js +23 -6
  415. package/lib/serialization/FileMiddleware.js +187 -86
  416. package/lib/serialization/MapObjectSerializer.js +25 -8
  417. package/lib/serialization/NullPrototypeObjectSerializer.js +26 -8
  418. package/lib/serialization/ObjectMiddleware.js +96 -66
  419. package/lib/serialization/PlainObjectSerializer.js +51 -14
  420. package/lib/serialization/RegExpObjectSerializer.js +17 -5
  421. package/lib/serialization/Serializer.js +23 -5
  422. package/lib/serialization/SerializerMiddleware.js +8 -8
  423. package/lib/serialization/SetObjectSerializer.js +22 -6
  424. package/lib/serialization/SingleItemMiddleware.js +2 -2
  425. package/lib/serialization/types.js +2 -2
  426. package/lib/sharing/ConsumeSharedFallbackDependency.js +3 -0
  427. package/lib/sharing/ConsumeSharedModule.js +40 -17
  428. package/lib/sharing/ConsumeSharedPlugin.js +139 -102
  429. package/lib/sharing/ConsumeSharedRuntimeModule.js +144 -130
  430. package/lib/sharing/ProvideForSharedDependency.js +0 -1
  431. package/lib/sharing/ProvideSharedDependency.js +17 -0
  432. package/lib/sharing/ProvideSharedModule.js +19 -6
  433. package/lib/sharing/ProvideSharedModuleFactory.js +1 -1
  434. package/lib/sharing/ProvideSharedPlugin.js +37 -30
  435. package/lib/sharing/SharePlugin.js +2 -2
  436. package/lib/sharing/ShareRuntimeModule.js +20 -10
  437. package/lib/sharing/resolveMatchedConfigs.js +6 -5
  438. package/lib/sharing/utils.js +338 -34
  439. package/lib/stats/DefaultStatsFactoryPlugin.js +660 -396
  440. package/lib/stats/DefaultStatsPresetPlugin.js +85 -25
  441. package/lib/stats/DefaultStatsPrinterPlugin.js +525 -145
  442. package/lib/stats/StatsFactory.js +128 -57
  443. package/lib/stats/StatsPrinter.js +77 -46
  444. package/lib/util/ArrayHelpers.js +35 -1
  445. package/lib/util/ArrayQueue.js +15 -22
  446. package/lib/util/AsyncQueue.js +37 -16
  447. package/lib/util/IterableHelpers.js +3 -4
  448. package/lib/util/LazyBucketSortedSet.js +60 -44
  449. package/lib/util/LazySet.js +11 -2
  450. package/lib/util/MapHelpers.js +17 -5
  451. package/lib/util/ParallelismFactorCalculator.js +11 -1
  452. package/lib/util/Queue.js +9 -3
  453. package/lib/util/Semaphore.js +4 -7
  454. package/lib/util/SetHelpers.js +5 -5
  455. package/lib/util/SortableSet.js +19 -6
  456. package/lib/util/StackedCacheMap.js +33 -3
  457. package/lib/util/StackedMap.js +1 -3
  458. package/lib/util/StringXor.js +46 -0
  459. package/lib/util/TupleQueue.js +9 -3
  460. package/lib/util/TupleSet.js +15 -5
  461. package/lib/util/URLAbsoluteSpecifier.js +8 -8
  462. package/lib/util/WeakTupleMap.js +70 -28
  463. package/lib/util/binarySearchBounds.js +51 -9
  464. package/lib/util/chainedImports.js +97 -0
  465. package/lib/util/cleverMerge.js +51 -36
  466. package/lib/util/comparators.js +146 -83
  467. package/lib/util/compileBooleanMatcher.js +35 -7
  468. package/lib/util/conventions.js +126 -0
  469. package/lib/util/create-schema-validation.js +9 -2
  470. package/lib/util/createHash.js +49 -14
  471. package/lib/util/deprecation.js +48 -15
  472. package/lib/util/deterministicGrouping.js +71 -39
  473. package/lib/util/extractUrlAndGlobal.js +3 -0
  474. package/lib/util/findGraphRoots.js +7 -5
  475. package/lib/util/fs.js +419 -94
  476. package/lib/util/hash/BatchedHash.js +10 -4
  477. package/lib/util/hash/md4.js +20 -0
  478. package/lib/util/hash/wasm-hash.js +163 -0
  479. package/lib/util/hash/xxhash64.js +7 -141
  480. package/lib/util/identifier.js +140 -93
  481. package/lib/util/internalSerializables.js +22 -0
  482. package/lib/util/makeSerializable.js +7 -0
  483. package/lib/util/memoize.js +10 -10
  484. package/lib/util/mergeScope.js +76 -0
  485. package/lib/util/nonNumericOnlyHash.js +22 -0
  486. package/lib/util/numberHash.js +84 -34
  487. package/lib/util/objectToMap.js +0 -1
  488. package/lib/util/processAsyncTree.js +7 -1
  489. package/lib/util/propertyAccess.js +7 -55
  490. package/lib/util/propertyName.js +77 -0
  491. package/lib/util/registerExternalSerializer.js +2 -2
  492. package/lib/util/runtime.js +188 -133
  493. package/lib/util/semver.js +64 -56
  494. package/lib/util/serialization.js +26 -1
  495. package/lib/util/smartGrouping.js +10 -10
  496. package/lib/util/source.js +1 -1
  497. package/lib/validateSchema.js +6 -2
  498. package/lib/wasm/EnableWasmLoadingPlugin.js +9 -4
  499. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +70 -30
  500. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +9 -1
  501. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +34 -16
  502. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +32 -12
  503. package/lib/wasm-async/AsyncWebAssemblyParser.js +17 -4
  504. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +72 -31
  505. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +17 -6
  506. package/lib/wasm-sync/WebAssemblyGenerator.js +72 -52
  507. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -4
  508. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +53 -43
  509. package/lib/wasm-sync/WebAssemblyParser.js +23 -9
  510. package/lib/wasm-sync/WebAssemblyUtils.js +5 -4
  511. package/lib/web/FetchCompileAsyncWasmPlugin.js +11 -1
  512. package/lib/web/FetchCompileWasmPlugin.js +59 -42
  513. package/lib/web/JsonpChunkLoadingPlugin.js +9 -0
  514. package/lib/web/JsonpChunkLoadingRuntimeModule.js +71 -41
  515. package/lib/webpack.js +43 -12
  516. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +15 -12
  517. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +55 -40
  518. package/module.d.ts +233 -0
  519. package/package.json +85 -139
  520. package/schemas/WebpackOptions.check.js +1 -1
  521. package/schemas/WebpackOptions.json +679 -47
  522. package/schemas/plugins/BannerPlugin.check.js +1 -1
  523. package/schemas/plugins/BannerPlugin.json +9 -1
  524. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  525. package/schemas/plugins/HashedModuleIdsPlugin.check.js +1 -1
  526. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  527. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  528. package/schemas/plugins/SourceMapDevToolPlugin.json +4 -0
  529. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  530. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  531. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  532. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  533. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  534. package/schemas/plugins/container/ContainerPlugin.json +10 -1
  535. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  536. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  537. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  538. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  539. package/schemas/plugins/container/ModuleFederationPlugin.json +12 -1
  540. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +7 -0
  541. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +6 -0
  542. package/schemas/plugins/css/CssAutoGeneratorOptions.json +3 -0
  543. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +7 -0
  544. package/schemas/plugins/css/CssAutoParserOptions.check.js +6 -0
  545. package/schemas/plugins/css/CssAutoParserOptions.json +3 -0
  546. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +7 -0
  547. package/schemas/plugins/css/CssGeneratorOptions.check.js +6 -0
  548. package/schemas/plugins/css/CssGeneratorOptions.json +3 -0
  549. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts +7 -0
  550. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +6 -0
  551. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +3 -0
  552. package/schemas/plugins/css/CssGlobalParserOptions.check.d.ts +7 -0
  553. package/schemas/plugins/css/CssGlobalParserOptions.check.js +6 -0
  554. package/schemas/plugins/css/CssGlobalParserOptions.json +3 -0
  555. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +7 -0
  556. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +6 -0
  557. package/schemas/plugins/css/CssModuleGeneratorOptions.json +3 -0
  558. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +7 -0
  559. package/schemas/plugins/css/CssModuleParserOptions.check.js +6 -0
  560. package/schemas/plugins/css/CssModuleParserOptions.json +3 -0
  561. package/schemas/plugins/css/CssParserOptions.check.d.ts +7 -0
  562. package/schemas/plugins/css/CssParserOptions.check.js +6 -0
  563. package/schemas/plugins/css/CssParserOptions.json +3 -0
  564. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  565. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  566. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  567. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  568. package/schemas/plugins/schemes/HttpUriPlugin.json +4 -0
  569. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  570. package/types.d.ts +5026 -1756
@@ -10,6 +10,9 @@ const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
10
10
  const Dependency = require("../Dependency");
11
11
  const Module = require("../Module");
12
12
  const ModuleFactory = require("../ModuleFactory");
13
+ const {
14
+ WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY
15
+ } = require("../ModuleTypeConstants");
13
16
  const RuntimeGlobals = require("../RuntimeGlobals");
14
17
  const Template = require("../Template");
15
18
  const CommonJsRequireDependency = require("../dependencies/CommonJsRequireDependency");
@@ -24,15 +27,25 @@ const { registerNotSerializable } = require("../util/serialization");
24
27
  /** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
25
28
  /** @typedef {import("../Module").LibIdentOptions} LibIdentOptions */
26
29
  /** @typedef {import("../Module").NeedBuildContext} NeedBuildContext */
30
+ /** @typedef {import("../Module").SourceTypes} SourceTypes */
27
31
  /** @typedef {import("../ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
28
32
  /** @typedef {import("../ModuleFactory").ModuleFactoryResult} ModuleFactoryResult */
29
33
  /** @typedef {import("../RequestShortener")} RequestShortener */
30
34
  /** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
31
35
  /** @typedef {import("../WebpackError")} WebpackError */
36
+ /** @typedef {import("../dependencies/HarmonyImportDependency")} HarmonyImportDependency */
32
37
  /** @typedef {import("../util/Hash")} Hash */
33
38
  /** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
34
39
 
35
- const IGNORED_DEPENDENCY_TYPES = new Set([
40
+ /** @typedef {{ client: string, data: string, active: boolean }} ModuleResult */
41
+
42
+ /**
43
+ * @typedef {object} BackendApi
44
+ * @property {function(function((Error | null)=) : void): void} dispose
45
+ * @property {function(Module): ModuleResult} module
46
+ */
47
+
48
+ const HMR_DEPENDENCY_TYPES = new Set([
36
49
  "import.meta.webpackHot.accept",
37
50
  "import.meta.webpackHot.decline",
38
51
  "module.hot.accept",
@@ -42,7 +55,7 @@ const IGNORED_DEPENDENCY_TYPES = new Set([
42
55
  /**
43
56
  * @param {undefined|string|RegExp|Function} test test option
44
57
  * @param {Module} module the module
45
- * @returns {boolean} true, if the module should be selected
58
+ * @returns {boolean | null | string} true, if the module should be selected
46
59
  */
47
60
  const checkTest = (test, module) => {
48
61
  if (test === undefined) return true;
@@ -63,6 +76,9 @@ const checkTest = (test, module) => {
63
76
  const TYPES = new Set(["javascript"]);
64
77
 
65
78
  class LazyCompilationDependency extends Dependency {
79
+ /**
80
+ * @param {LazyCompilationProxyModule} proxyModule proxy module
81
+ */
66
82
  constructor(proxyModule) {
67
83
  super();
68
84
  this.proxyModule = proxyModule;
@@ -87,8 +103,20 @@ class LazyCompilationDependency extends Dependency {
87
103
  registerNotSerializable(LazyCompilationDependency);
88
104
 
89
105
  class LazyCompilationProxyModule extends Module {
106
+ /**
107
+ * @param {string} context context
108
+ * @param {Module} originalModule an original module
109
+ * @param {string} request request
110
+ * @param {ModuleResult["client"]} client client
111
+ * @param {ModuleResult["data"]} data data
112
+ * @param {ModuleResult["active"]} active true when active, otherwise false
113
+ */
90
114
  constructor(context, originalModule, request, client, data, active) {
91
- super("lazy-compilation-proxy", context, originalModule.layer);
115
+ super(
116
+ WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY,
117
+ context,
118
+ originalModule.layer
119
+ );
92
120
  this.originalModule = originalModule;
93
121
  this.request = request;
94
122
  this.client = client;
@@ -100,7 +128,7 @@ class LazyCompilationProxyModule extends Module {
100
128
  * @returns {string} a unique identifier of the module
101
129
  */
102
130
  identifier() {
103
- return `lazy-compilation-proxy|${this.originalModule.identifier()}`;
131
+ return `${WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY}|${this.originalModule.identifier()}`;
104
132
  }
105
133
 
106
134
  /**
@@ -108,7 +136,7 @@ class LazyCompilationProxyModule extends Module {
108
136
  * @returns {string} a user readable identifier of the module
109
137
  */
110
138
  readableIdentifier(requestShortener) {
111
- return `lazy-compilation-proxy ${this.originalModule.readableIdentifier(
139
+ return `${WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY} ${this.originalModule.readableIdentifier(
112
140
  requestShortener
113
141
  )}`;
114
142
  }
@@ -135,12 +163,14 @@ class LazyCompilationProxyModule extends Module {
135
163
  * @returns {string | null} an identifier for library inclusion
136
164
  */
137
165
  libIdent(options) {
138
- return `${this.originalModule.libIdent(options)}!lazy-compilation-proxy`;
166
+ return `${this.originalModule.libIdent(
167
+ options
168
+ )}!${WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY}`;
139
169
  }
140
170
 
141
171
  /**
142
172
  * @param {NeedBuildContext} context context info
143
- * @param {function(WebpackError=, boolean=): void} callback callback function, returns true, if the module needs a rebuild
173
+ * @param {function((WebpackError | null)=, boolean=): void} callback callback function, returns true, if the module needs a rebuild
144
174
  * @returns {void}
145
175
  */
146
176
  needBuild(context, callback) {
@@ -174,7 +204,7 @@ class LazyCompilationProxyModule extends Module {
174
204
  }
175
205
 
176
206
  /**
177
- * @returns {Set<string>} types available (do not mutate)
207
+ * @returns {SourceTypes} types available (do not mutate)
178
208
  */
179
209
  getSourceTypes() {
180
210
  return TYPES;
@@ -212,13 +242,13 @@ class LazyCompilationProxyModule extends Module {
212
242
  ]);
213
243
  const keepActive = Template.asString([
214
244
  `var dispose = client.keepAlive({ data: data, active: ${JSON.stringify(
215
- !!block
245
+ Boolean(block)
216
246
  )}, module: module, onError: onError });`
217
247
  ]);
218
248
  let source;
219
249
  if (block) {
220
250
  const dep = block.dependencies[0];
221
- const module = moduleGraph.getModule(dep);
251
+ const module = /** @type {Module} */ (moduleGraph.getModule(dep));
222
252
  source = Template.asString([
223
253
  client,
224
254
  `module.exports = ${runtimeTemplate.moduleNamespacePromise({
@@ -247,7 +277,7 @@ class LazyCompilationProxyModule extends Module {
247
277
  source = Template.asString([
248
278
  client,
249
279
  "var resolveSelf, onError;",
250
- `module.exports = new Promise(function(resolve, reject) { resolveSelf = resolve; onError = reject; });`,
280
+ "module.exports = new Promise(function(resolve, reject) { resolveSelf = resolve; onError = reject; });",
251
281
  "if (module.hot) {",
252
282
  Template.indent([
253
283
  "module.hot.accept();",
@@ -280,14 +310,13 @@ class LazyCompilationProxyModule extends Module {
280
310
  registerNotSerializable(LazyCompilationProxyModule);
281
311
 
282
312
  class LazyCompilationDependencyFactory extends ModuleFactory {
283
- constructor(factory) {
313
+ constructor() {
284
314
  super();
285
- this._factory = factory;
286
315
  }
287
316
 
288
317
  /**
289
318
  * @param {ModuleFactoryCreateData} data data object
290
- * @param {function(Error=, ModuleFactoryResult=): void} callback callback
319
+ * @param {function((Error | null)=, ModuleFactoryResult=): void} callback callback
291
320
  * @returns {void}
292
321
  */
293
322
  create(data, callback) {
@@ -302,34 +331,34 @@ class LazyCompilationDependencyFactory extends ModuleFactory {
302
331
 
303
332
  class LazyCompilationPlugin {
304
333
  /**
305
- * @param {Object} options options
306
- * @param {(function(Compiler, string, function(Error?, any?): void): void) | function(Compiler, string): Promise<any>} options.backend the backend
307
- * @param {string} options.client the client reference
334
+ * @param {object} options options
335
+ * @param {(function(Compiler, function(Error=, BackendApi?): void): void) | function(Compiler): Promise<BackendApi>} options.backend the backend
308
336
  * @param {boolean} options.entries true, when entries are lazy compiled
309
337
  * @param {boolean} options.imports true, when import() modules are lazy compiled
310
- * @param {RegExp | string | (function(Module): boolean)} options.test additional filter for lazy compiled entrypoint modules
338
+ * @param {RegExp | string | (function(Module): boolean) | undefined} options.test additional filter for lazy compiled entrypoint modules
311
339
  */
312
- constructor({ backend, client, entries, imports, test }) {
340
+ constructor({ backend, entries, imports, test }) {
313
341
  this.backend = backend;
314
- this.client = client;
315
342
  this.entries = entries;
316
343
  this.imports = imports;
317
344
  this.test = test;
318
345
  }
346
+
319
347
  /**
320
348
  * Apply the plugin
321
349
  * @param {Compiler} compiler the compiler instance
322
350
  * @returns {void}
323
351
  */
324
352
  apply(compiler) {
353
+ /** @type {BackendApi} */
325
354
  let backend;
326
355
  compiler.hooks.beforeCompile.tapAsync(
327
356
  "LazyCompilationPlugin",
328
357
  (params, callback) => {
329
358
  if (backend !== undefined) return callback();
330
- const promise = this.backend(compiler, this.client, (err, result) => {
359
+ const promise = this.backend(compiler, (err, result) => {
331
360
  if (err) return callback(err);
332
- backend = result;
361
+ backend = /** @type {BackendApi} */ (result);
333
362
  callback();
334
363
  });
335
364
  if (promise && promise.then) {
@@ -347,32 +376,56 @@ class LazyCompilationPlugin {
347
376
  "LazyCompilationPlugin",
348
377
  (originalModule, createData, resolveData) => {
349
378
  if (
350
- resolveData.dependencies.every(
379
+ resolveData.dependencies.every(dep =>
380
+ HMR_DEPENDENCY_TYPES.has(dep.type)
381
+ )
382
+ ) {
383
+ // for HMR only resolving, try to determine if the HMR accept/decline refers to
384
+ // an import() or not
385
+ const hmrDep = resolveData.dependencies[0];
386
+ const originModule =
387
+ /** @type {Module} */
388
+ (compilation.moduleGraph.getParentModule(hmrDep));
389
+ const isReferringToDynamicImport = originModule.blocks.some(
390
+ block =>
391
+ block.dependencies.some(
392
+ dep =>
393
+ dep.type === "import()" &&
394
+ /** @type {HarmonyImportDependency} */ (dep).request ===
395
+ hmrDep.request
396
+ )
397
+ );
398
+ if (!isReferringToDynamicImport) return;
399
+ } else if (
400
+ !resolveData.dependencies.every(
351
401
  dep =>
352
- IGNORED_DEPENDENCY_TYPES.has(dep.type) ||
402
+ HMR_DEPENDENCY_TYPES.has(dep.type) ||
353
403
  (this.imports &&
354
404
  (dep.type === "import()" ||
355
405
  dep.type === "import() context element")) ||
356
406
  (this.entries && dep.type === "entry")
357
- ) &&
358
- !/webpack[/\\]hot[/\\]|webpack-dev-server[/\\]client/.test(
407
+ )
408
+ )
409
+ return;
410
+ if (
411
+ /webpack[/\\]hot[/\\]|webpack-dev-server[/\\]client|webpack-hot-middleware[/\\]client/.test(
359
412
  resolveData.request
360
- ) &&
361
- checkTest(this.test, originalModule)
362
- ) {
363
- const moduleInfo = backend.module(originalModule);
364
- if (!moduleInfo) return;
365
- const { client, data, active } = moduleInfo;
413
+ ) ||
414
+ !checkTest(this.test, originalModule)
415
+ )
416
+ return;
417
+ const moduleInfo = backend.module(originalModule);
418
+ if (!moduleInfo) return;
419
+ const { client, data, active } = moduleInfo;
366
420
 
367
- return new LazyCompilationProxyModule(
368
- compiler.context,
369
- originalModule,
370
- resolveData.request,
371
- client,
372
- data,
373
- active
374
- );
375
- }
421
+ return new LazyCompilationProxyModule(
422
+ compiler.context,
423
+ originalModule,
424
+ resolveData.request,
425
+ client,
426
+ data,
427
+ active
428
+ );
376
429
  }
377
430
  );
378
431
  compilation.dependencyFactories.set(
@@ -5,22 +5,66 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const http = require("http");
9
-
8
+ /** @typedef {import("http").IncomingMessage} IncomingMessage */
9
+ /** @typedef {import("http").RequestListener} RequestListener */
10
+ /** @typedef {import("http").ServerOptions} HttpServerOptions */
11
+ /** @typedef {import("http").ServerResponse} ServerResponse */
12
+ /** @typedef {import("https").ServerOptions} HttpsServerOptions */
13
+ /** @typedef {import("net").AddressInfo} AddressInfo */
14
+ /** @typedef {import("net").Server} Server */
15
+ /** @typedef {import("../../declarations/WebpackOptions").LazyCompilationDefaultBackendOptions} LazyCompilationDefaultBackendOptions */
10
16
  /** @typedef {import("../Compiler")} Compiler */
17
+ /** @typedef {import("../Module")} Module */
18
+ /** @typedef {import("./LazyCompilationPlugin").BackendApi} BackendApi */
11
19
 
12
20
  /**
21
+ * @callback BackendHandler
13
22
  * @param {Compiler} compiler compiler
14
- * @param {string} client client reference
15
- * @param {function(Error?, any?): void} callback callback
23
+ * @param {function(Error | null, BackendApi=): void} callback callback
16
24
  * @returns {void}
17
25
  */
18
- module.exports = (compiler, client, callback) => {
26
+
27
+ /**
28
+ * @param {Omit<LazyCompilationDefaultBackendOptions, "client"> & { client: NonNullable<LazyCompilationDefaultBackendOptions["client"]>}} options additional options for the backend
29
+ * @returns {BackendHandler} backend
30
+ */
31
+ module.exports = options => (compiler, callback) => {
19
32
  const logger = compiler.getInfrastructureLogger("LazyCompilationBackend");
20
33
  const activeModules = new Map();
21
34
  const prefix = "/lazy-compilation-using-";
22
35
 
36
+ const isHttps =
37
+ options.protocol === "https" ||
38
+ (typeof options.server === "object" &&
39
+ ("key" in options.server || "pfx" in options.server));
40
+
41
+ const createServer =
42
+ typeof options.server === "function"
43
+ ? options.server
44
+ : (() => {
45
+ const http = isHttps ? require("https") : require("http");
46
+ return http.createServer.bind(
47
+ http,
48
+ /** @type {HttpServerOptions | HttpsServerOptions} */
49
+ (options.server)
50
+ );
51
+ })();
52
+ /** @type {function(Server): void} */
53
+ const listen =
54
+ typeof options.listen === "function"
55
+ ? options.listen
56
+ : server => {
57
+ let listen = options.listen;
58
+ if (typeof listen === "object" && !("port" in listen))
59
+ listen = { ...listen, port: undefined };
60
+ server.listen(listen);
61
+ };
62
+
63
+ const protocol = options.protocol || (isHttps ? "https" : "http");
64
+
65
+ /** @type {RequestListener} */
23
66
  const requestListener = (req, res) => {
67
+ if (req.url === undefined) return;
24
68
  const keys = req.url.slice(prefix.length).split("@");
25
69
  req.socket.on("close", () => {
26
70
  setTimeout(() => {
@@ -38,7 +82,9 @@ module.exports = (compiler, client, callback) => {
38
82
  req.socket.setNoDelay(true);
39
83
  res.writeHead(200, {
40
84
  "content-type": "text/event-stream",
41
- "Access-Control-Allow-Origin": "*"
85
+ "Access-Control-Allow-Origin": "*",
86
+ "Access-Control-Allow-Methods": "*",
87
+ "Access-Control-Allow-Headers": "*"
42
88
  });
43
89
  res.write("\n");
44
90
  let moduleActivated = false;
@@ -52,7 +98,10 @@ module.exports = (compiler, client, callback) => {
52
98
  }
53
99
  if (moduleActivated && compiler.watching) compiler.watching.invalidate();
54
100
  };
55
- const server = http.createServer(requestListener);
101
+
102
+ const server = /** @type {Server} */ (createServer());
103
+ server.on("request", requestListener);
104
+
56
105
  let isClosing = false;
57
106
  /** @type {Set<import("net").Socket>} */
58
107
  const sockets = new Set();
@@ -63,42 +112,56 @@ module.exports = (compiler, client, callback) => {
63
112
  });
64
113
  if (isClosing) socket.destroy();
65
114
  });
66
- server.listen(err => {
67
- if (err) return callback(err);
68
- const addr = server.address();
69
- if (typeof addr === "string") throw new Error("addr must not be a string");
70
- const urlBase =
71
- addr.address === "::" || addr.address === "0.0.0.0"
72
- ? `http://localhost:${addr.port}`
73
- : addr.family === "IPv6"
74
- ? `http://[${addr.address}]:${addr.port}`
75
- : `http://${addr.address}:${addr.port}`;
76
- logger.log(
77
- `Server-Sent-Events server for lazy compilation open at ${urlBase}.`
78
- );
79
- callback(null, {
80
- dispose(callback) {
81
- isClosing = true;
82
- // Removing the listener is a workaround for a memory leak in node.js
83
- server.off("request", requestListener);
84
- server.close(err => {
85
- callback(err);
86
- });
87
- for (const socket of sockets) {
88
- socket.destroy(new Error("Server is disposing"));
89
- }
90
- },
91
- module(originalModule) {
92
- const key = `${encodeURIComponent(
93
- originalModule.identifier().replace(/\\/g, "/").replace(/@/g, "_")
94
- ).replace(/%(2F|3A|24|26|2B|2C|3B|3D|3A)/g, decodeURIComponent)}`;
95
- const active = activeModules.get(key) > 0;
96
- return {
97
- client: `${client}?${encodeURIComponent(urlBase + prefix)}`,
98
- data: key,
99
- active
100
- };
101
- }
102
- });
115
+ server.on("clientError", e => {
116
+ if (e.message !== "Server is disposing") logger.warn(e);
103
117
  });
118
+
119
+ server.on(
120
+ "listening",
121
+ /**
122
+ * @param {Error} err error
123
+ * @returns {void}
124
+ */
125
+ err => {
126
+ if (err) return callback(err);
127
+ const _addr = server.address();
128
+ if (typeof _addr === "string")
129
+ throw new Error("addr must not be a string");
130
+ const addr = /** @type {AddressInfo} */ (_addr);
131
+ const urlBase =
132
+ addr.address === "::" || addr.address === "0.0.0.0"
133
+ ? `${protocol}://localhost:${addr.port}`
134
+ : addr.family === "IPv6"
135
+ ? `${protocol}://[${addr.address}]:${addr.port}`
136
+ : `${protocol}://${addr.address}:${addr.port}`;
137
+ logger.log(
138
+ `Server-Sent-Events server for lazy compilation open at ${urlBase}.`
139
+ );
140
+ callback(null, {
141
+ dispose(callback) {
142
+ isClosing = true;
143
+ // Removing the listener is a workaround for a memory leak in node.js
144
+ server.off("request", requestListener);
145
+ server.close(err => {
146
+ callback(err);
147
+ });
148
+ for (const socket of sockets) {
149
+ socket.destroy(new Error("Server is disposing"));
150
+ }
151
+ },
152
+ module(originalModule) {
153
+ const key = `${encodeURIComponent(
154
+ originalModule.identifier().replace(/\\/g, "/").replace(/@/g, "_")
155
+ ).replace(/%(2F|3A|24|26|2B|2C|3B|3D)/g, decodeURIComponent)}`;
156
+ const active = activeModules.get(key) > 0;
157
+ return {
158
+ client: `${options.client}?${encodeURIComponent(urlBase + prefix)}`,
159
+ data: key,
160
+ active
161
+ };
162
+ }
163
+ });
164
+ }
165
+ );
166
+ listen(server);
104
167
  };
@@ -13,7 +13,18 @@ const {
13
13
 
14
14
  /** @typedef {import("../Compiler")} Compiler */
15
15
 
16
+ /**
17
+ * @typedef {object} ChunkModuleIdRangePluginOptions
18
+ * @property {string} name the chunk name
19
+ * @property {("index" | "index2" | "preOrderIndex" | "postOrderIndex")=} order order
20
+ * @property {number=} start start id
21
+ * @property {number=} end end id
22
+ */
23
+
16
24
  class ChunkModuleIdRangePlugin {
25
+ /**
26
+ * @param {ChunkModuleIdRangePluginOptions} options options object
27
+ */
17
28
  constructor(options) {
18
29
  this.options = options;
19
30
  }
@@ -59,9 +70,7 @@ class ChunkModuleIdRangePlugin {
59
70
  chunkModules = chunkGraph.getOrderedChunkModules(chunk, cmpFn);
60
71
  } else {
61
72
  chunkModules = Array.from(modules)
62
- .filter(m => {
63
- return chunkGraph.isModuleInChunk(m, chunk);
64
- })
73
+ .filter(m => chunkGraph.isModuleInChunk(m, chunk))
65
74
  .sort(compareModulesByPreOrderIndexOrIdentifier(moduleGraph));
66
75
  }
67
76
 
@@ -15,9 +15,18 @@ const {
15
15
  /** @typedef {import("../Compiler")} Compiler */
16
16
  /** @typedef {import("../Module")} Module */
17
17
 
18
+ /**
19
+ * @typedef {object} DeterministicChunkIdsPluginOptions
20
+ * @property {string=} context context for ids
21
+ * @property {number=} maxLength maximum length of ids
22
+ */
23
+
18
24
  class DeterministicChunkIdsPlugin {
19
- constructor(options) {
20
- this.options = options || {};
25
+ /**
26
+ * @param {DeterministicChunkIdsPluginOptions} [options] options
27
+ */
28
+ constructor(options = {}) {
29
+ this.options = options;
21
30
  }
22
31
 
23
32
  /**
@@ -42,9 +51,7 @@ class DeterministicChunkIdsPlugin {
42
51
 
43
52
  const usedIds = getUsedChunkIds(compilation);
44
53
  assignDeterministicIds(
45
- Array.from(chunks).filter(chunk => {
46
- return chunk.id === null;
47
- }),
54
+ Array.from(chunks).filter(chunk => chunk.id === null),
48
55
  chunk =>
49
56
  getFullChunkName(chunk, chunkGraph, context, compiler.root),
50
57
  compareNatural,
@@ -56,7 +63,7 @@ class DeterministicChunkIdsPlugin {
56
63
  chunk.ids = [id];
57
64
  return true;
58
65
  },
59
- [Math.pow(10, maxLength)],
66
+ [10 ** maxLength],
60
67
  10,
61
68
  usedIds.size
62
69
  );
@@ -9,7 +9,7 @@ const {
9
9
  compareModulesByPreOrderIndexOrIdentifier
10
10
  } = require("../util/comparators");
11
11
  const {
12
- getUsedModuleIds,
12
+ getUsedModuleIdsAndModules,
13
13
  getFullModuleName,
14
14
  assignDeterministicIds
15
15
  } = require("./IdHelpers");
@@ -17,9 +17,22 @@ const {
17
17
  /** @typedef {import("../Compiler")} Compiler */
18
18
  /** @typedef {import("../Module")} Module */
19
19
 
20
+ /**
21
+ * @typedef {object} DeterministicModuleIdsPluginOptions
22
+ * @property {string=} context context relative to which module identifiers are computed
23
+ * @property {function(Module): boolean=} test selector function for modules
24
+ * @property {number=} maxLength maximum id length in digits (used as starting point)
25
+ * @property {number=} salt hash salt for ids
26
+ * @property {boolean=} fixedLength do not increase the maxLength to find an optimal id space size
27
+ * @property {boolean=} failOnConflict throw an error when id conflicts occur (instead of rehashing)
28
+ */
29
+
20
30
  class DeterministicModuleIdsPlugin {
21
- constructor(options) {
22
- this.options = options || {};
31
+ /**
32
+ * @param {DeterministicModuleIdsPluginOptions} [options] options
33
+ */
34
+ constructor(options = {}) {
35
+ this.options = options;
23
36
  }
24
37
 
25
38
  /**
@@ -31,40 +44,51 @@ class DeterministicModuleIdsPlugin {
31
44
  compiler.hooks.compilation.tap(
32
45
  "DeterministicModuleIdsPlugin",
33
46
  compilation => {
34
- compilation.hooks.moduleIds.tap(
35
- "DeterministicModuleIdsPlugin",
36
- modules => {
37
- const chunkGraph = compilation.chunkGraph;
38
- const context = this.options.context
39
- ? this.options.context
40
- : compiler.context;
41
- const maxLength = this.options.maxLength || 3;
47
+ compilation.hooks.moduleIds.tap("DeterministicModuleIdsPlugin", () => {
48
+ const chunkGraph = compilation.chunkGraph;
49
+ const context = this.options.context
50
+ ? this.options.context
51
+ : compiler.context;
52
+ const maxLength = this.options.maxLength || 3;
53
+ const failOnConflict = this.options.failOnConflict || false;
54
+ const fixedLength = this.options.fixedLength || false;
55
+ const salt = this.options.salt || 0;
56
+ let conflicts = 0;
42
57
 
43
- const usedIds = getUsedModuleIds(compilation);
44
- assignDeterministicIds(
45
- Array.from(modules).filter(module => {
46
- if (!module.needId) return false;
47
- if (chunkGraph.getNumberOfModuleChunks(module) === 0)
48
- return false;
49
- return chunkGraph.getModuleId(module) === null;
50
- }),
51
- module => getFullModuleName(module, context, compiler.root),
52
- compareModulesByPreOrderIndexOrIdentifier(
53
- compilation.moduleGraph
54
- ),
55
- (module, id) => {
56
- const size = usedIds.size;
57
- usedIds.add(`${id}`);
58
- if (size === usedIds.size) return false;
59
- chunkGraph.setModuleId(module, id);
60
- return true;
61
- },
62
- [Math.pow(10, maxLength)],
63
- 10,
64
- usedIds.size
58
+ const [usedIds, modules] = getUsedModuleIdsAndModules(
59
+ compilation,
60
+ this.options.test
61
+ );
62
+ assignDeterministicIds(
63
+ modules,
64
+ module => getFullModuleName(module, context, compiler.root),
65
+ failOnConflict
66
+ ? () => 0
67
+ : compareModulesByPreOrderIndexOrIdentifier(
68
+ compilation.moduleGraph
69
+ ),
70
+ (module, id) => {
71
+ const size = usedIds.size;
72
+ usedIds.add(`${id}`);
73
+ if (size === usedIds.size) {
74
+ conflicts++;
75
+ return false;
76
+ }
77
+ chunkGraph.setModuleId(module, id);
78
+ return true;
79
+ },
80
+ [10 ** maxLength],
81
+ fixedLength ? 0 : 10,
82
+ usedIds.size,
83
+ salt
84
+ );
85
+ if (failOnConflict && conflicts)
86
+ throw new Error(
87
+ `Assigning deterministic module ids has lead to ${conflicts} conflict${
88
+ conflicts > 1 ? "s" : ""
89
+ }.\nIncrease the 'maxLength' to increase the id space and make conflicts less likely (recommended when there are many conflicts or application is expected to grow), or add an 'salt' number to try another hash starting value in the same id space (recommended when there is only a single conflict).`
65
90
  );
66
- }
67
- );
91
+ });
68
92
  }
69
93
  );
70
94
  }