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
@@ -13,7 +13,8 @@ const {
13
13
  JAVASCRIPT_TYPES
14
14
  } = require("../ModuleSourceTypeConstants");
15
15
  const RuntimeGlobals = require("../RuntimeGlobals");
16
- const CssUrlDependency = require("../dependencies/CssUrlDependency");
16
+ const Template = require("../Template");
17
+ const { PUBLIC_PATH_AUTO } = require("../util/publicPathPlaceholder");
17
18
 
18
19
  /** @typedef {import("webpack-sources").Source} Source */
19
20
  /** @typedef {import("../../declarations/WebpackOptions").HtmlGeneratorOptions} HtmlGeneratorOptions */
@@ -30,6 +31,8 @@ const CssUrlDependency = require("../dependencies/CssUrlDependency");
30
31
  /** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
31
32
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
32
33
  /** @typedef {import("../NormalModule")} NormalModule */
34
+ /** @typedef {import("../Module").RuntimeRequirements} RuntimeRequirements */
35
+ /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
33
36
  /** @typedef {import("../util/Hash")} Hash */
34
37
  /**
35
38
  * @template T
@@ -44,6 +47,12 @@ const JAVASCRIPT_AND_HTML_TYPES = new Set([JAVASCRIPT_TYPE, HTML_TYPE]);
44
47
  /** @type {WeakMap<Compilation, Map<string, Chunk>>} */
45
48
  const chunksByIdCache = new WeakMap();
46
49
 
50
+ // Hoisted so `resolveChunkUrlSentinels` (per chunk × module) doesn't allocate a
51
+ // fresh `RegExp` each call. `String#replace` resets `lastIndex`, so sharing the
52
+ // global-flag instance is safe under these synchronous, non-reentrant calls.
53
+ const CHUNK_URL_SENTINEL_REGEXP =
54
+ /__WEBPACK_HTML_CHUNK_URL__([0-9a-f]+)__([a-z]+)__END__/g;
55
+
47
56
  class HtmlGenerator extends Generator {
48
57
  /**
49
58
  * Emit a sentinel for a chunk URL that can't be resolved at code-gen time
@@ -78,7 +87,7 @@ class HtmlGenerator extends Generator {
78
87
  chunksByIdCache.set(compilation, chunksById);
79
88
  }
80
89
  return content.replace(
81
- /__WEBPACK_HTML_CHUNK_URL__([0-9a-f]+)__([a-z]+)__END__/g,
90
+ CHUNK_URL_SENTINEL_REGEXP,
82
91
  (_, hexId, contentHashType) => {
83
92
  const chunkId = Buffer.from(hexId, "hex").toString("utf8");
84
93
  const chunk = chunksById.get(chunkId);
@@ -106,7 +115,7 @@ class HtmlGenerator extends Generator {
106
115
  contentHashType
107
116
  }
108
117
  );
109
- return `${CssUrlDependency.PUBLIC_PATH_AUTO}${filename}`;
118
+ return `${PUBLIC_PATH_AUTO}${filename}`;
110
119
  }
111
120
  );
112
121
  }
@@ -118,9 +127,18 @@ class HtmlGenerator extends Generator {
118
127
  */
119
128
  constructor(options, moduleGraph) {
120
129
  super();
130
+ /** @type {HtmlGeneratorOptions} */
121
131
  this.options = options || {};
122
132
  /** @type {ModuleGraph | undefined} */
123
133
  this._moduleGraph = moduleGraph;
134
+ // Raw dependency-template render (before `[webpack/auto]` resolution),
135
+ // shared between the JS and HTML type passes of a single
136
+ // `codeGeneration()` call. Keyed by that call's `runtimeRequirements`
137
+ // Set — created once per call and passed to every type's `generate()`,
138
+ // so it uniquely scopes the cache to one module's one code generation
139
+ // and releases with it. The two passes differ only in `undoPath`.
140
+ /** @type {WeakMap<RuntimeRequirements, string>} */
141
+ this._rawRenderCache = new WeakMap();
124
142
  }
125
143
 
126
144
  /**
@@ -130,6 +148,14 @@ class HtmlGenerator extends Generator {
130
148
  * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
131
149
  */
132
150
  getConcatenationBailoutReason(module, context) {
151
+ // The HMR shim references the per-module `module.hot` object — when an
152
+ // HTML module is concatenated, that scope is gone (the merged file
153
+ // shares a single `module`), so the self-accept / DOM-patch wiring
154
+ // would target the wrong module id. Bail out of concatenation so the
155
+ // HMR-aware HTML module keeps its own module scope.
156
+ if (module.hot) {
157
+ return "HTML module needs its own module scope for HMR";
158
+ }
133
159
  return undefined;
134
160
  }
135
161
 
@@ -150,31 +176,53 @@ class HtmlGenerator extends Generator {
150
176
 
151
177
  /**
152
178
  * Whether to emit the extracted `.html` file for this module.
153
- * `options.extract === true` always extracts; `false` never; when the
154
- * option is left unspecified, extraction defaults to on for HTML modules
155
- * used as compilation entries — that's the HTML-as-entry-point use case.
179
+ * `options.extract === true` always extracts; `false` and `"inline"` never;
180
+ * when the option is left unspecified, extraction defaults to on for HTML
181
+ * modules used as compilation entries — that's the HTML-as-entry-point case.
156
182
  * @param {NormalModule} module module
157
183
  * @returns {boolean} true when the `.html` file should be emitted
158
184
  */
159
185
  _shouldExtract(module) {
160
186
  const { extract } = this.options;
161
187
  if (extract === true) return true;
162
- if (extract === false) return false;
188
+ if (extract === false || extract === "inline") return false;
163
189
  return this._isEntryModule(module);
164
190
  }
165
191
 
192
+ /**
193
+ * Whether this module exposes the `html` source type. Like `_shouldExtract`,
194
+ * but `"inline"` also exposes it — the processed HTML is read back into the
195
+ * host attribute (e.g. `<iframe srcdoc>`) instead of emitted as a file.
196
+ * @param {NormalModule} module module
197
+ * @returns {boolean} true when the `html` source type is available
198
+ */
199
+ _shouldExposeHtmlType(module) {
200
+ if (this.options.extract === "inline") return true;
201
+ return this._shouldExtract(module);
202
+ }
203
+
166
204
  /**
167
205
  * Returns the source types available for this module.
168
206
  * @param {NormalModule} module fresh module
169
207
  * @returns {SourceTypes} available types (do not mutate)
170
208
  */
171
209
  getTypes(module) {
172
- if (this._shouldExtract(module)) {
210
+ if (this._shouldExposeHtmlType(module)) {
173
211
  return JAVASCRIPT_AND_HTML_TYPES;
174
212
  }
175
213
  return JAVASCRIPT_TYPES;
176
214
  }
177
215
 
216
+ /**
217
+ * @returns {boolean} whether getTypes() depends on the module's incoming connections
218
+ */
219
+ getTypesDependOnIncomingConnections() {
220
+ // A fixed extract (`true` / `false` / `"inline"`) gives a stable type set;
221
+ // only the unset default reads `_isEntryModule` (incoming connections).
222
+ const { extract } = this.options;
223
+ return extract !== true && extract !== false && extract !== "inline";
224
+ }
225
+
178
226
  /**
179
227
  * Returns the estimated size for the requested source type.
180
228
  * @param {NormalModule} module the module
@@ -331,23 +379,31 @@ class HtmlGenerator extends Generator {
331
379
  * @returns {string} the rewritten HTML
332
380
  */
333
381
  _renderHtml(module, generateContext, undoPath) {
334
- const originalSource = /** @type {Source} */ (module.originalSource());
335
- const source = new ReplaceSource(originalSource);
336
- /** @type {InitFragment<GenerateContext>[]} */
337
- const initFragments = [];
338
-
339
- this.sourceModule(module, initFragments, source, generateContext);
382
+ // The dependency-template pass is identical for both type passes (no
383
+ // template branches on `type` or writes `runtimeRequirements`), so
384
+ // compute the raw render once per `codeGeneration()` and reuse it; the
385
+ // passes diverge only in the `[webpack/auto]` substitution below.
386
+ const cacheKey = generateContext.runtimeRequirements;
387
+ let rawContent = this._rawRenderCache.get(cacheKey);
388
+ if (rawContent === undefined) {
389
+ const originalSource = /** @type {Source} */ (module.originalSource());
390
+ const source = new ReplaceSource(originalSource);
391
+ /** @type {InitFragment<GenerateContext>[]} */
392
+ const initFragments = [];
393
+
394
+ this.sourceModule(module, initFragments, source, generateContext);
395
+ rawContent = /** @type {string} */ (source.source());
396
+ this._rawRenderCache.set(cacheKey, rawContent);
397
+ }
340
398
 
341
399
  if (undoPath === undefined) {
342
400
  // HTML output — leave sentinels and `[webpack/auto]` for renderManifest.
343
- return /** @type {string} */ (source.source());
401
+ return rawContent;
344
402
  }
345
403
 
346
404
  // JS-export path — resolve `[webpack/auto]` inline; chunk-URL sentinels
347
405
  // stay for `HtmlModulesPlugin`'s `JavascriptModulesPlugin.render` tap.
348
- let content = /** @type {string} */ (source.source());
349
- content = content.split(CssUrlDependency.PUBLIC_PATH_AUTO).join(undoPath);
350
- return content;
406
+ return rawContent.split(PUBLIC_PATH_AUTO).join(undoPath);
351
407
  }
352
408
 
353
409
  /**
@@ -375,7 +431,12 @@ class HtmlGenerator extends Generator {
375
431
 
376
432
  /** @type {string} */
377
433
  let sourceContent;
378
- if (generateContext.concatenationScope) {
434
+ // `module.hot` is set by `HotModuleReplacementPlugin` on every module
435
+ // when HMR is enabled. When set, we cannot use the concatenation path
436
+ // (it merges into a parent's module scope, where `module.hot.accept`
437
+ // would target the wrong id) — `getConcatenationBailoutReason` keeps
438
+ // us out of concatenation in that case.
439
+ if (generateContext.concatenationScope && !module.hot) {
379
440
  generateContext.concatenationScope.registerNamespaceExport(
380
441
  ConcatenationScope.NAMESPACE_OBJECT_EXPORT
381
442
  );
@@ -384,14 +445,136 @@ class HtmlGenerator extends Generator {
384
445
  } = ${JSON.stringify(generated)};`;
385
446
  } else {
386
447
  generateContext.runtimeRequirements.add(RuntimeGlobals.module);
387
- sourceContent = `${module.moduleArgument}.exports = ${JSON.stringify(
388
- generated
389
- )};`;
448
+ if (module.hot) {
449
+ sourceContent = this._renderHmrShim(
450
+ module,
451
+ generated,
452
+ this._shouldExtract(module),
453
+ generateContext.runtimeTemplate
454
+ );
455
+ } else {
456
+ sourceContent = `${module.moduleArgument}.exports = ${JSON.stringify(
457
+ generated
458
+ )};`;
459
+ }
390
460
  }
391
461
 
392
462
  return new RawSource(sourceContent);
393
463
  }
394
464
 
465
+ /**
466
+ * Emits the JS shim with HMR self-acceptance. When `extracting` is true the
467
+ * HTML module is also the document the browser is viewing, so the shim
468
+ * additionally patches `document.body` and `document.title` on every hot
469
+ * update so the rendered page reflects the new HTML without a full
470
+ * reload. The patching guard `module.hot.data` ensures the body is only
471
+ * replaced on a re-evaluation after a hot update — never on the initial
472
+ * page load, where `document.body` already matches the extracted HTML.
473
+ *
474
+ * The runtime extracts the body / title / head-sans-title sections from
475
+ * the HTML with regexes. HTML comments are *masked* first — their
476
+ * characters replaced with spaces, preserving length — via a `<!--…-->`
477
+ * regex, so a `<body>` (or `</body>` / `<title>` / etc.) that appears
478
+ * inside a comment can't fool the tag regexes — that was the one
479
+ * well-known sharp edge of HTML+regex. Because masking keeps offsets
480
+ * stable, the body / title content is sliced back out of the *original*
481
+ * HTML, so real comments inside `<body>` survive into the patched DOM
482
+ * exactly as a full page reload would render them.
483
+ *
484
+ * `<head>` changes beyond `<title>` (a new `<meta>`, a swapped
485
+ * `<link rel=icon>`, an inline `<style>` block, …) can't be safely
486
+ * DOM-patched: webpack injects its own runtime scripts and stylesheet
487
+ * links into the head on initial load, and blindly replacing
488
+ * `document.head.innerHTML` would tear them down. So the shim falls
489
+ * back to a full reload — fine in a dev-server context because the
490
+ * regular (non-hot-update) `page.html` chunk is re-emitted on every
491
+ * rebuild, so the reloaded page picks up the new head.
492
+ * @param {NormalModule} module module
493
+ * @param {string} html the rewritten HTML content (with placeholders resolved)
494
+ * @param {boolean} extracting whether the HTML module is being extracted as a real `.html` file
495
+ * @param {RuntimeTemplate} runtimeTemplate runtime template (drives `const`/arrow emission based on environment support)
496
+ * @returns {string} JS shim source
497
+ */
498
+ _renderHmrShim(module, html, extracting, runtimeTemplate) {
499
+ const declare = runtimeTemplate.renderConst();
500
+ const acceptBlock = extracting
501
+ ? [
502
+ "module.hot.accept();",
503
+ // Mask `<!-- … -->` comments — replace their characters
504
+ // with spaces, preserving length — before any tag regex
505
+ // runs. Masking (rather than deleting) keeps string offsets
506
+ // stable, so the body/title content can be sliced back out
507
+ // of the original HTML with comments intact, while a
508
+ // `<body>`/`</body>`/`<title>` inside a comment can no
509
+ // longer fool the tag regexes (the non-greedy `*?` would
510
+ // otherwise stop at the FIRST `</body>` it sees, even one
511
+ // inside a comment).
512
+ `${declare} __webpack_mask_comments__ = ${runtimeTemplate.returningFunction(
513
+ `h.replace(/<!--[\\s\\S]*?-->/g, ${runtimeTemplate.returningFunction(
514
+ 'c.replace(/[^\\n]/g, " ")',
515
+ "c"
516
+ )})`,
517
+ "h"
518
+ )};`,
519
+ // Mask comments once per evaluation; reused for every
520
+ // tag-boundary search (head/body/title and the dispose-time
521
+ // head diff) so a large page isn't re-scanned per section.
522
+ `${declare} __webpack_masked_html__ = __webpack_mask_comments__(__webpack_html__);`,
523
+ // Slice the inner content of `<tag>…</tag>` out of the original
524
+ // HTML, using the pre-masked copy to locate the tag boundaries.
525
+ `${declare} __webpack_extract__ = ${runtimeTemplate.basicFunction(
526
+ "tag",
527
+ [
528
+ `${declare} open = new RegExp("<" + tag + "[^>]*>", "i").exec(__webpack_masked_html__);`,
529
+ "if (!open) return null;",
530
+ `${declare} start = open.index + open[0].length;`,
531
+ `${declare} close = new RegExp("</" + tag + ">", "i").exec(__webpack_masked_html__.slice(start));`,
532
+ "if (!close) return null;",
533
+ "return __webpack_html__.slice(start, start + close.index);"
534
+ ]
535
+ )};`,
536
+ `${declare} __webpack_extract_head__ = ${runtimeTemplate.basicFunction(
537
+ "",
538
+ [
539
+ // Mask only the small extracted head so a comment-only head
540
+ // edit doesn't force a full reload.
541
+ `${declare} head = __webpack_extract__("head");`,
542
+ 'return head === null ? "" : __webpack_mask_comments__(head).replace(/<title[^>]*>[\\s\\S]*?<\\/title>/i, "").trim();'
543
+ ]
544
+ )};`,
545
+ "if (module.hot.data && typeof document !== 'undefined') {",
546
+ Template.indent([
547
+ `${declare} __webpack_new_head__ = __webpack_extract_head__();`,
548
+ "if (module.hot.data.__webpack_head__ !== undefined && __webpack_new_head__ !== module.hot.data.__webpack_head__ && typeof window !== 'undefined' && window.location && typeof window.location.reload === 'function') {",
549
+ Template.indent("window.location.reload();"),
550
+ "} else {",
551
+ Template.indent([
552
+ `${declare} __webpack_body__ = __webpack_extract__("body");`,
553
+ "if (__webpack_body__ !== null && document.body) document.body.innerHTML = __webpack_body__;",
554
+ `${declare} __webpack_title__ = __webpack_extract__("title");`,
555
+ "if (__webpack_title__ !== null) document.title = __webpack_title__;"
556
+ ]),
557
+ "}"
558
+ ]),
559
+ "}",
560
+ // Capture this evaluation's head (sans title, comments
561
+ // masked) on dispose so the next module instance can diff
562
+ // against it.
563
+ `module.hot.dispose(${runtimeTemplate.basicFunction(
564
+ "data",
565
+ "data.__webpack_head__ = __webpack_extract_head__();"
566
+ )});`
567
+ ]
568
+ : ["module.hot.accept();"];
569
+ return Template.asString([
570
+ `${declare} __webpack_html__ = ${JSON.stringify(html)};`,
571
+ `${module.moduleArgument}.exports = __webpack_html__;`,
572
+ "if (module.hot) {",
573
+ Template.indent(acceptBlock),
574
+ "}"
575
+ ]);
576
+ }
577
+
395
578
  /**
396
579
  * Generates fallback output for the provided error condition.
397
580
  * @param {Error} error the error
@@ -417,10 +600,21 @@ class HtmlGenerator extends Generator {
417
600
  */
418
601
  updateHash(hash, updateHashContext) {
419
602
  hash.update("html");
420
- // Hash effective extraction state — source-type set changes when this flips.
603
+ // Source-type set changes when html-type exposure flips; the HMR shim's
604
+ // `extracting` branch changes when the emit decision flips. They differ
605
+ // only for `"inline"` (exposes html, but does not emit), so hash both.
606
+ if (this._shouldExposeHtmlType(updateHashContext.module)) {
607
+ hash.update("html-type");
608
+ }
421
609
  if (this._shouldExtract(updateHashContext.module)) {
422
610
  hash.update("extract");
423
611
  }
612
+ // The HMR shim emits additional self-accept / DOM-patch code that
613
+ // isn't emitted in non-HMR builds, so the cached codegen must
614
+ // invalidate when `module.hot` toggles.
615
+ if (updateHashContext.module.hot) {
616
+ hash.update("hot");
617
+ }
424
618
  }
425
619
  }
426
620
 
@@ -0,0 +1,40 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ */
4
+
5
+ "use strict";
6
+
7
+ const NormalModule = require("../NormalModule");
8
+ const makeSerializable = require("../util/makeSerializable");
9
+
10
+ /** @typedef {import("../NormalModule").NormalModuleBuildInfo} NormalModuleBuildInfo */
11
+ /** @typedef {import("../NormalModule").NormalModuleCreateData} NormalModuleCreateData */
12
+ /** @typedef {import("./HtmlModulesPlugin").EntryScriptInfo} EntryScriptInfo */
13
+
14
+ /**
15
+ * Defines the build info properties specific to html modules.
16
+ * @typedef {object} KnownHtmlModuleBuildInfo
17
+ * @property {Record<string, EntryScriptInfo[]>=} htmlEntryScripts entries collected from the document, grouped by kind
18
+ */
19
+
20
+ /** @typedef {NormalModuleBuildInfo & KnownHtmlModuleBuildInfo} HtmlModuleBuildInfo */
21
+
22
+ /**
23
+ * Module class for `html` modules. HTML-specific properties should live here instead of `NormalModule`.
24
+ */
25
+ class HtmlModule extends NormalModule {
26
+ /**
27
+ * @param {NormalModuleCreateData} options options object
28
+ */
29
+ constructor(options) {
30
+ super(options);
31
+
32
+ // Redeclared with the html specific shape
33
+ /** @type {HtmlModuleBuildInfo | undefined} */
34
+ this.buildInfo = undefined;
35
+ }
36
+ }
37
+
38
+ makeSerializable(HtmlModule, "webpack/lib/html/HtmlModule");
39
+
40
+ module.exports = HtmlModule;