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
@@ -54,6 +54,7 @@ const {
54
54
  runtimeConditionToString,
55
55
  subtractRuntimeCondition
56
56
  } = require("../util/runtime");
57
+ const { InlinedUsedName } = require("./InlineExports");
57
58
 
58
59
  /** @typedef {import("webpack-sources").Source} Source */
59
60
  /** @typedef {import("../config/defaults").WebpackOptionsNormalizedWithDefaults} WebpackOptions */
@@ -69,6 +70,7 @@ const {
69
70
  /** @typedef {import("../Module").BuildInfo} BuildInfo */
70
71
  /** @typedef {import("../Module").FileSystemDependencies} FileSystemDependencies */
71
72
  /** @typedef {import("../Module").BuildMeta} BuildMeta */
73
+ /** @typedef {import("../Module").ExportsType} ExportsType */
72
74
  /** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */
73
75
  /** @typedef {import("../Module").CodeGenerationResultData} CodeGenerationResultData */
74
76
  /** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
@@ -84,6 +86,8 @@ const {
84
86
  /** @typedef {import("../RequestShortener")} RequestShortener */
85
87
  /** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
86
88
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
89
+ /** @typedef {import("../javascript/JavascriptModule").JavascriptModuleBuildInfo} JavascriptModuleBuildInfo */
90
+ /** @typedef {import("../javascript/JavascriptModule").JavascriptModuleBuildMeta} JavascriptModuleBuildMeta */
87
91
  /** @typedef {import("../javascript/JavascriptModulesPlugin").ChunkRenderContext} ChunkRenderContext */
88
92
  /** @typedef {import("../javascript/JavascriptModulesPlugin").Scope} Scope */
89
93
  /** @typedef {import("../javascript/JavascriptModulesPlugin").Reference} Reference */
@@ -94,7 +98,7 @@ const {
94
98
  /** @typedef {import("../util/Hash")} Hash */
95
99
  /** @typedef {import("../util/Hash").HashFunction} HashFunction */
96
100
  /** @typedef {import("../util/concatenate").UsedNames} UsedNames */
97
- /** @typedef {import("../util/concatenate").ScopeInfo} ScopeInfo */
101
+ /** @typedef {import("../util/concatenate").UsedNamesInScopeInfo} UsedNamesInScopeInfo */
98
102
  /** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
99
103
  /** @typedef {import("../util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
100
104
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
@@ -160,6 +164,7 @@ if (!ReferencerClass.prototype.PropertyDefinition) {
160
164
  * @property {ExportMap | undefined} rawExportMap
161
165
  * @property {string=} namespaceExportSymbol
162
166
  * @property {string | undefined} namespaceObjectName
167
+ * @property {string | undefined} escapeNamespaceObjectName decoupled namespace object that keeps original export names when the exports are mangled
163
168
  * @property {ConcatenationScope | undefined} concatenationScope
164
169
  * @property {boolean} interopNamespaceObjectUsed "default-with-named" namespace
165
170
  * @property {string | undefined} interopNamespaceObjectName "default-with-named" namespace
@@ -167,6 +172,8 @@ if (!ReferencerClass.prototype.PropertyDefinition) {
167
172
  * @property {string | undefined} interopNamespaceObject2Name "default-only" namespace
168
173
  * @property {boolean} interopDefaultAccessUsed runtime namespace object that detects "__esModule"
169
174
  * @property {string | undefined} interopDefaultAccessName runtime namespace object that detects "__esModule"
175
+ * @property {ExportsType=} exportsTypeStrict memoized getExportsType(strict=true)
176
+ * @property {ExportsType=} exportsTypeNonStrict memoized getExportsType(strict=false)
170
177
  */
171
178
 
172
179
  /**
@@ -177,6 +184,7 @@ if (!ReferencerClass.prototype.PropertyDefinition) {
177
184
  * @property {NonDeferAccess} nonDeferAccess
178
185
  * @property {number} index
179
186
  * @property {string | undefined} name module.exports / harmony namespace object
187
+ * @property {string | undefined} escapeNamespaceObjectName decoupled namespace object that keeps original export names when the exports are mangled
180
188
  * @property {string | undefined} deferredName deferred module.exports / harmony namespace object
181
189
  * @property {boolean} deferred the module is deferred at least once
182
190
  * @property {boolean} deferredNamespaceObjectUsed deferred namespace object that being used in a not-analyzable way so it must be materialized
@@ -187,6 +195,8 @@ if (!ReferencerClass.prototype.PropertyDefinition) {
187
195
  * @property {string | undefined} interopNamespaceObject2Name "default-only" namespace
188
196
  * @property {boolean} interopDefaultAccessUsed runtime namespace object that detects "__esModule"
189
197
  * @property {string | undefined} interopDefaultAccessName runtime namespace object that detects "__esModule"
198
+ * @property {ExportsType=} exportsTypeStrict memoized getExportsType(strict=true)
199
+ * @property {ExportsType=} exportsTypeNonStrict memoized getExportsType(strict=false)
190
200
  */
191
201
 
192
202
  /**
@@ -282,6 +292,27 @@ const subtractNonDeferAccess = (a, b) => a && !b;
282
292
 
283
293
  /** @typedef {Map<Module, ModuleInfo>} ModuleToInfoMap */
284
294
 
295
+ /**
296
+ * getExportsType memoized on the info, which lives for one codeGeneration.
297
+ * The "dynamic" case walks the module graph, and is queried once per reference.
298
+ * @param {ModuleGraph} moduleGraph the module graph
299
+ * @param {ModuleInfo} info module info
300
+ * @param {boolean | undefined} strict strict harmony module (undefined is treated as non-strict)
301
+ * @returns {ExportsType} the exports type
302
+ */
303
+ const getExportsType = (moduleGraph, info, strict) => {
304
+ if (strict) {
305
+ if (info.exportsTypeStrict === undefined) {
306
+ info.exportsTypeStrict = info.module.getExportsType(moduleGraph, true);
307
+ }
308
+ return info.exportsTypeStrict;
309
+ }
310
+ if (info.exportsTypeNonStrict === undefined) {
311
+ info.exportsTypeNonStrict = info.module.getExportsType(moduleGraph, false);
312
+ }
313
+ return info.exportsTypeNonStrict;
314
+ };
315
+
285
316
  /**
286
317
  * @param {ModuleGraph} moduleGraph the module graph
287
318
  * @param {ModuleInfo} info module info
@@ -295,7 +326,7 @@ const subtractNonDeferAccess = (a, b) => a && !b;
295
326
  * @param {boolean} depDeferred the dependency is deferred
296
327
  * @param {boolean | undefined} strictHarmonyModule strictHarmonyModule
297
328
  * @param {boolean | undefined} asiSafe asiSafe
298
- * @param {Set<ExportInfo>} alreadyVisited alreadyVisited
329
+ * @param {Set<ExportInfo>=} alreadyVisited alreadyVisited
299
330
  * @returns {Binding} the final variable
300
331
  */
301
332
  const getFinalBinding = (
@@ -311,12 +342,9 @@ const getFinalBinding = (
311
342
  depDeferred,
312
343
  strictHarmonyModule,
313
344
  asiSafe,
314
- alreadyVisited = new Set()
345
+ alreadyVisited
315
346
  ) => {
316
- const exportsType = info.module.getExportsType(
317
- moduleGraph,
318
- strictHarmonyModule
319
- );
347
+ const exportsType = getExportsType(moduleGraph, info, strictHarmonyModule);
320
348
  const moduleDeferred =
321
349
  info.type === "external" &&
322
350
  info.deferred &&
@@ -504,6 +532,9 @@ const getFinalBinding = (
504
532
  }
505
533
  const exportsInfo = moduleGraph.getExportsInfo(info.module);
506
534
  const exportInfo = exportsInfo.getExportInfo(exportName[0]);
535
+ // Lazily allocate: only the reexport-following recursion below needs it,
536
+ // most calls return before reaching this point.
537
+ if (alreadyVisited === undefined) alreadyVisited = new Set();
507
538
  if (alreadyVisited.has(exportInfo)) {
508
539
  return {
509
540
  info,
@@ -528,9 +559,7 @@ const getFinalBinding = (
528
559
  }
529
560
  const directExport = info.exportMap && info.exportMap.get(exportId);
530
561
  if (directExport) {
531
- const usedName = /** @type {ExportName} */ (
532
- exportsInfo.getUsedName(exportName, runtime)
533
- );
562
+ const usedName = exportsInfo.getUsedName(exportName, runtime);
534
563
  if (!usedName) {
535
564
  return {
536
565
  info,
@@ -539,10 +568,26 @@ const getFinalBinding = (
539
568
  exportName
540
569
  };
541
570
  }
571
+ if (usedName instanceof InlinedUsedName) {
572
+ return {
573
+ info,
574
+ // Render the inlined literal only (e.g. `"str"`), not its property
575
+ // suffix: that suffix is returned in `ids` and appended once by
576
+ // getFinalName. Using `usedName.render()` would emit it here too,
577
+ // duplicating the access (e.g. `"str".a.a`).
578
+ rawName: usedName.render(
579
+ Template.toNormalComment(
580
+ `inlined export ${propertyAccess(exportName)}`
581
+ )
582
+ ),
583
+ ids: usedName.suffix,
584
+ exportName
585
+ };
586
+ }
542
587
  return {
543
588
  info,
544
589
  name: directExport,
545
- ids: usedName.slice(1),
590
+ ids: /** @type {ExportName} */ (usedName).slice(1),
546
591
  exportName
547
592
  };
548
593
  }
@@ -559,6 +604,27 @@ const getFinalBinding = (
559
604
  moduleToInfoMap.has(module)
560
605
  );
561
606
  if (reexport === false) {
607
+ // Source module was removed because all its exports were inlined;
608
+ // we render the inlined value here instead of binding to the now-absent module.
609
+ const target = exportInfo.getTarget(moduleGraph);
610
+ if (target && target.export) {
611
+ const usedName = moduleGraph
612
+ .getExportsInfo(target.module)
613
+ .getUsedName([...target.export, ...exportName.slice(1)], runtime);
614
+ if (usedName instanceof InlinedUsedName) {
615
+ return {
616
+ info,
617
+ // Literal only; suffix is appended once via `ids` (see directExport branch).
618
+ rawName: usedName.render(
619
+ Template.toNormalComment(
620
+ `inlined export ${propertyAccess(exportName)}`
621
+ )
622
+ ),
623
+ ids: usedName.suffix,
624
+ exportName
625
+ };
626
+ }
627
+ }
562
628
  throw new Error(
563
629
  `Target module of reexport from '${info.module.readableIdentifier(
564
630
  requestShortener
@@ -609,9 +675,7 @@ const getFinalBinding = (
609
675
  }
610
676
 
611
677
  case "external": {
612
- const used = /** @type {ExportName} */ (
613
- exportsInfo.getUsedName(exportName, runtime)
614
- );
678
+ const used = exportsInfo.getUsedName(exportName, runtime);
615
679
  if (!used) {
616
680
  return {
617
681
  info,
@@ -620,7 +684,21 @@ const getFinalBinding = (
620
684
  exportName
621
685
  };
622
686
  }
623
- const comment = equals(used, exportName)
687
+ if (used instanceof InlinedUsedName) {
688
+ return {
689
+ info,
690
+ // Literal only; suffix is appended once via `ids` (see directExport branch).
691
+ rawName: used.render(
692
+ Template.toNormalComment(
693
+ `inlined export ${propertyAccess(exportName)}`
694
+ )
695
+ ),
696
+ ids: used.suffix,
697
+ exportName
698
+ };
699
+ }
700
+ const usedName = /** @type {ExportName} */ (used);
701
+ const comment = equals(usedName, exportName)
624
702
  ? ""
625
703
  : Template.toNormalComment(`${exportName.join(".")}`);
626
704
  return {
@@ -629,7 +707,7 @@ const getFinalBinding = (
629
707
  (deferred ? info.deferredName : info.name) +
630
708
  (deferred ? ".a" : "") +
631
709
  comment,
632
- ids: used,
710
+ ids: usedName,
633
711
  exportName
634
712
  };
635
713
  }
@@ -727,6 +805,18 @@ const getFinalName = (
727
805
 
728
806
  /** @typedef {BuildInfo["topLevelDeclarations"]} TopLevelDeclarations */
729
807
 
808
+ /**
809
+ * Defines the build info properties specific to concatenated modules.
810
+ * @typedef {object} KnownConcatenatedModuleBuildInfo
811
+ * @property {FileSystemDependencies=} fileDependencies
812
+ * @property {FileSystemDependencies=} contextDependencies
813
+ * @property {FileSystemDependencies=} missingDependencies
814
+ * @property {boolean=} needCreateRequire collected from the inner modules
815
+ * @property {boolean=} inlineExports taken over from the root module
816
+ */
817
+
818
+ /** @typedef {BuildInfo & KnownConcatenatedModuleBuildInfo} ConcatenatedModuleBuildInfo */
819
+
730
820
  /** @type {WeakMap<Compilation, ConcatenateModuleHooks>} */
731
821
  const compilationHooksMap = new WeakMap();
732
822
 
@@ -798,6 +888,12 @@ class ConcatenatedModule extends Module {
798
888
  constructor({ identifier, rootModule, modules, runtime, compilation }) {
799
889
  super(JAVASCRIPT_MODULE_TYPE_ESM, null, rootModule && rootModule.layer);
800
890
 
891
+ // Redeclared with the concatenated module specific shape
892
+ /** @type {ConcatenatedModuleBuildInfo | undefined} */
893
+ this.buildInfo = undefined;
894
+ /** @type {JavascriptModuleBuildMeta | undefined} */
895
+ this.buildMeta = undefined;
896
+
801
897
  // Info from Factory
802
898
  /** @type {string} */
803
899
  this._identifier = identifier;
@@ -805,6 +901,7 @@ class ConcatenatedModule extends Module {
805
901
  this.rootModule = rootModule;
806
902
  /** @type {Set<Module>} */
807
903
  this._modules = modules;
904
+ /** @type {RuntimeSpec} */
808
905
  this._runtime = runtime;
809
906
  this.factoryMeta = rootModule && rootModule.factoryMeta;
810
907
  /** @type {Compilation} */
@@ -848,9 +945,9 @@ class ConcatenatedModule extends Module {
848
945
  * @returns {string} a user readable identifier of the module
849
946
  */
850
947
  readableIdentifier(requestShortener) {
851
- return `${this.rootModule.readableIdentifier(
852
- requestShortener
853
- )} + ${this._modules.size - 1} modules`;
948
+ return `${this.rootModule.readableIdentifier(requestShortener)} + ${
949
+ this._modules.size - 1
950
+ } modules`;
854
951
  }
855
952
 
856
953
  /**
@@ -893,7 +990,7 @@ class ConcatenatedModule extends Module {
893
990
  const { moduleArgument, exportsArgument } =
894
991
  /** @type {BuildInfo} */
895
992
  (rootModule.buildInfo);
896
- /** @type {BuildInfo} */
993
+ /** @type {ConcatenatedModuleBuildInfo} */
897
994
  this.buildInfo = {
898
995
  strict: true,
899
996
  cacheable: true,
@@ -903,7 +1000,10 @@ class ConcatenatedModule extends Module {
903
1000
  contextDependencies: new LazySet(),
904
1001
  missingDependencies: new LazySet(),
905
1002
  topLevelDeclarations: new Set(),
906
- assets: undefined
1003
+ assets: undefined,
1004
+ inlineExports: /** @type {JavascriptModuleBuildInfo} */ (
1005
+ rootModule.buildInfo
1006
+ ).inlineExports
907
1007
  };
908
1008
  this.buildMeta = rootModule.buildMeta;
909
1009
  this.clearDependenciesAndBlocks();
@@ -962,16 +1062,16 @@ class ConcatenatedModule extends Module {
962
1062
  }
963
1063
 
964
1064
  const { assets, assetsInfo, topLevelDeclarations, needCreateRequire } =
965
- /** @type {BuildInfo} */ (m.buildInfo);
1065
+ /** @type {JavascriptModuleBuildInfo} */ (m.buildInfo);
966
1066
 
967
1067
  const buildInfo = this.buildInfo;
968
1068
 
969
1069
  // populate topLevelDeclarations
970
1070
  if (topLevelDeclarations) {
971
- const topLevelDeclarations = buildInfo.topLevelDeclarations;
972
- if (topLevelDeclarations !== undefined) {
1071
+ const mergedTopLevelDeclarations = buildInfo.topLevelDeclarations;
1072
+ if (mergedTopLevelDeclarations !== undefined) {
973
1073
  for (const decl of topLevelDeclarations) {
974
- topLevelDeclarations.add(decl);
1074
+ mergedTopLevelDeclarations.add(decl);
975
1075
  }
976
1076
  }
977
1077
  } else {
@@ -1351,6 +1451,11 @@ class ConcatenatedModule extends Module {
1351
1451
  /** @type {NeededNamespaceObjects} */
1352
1452
  const neededNamespaceObjects = new Set();
1353
1453
 
1454
+ // Set with modules whose mangled namespace escapes as a whole value and
1455
+ // therefore needs a decoupled namespace object keyed by the original names
1456
+ /** @type {Set<ConcatenatedModuleInfo | ExternalModuleInfo>} */
1457
+ const neededEscapeNamespaceObjects = new Set();
1458
+
1354
1459
  // List of all used names to avoid conflicts
1355
1460
  const allUsedNames = new Set(RESERVED_NAMES);
1356
1461
 
@@ -1376,14 +1481,66 @@ class ConcatenatedModule extends Module {
1376
1481
  /** @type {TopLevelDeclarations} */
1377
1482
  const topLevelDeclarations = new Set();
1378
1483
 
1484
+ // Free names remaining in the rendered source (runtime globals are
1485
+ // tracked by runtimeRequirements instead)
1486
+ /** @type {Set<string>} */
1487
+ const freeNames = new Set();
1488
+
1379
1489
  // List of additional names in scope for module references
1380
- /** @type {Map<string, ScopeInfo>} */
1490
+ /** @type {UsedNamesInScopeInfo} */
1381
1491
  const usedNamesInScopeInfo = new Map();
1382
1492
 
1383
1493
  // Set of already checked scopes
1384
1494
  /** @type {Set<Scope>} */
1385
1495
  const ignoredScopes = new Set();
1386
1496
 
1497
+ /**
1498
+ * Lazily allocates a decoupled namespace object for a concatenated module
1499
+ * whose exports are mangled, so an escaping whole-namespace value still
1500
+ * exposes the original export names. Returns undefined when no export is
1501
+ * mangled (the regular namespace object can be used as-is).
1502
+ * @param {ConcatenatedModuleInfo | ExternalModuleInfo} info module info
1503
+ * @returns {string | undefined} the escape namespace object name
1504
+ */
1505
+ const getEscapeNamespaceObjectName = (info) => {
1506
+ if (info.type === "concatenated" && info.namespaceExportSymbol) {
1507
+ return undefined;
1508
+ }
1509
+ // Deferred external modules keep their special deferred namespace object
1510
+ // and are rendered through a different path that wouldn't emit ours.
1511
+ if (info.type === "external" && info.deferred) return undefined;
1512
+ // Only real ES module namespaces are decoupled; non-harmony modules use
1513
+ // their interop/fake namespace object as before.
1514
+ const buildMeta = /** @type {BuildMeta} */ (info.module.buildMeta);
1515
+ if (!buildMeta || buildMeta.exportsType !== "namespace") return undefined;
1516
+ if (info.escapeNamespaceObjectName !== undefined) {
1517
+ return info.escapeNamespaceObjectName;
1518
+ }
1519
+ const exportsInfo = moduleGraph.getExportsInfo(info.module);
1520
+ let mangled = false;
1521
+ for (const exportInfo of exportsInfo.orderedExports) {
1522
+ if (exportInfo.provided === false) continue;
1523
+ const usedName = exportInfo.getUsedName(undefined, runtime);
1524
+ if (!usedName || usedName instanceof InlinedUsedName) continue;
1525
+ if (usedName[usedName.length - 1] !== exportInfo.name) {
1526
+ mangled = true;
1527
+ break;
1528
+ }
1529
+ }
1530
+ if (!mangled) return undefined;
1531
+ const name = findNewName(
1532
+ "namespaceObject",
1533
+ allUsedNames,
1534
+ /** @type {UsedNames} */ (new Set()),
1535
+ info.module.readableIdentifier(requestShortener)
1536
+ );
1537
+ allUsedNames.add(name);
1538
+ topLevelDeclarations.add(name);
1539
+ info.escapeNamespaceObjectName = name;
1540
+ neededEscapeNamespaceObjects.add(info);
1541
+ return name;
1542
+ };
1543
+
1387
1544
  // get all global names
1388
1545
  for (const info of modulesWithInfo) {
1389
1546
  if (info.type === "concatenated") {
@@ -1436,6 +1593,18 @@ class ConcatenatedModule extends Module {
1436
1593
  if (referencedInfo.type === "reference") {
1437
1594
  throw new Error("Module reference can't point to a reference");
1438
1595
  }
1596
+ // An escaping mangled namespace resolves to its own decoupled
1597
+ // namespace object (a unique top-level name), so it neither needs
1598
+ // the regular namespace object nor super-class scope handling.
1599
+ if (
1600
+ match.mangleableNamespace &&
1601
+ match.ids.length === 0 &&
1602
+ (referencedInfo.type === "concatenated" ||
1603
+ referencedInfo.type === "external") &&
1604
+ getEscapeNamespaceObjectName(referencedInfo) !== undefined
1605
+ ) {
1606
+ continue;
1607
+ }
1439
1608
  const binding = getFinalBinding(
1440
1609
  moduleGraph,
1441
1610
  referencedInfo,
@@ -1478,6 +1647,7 @@ class ConcatenatedModule extends Module {
1478
1647
  );
1479
1648
  } else {
1480
1649
  allUsedNames.add(name);
1650
+ freeNames.add(name);
1481
1651
  }
1482
1652
  }
1483
1653
  }
@@ -1745,22 +1915,35 @@ class ConcatenatedModule extends Module {
1745
1915
  concatenationScope.setRawExportMap(exportId, newName);
1746
1916
  }
1747
1917
  }
1748
- const finalName = getFinalName(
1749
- moduleGraph,
1750
- referencedInfo,
1751
- match.ids,
1752
- moduleToInfoMap,
1753
- runtime,
1754
- requestShortener,
1755
- runtimeTemplate,
1756
- neededNamespaceObjects,
1757
- match.call,
1758
- match.deferredImport,
1759
- !match.directImport,
1760
- /** @type {BuildMeta} */
1761
- (info.module.buildMeta).strictHarmonyModule,
1762
- match.asiSafe
1763
- );
1918
+ // A whole-namespace value that escapes: when the module's exports
1919
+ // are mangled, point it at a decoupled namespace object that keeps
1920
+ // the original names so untracked access keeps working.
1921
+ const escapeName =
1922
+ match.mangleableNamespace &&
1923
+ match.ids.length === 0 &&
1924
+ (referencedInfo.type === "concatenated" ||
1925
+ referencedInfo.type === "external")
1926
+ ? getEscapeNamespaceObjectName(referencedInfo)
1927
+ : undefined;
1928
+ const finalName =
1929
+ escapeName !== undefined
1930
+ ? escapeName
1931
+ : getFinalName(
1932
+ moduleGraph,
1933
+ referencedInfo,
1934
+ match.ids,
1935
+ moduleToInfoMap,
1936
+ runtime,
1937
+ requestShortener,
1938
+ runtimeTemplate,
1939
+ neededNamespaceObjects,
1940
+ match.call,
1941
+ match.deferredImport,
1942
+ !match.directImport,
1943
+ /** @type {BuildMeta} */
1944
+ (info.module.buildMeta).strictHarmonyModule,
1945
+ match.asiSafe
1946
+ );
1764
1947
 
1765
1948
  for (const reference of references) {
1766
1949
  const r = /** @type {Range} */ (reference.identifier.range);
@@ -1780,6 +1963,9 @@ class ConcatenatedModule extends Module {
1780
1963
  // Set with all root exposed unused exports
1781
1964
  /** @type {Set<string>} */
1782
1965
  const unusedExports = new Set();
1966
+ // Set with all root exposed exports that were substituted with inlined literals
1967
+ /** @type {Set<string>} */
1968
+ const inlinedExports = new Set();
1783
1969
 
1784
1970
  const rootInfo =
1785
1971
  /** @type {ConcatenatedModuleInfo} */
@@ -1798,6 +1984,10 @@ class ConcatenatedModule extends Module {
1798
1984
  unusedExports.add(name);
1799
1985
  continue;
1800
1986
  }
1987
+ if (used instanceof InlinedUsedName) {
1988
+ inlinedExports.add(name);
1989
+ continue;
1990
+ }
1801
1991
  exportsMap.set(used, (requestShortener) => {
1802
1992
  try {
1803
1993
  const finalName = getFinalName(
@@ -1868,9 +2058,9 @@ class ConcatenatedModule extends Module {
1868
2058
 
1869
2059
  const exportsSource =
1870
2060
  "\n// EXPORTS\n" +
1871
- `${RuntimeGlobals.definePropertyGetters}(${this.exportsArgument}, {${definitions.join(
1872
- ","
1873
- )}\n});\n`;
2061
+ `${RuntimeGlobals.definePropertyGetters}(${
2062
+ this.exportsArgument
2063
+ }, {${definitions.join(",")}\n});\n`;
1874
2064
 
1875
2065
  const { onDemandExportsGeneration } =
1876
2066
  ConcatenatedModule.getCompilationHooks(this.compilation);
@@ -1894,6 +2084,87 @@ class ConcatenatedModule extends Module {
1894
2084
  );
1895
2085
  }
1896
2086
 
2087
+ // list inlined exports
2088
+ if (inlinedExports.size > 0) {
2089
+ result.add(
2090
+ `\n// INLINED EXPORTS: ${joinIterableWithComma(inlinedExports)}\n`
2091
+ );
2092
+ }
2093
+
2094
+ // generate decoupled namespace objects for escaping mangled namespaces:
2095
+ // same getters as the regular namespace object, but keyed by the original
2096
+ // export names so untracked access by name keeps working. Done before the
2097
+ // regular namespace objects so any nested namespace they pull in is built.
2098
+ /** @type {Map<ConcatenatedModuleInfo | ExternalModuleInfo, string>} */
2099
+ const escapeNamespaceObjectSources = new Map();
2100
+ for (const info of neededEscapeNamespaceObjects) {
2101
+ /** @type {string[]} */
2102
+ const nsObj = [];
2103
+ const exportsInfo = moduleGraph.getExportsInfo(info.module);
2104
+ for (const exportInfo of exportsInfo.orderedExports) {
2105
+ if (exportInfo.provided === false) continue;
2106
+ const usedName = exportInfo.getUsedName(undefined, runtime);
2107
+ if (!usedName) continue;
2108
+ if (usedName instanceof InlinedUsedName) {
2109
+ nsObj.push(
2110
+ `\n ${propertyName(exportInfo.name)}: ${runtimeTemplate.returningFunction(
2111
+ usedName.render(
2112
+ Template.toNormalComment(
2113
+ `inlined export ${propertyAccess(exportInfo.name)}`
2114
+ )
2115
+ )
2116
+ )}`
2117
+ );
2118
+ } else {
2119
+ // External (non-concatenated) modules are accessed through their
2120
+ // import variable; concatenated ones resolve to an internal binding.
2121
+ const finalName =
2122
+ info.type === "external"
2123
+ ? `${/** @type {string} */ (info.name)}${propertyAccess(usedName)}`
2124
+ : getFinalName(
2125
+ moduleGraph,
2126
+ info,
2127
+ [exportInfo.name],
2128
+ moduleToInfoMap,
2129
+ runtime,
2130
+ requestShortener,
2131
+ runtimeTemplate,
2132
+ neededNamespaceObjects,
2133
+ false,
2134
+ false,
2135
+ undefined,
2136
+ /** @type {BuildMeta} */
2137
+ (info.module.buildMeta).strictHarmonyModule,
2138
+ true
2139
+ );
2140
+ nsObj.push(
2141
+ `\n ${propertyName(exportInfo.name)}: ${runtimeTemplate.returningFunction(
2142
+ finalName
2143
+ )}`
2144
+ );
2145
+ }
2146
+ }
2147
+ const name = /** @type {string} */ (info.escapeNamespaceObjectName);
2148
+ const defineGetters =
2149
+ nsObj.length > 0
2150
+ ? `${RuntimeGlobals.definePropertyGetters}(${name}, {${nsObj.join(
2151
+ ","
2152
+ )}\n});\n`
2153
+ : "";
2154
+ if (nsObj.length > 0) {
2155
+ runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
2156
+ }
2157
+ escapeNamespaceObjectSources.set(
2158
+ info,
2159
+ `
2160
+ // NAMESPACE OBJECT (decoupled): ${info.module.readableIdentifier(requestShortener)}
2161
+ var ${name} = {};
2162
+ ${RuntimeGlobals.makeNamespaceObject}(${name});
2163
+ ${defineGetters}`
2164
+ );
2165
+ runtimeRequirements.add(RuntimeGlobals.makeNamespaceObject);
2166
+ }
2167
+
1897
2168
  // generate namespace objects
1898
2169
  /** @type {Map<ConcatenatedModuleInfo, string>} */
1899
2170
  const namespaceObjectSources = new Map();
@@ -1906,27 +2177,40 @@ class ConcatenatedModule extends Module {
1906
2177
  if (exportInfo.provided === false) continue;
1907
2178
  const usedName = exportInfo.getUsedName(undefined, runtime);
1908
2179
  if (usedName) {
1909
- const finalName = getFinalName(
1910
- moduleGraph,
1911
- info,
1912
- [exportInfo.name],
1913
- moduleToInfoMap,
1914
- runtime,
1915
- requestShortener,
1916
- runtimeTemplate,
1917
- neededNamespaceObjects,
1918
- false,
1919
- false,
1920
- undefined,
1921
- /** @type {BuildMeta} */
1922
- (info.module.buildMeta).strictHarmonyModule,
1923
- true
1924
- );
1925
- nsObj.push(
1926
- `\n ${propertyName(usedName)}: ${runtimeTemplate.returningFunction(
1927
- finalName
1928
- )}`
1929
- );
2180
+ // TODO: Replace with the inlined value directly at the call site
2181
+ if (usedName instanceof InlinedUsedName) {
2182
+ nsObj.push(
2183
+ `\n ${propertyName(exportInfo.name)}: ${runtimeTemplate.returningFunction(
2184
+ usedName.render(
2185
+ Template.toNormalComment(
2186
+ `inlined export ${propertyAccess(exportInfo.name)}`
2187
+ )
2188
+ )
2189
+ )}`
2190
+ );
2191
+ } else {
2192
+ const finalName = getFinalName(
2193
+ moduleGraph,
2194
+ info,
2195
+ [exportInfo.name],
2196
+ moduleToInfoMap,
2197
+ runtime,
2198
+ requestShortener,
2199
+ runtimeTemplate,
2200
+ neededNamespaceObjects,
2201
+ false,
2202
+ false,
2203
+ undefined,
2204
+ /** @type {BuildMeta} */
2205
+ (info.module.buildMeta).strictHarmonyModule,
2206
+ true
2207
+ );
2208
+ nsObj.push(
2209
+ `\n ${propertyName(usedName)}: ${runtimeTemplate.returningFunction(
2210
+ finalName
2211
+ )}`
2212
+ );
2213
+ }
1930
2214
  }
1931
2215
  }
1932
2216
  const name = info.namespaceObjectName;
@@ -1954,16 +2238,21 @@ ${defineGetters}`
1954
2238
  for (const info of modulesWithInfo) {
1955
2239
  if (info.type === "concatenated") {
1956
2240
  const source = namespaceObjectSources.get(info);
1957
- if (!source) continue;
1958
- result.add(source);
2241
+ if (source) result.add(source);
2242
+ const escapeSource = escapeNamespaceObjectSources.get(
2243
+ /** @type {ConcatenatedModuleInfo} */ (info)
2244
+ );
2245
+ if (escapeSource) result.add(escapeSource);
2246
+ if (!source && !escapeSource) continue;
1959
2247
  }
1960
2248
 
1961
2249
  if (info.type === "external" && info.deferred) {
1962
2250
  const moduleId = JSON.stringify(chunkGraph.getModuleId(info.module));
1963
2251
  const loader = getOptimizedDeferredModule(
1964
2252
  moduleId,
1965
- info.module.getExportsType(
2253
+ getExportsType(
1966
2254
  moduleGraph,
2255
+ info,
1967
2256
  /** @type {BuildMeta} */
1968
2257
  (this.rootModule.buildMeta).strictHarmonyModule
1969
2258
  ),
@@ -1973,7 +2262,9 @@ ${defineGetters}`
1973
2262
  );
1974
2263
  runtimeRequirements.add(RuntimeGlobals.require);
1975
2264
  result.add(
1976
- `\n// DEFERRED EXTERNAL MODULE: ${info.module.readableIdentifier(requestShortener)}\nvar ${info.deferredName} = ${loader};`
2265
+ `\n// DEFERRED EXTERNAL MODULE: ${info.module.readableIdentifier(
2266
+ requestShortener
2267
+ )}\nvar ${info.deferredName} = ${loader};`
1977
2268
  );
1978
2269
  if (info.deferredNamespaceObjectUsed) {
1979
2270
  runtimeRequirements.add(RuntimeGlobals.makeDeferredNamespaceObject);
@@ -1983,7 +2274,7 @@ ${defineGetters}`
1983
2274
  }(${JSON.stringify(
1984
2275
  chunkGraph.getModuleId(info.module)
1985
2276
  )}, ${getMakeDeferredNamespaceModeFromExportsType(
1986
- info.module.getExportsType(moduleGraph, strictHarmonyModule)
2277
+ getExportsType(moduleGraph, info, strictHarmonyModule)
1987
2278
  )});`
1988
2279
  );
1989
2280
  }
@@ -2041,8 +2332,15 @@ ${defineGetters}`
2041
2332
  const moduleId = JSON.stringify(
2042
2333
  chunkGraph.getModuleId(info.module)
2043
2334
  );
2335
+ // External module bindings may be wrapped in
2336
+ // runtime-condition `if` blocks but referenced outside,
2337
+ // so they must remain function-scoped (`var`).
2044
2338
  result.add(`var ${info.name} = __webpack_require__(${moduleId});`);
2045
2339
  name = info.name;
2340
+ // Decoupled namespace object for an escaping mangled external
2341
+ // module must come after its import variable is defined.
2342
+ const escapeSource = escapeNamespaceObjectSources.get(info);
2343
+ if (escapeSource) result.add(escapeSource);
2046
2344
  }
2047
2345
  // If a module is deferred in other places, but used as non-deferred here,
2048
2346
  // the module itself will be emitted as mod_deferred (in the case "external"),
@@ -2052,7 +2350,9 @@ ${defineGetters}`
2052
2350
  (rawInfo);
2053
2351
  if (info.deferred && nonDeferAccess) {
2054
2352
  result.add(
2055
- `\n// non-deferred import to a deferred module (${info.module.readableIdentifier(requestShortener)})\nvar ${info.name} = ${info.deferredName}.a;`
2353
+ `\n// non-deferred import to a deferred module (${info.module.readableIdentifier(
2354
+ requestShortener
2355
+ )})\nvar ${info.name} = ${info.deferredName}.a;`
2056
2356
  );
2057
2357
  }
2058
2358
  break;
@@ -2090,6 +2390,7 @@ ${defineGetters}`
2090
2390
  data.set("chunkInitFragments", chunkInitFragments);
2091
2391
  }
2092
2392
  data.set("topLevelDeclarations", topLevelDeclarations);
2393
+ data.set("freeNames", freeNames);
2093
2394
 
2094
2395
  /** @type {CodeGenerationResult} */
2095
2396
  const resultEntry = {
@@ -2135,7 +2436,8 @@ ${defineGetters}`
2135
2436
  usedNames
2136
2437
  );
2137
2438
 
2138
- // TODO cache codeGeneration results
2439
+ // Not cached: Compilation memoizes the outer codeGeneration per
2440
+ // (module, runtime), so inner generation never recomputes usefully.
2139
2441
  const codeGenResult = m.codeGeneration({
2140
2442
  dependencyTemplates,
2141
2443
  runtimeTemplate,
@@ -2236,6 +2538,7 @@ ${defineGetters}`
2236
2538
  module: info.module,
2237
2539
  index,
2238
2540
  ast: undefined,
2541
+ chunkInitFragments: undefined,
2239
2542
  internalSource: undefined,
2240
2543
  runtimeRequirements: undefined,
2241
2544
  source: undefined,
@@ -2246,13 +2549,16 @@ ${defineGetters}`
2246
2549
  rawExportMap: undefined,
2247
2550
  namespaceExportSymbol: undefined,
2248
2551
  namespaceObjectName: undefined,
2552
+ escapeNamespaceObjectName: undefined,
2249
2553
  interopNamespaceObjectUsed: false,
2250
2554
  interopNamespaceObjectName: undefined,
2251
2555
  interopNamespaceObject2Used: false,
2252
2556
  interopNamespaceObject2Name: undefined,
2253
2557
  interopDefaultAccessUsed: false,
2254
2558
  interopDefaultAccessName: undefined,
2255
- concatenationScope: undefined
2559
+ concatenationScope: undefined,
2560
+ exportsTypeStrict: undefined,
2561
+ exportsTypeNonStrict: undefined
2256
2562
  };
2257
2563
  break;
2258
2564
  case "external":
@@ -2263,6 +2569,7 @@ ${defineGetters}`
2263
2569
  nonDeferAccess: info.nonDeferAccess,
2264
2570
  index,
2265
2571
  name: undefined,
2572
+ escapeNamespaceObjectName: undefined,
2266
2573
  deferredName: undefined,
2267
2574
  interopNamespaceObjectUsed: false,
2268
2575
  interopNamespaceObjectName: undefined,
@@ -2270,9 +2577,13 @@ ${defineGetters}`
2270
2577
  interopNamespaceObject2Name: undefined,
2271
2578
  interopDefaultAccessUsed: false,
2272
2579
  interopDefaultAccessName: undefined,
2273
- deferred: moduleGraph.isDeferred(info.module),
2580
+ deferred: this.compilation.options.experiments.deferImport
2581
+ ? moduleGraph.isDeferred(info.module)
2582
+ : false,
2274
2583
  deferredNamespaceObjectName: undefined,
2275
- deferredNamespaceObjectUsed: false
2584
+ deferredNamespaceObjectUsed: false,
2585
+ exportsTypeStrict: undefined,
2586
+ exportsTypeNonStrict: undefined
2276
2587
  };
2277
2588
  break;
2278
2589
  default:
@@ -2318,7 +2629,14 @@ ${defineGetters}`
2318
2629
  break;
2319
2630
  case "external":
2320
2631
  hash.update(
2321
- `${chunkGraph.getModuleId(info.module)}|${runtimeConditionToString(info.runtimeCondition)}|${info.nonDeferAccess ? "1" : "0"}|${chunkGraph.moduleGraph.isDeferred(info.module) ? "1" : "0"}`
2632
+ `${chunkGraph.getModuleId(info.module)}|${runtimeConditionToString(
2633
+ info.runtimeCondition
2634
+ )}|${info.nonDeferAccess ? "1" : "0"}|${
2635
+ this.compilation.options.experiments.deferImport &&
2636
+ chunkGraph.moduleGraph.isDeferred(info.module)
2637
+ ? "1"
2638
+ : "0"
2639
+ }`
2322
2640
  );
2323
2641
  break;
2324
2642
  }