webpack 5.92.1 → 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 (350) hide show
  1. package/README.md +8 -5
  2. package/bin/webpack.js +6 -7
  3. package/hot/log.js +1 -2
  4. package/hot/only-dev-server.js +1 -1
  5. package/hot/poll.js +1 -1
  6. package/hot/signal.js +1 -1
  7. package/lib/APIPlugin.js +4 -3
  8. package/lib/AbstractMethodError.js +10 -5
  9. package/lib/AutomaticPrefetchPlugin.js +1 -1
  10. package/lib/BannerPlugin.js +12 -6
  11. package/lib/Cache.js +8 -10
  12. package/lib/CacheFacade.js +3 -3
  13. package/lib/CaseSensitiveModulesWarning.js +5 -7
  14. package/lib/Chunk.js +14 -11
  15. package/lib/ChunkGraph.js +58 -36
  16. package/lib/ChunkGroup.js +2 -3
  17. package/lib/ChunkTemplate.js +43 -0
  18. package/lib/CleanPlugin.js +10 -11
  19. package/lib/CodeGenerationResults.js +6 -5
  20. package/lib/CommentCompilationWarning.js +0 -1
  21. package/lib/Compilation.js +223 -191
  22. package/lib/Compiler.js +81 -82
  23. package/lib/ConcatenationScope.js +3 -6
  24. package/lib/ConditionalInitFragment.js +6 -7
  25. package/lib/ConstPlugin.js +7 -15
  26. package/lib/ContextExclusionPlugin.js +3 -3
  27. package/lib/ContextModule.js +36 -21
  28. package/lib/ContextModuleFactory.js +89 -44
  29. package/lib/ContextReplacementPlugin.js +10 -9
  30. package/lib/DefinePlugin.js +76 -69
  31. package/lib/DelegatedModule.js +7 -3
  32. package/lib/DelegatedModuleFactoryPlugin.js +36 -22
  33. package/lib/DelegatedPlugin.js +4 -0
  34. package/lib/DependenciesBlock.js +0 -1
  35. package/lib/Dependency.js +10 -14
  36. package/lib/DllEntryPlugin.js +4 -2
  37. package/lib/DllModuleFactory.js +1 -0
  38. package/lib/DllPlugin.js +9 -7
  39. package/lib/DllReferencePlugin.js +30 -15
  40. package/lib/EntryPlugin.js +1 -3
  41. package/lib/EnvironmentPlugin.js +5 -2
  42. package/lib/ErrorHelpers.js +11 -12
  43. package/lib/EvalDevToolModulePlugin.js +10 -12
  44. package/lib/EvalSourceMapDevToolPlugin.js +15 -13
  45. package/lib/ExportsInfo.js +185 -120
  46. package/lib/ExternalModule.js +104 -64
  47. package/lib/ExternalModuleFactoryPlugin.js +23 -10
  48. package/lib/FileSystemInfo.js +791 -422
  49. package/lib/FlagAllModulesAsUsedPlugin.js +1 -1
  50. package/lib/FlagDependencyExportsPlugin.js +12 -11
  51. package/lib/FlagDependencyUsagePlugin.js +1 -1
  52. package/lib/Generator.js +2 -5
  53. package/lib/GraphHelpers.js +3 -2
  54. package/lib/HookWebpackError.js +8 -10
  55. package/lib/HotModuleReplacementPlugin.js +78 -64
  56. package/lib/IgnoreErrorModuleFactory.js +3 -3
  57. package/lib/IgnorePlugin.js +1 -3
  58. package/lib/IgnoreWarningsPlugin.js +6 -9
  59. package/lib/InitFragment.js +2 -3
  60. package/lib/LibManifestPlugin.js +4 -3
  61. package/lib/MainTemplate.js +72 -19
  62. package/lib/Module.js +25 -9
  63. package/lib/ModuleBuildError.js +4 -11
  64. package/lib/ModuleDependencyError.js +5 -5
  65. package/lib/ModuleDependencyWarning.js +5 -5
  66. package/lib/ModuleError.js +1 -5
  67. package/lib/ModuleFilenameHelpers.js +29 -46
  68. package/lib/ModuleGraph.js +7 -6
  69. package/lib/ModuleGraphConnection.js +6 -6
  70. package/lib/ModuleInfoHeaderPlugin.js +82 -30
  71. package/lib/ModuleParseError.js +8 -9
  72. package/lib/ModuleRestoreError.js +1 -1
  73. package/lib/ModuleStoreError.js +1 -1
  74. package/lib/ModuleTemplate.js +33 -1
  75. package/lib/ModuleTypeConstants.js +21 -22
  76. package/lib/ModuleWarning.js +1 -5
  77. package/lib/MultiCompiler.js +24 -26
  78. package/lib/MultiStats.js +73 -31
  79. package/lib/MultiWatching.js +1 -1
  80. package/lib/NormalModule.js +132 -70
  81. package/lib/NormalModuleFactory.js +53 -49
  82. package/lib/OptimizationStages.js +3 -3
  83. package/lib/ProgressPlugin.js +9 -9
  84. package/lib/ProvidePlugin.js +4 -4
  85. package/lib/RuntimeGlobals.js +71 -70
  86. package/lib/RuntimeModule.js +1 -1
  87. package/lib/RuntimePlugin.js +24 -12
  88. package/lib/RuntimeTemplate.js +40 -44
  89. package/lib/SizeFormatHelpers.js +2 -4
  90. package/lib/SourceMapDevToolPlugin.js +42 -34
  91. package/lib/Stats.js +5 -11
  92. package/lib/Template.js +18 -24
  93. package/lib/TemplatedPathPlugin.js +12 -10
  94. package/lib/UseStrictPlugin.js +8 -1
  95. package/lib/WarnDeprecatedOptionPlugin.js +0 -1
  96. package/lib/WatchIgnorePlugin.js +26 -9
  97. package/lib/Watching.js +10 -5
  98. package/lib/WebpackOptionsApply.js +89 -62
  99. package/lib/asset/AssetGenerator.js +107 -42
  100. package/lib/asset/AssetModulesPlugin.js +29 -23
  101. package/lib/asset/AssetSourceGenerator.js +2 -7
  102. package/lib/async-modules/AwaitDependenciesInitFragment.js +6 -7
  103. package/lib/buildChunkGraph.js +14 -19
  104. package/lib/cache/IdleFileCachePlugin.js +4 -4
  105. package/lib/cache/MemoryWithGcCachePlugin.js +5 -5
  106. package/lib/cache/PackFileCacheStrategy.js +51 -50
  107. package/lib/cache/ResolverCachePlugin.js +6 -6
  108. package/lib/cache/mergeEtags.js +16 -21
  109. package/lib/cli.js +148 -104
  110. package/lib/config/browserslistTargetHandler.js +16 -13
  111. package/lib/config/defaults.js +31 -28
  112. package/lib/config/normalization.js +335 -344
  113. package/lib/config/target.js +42 -52
  114. package/lib/container/ContainerEntryModule.js +2 -2
  115. package/lib/container/ContainerPlugin.js +1 -1
  116. package/lib/container/RemoteRuntimeModule.js +11 -8
  117. package/lib/container/options.js +18 -4
  118. package/lib/css/CssExportsGenerator.js +39 -40
  119. package/lib/css/CssGenerator.js +11 -14
  120. package/lib/css/CssLoadingRuntimeModule.js +10 -10
  121. package/lib/css/CssModulesPlugin.js +127 -47
  122. package/lib/css/CssParser.js +20 -18
  123. package/lib/css/walkCssTokens.js +80 -95
  124. package/lib/debug/ProfilingPlugin.js +19 -20
  125. package/lib/dependencies/AMDDefineDependency.js +1 -1
  126. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +83 -47
  127. package/lib/dependencies/AMDRequireArrayDependency.js +9 -10
  128. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +22 -16
  129. package/lib/dependencies/AMDRuntimeModules.js +2 -2
  130. package/lib/dependencies/CommonJsDependencyHelpers.js +6 -2
  131. package/lib/dependencies/CommonJsExportRequireDependency.js +37 -41
  132. package/lib/dependencies/CommonJsExportsDependency.js +0 -1
  133. package/lib/dependencies/CommonJsExportsParserPlugin.js +19 -23
  134. package/lib/dependencies/CommonJsFullRequireDependency.js +1 -1
  135. package/lib/dependencies/CommonJsImportsParserPlugin.js +52 -61
  136. package/lib/dependencies/CommonJsSelfReferenceDependency.js +6 -8
  137. package/lib/dependencies/ConstDependency.js +1 -1
  138. package/lib/dependencies/ContextDependency.js +1 -1
  139. package/lib/dependencies/ContextDependencyHelpers.js +31 -34
  140. package/lib/dependencies/ContextElementDependency.js +2 -2
  141. package/lib/dependencies/CriticalDependencyWarning.js +1 -1
  142. package/lib/dependencies/CssExportDependency.js +72 -9
  143. package/lib/dependencies/CssImportDependency.js +0 -2
  144. package/lib/dependencies/CssLocalIdentifierDependency.js +68 -21
  145. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +2 -1
  146. package/lib/dependencies/CssUrlDependency.js +4 -5
  147. package/lib/dependencies/DynamicExports.js +5 -5
  148. package/lib/dependencies/ExportsInfoDependency.js +1 -2
  149. package/lib/dependencies/HarmonyAcceptImportDependency.js +1 -1
  150. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +4 -5
  151. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +27 -16
  152. package/lib/dependencies/HarmonyExportExpressionDependency.js +1 -1
  153. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +107 -64
  154. package/lib/dependencies/HarmonyExports.js +2 -2
  155. package/lib/dependencies/HarmonyImportDependency.js +2 -4
  156. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +19 -4
  157. package/lib/dependencies/HarmonyImportSpecifierDependency.js +41 -16
  158. package/lib/dependencies/ImportDependency.js +1 -1
  159. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +5 -5
  160. package/lib/dependencies/ImportMetaPlugin.js +11 -13
  161. package/lib/dependencies/ImportParserPlugin.js +39 -44
  162. package/lib/dependencies/JsonExportsDependency.js +22 -18
  163. package/lib/dependencies/LoaderPlugin.js +47 -36
  164. package/lib/dependencies/LocalModule.js +1 -1
  165. package/lib/dependencies/LocalModulesHelpers.js +4 -4
  166. package/lib/dependencies/ModuleDecoratorDependency.js +1 -1
  167. package/lib/dependencies/ProvidedDependency.js +1 -1
  168. package/lib/dependencies/PureExpressionDependency.js +6 -6
  169. package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
  170. package/lib/dependencies/RuntimeRequirementsDependency.js +1 -1
  171. package/lib/dependencies/SystemPlugin.js +1 -1
  172. package/lib/dependencies/URLDependency.js +3 -3
  173. package/lib/dependencies/URLPlugin.js +66 -12
  174. package/lib/dependencies/WorkerPlugin.js +25 -24
  175. package/lib/dependencies/processExportInfo.js +3 -1
  176. package/lib/electron/ElectronTargetPlugin.js +1 -0
  177. package/lib/esm/ModuleChunkFormatPlugin.js +11 -12
  178. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +7 -3
  179. package/lib/formatLocation.js +1 -2
  180. package/lib/hmr/HotModuleReplacement.runtime.js +4 -5
  181. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -0
  182. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +9 -12
  183. package/lib/hmr/LazyCompilationPlugin.js +27 -12
  184. package/lib/hmr/lazyCompilationBackend.js +64 -40
  185. package/lib/ids/ChunkModuleIdRangePlugin.js +1 -3
  186. package/lib/ids/DeterministicChunkIdsPlugin.js +2 -4
  187. package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
  188. package/lib/ids/HashedModuleIdsPlugin.js +5 -1
  189. package/lib/ids/IdHelpers.js +29 -39
  190. package/lib/ids/SyncModuleIdsPlugin.js +7 -2
  191. package/lib/index.js +1 -5
  192. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +6 -4
  193. package/lib/javascript/BasicEvaluatedExpression.js +4 -19
  194. package/lib/javascript/ChunkHelpers.js +1 -1
  195. package/lib/javascript/CommonJsChunkFormatPlugin.js +10 -11
  196. package/lib/javascript/EnableChunkLoadingPlugin.js +7 -6
  197. package/lib/javascript/JavascriptGenerator.js +23 -7
  198. package/lib/javascript/JavascriptModulesPlugin.js +97 -70
  199. package/lib/javascript/JavascriptParser.js +179 -200
  200. package/lib/javascript/JavascriptParserHelpers.js +20 -21
  201. package/lib/javascript/StartupHelpers.js +41 -13
  202. package/lib/json/JsonGenerator.js +7 -13
  203. package/lib/json/JsonModulesPlugin.js +1 -4
  204. package/lib/json/JsonParser.js +5 -3
  205. package/lib/library/AmdLibraryPlugin.js +12 -16
  206. package/lib/library/AssignLibraryPlugin.js +9 -11
  207. package/lib/library/EnableLibraryPlugin.js +25 -15
  208. package/lib/library/ExportPropertyLibraryPlugin.js +8 -2
  209. package/lib/library/JsonpLibraryPlugin.js +2 -1
  210. package/lib/library/ModernModuleLibraryPlugin.js +144 -0
  211. package/lib/library/ModuleLibraryPlugin.js +2 -1
  212. package/lib/library/SystemLibraryPlugin.js +2 -1
  213. package/lib/library/UmdLibraryPlugin.js +66 -92
  214. package/lib/logging/Logger.js +32 -4
  215. package/lib/logging/createConsoleLogger.js +12 -13
  216. package/lib/logging/runtime.js +7 -8
  217. package/lib/logging/truncateArgs.js +5 -8
  218. package/lib/node/NodeWatchFileSystem.js +3 -18
  219. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +2 -2
  220. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +1 -0
  221. package/lib/node/RequireChunkLoadingRuntimeModule.js +2 -2
  222. package/lib/node/nodeConsole.js +22 -22
  223. package/lib/optimize/AggressiveMergingPlugin.js +2 -4
  224. package/lib/optimize/AggressiveSplittingPlugin.js +16 -19
  225. package/lib/optimize/ConcatenatedModule.js +144 -61
  226. package/lib/optimize/EnsureChunkConditionsPlugin.js +1 -1
  227. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -3
  228. package/lib/optimize/InnerGraph.js +17 -17
  229. package/lib/optimize/InnerGraphPlugin.js +8 -7
  230. package/lib/optimize/LimitChunkCountPlugin.js +2 -3
  231. package/lib/optimize/MangleExportsPlugin.js +1 -0
  232. package/lib/optimize/MinMaxSizeWarning.js +1 -1
  233. package/lib/optimize/ModuleConcatenationPlugin.js +56 -78
  234. package/lib/optimize/RealContentHashPlugin.js +7 -10
  235. package/lib/optimize/RemoveParentModulesPlugin.js +3 -3
  236. package/lib/optimize/SideEffectsFlagPlugin.js +6 -2
  237. package/lib/optimize/SplitChunksPlugin.js +34 -30
  238. package/lib/performance/SizeLimitsPlugin.js +2 -2
  239. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +1 -0
  240. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +1 -1
  241. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +1 -1
  242. package/lib/rules/BasicEffectRulePlugin.js +3 -1
  243. package/lib/rules/BasicMatcherRulePlugin.js +3 -1
  244. package/lib/rules/ObjectMatcherRulePlugin.js +4 -1
  245. package/lib/rules/RuleSetCompiler.js +41 -22
  246. package/lib/rules/UseEffectRulePlugin.js +36 -32
  247. package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
  248. package/lib/runtime/AutoPublicPathRuntimeModule.js +8 -3
  249. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +2 -2
  250. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +1 -1
  251. package/lib/runtime/EnsureChunkRuntimeModule.js +10 -11
  252. package/lib/runtime/GetChunkFilenameRuntimeModule.js +11 -17
  253. package/lib/runtime/LoadScriptRuntimeModule.js +17 -18
  254. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +1 -3
  255. package/lib/schemes/DataUriPlugin.js +1 -1
  256. package/lib/schemes/HttpUriPlugin.js +241 -126
  257. package/lib/serialization/BinaryMiddleware.js +44 -28
  258. package/lib/serialization/DateObjectSerializer.js +1 -0
  259. package/lib/serialization/ErrorObjectSerializer.js +2 -0
  260. package/lib/serialization/FileMiddleware.js +154 -106
  261. package/lib/serialization/MapObjectSerializer.js +2 -1
  262. package/lib/serialization/NullPrototypeObjectSerializer.js +3 -2
  263. package/lib/serialization/ObjectMiddleware.js +52 -56
  264. package/lib/serialization/PlainObjectSerializer.js +32 -6
  265. package/lib/serialization/RegExpObjectSerializer.js +1 -0
  266. package/lib/serialization/Serializer.js +4 -5
  267. package/lib/serialization/SerializerMiddleware.js +6 -6
  268. package/lib/serialization/SetObjectSerializer.js +2 -1
  269. package/lib/sharing/ConsumeSharedModule.js +19 -14
  270. package/lib/sharing/ConsumeSharedPlugin.js +116 -97
  271. package/lib/sharing/ConsumeSharedRuntimeModule.js +108 -141
  272. package/lib/sharing/ProvideForSharedDependency.js +0 -1
  273. package/lib/sharing/ProvideSharedPlugin.js +2 -2
  274. package/lib/sharing/resolveMatchedConfigs.js +2 -1
  275. package/lib/sharing/utils.js +15 -27
  276. package/lib/stats/DefaultStatsFactoryPlugin.js +424 -281
  277. package/lib/stats/DefaultStatsPresetPlugin.js +73 -18
  278. package/lib/stats/DefaultStatsPrinterPlugin.js +370 -101
  279. package/lib/stats/StatsFactory.js +127 -56
  280. package/lib/stats/StatsPrinter.js +75 -44
  281. package/lib/util/ArrayHelpers.js +8 -4
  282. package/lib/util/ArrayQueue.js +1 -1
  283. package/lib/util/AsyncQueue.js +31 -12
  284. package/lib/util/IterableHelpers.js +3 -4
  285. package/lib/util/LazyBucketSortedSet.js +60 -44
  286. package/lib/util/LazySet.js +1 -0
  287. package/lib/util/MapHelpers.js +1 -3
  288. package/lib/util/ParallelismFactorCalculator.js +1 -1
  289. package/lib/util/Queue.js +1 -1
  290. package/lib/util/Semaphore.js +4 -7
  291. package/lib/util/SetHelpers.js +5 -5
  292. package/lib/util/SortableSet.js +4 -3
  293. package/lib/util/StackedCacheMap.js +4 -6
  294. package/lib/util/StackedMap.js +1 -3
  295. package/lib/util/StringXor.js +0 -5
  296. package/lib/util/TupleQueue.js +1 -1
  297. package/lib/util/TupleSet.js +15 -5
  298. package/lib/util/URLAbsoluteSpecifier.js +7 -7
  299. package/lib/util/WeakTupleMap.js +19 -21
  300. package/lib/util/binarySearchBounds.js +5 -12
  301. package/lib/util/chainedImports.js +1 -1
  302. package/lib/util/cleverMerge.js +21 -19
  303. package/lib/util/comparators.js +57 -52
  304. package/lib/util/compileBooleanMatcher.js +3 -6
  305. package/lib/util/conventions.js +10 -13
  306. package/lib/util/createHash.js +9 -6
  307. package/lib/util/deprecation.js +22 -12
  308. package/lib/util/deterministicGrouping.js +19 -26
  309. package/lib/util/findGraphRoots.js +2 -2
  310. package/lib/util/fs.js +31 -31
  311. package/lib/util/hash/md4.js +2 -2
  312. package/lib/util/hash/wasm-hash.js +7 -7
  313. package/lib/util/hash/xxhash64.js +2 -2
  314. package/lib/util/identifier.js +81 -59
  315. package/lib/util/memoize.js +8 -10
  316. package/lib/util/mergeScope.js +6 -9
  317. package/lib/util/nonNumericOnlyHash.js +2 -2
  318. package/lib/util/numberHash.js +1 -6
  319. package/lib/util/objectToMap.js +0 -1
  320. package/lib/util/propertyAccess.js +2 -5
  321. package/lib/util/propertyName.js +1 -3
  322. package/lib/util/registerExternalSerializer.js +1 -1
  323. package/lib/util/runtime.js +103 -113
  324. package/lib/util/semver.js +29 -27
  325. package/lib/util/serialization.js +16 -1
  326. package/lib/util/smartGrouping.js +5 -5
  327. package/lib/util/source.js +1 -1
  328. package/lib/wasm/EnableWasmLoadingPlugin.js +5 -4
  329. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +3 -3
  330. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -6
  331. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +3 -3
  332. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +20 -19
  333. package/lib/wasm-sync/WebAssemblyGenerator.js +14 -29
  334. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +1 -1
  335. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  336. package/lib/web/JsonpChunkLoadingRuntimeModule.js +2 -3
  337. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -1
  338. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +1 -1
  339. package/package.json +17 -16
  340. package/schemas/WebpackOptions.check.js +1 -1
  341. package/schemas/WebpackOptions.json +17 -0
  342. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  343. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  344. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  345. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  346. package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
  347. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  348. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  349. package/schemas/plugins/container/ModuleFederationPlugin.json +1 -0
  350. package/types.d.ts +682 -347
@@ -7,6 +7,9 @@
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
+
10
13
  /** @typedef {function(string): boolean} RuleConditionFunction */
11
14
 
12
15
  /**
@@ -22,10 +25,14 @@ const { SyncHook } = require("tapable");
22
25
  * @property {RuleConditionFunction} fn
23
26
  */
24
27
 
28
+ /**
29
+ * @typedef {Record<string, TODO>} EffectData
30
+ */
31
+
25
32
  /**
26
33
  * @typedef {object} CompiledRule
27
34
  * @property {RuleCondition[]} conditions
28
- * @property {(Effect|function(object): Effect[])[]} effects
35
+ * @property {(Effect|function(EffectData): Effect[])[]} effects
29
36
  * @property {CompiledRule[]=} rules
30
37
  * @property {CompiledRule[]=} oneOf
31
38
  */
@@ -39,13 +46,18 @@ const { SyncHook } = require("tapable");
39
46
  /**
40
47
  * @typedef {object} RuleSet
41
48
  * @property {Map<string, any>} references map of references in the rule set (may grow over time)
42
- * @property {function(object): Effect[]} exec execute the rule set
49
+ * @property {function(EffectData): Effect[]} exec execute the rule set
43
50
  */
44
51
 
52
+ /** @typedef {{ apply: (function(RuleSetCompiler): void) }} RuleSetPlugin */
53
+
45
54
  class RuleSetCompiler {
55
+ /**
56
+ * @param {RuleSetPlugin[]} plugins plugins
57
+ */
46
58
  constructor(plugins) {
47
59
  this.hooks = Object.freeze({
48
- /** @type {SyncHook<[string, object, Set<string>, CompiledRule, Map<string, any>]>} */
60
+ /** @type {SyncHook<[string, RuleSetRule, Set<string>, CompiledRule, Map<string | undefined, any>]>} */
49
61
  rule: new SyncHook([
50
62
  "path",
51
63
  "rule",
@@ -62,7 +74,7 @@ class RuleSetCompiler {
62
74
  }
63
75
 
64
76
  /**
65
- * @param {object[]} ruleSet raw user provided rules
77
+ * @param {TODO[]} ruleSet raw user provided rules
66
78
  * @returns {RuleSet} compiled RuleSet
67
79
  */
68
80
  compile(ruleSet) {
@@ -70,7 +82,7 @@ class RuleSetCompiler {
70
82
  const rules = this.compileRules("ruleSet", ruleSet, refs);
71
83
 
72
84
  /**
73
- * @param {object} data data passed in
85
+ * @param {EffectData} data data passed in
74
86
  * @param {CompiledRule} rule the compiled rule
75
87
  * @param {Effect[]} effects an array where effects are pushed to
76
88
  * @returns {boolean} true, if the rule has matched
@@ -79,6 +91,7 @@ class RuleSetCompiler {
79
91
  for (const condition of rule.conditions) {
80
92
  const p = condition.property;
81
93
  if (Array.isArray(p)) {
94
+ /** @type {EffectData | string | undefined} */
82
95
  let current = data;
83
96
  for (const subProperty of p) {
84
97
  if (
@@ -93,7 +106,7 @@ class RuleSetCompiler {
93
106
  }
94
107
  }
95
108
  if (current !== undefined) {
96
- if (!condition.fn(current)) return false;
109
+ if (!condition.fn(/** @type {string} */ (current))) return false;
97
110
  continue;
98
111
  }
99
112
  } else if (p in data) {
@@ -147,25 +160,33 @@ class RuleSetCompiler {
147
160
 
148
161
  /**
149
162
  * @param {string} path current path
150
- * @param {object[]} rules the raw rules provided by user
163
+ * @param {RuleSetRules} rules the raw rules provided by user
151
164
  * @param {Map<string, any>} refs references
152
165
  * @returns {CompiledRule[]} rules
153
166
  */
154
167
  compileRules(path, rules, refs) {
155
168
  return rules
156
169
  .filter(Boolean)
157
- .map((rule, i) => this.compileRule(`${path}[${i}]`, rule, refs));
170
+ .map((rule, i) =>
171
+ this.compileRule(
172
+ `${path}[${i}]`,
173
+ /** @type {RuleSetRule} */ (rule),
174
+ refs
175
+ )
176
+ );
158
177
  }
159
178
 
160
179
  /**
161
180
  * @param {string} path current path
162
- * @param {object} rule the raw rule provided by user
181
+ * @param {RuleSetRule} rule the raw rule provided by user
163
182
  * @param {Map<string, any>} refs references
164
183
  * @returns {CompiledRule} normalized and compiled rule for processing
165
184
  */
166
185
  compileRule(path, rule, refs) {
167
186
  const unhandledProperties = new Set(
168
- Object.keys(rule).filter(key => rule[key] !== undefined)
187
+ Object.keys(rule).filter(
188
+ key => rule[/** @type {keyof RuleSetRule} */ (key)] !== undefined
189
+ )
169
190
  );
170
191
 
171
192
  /** @type {CompiledRule} */
@@ -236,7 +257,7 @@ class RuleSetCompiler {
236
257
  matchWhenEmpty: condition(""),
237
258
  fn: condition
238
259
  };
239
- } catch (err) {
260
+ } catch (_err) {
240
261
  throw this.error(
241
262
  path,
242
263
  condition,
@@ -303,7 +324,7 @@ class RuleSetCompiler {
303
324
  const fn = matcher.fn;
304
325
  conditions.push({
305
326
  matchWhenEmpty: !matcher.matchWhenEmpty,
306
- fn: v => !fn(v)
327
+ fn: /** @type {RuleConditionFunction} */ (v => !fn(v))
307
328
  });
308
329
  }
309
330
  break;
@@ -337,12 +358,11 @@ class RuleSetCompiler {
337
358
  };
338
359
  } else if (conditions.length === 1) {
339
360
  return conditions[0];
340
- } else {
341
- return {
342
- matchWhenEmpty: conditions.some(c => c.matchWhenEmpty),
343
- fn: v => conditions.some(c => c.fn(v))
344
- };
345
361
  }
362
+ return {
363
+ matchWhenEmpty: conditions.some(c => c.matchWhenEmpty),
364
+ fn: v => conditions.some(c => c.fn(v))
365
+ };
346
366
  }
347
367
 
348
368
  /**
@@ -357,12 +377,11 @@ class RuleSetCompiler {
357
377
  };
358
378
  } else if (conditions.length === 1) {
359
379
  return conditions[0];
360
- } else {
361
- return {
362
- matchWhenEmpty: conditions.every(c => c.matchWhenEmpty),
363
- fn: v => conditions.every(c => c.fn(v))
364
- };
365
380
  }
381
+ return {
382
+ matchWhenEmpty: conditions.every(c => c.matchWhenEmpty),
383
+ fn: v => conditions.every(c => c.fn(v))
384
+ };
366
385
  }
367
386
 
368
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
  /**
@@ -132,7 +135,10 @@ class UseEffectRulePlugin {
132
135
 
133
136
  if (typeof use === "function") {
134
137
  result.effects.push(data =>
135
- useToEffectsWithoutIdent(`${path}.use`, use(data))
138
+ useToEffectsWithoutIdent(
139
+ `${path}.use`,
140
+ use(/** @type {TODO} */ (data))
141
+ )
136
142
  );
137
143
  } else {
138
144
  for (const effect of useToEffects(`${path}.use`, use)) {
@@ -146,7 +152,7 @@ class UseEffectRulePlugin {
146
152
  unhandledProperties.delete("options");
147
153
  unhandledProperties.delete("enforce");
148
154
 
149
- const loader = rule.loader;
155
+ const loader = /** @type {RuleSetLoader} */ (rule.loader);
150
156
  const options = rule.options;
151
157
  const enforce = rule.enforce;
152
158
 
@@ -189,8 +195,6 @@ class UseEffectRulePlugin {
189
195
  }
190
196
  );
191
197
  }
192
-
193
- useItemToEffects(path, item) {}
194
198
  }
195
199
 
196
200
  module.exports = UseEffectRulePlugin;
@@ -59,7 +59,7 @@ class AsyncModuleRuntimeModule extends HelperRuntimeModule {
59
59
  ])});`,
60
60
  "var obj = {};",
61
61
  `obj[webpackQueues] = ${runtimeTemplate.expressionFunction(
62
- `fn(queue)`,
62
+ "fn(queue)",
63
63
  "fn"
64
64
  )};`,
65
65
  "return obj;"
@@ -10,6 +10,7 @@ const Template = require("../Template");
10
10
  const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
11
11
  const { getUndoPath } = require("../util/identifier");
12
12
 
13
+ /** @typedef {import("../Chunk")} Chunk */
13
14
  /** @typedef {import("../Compilation")} Compilation */
14
15
 
15
16
  class AutoPublicPathRuntimeModule extends RuntimeModule {
@@ -25,7 +26,8 @@ class AutoPublicPathRuntimeModule extends RuntimeModule {
25
26
  const { scriptType, importMetaName, path } = compilation.outputOptions;
26
27
  const chunkName = compilation.getPath(
27
28
  JavascriptModulesPlugin.getChunkFilenameTemplate(
28
- this.chunk,
29
+ /** @type {Chunk} */
30
+ (this.chunk),
29
31
  compilation.outputOptions
30
32
  ),
31
33
  {
@@ -48,8 +50,11 @@ class AutoPublicPathRuntimeModule extends RuntimeModule {
48
50
  `var document = ${RuntimeGlobals.global}.document;`,
49
51
  "if (!scriptUrl && document) {",
50
52
  Template.indent([
51
- `if (document.currentScript)`,
52
- Template.indent(`scriptUrl = document.currentScript.src;`),
53
+ // Technically we could use `document.currentScript instanceof window.HTMLScriptElement`,
54
+ // but an attacker could try to inject `<script>HTMLScriptElement = HTMLImageElement</script>`
55
+ // and use `<img name="currentScript" src="https://attacker.controlled.server/"></img>`
56
+ "if (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')",
57
+ Template.indent("scriptUrl = document.currentScript.src;"),
53
58
  "if (!scriptUrl) {",
54
59
  Template.indent([
55
60
  'var scripts = document.getElementsByTagName("script");',
@@ -37,8 +37,8 @@ class CreateFakeNamespaceObjectRuntimeModule extends HelperRuntimeModule {
37
37
  // Note: must be a function (not arrow), because this is used in body!
38
38
  `${fn} = function(value, mode) {`,
39
39
  Template.indent([
40
- `if(mode & 1) value = this(value);`,
41
- `if(mode & 8) return value;`,
40
+ "if(mode & 1) value = this(value);",
41
+ "if(mode & 8) return value;",
42
42
  "if(typeof value === 'object' && value) {",
43
43
  Template.indent([
44
44
  "if((mode & 4) && value.__esModule) return value;",
@@ -25,7 +25,7 @@ class DefinePropertyGettersRuntimeModule extends HelperRuntimeModule {
25
25
  return Template.asString([
26
26
  "// define getter functions for harmony exports",
27
27
  `${fn} = ${runtimeTemplate.basicFunction("exports, definition", [
28
- `for(var key in definition) {`,
28
+ "for(var key in definition) {",
29
29
  Template.indent([
30
30
  `if(${RuntimeGlobals.hasOwnProperty}(definition, key) && !${RuntimeGlobals.hasOwnProperty}(exports, key)) {`,
31
31
  Template.indent([
@@ -51,18 +51,17 @@ class EnsureChunkRuntimeModule extends RuntimeModule {
51
51
  ]
52
52
  )};`
53
53
  ]);
54
- } else {
55
- // There ensureChunk is used somewhere in the tree, so we need an empty requireEnsure
56
- // function. This can happen with multiple entrypoints.
57
- return Template.asString([
58
- "// The chunk loading function for additional chunks",
59
- "// Since all referenced chunks are already included",
60
- "// in this file, this function is empty here.",
61
- `${RuntimeGlobals.ensureChunk} = ${runtimeTemplate.returningFunction(
62
- "Promise.resolve()"
63
- )};`
64
- ]);
65
54
  }
55
+ // There ensureChunk is used somewhere in the tree, so we need an empty requireEnsure
56
+ // function. This can happen with multiple entrypoints.
57
+ return Template.asString([
58
+ "// The chunk loading function for additional chunks",
59
+ "// Since all referenced chunks are already included",
60
+ "// in this file, this function is empty here.",
61
+ `${RuntimeGlobals.ensureChunk} = ${runtimeTemplate.returningFunction(
62
+ "Promise.resolve()"
63
+ )};`
64
+ ]);
66
65
  }
67
66
  }
68
67
 
@@ -13,16 +13,14 @@ const { first } = require("../util/SetHelpers");
13
13
  /** @typedef {import("../ChunkGraph")} ChunkGraph */
14
14
  /** @typedef {import("../Compilation")} Compilation */
15
15
  /** @typedef {import("../Compilation").AssetInfo} AssetInfo */
16
- /** @typedef {import("../Compilation").PathData} PathData */
17
-
18
- /** @typedef {function(PathData, AssetInfo=): string} FilenameFunction */
16
+ /** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
19
17
 
20
18
  class GetChunkFilenameRuntimeModule extends RuntimeModule {
21
19
  /**
22
20
  * @param {string} contentType the contentType to use the content hash for
23
21
  * @param {string} name kind of filename
24
22
  * @param {string} global function name to be assigned
25
- * @param {function(Chunk): string | FilenameFunction} getFilenameForChunk functor to get the filename or function
23
+ * @param {function(Chunk): TemplatePath} getFilenameForChunk functor to get the filename or function
26
24
  * @param {boolean} allChunks when false, only async chunks are included
27
25
  */
28
26
  constructor(contentType, name, global, getFilenameForChunk, allChunks) {
@@ -44,7 +42,7 @@ class GetChunkFilenameRuntimeModule extends RuntimeModule {
44
42
  const chunk = /** @type {Chunk} */ (this.chunk);
45
43
  const { runtimeTemplate } = compilation;
46
44
 
47
- /** @type {Map<string | FilenameFunction, Set<Chunk>>} */
45
+ /** @type {Map<string | TemplatePath, Set<Chunk>>} */
48
46
  const chunkFilenames = new Map();
49
47
  let maxChunks = 0;
50
48
  /** @type {string | undefined} */
@@ -74,11 +72,10 @@ class GetChunkFilenameRuntimeModule extends RuntimeModule {
74
72
 
75
73
  if (
76
74
  chunkFilename.length ===
77
- /** @type {string} */ (dynamicFilename).length
75
+ /** @type {string} */ (dynamicFilename).length &&
76
+ chunkFilename < /** @type {string} */ (dynamicFilename)
78
77
  ) {
79
- if (chunkFilename < /** @type {string} */ (dynamicFilename)) {
80
- return;
81
- }
78
+ return;
82
79
  }
83
80
  }
84
81
  maxChunks = set.size;
@@ -122,7 +119,7 @@ class GetChunkFilenameRuntimeModule extends RuntimeModule {
122
119
 
123
120
  /**
124
121
  * @param {Chunk} c the chunk
125
- * @param {string | FilenameFunction} chunkFilename the filename template for the chunk
122
+ * @param {string | TemplatePath} chunkFilename the filename template for the chunk
126
123
  * @returns {void}
127
124
  */
128
125
  const addStaticUrl = (c, chunkFilename) => {
@@ -137,7 +134,7 @@ class GetChunkFilenameRuntimeModule extends RuntimeModule {
137
134
  return '" + chunkId + "';
138
135
  }
139
136
  const s = JSON.stringify(str);
140
- return s.slice(1, s.length - 1);
137
+ return s.slice(1, -1);
141
138
  };
142
139
  /**
143
140
  * @param {string} value string
@@ -231,17 +228,14 @@ class GetChunkFilenameRuntimeModule extends RuntimeModule {
231
228
  * @param {function(Chunk): string | number} fn function from chunk to value
232
229
  * @returns {string} code with static mapping of results of fn for including in quoted string
233
230
  */
234
- const mapExpr = fn => {
235
- return `" + ${createMap(fn)} + "`;
236
- };
231
+ const mapExpr = fn => `" + ${createMap(fn)} + "`;
237
232
 
238
233
  /**
239
234
  * @param {function(Chunk): string | number} fn function from chunk to value
240
235
  * @returns {function(number): string} function which generates code with static mapping of results of fn for including in quoted string for specific length
241
236
  */
242
- const mapExprWithLength = fn => length => {
243
- return `" + ${createMap(c => `${fn(c)}`.slice(0, length))} + "`;
244
- };
237
+ const mapExprWithLength = fn => length =>
238
+ `" + ${createMap(c => `${fn(c)}`.slice(0, length))} + "`;
245
239
 
246
240
  const url =
247
241
  dynamicFilename &&
@@ -113,7 +113,7 @@ class LoadScriptRuntimeModule extends HelperRuntimeModule {
113
113
  return Template.asString([
114
114
  "var inProgress = {};",
115
115
  uniqueName
116
- ? `var dataWebpackPrefix = ${JSON.stringify(uniqueName + ":")};`
116
+ ? `var dataWebpackPrefix = ${JSON.stringify(`${uniqueName}:`)};`
117
117
  : "// data-webpack is not used as build has no uniqueName",
118
118
  "// loadScript function to load a script via script tag",
119
119
  `${fn} = ${runtimeTemplate.basicFunction(
@@ -145,23 +145,22 @@ class LoadScriptRuntimeModule extends HelperRuntimeModule {
145
145
  ]),
146
146
  "}",
147
147
  "inProgress[url] = [done];",
148
- "var onScriptComplete = " +
149
- runtimeTemplate.basicFunction(
150
- "prev, event",
151
- Template.asString([
152
- "// avoid mem leaks in IE.",
153
- "script.onerror = script.onload = null;",
154
- "clearTimeout(timeout);",
155
- "var doneFns = inProgress[url];",
156
- "delete inProgress[url];",
157
- "script.parentNode && script.parentNode.removeChild(script);",
158
- `doneFns && doneFns.forEach(${runtimeTemplate.returningFunction(
159
- "fn(event)",
160
- "fn"
161
- )});`,
162
- "if(prev) return prev(event);"
163
- ])
164
- ),
148
+ `var onScriptComplete = ${runtimeTemplate.basicFunction(
149
+ "prev, event",
150
+ Template.asString([
151
+ "// avoid mem leaks in IE.",
152
+ "script.onerror = script.onload = null;",
153
+ "clearTimeout(timeout);",
154
+ "var doneFns = inProgress[url];",
155
+ "delete inProgress[url];",
156
+ "script.parentNode && script.parentNode.removeChild(script);",
157
+ `doneFns && doneFns.forEach(${runtimeTemplate.returningFunction(
158
+ "fn(event)",
159
+ "fn"
160
+ )});`,
161
+ "if(prev) return prev(event);"
162
+ ])
163
+ )}`,
165
164
  `var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), ${loadTimeout});`,
166
165
  "script.onerror = onScriptComplete.bind(null, script.onerror);",
167
166
  "script.onload = onScriptComplete.bind(null, script.onload);",
@@ -30,9 +30,7 @@ class StartupChunkDependenciesRuntimeModule extends RuntimeModule {
30
30
  const chunk = /** @type {Chunk} */ (this.chunk);
31
31
  const chunkIds = Array.from(
32
32
  chunkGraph.getChunkEntryDependentChunksIterable(chunk)
33
- ).map(chunk => {
34
- return chunk.id;
35
- });
33
+ ).map(chunk => chunk.id);
36
34
  const compilation = /** @type {Compilation} */ (this.compilation);
37
35
  const { runtimeTemplate } = compilation;
38
36
  return Template.asString([
@@ -15,7 +15,7 @@ const URIRegEx = /^data:([^;,]+)?((?:;[^;,]+)*?)(?:;(base64))?,(.*)$/i;
15
15
 
16
16
  /**
17
17
  * @param {string} uri data URI
18
- * @returns {Buffer|null} decoded data
18
+ * @returns {Buffer | null} decoded data
19
19
  */
20
20
  const decodeDataURI = uri => {
21
21
  const match = URIRegEx.exec(uri);