@depup/webpack 5.109.2-depup.0 → 5.110.3-depup.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 (647) hide show
  1. package/README.md +5 -5
  2. package/changes.json +7 -7
  3. package/lib/APIPlugin.js +123 -17
  4. package/lib/AsyncDependenciesBlock.js +10 -7
  5. package/lib/AutomaticPrefetchPlugin.js +1 -1
  6. package/lib/BannerPlugin.js +10 -6
  7. package/lib/CacheFacade.js +6 -6
  8. package/lib/Chunk.js +14 -11
  9. package/lib/ChunkGraph.js +46 -35
  10. package/lib/ChunkGroup.js +7 -7
  11. package/lib/ChunkTemplate.js +35 -44
  12. package/lib/CircularModulesPlugin.js +205 -28
  13. package/lib/CleanPlugin.js +4 -7
  14. package/lib/CodeGenerationResults.js +11 -8
  15. package/lib/CompatibilityPlugin.js +7 -7
  16. package/lib/Compilation.js +688 -409
  17. package/lib/Compiler.js +53 -38
  18. package/lib/ConcatenationScope.js +107 -8
  19. package/lib/ConditionalInitFragment.js +3 -3
  20. package/lib/ConstPlugin.js +13 -11
  21. package/lib/ContextExclusionPlugin.js +1 -1
  22. package/lib/ContextModule.js +146 -54
  23. package/lib/ContextModuleFactory.js +46 -14
  24. package/lib/ContextReplacementPlugin.js +12 -14
  25. package/lib/DefinePlugin.js +121 -37
  26. package/lib/DependenciesBlock.js +9 -6
  27. package/lib/Dependency.js +36 -16
  28. package/lib/DependencyTemplate.js +11 -12
  29. package/lib/DependencyTemplates.js +3 -3
  30. package/lib/DotenvPlugin.js +91 -26
  31. package/lib/DynamicEntryPlugin.js +8 -4
  32. package/lib/EntryOptionPlugin.js +8 -4
  33. package/lib/EntryPlugin.js +2 -2
  34. package/lib/Entrypoint.js +6 -2
  35. package/lib/EnvironmentPlugin.js +2 -2
  36. package/lib/EvalDevToolModulePlugin.js +8 -4
  37. package/lib/EvalSourceMapDevToolPlugin.js +15 -8
  38. package/lib/ExportsInfo.js +111 -14
  39. package/lib/ExportsInfoApiPlugin.js +2 -4
  40. package/lib/ExternalModule.js +232 -77
  41. package/lib/ExternalModuleFactoryPlugin.js +97 -38
  42. package/lib/ExternalsPlugin.js +10 -6
  43. package/lib/FileSystemInfo.js +44 -70
  44. package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
  45. package/lib/FlagDependencyExportsPlugin.js +76 -19
  46. package/lib/FlagDependencyUsagePlugin.js +40 -49
  47. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  48. package/lib/Generator.js +36 -15
  49. package/lib/HotModuleReplacementPlugin.js +16 -44
  50. package/lib/IgnorePlugin.js +8 -4
  51. package/lib/IgnoreWarningsPlugin.js +2 -2
  52. package/lib/InitFragment.js +8 -4
  53. package/lib/JavascriptMetaInfoPlugin.js +35 -4
  54. package/lib/LazyBarrel.js +3 -4
  55. package/lib/LibraryTemplatePlugin.js +10 -6
  56. package/lib/LoaderOptionsPlugin.js +7 -3
  57. package/lib/LoaderTargetPlugin.js +1 -1
  58. package/lib/MainTemplate.js +49 -42
  59. package/lib/ManifestPlugin.js +12 -11
  60. package/lib/Module.js +62 -33
  61. package/lib/ModuleFactory.js +3 -3
  62. package/lib/ModuleFilenameHelpers.js +9 -4
  63. package/lib/ModuleGraph.js +195 -21
  64. package/lib/ModuleGraphConnection.js +6 -13
  65. package/lib/ModuleInfoHeaderPlugin.js +8 -10
  66. package/lib/ModuleTemplate.js +62 -63
  67. package/lib/MultiCompiler.js +130 -64
  68. package/lib/MultiStats.js +40 -9
  69. package/lib/MultiWatching.js +3 -3
  70. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  71. package/lib/NodeStuffPlugin.js +29 -19
  72. package/lib/NormalModule.js +152 -103
  73. package/lib/NormalModuleFactory.js +555 -110
  74. package/lib/NormalModuleReplacementPlugin.js +5 -8
  75. package/lib/NullFactory.js +6 -2
  76. package/lib/OptionsApply.js +7 -3
  77. package/lib/Parser.js +7 -3
  78. package/lib/PlatformPlugin.js +2 -2
  79. package/lib/PrefetchPlugin.js +1 -1
  80. package/lib/ProgressPlugin.js +16 -13
  81. package/lib/ProvidePlugin.js +3 -5
  82. package/lib/RawModule.js +25 -17
  83. package/lib/RecordIdsPlugin.js +3 -3
  84. package/lib/RequestShortener.js +1 -1
  85. package/lib/ResolverFactory.js +2 -2
  86. package/lib/RuntimeGlobals.js +22 -10
  87. package/lib/RuntimeModule.js +29 -19
  88. package/lib/RuntimePlugin.js +335 -169
  89. package/lib/RuntimeTemplate.js +2761 -316
  90. package/lib/SelfModuleFactory.js +7 -3
  91. package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
  92. package/lib/SourceMapDevToolPlugin.js +30 -20
  93. package/lib/Stats.js +3 -4
  94. package/lib/Template.js +32 -22
  95. package/lib/TemplatedPathPlugin.js +96 -14
  96. package/lib/UseStrictPlugin.js +4 -6
  97. package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
  98. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  99. package/lib/WarnNoModeSetPlugin.js +1 -1
  100. package/lib/WatchIgnorePlugin.js +8 -6
  101. package/lib/Watching.js +8 -8
  102. package/lib/WebpackIsIncludedPlugin.js +2 -4
  103. package/lib/WebpackOptionsApply.js +308 -18
  104. package/lib/WebpackOptionsDefaulter.js +6 -2
  105. package/lib/asset/AssetBytesGenerator.js +12 -10
  106. package/lib/asset/AssetBytesParser.js +2 -4
  107. package/lib/asset/AssetGenerator.js +188 -95
  108. package/lib/asset/AssetModule.js +7 -3
  109. package/lib/asset/AssetModulesPlugin.js +110 -38
  110. package/lib/asset/AssetParser.js +9 -7
  111. package/lib/asset/AssetSourceGenerator.js +60 -13
  112. package/lib/asset/AssetSourceParser.js +2 -4
  113. package/lib/asset/RawDataUrlModule.js +24 -16
  114. package/lib/asset/WebManifestGenerator.js +8 -10
  115. package/lib/asset/WebManifestParser.js +24 -10
  116. package/lib/async-modules/AsyncModuleHelpers.js +12 -6
  117. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  118. package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
  119. package/lib/async-modules/isGeneratorLowered.js +4 -4
  120. package/lib/buildChunkGraph.js +36 -27
  121. package/lib/bun/BunTargetPlugin.js +1 -1
  122. package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
  123. package/lib/cache/AddManagedPathsPlugin.js +1 -1
  124. package/lib/cache/IdleFileCachePlugin.js +2 -2
  125. package/lib/cache/MemoryCachePlugin.js +18 -10
  126. package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
  127. package/lib/cache/PackFileCacheStrategy.js +30 -23
  128. package/lib/cache/ResolverCachePlugin.js +38 -18
  129. package/lib/cache/getLazyHashedEtag.js +1 -2
  130. package/lib/cache/mergeEtags.js +1 -1
  131. package/lib/cli.js +1 -3
  132. package/lib/config/browserslistTargetHandler.js +41 -5
  133. package/lib/config/defaults.js +270 -78
  134. package/lib/config/defineConfig.js +10 -2
  135. package/lib/config/getClaimedAssetTypes.js +65 -0
  136. package/lib/config/normalization.js +46 -16
  137. package/lib/config/target.js +46 -3
  138. package/lib/container/ContainerEntryDependency.js +1 -1
  139. package/lib/container/ContainerEntryModule.js +24 -15
  140. package/lib/container/ContainerEntryModuleFactory.js +7 -3
  141. package/lib/container/ContainerPlugin.js +9 -10
  142. package/lib/container/ContainerReferencePlugin.js +6 -2
  143. package/lib/container/FallbackDependency.js +1 -1
  144. package/lib/container/FallbackModule.js +24 -17
  145. package/lib/container/FallbackModuleFactory.js +7 -3
  146. package/lib/container/HoistContainerReferencesPlugin.js +6 -11
  147. package/lib/container/ModuleFederationPlugin.js +7 -24
  148. package/lib/container/RemoteModule.js +27 -19
  149. package/lib/container/RemoteRuntimeModule.js +10 -8
  150. package/lib/container/moduleFederationHooks.js +32 -0
  151. package/lib/css/CssGenerator.js +171 -43
  152. package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
  153. package/lib/css/CssLoadingRuntimeModule.js +84 -32
  154. package/lib/css/CssModule.js +10 -7
  155. package/lib/css/CssModulesPlugin.js +172 -100
  156. package/lib/css/CssParser.js +1113 -568
  157. package/lib/css/CssServerStylesRuntimeModule.js +54 -0
  158. package/lib/css/cssMinify.js +168 -0
  159. package/lib/css/data.js +5334 -0
  160. package/lib/css/syntax.js +9647 -232
  161. package/lib/debug/ProfilingPlugin.js +14 -9
  162. package/lib/deno/DenoTargetPlugin.js +1 -1
  163. package/lib/dependencies/AMDDefineDependency.js +112 -87
  164. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
  165. package/lib/dependencies/AMDPlugin.js +9 -7
  166. package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
  167. package/lib/dependencies/AMDRequireContextDependency.js +2 -2
  168. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
  169. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
  170. package/lib/dependencies/AMDRequireDependency.js +8 -7
  171. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  172. package/lib/dependencies/AMDRuntimeModules.js +21 -1
  173. package/lib/dependencies/BuildTimeConstDependency.js +102 -0
  174. package/lib/dependencies/CachedConstDependency.js +11 -8
  175. package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
  176. package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
  177. package/lib/dependencies/CommonJsExportsDependency.js +53 -49
  178. package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
  179. package/lib/dependencies/CommonJsFullRequireDependency.js +119 -34
  180. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -50
  181. package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
  182. package/lib/dependencies/CommonJsPlugin.js +35 -6
  183. package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
  184. package/lib/dependencies/CommonJsRequireDependency.js +170 -27
  185. package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
  186. package/lib/dependencies/ConstDependency.js +8 -9
  187. package/lib/dependencies/ContextDependency.js +12 -8
  188. package/lib/dependencies/ContextDependencyHelpers.js +14 -9
  189. package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
  190. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +24 -11
  191. package/lib/dependencies/ContextElementDependency.js +31 -12
  192. package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
  193. package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
  194. package/lib/dependencies/CssIcssExportDependency.js +56 -28
  195. package/lib/dependencies/CssIcssImportDependency.js +17 -13
  196. package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
  197. package/lib/dependencies/CssImportDependency.js +18 -9
  198. package/lib/dependencies/CssUrlDependency.js +17 -13
  199. package/lib/dependencies/DllEntryDependency.js +1 -1
  200. package/lib/dependencies/DynamicExports.js +2 -2
  201. package/lib/dependencies/ExportBindingInitFragment.js +36 -9
  202. package/lib/dependencies/ExportsInfoDependency.js +7 -8
  203. package/lib/dependencies/ExternalModuleDependency.js +9 -5
  204. package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
  205. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
  206. package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
  207. package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
  208. package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
  209. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +23 -14
  210. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +80 -12
  211. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  212. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  213. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +286 -80
  214. package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
  215. package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
  216. package/lib/dependencies/HarmonyExports.js +7 -4
  217. package/lib/dependencies/HarmonyImportDependency.js +121 -60
  218. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +124 -38
  219. package/lib/dependencies/HarmonyImportGuard.js +20 -30
  220. package/lib/dependencies/HarmonyImportSideEffectDependency.js +152 -9
  221. package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
  222. package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
  223. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
  224. package/lib/dependencies/HtmlEntryDependency.js +49 -31
  225. package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
  226. package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
  227. package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
  228. package/lib/dependencies/HtmlSourceDependency.js +22 -14
  229. package/lib/dependencies/ImportContextDependency.js +45 -5
  230. package/lib/dependencies/ImportDependency.js +33 -50
  231. package/lib/dependencies/ImportEagerDependency.js +6 -9
  232. package/lib/dependencies/ImportMetaContextDependency.js +2 -2
  233. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
  234. package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
  235. package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
  236. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
  237. package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
  238. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
  239. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
  240. package/lib/dependencies/ImportMetaPlugin.js +154 -71
  241. package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
  242. package/lib/dependencies/ImportParserPlugin.js +73 -49
  243. package/lib/dependencies/ImportPhase.js +12 -5
  244. package/lib/dependencies/ImportPlugin.js +7 -3
  245. package/lib/dependencies/ImportWeakDependency.js +6 -9
  246. package/lib/dependencies/JsonExportsDependency.js +11 -7
  247. package/lib/dependencies/LoaderDependency.js +2 -2
  248. package/lib/dependencies/LoaderImportDependency.js +2 -2
  249. package/lib/dependencies/LoaderPlugin.js +11 -7
  250. package/lib/dependencies/LocalModuleDependency.js +5 -5
  251. package/lib/dependencies/LocalModulesHelpers.js +1 -1
  252. package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
  253. package/lib/dependencies/ModuleDependency.js +9 -6
  254. package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
  255. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
  256. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  257. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
  258. package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
  259. package/lib/dependencies/NullDependency.js +3 -3
  260. package/lib/dependencies/ProvidedDependency.js +14 -10
  261. package/lib/dependencies/PureExpressionDependency.js +9 -10
  262. package/lib/dependencies/RequireContextDependency.js +2 -2
  263. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
  264. package/lib/dependencies/RequireContextPlugin.js +8 -4
  265. package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
  266. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
  267. package/lib/dependencies/RequireEnsureDependency.js +8 -7
  268. package/lib/dependencies/RequireEnsurePlugin.js +7 -3
  269. package/lib/dependencies/RequireHeaderDependency.js +50 -12
  270. package/lib/dependencies/RequireIncludeDependency.js +6 -6
  271. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
  272. package/lib/dependencies/RequireIncludePlugin.js +7 -3
  273. package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
  274. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  275. package/lib/dependencies/RequireResolveDependency.js +4 -4
  276. package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
  277. package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
  278. package/lib/dependencies/StaticExportsDependency.js +2 -2
  279. package/lib/dependencies/SystemPlugin.js +10 -6
  280. package/lib/dependencies/SystemRuntimeModule.js +10 -0
  281. package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
  282. package/lib/dependencies/URLContextDependency.js +2 -2
  283. package/lib/dependencies/URLDependency.js +110 -64
  284. package/lib/dependencies/URLPlugin.js +7 -3
  285. package/lib/dependencies/UnsupportedDependency.js +4 -4
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
  287. package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
  289. package/lib/dependencies/WorkerAndWorkletPlugin.js +47 -28
  290. package/lib/dependencies/WorkerDependency.js +22 -22
  291. package/lib/dependencies/WorkletDependency.js +18 -21
  292. package/lib/dependencies/getFunctionExpression.js +8 -4
  293. package/lib/dependencies/importOptionsCheck.js +47 -0
  294. package/lib/dependencies/processExportInfo.js +5 -5
  295. package/lib/dll/DelegatedModule.js +34 -22
  296. package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
  297. package/lib/dll/DelegatedPlugin.js +2 -2
  298. package/lib/dll/DllEntryPlugin.js +2 -2
  299. package/lib/dll/DllModule.js +22 -15
  300. package/lib/dll/DllModuleFactory.js +7 -3
  301. package/lib/dll/DllPlugin.js +7 -5
  302. package/lib/dll/DllReferencePlugin.js +10 -7
  303. package/lib/dll/LibManifestPlugin.js +5 -5
  304. package/lib/electron/ElectronTargetPlugin.js +53 -49
  305. package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
  306. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  307. package/lib/errors/BroadContextsWarning.js +43 -0
  308. package/lib/errors/BuildCycleError.js +1 -1
  309. package/lib/errors/CacheEffectivenessWarning.js +55 -0
  310. package/lib/errors/ChunkRenderError.js +1 -1
  311. package/lib/errors/CircularDependenciesWarning.js +38 -0
  312. package/lib/errors/CodeGenerationError.js +1 -1
  313. package/lib/errors/CommentCompilationWarning.js +1 -1
  314. package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
  315. package/lib/errors/DotenvFileError.js +29 -0
  316. package/lib/errors/DuplicateModulesWarning.js +45 -0
  317. package/lib/errors/DynamicExportsWarning.js +30 -0
  318. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  319. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  320. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  321. package/lib/errors/EvalUsageWarning.js +28 -0
  322. package/lib/errors/HookWebpackError.js +5 -5
  323. package/lib/errors/HotspotsWarning.js +57 -0
  324. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  325. package/lib/errors/ImportedBindingAssignmentError.js +30 -0
  326. package/lib/errors/InlinedAssetsWarning.js +36 -0
  327. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  328. package/lib/errors/LargeModulesWarning.js +45 -0
  329. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  330. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  331. package/lib/errors/MixedExportsWarning.js +41 -0
  332. package/lib/errors/ModuleDependencyError.js +13 -16
  333. package/lib/errors/ModuleDependencyWarning.js +5 -15
  334. package/lib/errors/ModuleHashingError.js +1 -1
  335. package/lib/errors/ModuleNotFoundError.js +2 -2
  336. package/lib/errors/ModuleParseError.js +1 -2
  337. package/lib/errors/ModuleRestoreError.js +1 -1
  338. package/lib/errors/ModuleStoreError.js +1 -1
  339. package/lib/errors/NodeStuffInWebError.js +1 -1
  340. package/lib/errors/OsDependentRuleWarning.js +31 -0
  341. package/lib/errors/PureAnnotationsWarning.js +36 -0
  342. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  343. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  344. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  345. package/lib/errors/TinyChunksWarning.js +40 -0
  346. package/lib/errors/TopLevelThisWarning.js +34 -0
  347. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  348. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  349. package/lib/errors/UnusedAliasesWarning.js +29 -0
  350. package/lib/errors/UnusedDefinesWarning.js +29 -0
  351. package/lib/errors/UnusedExternalsWarning.js +29 -0
  352. package/lib/errors/UnusedReexportsWarning.js +42 -0
  353. package/lib/errors/UnusedRuleWarning.js +29 -0
  354. package/lib/errors/WebpackError.js +9 -5
  355. package/lib/errors/deriveStackFromNestedError.js +90 -0
  356. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  357. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  358. package/lib/esm/ModuleChunkLoadingPlugin.js +86 -51
  359. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +161 -62
  360. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  361. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  362. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  363. package/lib/hmr/lazyCompilationBackend.js +9 -6
  364. package/lib/hmr/parserHooks.js +56 -0
  365. package/lib/html/HtmlGenerator.js +277 -77
  366. package/lib/html/HtmlModule.js +7 -3
  367. package/lib/html/HtmlModulesPlugin.js +366 -200
  368. package/lib/html/HtmlParser.js +31 -86
  369. package/lib/html/data.js +1928 -0
  370. package/lib/html/htmlMinify.js +288 -0
  371. package/lib/html/syntax.js +6034 -1384
  372. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  373. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  374. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  375. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  376. package/lib/ids/IdHelpers.js +7 -8
  377. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  378. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  379. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  380. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  381. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  382. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  383. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  384. package/lib/index.js +10 -0
  385. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  386. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  387. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  388. package/lib/javascript/ChunkHelpers.js +1 -1
  389. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  390. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  391. package/lib/javascript/JavascriptGenerator.js +65 -165
  392. package/lib/javascript/JavascriptModule.js +9 -3
  393. package/lib/javascript/JavascriptModulesPlugin.js +103 -123
  394. package/lib/javascript/JavascriptParser.js +242 -99
  395. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  396. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  397. package/lib/javascript/StartupHelpers.js +55 -9
  398. package/lib/javascript/syntax.js +2678 -232
  399. package/lib/json/JsonData.js +8 -4
  400. package/lib/json/JsonGenerator.js +38 -16
  401. package/lib/json/JsonModule.js +7 -3
  402. package/lib/json/JsonModulesPlugin.js +1 -1
  403. package/lib/json/JsonParser.js +5 -6
  404. package/lib/library/AbstractLibraryPlugin.js +20 -14
  405. package/lib/library/AmdLibraryPlugin.js +11 -7
  406. package/lib/library/AssignLibraryPlugin.js +19 -13
  407. package/lib/library/EnableLibraryPlugin.js +2 -2
  408. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  409. package/lib/library/JsonpLibraryPlugin.js +11 -7
  410. package/lib/library/ModuleLibraryPlugin.js +256 -64
  411. package/lib/library/SystemLibraryPlugin.js +12 -8
  412. package/lib/library/UmdLibraryPlugin.js +62 -25
  413. package/lib/loaders/LoaderRunner.js +47 -6
  414. package/lib/loaders/loadLoader.js +8 -4
  415. package/lib/logging/createConsoleLogger.js +7 -4
  416. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  417. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  418. package/lib/node/NodeSourcePlugin.js +1 -1
  419. package/lib/node/NodeTargetPlugin.js +4 -3
  420. package/lib/node/NodeTemplatePlugin.js +1 -1
  421. package/lib/node/NodeWatchFileSystem.js +70 -9
  422. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  423. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +65 -19
  424. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  425. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  426. package/lib/node/nodeConsole.js +7 -3
  427. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  428. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  429. package/lib/optimize/ConcatenatedModule.js +1030 -476
  430. package/lib/optimize/ConstExportsPlugin.js +16 -7
  431. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  432. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  433. package/lib/optimize/InlineExports.js +130 -5
  434. package/lib/optimize/InnerGraph.js +28 -12
  435. package/lib/optimize/InnerGraphPlugin.js +23 -18
  436. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  437. package/lib/optimize/MangleExportsPlugin.js +7 -8
  438. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  439. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  440. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  441. package/lib/optimize/RealContentHashPlugin.js +121 -41
  442. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  443. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  444. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  445. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  446. package/lib/optimize/SplitChunksPlugin.js +86 -24
  447. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  448. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  449. package/lib/performance/BroadContextsPlugin.js +142 -0
  450. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  451. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  452. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  453. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  454. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  455. package/lib/performance/DynamicExportsPlugin.js +120 -0
  456. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  457. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  458. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  459. package/lib/performance/EvalUsagePlugin.js +115 -0
  460. package/lib/performance/HotspotsPlugin.js +296 -0
  461. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  462. package/lib/performance/LargeModulesPlugin.js +126 -0
  463. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  464. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  465. package/lib/performance/MixedExportsPlugin.js +136 -0
  466. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  467. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  468. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  469. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  470. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  471. package/lib/performance/SizeLimitsPlugin.js +139 -7
  472. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  473. package/lib/performance/TinyChunksPlugin.js +128 -0
  474. package/lib/performance/TopLevelThisPlugin.js +208 -0
  475. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  476. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  477. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  478. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  479. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  480. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  481. package/lib/performance/getModuleSize.js +22 -0
  482. package/lib/performance/getSourceModules.js +22 -0
  483. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  484. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  485. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  486. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  487. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  488. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  489. package/lib/prefetch/ResourceHintPlugin.js +295 -79
  490. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  491. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  492. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  493. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  494. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  495. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  496. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  497. package/lib/rules/RuleSetCompiler.js +146 -12
  498. package/lib/rules/UseEffectRulePlugin.js +18 -11
  499. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  500. package/lib/runtime/AsyncModuleRuntimeModule.js +6 -2
  501. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  502. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  503. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  504. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  505. package/lib/runtime/CompatRuntimeModule.js +5 -3
  506. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  507. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  508. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  509. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  510. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  511. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  512. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  513. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  514. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  515. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  516. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  517. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  518. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  519. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  520. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  521. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +34 -7
  522. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  523. package/lib/runtime/NonceRuntimeModule.js +10 -0
  524. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  525. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  526. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  527. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  528. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  529. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  530. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  531. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  532. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  533. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  534. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  535. package/lib/runtime/baseUri.js +63 -0
  536. package/lib/schemes/DataUriPlugin.js +1 -1
  537. package/lib/schemes/FileUriPlugin.js +1 -1
  538. package/lib/schemes/HttpUriPlugin.js +46 -20
  539. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  540. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  541. package/lib/serialization/BinaryMiddleware.js +4 -4
  542. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  543. package/lib/serialization/FileMiddleware.js +22 -9
  544. package/lib/serialization/ObjectMiddleware.js +139 -114
  545. package/lib/serialization/PlainObjectSerializer.js +19 -16
  546. package/lib/sharing/ConsumeSharedModule.js +30 -21
  547. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  548. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  549. package/lib/sharing/ProvideSharedModule.js +25 -16
  550. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  551. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  552. package/lib/sharing/SharePlugin.js +17 -5
  553. package/lib/sharing/ShareRuntimeModule.js +4 -4
  554. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  555. package/lib/sharing/utils.js +1 -3
  556. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  557. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  558. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  559. package/lib/stats/StatsFactory.js +25 -26
  560. package/lib/stats/StatsPrinter.js +16 -12
  561. package/lib/typescript/TypeScriptPlugin.js +20 -24
  562. package/lib/url/URLParserPlugin.js +26 -13
  563. package/lib/util/ArrayQueue.js +3 -3
  564. package/lib/util/AsyncQueue.js +4 -3
  565. package/lib/util/Hash.js +5 -1
  566. package/lib/util/LazySet.js +35 -22
  567. package/lib/util/LocConverter.js +36 -13
  568. package/lib/util/SourceProcessor.js +1066 -24
  569. package/lib/util/StringXor.js +1 -1
  570. package/lib/util/URLAbsoluteSpecifier.js +3 -1
  571. package/lib/util/chainedImports.js +9 -5
  572. package/lib/util/cleverMerge.js +1 -1
  573. package/lib/util/comparators.js +45 -14
  574. package/lib/util/concatenate.js +203 -77
  575. package/lib/util/conventions.js +10 -2
  576. package/lib/util/createHash.js +2 -2
  577. package/lib/util/createHooksRegistry.js +8 -10
  578. package/lib/util/createMappings.js +25 -3
  579. package/lib/util/dataURL.js +225 -1
  580. package/lib/util/extractSourceMap.js +4 -3
  581. package/lib/util/findCaseMismatch.js +139 -0
  582. package/lib/util/formatLocation.js +1 -2
  583. package/lib/util/fs.js +22 -5
  584. package/lib/util/globUtils.js +298 -24
  585. package/lib/util/hash/BatchedHash.js +5 -1
  586. package/lib/util/hash/BulkUpdateHash.js +5 -1
  587. package/lib/util/hash/DebugHash.js +5 -1
  588. package/lib/util/hash/hash-digest.js +6 -2
  589. package/lib/util/identifier.js +4 -0
  590. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  591. package/lib/util/internalSerializables.js +8 -0
  592. package/lib/util/lazyModule.js +56 -0
  593. package/lib/util/makeSerializable.js +7 -3
  594. package/lib/util/matchAlias.js +25 -0
  595. package/lib/util/mimeTypes.js +11 -5
  596. package/lib/util/nonNumericOnlyHash.js +4 -3
  597. package/lib/util/parseJson.js +5 -3
  598. package/lib/util/preloadModuleType.js +32 -0
  599. package/lib/util/registerExternalSerializer.js +7 -5
  600. package/lib/util/removeBOM.js +82 -1
  601. package/lib/util/runtime.js +2 -2
  602. package/lib/util/semver.js +1 -1
  603. package/lib/util/serialization.js +28 -28
  604. package/lib/util/source.js +2 -2
  605. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  606. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  607. package/lib/wasm/wasmModuleFilename.js +54 -0
  608. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +43 -21
  609. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +45 -21
  610. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  611. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  612. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  613. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  614. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  615. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +29 -8
  616. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  617. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  618. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  619. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  620. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  621. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  622. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  623. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  624. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  625. package/lib/web/FetchCompileAsyncWasmPlugin.js +105 -19
  626. package/lib/web/FetchCompileWasmPlugin.js +48 -16
  627. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  628. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  629. package/lib/web/JsonpTemplatePlugin.js +2 -2
  630. package/lib/webpack.js +22 -11
  631. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  632. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  633. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  634. package/module.d.ts +1 -0
  635. package/package.json +32 -25
  636. package/schemas/WebpackOptions.check.js +1 -1
  637. package/schemas/WebpackOptions.json +667 -34
  638. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  639. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  640. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  641. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  642. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  643. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  644. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  645. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  646. package/types.d.ts +3223 -465
  647. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -4,10 +4,14 @@
4
4
 
5
5
  "use strict";
6
6
 
7
- const UnsupportedFeatureWarning = require("../errors/UnsupportedFeatureWarning");
7
+ const memoize = require("../util/memoize");
8
8
 
9
- /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
10
- /** @typedef {import("../NormalModule")} NormalModule */
9
+ const getUnsupportedFeatureWarning = memoize(() =>
10
+ require("../errors/UnsupportedFeatureWarning")
11
+ );
12
+
13
+ /** @import { DependencyLocation } from "../Dependency" */
14
+ /** @import NormalModule from "../NormalModule" */
11
15
 
12
16
  /**
13
17
  * @typedef {object} ResourceHintOptions
@@ -38,7 +42,7 @@ const parseResourceHintOptions = (importOptions, module, loc) => {
38
42
  * @returns {void}
39
43
  */
40
44
  const warn = (message) => {
41
- module.addWarning(new UnsupportedFeatureWarning(message, loc));
45
+ module.addWarning(new (getUnsupportedFeatureWarning())(message, loc));
42
46
  };
43
47
 
44
48
  if (importOptions.webpackPrefetch !== undefined) {
@@ -100,4 +104,27 @@ const parseResourceHintOptions = (importOptions, module, loc) => {
100
104
  return hints;
101
105
  };
102
106
 
107
+ /**
108
+ * Maps a request/filename to the value of the `<link>` `as` attribute. Best
109
+ * effort — falls back to `"fetch"` when the type cannot be guessed. Pattern
110
+ * matches against the path part, ignoring any query string suffix.
111
+ * @param {string} request request/filename
112
+ * @returns {string} value for the `as` attribute
113
+ */
114
+ const guessAsAttribute = (request) => {
115
+ if (/\.(png|jpe?g|gif|svg|webp|avif|bmp|ico|tiff?)(\?.*)?$/i.test(request)) {
116
+ return "image";
117
+ }
118
+ if (/\.(woff2?|ttf|otf|eot)(\?.*)?$/i.test(request)) return "font";
119
+ if (/\.css(\?.*)?$/i.test(request)) return "style";
120
+ if (/\.[cm]?jsx?(\?.*)?$/i.test(request)) return "script";
121
+ if (/\.[cm]?tsx?(\?.*)?$/i.test(request)) return "script";
122
+ if (/\.(mp3|wav|flac|aac|m4a|ogg|oga)(\?.*)?$/i.test(request)) return "audio";
123
+ if (/\.(mp4|webm|mkv|mov|m4v|ogv|avi)(\?.*)?$/i.test(request)) return "video";
124
+ if (/\.vtt(\?.*)?$/i.test(request)) return "track";
125
+ return "fetch";
126
+ };
127
+
128
+ parseResourceHintOptions.guessAsAttribute = guessAsAttribute;
129
+
103
130
  module.exports = parseResourceHintOptions;
@@ -5,8 +5,8 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
9
- /** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
8
+ /** @import { RuleSetRule } from "../../declarations/WebpackOptions" */
9
+ /** @import RuleSetCompiler from "./RuleSetCompiler" */
10
10
 
11
11
  /**
12
12
  * Defines the keys of types type used by this module.
@@ -5,10 +5,14 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetConditionOrConditions} RuleSetConditionOrConditions */
9
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetConditionOrConditionsAbsolute} RuleSetConditionOrConditionsAbsolute */
10
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
11
- /** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
8
+ /**
9
+ * @import {
10
+ * RuleSetConditionOrConditions,
11
+ * RuleSetConditionOrConditionsAbsolute,
12
+ * RuleSetRule
13
+ * } from "../../declarations/WebpackOptions"
14
+ */
15
+ /** @import RuleSetCompiler from "./RuleSetCompiler" */
12
16
 
13
17
  /**
14
18
  * Defines the keys of types type used by this module.
@@ -0,0 +1,68 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ /**
9
+ * @import {
10
+ * RuleSetGlob,
11
+ * RuleSetGlobs,
12
+ * RuleSetRule
13
+ * } from "../../declarations/WebpackOptions"
14
+ */
15
+ /** @import RuleSetCompiler from "./RuleSetCompiler" */
16
+
17
+ /**
18
+ * Defines the keys of types type used by this module.
19
+ * @template T
20
+ * @template {T[keyof T]} V
21
+ * @typedef {import("./RuleSetCompiler").KeysOfTypes<T, V>} KeysOfTypes
22
+ */
23
+
24
+ /** @typedef {KeysOfTypes<RuleSetRule, RuleSetGlob | RuleSetGlobs>} GlobMatcherRuleKeys */
25
+
26
+ const PLUGIN_NAME = "GlobMatcherRulePlugin";
27
+
28
+ class GlobMatcherRulePlugin {
29
+ /**
30
+ * Creates an instance of GlobMatcherRulePlugin.
31
+ * @param {GlobMatcherRuleKeys} ruleProperty the rule property
32
+ * @param {string=} dataProperty the data property
33
+ */
34
+ constructor(ruleProperty, dataProperty) {
35
+ /** @type {GlobMatcherRuleKeys} */
36
+ this.ruleProperty = ruleProperty;
37
+ /** @type {string | GlobMatcherRuleKeys} */
38
+ this.dataProperty = dataProperty || ruleProperty;
39
+ }
40
+
41
+ /**
42
+ * Applies the plugin by registering its hooks on the compiler.
43
+ * @param {RuleSetCompiler} ruleSetCompiler the rule set compiler
44
+ * @returns {void}
45
+ */
46
+ apply(ruleSetCompiler) {
47
+ ruleSetCompiler.hooks.rule.tap(
48
+ PLUGIN_NAME,
49
+ (path, rule, unhandledProperties, result) => {
50
+ if (unhandledProperties.has(this.ruleProperty)) {
51
+ unhandledProperties.delete(this.ruleProperty);
52
+ const condition = ruleSetCompiler.compileGlobCondition(
53
+ `${path}.${this.ruleProperty}`,
54
+ /** @type {RuleSetGlob | RuleSetGlobs} */
55
+ (rule[this.ruleProperty])
56
+ );
57
+ result.conditions.push({
58
+ property: this.dataProperty,
59
+ matchWhenEmpty: condition.matchWhenEmpty,
60
+ fn: condition.fn
61
+ });
62
+ }
63
+ }
64
+ );
65
+ }
66
+ }
67
+
68
+ module.exports = GlobMatcherRulePlugin;
@@ -5,11 +5,18 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetConditionOrConditions} RuleSetConditionOrConditions */
9
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
10
- /** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
11
- /** @typedef {import("./RuleSetCompiler").EffectData} EffectData */
12
- /** @typedef {import("./RuleSetCompiler").RuleConditionFunction} RuleConditionFunction */
8
+ /**
9
+ * @import {
10
+ * RuleSetConditionOrConditions,
11
+ * RuleSetRule
12
+ * } from "../../declarations/WebpackOptions"
13
+ */
14
+ /**
15
+ * @import RuleSetCompiler, {
16
+ * EffectData,
17
+ * RuleConditionFunction
18
+ * } from "./RuleSetCompiler"
19
+ */
13
20
 
14
21
  /**
15
22
  * Defines the keys of types type used by this module.
@@ -6,13 +6,18 @@
6
6
  "use strict";
7
7
 
8
8
  const { SyncHook } = require("tapable");
9
+ const { createPathGlobMatcher } = require("../util/globUtils");
9
10
 
10
- /** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */
11
- /** @typedef {import("../../declarations/WebpackOptions").Falsy} Falsy */
12
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetUseItem} RuleSetUseItem */
13
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetLoaderOptions} RuleSetLoaderOptions */
14
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
15
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetConditionAbsolute} RuleSetConditionAbsolute */
11
+ /** @import { ResolveRequest } from "enhanced-resolve" */
12
+ /**
13
+ * @import {
14
+ * Falsy,
15
+ * RuleSetUseItem,
16
+ * RuleSetLoaderOptions,
17
+ * RuleSetRule,
18
+ * RuleSetConditionAbsolute
19
+ * } from "../../declarations/WebpackOptions"
20
+ */
16
21
 
17
22
  /** @typedef {(Falsy | RuleSetRule)[]} RuleSetRules */
18
23
 
@@ -48,6 +53,7 @@ const { SyncHook } = require("tapable");
48
53
  * @property {string=} mimetype
49
54
  * @property {string} dependency
50
55
  * @property {ResolveRequest["descriptionFileData"]=} descriptionData
56
+ * @property {ResolveRequest["relativePath"]=} descriptionRelativePath
51
57
  * @property {string=} compiler
52
58
  * @property {string} issuer
53
59
  * @property {string} issuerLayer
@@ -57,6 +63,9 @@ const { SyncHook } = require("tapable");
57
63
  /**
58
64
  * Defines the compiled rule type used by this module.
59
65
  * @typedef {object} CompiledRule
66
+ * @property {string} path
67
+ * @property {RuleSetRule} raw
68
+ * @property {boolean} used
60
69
  * @property {RuleCondition[]} conditions
61
70
  * @property {(Effect | ((effectData: EffectData) => Effect[]))[]} effects
62
71
  * @property {CompiledRule[]=} rules
@@ -88,6 +97,7 @@ const { SyncHook } = require("tapable");
88
97
  * @typedef {object} RuleSet
89
98
  * @property {References} references map of references in the rule set (may grow over time)
90
99
  * @property {(effectData: EffectData) => Effect[]} exec execute the rule set
100
+ * @property {() => CompiledRule[]} unusedRules the rules that never matched, outermost first
91
101
  */
92
102
 
93
103
  /**
@@ -99,11 +109,34 @@ const { SyncHook } = require("tapable");
99
109
 
100
110
  /** @typedef {Set<string>} UnhandledProperties */
101
111
 
112
+ /** @typedef {(str: string) => boolean} GlobMatcher */
102
113
  /** @typedef {(data: EffectData) => (RuleSetUseItem | (Falsy | RuleSetUseItem)[])} RuleSetUseFn */
103
114
  /** @typedef {(value: string) => boolean} RuleSetConditionFn */
104
115
 
105
116
  /** @typedef {{ apply: (ruleSetCompiler: RuleSetCompiler) => void }} RuleSetPlugin */
106
117
 
118
+ /**
119
+ * @param {GlobMatcher[]} positive patterns that select
120
+ * @param {GlobMatcher[]} negative patterns that subtract
121
+ * @returns {GlobMatcher} matcher
122
+ */
123
+ const combineGlobMatchers = (positive, negative) => {
124
+ /** @type {GlobMatcher} */
125
+ const matchPositive =
126
+ positive.length === 0
127
+ ? () => true
128
+ : positive.length === 1
129
+ ? positive[0]
130
+ : (str) => positive.some((match) => match(str));
131
+ if (negative.length === 0) return matchPositive;
132
+ /** @type {GlobMatcher} */
133
+ const matchNegative =
134
+ negative.length === 1
135
+ ? negative[0]
136
+ : (str) => negative.some((match) => match(str));
137
+ return (str) => matchPositive(str) && !matchNegative(str);
138
+ };
139
+
107
140
  class RuleSetCompiler {
108
141
  /**
109
142
  * Creates an instance of RuleSetCompiler.
@@ -177,6 +210,7 @@ class RuleSetCompiler {
177
210
  return false;
178
211
  }
179
212
  }
213
+ rule.used = true;
180
214
  for (const effect of rule.effects) {
181
215
  if (typeof effect === "function") {
182
216
  const returnedEffects = effect(data);
@@ -211,6 +245,12 @@ class RuleSetCompiler {
211
245
  execRule(data, rule, effects);
212
246
  }
213
247
  return effects;
248
+ },
249
+ unusedRules: () => {
250
+ /** @type {CompiledRule[]} */
251
+ const unused = [];
252
+ collectUnusedRules(rules, unused);
253
+ return unused;
214
254
  }
215
255
  };
216
256
  }
@@ -251,6 +291,9 @@ class RuleSetCompiler {
251
291
 
252
292
  /** @type {CompiledRule} */
253
293
  const compiledRule = {
294
+ path,
295
+ raw: rule,
296
+ used: false,
254
297
  conditions: [],
255
298
  effects: [],
256
299
  rules: undefined,
@@ -382,6 +425,11 @@ class RuleSetCompiler {
382
425
  }
383
426
  }
384
427
  break;
428
+ case "glob":
429
+ if (value) {
430
+ conditions.push(this.compileGlobCondition(`${path}.glob`, value));
431
+ }
432
+ break;
385
433
  case "not":
386
434
  if (value) {
387
435
  const matcher = this.compileCondition(`${path}.not`, value);
@@ -410,6 +458,49 @@ class RuleSetCompiler {
410
458
  return this.combineConditionsAnd(conditions);
411
459
  }
412
460
 
461
+ /**
462
+ * Returns a compiled glob condition. Unlike a regexp it matches the same way
463
+ * on every OS: `\` is a path separator in both the pattern and the tested
464
+ * value, and a relative pattern matches at any depth. Patterns are OR-ed,
465
+ * a `!` prefix subtracts, and a list of only `!` patterns subtracts from
466
+ * everything.
467
+ * @param {string} path current path
468
+ * @param {string | string[]} glob user provided glob pattern(s)
469
+ * @returns {Condition} compiled condition
470
+ */
471
+ compileGlobCondition(path, glob) {
472
+ const globs = Array.isArray(glob) ? glob : [glob];
473
+ if (globs.length === 0) {
474
+ throw this.error(path, glob, "Expected glob pattern, but got empty list");
475
+ }
476
+ /** @type {GlobMatcher[]} */
477
+ const positive = [];
478
+ /** @type {GlobMatcher[]} */
479
+ const negative = [];
480
+ for (let i = 0; i < globs.length; i++) {
481
+ const pattern = globs[i];
482
+ const patternPath = Array.isArray(glob) ? `${path}[${i}]` : path;
483
+ if (typeof pattern !== "string") {
484
+ throw this.error(
485
+ patternPath,
486
+ pattern,
487
+ `Unexpected ${typeof pattern} when glob pattern was expected`
488
+ );
489
+ }
490
+ const negated = pattern.startsWith("!");
491
+ const match = createPathGlobMatcher(negated ? pattern.slice(1) : pattern);
492
+ if (match === null) {
493
+ throw this.error(patternPath, pattern, "Invalid glob pattern");
494
+ }
495
+ (negated ? negative : positive).push(match);
496
+ }
497
+ const match = combineGlobMatchers(positive, negative);
498
+ return {
499
+ matchWhenEmpty: match(""),
500
+ fn: (v) => typeof v === "string" && match(v)
501
+ };
502
+ }
503
+
413
504
  /**
414
505
  * Combine conditions or.
415
506
  * @param {Condition[]} conditions some conditions
@@ -477,7 +568,8 @@ class RuleSetCompiler {
477
568
  * are ignored: they don't establish the module type (e.g. a stylelint pre-loader
478
569
  * must not suppress the built-in css type). A `test` regexp that references the
479
570
  * extension (e.g. `/source\.css$/`) also counts even if the sample path itself
480
- * doesn't match, so a loader scoped to specific filenames is still detected.
571
+ * doesn't match, so a loader scoped to specific filenames is still detected; a
572
+ * `glob` condition naming the extension counts the same way.
481
573
  * @param {import("../../declarations/WebpackOptions").RuleSetRules | undefined} rules user `module.rules`
482
574
  * @param {string} resource sample resource path (e.g. `"/file.css"`)
483
575
  * @param {boolean=} inherited whether an enclosing rule already matched the resource
@@ -493,7 +585,13 @@ class RuleSetCompiler {
493
585
  inherited ||
494
586
  matchesResource(rule.test, resource, extProbe) ||
495
587
  matchesResource(rule.resource, resource, extProbe) ||
496
- matchesResource(rule.include, resource, extProbe);
588
+ matchesResource(rule.include, resource, extProbe) ||
589
+ // the rule-level `glob` selects the resource as well
590
+ matchesResource(
591
+ rule.glob === undefined ? undefined : { glob: rule.glob },
592
+ resource,
593
+ extProbe
594
+ );
497
595
  const establishesType =
498
596
  rule.type !== undefined ||
499
597
  ((rule.use !== undefined || rule.loader !== undefined) &&
@@ -543,9 +641,25 @@ const matchRuleSetCondition = (condition, resource) => {
543
641
  };
544
642
 
545
643
  /**
546
- * Whether any regexp in the condition references the extension probe (e.g.
547
- * `\.css`), i.e. the rule clearly targets that extension even if the generic
548
- * sample path doesn't match its (possibly filename-scoped) pattern.
644
+ * @param {EXPECTED_ANY} glob glob pattern(s)
645
+ * @param {string} extension extension including the dot (e.g. `".css"`)
646
+ * @returns {boolean} whether a pattern targets the extension
647
+ */
648
+ const globReferencesExtension = (glob, extension) => {
649
+ // a `!` pattern subtracts the extension instead of targeting it
650
+ if (typeof glob === "string") {
651
+ return !glob.startsWith("!") && glob.includes(extension);
652
+ }
653
+ return (
654
+ Array.isArray(glob) &&
655
+ glob.some((pattern) => globReferencesExtension(pattern, extension))
656
+ );
657
+ };
658
+
659
+ /**
660
+ * Whether any regexp or glob in the condition references the extension probe
661
+ * (e.g. `\.css`), i.e. the rule clearly targets that extension even if the
662
+ * generic sample path doesn't match its (possibly filename-scoped) pattern.
549
663
  * @param {EXPECTED_ANY} condition condition
550
664
  * @param {string} extProbe escaped extension probe (e.g. `"\\.css"`)
551
665
  * @returns {boolean} whether a regexp in the condition targets the extension
@@ -557,6 +671,8 @@ const conditionReferencesExtension = (condition, extProbe) => {
557
671
  }
558
672
  if (condition && typeof condition === "object") {
559
673
  return (
674
+ // `\.css` → `.css`
675
+ globReferencesExtension(condition.glob, extProbe.slice(1)) ||
560
676
  conditionReferencesExtension(condition.and, extProbe) ||
561
677
  conditionReferencesExtension(condition.or, extProbe)
562
678
  );
@@ -566,7 +682,7 @@ const conditionReferencesExtension = (condition, extProbe) => {
566
682
 
567
683
  /**
568
684
  * A condition counts as targeting the resource if it matches the sample path or
569
- * references the extension via a regexp.
685
+ * references the extension via a regexp or glob.
570
686
  * @param {RuleSetConditionAbsolute | undefined} condition condition
571
687
  * @param {string} resource sample resource path
572
688
  * @param {string} extProbe escaped extension probe (e.g. `"\\.css"`)
@@ -577,4 +693,22 @@ const matchesResource = (condition, resource, extProbe) =>
577
693
  (matchRuleSetCondition(condition, resource) ||
578
694
  conditionReferencesExtension(condition, extProbe));
579
695
 
696
+ /**
697
+ * Collects the outermost rules that never matched. A rule below an unused one is
698
+ * unused only because of its parent, so its subtree is not descended into.
699
+ * @param {CompiledRule[]} rules compiled rules
700
+ * @param {CompiledRule[]} result where unused rules are collected
701
+ * @returns {void}
702
+ */
703
+ const collectUnusedRules = (rules, result) => {
704
+ for (const rule of rules) {
705
+ if (!rule.used) {
706
+ result.push(rule);
707
+ continue;
708
+ }
709
+ if (rule.rules) collectUnusedRules(rule.rules, result);
710
+ if (rule.oneOf) collectUnusedRules(rule.oneOf, result);
711
+ }
712
+ };
713
+
580
714
  module.exports = RuleSetCompiler;
@@ -7,17 +7,24 @@
7
7
 
8
8
  const util = require("util");
9
9
 
10
- /** @typedef {import("../../declarations/WebpackOptions").Falsy} Falsy */
11
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetLoader} RuleSetLoader */
12
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetLoaderOptions} RuleSetLoaderOptions */
13
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
14
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetUse} RuleSetUse */
15
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetUseItem} RuleSetUseItem */
16
- /** @typedef {import("../../declarations/WebpackOptions").RuleSetUseFunction} RuleSetUseFunction */
17
- /** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
18
- /** @typedef {import("./RuleSetCompiler").Effect} Effect */
19
- /** @typedef {import("./RuleSetCompiler").EffectData} EffectData */
20
- /** @typedef {import("./RuleSetCompiler").EffectUseType} EffectUseType */
10
+ /**
11
+ * @import {
12
+ * Falsy,
13
+ * RuleSetLoader,
14
+ * RuleSetLoaderOptions,
15
+ * RuleSetRule,
16
+ * RuleSetUse,
17
+ * RuleSetUseItem,
18
+ * RuleSetUseFunction
19
+ * } from "../../declarations/WebpackOptions"
20
+ */
21
+ /**
22
+ * @import RuleSetCompiler, {
23
+ * Effect,
24
+ * EffectData,
25
+ * EffectUseType
26
+ * } from "./RuleSetCompiler"
27
+ */
21
28
 
22
29
  const PLUGIN_NAME = "UseEffectRulePlugin";
23
30
 
@@ -8,13 +8,23 @@ const RuntimeGlobals = require("../RuntimeGlobals");
8
8
  const Template = require("../Template");
9
9
  const HelperRuntimeModule = require("./HelperRuntimeModule");
10
10
 
11
- /** @typedef {import("../Compilation")} Compilation */
11
+ /** @import Compilation from "../Compilation" */
12
12
 
13
13
  class AsyncModuleGeneratorRuntimeModule extends HelperRuntimeModule {
14
14
  constructor() {
15
15
  super("async module generator");
16
16
  }
17
17
 
18
+ /**
19
+ * Returns true, if the runtime module should get it's own scope.
20
+ * When false, `generate()` must emit complete statements ending with `;`
21
+ * so a following runtime IIFE is not parsed as a call (ASI).
22
+ * @returns {boolean} true, if the runtime module should get it's own scope
23
+ */
24
+ shouldIsolate() {
25
+ return false;
26
+ }
27
+
18
28
  /**
19
29
  * Generates runtime code for this runtime module.
20
30
  * @returns {string | null} runtime code
@@ -8,7 +8,7 @@ const RuntimeGlobals = require("../RuntimeGlobals");
8
8
  const Template = require("../Template");
9
9
  const HelperRuntimeModule = require("./HelperRuntimeModule");
10
10
 
11
- /** @typedef {import("../Compilation")} Compilation */
11
+ /** @import Compilation from "../Compilation" */
12
12
 
13
13
  class AsyncModuleRuntimeModule extends HelperRuntimeModule {
14
14
  /**
@@ -57,7 +57,11 @@ class AsyncModuleRuntimeModule extends HelperRuntimeModule {
57
57
  `${cst} hasUnresolvedAsyncSubgraph = asyncDeps.some((id) => {`,
58
58
  Template.indent([
59
59
  `${cst} cache = __webpack_module_cache__[id];`,
60
- "return !cache || cache[webpackDone] === false;"
60
+ "if (!cache) return true;",
61
+ // A cached entry no longer means finished, and a rejected
62
+ // one is done but its error must still reach the importer.
63
+ `${cst} deps = cache.exports;`,
64
+ "return deps[webpackDone] !== true || deps[webpackError] !== undefined;"
61
65
  ]),
62
66
  "});",
63
67
  "if (hasUnresolvedAsyncSubgraph) {",
@@ -7,11 +7,10 @@
7
7
  const RuntimeGlobals = require("../RuntimeGlobals");
8
8
  const RuntimeModule = require("../RuntimeModule");
9
9
  const Template = require("../Template");
10
- const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
11
- const { getUndoPath } = require("../util/identifier");
12
10
 
13
- /** @typedef {import("../Chunk")} Chunk */
14
- /** @typedef {import("../Compilation")} Compilation */
11
+ /** @import Chunk from "../Chunk" */
12
+ /** @import ChunkGraph from "../ChunkGraph" */
13
+ /** @import Compilation from "../Compilation" */
15
14
 
16
15
  class AutoPublicPathRuntimeModule extends RuntimeModule {
17
16
  constructor() {
@@ -24,22 +23,16 @@ class AutoPublicPathRuntimeModule extends RuntimeModule {
24
23
  */
25
24
  generate() {
26
25
  const compilation = /** @type {Compilation} */ (this.compilation);
27
- const { scriptType, importMetaName, path, environment } =
26
+ // The virtual build-time chunk has no script url and sits at the output
27
+ // root, so urls resolve against the `importModule` baseUri.
28
+ if (/** @type {ChunkGraph} */ (this.chunkGraph).buildTimeExecution) {
29
+ return `${RuntimeGlobals.publicPath} = "";`;
30
+ }
31
+ const { scriptType, importMetaName, environment } =
28
32
  compilation.outputOptions;
29
33
  const chunk = /** @type {Chunk} */ (this.chunk);
30
- const chunkName = compilation.getPath(
31
- JavascriptModulesPlugin.getChunkFilenameTemplate(
32
- chunk,
33
- compilation.outputOptions
34
- ),
35
- {
36
- chunk,
37
- contentHashType: "javascript"
38
- }
39
- );
40
- const undoPath = getUndoPath(
41
- chunkName,
42
- /** @type {string} */ (path),
34
+ const undoPath = compilation.runtimeTemplate.chunkRootOutputDir(
35
+ chunk,
43
36
  false
44
37
  );
45
38
 
@@ -79,7 +72,7 @@ class AutoPublicPathRuntimeModule extends RuntimeModule {
79
72
  "if(scripts.length) {",
80
73
  Template.indent([
81
74
  `${lt} i = scripts.length - 1;`,
82
- "while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;"
75
+ "while (i > -1 && (!scriptUrl || !/^https?:/.test(scriptUrl))) scriptUrl = scripts[i--].src;"
83
76
  ]),
84
77
  "}"
85
78
  ]),
@@ -90,7 +83,9 @@ class AutoPublicPathRuntimeModule extends RuntimeModule {
90
83
  "// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration",
91
84
  '// or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.',
92
85
  'if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");',
93
- 'scriptUrl = scriptUrl.replace(/^blob:/, "").replace(/#.*$/, "").replace(/\\?.*$/, "").replace(/\\/[^\\/]+$/, "/");',
86
+ // One pass for the `blob:` prefix and the query/fragment: both stop at the
87
+ // first `?` or `#`, so stripping either first leaves the same url.
88
+ 'scriptUrl = scriptUrl.replace(/^blob:|[?#].*$/g, "").replace(/\\/[^/]+$/, "/");',
94
89
  !undoPath
95
90
  ? `${RuntimeGlobals.publicPath} = scriptUrl;`
96
91
  : `${RuntimeGlobals.publicPath} = scriptUrl + ${JSON.stringify(
@@ -7,15 +7,31 @@
7
7
 
8
8
  const RuntimeGlobals = require("../RuntimeGlobals");
9
9
  const RuntimeModule = require("../RuntimeModule");
10
+ const { renderBaseUri } = require("./baseUri");
10
11
 
11
- /** @typedef {import("../../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescription */
12
- /** @typedef {import("../Chunk")} Chunk */
12
+ /**
13
+ * @import {
14
+ * EntryDescriptionNormalized as EntryDescription
15
+ * } from "../../declarations/WebpackOptions"
16
+ */
17
+ /** @import Chunk from "../Chunk" */
18
+ /** @import Compilation from "../Compilation" */
13
19
 
14
20
  class BaseUriRuntimeModule extends RuntimeModule {
15
21
  constructor() {
16
22
  super("base uri", RuntimeModule.STAGE_ATTACH);
17
23
  }
18
24
 
25
+ /**
26
+ * Returns true, if the runtime module should get it's own scope.
27
+ * When false, `generate()` must emit complete statements ending with `;`
28
+ * so a following runtime IIFE is not parsed as a call (ASI).
29
+ * @returns {boolean} true, if the runtime module should get it's own scope
30
+ */
31
+ shouldIsolate() {
32
+ return false;
33
+ }
34
+
19
35
  /**
20
36
  * Generates runtime code for this runtime module.
21
37
  * @returns {string | null} runtime code
@@ -25,11 +41,21 @@ class BaseUriRuntimeModule extends RuntimeModule {
25
41
  const options =
26
42
  /** @type {EntryDescription} */
27
43
  (chunk.getEntryOptions());
28
- return `${RuntimeGlobals.baseURI} = ${
29
- options.baseUri === undefined
30
- ? "undefined"
31
- : JSON.stringify(options.baseUri)
32
- };`;
44
+ if (options.baseUri === undefined) {
45
+ return `${RuntimeGlobals.baseURI} = undefined;`;
46
+ }
47
+ const { runtimeTemplate, outputOptions } =
48
+ /** @type {Compilation} */
49
+ (this.compilation);
50
+ // Chunk loading is off here, so no loader has named a base for a relative one to be
51
+ // read against. Module output carries its own url; anything else has none to offer.
52
+ if (!runtimeTemplate.isModule()) {
53
+ return `${RuntimeGlobals.baseURI} = ${JSON.stringify(options.baseUri)};`;
54
+ }
55
+ return renderBaseUri(
56
+ options.baseUri,
57
+ `${outputOptions.importMetaName}.url`
58
+ );
33
59
  }
34
60
  }
35
61