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
@@ -22,8 +22,14 @@ const { join } = require("./util/fs");
22
22
  /** @typedef {import("./ModuleFactory").ModuleFactoryResult} ModuleFactoryResult */
23
23
  /** @typedef {import("./ResolverFactory")} ResolverFactory */
24
24
  /** @typedef {import("./dependencies/ContextDependency")} ContextDependency */
25
- /** @template T @typedef {import("./util/deprecation").FakeHook<T>} FakeHook<T> */
25
+ /** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */
26
+ /**
27
+ * @template T
28
+ * @typedef {import("./util/deprecation").FakeHook<T>} FakeHook<T>
29
+ */
30
+ /** @typedef {import("./util/fs").IStats} IStats */
26
31
  /** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
32
+ /** @typedef {{ context: string, request: string }} ContextAlternativeRequest */
27
33
 
28
34
  const EMPTY_RESOLVE_OPTIONS = {};
29
35
 
@@ -33,7 +39,7 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
33
39
  */
34
40
  constructor(resolverFactory) {
35
41
  super();
36
- /** @type {AsyncSeriesWaterfallHook<[TODO[], ContextModuleOptions]>} */
42
+ /** @type {AsyncSeriesWaterfallHook<[ContextAlternativeRequest[], ContextModuleOptions]>} */
37
43
  const alternativeRequests = new AsyncSeriesWaterfallHook([
38
44
  "modules",
39
45
  "options"
@@ -45,27 +51,27 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
45
51
  afterResolve: new AsyncSeriesWaterfallHook(["data"]),
46
52
  /** @type {SyncWaterfallHook<[string[]]>} */
47
53
  contextModuleFiles: new SyncWaterfallHook(["files"]),
48
- /** @type {FakeHook<Pick<AsyncSeriesWaterfallHook<[TODO[]]>, "tap" | "tapAsync" | "tapPromise" | "name">>} */
54
+ /** @type {FakeHook<Pick<AsyncSeriesWaterfallHook<[ContextAlternativeRequest[]]>, "tap" | "tapAsync" | "tapPromise" | "name">>} */
49
55
  alternatives: createFakeHook(
50
56
  {
51
57
  name: "alternatives",
52
- /** @type {AsyncSeriesWaterfallHook<[TODO[]]>["intercept"]} */
58
+ /** @type {AsyncSeriesWaterfallHook<[ContextAlternativeRequest[]]>["intercept"]} */
53
59
  intercept: interceptor => {
54
60
  throw new Error(
55
61
  "Intercepting fake hook ContextModuleFactory.hooks.alternatives is not possible, use ContextModuleFactory.hooks.alternativeRequests instead"
56
62
  );
57
63
  },
58
- /** @type {AsyncSeriesWaterfallHook<[TODO[]]>["tap"]} */
64
+ /** @type {AsyncSeriesWaterfallHook<[ContextAlternativeRequest[]]>["tap"]} */
59
65
  tap: (options, fn) => {
60
66
  alternativeRequests.tap(options, fn);
61
67
  },
62
- /** @type {AsyncSeriesWaterfallHook<[TODO[]]>["tapAsync"]} */
68
+ /** @type {AsyncSeriesWaterfallHook<[ContextAlternativeRequest[]]>["tapAsync"]} */
63
69
  tapAsync: (options, fn) => {
64
70
  alternativeRequests.tapAsync(options, (items, _options, callback) =>
65
71
  fn(items, callback)
66
72
  );
67
73
  },
68
- /** @type {AsyncSeriesWaterfallHook<[TODO[]]>["tapPromise"]} */
74
+ /** @type {AsyncSeriesWaterfallHook<[ContextAlternativeRequest[]]>["tapPromise"]} */
69
75
  tapPromise: (options, fn) => {
70
76
  alternativeRequests.tapPromise(options, fn);
71
77
  }
@@ -80,7 +86,7 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
80
86
 
81
87
  /**
82
88
  * @param {ModuleFactoryCreateData} data data object
83
- * @param {function(Error=, ModuleFactoryResult=): void} callback callback
89
+ * @param {function((Error | null)=, ModuleFactoryResult=): void} callback callback
84
90
  * @returns {void}
85
91
  */
86
92
  create(data, callback) {
@@ -93,8 +99,9 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
93
99
  const contextDependencies = new LazySet();
94
100
  this.hooks.beforeResolve.callAsync(
95
101
  {
96
- context: context,
97
- dependencies: dependencies,
102
+ context,
103
+ dependencies,
104
+ layer: data.contextInfo.issuerLayer,
98
105
  resolveOptions,
99
106
  fileDependencies,
100
107
  missingDependencies,
@@ -123,12 +130,12 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
123
130
  const request = beforeResolveResult.request;
124
131
  const resolveOptions = beforeResolveResult.resolveOptions;
125
132
 
126
- let loaders,
127
- resource,
128
- loadersPrefix = "";
133
+ let loaders;
134
+ let resource;
135
+ let loadersPrefix = "";
129
136
  const idx = request.lastIndexOf("!");
130
137
  if (idx >= 0) {
131
- let loadersRequest = request.substr(0, idx + 1);
138
+ let loadersRequest = request.slice(0, idx + 1);
132
139
  let i;
133
140
  for (
134
141
  i = 0;
@@ -138,15 +145,11 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
138
145
  loadersPrefix += "!";
139
146
  }
140
147
  loadersRequest = loadersRequest
141
- .substr(i)
148
+ .slice(i)
142
149
  .replace(/!+$/, "")
143
150
  .replace(/!!+/g, "!");
144
- if (loadersRequest === "") {
145
- loaders = [];
146
- } else {
147
- loaders = loadersRequest.split("!");
148
- }
149
- resource = request.substr(idx + 1);
151
+ loaders = loadersRequest === "" ? [] : loadersRequest.split("!");
152
+ resource = request.slice(idx + 1);
150
153
  } else {
151
154
  loaders = [];
152
155
  resource = request;
@@ -159,7 +162,7 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
159
162
  resolveOptions || EMPTY_RESOLVE_OPTIONS,
160
163
  "dependencyType",
161
164
  dependencies[0].category
162
- )
165
+ )
163
166
  : resolveOptions
164
167
  );
165
168
  const loaderResolver = this.resolverFactory.get("loader");
@@ -167,6 +170,15 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
167
170
  asyncLib.parallel(
168
171
  [
169
172
  callback => {
173
+ const results = /** @type ResolveRequest[] */ ([]);
174
+ /**
175
+ * @param {ResolveRequest} obj obj
176
+ * @returns {void}
177
+ */
178
+ const yield_ = obj => {
179
+ results.push(obj);
180
+ };
181
+
170
182
  contextResolver.resolve(
171
183
  {},
172
184
  context,
@@ -174,11 +186,12 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
174
186
  {
175
187
  fileDependencies,
176
188
  missingDependencies,
177
- contextDependencies
189
+ contextDependencies,
190
+ yield: yield_
178
191
  },
179
- (err, result) => {
192
+ err => {
180
193
  if (err) return callback(err);
181
- callback(null, result);
194
+ callback(null, results);
182
195
  }
183
196
  );
184
197
  },
@@ -197,7 +210,7 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
197
210
  },
198
211
  (err, result) => {
199
212
  if (err) return callback(err);
200
- callback(null, result);
213
+ callback(null, /** @type {string} */ (result));
201
214
  }
202
215
  );
203
216
  },
@@ -213,15 +226,26 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
213
226
  contextDependencies
214
227
  });
215
228
  }
216
-
229
+ let [contextResult, loaderResult] =
230
+ /** @type {[ResolveRequest[], string[]]} */ (result);
231
+ if (contextResult.length > 1) {
232
+ const first = contextResult[0];
233
+ contextResult = contextResult.filter(r => r.path);
234
+ if (contextResult.length === 0) contextResult.push(first);
235
+ }
217
236
  this.hooks.afterResolve.callAsync(
218
237
  {
219
238
  addon:
220
239
  loadersPrefix +
221
- result[1].join("!") +
222
- (result[1].length > 0 ? "!" : ""),
223
- resource: result[0],
240
+ loaderResult.join("!") +
241
+ (loaderResult.length > 0 ? "!" : ""),
242
+ resource:
243
+ contextResult.length > 1
244
+ ? contextResult.map(r => r.path)
245
+ : contextResult[0].path,
224
246
  resolveDependencies: this.resolveDependencies.bind(this),
247
+ resourceQuery: contextResult[0].query,
248
+ resourceFragment: contextResult[0].fragment,
225
249
  ...beforeResolveResult
226
250
  },
227
251
  (err, result) => {
@@ -274,30 +298,47 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
274
298
  exclude,
275
299
  referencedExports,
276
300
  category,
277
- typePrefix
301
+ typePrefix,
302
+ attributes
278
303
  } = options;
279
304
  if (!regExp || !resource) return callback(null, []);
280
305
 
281
- const addDirectoryChecked = (directory, visited, callback) => {
282
- fs.realpath(directory, (err, realPath) => {
306
+ /**
307
+ * @param {string} ctx context
308
+ * @param {string} directory directory
309
+ * @param {Set<string>} visited visited
310
+ * @param {ResolveDependenciesCallback} callback callback
311
+ */
312
+ const addDirectoryChecked = (ctx, directory, visited, callback) => {
313
+ /** @type {NonNullable<InputFileSystem["realpath"]>} */
314
+ (fs.realpath)(directory, (err, _realPath) => {
283
315
  if (err) return callback(err);
316
+ const realPath = /** @type {string} */ (_realPath);
284
317
  if (visited.has(realPath)) return callback(null, []);
318
+ /** @type {Set<string> | undefined} */
285
319
  let recursionStack;
286
320
  addDirectory(
321
+ ctx,
287
322
  directory,
288
- (dir, callback) => {
323
+ (_, dir, callback) => {
289
324
  if (recursionStack === undefined) {
290
325
  recursionStack = new Set(visited);
291
326
  recursionStack.add(realPath);
292
327
  }
293
- addDirectoryChecked(dir, recursionStack, callback);
328
+ addDirectoryChecked(ctx, dir, recursionStack, callback);
294
329
  },
295
330
  callback
296
331
  );
297
332
  });
298
333
  };
299
334
 
300
- const addDirectory = (directory, addSubDirectory, callback) => {
335
+ /**
336
+ * @param {string} ctx context
337
+ * @param {string} directory directory
338
+ * @param {function(string, string, function(): void): void} addSubDirectory addSubDirectoryFn
339
+ * @param {ResolveDependenciesCallback} callback callback
340
+ */
341
+ const addDirectory = (ctx, directory, addSubDirectory, callback) => {
301
342
  fs.readdir(directory, (err, files) => {
302
343
  if (err) return callback(err);
303
344
  const processedFiles = cmf.hooks.contextModuleFiles.call(
@@ -311,29 +352,29 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
311
352
  const subResource = join(fs, directory, segment);
312
353
 
313
354
  if (!exclude || !subResource.match(exclude)) {
314
- fs.stat(subResource, (err, stat) => {
355
+ fs.stat(subResource, (err, _stat) => {
315
356
  if (err) {
316
357
  if (err.code === "ENOENT") {
317
358
  // ENOENT is ok here because the file may have been deleted between
318
359
  // the readdir and stat calls.
319
360
  return callback();
320
- } else {
321
- return callback(err);
322
361
  }
362
+ return callback(err);
323
363
  }
324
364
 
365
+ const stat = /** @type {IStats} */ (_stat);
366
+
325
367
  if (stat.isDirectory()) {
326
368
  if (!recursive) return callback();
327
- addSubDirectory(subResource, callback);
369
+ addSubDirectory(ctx, subResource, callback);
328
370
  } else if (
329
371
  stat.isFile() &&
330
372
  (!include || subResource.match(include))
331
373
  ) {
374
+ /** @type {{ context: string, request: string }} */
332
375
  const obj = {
333
- context: resource,
334
- request:
335
- "." +
336
- subResource.substr(resource.length).replace(/\\/g, "/")
376
+ context: ctx,
377
+ request: `.${subResource.slice(ctx.length).replace(/\\/g, "/")}`
337
378
  };
338
379
 
339
380
  this.hooks.alternativeRequests.callAsync(
@@ -341,20 +382,29 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
341
382
  options,
342
383
  (err, alternatives) => {
343
384
  if (err) return callback(err);
344
- alternatives = alternatives
345
- .filter(obj => regExp.test(obj.request))
346
- .map(obj => {
347
- const dep = new ContextElementDependency(
348
- obj.request + resourceQuery + resourceFragment,
349
- obj.request,
350
- typePrefix,
351
- category,
352
- referencedExports
353
- );
354
- dep.optional = true;
355
- return dep;
356
- });
357
- callback(null, alternatives);
385
+ callback(
386
+ null,
387
+ /** @type {ContextAlternativeRequest[]} */
388
+ (alternatives)
389
+ .filter(obj =>
390
+ regExp.test(/** @type {string} */ (obj.request))
391
+ )
392
+ .map(obj => {
393
+ const dep = new ContextElementDependency(
394
+ `${obj.request}${resourceQuery}${resourceFragment}`,
395
+ obj.request,
396
+ typePrefix,
397
+ /** @type {string} */
398
+ (category),
399
+ referencedExports,
400
+ /** @type {TODO} */
401
+ (obj.context),
402
+ attributes
403
+ );
404
+ dep.optional = true;
405
+ return dep;
406
+ })
407
+ );
358
408
  }
359
409
  );
360
410
  } else {
@@ -382,12 +432,50 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
382
432
  });
383
433
  };
384
434
 
385
- if (typeof fs.realpath === "function") {
386
- addDirectoryChecked(resource, new Set(), callback);
435
+ /**
436
+ * @param {string} ctx context
437
+ * @param {string} dir dir
438
+ * @param {ResolveDependenciesCallback} callback callback
439
+ * @returns {void}
440
+ */
441
+ const addSubDirectory = (ctx, dir, callback) =>
442
+ addDirectory(ctx, dir, addSubDirectory, callback);
443
+
444
+ /**
445
+ * @param {string} resource resource
446
+ * @param {ResolveDependenciesCallback} callback callback
447
+ */
448
+ const visitResource = (resource, callback) => {
449
+ if (typeof fs.realpath === "function") {
450
+ addDirectoryChecked(resource, resource, new Set(), callback);
451
+ } else {
452
+ addDirectory(resource, resource, addSubDirectory, callback);
453
+ }
454
+ };
455
+
456
+ if (typeof resource === "string") {
457
+ visitResource(resource, callback);
387
458
  } else {
388
- const addSubDirectory = (dir, callback) =>
389
- addDirectory(dir, addSubDirectory, callback);
390
- addDirectory(resource, addSubDirectory, callback);
459
+ asyncLib.map(resource, visitResource, (err, _result) => {
460
+ if (err) return callback(err);
461
+ const result = /** @type {ContextElementDependency[][]} */ (_result);
462
+
463
+ // result dependencies should have unique userRequest
464
+ // ordered by resolve result
465
+ /** @type {Set<string>} */
466
+ const temp = new Set();
467
+ /** @type {ContextElementDependency[]} */
468
+ const res = [];
469
+ for (let i = 0; i < result.length; i++) {
470
+ const inner = result[i];
471
+ for (const el of inner) {
472
+ if (temp.has(el.userRequest)) continue;
473
+ res.push(el);
474
+ temp.add(el.userRequest);
475
+ }
476
+ }
477
+ callback(null, res);
478
+ });
391
479
  }
392
480
  }
393
481
  };
@@ -8,7 +8,16 @@
8
8
  const ContextElementDependency = require("./dependencies/ContextElementDependency");
9
9
  const { join } = require("./util/fs");
10
10
 
11
+ /** @typedef {import("./Compiler")} Compiler */
12
+ /** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
13
+
11
14
  class ContextReplacementPlugin {
15
+ /**
16
+ * @param {RegExp} resourceRegExp A regular expression that determines which files will be selected
17
+ * @param {TODO=} newContentResource A new resource to replace the match
18
+ * @param {TODO=} newContentRecursive If true, all subdirectories are searched for matches
19
+ * @param {RegExp=} newContentRegExp A regular expression that determines which files will be selected
20
+ */
12
21
  constructor(
13
22
  resourceRegExp,
14
23
  newContentResource,
@@ -49,6 +58,11 @@ class ContextReplacementPlugin {
49
58
  }
50
59
  }
51
60
 
61
+ /**
62
+ * Apply the plugin
63
+ * @param {Compiler} compiler the compiler instance
64
+ * @returns {void}
65
+ */
52
66
  apply(compiler) {
53
67
  const resourceRegExp = this.resourceRegExp;
54
68
  const newContentCallback = this.newContentCallback;
@@ -91,7 +105,7 @@ class ContextReplacementPlugin {
91
105
  result.resource = newContentResource;
92
106
  } else {
93
107
  result.resource = join(
94
- compiler.inputFileSystem,
108
+ /** @type {InputFileSystem} */ (compiler.inputFileSystem),
95
109
  result.resource,
96
110
  newContentResource
97
111
  );
@@ -119,7 +133,7 @@ class ContextReplacementPlugin {
119
133
  ) {
120
134
  // When the function changed it to an relative path
121
135
  result.resource = join(
122
- compiler.inputFileSystem,
136
+ /** @type {InputFileSystem} */ (compiler.inputFileSystem),
123
137
  origResource,
124
138
  result.resource
125
139
  );
@@ -140,14 +154,15 @@ const createResolveDependenciesFromContextMap = createContextMap => {
140
154
  const resolveDependenciesFromContextMap = (fs, options, callback) => {
141
155
  createContextMap(fs, (err, map) => {
142
156
  if (err) return callback(err);
143
- const dependencies = Object.keys(map).map(key => {
144
- return new ContextElementDependency(
145
- map[key] + options.resourceQuery + options.resourceFragment,
146
- key,
147
- options.category,
148
- options.referencedExports
149
- );
150
- });
157
+ const dependencies = Object.keys(map).map(
158
+ key =>
159
+ new ContextElementDependency(
160
+ map[key] + options.resourceQuery + options.resourceFragment,
161
+ key,
162
+ options.category,
163
+ options.referencedExports
164
+ )
165
+ );
151
166
  callback(null, dependencies);
152
167
  });
153
168
  };
@@ -0,0 +1,166 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Krasnoyarov @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const NormalModule = require("./NormalModule");
9
+ const makeSerializable = require("./util/makeSerializable");
10
+
11
+ /** @typedef {import("./Module")} Module */
12
+ /** @typedef {import("./NormalModule").NormalModuleCreateData} NormalModuleCreateData */
13
+ /** @typedef {import("./RequestShortener")} RequestShortener */
14
+ /** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
15
+ /** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
16
+
17
+ /** @typedef {string|undefined} CssLayer */
18
+ /** @typedef {string|undefined} Supports */
19
+ /** @typedef {string|undefined} Media */
20
+ /** @typedef {[CssLayer?, Supports?, Media?]} InheritanceItem */
21
+ /** @typedef {Array<InheritanceItem>} Inheritance */
22
+
23
+ /** @typedef {NormalModuleCreateData & { cssLayer: CssLayer|null, supports: Supports|null, media: Media|null, inheritance: Inheritance|null }} CSSModuleCreateData */
24
+
25
+ class CssModule extends NormalModule {
26
+ /**
27
+ * @param {CSSModuleCreateData} options options object
28
+ */
29
+ constructor(options) {
30
+ super(options);
31
+
32
+ // Avoid override `layer` for `Module` class, because it is a feature to run module in specific layer
33
+ this.cssLayer = options.cssLayer;
34
+ this.supports = options.supports;
35
+ this.media = options.media;
36
+ this.inheritance = options.inheritance;
37
+ }
38
+
39
+ /**
40
+ * @returns {string} a unique identifier of the module
41
+ */
42
+ identifier() {
43
+ let identifier = super.identifier();
44
+
45
+ if (this.cssLayer) {
46
+ identifier += `|${this.cssLayer}`;
47
+ }
48
+
49
+ if (this.supports) {
50
+ identifier += `|${this.supports}`;
51
+ }
52
+
53
+ if (this.media) {
54
+ identifier += `|${this.media}`;
55
+ }
56
+
57
+ if (this.inheritance) {
58
+ const inheritance = this.inheritance.map(
59
+ (item, index) =>
60
+ `inheritance_${index}|${item[0] || ""}|${item[1] || ""}|${
61
+ item[2] || ""
62
+ }`
63
+ );
64
+
65
+ identifier += `|${inheritance.join("|")}`;
66
+ }
67
+
68
+ return identifier;
69
+ }
70
+
71
+ /**
72
+ * @param {RequestShortener} requestShortener the request shortener
73
+ * @returns {string} a user readable identifier of the module
74
+ */
75
+ readableIdentifier(requestShortener) {
76
+ const readableIdentifier = super.readableIdentifier(requestShortener);
77
+
78
+ let identifier = `css ${readableIdentifier}`;
79
+
80
+ if (this.cssLayer) {
81
+ identifier += ` (layer: ${this.cssLayer})`;
82
+ }
83
+
84
+ if (this.supports) {
85
+ identifier += ` (supports: ${this.supports})`;
86
+ }
87
+
88
+ if (this.media) {
89
+ identifier += ` (media: ${this.media})`;
90
+ }
91
+
92
+ return identifier;
93
+ }
94
+
95
+ /**
96
+ * Assuming this module is in the cache. Update the (cached) module with
97
+ * the fresh module from the factory. Usually updates internal references
98
+ * and properties.
99
+ * @param {Module} module fresh module
100
+ * @returns {void}
101
+ */
102
+ updateCacheModule(module) {
103
+ super.updateCacheModule(module);
104
+ const m = /** @type {CssModule} */ (module);
105
+ this.cssLayer = m.cssLayer;
106
+ this.supports = m.supports;
107
+ this.media = m.media;
108
+ this.inheritance = m.inheritance;
109
+ }
110
+
111
+ /**
112
+ * @param {ObjectSerializerContext} context context
113
+ */
114
+ serialize(context) {
115
+ const { write } = context;
116
+ write(this.cssLayer);
117
+ write(this.supports);
118
+ write(this.media);
119
+ write(this.inheritance);
120
+ super.serialize(context);
121
+ }
122
+
123
+ /**
124
+ * @param {ObjectDeserializerContext} context context
125
+ * @returns {CssModule} the deserialized object
126
+ */
127
+ static deserialize(context) {
128
+ const obj = new CssModule({
129
+ // will be deserialized by Module
130
+ layer: null,
131
+ type: "",
132
+ // will be filled by updateCacheModule
133
+ resource: "",
134
+ context: "",
135
+ request: null,
136
+ userRequest: null,
137
+ rawRequest: null,
138
+ loaders: null,
139
+ matchResource: null,
140
+ parser: null,
141
+ parserOptions: null,
142
+ generator: null,
143
+ generatorOptions: null,
144
+ resolveOptions: null,
145
+ cssLayer: null,
146
+ supports: null,
147
+ media: null,
148
+ inheritance: null
149
+ });
150
+ obj.deserialize(context);
151
+ return obj;
152
+ }
153
+
154
+ deserialize(context) {
155
+ const { read } = context;
156
+ this.cssLayer = read();
157
+ this.supports = read();
158
+ this.media = read();
159
+ this.inheritance = read();
160
+ super.deserialize(context);
161
+ }
162
+ }
163
+
164
+ makeSerializable(CssModule, "webpack/lib/CssModule");
165
+
166
+ module.exports = CssModule;