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
@@ -9,70 +9,81 @@ const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
9
9
  const ConstDependency = require("../dependencies/ConstDependency");
10
10
  const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
11
11
 
12
- /** @typedef {import("estree").Expression} ExpressionNode */
12
+ /** @typedef {import("estree").Expression} Expression */
13
13
  /** @typedef {import("estree").Node} Node */
14
+ /** @typedef {import("estree").SourceLocation} SourceLocation */
14
15
  /** @typedef {import("./JavascriptParser")} JavascriptParser */
16
+ /** @typedef {import("./JavascriptParser").Range} Range */
15
17
 
16
18
  /**
17
19
  * @param {JavascriptParser} parser the parser
18
20
  * @param {string} value the const value
19
- * @param {string[]=} runtimeRequirements runtime requirements
20
- * @returns {function(ExpressionNode): true} plugin function
21
+ * @param {(string[] | null)=} runtimeRequirements runtime requirements
22
+ * @returns {function(Expression): true} plugin function
21
23
  */
22
- exports.toConstantDependency = (parser, value, runtimeRequirements) => {
23
- return function constDependency(expr) {
24
- const dep = new ConstDependency(value, expr.range, runtimeRequirements);
25
- dep.loc = expr.loc;
24
+ module.exports.toConstantDependency = (parser, value, runtimeRequirements) =>
25
+ function constDependency(expr) {
26
+ const dep = new ConstDependency(
27
+ value,
28
+ /** @type {Range} */ (expr.range),
29
+ runtimeRequirements
30
+ );
31
+ dep.loc = /** @type {SourceLocation} */ (expr.loc);
26
32
  parser.state.module.addPresentationalDependency(dep);
27
33
  return true;
28
34
  };
29
- };
30
35
 
31
36
  /**
32
37
  * @param {string} value the string value
33
- * @returns {function(ExpressionNode): BasicEvaluatedExpression} plugin function
38
+ * @returns {function(Expression): BasicEvaluatedExpression} plugin function
34
39
  */
35
- exports.evaluateToString = value => {
36
- return function stringExpression(expr) {
37
- return new BasicEvaluatedExpression().setString(value).setRange(expr.range);
40
+ module.exports.evaluateToString = value =>
41
+ function stringExpression(expr) {
42
+ return new BasicEvaluatedExpression()
43
+ .setString(value)
44
+ .setRange(/** @type {Range} */ (expr.range));
38
45
  };
39
- };
40
46
 
41
47
  /**
42
48
  * @param {number} value the number value
43
- * @returns {function(ExpressionNode): BasicEvaluatedExpression} plugin function
49
+ * @returns {function(Expression): BasicEvaluatedExpression} plugin function
44
50
  */
45
- exports.evaluateToNumber = value => {
46
- return function stringExpression(expr) {
47
- return new BasicEvaluatedExpression().setNumber(value).setRange(expr.range);
51
+ module.exports.evaluateToNumber = value =>
52
+ function stringExpression(expr) {
53
+ return new BasicEvaluatedExpression()
54
+ .setNumber(value)
55
+ .setRange(/** @type {Range} */ (expr.range));
48
56
  };
49
- };
50
57
 
51
58
  /**
52
59
  * @param {boolean} value the boolean value
53
- * @returns {function(ExpressionNode): BasicEvaluatedExpression} plugin function
60
+ * @returns {function(Expression): BasicEvaluatedExpression} plugin function
54
61
  */
55
- exports.evaluateToBoolean = value => {
56
- return function booleanExpression(expr) {
62
+ module.exports.evaluateToBoolean = value =>
63
+ function booleanExpression(expr) {
57
64
  return new BasicEvaluatedExpression()
58
65
  .setBoolean(value)
59
- .setRange(expr.range);
66
+ .setRange(/** @type {Range} */ (expr.range));
60
67
  };
61
- };
62
68
 
63
69
  /**
64
70
  * @param {string} identifier identifier
65
71
  * @param {string} rootInfo rootInfo
66
72
  * @param {function(): string[]} getMembers getMembers
67
73
  * @param {boolean|null=} truthy is truthy, null if nullish
68
- * @returns {function(ExpressionNode): BasicEvaluatedExpression} callback
74
+ * @returns {function(Expression): BasicEvaluatedExpression} callback
69
75
  */
70
- exports.evaluateToIdentifier = (identifier, rootInfo, getMembers, truthy) => {
71
- return function identifierExpression(expr) {
72
- let evaluatedExpression = new BasicEvaluatedExpression()
76
+ module.exports.evaluateToIdentifier = (
77
+ identifier,
78
+ rootInfo,
79
+ getMembers,
80
+ truthy
81
+ ) =>
82
+ function identifierExpression(expr) {
83
+ const evaluatedExpression = new BasicEvaluatedExpression()
73
84
  .setIdentifier(identifier, rootInfo, getMembers)
74
85
  .setSideEffects(false)
75
- .setRange(expr.range);
86
+ .setRange(/** @type {Range} */ (expr.range));
76
87
  switch (truthy) {
77
88
  case true:
78
89
  evaluatedExpression.setTruthy();
@@ -87,21 +98,31 @@ exports.evaluateToIdentifier = (identifier, rootInfo, getMembers, truthy) => {
87
98
 
88
99
  return evaluatedExpression;
89
100
  };
90
- };
91
101
 
92
- exports.expressionIsUnsupported = (parser, message) => {
93
- return function unsupportedExpression(expr) {
94
- const dep = new ConstDependency("(void 0)", expr.range, null);
95
- dep.loc = expr.loc;
102
+ /**
103
+ * @param {JavascriptParser} parser the parser
104
+ * @param {string} message the message
105
+ * @returns {function(Expression): boolean | undefined} callback to handle unsupported expression
106
+ */
107
+ module.exports.expressionIsUnsupported = (parser, message) =>
108
+ function unsupportedExpression(expr) {
109
+ const dep = new ConstDependency(
110
+ "(void 0)",
111
+ /** @type {Range} */ (expr.range),
112
+ null
113
+ );
114
+ dep.loc = /** @type {SourceLocation} */ (expr.loc);
96
115
  parser.state.module.addPresentationalDependency(dep);
97
116
  if (!parser.state.module) return;
98
117
  parser.state.module.addWarning(
99
- new UnsupportedFeatureWarning(message, expr.loc)
118
+ new UnsupportedFeatureWarning(
119
+ message,
120
+ /** @type {SourceLocation} */ (expr.loc)
121
+ )
100
122
  );
101
123
  return true;
102
124
  };
103
- };
104
125
 
105
- exports.skipTraversal = () => true;
126
+ module.exports.skipTraversal = () => true;
106
127
 
107
- exports.approve = () => true;
128
+ module.exports.approve = () => true;
@@ -5,55 +5,37 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const Entrypoint = require("../Entrypoint");
9
8
  const RuntimeGlobals = require("../RuntimeGlobals");
10
9
  const Template = require("../Template");
11
10
  const { isSubset } = require("../util/SetHelpers");
12
- const { chunkHasJs } = require("./JavascriptModulesPlugin");
11
+ const { getAllChunks } = require("./ChunkHelpers");
13
12
 
14
13
  /** @typedef {import("../util/Hash")} Hash */
15
14
  /** @typedef {import("../Chunk")} Chunk */
15
+ /** @typedef {import("../Chunk").ChunkId} ChunkId */
16
16
  /** @typedef {import("../Compilation")} Compilation */
17
17
  /** @typedef {import("../ChunkGraph")} ChunkGraph */
18
+ /** @typedef {import("../ChunkGraph").ModuleId} ModuleId */
19
+ /** @typedef {import("../Entrypoint")} Entrypoint */
20
+ /** @typedef {import("../ChunkGraph").EntryModuleWithChunkGroup} EntryModuleWithChunkGroup */
18
21
  /** @typedef {import("../ChunkGroup")} ChunkGroup */
19
22
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
20
23
  /** @typedef {(string|number)[]} EntryItem */
21
24
 
22
- // TODO move to this file to ../javascript/ChunkHelpers.js
25
+ const EXPORT_PREFIX = `var ${RuntimeGlobals.exports} = `;
23
26
 
24
- /**
25
- * @param {Entrypoint} entrypoint a chunk group
26
- * @param {Chunk} excludedChunk1 current chunk which is excluded
27
- * @param {Chunk} excludedChunk2 runtime chunk which is excluded
28
- * @returns {Set<Chunk>} chunks
29
- */
30
- const getAllChunks = (entrypoint, excludedChunk1, excludedChunk2) => {
31
- const queue = new Set([entrypoint]);
32
- const chunks = new Set();
33
- for (const entrypoint of queue) {
34
- for (const chunk of entrypoint.chunks) {
35
- if (chunk === excludedChunk1) continue;
36
- if (chunk === excludedChunk2) continue;
37
- chunks.add(chunk);
38
- }
39
- for (const parent of entrypoint.parentsIterable) {
40
- if (parent instanceof Entrypoint) queue.add(parent);
41
- }
42
- }
43
- return chunks;
44
- };
45
-
46
- const EXPORT_PREFIX = "var __webpack_exports__ = ";
27
+ /** @typedef {Set<Chunk>} Chunks */
28
+ /** @typedef {ModuleId[]} ModuleIds */
47
29
 
48
30
  /**
49
31
  * @param {ChunkGraph} chunkGraph chunkGraph
50
32
  * @param {RuntimeTemplate} runtimeTemplate runtimeTemplate
51
- * @param {import("../ChunkGraph").EntryModuleWithChunkGroup[]} entries entries
33
+ * @param {EntryModuleWithChunkGroup[]} entries entries
52
34
  * @param {Chunk} chunk chunk
53
35
  * @param {boolean} passive true: passive startup with on chunks loaded
54
36
  * @returns {string} runtime code
55
37
  */
56
- exports.generateEntryStartup = (
38
+ module.exports.generateEntryStartup = (
57
39
  chunkGraph,
58
40
  runtimeTemplate,
59
41
  entries,
@@ -63,14 +45,21 @@ exports.generateEntryStartup = (
63
45
  /** @type {string[]} */
64
46
  const runtime = [
65
47
  `var __webpack_exec__ = ${runtimeTemplate.returningFunction(
66
- `__webpack_require__(${RuntimeGlobals.entryModuleId} = moduleId)`,
48
+ `${RuntimeGlobals.require}(${RuntimeGlobals.entryModuleId} = moduleId)`,
67
49
  "moduleId"
68
50
  )}`
69
51
  ];
70
52
 
71
- const runModule = id => {
72
- return `__webpack_exec__(${JSON.stringify(id)})`;
73
- };
53
+ /**
54
+ * @param {ModuleId} id id
55
+ * @returns {string} fn to execute
56
+ */
57
+ const runModule = id => `__webpack_exec__(${JSON.stringify(id)})`;
58
+ /**
59
+ * @param {Chunks} chunks chunks
60
+ * @param {ModuleIds} moduleIds module ids
61
+ * @param {boolean=} final true when final, otherwise false
62
+ */
74
63
  const outputCombination = (chunks, moduleIds, final) => {
75
64
  if (chunks.size === 0) {
76
65
  runtime.push(
@@ -93,22 +82,35 @@ exports.generateEntryStartup = (
93
82
  }
94
83
  };
95
84
 
96
- let currentChunks = undefined;
97
- let currentModuleIds = undefined;
85
+ /** @type {Chunks | undefined} */
86
+ let currentChunks;
87
+ /** @type {ModuleIds | undefined} */
88
+ let currentModuleIds;
98
89
 
99
90
  for (const [module, entrypoint] of entries) {
100
- const runtimeChunk = entrypoint.getRuntimeChunk();
101
- const moduleId = chunkGraph.getModuleId(module);
102
- const chunks = getAllChunks(entrypoint, chunk, runtimeChunk);
91
+ const runtimeChunk =
92
+ /** @type {Entrypoint} */
93
+ (entrypoint).getRuntimeChunk();
94
+ const moduleId = /** @type {ModuleId} */ (chunkGraph.getModuleId(module));
95
+ const chunks = getAllChunks(
96
+ /** @type {Entrypoint} */
97
+ (entrypoint),
98
+ chunk,
99
+ runtimeChunk
100
+ );
103
101
  if (
104
102
  currentChunks &&
105
103
  currentChunks.size === chunks.size &&
106
104
  isSubset(currentChunks, chunks)
107
105
  ) {
108
- currentModuleIds.push(moduleId);
106
+ /** @type {ModuleIds} */
107
+ (currentModuleIds).push(moduleId);
109
108
  } else {
110
109
  if (currentChunks) {
111
- outputCombination(currentChunks, currentModuleIds);
110
+ outputCombination(
111
+ currentChunks,
112
+ /** @type {ModuleIds} */ (currentModuleIds)
113
+ );
112
114
  }
113
115
  currentChunks = chunks;
114
116
  currentModuleIds = [moduleId];
@@ -117,7 +119,12 @@ exports.generateEntryStartup = (
117
119
 
118
120
  // output current modules with export prefix
119
121
  if (currentChunks) {
120
- outputCombination(currentChunks, currentModuleIds, true);
122
+ outputCombination(
123
+ currentChunks,
124
+ /** @type {ModuleIds} */
125
+ (currentModuleIds),
126
+ true
127
+ );
121
128
  }
122
129
  runtime.push("");
123
130
  return Template.asString(runtime);
@@ -126,30 +133,45 @@ exports.generateEntryStartup = (
126
133
  /**
127
134
  * @param {Hash} hash the hash to update
128
135
  * @param {ChunkGraph} chunkGraph chunkGraph
129
- * @param {import("../ChunkGraph").EntryModuleWithChunkGroup[]} entries entries
136
+ * @param {EntryModuleWithChunkGroup[]} entries entries
130
137
  * @param {Chunk} chunk chunk
131
138
  * @returns {void}
132
139
  */
133
- exports.updateHashForEntryStartup = (hash, chunkGraph, entries, chunk) => {
140
+ module.exports.updateHashForEntryStartup = (
141
+ hash,
142
+ chunkGraph,
143
+ entries,
144
+ chunk
145
+ ) => {
134
146
  for (const [module, entrypoint] of entries) {
135
- const runtimeChunk = entrypoint.getRuntimeChunk();
147
+ const runtimeChunk =
148
+ /** @type {Entrypoint} */
149
+ (entrypoint).getRuntimeChunk();
136
150
  const moduleId = chunkGraph.getModuleId(module);
137
151
  hash.update(`${moduleId}`);
138
- for (const c of getAllChunks(entrypoint, chunk, runtimeChunk))
152
+ for (const c of getAllChunks(
153
+ /** @type {Entrypoint} */ (entrypoint),
154
+ chunk,
155
+ /** @type {Chunk} */ (runtimeChunk)
156
+ )) {
139
157
  hash.update(`${c.id}`);
158
+ }
140
159
  }
141
160
  };
142
161
 
143
162
  /**
144
163
  * @param {Chunk} chunk the chunk
145
164
  * @param {ChunkGraph} chunkGraph the chunk graph
165
+ * @param {function(Chunk, ChunkGraph): boolean} filterFn filter function
146
166
  * @returns {Set<number | string>} initially fulfilled chunk ids
147
167
  */
148
- exports.getInitialChunkIds = (chunk, chunkGraph) => {
168
+ module.exports.getInitialChunkIds = (chunk, chunkGraph, filterFn) => {
149
169
  const initialChunkIds = new Set(chunk.ids);
150
170
  for (const c of chunk.getAllInitialChunks()) {
151
- if (c === chunk || chunkHasJs(c, chunkGraph)) continue;
152
- for (const id of c.ids) initialChunkIds.add(id);
171
+ if (c === chunk || filterFn(c, chunkGraph)) continue;
172
+ for (const id of /** @type {ChunkId[]} */ (c.ids)) {
173
+ initialChunkIds.add(id);
174
+ }
153
175
  }
154
176
  return initialChunkIds;
155
177
  };
@@ -7,9 +7,19 @@
7
7
 
8
8
  const { register } = require("../util/serialization");
9
9
 
10
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
11
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
12
+ /** @typedef {import("../util/Hash")} Hash */
13
+ /** @typedef {import("./JsonModulesPlugin").RawJsonData} RawJsonData */
14
+
10
15
  class JsonData {
16
+ /**
17
+ * @param {Buffer | RawJsonData} data JSON data
18
+ */
11
19
  constructor(data) {
20
+ /** @type {Buffer | undefined} */
12
21
  this._buffer = undefined;
22
+ /** @type {RawJsonData | undefined} */
13
23
  this._data = undefined;
14
24
  if (Buffer.isBuffer(data)) {
15
25
  this._buffer = data;
@@ -18,21 +28,44 @@ class JsonData {
18
28
  }
19
29
  }
20
30
 
31
+ /**
32
+ * @returns {RawJsonData|undefined} Raw JSON data
33
+ */
21
34
  get() {
22
35
  if (this._data === undefined && this._buffer !== undefined) {
23
36
  this._data = JSON.parse(this._buffer.toString());
24
37
  }
25
38
  return this._data;
26
39
  }
40
+
41
+ /**
42
+ * @param {Hash} hash hash to be updated
43
+ * @returns {void} the updated hash
44
+ */
45
+ updateHash(hash) {
46
+ if (this._buffer === undefined && this._data !== undefined) {
47
+ this._buffer = Buffer.from(JSON.stringify(this._data));
48
+ }
49
+
50
+ if (this._buffer) hash.update(this._buffer);
51
+ }
27
52
  }
28
53
 
29
54
  register(JsonData, "webpack/lib/json/JsonData", null, {
55
+ /**
56
+ * @param {JsonData} obj JSONData object
57
+ * @param {ObjectSerializerContext} context context
58
+ */
30
59
  serialize(obj, { write }) {
31
60
  if (obj._buffer === undefined && obj._data !== undefined) {
32
61
  obj._buffer = Buffer.from(JSON.stringify(obj._data));
33
62
  }
34
63
  write(obj._buffer);
35
64
  },
65
+ /**
66
+ * @param {ObjectDeserializerContext} context context
67
+ * @returns {JsonData} deserialized JSON data
68
+ */
36
69
  deserialize({ read }) {
37
70
  return new JsonData(read());
38
71
  }
@@ -17,11 +17,17 @@ const RuntimeGlobals = require("../RuntimeGlobals");
17
17
  /** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
18
18
  /** @typedef {import("../NormalModule")} NormalModule */
19
19
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
20
+ /** @typedef {import("./JsonData")} JsonData */
21
+ /** @typedef {import("./JsonModulesPlugin").RawJsonData} RawJsonData */
20
22
 
23
+ /**
24
+ * @param {RawJsonData} data Raw JSON data
25
+ * @returns {undefined|string} stringified data
26
+ */
21
27
  const stringifySafe = data => {
22
28
  const stringified = JSON.stringify(data);
23
29
  if (!stringified) {
24
- return undefined; // Invalid JSON
30
+ return; // Invalid JSON
25
31
  }
26
32
 
27
33
  return stringified.replace(/\u2028|\u2029/g, str =>
@@ -30,36 +36,33 @@ const stringifySafe = data => {
30
36
  };
31
37
 
32
38
  /**
33
- * @param {Object} data data (always an object or array)
39
+ * @param {RawJsonData} data Raw JSON data (always an object or array)
34
40
  * @param {ExportsInfo} exportsInfo exports info
35
41
  * @param {RuntimeSpec} runtime the runtime
36
- * @returns {Object} reduced data
42
+ * @returns {RawJsonData} reduced data
37
43
  */
38
44
  const createObjectForExportsInfo = (data, exportsInfo, runtime) => {
39
45
  if (exportsInfo.otherExportsInfo.getUsed(runtime) !== UsageState.Unused)
40
46
  return data;
41
47
  const isArray = Array.isArray(data);
48
+ /** @type {RawJsonData} */
42
49
  const reducedData = isArray ? [] : {};
43
50
  for (const key of Object.keys(data)) {
44
51
  const exportInfo = exportsInfo.getReadOnlyExportInfo(key);
45
52
  const used = exportInfo.getUsed(runtime);
46
53
  if (used === UsageState.Unused) continue;
47
54
 
48
- let value;
49
- if (used === UsageState.OnlyPropertiesUsed && exportInfo.exportsInfo) {
50
- value = createObjectForExportsInfo(
51
- data[key],
52
- exportInfo.exportsInfo,
53
- runtime
54
- );
55
- } else {
56
- value = data[key];
57
- }
58
- const name = exportInfo.getUsedName(key, runtime);
59
- reducedData[name] = value;
55
+ /** @type {RawJsonData} */
56
+ const value =
57
+ used === UsageState.OnlyPropertiesUsed && exportInfo.exportsInfo
58
+ ? createObjectForExportsInfo(data[key], exportInfo.exportsInfo, runtime)
59
+ : data[key];
60
+
61
+ const name = /** @type {string} */ (exportInfo.getUsedName(key, runtime));
62
+ /** @type {Record<string, RawJsonData>} */ (reducedData)[name] = value;
60
63
  }
61
64
  if (isArray) {
62
- let arrayLengthWhenUsed =
65
+ const arrayLengthWhenUsed =
63
66
  exportsInfo.getReadOnlyExportInfo("length").getUsed(runtime) !==
64
67
  UsageState.Unused
65
68
  ? data.length
@@ -86,6 +89,7 @@ const createObjectForExportsInfo = (data, exportsInfo, runtime) => {
86
89
  : { length: arrayLengthWhenUsed },
87
90
  reducedData
88
91
  );
92
+ /** @type {number} */
89
93
  const generatedLength =
90
94
  arrayLengthWhenUsed !== undefined
91
95
  ? Math.max(arrayLengthWhenUsed, reducedData.length)
@@ -116,12 +120,13 @@ class JsonGenerator extends Generator {
116
120
  * @returns {number} estimate size of the module
117
121
  */
118
122
  getSize(module, type) {
119
- let data =
123
+ /** @type {RawJsonData | undefined} */
124
+ const data =
120
125
  module.buildInfo &&
121
126
  module.buildInfo.jsonData &&
122
127
  module.buildInfo.jsonData.get();
123
128
  if (!data) return 0;
124
- return stringifySafe(data).length + 10;
129
+ return /** @type {string} */ (stringifySafe(data)).length + 10;
125
130
  }
126
131
 
127
132
  /**
@@ -148,6 +153,7 @@ class JsonGenerator extends Generator {
148
153
  concatenationScope
149
154
  }
150
155
  ) {
156
+ /** @type {RawJsonData | undefined} */
151
157
  const data =
152
158
  module.buildInfo &&
153
159
  module.buildInfo.jsonData &&
@@ -160,18 +166,20 @@ class JsonGenerator extends Generator {
160
166
  );
161
167
  }
162
168
  const exportsInfo = moduleGraph.getExportsInfo(module);
163
- let finalJson =
169
+ /** @type {RawJsonData} */
170
+ const finalJson =
164
171
  typeof data === "object" &&
165
172
  data &&
166
173
  exportsInfo.otherExportsInfo.getUsed(runtime) === UsageState.Unused
167
174
  ? createObjectForExportsInfo(data, exportsInfo, runtime)
168
175
  : data;
169
176
  // Use JSON because JSON.parse() is much faster than JavaScript evaluation
170
- const jsonStr = stringifySafe(finalJson);
177
+ const jsonStr = /** @type {string} */ (stringifySafe(finalJson));
171
178
  const jsonExpr =
172
179
  jsonStr.length > 20 && typeof finalJson === "object"
173
- ? `JSON.parse('${jsonStr.replace(/[\\']/g, "\\$&")}')`
180
+ ? `/*#__PURE__*/JSON.parse('${jsonStr.replace(/[\\']/g, "\\$&")}')`
174
181
  : jsonStr;
182
+ /** @type {string} */
175
183
  let content;
176
184
  if (concatenationScope) {
177
185
  content = `${runtimeTemplate.supportsConst() ? "const" : "var"} ${
@@ -5,11 +5,13 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ const { JSON_MODULE_TYPE } = require("../ModuleTypeConstants");
8
9
  const createSchemaValidation = require("../util/create-schema-validation");
9
10
  const JsonGenerator = require("./JsonGenerator");
10
11
  const JsonParser = require("./JsonParser");
11
12
 
12
13
  /** @typedef {import("../Compiler")} Compiler */
14
+ /** @typedef {Record<string, any>} RawJsonData */
13
15
 
14
16
  const validate = createSchemaValidation(
15
17
  require("../../schemas/plugins/JsonModulesPluginParser.check.js"),
@@ -20,6 +22,12 @@ const validate = createSchemaValidation(
20
22
  }
21
23
  );
22
24
 
25
+ const PLUGIN_NAME = "JsonModulesPlugin";
26
+
27
+ /**
28
+ * The JsonModulesPlugin is the entrypoint plugin for the json modules feature.
29
+ * It adds the json module type to the compiler and registers the json parser and generator.
30
+ */
23
31
  class JsonModulesPlugin {
24
32
  /**
25
33
  * Apply the plugin
@@ -28,20 +36,18 @@ class JsonModulesPlugin {
28
36
  */
29
37
  apply(compiler) {
30
38
  compiler.hooks.compilation.tap(
31
- "JsonModulesPlugin",
39
+ PLUGIN_NAME,
32
40
  (compilation, { normalModuleFactory }) => {
33
41
  normalModuleFactory.hooks.createParser
34
- .for("json")
35
- .tap("JsonModulesPlugin", parserOptions => {
42
+ .for(JSON_MODULE_TYPE)
43
+ .tap(PLUGIN_NAME, parserOptions => {
36
44
  validate(parserOptions);
37
45
 
38
46
  return new JsonParser(parserOptions);
39
47
  });
40
48
  normalModuleFactory.hooks.createGenerator
41
- .for("json")
42
- .tap("JsonModulesPlugin", () => {
43
- return new JsonGenerator();
44
- });
49
+ .for(JSON_MODULE_TYPE)
50
+ .tap(PLUGIN_NAME, () => new JsonGenerator());
45
51
  }
46
52
  );
47
53
  }
@@ -5,14 +5,19 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const parseJson = require("json-parse-better-errors");
9
8
  const Parser = require("../Parser");
10
9
  const JsonExportsDependency = require("../dependencies/JsonExportsDependency");
10
+ const memoize = require("../util/memoize");
11
11
  const JsonData = require("./JsonData");
12
12
 
13
13
  /** @typedef {import("../../declarations/plugins/JsonModulesPluginParser").JsonModulesPluginParserOptions} JsonModulesPluginParserOptions */
14
+ /** @typedef {import("../Module").BuildInfo} BuildInfo */
15
+ /** @typedef {import("../Module").BuildMeta} BuildMeta */
14
16
  /** @typedef {import("../Parser").ParserState} ParserState */
15
17
  /** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
18
+ /** @typedef {import("./JsonModulesPlugin").RawJsonData} RawJsonData */
19
+
20
+ const getParseJson = memoize(() => require("json-parse-even-better-errors"));
16
21
 
17
22
  class JsonParser extends Parser {
18
23
  /**
@@ -33,23 +38,32 @@ class JsonParser extends Parser {
33
38
  source = source.toString("utf-8");
34
39
  }
35
40
 
36
- /** @type {JsonModulesPluginParserOptions["parse"]} */
41
+ /** @type {NonNullable<JsonModulesPluginParserOptions["parse"]>} */
37
42
  const parseFn =
38
- typeof this.options.parse === "function" ? this.options.parse : parseJson;
39
-
40
- const data =
41
- typeof source === "object"
42
- ? source
43
- : parseFn(source[0] === "\ufeff" ? source.slice(1) : source);
44
-
45
- state.module.buildInfo.jsonData = new JsonData(data);
46
- state.module.buildInfo.strict = true;
47
- state.module.buildMeta.exportsType = "default";
48
- state.module.buildMeta.defaultObject =
43
+ typeof this.options.parse === "function"
44
+ ? this.options.parse
45
+ : getParseJson();
46
+ /** @type {Buffer | RawJsonData | undefined} */
47
+ let data;
48
+ try {
49
+ data =
50
+ typeof source === "object"
51
+ ? source
52
+ : parseFn(source[0] === "\uFEFF" ? source.slice(1) : source);
53
+ } catch (err) {
54
+ throw new Error(
55
+ `Cannot parse JSON: ${/** @type {Error} */ (err).message}`
56
+ );
57
+ }
58
+ const jsonData = new JsonData(/** @type {Buffer | RawJsonData} */ (data));
59
+ const buildInfo = /** @type {BuildInfo} */ (state.module.buildInfo);
60
+ buildInfo.jsonData = jsonData;
61
+ buildInfo.strict = true;
62
+ const buildMeta = /** @type {BuildMeta} */ (state.module.buildMeta);
63
+ buildMeta.exportsType = "default";
64
+ buildMeta.defaultObject =
49
65
  typeof data === "object" ? "redirect-warn" : false;
50
- state.module.addDependency(
51
- new JsonExportsDependency(JsonExportsDependency.getExportsFromData(data))
52
- );
66
+ state.module.addDependency(new JsonExportsDependency(jsonData));
53
67
  return state;
54
68
  }
55
69
  }