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,6 +9,7 @@ const RuntimeModule = require("../RuntimeModule");
9
9
  const Template = require("../Template");
10
10
 
11
11
  /** @typedef {import("../Chunk")} Chunk */
12
+ /** @typedef {import("../Compilation")} Compilation */
12
13
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
13
14
 
14
15
  class ChunkPrefetchStartupRuntimeModule extends RuntimeModule {
@@ -21,11 +22,13 @@ class ChunkPrefetchStartupRuntimeModule extends RuntimeModule {
21
22
  }
22
23
 
23
24
  /**
24
- * @returns {string} runtime code
25
+ * @returns {string | null} runtime code
25
26
  */
26
27
  generate() {
27
- const { startupChunks, chunk } = this;
28
- const { runtimeTemplate } = this.compilation;
28
+ const { startupChunks } = this;
29
+ const compilation = /** @type {Compilation} */ (this.compilation);
30
+ const chunk = /** @type {Chunk} */ (this.chunk);
31
+ const { runtimeTemplate } = compilation;
29
32
  return Template.asString(
30
33
  startupChunks.map(
31
34
  ({ onChunks, chunks }) =>
@@ -39,10 +42,10 @@ class ChunkPrefetchStartupRuntimeModule extends RuntimeModule {
39
42
  chunks,
40
43
  c =>
41
44
  `${RuntimeGlobals.prefetchChunk}(${JSON.stringify(c.id)});`
42
- )
45
+ )
43
46
  : `${JSON.stringify(Array.from(chunks, c => c.id))}.map(${
44
47
  RuntimeGlobals.prefetchChunk
45
- });`
48
+ });`
46
49
  )}, 5);`
47
50
  )
48
51
  );
@@ -8,6 +8,7 @@ const RuntimeGlobals = require("../RuntimeGlobals");
8
8
  const RuntimeModule = require("../RuntimeModule");
9
9
  const Template = require("../Template");
10
10
 
11
+ /** @typedef {import("../Compilation")} Compilation */
11
12
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
12
13
 
13
14
  class ChunkPrefetchTriggerRuntimeModule extends RuntimeModule {
@@ -15,16 +16,17 @@ class ChunkPrefetchTriggerRuntimeModule extends RuntimeModule {
15
16
  * @param {Record<string|number, (string|number)[]>} chunkMap map from chunk to
16
17
  */
17
18
  constructor(chunkMap) {
18
- super(`chunk prefetch trigger`, RuntimeModule.STAGE_TRIGGER);
19
+ super("chunk prefetch trigger", RuntimeModule.STAGE_TRIGGER);
19
20
  this.chunkMap = chunkMap;
20
21
  }
21
22
 
22
23
  /**
23
- * @returns {string} runtime code
24
+ * @returns {string | null} runtime code
24
25
  */
25
26
  generate() {
26
27
  const { chunkMap } = this;
27
- const { runtimeTemplate } = this.compilation;
28
+ const compilation = /** @type {Compilation} */ (this.compilation);
29
+ const { runtimeTemplate } = compilation;
28
30
  const body = [
29
31
  "var chunks = chunkToChildrenMap[chunkId];",
30
32
  `Array.isArray(chunks) && chunks.map(${RuntimeGlobals.prefetchChunk});`
@@ -8,6 +8,7 @@ const RuntimeGlobals = require("../RuntimeGlobals");
8
8
  const RuntimeModule = require("../RuntimeModule");
9
9
  const Template = require("../Template");
10
10
 
11
+ /** @typedef {import("../Compilation")} Compilation */
11
12
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
12
13
 
13
14
  class ChunkPreloadTriggerRuntimeModule extends RuntimeModule {
@@ -15,16 +16,17 @@ class ChunkPreloadTriggerRuntimeModule extends RuntimeModule {
15
16
  * @param {Record<string|number, (string|number)[]>} chunkMap map from chunk to chunks
16
17
  */
17
18
  constructor(chunkMap) {
18
- super(`chunk preload trigger`, RuntimeModule.STAGE_TRIGGER);
19
+ super("chunk preload trigger", RuntimeModule.STAGE_TRIGGER);
19
20
  this.chunkMap = chunkMap;
20
21
  }
21
22
 
22
23
  /**
23
- * @returns {string} runtime code
24
+ * @returns {string | null} runtime code
24
25
  */
25
26
  generate() {
26
27
  const { chunkMap } = this;
27
- const { runtimeTemplate } = this.compilation;
28
+ const compilation = /** @type {Compilation} */ (this.compilation);
29
+ const { runtimeTemplate } = compilation;
28
30
  const body = [
29
31
  "var chunks = chunkToChildrenMap[chunkId];",
30
32
  `Array.isArray(chunks) && chunks.map(${RuntimeGlobals.preloadChunk});`
@@ -5,9 +5,14 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ /** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
8
9
  /** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
9
10
 
10
11
  class BasicEffectRulePlugin {
12
+ /**
13
+ * @param {string} ruleProperty the rule property
14
+ * @param {string=} effectType the effect type
15
+ */
11
16
  constructor(ruleProperty, effectType) {
12
17
  this.ruleProperty = ruleProperty;
13
18
  this.effectType = effectType || ruleProperty;
@@ -24,7 +29,8 @@ class BasicEffectRulePlugin {
24
29
  if (unhandledProperties.has(this.ruleProperty)) {
25
30
  unhandledProperties.delete(this.ruleProperty);
26
31
 
27
- const value = rule[this.ruleProperty];
32
+ const value =
33
+ rule[/** @type {keyof RuleSetRule} */ (this.ruleProperty)];
28
34
 
29
35
  result.effects.push({
30
36
  type: this.effectType,
@@ -5,10 +5,16 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ /** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
8
9
  /** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
9
10
  /** @typedef {import("./RuleSetCompiler").RuleCondition} RuleCondition */
10
11
 
11
12
  class BasicMatcherRulePlugin {
13
+ /**
14
+ * @param {string} ruleProperty the rule property
15
+ * @param {string=} dataProperty the data property
16
+ * @param {boolean=} invert if true, inverts the condition
17
+ */
12
18
  constructor(ruleProperty, dataProperty, invert) {
13
19
  this.ruleProperty = ruleProperty;
14
20
  this.dataProperty = dataProperty || ruleProperty;
@@ -25,7 +31,8 @@ class BasicMatcherRulePlugin {
25
31
  (path, rule, unhandledProperties, result) => {
26
32
  if (unhandledProperties.has(this.ruleProperty)) {
27
33
  unhandledProperties.delete(this.ruleProperty);
28
- const value = rule[this.ruleProperty];
34
+ const value =
35
+ rule[/** @type {keyof RuleSetRule} */ (this.ruleProperty)];
29
36
  const condition = ruleSetCompiler.compileCondition(
30
37
  `${path}.${this.ruleProperty}`,
31
38
  value
@@ -5,13 +5,21 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ /** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
8
9
  /** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
9
10
  /** @typedef {import("./RuleSetCompiler").RuleCondition} RuleCondition */
11
+ /** @typedef {import("./RuleSetCompiler").RuleConditionFunction} RuleConditionFunction */
10
12
 
11
13
  class ObjectMatcherRulePlugin {
12
- constructor(ruleProperty, dataProperty) {
14
+ /**
15
+ * @param {string} ruleProperty the rule property
16
+ * @param {string=} dataProperty the data property
17
+ * @param {RuleConditionFunction=} additionalConditionFunction need to check
18
+ */
19
+ constructor(ruleProperty, dataProperty, additionalConditionFunction) {
13
20
  this.ruleProperty = ruleProperty;
14
21
  this.dataProperty = dataProperty || ruleProperty;
22
+ this.additionalConditionFunction = additionalConditionFunction;
15
23
  }
16
24
 
17
25
  /**
@@ -25,13 +33,22 @@ class ObjectMatcherRulePlugin {
25
33
  (path, rule, unhandledProperties, result) => {
26
34
  if (unhandledProperties.has(ruleProperty)) {
27
35
  unhandledProperties.delete(ruleProperty);
28
- const value = rule[ruleProperty];
36
+ const value =
37
+ /** @type {Record<string, any>} */
38
+ (rule[/** @type {keyof RuleSetRule} */ (ruleProperty)]);
29
39
  for (const property of Object.keys(value)) {
30
40
  const nestedDataProperties = property.split(".");
31
41
  const condition = ruleSetCompiler.compileCondition(
32
42
  `${path}.${ruleProperty}.${property}`,
33
43
  value[property]
34
44
  );
45
+ if (this.additionalConditionFunction) {
46
+ result.conditions.push({
47
+ property: [dataProperty],
48
+ matchWhenEmpty: condition.matchWhenEmpty,
49
+ fn: this.additionalConditionFunction
50
+ });
51
+ }
35
52
  result.conditions.push({
36
53
  property: [dataProperty, ...nestedDataProperties],
37
54
  matchWhenEmpty: condition.matchWhenEmpty,
@@ -7,43 +7,57 @@
7
7
 
8
8
  const { SyncHook } = require("tapable");
9
9
 
10
+ /** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
11
+ /** @typedef {import("../../declarations/WebpackOptions").RuleSetRules} RuleSetRules */
12
+
13
+ /** @typedef {function(string): boolean} RuleConditionFunction */
14
+
10
15
  /**
11
- * @typedef {Object} RuleCondition
16
+ * @typedef {object} RuleCondition
12
17
  * @property {string | string[]} property
13
18
  * @property {boolean} matchWhenEmpty
14
- * @property {function(string): boolean} fn
19
+ * @property {RuleConditionFunction} fn
15
20
  */
16
21
 
17
22
  /**
18
- * @typedef {Object} Condition
23
+ * @typedef {object} Condition
19
24
  * @property {boolean} matchWhenEmpty
20
- * @property {function(string): boolean} fn
25
+ * @property {RuleConditionFunction} fn
26
+ */
27
+
28
+ /**
29
+ * @typedef {Record<string, TODO>} EffectData
21
30
  */
22
31
 
23
32
  /**
24
- * @typedef {Object} CompiledRule
33
+ * @typedef {object} CompiledRule
25
34
  * @property {RuleCondition[]} conditions
26
- * @property {(Effect|function(object): Effect[])[]} effects
35
+ * @property {(Effect|function(EffectData): Effect[])[]} effects
27
36
  * @property {CompiledRule[]=} rules
28
37
  * @property {CompiledRule[]=} oneOf
29
38
  */
30
39
 
31
40
  /**
32
- * @typedef {Object} Effect
41
+ * @typedef {object} Effect
33
42
  * @property {string} type
34
43
  * @property {any} value
35
44
  */
36
45
 
37
46
  /**
38
- * @typedef {Object} RuleSet
47
+ * @typedef {object} RuleSet
39
48
  * @property {Map<string, any>} references map of references in the rule set (may grow over time)
40
- * @property {function(object): Effect[]} exec execute the rule set
49
+ * @property {function(EffectData): Effect[]} exec execute the rule set
41
50
  */
42
51
 
52
+ /** @typedef {{ apply: (function(RuleSetCompiler): void) }} RuleSetPlugin */
53
+
43
54
  class RuleSetCompiler {
55
+ /**
56
+ * @param {RuleSetPlugin[]} plugins plugins
57
+ */
44
58
  constructor(plugins) {
45
59
  this.hooks = Object.freeze({
46
- /** @type {SyncHook<[string, object, Set<string>, CompiledRule, Map<string, any>]>} */
60
+ /** @type {SyncHook<[string, RuleSetRule, Set<string>, CompiledRule, Map<string | undefined, any>]>} */
47
61
  rule: new SyncHook([
48
62
  "path",
49
63
  "rule",
@@ -60,7 +74,7 @@ class RuleSetCompiler {
60
74
  }
61
75
 
62
76
  /**
63
- * @param {object[]} ruleSet raw user provided rules
77
+ * @param {TODO[]} ruleSet raw user provided rules
64
78
  * @returns {RuleSet} compiled RuleSet
65
79
  */
66
80
  compile(ruleSet) {
@@ -68,7 +82,7 @@ class RuleSetCompiler {
68
82
  const rules = this.compileRules("ruleSet", ruleSet, refs);
69
83
 
70
84
  /**
71
- * @param {object} data data passed in
85
+ * @param {EffectData} data data passed in
72
86
  * @param {CompiledRule} rule the compiled rule
73
87
  * @param {Effect[]} effects an array where effects are pushed to
74
88
  * @returns {boolean} true, if the rule has matched
@@ -77,6 +91,7 @@ class RuleSetCompiler {
77
91
  for (const condition of rule.conditions) {
78
92
  const p = condition.property;
79
93
  if (Array.isArray(p)) {
94
+ /** @type {EffectData | string | undefined} */
80
95
  let current = data;
81
96
  for (const subProperty of p) {
82
97
  if (
@@ -91,7 +106,7 @@ class RuleSetCompiler {
91
106
  }
92
107
  }
93
108
  if (current !== undefined) {
94
- if (!condition.fn(current)) return false;
109
+ if (!condition.fn(/** @type {string} */ (current))) return false;
95
110
  continue;
96
111
  }
97
112
  } else if (p in data) {
@@ -145,25 +160,33 @@ class RuleSetCompiler {
145
160
 
146
161
  /**
147
162
  * @param {string} path current path
148
- * @param {object[]} rules the raw rules provided by user
163
+ * @param {RuleSetRules} rules the raw rules provided by user
149
164
  * @param {Map<string, any>} refs references
150
165
  * @returns {CompiledRule[]} rules
151
166
  */
152
167
  compileRules(path, rules, refs) {
153
- return rules.map((rule, i) =>
154
- this.compileRule(`${path}[${i}]`, rule, refs)
155
- );
168
+ return rules
169
+ .filter(Boolean)
170
+ .map((rule, i) =>
171
+ this.compileRule(
172
+ `${path}[${i}]`,
173
+ /** @type {RuleSetRule} */ (rule),
174
+ refs
175
+ )
176
+ );
156
177
  }
157
178
 
158
179
  /**
159
180
  * @param {string} path current path
160
- * @param {object} rule the raw rule provided by user
181
+ * @param {RuleSetRule} rule the raw rule provided by user
161
182
  * @param {Map<string, any>} refs references
162
183
  * @returns {CompiledRule} normalized and compiled rule for processing
163
184
  */
164
185
  compileRule(path, rule, refs) {
165
186
  const unhandledProperties = new Set(
166
- Object.keys(rule).filter(key => rule[key] !== undefined)
187
+ Object.keys(rule).filter(
188
+ key => rule[/** @type {keyof RuleSetRule} */ (key)] !== undefined
189
+ )
167
190
  );
168
191
 
169
192
  /** @type {CompiledRule} */
@@ -234,7 +257,7 @@ class RuleSetCompiler {
234
257
  matchWhenEmpty: condition(""),
235
258
  fn: condition
236
259
  };
237
- } catch (err) {
260
+ } catch (_err) {
238
261
  throw this.error(
239
262
  path,
240
263
  condition,
@@ -272,7 +295,7 @@ class RuleSetCompiler {
272
295
  if (!Array.isArray(value)) {
273
296
  throw this.error(
274
297
  `${path}.or`,
275
- condition.and,
298
+ condition.or,
276
299
  "Expected array of conditions"
277
300
  );
278
301
  }
@@ -301,7 +324,7 @@ class RuleSetCompiler {
301
324
  const fn = matcher.fn;
302
325
  conditions.push({
303
326
  matchWhenEmpty: !matcher.matchWhenEmpty,
304
- fn: v => !fn(v)
327
+ fn: /** @type {RuleConditionFunction} */ (v => !fn(v))
305
328
  });
306
329
  }
307
330
  break;
@@ -335,12 +358,11 @@ class RuleSetCompiler {
335
358
  };
336
359
  } else if (conditions.length === 1) {
337
360
  return conditions[0];
338
- } else {
339
- return {
340
- matchWhenEmpty: conditions.some(c => c.matchWhenEmpty),
341
- fn: v => conditions.some(c => c.fn(v))
342
- };
343
361
  }
362
+ return {
363
+ matchWhenEmpty: conditions.some(c => c.matchWhenEmpty),
364
+ fn: v => conditions.some(c => c.fn(v))
365
+ };
344
366
  }
345
367
 
346
368
  /**
@@ -355,12 +377,11 @@ class RuleSetCompiler {
355
377
  };
356
378
  } else if (conditions.length === 1) {
357
379
  return conditions[0];
358
- } else {
359
- return {
360
- matchWhenEmpty: conditions.every(c => c.matchWhenEmpty),
361
- fn: v => conditions.every(c => c.fn(v))
362
- };
363
380
  }
381
+ return {
382
+ matchWhenEmpty: conditions.every(c => c.matchWhenEmpty),
383
+ fn: v => conditions.every(c => c.fn(v))
384
+ };
364
385
  }
365
386
 
366
387
  /**
@@ -7,6 +7,9 @@
7
7
 
8
8
  const util = require("util");
9
9
 
10
+ /** @typedef {import("../../declarations/WebpackOptions").RuleSetLoader} RuleSetLoader */
11
+ /** @typedef {import("../../declarations/WebpackOptions").RuleSetLoaderOptions} RuleSetLoaderOptions */
12
+ /** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
10
13
  /** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
11
14
  /** @typedef {import("./RuleSetCompiler").Effect} Effect */
12
15
 
@@ -19,6 +22,10 @@ class UseEffectRulePlugin {
19
22
  ruleSetCompiler.hooks.rule.tap(
20
23
  "UseEffectRulePlugin",
21
24
  (path, rule, unhandledProperties, result, references) => {
25
+ /**
26
+ * @param {keyof RuleSetRule} property property
27
+ * @param {string} correctProperty correct property
28
+ */
22
29
  const conflictWith = (property, correctProperty) => {
23
30
  if (unhandledProperties.has(property)) {
24
31
  throw ruleSetCompiler.error(
@@ -42,7 +49,6 @@ class UseEffectRulePlugin {
42
49
  const type = enforce ? `use-${enforce}` : "use";
43
50
 
44
51
  /**
45
- *
46
52
  * @param {string} path options path
47
53
  * @param {string} defaultIdent default ident when none is provided
48
54
  * @param {object} item user provided use value
@@ -51,16 +57,14 @@ class UseEffectRulePlugin {
51
57
  const useToEffect = (path, defaultIdent, item) => {
52
58
  if (typeof item === "function") {
53
59
  return data => useToEffectsWithoutIdent(path, item(data));
54
- } else {
55
- return useToEffectRaw(path, defaultIdent, item);
56
60
  }
61
+ return useToEffectRaw(path, defaultIdent, item);
57
62
  };
58
63
 
59
64
  /**
60
- *
61
65
  * @param {string} path options path
62
66
  * @param {string} defaultIdent default ident when none is provided
63
- * @param {object} item user provided use value
67
+ * @param {{ ident?: string, loader?: RuleSetLoader, options?: RuleSetLoaderOptions }} item user provided use value
64
68
  * @returns {Effect} effect
65
69
  */
66
70
  const useToEffectRaw = (path, defaultIdent, item) => {
@@ -73,30 +77,29 @@ class UseEffectRulePlugin {
73
77
  ident: undefined
74
78
  }
75
79
  };
76
- } else {
77
- const loader = item.loader;
78
- const options = item.options;
79
- let ident = item.ident;
80
- if (options && typeof options === "object") {
81
- if (!ident) ident = defaultIdent;
82
- references.set(ident, options);
83
- }
84
- if (typeof options === "string") {
85
- util.deprecate(
86
- () => {},
87
- `Using a string as loader options is deprecated (${path}.options)`,
88
- "DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING"
89
- )();
90
- }
91
- return {
92
- type: enforce ? `use-${enforce}` : "use",
93
- value: {
94
- loader,
95
- options,
96
- ident
97
- }
98
- };
99
80
  }
81
+ const loader = item.loader;
82
+ const options = item.options;
83
+ let ident = item.ident;
84
+ if (options && typeof options === "object") {
85
+ if (!ident) ident = defaultIdent;
86
+ references.set(ident, options);
87
+ }
88
+ if (typeof options === "string") {
89
+ util.deprecate(
90
+ () => {},
91
+ `Using a string as loader options is deprecated (${path}.options)`,
92
+ "DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING"
93
+ )();
94
+ }
95
+ return {
96
+ type: enforce ? `use-${enforce}` : "use",
97
+ value: {
98
+ loader,
99
+ options,
100
+ ident
101
+ }
102
+ };
100
103
  };
101
104
 
102
105
  /**
@@ -106,9 +109,11 @@ class UseEffectRulePlugin {
106
109
  */
107
110
  const useToEffectsWithoutIdent = (path, items) => {
108
111
  if (Array.isArray(items)) {
109
- return items.map((item, idx) =>
110
- useToEffectRaw(`${path}[${idx}]`, "[[missing ident]]", item)
111
- );
112
+ return items
113
+ .filter(Boolean)
114
+ .map((item, idx) =>
115
+ useToEffectRaw(`${path}[${idx}]`, "[[missing ident]]", item)
116
+ );
112
117
  }
113
118
  return [useToEffectRaw(path, "[[missing ident]]", items)];
114
119
  };
@@ -120,7 +125,7 @@ class UseEffectRulePlugin {
120
125
  */
121
126
  const useToEffects = (path, items) => {
122
127
  if (Array.isArray(items)) {
123
- return items.map((item, idx) => {
128
+ return items.filter(Boolean).map((item, idx) => {
124
129
  const subPath = `${path}[${idx}]`;
125
130
  return useToEffect(subPath, subPath, item);
126
131
  });
@@ -130,7 +135,10 @@ class UseEffectRulePlugin {
130
135
 
131
136
  if (typeof use === "function") {
132
137
  result.effects.push(data =>
133
- useToEffectsWithoutIdent(`${path}.use`, use(data))
138
+ useToEffectsWithoutIdent(
139
+ `${path}.use`,
140
+ use(/** @type {TODO} */ (data))
141
+ )
134
142
  );
135
143
  } else {
136
144
  for (const effect of useToEffects(`${path}.use`, use)) {
@@ -144,7 +152,7 @@ class UseEffectRulePlugin {
144
152
  unhandledProperties.delete("options");
145
153
  unhandledProperties.delete("enforce");
146
154
 
147
- const loader = rule.loader;
155
+ const loader = /** @type {RuleSetLoader} */ (rule.loader);
148
156
  const options = rule.options;
149
157
  const enforce = rule.enforce;
150
158
 
@@ -187,8 +195,6 @@ class UseEffectRulePlugin {
187
195
  }
188
196
  );
189
197
  }
190
-
191
- useItemToEffects(path, item) {}
192
198
  }
193
199
 
194
200
  module.exports = UseEffectRulePlugin;