webpack 5.107.1 → 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 (360) 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 +52 -14
  10. package/lib/ConcatenationScope.js +10 -3
  11. package/lib/ContextExclusionPlugin.js +1 -0
  12. package/lib/ContextModule.js +92 -47
  13. package/lib/ContextModuleFactory.js +45 -38
  14. package/lib/ContextReplacementPlugin.js +4 -0
  15. package/lib/DefinePlugin.js +89 -15
  16. package/lib/Dependency.js +111 -7
  17. package/lib/EntryOptionPlugin.js +39 -2
  18. package/lib/EntryPlugin.js +2 -0
  19. package/lib/ExportsInfo.js +314 -73
  20. package/lib/ExternalModule.js +82 -34
  21. package/lib/ExternalModuleFactoryPlugin.js +1 -0
  22. package/lib/ExternalsPlugin.js +1 -0
  23. package/lib/FileSystemInfo.js +173 -23
  24. package/lib/FlagAllModulesAsUsedPlugin.js +1 -5
  25. package/lib/FlagDependencyExportsPlugin.js +23 -0
  26. package/lib/FlagDependencyUsagePlugin.js +87 -5
  27. package/lib/FlagEntryExportAsUsedPlugin.js +2 -0
  28. package/lib/Generator.js +8 -0
  29. package/lib/HotModuleReplacementPlugin.js +65 -28
  30. package/lib/IgnorePlugin.js +1 -0
  31. package/lib/InitFragment.js +5 -0
  32. package/lib/JavascriptMetaInfoPlugin.js +7 -5
  33. package/lib/LazyBarrel.js +361 -0
  34. package/lib/LoaderTargetPlugin.js +1 -0
  35. package/lib/Module.js +21 -42
  36. package/lib/ModuleGraph.js +3 -2
  37. package/lib/ModuleProfile.js +27 -1
  38. package/lib/ModuleTemplate.js +2 -0
  39. package/lib/MultiCompiler.js +16 -0
  40. package/lib/MultiStats.js +1 -0
  41. package/lib/MultiWatching.js +2 -0
  42. package/lib/NodeStuffPlugin.js +22 -17
  43. package/lib/NormalModule.js +557 -77
  44. package/lib/NormalModuleReplacementPlugin.js +2 -0
  45. package/lib/PrefetchPlugin.js +2 -0
  46. package/lib/ProgressPlugin.js +9 -1
  47. package/lib/ProvidePlugin.js +1 -0
  48. package/lib/RawModule.js +20 -16
  49. package/lib/RecordIdsPlugin.js +1 -0
  50. package/lib/RuntimeGlobals.js +5 -0
  51. package/lib/RuntimePlugin.js +58 -26
  52. package/lib/RuntimeTemplate.js +278 -21
  53. package/lib/SelfModuleFactory.js +1 -0
  54. package/lib/SourceMapDevToolPlugin.js +105 -30
  55. package/lib/Stats.js +1 -0
  56. package/lib/Template.js +8 -2
  57. package/lib/TemplatedPathPlugin.js +473 -131
  58. package/lib/WarnCaseSensitiveModulesPlugin.js +1 -0
  59. package/lib/WarnDeprecatedOptionPlugin.js +4 -0
  60. package/lib/WarnNoModeSetPlugin.js +1 -0
  61. package/lib/WatchIgnorePlugin.js +1 -0
  62. package/lib/Watching.js +9 -0
  63. package/lib/WebpackOptionsApply.js +50 -5
  64. package/lib/asset/AssetBytesGenerator.js +11 -3
  65. package/lib/asset/AssetGenerator.js +47 -22
  66. package/lib/asset/AssetModule.js +47 -0
  67. package/lib/asset/AssetModulesPlugin.js +14 -14
  68. package/lib/asset/AssetParser.js +2 -2
  69. package/lib/asset/AssetSourceGenerator.js +8 -0
  70. package/lib/asset/RawDataUrlModule.js +12 -13
  71. package/lib/buildChunkGraph.js +88 -9
  72. package/lib/bun/BunTargetPlugin.js +48 -0
  73. package/lib/cache/AddBuildDependenciesPlugin.js +1 -0
  74. package/lib/cache/AddManagedPathsPlugin.js +3 -0
  75. package/lib/cache/IdleFileCachePlugin.js +4 -0
  76. package/lib/cache/MemoryWithGcCachePlugin.js +1 -0
  77. package/lib/cache/PackFileCacheStrategy.js +1 -0
  78. package/lib/cache/ResolverCachePlugin.js +2 -0
  79. package/lib/cache/getLazyHashedEtag.js +9 -2
  80. package/lib/cache/mergeEtags.js +2 -0
  81. package/lib/cli.js +109 -19
  82. package/lib/config/browserslistTargetHandler.js +99 -0
  83. package/lib/config/defaults.js +147 -7
  84. package/lib/config/defineConfig.js +31 -0
  85. package/lib/config/normalization.js +5 -0
  86. package/lib/config/target.js +181 -2
  87. package/lib/container/ContainerEntryModule.js +15 -14
  88. package/lib/container/ContainerExposedDependency.js +2 -2
  89. package/lib/container/ContainerReferencePlugin.js +1 -1
  90. package/lib/container/FallbackDependency.js +5 -7
  91. package/lib/container/FallbackModule.js +10 -9
  92. package/lib/container/RemoteModule.js +20 -10
  93. package/lib/container/RemoteRuntimeModule.js +14 -12
  94. package/lib/css/CssGenerator.js +353 -327
  95. package/lib/css/CssInjectStyleRuntimeModule.js +36 -8
  96. package/lib/css/CssLoadingRuntimeModule.js +118 -47
  97. package/lib/css/CssModule.js +52 -23
  98. package/lib/css/CssModulesPlugin.js +107 -124
  99. package/lib/css/CssParser.js +2759 -2205
  100. package/lib/css/syntax.js +2859 -0
  101. package/lib/debug/ProfilingPlugin.js +2 -0
  102. package/lib/deno/DenoTargetPlugin.js +47 -0
  103. package/lib/dependencies/AMDDefineDependency.js +22 -17
  104. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +1 -0
  105. package/lib/dependencies/AMDRequireArrayDependency.js +7 -11
  106. package/lib/dependencies/AMDRequireContextDependency.js +7 -11
  107. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +1 -0
  108. package/lib/dependencies/AMDRequireDependency.js +24 -20
  109. package/lib/dependencies/CachedConstDependency.js +3 -0
  110. package/lib/dependencies/CommonJsDependencyHelpers.js +1 -0
  111. package/lib/dependencies/CommonJsExportRequireDependency.js +79 -31
  112. package/lib/dependencies/CommonJsExportsDependency.js +21 -16
  113. package/lib/dependencies/CommonJsExportsParserPlugin.js +230 -7
  114. package/lib/dependencies/CommonJsFullRequireDependency.js +27 -19
  115. package/lib/dependencies/CommonJsImportsParserPlugin.js +51 -16
  116. package/lib/dependencies/CommonJsPlugin.js +1 -1
  117. package/lib/dependencies/CommonJsRequireContextDependency.js +10 -13
  118. package/lib/dependencies/CommonJsRequireDependency.js +42 -11
  119. package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -14
  120. package/lib/dependencies/ConstDependency.js +16 -11
  121. package/lib/dependencies/ContextDependency.js +4 -0
  122. package/lib/dependencies/ContextDependencyTemplateAsId.js +1 -1
  123. package/lib/dependencies/ContextElementDependency.js +23 -14
  124. package/lib/dependencies/CreateRequireParserPlugin.js +1 -0
  125. package/lib/dependencies/CreateScriptUrlDependency.js +5 -7
  126. package/lib/dependencies/CriticalDependencyWarning.js +1 -0
  127. package/lib/dependencies/CssIcssExportDependency.js +512 -574
  128. package/lib/dependencies/CssIcssImportDependency.js +9 -9
  129. package/lib/dependencies/CssIcssSymbolDependency.js +22 -15
  130. package/lib/dependencies/CssImportDependency.js +25 -1
  131. package/lib/dependencies/CssUrlDependency.js +23 -14
  132. package/lib/dependencies/DllEntryDependency.js +9 -13
  133. package/lib/dependencies/ExportBindingInitFragment.js +164 -0
  134. package/lib/dependencies/ExportsInfoDependency.js +12 -12
  135. package/lib/dependencies/ExternalModuleDependency.js +8 -5
  136. package/lib/dependencies/ExternalModuleInitFragment.js +7 -5
  137. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +13 -10
  138. package/lib/dependencies/HarmonyAcceptDependency.js +11 -11
  139. package/lib/dependencies/HarmonyAcceptImportDependency.js +1 -0
  140. package/lib/dependencies/HarmonyDetectionParserPlugin.js +47 -22
  141. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +28 -2
  142. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +46 -22
  143. package/lib/dependencies/HarmonyExportExpressionDependency.js +107 -30
  144. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -9
  145. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +109 -31
  146. package/lib/dependencies/HarmonyExportInitFragment.js +22 -20
  147. package/lib/dependencies/HarmonyExportSpecifierDependency.js +83 -18
  148. package/lib/dependencies/HarmonyExports.js +4 -1
  149. package/lib/dependencies/HarmonyImportDependency.js +24 -0
  150. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +110 -74
  151. package/lib/dependencies/HarmonyImportGuard.js +254 -0
  152. package/lib/dependencies/HarmonyImportSideEffectDependency.js +18 -1
  153. package/lib/dependencies/HarmonyImportSpecifierDependency.js +118 -14
  154. package/lib/dependencies/HarmonyLinkingError.js +1 -0
  155. package/lib/dependencies/HarmonyModulesPlugin.js +1 -0
  156. package/lib/dependencies/{HtmlScriptSrcDependency.js → HtmlEntryDependency.js} +267 -154
  157. package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
  158. package/lib/dependencies/HtmlInlineScriptDependency.js +20 -27
  159. package/lib/dependencies/HtmlInlineStyleDependency.js +62 -11
  160. package/lib/dependencies/HtmlSourceDependency.js +18 -0
  161. package/lib/dependencies/ImportContextDependency.js +5 -9
  162. package/lib/dependencies/ImportDependency.js +44 -2
  163. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -0
  164. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -0
  165. package/lib/dependencies/ImportMetaPlugin.js +74 -30
  166. package/lib/dependencies/ImportParserPlugin.js +19 -0
  167. package/lib/dependencies/ImportWeakDependency.js +1 -0
  168. package/lib/dependencies/JsonExportsDependency.js +9 -9
  169. package/lib/dependencies/LoaderImportDependency.js +1 -0
  170. package/lib/dependencies/LocalModule.js +11 -12
  171. package/lib/dependencies/LocalModuleDependency.js +11 -13
  172. package/lib/dependencies/ModuleDecoratorDependency.js +9 -9
  173. package/lib/dependencies/ModuleDependency.js +7 -0
  174. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -0
  175. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -0
  176. package/lib/dependencies/ModuleInitFragmentDependency.js +15 -11
  177. package/lib/dependencies/ProvidedDependency.js +31 -27
  178. package/lib/dependencies/PureExpressionDependency.js +7 -9
  179. package/lib/dependencies/RequireEnsureDependency.js +12 -13
  180. package/lib/dependencies/RequireHeaderDependency.js +3 -4
  181. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +3 -0
  182. package/lib/dependencies/RequireResolveContextDependency.js +7 -11
  183. package/lib/dependencies/RequireResolveDependency.js +1 -0
  184. package/lib/dependencies/RequireResolveHeaderDependency.js +3 -5
  185. package/lib/dependencies/RuntimeRequirementsDependency.js +6 -7
  186. package/lib/dependencies/StaticExportsDependency.js +10 -10
  187. package/lib/dependencies/SystemPlugin.js +2 -0
  188. package/lib/dependencies/URLContextDependency.js +5 -7
  189. package/lib/dependencies/URLDependency.js +14 -16
  190. package/lib/dependencies/UnsupportedDependency.js +8 -13
  191. package/lib/dependencies/WebAssemblyExportImportedDependency.js +11 -16
  192. package/lib/dependencies/WebAssemblyImportDependency.js +14 -16
  193. package/lib/dependencies/WebpackIsIncludedDependency.js +1 -0
  194. package/lib/dependencies/WorkerDependency.js +19 -8
  195. package/lib/dependencies/WorkerPlugin.js +40 -10
  196. package/lib/dependencies/processExportInfo.js +13 -11
  197. package/lib/dll/DelegatedModule.js +29 -15
  198. package/lib/dll/DelegatedModuleFactoryPlugin.js +1 -0
  199. package/lib/dll/DelegatedPlugin.js +1 -0
  200. package/lib/dll/DllEntryPlugin.js +3 -0
  201. package/lib/dll/DllModule.js +3 -2
  202. package/lib/dll/DllPlugin.js +16 -0
  203. package/lib/dll/DllReferencePlugin.js +3 -0
  204. package/lib/dll/LibManifestPlugin.js +1 -0
  205. package/lib/electron/ElectronTargetPlugin.js +22 -4
  206. package/lib/errors/ConcurrentCompilationError.js +1 -0
  207. package/lib/errors/HookWebpackError.js +11 -13
  208. package/lib/errors/IgnoreErrorModuleFactory.js +1 -0
  209. package/lib/errors/InvalidDependenciesModuleWarning.js +2 -0
  210. package/lib/errors/JSONParseError.js +9 -8
  211. package/lib/errors/ModuleBuildError.js +16 -13
  212. package/lib/errors/ModuleDependencyError.js +8 -1
  213. package/lib/errors/ModuleDependencyWarning.js +8 -1
  214. package/lib/errors/ModuleError.js +5 -11
  215. package/lib/errors/ModuleHashingError.js +4 -0
  216. package/lib/errors/ModuleNotFoundError.js +3 -0
  217. package/lib/errors/ModuleParseError.js +5 -11
  218. package/lib/errors/ModuleRestoreError.js +2 -0
  219. package/lib/errors/ModuleStoreError.js +3 -0
  220. package/lib/errors/ModuleWarning.js +7 -11
  221. package/lib/errors/NodeStuffInWebError.js +1 -0
  222. package/lib/errors/NonErrorEmittedError.js +2 -0
  223. package/lib/errors/UnhandledSchemeError.js +1 -0
  224. package/lib/esm/ModuleChunkLoadingPlugin.js +0 -1
  225. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +28 -23
  226. package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
  227. package/lib/hmr/HotModuleReplacementRuntimeModule.js +7 -0
  228. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
  229. package/lib/hmr/LazyCompilationPlugin.js +134 -6
  230. package/lib/html/HtmlGenerator.js +292 -50
  231. package/lib/html/HtmlModule.js +40 -0
  232. package/lib/html/HtmlModulesPlugin.js +287 -60
  233. package/lib/html/HtmlParser.js +1108 -1099
  234. package/lib/html/{walkHtmlTokens.js → syntax.js} +4701 -212
  235. package/lib/ids/IdHelpers.js +4 -2
  236. package/lib/index.js +19 -0
  237. package/lib/javascript/BasicEvaluatedExpression.js +1 -0
  238. package/lib/javascript/EnableChunkLoadingPlugin.js +1 -0
  239. package/lib/javascript/JavascriptGenerator.js +6 -2
  240. package/lib/javascript/JavascriptModule.js +54 -0
  241. package/lib/javascript/JavascriptModulesPlugin.js +257 -102
  242. package/lib/javascript/JavascriptParser.js +286 -159
  243. package/lib/json/JsonModule.js +40 -0
  244. package/lib/json/JsonModulesPlugin.js +7 -0
  245. package/lib/json/JsonParser.js +4 -2
  246. package/lib/library/AssignLibraryPlugin.js +5 -3
  247. package/lib/library/ExportPropertyLibraryPlugin.js +1 -0
  248. package/lib/library/FalseIIFEUmdWarning.js +1 -0
  249. package/lib/library/ModuleLibraryPlugin.js +54 -29
  250. package/lib/library/SystemLibraryPlugin.js +3 -3
  251. package/lib/node/NodeTargetPlugin.js +1 -0
  252. package/lib/node/NodeWatchFileSystem.js +38 -22
  253. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +10 -9
  254. package/lib/node/RequireChunkLoadingRuntimeModule.js +18 -16
  255. package/lib/optimize/ConcatenatedModule.js +397 -78
  256. package/lib/optimize/ConstExportsPlugin.js +211 -0
  257. package/lib/optimize/InlineExports.js +178 -0
  258. package/lib/optimize/InnerGraph.js +372 -275
  259. package/lib/optimize/InnerGraphPlugin.js +196 -99
  260. package/lib/optimize/ModuleConcatenationPlugin.js +56 -25
  261. package/lib/optimize/RealContentHashPlugin.js +14 -1
  262. package/lib/optimize/SideEffectsFlagPlugin.js +234 -64
  263. package/lib/runtime/AsyncModuleRuntimeModule.js +32 -30
  264. package/lib/runtime/AutoPublicPathRuntimeModule.js +11 -5
  265. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +1 -1
  266. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +6 -4
  267. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +33 -4
  268. package/lib/runtime/GetChunkFilenameRuntimeModule.js +82 -3
  269. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +1 -1
  270. package/lib/runtime/HasOwnPropertyRuntimeModule.js +1 -1
  271. package/lib/runtime/LoadScriptRuntimeModule.js +18 -13
  272. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +39 -26
  273. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +1 -1
  274. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -4
  275. package/lib/runtime/RelativeUrlRuntimeModule.js +3 -2
  276. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +1 -1
  277. package/lib/runtime/StartupEntrypointRuntimeModule.js +4 -3
  278. package/lib/runtime/WorkerRuntimeModule.js +33 -0
  279. package/lib/schemes/HttpUriPlugin.js +3 -2
  280. package/lib/serialization/AggregateErrorSerializer.js +7 -6
  281. package/lib/serialization/ArraySerializer.js +4 -8
  282. package/lib/serialization/BinaryMiddleware.js +538 -468
  283. package/lib/serialization/DateObjectSerializer.js +2 -2
  284. package/lib/serialization/ErrorObjectSerializer.js +7 -6
  285. package/lib/serialization/MapObjectSerializer.js +5 -9
  286. package/lib/serialization/NullPrototypeObjectSerializer.js +7 -9
  287. package/lib/serialization/ObjectMiddleware.js +50 -13
  288. package/lib/serialization/PlainObjectSerializer.js +9 -8
  289. package/lib/serialization/RegExpObjectSerializer.js +2 -2
  290. package/lib/serialization/Serializer.js +1 -0
  291. package/lib/serialization/SetObjectSerializer.js +4 -8
  292. package/lib/sharing/ConsumeSharedModule.js +6 -7
  293. package/lib/sharing/ConsumeSharedPlugin.js +1 -0
  294. package/lib/sharing/ConsumeSharedRuntimeModule.js +46 -41
  295. package/lib/sharing/ProvideSharedDependency.js +30 -15
  296. package/lib/sharing/ProvideSharedModule.js +30 -11
  297. package/lib/sharing/ProvideSharedPlugin.js +4 -2
  298. package/lib/sharing/SharePlugin.js +3 -0
  299. package/lib/sharing/ShareRuntimeModule.js +18 -16
  300. package/lib/sharing/resolveMatchedConfigs.js +2 -1
  301. package/lib/sharing/utils.js +1 -1
  302. package/lib/stats/DefaultStatsFactoryPlugin.js +4 -6
  303. package/lib/stats/DefaultStatsPrinterPlugin.js +14 -14
  304. package/lib/stats/StatsFactory.js +11 -9
  305. package/lib/stats/StatsPrinter.js +9 -2
  306. package/lib/url/URLParserPlugin.js +5 -2
  307. package/lib/util/AsyncQueue.js +10 -0
  308. package/lib/util/LazyBucketSortedSet.js +5 -0
  309. package/lib/util/LazySet.js +6 -4
  310. package/lib/util/LocConverter.js +11 -1
  311. package/lib/util/Semaphore.js +1 -0
  312. package/lib/util/SourceProcessor.js +106 -0
  313. package/lib/util/TupleSet.js +1 -0
  314. package/lib/util/WeakTupleMap.js +27 -1
  315. package/lib/util/chainedImports.js +3 -3
  316. package/lib/util/comparators.js +2 -2
  317. package/lib/util/concatenate.js +31 -7
  318. package/lib/util/createHash.js +0 -1
  319. package/lib/util/deterministicGrouping.js +19 -12
  320. package/lib/util/extractSourceMap.js +1 -1
  321. package/lib/util/findGraphRoots.js +2 -0
  322. package/lib/util/fs.js +16 -6
  323. package/lib/util/hash/DebugHash.js +1 -0
  324. package/lib/util/hash/hash-digest.js +24 -15
  325. package/lib/util/identifier.js +7 -0
  326. package/lib/util/internalSerializables.js +11 -2
  327. package/lib/util/magicComment.js +42 -0
  328. package/lib/util/makeSerializable.js +1 -0
  329. package/lib/util/nonNumericOnlyHash.js +30 -1
  330. package/lib/util/property.js +7 -1
  331. package/lib/util/publicPathPlaceholder.js +64 -0
  332. package/lib/util/registerExternalSerializer.js +4 -4
  333. package/lib/wasm-async/AsyncWasmModule.js +77 -0
  334. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +1 -1
  335. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +1 -96
  336. package/lib/wasm-async/AsyncWebAssemblyParser.js +1 -1
  337. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +1 -1
  338. package/lib/wasm-sync/SyncWasmModule.js +39 -0
  339. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +1 -0
  340. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +6 -3
  341. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +2 -1
  342. package/lib/wasm-sync/WebAssemblyGenerator.js +1 -0
  343. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +2 -0
  344. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +10 -0
  345. package/lib/wasm-sync/WebAssemblyParser.js +7 -3
  346. package/lib/web/JsonpChunkLoadingRuntimeModule.js +45 -39
  347. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +11 -10
  348. package/package.json +36 -28
  349. package/schemas/WebpackOptions.check.js +1 -1
  350. package/schemas/WebpackOptions.json +212 -3
  351. package/schemas/plugins/HtmlGeneratorOptions.check.js +1 -1
  352. package/schemas/plugins/HtmlParserOptions.check.d.ts +7 -0
  353. package/schemas/plugins/HtmlParserOptions.check.js +6 -0
  354. package/schemas/plugins/HtmlParserOptions.json +3 -0
  355. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  356. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  357. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  358. package/types.d.ts +1592 -314
  359. package/lib/css/walkCssTokens.js +0 -2020
  360. 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,16 +90,109 @@ 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 {
99
+ /**
100
+ * `output.hashFunction`/`hashSalt`/`hashDigest`/`hashDigestLength`
101
+ * digest of `content`, with `nonNumericOnlyHash` applied — webpack's
102
+ * standard `[contenthash]` recipe.
103
+ * @param {string | Buffer} content content to hash
104
+ * @param {import("../../declarations/WebpackOptions").Output} outputOptions output options
105
+ * @returns {string} content hash
106
+ */
107
+ static computeContentHash(content, outputOptions) {
108
+ const hash = createHash(
109
+ /** @type {import("../../declarations/WebpackOptions").HashFunction} */
110
+ (outputOptions.hashFunction)
111
+ );
112
+ if (outputOptions.hashSalt) hash.update(outputOptions.hashSalt);
113
+ hash.update(content);
114
+ return digestNonNumericOnly(
115
+ hash,
116
+ /** @type {string} */ (outputOptions.hashDigest),
117
+ /** @type {number} */ (outputOptions.hashDigestLength)
118
+ );
119
+ }
120
+
48
121
  /**
49
122
  * Applies the plugin by registering its hooks on the compiler.
50
123
  * @param {Compiler} compiler the compiler instance
51
124
  * @returns {void}
52
125
  */
53
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
+
188
+ // Per-chunk `RawSource` reused across builds when bytes are unchanged:
189
+ // keeping identity stable avoids invalidating `RealContentHashPlugin|analyse`.
190
+ /** @type {Map<string, { content: string, source: import("webpack-sources").RawSource }>} */
191
+ const sentinelResolvedSourceCache = new Map();
192
+
54
193
  // `<script src>` and `<link rel="modulepreload">` references collected
55
- // by HtmlParser become real compilation entries here. The classic
56
- // 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
57
196
  // they share a runtime — the first entry of the group owns it and
58
197
  // every subsequent entry sets `dependOn: [leader]`. Modulepreload
59
198
  // entries are emitted as independent entries (no dependOn) so they
@@ -71,17 +210,16 @@ class HtmlModulesPlugin {
71
210
 
72
211
  for (const module of compilation.modules) {
73
212
  if (module.type !== HTML_MODULE_TYPE) continue;
74
- const buildInfo = module.buildInfo;
75
- const htmlEntryScripts =
76
- buildInfo &&
77
- /** @type {Record<string, EntryScriptInfo[]> | undefined} */
78
- (buildInfo.htmlEntryScripts);
213
+ const buildInfo = /** @type {HtmlModuleBuildInfo | undefined} */ (
214
+ module.buildInfo
215
+ );
216
+ const htmlEntryScripts = buildInfo && buildInfo.htmlEntryScripts;
79
217
  if (!htmlEntryScripts) continue;
80
218
 
81
219
  const context = /** @type {string} */ (module.context);
82
220
 
83
221
  for (const [groupKind, group] of Object.entries(htmlEntryScripts)) {
84
- // Only the script chains (`classic`, `esm-script`) need a
222
+ // Only the script chains (`script`, `script-module`) need a
85
223
  // shared runtime via leader-only `dependOn` — the others
86
224
  // either preload without executing (`modulepreload`) or
87
225
  // produce CSS chunks (`stylesheet`) which have no runtime
@@ -183,12 +321,12 @@ class HtmlModulesPlugin {
183
321
  new HtmlSourceDependency.Template()
184
322
  );
185
323
  compilation.dependencyFactories.set(
186
- HtmlScriptSrcDependency,
324
+ HtmlEntryDependency,
187
325
  normalModuleFactory
188
326
  );
189
327
  compilation.dependencyTemplates.set(
190
- HtmlScriptSrcDependency,
191
- new HtmlScriptSrcDependency.Template()
328
+ HtmlEntryDependency,
329
+ new HtmlEntryDependency.Template()
192
330
  );
193
331
  // Inline `<script>` content is bundled as its own entry — the
194
332
  // same pipeline that handles `<script src>` — via a
@@ -215,6 +353,17 @@ class HtmlModulesPlugin {
215
353
  HtmlInlineStyleDependency,
216
354
  new HtmlInlineStyleDependency.Template()
217
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
+ );
218
367
  compilation.dependencyTemplates.set(
219
368
  StaticExportsDependency,
220
369
  new StaticExportsDependency.Template()
@@ -227,21 +376,26 @@ class HtmlModulesPlugin {
227
376
  ConstDependency,
228
377
  new ConstDependency.Template()
229
378
  );
230
- const cssEnabled = Boolean(
231
- compiler.options.experiments && compiler.options.experiments.css
232
- );
233
- normalModuleFactory.hooks.createParser
379
+ normalModuleFactory.hooks.createModuleClass
234
380
  .for(HTML_MODULE_TYPE)
235
381
  .tap(
236
382
  PLUGIN_NAME,
237
- () =>
238
- new HtmlParser(
239
- compilation.outputOptions.hashFunction,
240
- compiler.context,
241
- compilation.outputOptions.module,
242
- cssEnabled
243
- )
383
+ (createData, _resolveData) => new HtmlModule(createData)
244
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
+ });
245
399
 
246
400
  normalModuleFactory.hooks.createGenerator
247
401
  .for(HTML_MODULE_TYPE)
@@ -263,8 +417,13 @@ class HtmlModulesPlugin {
263
417
  (result, module) => {
264
418
  if (module.type === HTML_MODULE_TYPE) {
265
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);
266
425
 
267
- return [removeBOM(source), ...rest];
426
+ return [parser.applyTemplate(removeBOM(source), module), ...rest];
268
427
  }
269
428
 
270
429
  return result;
@@ -296,11 +455,19 @@ class HtmlModulesPlugin {
296
455
  getUndoPath,
297
456
  makePathsRelative
298
457
  } = require("../util/identifier");
299
- const createHash = require("../util/createHash");
300
- const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
301
- const CssUrlDependency = require("../dependencies/CssUrlDependency");
458
+ const {
459
+ PUBLIC_PATH_AUTO: autoPlaceholder
460
+ } = require("../util/publicPathPlaceholder");
302
461
 
303
- const autoPlaceholder = CssUrlDependency.PUBLIC_PATH_AUTO;
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();
304
471
 
305
472
  compilation.hooks.renderManifest.tap(
306
473
  PLUGIN_NAME,
@@ -328,32 +495,56 @@ class HtmlModulesPlugin {
328
495
  const placeholderSource = codeGenResult.sources.get(HTML_TYPE);
329
496
  if (!placeholderSource) continue;
330
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
+
331
510
  const filenameTemplate = chunk.canBeInitial()
332
511
  ? outputOptions.htmlFilename
333
512
  : outputOptions.htmlChunkFilename;
334
513
 
335
- const sourceFilename = makePathsRelative(
336
- compiler.context,
337
- /** @type {string} */
338
- (normalModule.getResource() || normalModule.resource),
339
- compiler.root
340
- ).replace(/^\.\//, "");
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(/^\.\//, "");
341
526
 
342
- const placeholderContent = /** @type {string} */ (
343
- placeholderSource.source()
344
- );
345
- const hashInput = createHash(outputOptions.hashFunction);
346
- if (outputOptions.hashSalt) {
347
- hashInput.update(outputOptions.hashSalt);
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);
348
546
  }
349
- hashInput.update(placeholderContent);
350
- const fullContentHash = /** @type {string} */ (
351
- hashInput.digest(outputOptions.hashDigest)
352
- );
353
- const contentHash = nonNumericOnlyHash(
354
- fullContentHash,
355
- outputOptions.hashDigestLength
356
- );
547
+ const { resolvedContent, contentHash } = cached;
357
548
 
358
549
  const { path: filename, info } = compilation.getPathWithInfo(
359
550
  /** @type {import("../TemplatedPathPlugin").TemplatePath} */
@@ -382,7 +573,7 @@ class HtmlModulesPlugin {
382
573
  /** @type {string} */ (outputOptions.path),
383
574
  false
384
575
  );
385
- const finalContent = placeholderContent
576
+ const finalContent = resolvedContent
386
577
  .split(autoPlaceholder)
387
578
  .join(undoPath);
388
579
  const finalSource = new RawSource(finalContent);
@@ -395,16 +586,9 @@ class HtmlModulesPlugin {
395
586
  // the post-undo-path content in the hash, so the
396
587
  // asset cache can't reuse one variant's bytes at
397
588
  // another variant's URL.
398
- const finalHash = createHash(outputOptions.hashFunction);
399
- if (outputOptions.hashSalt) {
400
- finalHash.update(outputOptions.hashSalt);
401
- }
402
- finalHash.update(finalContent);
403
- const finalContentHash = nonNumericOnlyHash(
404
- /** @type {string} */ (
405
- finalHash.digest(outputOptions.hashDigest)
406
- ),
407
- outputOptions.hashDigestLength
589
+ const finalContentHash = HtmlModulesPlugin.computeContentHash(
590
+ finalContent,
591
+ outputOptions
408
592
  );
409
593
 
410
594
  result.push({
@@ -421,6 +605,49 @@ class HtmlModulesPlugin {
421
605
  return result;
422
606
  }
423
607
  );
608
+
609
+ // Resolve sentinels at JS chunk render time so later passes
610
+ // (SourceMapDevToolPlugin, size optimizers, RealContentHash) see resolved bytes.
611
+ const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
612
+
613
+ const jsHooks =
614
+ JavascriptModulesPlugin.getCompilationHooks(compilation);
615
+ jsHooks.render.tap(PLUGIN_NAME, (source, renderContext) => {
616
+ const raw = source.source();
617
+ if (typeof raw !== "string") return source;
618
+ if (!raw.includes("__WEBPACK_HTML_CHUNK_URL__")) return source;
619
+ const resolved = HtmlGenerator.resolveChunkUrlSentinels(
620
+ raw,
621
+ compilation
622
+ )
623
+ .split(autoPlaceholder)
624
+ .join("");
625
+ if (resolved === raw) return source;
626
+ const chunkId = String(renderContext.chunk.id);
627
+ const prior = sentinelResolvedSourceCache.get(chunkId);
628
+ if (prior !== undefined && prior.content === resolved) {
629
+ return prior.source;
630
+ }
631
+ const newSource = new RawSource(resolved);
632
+ sentinelResolvedSourceCache.set(chunkId, {
633
+ content: resolved,
634
+ source: newSource
635
+ });
636
+ return newSource;
637
+ });
638
+
639
+ // Prune cache entries for chunks no longer in the graph so a
640
+ // long watch session can't accumulate stale entries.
641
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
642
+ if (sentinelResolvedSourceCache.size === 0) return;
643
+ const live = new Set();
644
+ for (const chunk of compilation.chunks) {
645
+ live.add(String(chunk.id));
646
+ }
647
+ for (const id of sentinelResolvedSourceCache.keys()) {
648
+ if (!live.has(id)) sentinelResolvedSourceCache.delete(id);
649
+ }
650
+ });
424
651
  }
425
652
  );
426
653
  }