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
@@ -6,6 +6,7 @@
6
6
  "use strict";
7
7
 
8
8
  const { ImportPhaseUtils } = require("./dependencies/ImportPhase");
9
+ const { InlinedUsedName } = require("./optimize/InlineExports");
9
10
  const { equals } = require("./util/ArrayHelpers");
10
11
  const SortableSet = require("./util/SortableSet");
11
12
  const makeSerializable = require("./util/makeSerializable");
@@ -19,8 +20,10 @@ const { forEachRuntime } = require("./util/runtime");
19
20
  /** @typedef {import("./Module")} Module */
20
21
  /** @typedef {import("./ModuleGraph")} ModuleGraph */
21
22
  /** @typedef {import("./ModuleGraphConnection")} ModuleGraphConnection */
22
- /** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
23
- /** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
23
+ /** @typedef {import("./optimize/InlineExports").InlinedValue} InlinedValue */
24
+ /** @typedef {[RestoreProvidedDataExports[], ExportInfo["provided"], ExportInfo["canMangleProvide"], ExportInfo["terminalBinding"]]} RestoreProvidedDataTuple */
25
+ /** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext<RestoreProvidedDataTuple>} ObjectDeserializerContext */
26
+ /** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext<RestoreProvidedDataTuple>} ObjectSerializerContext */
24
27
  /** @typedef {import("./util/Hash")} Hash */
25
28
 
26
29
  /** @typedef {typeof UsageState.OnlyPropertiesUsed | typeof UsageState.NoInfo | typeof UsageState.Unknown | typeof UsageState.Used} RuntimeUsageStateType */
@@ -34,11 +37,11 @@ const { forEachRuntime } = require("./util/runtime");
34
37
  /** @typedef {{ connection: ModuleGraphConnection, export: ExportInfoName[], priority: number }} TargetItem */
35
38
  /** @typedef {Map<Dependency | undefined, TargetItem>} Target */
36
39
 
37
- /** @typedef {string | null} ExportInfoUsedName */
40
+ /** @typedef {string | InlinedUsedName | null} ExportInfoUsedName */
38
41
  /** @typedef {boolean | null} ExportInfoProvided */
39
42
 
40
43
  /** @typedef {Map<ExportInfoName, ExportInfo>} Exports */
41
- /** @typedef {string | string[] | false} UsedName */
44
+ /** @typedef {string | string[] | InlinedUsedName | false} UsedName */
42
45
  /** @typedef {Set<ExportInfo>} AlreadyVisitedExportInfo */
43
46
 
44
47
  /**
@@ -47,7 +50,9 @@ const { forEachRuntime } = require("./util/runtime");
47
50
  * @property {ExportInfoName} name
48
51
  * @property {ExportInfo["provided"]} provided
49
52
  * @property {ExportInfo["canMangleProvide"]} canMangleProvide
53
+ * @property {ExportInfo["canInlineProvide"]=} canInlineProvide
50
54
  * @property {ExportInfo["terminalBinding"]} terminalBinding
55
+ * @property {ExportInfo["pureProvide"]=} pureProvide
51
56
  * @property {RestoreProvidedData | undefined} exportsInfo
52
57
  */
53
58
 
@@ -63,6 +68,12 @@ const RETURNS_TRUE = () => true;
63
68
 
64
69
  const CIRCULAR = Symbol("circular target");
65
70
 
71
+ // bit layout of ExportInfo._inlineFlags
72
+ const INLINE_USE_TRUE = 1;
73
+ const INLINE_USE_FALSE = 2;
74
+ const INLINE_USE_MASK = 3;
75
+ const PURE_PROVIDE_FLAG = 4;
76
+
66
77
  class RestoreProvidedData {
67
78
  /**
68
79
  * Creates an instance of RestoreProvidedData.
@@ -77,9 +88,13 @@ class RestoreProvidedData {
77
88
  otherCanMangleProvide,
78
89
  otherTerminalBinding
79
90
  ) {
91
+ /** @type {RestoreProvidedDataExports[]} */
80
92
  this.exports = exports;
93
+ /** @type {ExportInfoProvided | undefined} */
81
94
  this.otherProvided = otherProvided;
95
+ /** @type {boolean | undefined} */
82
96
  this.otherCanMangleProvide = otherCanMangleProvide;
97
+ /** @type {boolean} */
83
98
  this.otherTerminalBinding = otherTerminalBinding;
84
99
  }
85
100
 
@@ -87,11 +102,12 @@ class RestoreProvidedData {
87
102
  * Serializes this instance into the provided serializer context.
88
103
  * @param {ObjectSerializerContext} context context
89
104
  */
90
- serialize({ write }) {
91
- write(this.exports);
92
- write(this.otherProvided);
93
- write(this.otherCanMangleProvide);
94
- write(this.otherTerminalBinding);
105
+ serialize(context) {
106
+ context
107
+ .write(this.exports)
108
+ .write(this.otherProvided)
109
+ .write(this.otherCanMangleProvide)
110
+ .write(this.otherTerminalBinding);
95
111
  }
96
112
 
97
113
  /**
@@ -99,8 +115,20 @@ class RestoreProvidedData {
99
115
  * @param {ObjectDeserializerContext} context context
100
116
  * @returns {RestoreProvidedData} RestoreProvidedData
101
117
  */
102
- static deserialize({ read }) {
103
- return new RestoreProvidedData(read(), read(), read(), read());
118
+ static deserialize(context) {
119
+ const exports = context.read();
120
+ const c1 = context.rest;
121
+ const otherProvided = c1.read();
122
+ const c2 = c1.rest;
123
+ const otherCanMangleProvide = c2.read();
124
+ const c3 = c2.rest;
125
+ const otherTerminalBinding = c3.read();
126
+ return new RestoreProvidedData(
127
+ exports,
128
+ otherProvided,
129
+ otherCanMangleProvide,
130
+ otherTerminalBinding
131
+ );
104
132
  }
105
133
  }
106
134
 
@@ -137,6 +165,17 @@ class ExportsInfo {
137
165
  this._exportsAreOrdered = false;
138
166
  /** @type {ExportsInfo=} */
139
167
  this._redirectTo = undefined;
168
+ // fast-path flag for hasInlinedUsedName; set by InlineExportsPlugin
169
+ /** @type {boolean} */
170
+ this._hasInlinedExports = false;
171
+ }
172
+
173
+ /**
174
+ * Records that an owned export got an inlined used name.
175
+ * @returns {void}
176
+ */
177
+ markInlinedExports() {
178
+ this._hasInlinedExports = true;
140
179
  }
141
180
 
142
181
  /**
@@ -326,10 +365,15 @@ class ExportsInfo {
326
365
  * @returns {ExportInfo | undefined} export info for this name
327
366
  */
328
367
  getReadOnlyExportInfoRecursive(name) {
329
- const exportInfo = this.getReadOnlyExportInfo(name[0]);
330
- if (name.length === 1) return exportInfo;
331
- if (!exportInfo.exportsInfo) return;
332
- return exportInfo.exportsInfo.getReadOnlyExportInfoRecursive(name.slice(1));
368
+ /** @type {ExportsInfo} */
369
+ let exportsInfo = this;
370
+ const last = name.length - 1;
371
+ for (let i = 0; ; i++) {
372
+ const exportInfo = exportsInfo.getReadOnlyExportInfo(name[i]);
373
+ if (i === last) return exportInfo;
374
+ if (!exportInfo.exportsInfo) return;
375
+ exportsInfo = exportInfo.exportsInfo;
376
+ }
333
377
  }
334
378
 
335
379
  /**
@@ -339,9 +383,14 @@ class ExportsInfo {
339
383
  */
340
384
  getNestedExportsInfo(name) {
341
385
  if (Array.isArray(name) && name.length > 0) {
342
- const info = this.getReadOnlyExportInfo(name[0]);
343
- if (!info.exportsInfo) return;
344
- return info.exportsInfo.getNestedExportsInfo(name.slice(1));
386
+ /** @type {ExportsInfo} */
387
+ let exportsInfo = this;
388
+ for (let i = 0; i < name.length; i++) {
389
+ const info = exportsInfo.getReadOnlyExportInfo(name[i]);
390
+ if (!info.exportsInfo) return;
391
+ exportsInfo = info.exportsInfo;
392
+ }
393
+ return exportsInfo;
345
394
  }
346
395
  return this;
347
396
  }
@@ -657,11 +706,17 @@ class ExportsInfo {
657
706
  */
658
707
  isExportProvided(name) {
659
708
  if (Array.isArray(name)) {
660
- const info = this.getReadOnlyExportInfo(name[0]);
661
- if (info.exportsInfo && name.length > 1) {
662
- return info.exportsInfo.isExportProvided(name.slice(1));
709
+ /** @type {ExportsInfo} */
710
+ let exportsInfo = this;
711
+ const last = name.length - 1;
712
+ for (let i = 0; ; i++) {
713
+ const info = exportsInfo.getReadOnlyExportInfo(name[i]);
714
+ if (info.exportsInfo && i < last) {
715
+ exportsInfo = info.exportsInfo;
716
+ continue;
717
+ }
718
+ return info.provided ? i === last || undefined : info.provided;
663
719
  }
664
- return info.provided ? name.length === 1 || undefined : info.provided;
665
720
  }
666
721
  const info = this.getReadOnlyExportInfo(name);
667
722
  return info.provided;
@@ -725,11 +780,15 @@ class ExportsInfo {
725
780
  getUsed(name, runtime) {
726
781
  if (Array.isArray(name)) {
727
782
  if (name.length === 0) return this.otherExportsInfo.getUsed(runtime);
728
- const info = this.getReadOnlyExportInfo(name[0]);
729
- if (info.exportsInfo && name.length > 1) {
730
- return info.exportsInfo.getUsed(name.slice(1), runtime);
783
+ // Walk the nested path iteratively to avoid a `slice` per level
784
+ /** @type {ExportsInfo} */
785
+ let exportsInfo = this;
786
+ const last = name.length - 1;
787
+ for (let i = 0; ; i++) {
788
+ const info = exportsInfo.getReadOnlyExportInfo(name[i]);
789
+ if (i === last || !info.exportsInfo) return info.getUsed(runtime);
790
+ exportsInfo = info.exportsInfo;
731
791
  }
732
- return info.getUsed(runtime);
733
792
  }
734
793
  const info = this.getReadOnlyExportInfo(name);
735
794
  return info.getUsed(runtime);
@@ -743,33 +802,95 @@ class ExportsInfo {
743
802
  */
744
803
  getUsedName(name, runtime) {
745
804
  if (Array.isArray(name)) {
746
- // TODO improve this
747
805
  if (name.length === 0) {
748
806
  if (!this.isUsed(runtime)) return false;
749
807
  return name;
750
808
  }
751
- const info = this.getReadOnlyExportInfo(name[0]);
752
- const x = info.getUsedName(name[0], runtime);
753
- if (x === false) return false;
754
- const arr =
755
- /** @type {ExportInfoName[]} */
756
- (x === name[0] && name.length === 1 ? name : [x]);
757
- if (name.length === 1) {
758
- return arr;
809
+ // Walk the nested path once, collecting used names into a single array
810
+ // instead of slicing/spreading at every level.
811
+ /** @type {ExportsInfo} */
812
+ let exportsInfo = this;
813
+ /** @type {ExportInfoName[] | undefined} */
814
+ let result;
815
+ const last = name.length - 1;
816
+ for (let i = 0; ; i++) {
817
+ const info = exportsInfo.getReadOnlyExportInfo(name[i]);
818
+ const x = info.getUsedName(name[i], runtime);
819
+ if (x === false) return false;
820
+ if (x instanceof InlinedUsedName) {
821
+ // The inlined value replaces the prefix; trailing ids become its suffix
822
+ if (i === last) return x;
823
+ return new InlinedUsedName(x.value, [
824
+ ...x.suffix,
825
+ ...name.slice(i + 1)
826
+ ]);
827
+ }
828
+ if (i === last) {
829
+ if (result === undefined) return x === name[i] ? name : [x];
830
+ result.push(x);
831
+ return result;
832
+ }
833
+ if (result === undefined) result = [];
834
+ result.push(x);
835
+ // Descend only while the parent is reached purely via property access
836
+ if (
837
+ info.exportsInfo &&
838
+ info.getUsed(runtime) === UsageState.OnlyPropertiesUsed
839
+ ) {
840
+ exportsInfo = info.exportsInfo;
841
+ continue;
842
+ }
843
+ // Cannot descend further: keep the remaining ids unchanged
844
+ for (let j = i + 1; j <= last; j++) result.push(name[j]);
845
+ return result;
846
+ }
847
+ }
848
+ const info = this.getReadOnlyExportInfo(name);
849
+ return info.getUsedName(name, runtime);
850
+ }
851
+
852
+ /**
853
+ * Checks whether `getUsedName(name, runtime)` would return an `InlinedUsedName`,
854
+ * without allocating intermediate used-name arrays (hot path for connection conditions).
855
+ * @param {ExportInfoName[]} name the export name path
856
+ * @param {RuntimeSpec} runtime check usage for this runtime only
857
+ * @returns {boolean} true when the used name resolves to an inlined value
858
+ */
859
+ hasInlinedUsedName(name, runtime) {
860
+ if (name.length === 0) return false;
861
+ /** @type {ExportsInfo} */
862
+ let exportsInfo = this;
863
+ const last = name.length - 1;
864
+ for (let i = 0; ; i++) {
865
+ // follow redirects for the fast-path flag; InlinedUsedName can only
866
+ // exist on a level whose (redirected) exportsInfo is marked
867
+ let hasInlined = false;
868
+ /** @type {ExportsInfo | undefined} */
869
+ let e = exportsInfo;
870
+ while (e !== undefined) {
871
+ if (e._hasInlinedExports) {
872
+ hasInlined = true;
873
+ break;
874
+ }
875
+ e = e._redirectTo;
876
+ }
877
+ if (!hasInlined && i === last) return false;
878
+ const info = exportsInfo.getReadOnlyExportInfo(name[i]);
879
+ if (hasInlined) {
880
+ const x = info.getUsedName(name[i], runtime);
881
+ if (x === false) return false;
882
+ if (x instanceof InlinedUsedName) return true;
883
+ if (i === last) return false;
759
884
  }
760
885
  if (
761
886
  info.exportsInfo &&
762
887
  info.getUsed(runtime) === UsageState.OnlyPropertiesUsed
763
888
  ) {
764
- const nested = info.exportsInfo.getUsedName(name.slice(1), runtime);
765
- if (!nested) return false;
766
- return [...arr, ...(Array.isArray(nested) ? nested : [nested])];
889
+ exportsInfo = info.exportsInfo;
890
+ continue;
767
891
  }
768
- return [...arr, ...name.slice(1)];
892
+ return false;
769
893
  }
770
- const info = this.getReadOnlyExportInfo(name);
771
- const usedName = info.getUsedName(name, runtime);
772
- return usedName;
773
894
  }
774
895
 
775
896
  /**
@@ -790,18 +911,27 @@ class ExportsInfo {
790
911
  * @returns {void}
791
912
  */
792
913
  _updateHash(hash, runtime, alreadyVisitedExportsInfo) {
793
- const set = new Set(alreadyVisitedExportsInfo);
794
- set.add(this);
914
+ // add/delete keeps path semantics without copying the set per level
915
+ alreadyVisitedExportsInfo.add(this);
795
916
  for (const exportInfo of this.orderedExports) {
796
917
  if (exportInfo.hasInfo(this._otherExportsInfo, runtime)) {
797
- exportInfo._updateHash(hash, runtime, set);
918
+ exportInfo._updateHash(hash, runtime, alreadyVisitedExportsInfo);
798
919
  }
799
920
  }
800
- this._sideEffectsOnlyInfo._updateHash(hash, runtime, set);
801
- this._otherExportsInfo._updateHash(hash, runtime, set);
921
+ this._sideEffectsOnlyInfo._updateHash(
922
+ hash,
923
+ runtime,
924
+ alreadyVisitedExportsInfo
925
+ );
926
+ this._otherExportsInfo._updateHash(
927
+ hash,
928
+ runtime,
929
+ alreadyVisitedExportsInfo
930
+ );
802
931
  if (this._redirectTo !== undefined) {
803
- this._redirectTo._updateHash(hash, runtime, set);
932
+ this._redirectTo._updateHash(hash, runtime, alreadyVisitedExportsInfo);
804
933
  }
934
+ alreadyVisitedExportsInfo.delete(this);
805
935
  }
806
936
 
807
937
  /**
@@ -815,22 +945,42 @@ class ExportsInfo {
815
945
  /** @type {RestoreProvidedDataExports[]} */
816
946
  const exports = [];
817
947
  for (const exportInfo of this.orderedExports) {
948
+ const canInlineProvide = exportInfo.canInlineProvide;
949
+ const pureProvide = exportInfo.pureProvide;
950
+ // inline-exports data is only stored when present, so builds without the
951
+ // feature don't pay for it in the persistent cache
952
+ const hasInlineInfo =
953
+ canInlineProvide !== undefined || pureProvide !== undefined;
818
954
  if (
819
955
  exportInfo.provided !== otherProvided ||
820
956
  exportInfo.canMangleProvide !== otherCanMangleProvide ||
821
957
  exportInfo.terminalBinding !== otherTerminalBinding ||
958
+ hasInlineInfo ||
822
959
  exportInfo.exportsInfoOwned
823
960
  ) {
824
- exports.push({
825
- name: exportInfo.name,
826
- provided: exportInfo.provided,
827
- canMangleProvide: exportInfo.canMangleProvide,
828
- terminalBinding: exportInfo.terminalBinding,
829
- exportsInfo: exportInfo.exportsInfoOwned
830
- ? /** @type {NonNullable<ExportInfo["exportsInfo"]>} */
831
- (exportInfo.exportsInfo).getRestoreProvidedData()
832
- : undefined
833
- });
961
+ const exportsInfo = exportInfo.exportsInfoOwned
962
+ ? /** @type {NonNullable<ExportInfo["exportsInfo"]>} */
963
+ (exportInfo.exportsInfo).getRestoreProvidedData()
964
+ : undefined;
965
+ exports.push(
966
+ hasInlineInfo
967
+ ? {
968
+ name: exportInfo.name,
969
+ provided: exportInfo.provided,
970
+ canMangleProvide: exportInfo.canMangleProvide,
971
+ canInlineProvide,
972
+ terminalBinding: exportInfo.terminalBinding,
973
+ pureProvide,
974
+ exportsInfo
975
+ }
976
+ : {
977
+ name: exportInfo.name,
978
+ provided: exportInfo.provided,
979
+ canMangleProvide: exportInfo.canMangleProvide,
980
+ terminalBinding: exportInfo.terminalBinding,
981
+ exportsInfo
982
+ }
983
+ );
834
984
  }
835
985
  }
836
986
  return new RestoreProvidedData(
@@ -865,7 +1015,9 @@ class ExportsInfo {
865
1015
  const exportInfo = this.getExportInfo(exp.name);
866
1016
  exportInfo.provided = exp.provided;
867
1017
  exportInfo.canMangleProvide = exp.canMangleProvide;
1018
+ exportInfo.canInlineProvide = exp.canInlineProvide;
868
1019
  exportInfo.terminalBinding = exp.terminalBinding;
1020
+ exportInfo.pureProvide = exp.pureProvide;
869
1021
  if (exp.exportsInfo) {
870
1022
  const exportsInfo = exportInfo.createNestedExportsInfo();
871
1023
  exportsInfo.restoreProvided(exp.exportsInfo);
@@ -929,6 +1081,14 @@ class ExportInfo {
929
1081
  * @type {boolean | undefined}
930
1082
  */
931
1083
  this.canMangleProvide = initFrom ? initFrom.canMangleProvide : undefined;
1084
+ // only specific export info can be inlined,
1085
+ // so _otherExportsInfo.canInlineProvide is always undefined
1086
+ /**
1087
+ * value slot for `canInlineProvide`
1088
+ * @private
1089
+ * @type {InlinedValue | undefined}
1090
+ */
1091
+ this._inlinedValue = undefined;
932
1092
  /**
933
1093
  * true: it can be mangled
934
1094
  * false: is can not be mangled
@@ -936,6 +1096,12 @@ class ExportInfo {
936
1096
  * @type {boolean | undefined}
937
1097
  */
938
1098
  this.canMangleUse = initFrom ? initFrom.canMangleUse : undefined;
1099
+ /**
1100
+ * bitfield backing `canInlineUse` and `pureProvide`
1101
+ * @private
1102
+ * @type {number}
1103
+ */
1104
+ this._inlineFlags = 0;
939
1105
  /** @type {boolean} */
940
1106
  this.exportsInfoOwned = false;
941
1107
  /** @type {ExportsInfo | undefined} */
@@ -956,6 +1122,57 @@ class ExportInfo {
956
1122
  this._maxTarget = undefined;
957
1123
  }
958
1124
 
1125
+ /**
1126
+ * defined: the export binds to a small primitive constant and may be inlined
1127
+ * undefined: not an inlined constant export
1128
+ * @returns {InlinedValue | undefined} inlined value
1129
+ */
1130
+ get canInlineProvide() {
1131
+ return this._inlinedValue;
1132
+ }
1133
+
1134
+ set canInlineProvide(value) {
1135
+ this._inlinedValue = value;
1136
+ }
1137
+
1138
+ /**
1139
+ * true: at least one consumer accepts inlining, none rejected
1140
+ * false: at least one consumer rejected inlining
1141
+ * undefined: collecting; no consumer has decided yet
1142
+ * @returns {boolean | undefined} can inline use
1143
+ */
1144
+ get canInlineUse() {
1145
+ switch (this._inlineFlags & INLINE_USE_MASK) {
1146
+ case INLINE_USE_TRUE:
1147
+ return true;
1148
+ case INLINE_USE_FALSE:
1149
+ return false;
1150
+ default:
1151
+ return undefined;
1152
+ }
1153
+ }
1154
+
1155
+ set canInlineUse(value) {
1156
+ this._inlineFlags =
1157
+ (this._inlineFlags & ~INLINE_USE_MASK) |
1158
+ (value === undefined ? 0 : value ? INLINE_USE_TRUE : INLINE_USE_FALSE);
1159
+ }
1160
+
1161
+ /**
1162
+ * Only specific export info can be pure, so other_export_info.pure is always undefined.
1163
+ * true: calling the export has no observable side effects
1164
+ * undefined: it was not determined whether the export is pure
1165
+ * @returns {boolean | undefined} pure provide
1166
+ */
1167
+ get pureProvide() {
1168
+ return (this._inlineFlags & PURE_PROVIDE_FLAG) !== 0 ? true : undefined;
1169
+ }
1170
+
1171
+ set pureProvide(value) {
1172
+ if (value) this._inlineFlags |= PURE_PROVIDE_FLAG;
1173
+ else this._inlineFlags &= ~PURE_PROVIDE_FLAG;
1174
+ }
1175
+
959
1176
  get canMangle() {
960
1177
  switch (this.canMangleProvide) {
961
1178
  case undefined:
@@ -977,6 +1194,15 @@ class ExportInfo {
977
1194
  );
978
1195
  }
979
1196
 
1197
+ /**
1198
+ * @returns {InlinedValue | undefined} the inlined value when both provide and use sides agree, otherwise undefined
1199
+ */
1200
+ canInline() {
1201
+ return this.canInlineProvide !== undefined && this.canInlineUse === true
1202
+ ? this.canInlineProvide
1203
+ : undefined;
1204
+ }
1205
+
980
1206
  /**
981
1207
  * Sets used in unknown way.
982
1208
  * @param {RuntimeSpec} runtime only apply to this runtime
@@ -997,6 +1223,10 @@ class ExportInfo {
997
1223
  this.canMangleUse = false;
998
1224
  changed = true;
999
1225
  }
1226
+ if (this.canInlineUse !== false) {
1227
+ this.canInlineUse = false;
1228
+ changed = true;
1229
+ }
1000
1230
  return changed;
1001
1231
  }
1002
1232
 
@@ -1014,6 +1244,10 @@ class ExportInfo {
1014
1244
  this.canMangleUse = false;
1015
1245
  changed = true;
1016
1246
  }
1247
+ if (this.canInlineUse !== false) {
1248
+ this.canInlineUse = false;
1249
+ changed = true;
1250
+ }
1017
1251
  return changed;
1018
1252
  }
1019
1253
 
@@ -1242,10 +1476,10 @@ class ExportInfo {
1242
1476
  }
1243
1477
 
1244
1478
  /**
1245
- * Returns used name.
1479
+ * Returns used name. May return InlinedUsedName when the export is inlined to a primitive.
1246
1480
  * @param {string | undefined} fallbackName fallback name for used exports with no name
1247
1481
  * @param {RuntimeSpec} runtime check usage for this runtime only
1248
- * @returns {string | false} used name
1482
+ * @returns {string | InlinedUsedName | false} used name
1249
1483
  */
1250
1484
  getUsedName(fallbackName, runtime) {
1251
1485
  if (this._hasUseInRuntimeInfo) {
@@ -1257,14 +1491,17 @@ class ExportInfo {
1257
1491
  if (!this._usedInRuntime.has(runtime)) {
1258
1492
  return false;
1259
1493
  }
1260
- } else if (
1261
- runtime !== undefined &&
1262
- [...runtime].every(
1263
- (runtime) =>
1264
- !(/** @type {UsedInRuntime} */ (this._usedInRuntime).has(runtime))
1265
- )
1266
- ) {
1267
- return false;
1494
+ } else if (runtime !== undefined) {
1495
+ // Unused unless at least one runtime in the set is used; loop avoids
1496
+ // allocating an array from the runtime set on this hot path.
1497
+ let anyUsed = false;
1498
+ for (const r of runtime) {
1499
+ if (this._usedInRuntime.has(r)) {
1500
+ anyUsed = true;
1501
+ break;
1502
+ }
1503
+ }
1504
+ if (!anyUsed) return false;
1268
1505
  }
1269
1506
  }
1270
1507
  }
@@ -1282,7 +1519,7 @@ class ExportInfo {
1282
1519
 
1283
1520
  /**
1284
1521
  * Updates used name using the provided name.
1285
- * @param {string} name the new name
1522
+ * @param {string | InlinedUsedName} name the new name
1286
1523
  * @returns {void}
1287
1524
  */
1288
1525
  setUsedName(name) {
@@ -1512,7 +1749,7 @@ class ExportInfo {
1512
1749
  * Move the target forward as long resolveTargetFilter is fulfilled
1513
1750
  * @param {ModuleGraph} moduleGraph the module graph
1514
1751
  * @param {ResolveTargetFilter} resolveTargetFilter filter function to further resolve target
1515
- * @param {(target: TargetItemWithConnection) => ModuleGraphConnection=} updateOriginalConnection updates the original connection instead of using the target connection
1752
+ * @param {((target: TargetItemWithConnection) => ModuleGraphConnection | undefined)=} updateOriginalConnection updates the original connection instead of using the target connection
1516
1753
  * @returns {TargetItemWithConnection | undefined} the resolved target when moved
1517
1754
  */
1518
1755
  moveTarget(moduleGraph, resolveTargetFilter, updateOriginalConnection) {
@@ -1536,7 +1773,7 @@ class ExportInfo {
1536
1773
  /** @type {Target} */
1537
1774
  (this._target).set(undefined, {
1538
1775
  connection: updateOriginalConnection
1539
- ? updateOriginalConnection(target)
1776
+ ? updateOriginalConnection(target) || target.connection
1540
1777
  : target.connection,
1541
1778
  export: /** @type {NonNullable<TargetItemWithConnection["export"]>} */ (
1542
1779
  target.export
@@ -1600,10 +1837,14 @@ class ExportInfo {
1600
1837
  * @param {Set<ExportsInfo>} alreadyVisitedExportsInfo for circular references
1601
1838
  */
1602
1839
  _updateHash(hash, runtime, alreadyVisitedExportsInfo) {
1840
+ const usedNameHash =
1841
+ this._usedName instanceof InlinedUsedName
1842
+ ? `inlined:${this._usedName.render("")}`
1843
+ : this._usedName || this.name;
1603
1844
  hash.update(
1604
- `${this._usedName || this.name}${this.getUsed(runtime)}${this.provided}${
1845
+ `${usedNameHash}${this.getUsed(runtime)}${this.provided}${
1605
1846
  this.terminalBinding
1606
- }`
1847
+ }${this.pureProvide ? "P" : ""}`
1607
1848
  );
1608
1849
  if (this.exportsInfo && !alreadyVisitedExportsInfo.has(this.exportsInfo)) {
1609
1850
  this.exportsInfo._updateHash(hash, runtime, alreadyVisitedExportsInfo);