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
@@ -6,6 +6,27 @@
6
6
  "use strict";
7
7
 
8
8
  /**
9
+ * The StackedCacheMap is a data structure designed as an alternative to a Map
10
+ * in situations where you need to handle multiple item additions and
11
+ * frequently access the largest map.
12
+ *
13
+ * It is particularly optimized for efficiently adding multiple items
14
+ * at once, which can be achieved using the `addAll` method.
15
+ *
16
+ * It has a fallback Map that is used when the map to be added is mutable.
17
+ *
18
+ * Note: `delete` and `has` are not supported for performance reasons.
19
+ * @example
20
+ * ```js
21
+ * const map = new StackedCacheMap();
22
+ * map.addAll(new Map([["a", 1], ["b", 2]]), true);
23
+ * map.addAll(new Map([["c", 3], ["d", 4]]), true);
24
+ * map.get("a"); // 1
25
+ * map.get("d"); // 4
26
+ * for (const [key, value] of map) {
27
+ * console.log(key, value);
28
+ * }
29
+ * ```
9
30
  * @template K
10
31
  * @template V
11
32
  */
@@ -18,8 +39,11 @@ class StackedCacheMap {
18
39
  }
19
40
 
20
41
  /**
42
+ * If `immutable` is true, the map can be referenced by the StackedCacheMap
43
+ * and should not be changed afterwards. If the map is mutable, all items
44
+ * are copied into a fallback Map.
21
45
  * @param {ReadonlyMap<K, V>} map map to add
22
- * @param {boolean} immutable if 'map' is immutable and StackedCacheMap can keep referencing it
46
+ * @param {boolean=} immutable if 'map' is immutable and StackedCacheMap can keep referencing it
23
47
  */
24
48
  addAll(map, immutable) {
25
49
  if (immutable) {
@@ -68,7 +92,7 @@ class StackedCacheMap {
68
92
 
69
93
  /**
70
94
  * @param {K} item the key of the element to return
71
- * @returns {V} the value of the element
95
+ * @returns {V | undefined} the value of the element
72
96
  */
73
97
  get(item) {
74
98
  for (const map of this.stack) {
@@ -83,6 +107,9 @@ class StackedCacheMap {
83
107
  this.map.clear();
84
108
  }
85
109
 
110
+ /**
111
+ * @returns {number} size of the map
112
+ */
86
113
  get size() {
87
114
  let size = this.map.size;
88
115
  for (const map of this.stack) {
@@ -91,6 +118,9 @@ class StackedCacheMap {
91
118
  return size;
92
119
  }
93
120
 
121
+ /**
122
+ * @returns {Iterator<[K, V]>} iterator
123
+ */
94
124
  [Symbol.iterator]() {
95
125
  const iterators = this.stack.map(map => map[Symbol.iterator]());
96
126
  let current = this.map[Symbol.iterator]();
@@ -98,7 +128,7 @@ class StackedCacheMap {
98
128
  next() {
99
129
  let result = current.next();
100
130
  while (result.done && iterators.length > 0) {
101
- current = iterators.pop();
131
+ current = /** @type {IterableIterator<[K, V]>} */ (iterators.pop());
102
132
  result = current.next();
103
133
  }
104
134
  return result;
@@ -29,9 +29,8 @@ const extractPair = pair => {
29
29
  const val = pair[1];
30
30
  if (val === UNDEFINED_MARKER || val === TOMBSTONE) {
31
31
  return [key, undefined];
32
- } else {
33
- return /** @type {[K, Cell<V>]} */ (pair);
34
32
  }
33
+ return /** @type {[K, Cell<V>]} */ (pair);
35
34
  };
36
35
 
37
36
  /**
@@ -116,7 +115,6 @@ class StackedMap {
116
115
  }
117
116
  this.map.set(item, TOMBSTONE);
118
117
  }
119
- return undefined;
120
118
  }
121
119
 
122
120
  _compress() {
@@ -5,12 +5,43 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ /** @typedef {import("../util/Hash")} Hash */
9
+
10
+ /**
11
+ * StringXor class provides methods for performing
12
+ * [XOR operations](https://en.wikipedia.org/wiki/Exclusive_or) on strings. In this context
13
+ * we operating on the character codes of two strings, which are represented as
14
+ * [Buffer](https://nodejs.org/api/buffer.html) objects.
15
+ *
16
+ * We use [StringXor in webpack](https://github.com/webpack/webpack/commit/41a8e2ea483a544c4ccd3e6217bdfb80daffca39)
17
+ * to create a hash of the current state of the compilation. By XOR'ing the Module hashes, it
18
+ * doesn't matter if the Module hashes are sorted or not. This is useful because it allows us to avoid sorting the
19
+ * Module hashes.
20
+ * @example
21
+ * ```js
22
+ * const xor = new StringXor();
23
+ * xor.add('hello');
24
+ * xor.add('world');
25
+ * console.log(xor.toString());
26
+ * ```
27
+ * @example
28
+ * ```js
29
+ * const xor = new StringXor();
30
+ * xor.add('foo');
31
+ * xor.add('bar');
32
+ * const hash = createHash('sha256');
33
+ * hash.update(xor.toString());
34
+ * console.log(hash.digest('hex'));
35
+ * ```
36
+ */
8
37
  class StringXor {
9
38
  constructor() {
39
+ /** @type {Buffer|undefined} */
10
40
  this._value = undefined;
11
41
  }
12
42
 
13
43
  /**
44
+ * Adds a string to the current StringXor object.
14
45
  * @param {string} str string
15
46
  * @returns {void}
16
47
  */
@@ -18,6 +49,10 @@ class StringXor {
18
49
  const len = str.length;
19
50
  const value = this._value;
20
51
  if (value === undefined) {
52
+ /**
53
+ * We are choosing to use Buffer.allocUnsafe() because it is often faster than Buffer.alloc() because
54
+ * it allocates a new buffer of the specified size without initializing the memory.
55
+ */
21
56
  const newValue = (this._value = Buffer.allocUnsafe(len));
22
57
  for (let i = 0; i < len; i++) {
23
58
  newValue[i] = str.charCodeAt(i);
@@ -41,11 +76,22 @@ class StringXor {
41
76
  }
42
77
  }
43
78
 
79
+ /**
80
+ * Returns a string that represents the current state of the StringXor object. We chose to use "latin1" encoding
81
+ * here because "latin1" encoding is a single-byte encoding that can represent all characters in the
82
+ * [ISO-8859-1 character set](https://en.wikipedia.org/wiki/ISO/IEC_8859-1). This is useful when working
83
+ * with binary data that needs to be represented as a string.
84
+ * @returns {string} Returns a string that represents the current state of the StringXor object.
85
+ */
44
86
  toString() {
45
87
  const value = this._value;
46
88
  return value === undefined ? "" : value.toString("latin1");
47
89
  }
48
90
 
91
+ /**
92
+ * Updates the hash with the current state of the StringXor object.
93
+ * @param {Hash} hash Hash instance
94
+ */
49
95
  updateHash(hash) {
50
96
  const value = this._value;
51
97
  if (value !== undefined) hash.update(value);
@@ -15,9 +15,15 @@ class TupleQueue {
15
15
  * @param {Iterable<T>=} items The initial elements.
16
16
  */
17
17
  constructor(items) {
18
- /** @private @type {TupleSet<T>} */
18
+ /**
19
+ * @private
20
+ * @type {TupleSet<T>}
21
+ */
19
22
  this._set = new TupleSet(items);
20
- /** @private @type {Iterator<T>} */
23
+ /**
24
+ * @private
25
+ * @type {Iterator<T>}
26
+ */
21
27
  this._iterator = this._set[Symbol.iterator]();
22
28
  }
23
29
 
@@ -51,7 +57,7 @@ class TupleQueue {
51
57
  this._set.delete(...value);
52
58
  return value;
53
59
  }
54
- return undefined;
60
+ return;
55
61
  }
56
62
  this._set.delete(...result.value);
57
63
  return result.value;
@@ -9,7 +9,11 @@
9
9
  * @template {any[]} T
10
10
  */
11
11
  class TupleSet {
12
+ /**
13
+ * @param {Iterable<T>=} init init
14
+ */
12
15
  constructor(init) {
16
+ /** @type {Map<T, TODO>} */
13
17
  this._map = new Map();
14
18
  this.size = 0;
15
19
  if (init) {
@@ -62,7 +66,7 @@ class TupleSet {
62
66
  }
63
67
 
64
68
  const beforeLast = args[args.length - 2];
65
- let set = map.get(beforeLast);
69
+ const set = map.get(beforeLast);
66
70
  if (set === undefined) {
67
71
  return false;
68
72
  }
@@ -86,7 +90,7 @@ class TupleSet {
86
90
  }
87
91
 
88
92
  const beforeLast = args[args.length - 2];
89
- let set = map.get(beforeLast);
93
+ const set = map.get(beforeLast);
90
94
  if (set === undefined) {
91
95
  return;
92
96
  }
@@ -101,10 +105,17 @@ class TupleSet {
101
105
  * @returns {Iterator<T>} iterator
102
106
  */
103
107
  [Symbol.iterator]() {
108
+ /** @type {TODO[]} */
104
109
  const iteratorStack = [];
110
+ /** @type {T[]} */
105
111
  const tuple = [];
106
- let currentSetIterator = undefined;
112
+ /** @type {Iterator<T> | undefined} */
113
+ let currentSetIterator;
107
114
 
115
+ /**
116
+ * @param {TODO} it iterator
117
+ * @returns {boolean} result
118
+ */
108
119
  const next = it => {
109
120
  const result = it.next();
110
121
  if (result.done) {
@@ -118,9 +129,8 @@ class TupleSet {
118
129
  if (value instanceof Set) {
119
130
  currentSetIterator = value[Symbol.iterator]();
120
131
  return true;
121
- } else {
122
- return next(value[Symbol.iterator]());
123
132
  }
133
+ return next(value[Symbol.iterator]());
124
134
  };
125
135
 
126
136
  next(this._map[Symbol.iterator]());
@@ -36,7 +36,7 @@ function getScheme(specifier) {
36
36
  (start < aLowerCaseCharCode || start > zLowerCaseCharCode) &&
37
37
  (start < aUpperCaseCharCode || start > zUpperCaseCharCode)
38
38
  ) {
39
- return undefined;
39
+ return;
40
40
  }
41
41
 
42
42
  let i = 1;
@@ -49,12 +49,12 @@ function getScheme(specifier) {
49
49
  ch === plusCharCode ||
50
50
  ch === hyphenCharCode
51
51
  ) {
52
- if (++i === specifier.length) return undefined;
52
+ if (++i === specifier.length) return;
53
53
  ch = specifier.charCodeAt(i);
54
54
  }
55
55
 
56
56
  // Scheme must end with colon
57
- if (ch !== colonCharCode) return undefined;
57
+ if (ch !== colonCharCode) return;
58
58
 
59
59
  // Check for Windows absolute path
60
60
  // https://url.spec.whatwg.org/#url-miscellaneous
@@ -67,7 +67,7 @@ function getScheme(specifier) {
67
67
  nextChar === hashCharCode ||
68
68
  nextChar === queryCharCode
69
69
  ) {
70
- return undefined;
70
+ return;
71
71
  }
72
72
  }
73
73
 
@@ -76,12 +76,12 @@ function getScheme(specifier) {
76
76
 
77
77
  /**
78
78
  * @param {string} specifier specifier
79
- * @returns {string|null} protocol if absolute URL specifier provided
79
+ * @returns {string | null | undefined} protocol if absolute URL specifier provided
80
80
  */
81
81
  function getProtocol(specifier) {
82
82
  const scheme = getScheme(specifier);
83
- return scheme === undefined ? undefined : scheme + ":";
83
+ return scheme === undefined ? undefined : `${scheme}:`;
84
84
  }
85
85
 
86
- exports.getScheme = getScheme;
87
- exports.getProtocol = getProtocol;
86
+ module.exports.getScheme = getScheme;
87
+ module.exports.getProtocol = getProtocol;
@@ -5,6 +5,21 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ /**
9
+ * @template {any[]} T
10
+ * @template V
11
+ * @typedef {Map<object, WeakTupleMap<T, V>>} M
12
+ */
13
+ /**
14
+ * @template {any[]} T
15
+ * @template V
16
+ * @typedef {WeakMap<object, WeakTupleMap<T, V>>} W
17
+ */
18
+
19
+ /**
20
+ * @param {any} thing thing
21
+ * @returns {boolean} true if is weak
22
+ */
8
23
  const isWeakKey = thing => typeof thing === "object" && thing !== null;
9
24
 
10
25
  /**
@@ -15,11 +30,20 @@ class WeakTupleMap {
15
30
  constructor() {
16
31
  /** @private */
17
32
  this.f = 0;
18
- /** @private @type {any} */
33
+ /**
34
+ * @private
35
+ * @type {any}
36
+ */
19
37
  this.v = undefined;
20
- /** @private @type {Map<object, WeakTupleMap<T, V>> | undefined} */
38
+ /**
39
+ * @private
40
+ * @type {M<T, V> | undefined}
41
+ */
21
42
  this.m = undefined;
22
- /** @private @type {WeakMap<object, WeakTupleMap<T, V>> | undefined} */
43
+ /**
44
+ * @private
45
+ * @type {W<T, V> | undefined}
46
+ */
23
47
  this.w = undefined;
24
48
  }
25
49
 
@@ -41,7 +65,7 @@ class WeakTupleMap {
41
65
  * @returns {boolean} true, if the tuple is in the Set
42
66
  */
43
67
  has(...args) {
44
- /** @type {WeakTupleMap<T, V>} */
68
+ /** @type {WeakTupleMap<T, V> | undefined} */
45
69
  let node = this;
46
70
  for (let i = 0; i < args.length; i++) {
47
71
  node = node._peek(args[i]);
@@ -52,14 +76,14 @@ class WeakTupleMap {
52
76
 
53
77
  /**
54
78
  * @param {T} args tuple
55
- * @returns {V} the value
79
+ * @returns {V | undefined} the value
56
80
  */
57
81
  get(...args) {
58
- /** @type {WeakTupleMap<T, V>} */
82
+ /** @type {WeakTupleMap<T, V> | undefined} */
59
83
  let node = this;
60
84
  for (let i = 0; i < args.length; i++) {
61
85
  node = node._peek(args[i]);
62
- if (node === undefined) return undefined;
86
+ if (node === undefined) return;
63
87
  }
64
88
  return node._getValue();
65
89
  }
@@ -86,7 +110,7 @@ class WeakTupleMap {
86
110
  * @returns {void}
87
111
  */
88
112
  delete(...args) {
89
- /** @type {WeakTupleMap<T, V>} */
113
+ /** @type {WeakTupleMap<T, V> | undefined} */
90
114
  let node = this;
91
115
  for (let i = 0; i < args.length; i++) {
92
116
  node = node._peek(args[i]);
@@ -113,6 +137,10 @@ class WeakTupleMap {
113
137
  return (this.f & 1) === 1;
114
138
  }
115
139
 
140
+ /**
141
+ * @param {any} v value
142
+ * @private
143
+ */
116
144
  _setValue(v) {
117
145
  this.f |= 1;
118
146
  this.v = v;
@@ -123,16 +151,25 @@ class WeakTupleMap {
123
151
  this.v = undefined;
124
152
  }
125
153
 
154
+ /**
155
+ * @param {any} thing thing
156
+ * @returns {WeakTupleMap<T, V> | undefined} thing
157
+ * @private
158
+ */
126
159
  _peek(thing) {
127
160
  if (isWeakKey(thing)) {
128
- if ((this.f & 4) !== 4) return undefined;
129
- return this.w.get(thing);
130
- } else {
131
- if ((this.f & 2) !== 2) return undefined;
132
- return this.m.get(thing);
161
+ if ((this.f & 4) !== 4) return;
162
+ return /** @type {W<T, V>} */ (this.w).get(thing);
133
163
  }
164
+ if ((this.f & 2) !== 2) return;
165
+ return /** @type {M<T, V>} */ (this.m).get(thing);
134
166
  }
135
167
 
168
+ /**
169
+ * @private
170
+ * @param {any} thing thing
171
+ * @returns {WeakTupleMap<T, V>} value
172
+ */
136
173
  _get(thing) {
137
174
  if (isWeakKey(thing)) {
138
175
  if ((this.f & 4) !== 4) {
@@ -142,29 +179,34 @@ class WeakTupleMap {
142
179
  (this.w = newMap).set(thing, newNode);
143
180
  return newNode;
144
181
  }
145
- const entry = this.w.get(thing);
182
+ const entry =
183
+ /** @type {W<T, V>} */
184
+ (this.w).get(thing);
146
185
  if (entry !== undefined) {
147
186
  return entry;
148
187
  }
149
188
  const newNode = new WeakTupleMap();
150
- this.w.set(thing, newNode);
189
+ /** @type {W<T, V>} */
190
+ (this.w).set(thing, newNode);
151
191
  return newNode;
152
- } else {
153
- if ((this.f & 2) !== 2) {
154
- const newMap = new Map();
155
- this.f |= 2;
156
- const newNode = new WeakTupleMap();
157
- (this.m = newMap).set(thing, newNode);
158
- return newNode;
159
- }
160
- const entry = this.m.get(thing);
161
- if (entry !== undefined) {
162
- return entry;
163
- }
192
+ }
193
+ if ((this.f & 2) !== 2) {
194
+ const newMap = new Map();
195
+ this.f |= 2;
164
196
  const newNode = new WeakTupleMap();
165
- this.m.set(thing, newNode);
197
+ (this.m = newMap).set(thing, newNode);
166
198
  return newNode;
167
199
  }
200
+ const entry =
201
+ /** @type {M<T, V>} */
202
+ (this.m).get(thing);
203
+ if (entry !== undefined) {
204
+ return entry;
205
+ }
206
+ const newNode = new WeakTupleMap();
207
+ /** @type {M<T, V>} */
208
+ (this.m).set(thing, newNode);
209
+ return newNode;
168
210
  }
169
211
  }
170
212
 
@@ -8,6 +8,27 @@
8
8
  /* cspell:disable-next-line */
9
9
  // Refactor: Peter Somogyvari @petermetz
10
10
 
11
+ /** @typedef {">=" | "<=" | "<" | ">" | "-" } BinarySearchPredicate */
12
+ /** @typedef {"GE" | "GT" | "LT" | "LE" | "EQ" } SearchPredicateSuffix */
13
+
14
+ /**
15
+ * Helper function for compiling binary search functions.
16
+ *
17
+ * The generated code uses a while loop to repeatedly divide the search interval
18
+ * in half until the desired element is found, or the search interval is empty.
19
+ *
20
+ * The following is an example of a generated function for calling `compileSearch("P", "c(x,y)<=0", true, ["y", "c"], false)`:
21
+ *
22
+ * ```js
23
+ * function P(a,l,h,y,c){var i=l-1;while(l<=h){var m=(l+h)>>>1,x=a[m];if(c(x,y)<=0){i=m;l=m+1}else{h=m-1}}return i};
24
+ * ```
25
+ * @param {string} funcName The name of the function to be compiled.
26
+ * @param {string} predicate The predicate / comparison operator to be used in the binary search.
27
+ * @param {boolean} reversed Whether the search should be reversed.
28
+ * @param {string[]} extraArgs Extra arguments to be passed to the function.
29
+ * @param {boolean=} earlyOut Whether the search should return as soon as a match is found.
30
+ * @returns {string} The compiled binary search function.
31
+ */
11
32
  const compileSearch = (funcName, predicate, reversed, extraArgs, earlyOut) => {
12
33
  const code = [
13
34
  "function ",
@@ -21,7 +42,7 @@ const compileSearch = (funcName, predicate, reversed, extraArgs, earlyOut) => {
21
42
  ];
22
43
 
23
44
  if (earlyOut) {
24
- if (predicate.indexOf("c") < 0) {
45
+ if (!predicate.includes("c")) {
25
46
  code.push(";if(x===y){return m}else if(x<=y){");
26
47
  } else {
27
48
  code.push(";var p=c(x,y);if(p===0){return m}else if(p<=0){");
@@ -43,18 +64,23 @@ const compileSearch = (funcName, predicate, reversed, extraArgs, earlyOut) => {
43
64
  return code.join("");
44
65
  };
45
66
 
67
+ /**
68
+ * This helper functions generate code for two binary search functions:
69
+ * A(): Performs a binary search on an array using the comparison operator specified.
70
+ * P(): Performs a binary search on an array using a _custom comparison function_
71
+ * `c(x,y)` **and** comparison operator specified by `predicate`.
72
+ * @param {BinarySearchPredicate} predicate The predicate / comparison operator to be used in the binary search.
73
+ * @param {boolean} reversed Whether the search should be reversed.
74
+ * @param {SearchPredicateSuffix} suffix The suffix to be used in the function name.
75
+ * @param {boolean=} earlyOut Whether the search should return as soon as a match is found.
76
+ * @returns {Function} The compiled binary search function.
77
+ */
46
78
  const compileBoundsSearch = (predicate, reversed, suffix, earlyOut) => {
47
- const arg1 = compileSearch(
48
- "A",
49
- "x" + predicate + "y",
50
- reversed,
51
- ["y"],
52
- earlyOut
53
- );
79
+ const arg1 = compileSearch("A", `x${predicate}y`, reversed, ["y"], earlyOut);
54
80
 
55
81
  const arg2 = compileSearch(
56
82
  "P",
57
- "c(x,y)" + predicate + "0",
83
+ `c(x,y)${predicate}0`,
58
84
  reversed,
59
85
  ["y", "c"],
60
86
  earlyOut
@@ -63,6 +89,7 @@ const compileBoundsSearch = (predicate, reversed, suffix, earlyOut) => {
63
89
  const fnHeader = "function dispatchBinarySearch";
64
90
 
65
91
  const fnBody =
92
+ // eslint-disable-next-line no-multi-str
66
93
  "(a,y,c,l,h){\
67
94
  if(typeof(c)==='function'){\
68
95
  return P(a,(l===void 0)?0:l|0,(h===void 0)?a.length-1:h|0,y,c)\
@@ -73,10 +100,25 @@ return dispatchBinarySearch";
73
100
 
74
101
  const fnArgList = [arg1, arg2, fnHeader, suffix, fnBody, suffix];
75
102
  const fnSource = fnArgList.join("");
103
+ // eslint-disable-next-line no-new-func
76
104
  const result = new Function(fnSource);
77
105
  return result();
78
106
  };
79
107
 
108
+ /**
109
+ * These functions are used to perform binary searches on arrays.
110
+ * @example
111
+ * ```js
112
+ * const { gt, le} = require("./binarySearchBounds");
113
+ * const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
114
+ *
115
+ * // Find the index of the first element greater than 5
116
+ * const index1 = gt(arr, 5); // index1 === 3
117
+ *
118
+ * // Find the index of the first element less than or equal to 5
119
+ * const index2 = le(arr, 5); // index2 === 4
120
+ * ```
121
+ */
80
122
  module.exports = {
81
123
  ge: compileBoundsSearch(">=", false, "GE"),
82
124
  gt: compileBoundsSearch(">", false, "GT"),
@@ -0,0 +1,97 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+
6
+ "use strict";
7
+
8
+ /** @typedef {import("../Dependency")} Dependency */
9
+ /** @typedef {import("../Module")} Module */
10
+ /** @typedef {import("../ModuleGraph")} ModuleGraph */
11
+ /** @typedef {import("../javascript/JavascriptParser").Range} Range */
12
+
13
+ /**
14
+ * @summary Get the subset of ids and their corresponding range in an id chain that should be re-rendered by webpack.
15
+ * Only those in the chain that are actually referring to namespaces or imports should be re-rendered.
16
+ * Deeper member accessors on the imported object should not be re-rendered. If deeper member accessors are re-rendered,
17
+ * there is a potential loss of meaning with rendering a quoted accessor as an unquoted accessor, or vice versa,
18
+ * because minifiers treat quoted accessors differently. e.g. import { a } from "./module"; a["b"] vs a.b
19
+ * @param {string[]} untrimmedIds chained ids
20
+ * @param {Range} untrimmedRange range encompassing allIds
21
+ * @param {Range[] | undefined} ranges cumulative range of ids for each of allIds
22
+ * @param {ModuleGraph} moduleGraph moduleGraph
23
+ * @param {Dependency} dependency dependency
24
+ * @returns {{trimmedIds: string[], trimmedRange: Range}} computed trimmed ids and cumulative range of those ids
25
+ */
26
+ module.exports.getTrimmedIdsAndRange = (
27
+ untrimmedIds,
28
+ untrimmedRange,
29
+ ranges,
30
+ moduleGraph,
31
+ dependency
32
+ ) => {
33
+ let trimmedIds = trimIdsToThoseImported(
34
+ untrimmedIds,
35
+ moduleGraph,
36
+ dependency
37
+ );
38
+ let trimmedRange = untrimmedRange;
39
+ if (trimmedIds.length !== untrimmedIds.length) {
40
+ // The array returned from dep.idRanges is right-aligned with the array returned from dep.names.
41
+ // Meaning, the two arrays may not always have the same number of elements, but the last element of
42
+ // dep.idRanges corresponds to [the expression fragment to the left of] the last element of dep.names.
43
+ // Use this to find the correct replacement range based on the number of ids that were trimmed.
44
+ const idx =
45
+ ranges === undefined
46
+ ? -1 /* trigger failure case below */
47
+ : ranges.length + (trimmedIds.length - untrimmedIds.length);
48
+ if (idx < 0 || idx >= /** @type {Range[]} */ (ranges).length) {
49
+ // cspell:ignore minifiers
50
+ // Should not happen but we can't throw an error here because of backward compatibility with
51
+ // external plugins in wp5. Instead, we just disable trimming for now. This may break some minifiers.
52
+ trimmedIds = untrimmedIds;
53
+ // TODO webpack 6 remove the "trimmedIds = ids" above and uncomment the following line instead.
54
+ // throw new Error("Missing range starts data for id replacement trimming.");
55
+ } else {
56
+ trimmedRange = /** @type {Range[]} */ (ranges)[idx];
57
+ }
58
+ }
59
+
60
+ return { trimmedIds, trimmedRange };
61
+ };
62
+
63
+ /**
64
+ * @summary Determine which IDs in the id chain are actually referring to namespaces or imports,
65
+ * and which are deeper member accessors on the imported object.
66
+ * @param {string[]} ids untrimmed ids
67
+ * @param {ModuleGraph} moduleGraph moduleGraph
68
+ * @param {Dependency} dependency dependency
69
+ * @returns {string[]} trimmed ids
70
+ */
71
+ function trimIdsToThoseImported(ids, moduleGraph, dependency) {
72
+ /** @type {string[]} */
73
+ let trimmedIds = [];
74
+ let currentExportsInfo = moduleGraph.getExportsInfo(
75
+ /** @type {Module} */ (moduleGraph.getModule(dependency))
76
+ );
77
+ for (let i = 0; i < ids.length; i++) {
78
+ if (i === 0 && ids[i] === "default") {
79
+ continue; // ExportInfo for the next level under default is still at the root ExportsInfo, so don't advance currentExportsInfo
80
+ }
81
+ const exportInfo = currentExportsInfo.getExportInfo(ids[i]);
82
+ if (exportInfo.provided === false) {
83
+ // json imports have nested ExportInfo for elements that things that are not actually exported, so check .provided
84
+ trimmedIds = ids.slice(0, i);
85
+ break;
86
+ }
87
+ const nestedInfo = exportInfo.getNestedExportsInfo();
88
+ if (!nestedInfo) {
89
+ // once all nested exports are traversed, the next item is the actual import so stop there
90
+ trimmedIds = ids.slice(0, i + 1);
91
+ break;
92
+ }
93
+ currentExportsInfo = nestedInfo;
94
+ }
95
+ // Never trim to nothing. This can happen for invalid imports (e.g. import { notThere } from "./module", or import { anything } from "./missingModule")
96
+ return trimmedIds.length ? trimmedIds : ids;
97
+ }