webpack 5.107.2 → 5.108.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 (357) hide show
  1. package/hot/dev-server.js +2 -0
  2. package/lib/APIPlugin.js +8 -4
  3. package/lib/CacheFacade.js +7 -0
  4. package/lib/Chunk.js +4 -0
  5. package/lib/ChunkGraph.js +30 -9
  6. package/lib/CircularModulesPlugin.js +190 -0
  7. package/lib/CleanPlugin.js +2 -1
  8. package/lib/Compilation.js +396 -65
  9. package/lib/Compiler.js +25 -11
  10. package/lib/ConcatenationScope.js +10 -3
  11. package/lib/ContextExclusionPlugin.js +1 -0
  12. package/lib/ContextModule.js +92 -47
  13. package/lib/ContextReplacementPlugin.js +4 -0
  14. package/lib/DefinePlugin.js +89 -15
  15. package/lib/Dependency.js +111 -7
  16. package/lib/EntryOptionPlugin.js +39 -2
  17. package/lib/EntryPlugin.js +2 -0
  18. package/lib/ExportsInfo.js +314 -73
  19. package/lib/ExternalModule.js +82 -34
  20. package/lib/ExternalModuleFactoryPlugin.js +1 -0
  21. package/lib/ExternalsPlugin.js +1 -0
  22. package/lib/FileSystemInfo.js +173 -23
  23. package/lib/FlagAllModulesAsUsedPlugin.js +1 -5
  24. package/lib/FlagDependencyExportsPlugin.js +23 -0
  25. package/lib/FlagDependencyUsagePlugin.js +87 -5
  26. package/lib/FlagEntryExportAsUsedPlugin.js +2 -0
  27. package/lib/Generator.js +8 -0
  28. package/lib/HotModuleReplacementPlugin.js +65 -28
  29. package/lib/IgnorePlugin.js +1 -0
  30. package/lib/InitFragment.js +5 -0
  31. package/lib/JavascriptMetaInfoPlugin.js +7 -5
  32. package/lib/LazyBarrel.js +361 -0
  33. package/lib/LoaderTargetPlugin.js +1 -0
  34. package/lib/Module.js +21 -42
  35. package/lib/ModuleGraph.js +3 -2
  36. package/lib/ModuleProfile.js +27 -1
  37. package/lib/ModuleTemplate.js +2 -0
  38. package/lib/MultiCompiler.js +2 -0
  39. package/lib/MultiStats.js +1 -0
  40. package/lib/MultiWatching.js +2 -0
  41. package/lib/NodeStuffPlugin.js +22 -17
  42. package/lib/NormalModule.js +142 -80
  43. package/lib/NormalModuleReplacementPlugin.js +2 -0
  44. package/lib/PrefetchPlugin.js +2 -0
  45. package/lib/ProgressPlugin.js +8 -0
  46. package/lib/ProvidePlugin.js +1 -0
  47. package/lib/RawModule.js +20 -16
  48. package/lib/RecordIdsPlugin.js +1 -0
  49. package/lib/RuntimeGlobals.js +5 -0
  50. package/lib/RuntimePlugin.js +58 -26
  51. package/lib/RuntimeTemplate.js +278 -21
  52. package/lib/SelfModuleFactory.js +1 -0
  53. package/lib/SourceMapDevToolPlugin.js +3 -5
  54. package/lib/Stats.js +1 -0
  55. package/lib/Template.js +8 -2
  56. package/lib/TemplatedPathPlugin.js +473 -131
  57. package/lib/WarnCaseSensitiveModulesPlugin.js +1 -0
  58. package/lib/WarnDeprecatedOptionPlugin.js +4 -0
  59. package/lib/WarnNoModeSetPlugin.js +1 -0
  60. package/lib/WatchIgnorePlugin.js +1 -0
  61. package/lib/Watching.js +9 -0
  62. package/lib/WebpackOptionsApply.js +50 -5
  63. package/lib/asset/AssetBytesGenerator.js +11 -3
  64. package/lib/asset/AssetGenerator.js +47 -22
  65. package/lib/asset/AssetModule.js +47 -0
  66. package/lib/asset/AssetModulesPlugin.js +14 -14
  67. package/lib/asset/AssetParser.js +2 -2
  68. package/lib/asset/AssetSourceGenerator.js +8 -0
  69. package/lib/asset/RawDataUrlModule.js +12 -13
  70. package/lib/buildChunkGraph.js +64 -7
  71. package/lib/bun/BunTargetPlugin.js +48 -0
  72. package/lib/cache/AddBuildDependenciesPlugin.js +1 -0
  73. package/lib/cache/AddManagedPathsPlugin.js +3 -0
  74. package/lib/cache/IdleFileCachePlugin.js +4 -0
  75. package/lib/cache/MemoryWithGcCachePlugin.js +1 -0
  76. package/lib/cache/PackFileCacheStrategy.js +1 -0
  77. package/lib/cache/ResolverCachePlugin.js +2 -0
  78. package/lib/cache/mergeEtags.js +2 -0
  79. package/lib/cli.js +109 -19
  80. package/lib/config/browserslistTargetHandler.js +99 -0
  81. package/lib/config/defaults.js +147 -7
  82. package/lib/config/defineConfig.js +31 -0
  83. package/lib/config/normalization.js +5 -0
  84. package/lib/config/target.js +181 -2
  85. package/lib/container/ContainerEntryModule.js +15 -14
  86. package/lib/container/ContainerExposedDependency.js +2 -2
  87. package/lib/container/ContainerReferencePlugin.js +1 -1
  88. package/lib/container/FallbackDependency.js +5 -7
  89. package/lib/container/FallbackModule.js +10 -9
  90. package/lib/container/RemoteModule.js +20 -10
  91. package/lib/container/RemoteRuntimeModule.js +14 -12
  92. package/lib/css/CssGenerator.js +353 -327
  93. package/lib/css/CssInjectStyleRuntimeModule.js +36 -8
  94. package/lib/css/CssLoadingRuntimeModule.js +118 -47
  95. package/lib/css/CssModule.js +52 -23
  96. package/lib/css/CssModulesPlugin.js +107 -124
  97. package/lib/css/CssParser.js +2759 -2205
  98. package/lib/css/syntax.js +2859 -0
  99. package/lib/debug/ProfilingPlugin.js +2 -0
  100. package/lib/deno/DenoTargetPlugin.js +47 -0
  101. package/lib/dependencies/AMDDefineDependency.js +22 -17
  102. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +1 -0
  103. package/lib/dependencies/AMDRequireArrayDependency.js +7 -11
  104. package/lib/dependencies/AMDRequireContextDependency.js +7 -11
  105. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +1 -0
  106. package/lib/dependencies/AMDRequireDependency.js +24 -20
  107. package/lib/dependencies/CachedConstDependency.js +3 -0
  108. package/lib/dependencies/CommonJsDependencyHelpers.js +1 -0
  109. package/lib/dependencies/CommonJsExportRequireDependency.js +79 -31
  110. package/lib/dependencies/CommonJsExportsDependency.js +21 -16
  111. package/lib/dependencies/CommonJsExportsParserPlugin.js +230 -7
  112. package/lib/dependencies/CommonJsFullRequireDependency.js +27 -19
  113. package/lib/dependencies/CommonJsImportsParserPlugin.js +51 -16
  114. package/lib/dependencies/CommonJsPlugin.js +1 -1
  115. package/lib/dependencies/CommonJsRequireContextDependency.js +10 -13
  116. package/lib/dependencies/CommonJsRequireDependency.js +42 -11
  117. package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -14
  118. package/lib/dependencies/ConstDependency.js +16 -11
  119. package/lib/dependencies/ContextDependency.js +4 -0
  120. package/lib/dependencies/ContextDependencyTemplateAsId.js +1 -1
  121. package/lib/dependencies/ContextElementDependency.js +23 -14
  122. package/lib/dependencies/CreateRequireParserPlugin.js +1 -0
  123. package/lib/dependencies/CreateScriptUrlDependency.js +5 -7
  124. package/lib/dependencies/CriticalDependencyWarning.js +1 -0
  125. package/lib/dependencies/CssIcssExportDependency.js +512 -574
  126. package/lib/dependencies/CssIcssImportDependency.js +9 -9
  127. package/lib/dependencies/CssIcssSymbolDependency.js +22 -15
  128. package/lib/dependencies/CssImportDependency.js +25 -1
  129. package/lib/dependencies/CssUrlDependency.js +23 -14
  130. package/lib/dependencies/DllEntryDependency.js +9 -13
  131. package/lib/dependencies/ExportBindingInitFragment.js +164 -0
  132. package/lib/dependencies/ExportsInfoDependency.js +12 -12
  133. package/lib/dependencies/ExternalModuleDependency.js +8 -5
  134. package/lib/dependencies/ExternalModuleInitFragment.js +7 -5
  135. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +13 -10
  136. package/lib/dependencies/HarmonyAcceptDependency.js +11 -11
  137. package/lib/dependencies/HarmonyAcceptImportDependency.js +1 -0
  138. package/lib/dependencies/HarmonyDetectionParserPlugin.js +47 -22
  139. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +28 -2
  140. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +46 -22
  141. package/lib/dependencies/HarmonyExportExpressionDependency.js +107 -30
  142. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -9
  143. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +109 -31
  144. package/lib/dependencies/HarmonyExportInitFragment.js +18 -15
  145. package/lib/dependencies/HarmonyExportSpecifierDependency.js +83 -18
  146. package/lib/dependencies/HarmonyExports.js +4 -1
  147. package/lib/dependencies/HarmonyImportDependency.js +24 -0
  148. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +110 -74
  149. package/lib/dependencies/HarmonyImportGuard.js +254 -0
  150. package/lib/dependencies/HarmonyImportSideEffectDependency.js +18 -1
  151. package/lib/dependencies/HarmonyImportSpecifierDependency.js +118 -14
  152. package/lib/dependencies/HarmonyLinkingError.js +1 -0
  153. package/lib/dependencies/HarmonyModulesPlugin.js +1 -0
  154. package/lib/dependencies/{HtmlScriptSrcDependency.js → HtmlEntryDependency.js} +261 -109
  155. package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
  156. package/lib/dependencies/HtmlInlineScriptDependency.js +17 -13
  157. package/lib/dependencies/HtmlInlineStyleDependency.js +45 -11
  158. package/lib/dependencies/ImportContextDependency.js +5 -9
  159. package/lib/dependencies/ImportDependency.js +44 -2
  160. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -0
  161. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -0
  162. package/lib/dependencies/ImportMetaPlugin.js +74 -30
  163. package/lib/dependencies/ImportParserPlugin.js +19 -0
  164. package/lib/dependencies/ImportWeakDependency.js +1 -0
  165. package/lib/dependencies/JsonExportsDependency.js +9 -9
  166. package/lib/dependencies/LoaderImportDependency.js +1 -0
  167. package/lib/dependencies/LocalModule.js +11 -12
  168. package/lib/dependencies/LocalModuleDependency.js +11 -13
  169. package/lib/dependencies/ModuleDecoratorDependency.js +9 -9
  170. package/lib/dependencies/ModuleDependency.js +7 -0
  171. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -0
  172. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -0
  173. package/lib/dependencies/ModuleInitFragmentDependency.js +15 -11
  174. package/lib/dependencies/ProvidedDependency.js +31 -27
  175. package/lib/dependencies/PureExpressionDependency.js +7 -9
  176. package/lib/dependencies/RequireEnsureDependency.js +12 -13
  177. package/lib/dependencies/RequireHeaderDependency.js +3 -4
  178. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +3 -0
  179. package/lib/dependencies/RequireResolveContextDependency.js +7 -11
  180. package/lib/dependencies/RequireResolveDependency.js +1 -0
  181. package/lib/dependencies/RequireResolveHeaderDependency.js +3 -5
  182. package/lib/dependencies/RuntimeRequirementsDependency.js +6 -7
  183. package/lib/dependencies/StaticExportsDependency.js +10 -10
  184. package/lib/dependencies/SystemPlugin.js +2 -0
  185. package/lib/dependencies/URLContextDependency.js +5 -7
  186. package/lib/dependencies/URLDependency.js +14 -16
  187. package/lib/dependencies/UnsupportedDependency.js +8 -13
  188. package/lib/dependencies/WebAssemblyExportImportedDependency.js +11 -16
  189. package/lib/dependencies/WebAssemblyImportDependency.js +14 -16
  190. package/lib/dependencies/WebpackIsIncludedDependency.js +1 -0
  191. package/lib/dependencies/WorkerDependency.js +19 -8
  192. package/lib/dependencies/WorkerPlugin.js +22 -6
  193. package/lib/dependencies/processExportInfo.js +13 -11
  194. package/lib/dll/DelegatedModule.js +29 -15
  195. package/lib/dll/DelegatedModuleFactoryPlugin.js +1 -0
  196. package/lib/dll/DelegatedPlugin.js +1 -0
  197. package/lib/dll/DllEntryPlugin.js +3 -0
  198. package/lib/dll/DllModule.js +3 -2
  199. package/lib/dll/DllPlugin.js +16 -0
  200. package/lib/dll/DllReferencePlugin.js +3 -0
  201. package/lib/dll/LibManifestPlugin.js +1 -0
  202. package/lib/electron/ElectronTargetPlugin.js +22 -4
  203. package/lib/errors/ConcurrentCompilationError.js +1 -0
  204. package/lib/errors/HookWebpackError.js +11 -13
  205. package/lib/errors/IgnoreErrorModuleFactory.js +1 -0
  206. package/lib/errors/InvalidDependenciesModuleWarning.js +2 -0
  207. package/lib/errors/JSONParseError.js +9 -8
  208. package/lib/errors/ModuleBuildError.js +16 -13
  209. package/lib/errors/ModuleDependencyError.js +8 -1
  210. package/lib/errors/ModuleDependencyWarning.js +8 -1
  211. package/lib/errors/ModuleError.js +5 -11
  212. package/lib/errors/ModuleHashingError.js +4 -0
  213. package/lib/errors/ModuleNotFoundError.js +3 -0
  214. package/lib/errors/ModuleParseError.js +5 -11
  215. package/lib/errors/ModuleRestoreError.js +2 -0
  216. package/lib/errors/ModuleStoreError.js +3 -0
  217. package/lib/errors/ModuleWarning.js +7 -11
  218. package/lib/errors/NodeStuffInWebError.js +1 -0
  219. package/lib/errors/NonErrorEmittedError.js +2 -0
  220. package/lib/errors/UnhandledSchemeError.js +1 -0
  221. package/lib/esm/ModuleChunkLoadingPlugin.js +0 -1
  222. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +28 -23
  223. package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
  224. package/lib/hmr/HotModuleReplacementRuntimeModule.js +7 -0
  225. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
  226. package/lib/hmr/LazyCompilationPlugin.js +30 -6
  227. package/lib/html/HtmlGenerator.js +217 -23
  228. package/lib/html/HtmlModule.js +40 -0
  229. package/lib/html/HtmlModulesPlugin.js +219 -55
  230. package/lib/html/HtmlParser.js +1108 -1099
  231. package/lib/html/{walkHtmlTokens.js → syntax.js} +4701 -212
  232. package/lib/ids/IdHelpers.js +4 -2
  233. package/lib/index.js +19 -0
  234. package/lib/javascript/BasicEvaluatedExpression.js +1 -0
  235. package/lib/javascript/EnableChunkLoadingPlugin.js +1 -0
  236. package/lib/javascript/JavascriptGenerator.js +6 -2
  237. package/lib/javascript/JavascriptModule.js +54 -0
  238. package/lib/javascript/JavascriptModulesPlugin.js +257 -102
  239. package/lib/javascript/JavascriptParser.js +285 -158
  240. package/lib/json/JsonModule.js +40 -0
  241. package/lib/json/JsonModulesPlugin.js +7 -0
  242. package/lib/json/JsonParser.js +4 -2
  243. package/lib/library/AssignLibraryPlugin.js +5 -3
  244. package/lib/library/ExportPropertyLibraryPlugin.js +1 -0
  245. package/lib/library/FalseIIFEUmdWarning.js +1 -0
  246. package/lib/library/ModuleLibraryPlugin.js +24 -5
  247. package/lib/library/SystemLibraryPlugin.js +3 -3
  248. package/lib/node/NodeTargetPlugin.js +1 -0
  249. package/lib/node/NodeWatchFileSystem.js +1 -0
  250. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +10 -9
  251. package/lib/node/RequireChunkLoadingRuntimeModule.js +18 -16
  252. package/lib/optimize/ConcatenatedModule.js +395 -77
  253. package/lib/optimize/ConstExportsPlugin.js +211 -0
  254. package/lib/optimize/InlineExports.js +178 -0
  255. package/lib/optimize/InnerGraph.js +372 -275
  256. package/lib/optimize/InnerGraphPlugin.js +196 -99
  257. package/lib/optimize/ModuleConcatenationPlugin.js +56 -25
  258. package/lib/optimize/RealContentHashPlugin.js +14 -1
  259. package/lib/optimize/SideEffectsFlagPlugin.js +234 -64
  260. package/lib/runtime/AsyncModuleRuntimeModule.js +32 -30
  261. package/lib/runtime/AutoPublicPathRuntimeModule.js +11 -5
  262. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +1 -1
  263. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +6 -4
  264. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +33 -4
  265. package/lib/runtime/GetChunkFilenameRuntimeModule.js +82 -3
  266. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +1 -1
  267. package/lib/runtime/HasOwnPropertyRuntimeModule.js +1 -1
  268. package/lib/runtime/LoadScriptRuntimeModule.js +18 -13
  269. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +39 -26
  270. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +1 -1
  271. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -4
  272. package/lib/runtime/RelativeUrlRuntimeModule.js +3 -2
  273. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +1 -1
  274. package/lib/runtime/StartupEntrypointRuntimeModule.js +4 -3
  275. package/lib/runtime/WorkerRuntimeModule.js +33 -0
  276. package/lib/schemes/HttpUriPlugin.js +3 -2
  277. package/lib/serialization/AggregateErrorSerializer.js +7 -6
  278. package/lib/serialization/ArraySerializer.js +4 -8
  279. package/lib/serialization/BinaryMiddleware.js +538 -468
  280. package/lib/serialization/DateObjectSerializer.js +2 -2
  281. package/lib/serialization/ErrorObjectSerializer.js +7 -6
  282. package/lib/serialization/MapObjectSerializer.js +5 -9
  283. package/lib/serialization/NullPrototypeObjectSerializer.js +7 -9
  284. package/lib/serialization/ObjectMiddleware.js +50 -13
  285. package/lib/serialization/PlainObjectSerializer.js +9 -8
  286. package/lib/serialization/RegExpObjectSerializer.js +2 -2
  287. package/lib/serialization/Serializer.js +1 -0
  288. package/lib/serialization/SetObjectSerializer.js +4 -8
  289. package/lib/sharing/ConsumeSharedModule.js +6 -7
  290. package/lib/sharing/ConsumeSharedPlugin.js +1 -0
  291. package/lib/sharing/ConsumeSharedRuntimeModule.js +46 -41
  292. package/lib/sharing/ProvideSharedDependency.js +30 -15
  293. package/lib/sharing/ProvideSharedModule.js +30 -11
  294. package/lib/sharing/ProvideSharedPlugin.js +4 -2
  295. package/lib/sharing/SharePlugin.js +3 -0
  296. package/lib/sharing/ShareRuntimeModule.js +18 -16
  297. package/lib/sharing/resolveMatchedConfigs.js +2 -1
  298. package/lib/sharing/utils.js +1 -1
  299. package/lib/stats/DefaultStatsFactoryPlugin.js +4 -6
  300. package/lib/stats/DefaultStatsPrinterPlugin.js +14 -14
  301. package/lib/stats/StatsFactory.js +11 -9
  302. package/lib/stats/StatsPrinter.js +9 -2
  303. package/lib/url/URLParserPlugin.js +5 -2
  304. package/lib/util/AsyncQueue.js +10 -0
  305. package/lib/util/LazyBucketSortedSet.js +5 -0
  306. package/lib/util/LazySet.js +6 -4
  307. package/lib/util/LocConverter.js +11 -1
  308. package/lib/util/Semaphore.js +1 -0
  309. package/lib/util/SourceProcessor.js +106 -0
  310. package/lib/util/TupleSet.js +1 -0
  311. package/lib/util/WeakTupleMap.js +27 -1
  312. package/lib/util/chainedImports.js +3 -3
  313. package/lib/util/comparators.js +2 -2
  314. package/lib/util/concatenate.js +31 -7
  315. package/lib/util/createHash.js +0 -1
  316. package/lib/util/deterministicGrouping.js +19 -12
  317. package/lib/util/extractSourceMap.js +1 -1
  318. package/lib/util/findGraphRoots.js +2 -0
  319. package/lib/util/fs.js +10 -5
  320. package/lib/util/hash/DebugHash.js +1 -0
  321. package/lib/util/hash/hash-digest.js +24 -15
  322. package/lib/util/identifier.js +7 -0
  323. package/lib/util/internalSerializables.js +11 -2
  324. package/lib/util/magicComment.js +42 -0
  325. package/lib/util/makeSerializable.js +1 -0
  326. package/lib/util/nonNumericOnlyHash.js +30 -1
  327. package/lib/util/property.js +7 -1
  328. package/lib/util/publicPathPlaceholder.js +64 -0
  329. package/lib/util/registerExternalSerializer.js +4 -4
  330. package/lib/wasm-async/AsyncWasmModule.js +77 -0
  331. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +1 -1
  332. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +1 -96
  333. package/lib/wasm-async/AsyncWebAssemblyParser.js +1 -1
  334. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +1 -1
  335. package/lib/wasm-sync/SyncWasmModule.js +39 -0
  336. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +1 -0
  337. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +6 -3
  338. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +2 -1
  339. package/lib/wasm-sync/WebAssemblyGenerator.js +1 -0
  340. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +2 -0
  341. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +10 -0
  342. package/lib/wasm-sync/WebAssemblyParser.js +7 -3
  343. package/lib/web/JsonpChunkLoadingRuntimeModule.js +45 -39
  344. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +11 -10
  345. package/package.json +35 -27
  346. package/schemas/WebpackOptions.check.js +1 -1
  347. package/schemas/WebpackOptions.json +212 -3
  348. package/schemas/plugins/HtmlGeneratorOptions.check.js +1 -1
  349. package/schemas/plugins/HtmlParserOptions.check.d.ts +7 -0
  350. package/schemas/plugins/HtmlParserOptions.check.js +6 -0
  351. package/schemas/plugins/HtmlParserOptions.json +3 -0
  352. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  353. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  354. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  355. package/types.d.ts +1456 -290
  356. package/lib/css/walkCssTokens.js +0 -2020
  357. package/lib/util/AppendOnlyStackedSet.js +0 -93
@@ -5,27 +5,73 @@
5
5
  "use strict";
6
6
 
7
7
  const { RawSource } = require("webpack-sources");
8
+ const EntryOptionPlugin = require("../EntryOptionPlugin");
8
9
  const EntryPlugin = require("../EntryPlugin");
9
10
  const HotUpdateChunk = require("../HotUpdateChunk");
10
11
  const { HTML_TYPE } = require("../ModuleSourceTypeConstants");
11
12
  const { HTML_MODULE_TYPE } = require("../ModuleTypeConstants");
12
13
  const NormalModule = require("../NormalModule");
13
14
  const ConstDependency = require("../dependencies/ConstDependency");
15
+ const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
16
+ const HtmlInlineHtmlDependency = require("../dependencies/HtmlInlineHtmlDependency");
14
17
  const HtmlInlineScriptDependency = require("../dependencies/HtmlInlineScriptDependency");
15
18
  const HtmlInlineStyleDependency = require("../dependencies/HtmlInlineStyleDependency");
16
- const HtmlScriptSrcDependency = require("../dependencies/HtmlScriptSrcDependency");
17
19
  const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
18
20
  const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
21
+ const WebpackError = require("../errors/WebpackError");
19
22
  const { compareModulesByFullName } = require("../util/comparators");
23
+ const createHash = require("../util/createHash");
24
+ const { digestNonNumericOnly } = require("../util/nonNumericOnlyHash");
20
25
  const removeBOM = require("../util/removeBOM");
21
26
  const HtmlGenerator = require("./HtmlGenerator");
27
+ const HtmlModule = require("./HtmlModule");
22
28
  const HtmlParser = require("./HtmlParser");
23
29
 
30
+ /** @typedef {import("../../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescriptionNormalized */
24
31
  /** @typedef {import("../Compiler")} Compiler */
25
- /** @typedef {{ request: string, entryName: string, kind: "classic" | "esm-script" | "modulepreload" | "stylesheet" }} EntryScriptInfo */
32
+ /** @typedef {import("./HtmlModule").HtmlModuleBuildInfo} HtmlModuleBuildInfo */
33
+ /** @typedef {{ request: string, entryName: string, type: "script" | "script-module" | "modulepreload" | "stylesheet" }} EntryScriptInfo */
26
34
 
27
35
  const PLUGIN_NAME = "HtmlModulesPlugin";
28
36
 
37
+ // `\.html`/`\.css` request matchers for the synthetic `output.html` wrapper.
38
+ const HTML_REQUEST_RE = /\.html(\?|$)/i;
39
+ const CSS_REQUEST_RE = /\.css(\?|$)/i;
40
+
41
+ /**
42
+ * Requests an `output.html` page must load for an entry: its `dependOn`
43
+ * ancestors first (transitive, deduped — so a diamond loads each once), then
44
+ * the entry's own imports. `.html` imports are dropped (own HTML entries).
45
+ * @param {string} name entry name
46
+ * @param {Record<string, EntryDescriptionNormalized>} entries normalized static entries
47
+ * @returns {string[]} deduped requests in load order
48
+ */
49
+ const collectHtmlEntryRequests = (name, entries) => {
50
+ /** @type {string[]} */
51
+ const requests = [];
52
+ /** @type {Set<string>} */
53
+ const seenRequests = new Set();
54
+ /** @type {Set<string>} */
55
+ const visited = new Set();
56
+ const walk = (/** @type {string} */ entryName) => {
57
+ if (visited.has(entryName)) return;
58
+ visited.add(entryName);
59
+ const desc = entries[entryName];
60
+ if (!desc) return;
61
+ if (desc.dependOn) {
62
+ for (const dep of desc.dependOn) walk(dep);
63
+ }
64
+ if (!desc.import) return;
65
+ for (const request of desc.import) {
66
+ if (HTML_REQUEST_RE.test(request) || seenRequests.has(request)) continue;
67
+ seenRequests.add(request);
68
+ requests.push(request);
69
+ }
70
+ };
71
+ walk(name);
72
+ return requests;
73
+ };
74
+
29
75
  /**
30
76
  * @param {string} name definition name in `schemas/WebpackOptions.json`
31
77
  * @returns {EXPECTED_OBJECT} a schema referencing `#/definitions/<name>`
@@ -44,6 +90,11 @@ const generatorValidationOptions = {
44
90
  baseDataPath: "generator"
45
91
  };
46
92
 
93
+ const parserValidationOptions = {
94
+ name: "Html Modules Plugin",
95
+ baseDataPath: "parser"
96
+ };
97
+
47
98
  class HtmlModulesPlugin {
48
99
  /**
49
100
  * `output.hashFunction`/`hashSalt`/`hashDigest`/`hashDigestLength`
@@ -54,19 +105,15 @@ class HtmlModulesPlugin {
54
105
  * @returns {string} content hash
55
106
  */
56
107
  static computeContentHash(content, outputOptions) {
57
- const createHash = require("../util/createHash");
58
- const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
59
-
60
108
  const hash = createHash(
61
109
  /** @type {import("../../declarations/WebpackOptions").HashFunction} */
62
110
  (outputOptions.hashFunction)
63
111
  );
64
112
  if (outputOptions.hashSalt) hash.update(outputOptions.hashSalt);
65
113
  hash.update(content);
66
- return nonNumericOnlyHash(
67
- /** @type {string} */ (
68
- hash.digest(/** @type {string} */ (outputOptions.hashDigest))
69
- ),
114
+ return digestNonNumericOnly(
115
+ hash,
116
+ /** @type {string} */ (outputOptions.hashDigest),
70
117
  /** @type {number} */ (outputOptions.hashDigestLength)
71
118
  );
72
119
  }
@@ -77,14 +124,75 @@ class HtmlModulesPlugin {
77
124
  * @returns {void}
78
125
  */
79
126
  apply(compiler) {
127
+ const { output } = compiler.options;
128
+ const htmlOption = output.html;
129
+ const scriptLoading =
130
+ (typeof htmlOption === "object" && htmlOption.scriptLoading) || "auto";
131
+ // ESM output emits `type="module"` (already deferred), so scriptLoading
132
+ // is ignored under output.module — warn on an explicit defer/blocking.
133
+ let scriptAttr = " defer";
134
+ if (output.module) {
135
+ scriptAttr = "";
136
+ if (scriptLoading === "defer" || scriptLoading === "blocking") {
137
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
138
+ compilation.warnings.push(
139
+ new WebpackError(
140
+ `output.html.scriptLoading: "${scriptLoading}" is ignored with output.module — ES module scripts are always deferred.`
141
+ )
142
+ );
143
+ });
144
+ }
145
+ } else if (scriptLoading === "blocking") {
146
+ scriptAttr = "";
147
+ }
148
+
149
+ // `output.html` (or an entry's `html`) wraps a non-HTML entry in a
150
+ // synthetic HTML module so the existing pipeline injects its JS/CSS
151
+ // chunks and applies the `template` option. `dependOn` ancestors are
152
+ // injected first so the page loads the shared/runtime chunks before
153
+ // the entry's own (see `collectHtmlEntryRequests`). `crossOriginLoading`
154
+ // and SRI are applied to the injected tags centrally in
155
+ // HtmlEntryDependency.
156
+ EntryOptionPlugin.getHooks(compiler).entry.tap(
157
+ PLUGIN_NAME,
158
+ (context, name, desc) => {
159
+ const html = desc.html !== undefined ? desc.html : htmlOption;
160
+ const imports = desc.import;
161
+ if (
162
+ !html ||
163
+ !imports ||
164
+ imports.every((r) => HTML_REQUEST_RE.test(r))
165
+ ) {
166
+ return;
167
+ }
168
+ const entries = compiler.options.entry;
169
+ const requests =
170
+ typeof entries === "object" && entries[name]
171
+ ? collectHtmlEntryRequests(name, entries)
172
+ : imports.filter((r) => !HTML_REQUEST_RE.test(r));
173
+ const links = [];
174
+ const scripts = [];
175
+ for (const r of requests) {
176
+ if (CSS_REQUEST_RE.test(r)) {
177
+ links.push(`<link rel="stylesheet" href="${r}">`);
178
+ } else {
179
+ scripts.push(`<script${scriptAttr} src="${r}"></script>`);
180
+ }
181
+ }
182
+ return `data:text/html,<!doctype html><html><head>${links.join(
183
+ ""
184
+ )}</head><body>${scripts.join("")}</body></html>`;
185
+ }
186
+ );
187
+
80
188
  // Per-chunk `RawSource` reused across builds when bytes are unchanged:
81
189
  // keeping identity stable avoids invalidating `RealContentHashPlugin|analyse`.
82
190
  /** @type {Map<string, { content: string, source: import("webpack-sources").RawSource }>} */
83
191
  const sentinelResolvedSourceCache = new Map();
84
192
 
85
193
  // `<script src>` and `<link rel="modulepreload">` references collected
86
- // by HtmlParser become real compilation entries here. The classic
87
- // and esm-script groups are chained via a leader-only dependOn so
194
+ // by HtmlParser become real compilation entries here. The `script`
195
+ // and `script-module` groups are chained via a leader-only dependOn so
88
196
  // they share a runtime — the first entry of the group owns it and
89
197
  // every subsequent entry sets `dependOn: [leader]`. Modulepreload
90
198
  // entries are emitted as independent entries (no dependOn) so they
@@ -102,17 +210,16 @@ class HtmlModulesPlugin {
102
210
 
103
211
  for (const module of compilation.modules) {
104
212
  if (module.type !== HTML_MODULE_TYPE) continue;
105
- const buildInfo = module.buildInfo;
106
- const htmlEntryScripts =
107
- buildInfo &&
108
- /** @type {Record<string, EntryScriptInfo[]> | undefined} */
109
- (buildInfo.htmlEntryScripts);
213
+ const buildInfo = /** @type {HtmlModuleBuildInfo | undefined} */ (
214
+ module.buildInfo
215
+ );
216
+ const htmlEntryScripts = buildInfo && buildInfo.htmlEntryScripts;
110
217
  if (!htmlEntryScripts) continue;
111
218
 
112
219
  const context = /** @type {string} */ (module.context);
113
220
 
114
221
  for (const [groupKind, group] of Object.entries(htmlEntryScripts)) {
115
- // Only the script chains (`classic`, `esm-script`) need a
222
+ // Only the script chains (`script`, `script-module`) need a
116
223
  // shared runtime via leader-only `dependOn` — the others
117
224
  // either preload without executing (`modulepreload`) or
118
225
  // produce CSS chunks (`stylesheet`) which have no runtime
@@ -214,12 +321,12 @@ class HtmlModulesPlugin {
214
321
  new HtmlSourceDependency.Template()
215
322
  );
216
323
  compilation.dependencyFactories.set(
217
- HtmlScriptSrcDependency,
324
+ HtmlEntryDependency,
218
325
  normalModuleFactory
219
326
  );
220
327
  compilation.dependencyTemplates.set(
221
- HtmlScriptSrcDependency,
222
- new HtmlScriptSrcDependency.Template()
328
+ HtmlEntryDependency,
329
+ new HtmlEntryDependency.Template()
223
330
  );
224
331
  // Inline `<script>` content is bundled as its own entry — the
225
332
  // same pipeline that handles `<script src>` — via a
@@ -246,6 +353,17 @@ class HtmlModulesPlugin {
246
353
  HtmlInlineStyleDependency,
247
354
  new HtmlInlineStyleDependency.Template()
248
355
  );
356
+ // `<iframe srcdoc>` content is routed back through the HTML
357
+ // pipeline as a `data:text/html` module; the template reads the
358
+ // processed HTML from the nested module's `html` channel.
359
+ compilation.dependencyFactories.set(
360
+ HtmlInlineHtmlDependency,
361
+ normalModuleFactory
362
+ );
363
+ compilation.dependencyTemplates.set(
364
+ HtmlInlineHtmlDependency,
365
+ new HtmlInlineHtmlDependency.Template()
366
+ );
249
367
  compilation.dependencyTemplates.set(
250
368
  StaticExportsDependency,
251
369
  new StaticExportsDependency.Template()
@@ -258,21 +376,26 @@ class HtmlModulesPlugin {
258
376
  ConstDependency,
259
377
  new ConstDependency.Template()
260
378
  );
261
- const cssEnabled = Boolean(
262
- compiler.options.experiments && compiler.options.experiments.css
263
- );
264
- normalModuleFactory.hooks.createParser
379
+ normalModuleFactory.hooks.createModuleClass
265
380
  .for(HTML_MODULE_TYPE)
266
381
  .tap(
267
382
  PLUGIN_NAME,
268
- () =>
269
- new HtmlParser(
270
- compilation.outputOptions.hashFunction,
271
- compiler.context,
272
- compilation.outputOptions.module,
273
- cssEnabled
274
- )
383
+ (createData, _resolveData) => new HtmlModule(createData)
275
384
  );
385
+ normalModuleFactory.hooks.createParser
386
+ .for(HTML_MODULE_TYPE)
387
+ .tap(PLUGIN_NAME, (parserOptions) => {
388
+ compiler.validate(
389
+ () => getSchema("HtmlParserOptions"),
390
+ parserOptions,
391
+ parserValidationOptions,
392
+ (options) =>
393
+ require("../../schemas/plugins/HtmlParserOptions.check")(
394
+ options
395
+ )
396
+ );
397
+ return new HtmlParser(parserOptions);
398
+ });
276
399
 
277
400
  normalModuleFactory.hooks.createGenerator
278
401
  .for(HTML_MODULE_TYPE)
@@ -294,8 +417,13 @@ class HtmlModulesPlugin {
294
417
  (result, module) => {
295
418
  if (module.type === HTML_MODULE_TYPE) {
296
419
  const [source, ...rest] = result;
420
+ // `applyTemplate` is a no-op unless `module.parser.html.template`
421
+ // is set. Running it here (where the returned source becomes the
422
+ // module's stored source) keeps the parser's dependency offsets
423
+ // and the generator's render base in sync.
424
+ const parser = /** @type {HtmlParser} */ (module.parser);
297
425
 
298
- return [removeBOM(source), ...rest];
426
+ return [parser.applyTemplate(removeBOM(source), module), ...rest];
299
427
  }
300
428
 
301
429
  return result;
@@ -327,9 +455,19 @@ class HtmlModulesPlugin {
327
455
  getUndoPath,
328
456
  makePathsRelative
329
457
  } = require("../util/identifier");
330
- const CssUrlDependency = require("../dependencies/CssUrlDependency");
331
-
332
- const autoPlaceholder = CssUrlDependency.PUBLIC_PATH_AUTO;
458
+ const {
459
+ PUBLIC_PATH_AUTO: autoPlaceholder
460
+ } = require("../util/publicPathPlaceholder");
461
+
462
+ // Sentinel-resolved content and its content hash depend only on
463
+ // the HTML-type module source — not on the chunk or output
464
+ // filename — yet `renderManifest` runs per `(chunk, module)`.
465
+ // Memoize so a module landing in multiple chunks resolves and
466
+ // hashes its sentinels once. Scoped to this compilation because
467
+ // sentinel resolution embeds chunk filenames, which change
468
+ // across rebuilds; weakly keyed by source so entries release.
469
+ /** @type {WeakMap<import("webpack-sources").Source, { resolvedContent: string, contentHash: string }>} */
470
+ const resolvedSentinelHashCache = new WeakMap();
333
471
 
334
472
  compilation.hooks.renderManifest.tap(
335
473
  PLUGIN_NAME,
@@ -357,30 +495,56 @@ class HtmlModulesPlugin {
357
495
  const placeholderSource = codeGenResult.sources.get(HTML_TYPE);
358
496
  if (!placeholderSource) continue;
359
497
 
498
+ // `<iframe srcdoc>` modules expose `html` only so
499
+ // HtmlInlineHtmlDependency can write the processed markup back
500
+ // into the host attribute — they are never standalone pages.
501
+ // `generator.extract: "inline"` marks them so no `.html` file is
502
+ // emitted; without this they'd collide on the `data:text/html`
503
+ // → chunk-name path below (every srcdoc module in a chunk would
504
+ // emit `<chunk>.html`). An O(1) flag check, not a scan.
505
+ const generatorOptions = normalModule.generatorOptions;
506
+ if (generatorOptions && generatorOptions.extract === "inline") {
507
+ continue;
508
+ }
509
+
360
510
  const filenameTemplate = chunk.canBeInitial()
361
511
  ? outputOptions.htmlFilename
362
512
  : outputOptions.htmlChunkFilename;
363
513
 
364
- const sourceFilename = makePathsRelative(
365
- compiler.context,
366
- /** @type {string} */
367
- (normalModule.getResource() || normalModule.resource),
368
- compiler.root
369
- ).replace(/^\.\//, "");
370
-
371
- const placeholderContent = /** @type {string} */ (
372
- placeholderSource.source()
373
- );
374
- // Resolve sentinels *before* hashing so the HTML's `[contenthash]`
375
- // invalidates with the referenced chunks' filenames.
376
- const resolvedContent = HtmlGenerator.resolveChunkUrlSentinels(
377
- placeholderContent,
378
- compilation
379
- );
380
- const contentHash = HtmlModulesPlugin.computeContentHash(
381
- resolvedContent,
382
- outputOptions
383
- );
514
+ const resource =
515
+ normalModule.getResource() || normalModule.resource;
516
+ // Synthetic `output.html` entries are `data:text/html` modules
517
+ // with no real basename — name the file after the entry instead.
518
+ const sourceFilename =
519
+ resource.startsWith("data:text/html") && chunk.name
520
+ ? chunk.name
521
+ : makePathsRelative(
522
+ compiler.context,
523
+ /** @type {string} */ (resource),
524
+ compiler.root
525
+ ).replace(/^\.\//, "");
526
+
527
+ let cached = resolvedSentinelHashCache.get(placeholderSource);
528
+ if (cached === undefined) {
529
+ const placeholderContent = /** @type {string} */ (
530
+ placeholderSource.source()
531
+ );
532
+ // Resolve sentinels *before* hashing so the HTML's `[contenthash]`
533
+ // invalidates with the referenced chunks' filenames.
534
+ const resolvedContent = HtmlGenerator.resolveChunkUrlSentinels(
535
+ placeholderContent,
536
+ compilation
537
+ );
538
+ cached = {
539
+ resolvedContent,
540
+ contentHash: HtmlModulesPlugin.computeContentHash(
541
+ resolvedContent,
542
+ outputOptions
543
+ )
544
+ };
545
+ resolvedSentinelHashCache.set(placeholderSource, cached);
546
+ }
547
+ const { resolvedContent, contentHash } = cached;
384
548
 
385
549
  const { path: filename, info } = compilation.getPathWithInfo(
386
550
  /** @type {import("../TemplatedPathPlugin").TemplatePath} */