webpack 5.59.0 → 5.94.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 (570) hide show
  1. package/README.md +48 -38
  2. package/bin/webpack.js +34 -10
  3. package/hot/dev-server.js +19 -5
  4. package/hot/lazy-compilation-node.js +13 -1
  5. package/hot/lazy-compilation-web.js +9 -0
  6. package/hot/log-apply-result.js +5 -0
  7. package/hot/log.js +23 -4
  8. package/hot/only-dev-server.js +3 -2
  9. package/hot/poll.js +5 -2
  10. package/hot/signal.js +6 -2
  11. package/lib/APIPlugin.js +226 -122
  12. package/lib/AbstractMethodError.js +10 -5
  13. package/lib/AsyncDependenciesBlock.js +13 -5
  14. package/lib/AutomaticPrefetchPlugin.js +2 -1
  15. package/lib/BannerPlugin.js +33 -12
  16. package/lib/Cache.js +16 -12
  17. package/lib/CacheFacade.js +13 -16
  18. package/lib/CaseSensitiveModulesWarning.js +8 -8
  19. package/lib/Chunk.js +60 -33
  20. package/lib/ChunkGraph.js +207 -72
  21. package/lib/ChunkGroup.js +40 -20
  22. package/lib/ChunkTemplate.js +43 -0
  23. package/lib/CleanPlugin.js +117 -32
  24. package/lib/CodeGenerationResults.js +8 -7
  25. package/lib/CommentCompilationWarning.js +0 -1
  26. package/lib/CompatibilityPlugin.js +85 -46
  27. package/lib/Compilation.js +712 -392
  28. package/lib/Compiler.js +393 -172
  29. package/lib/ConcatenationScope.js +10 -13
  30. package/lib/ConditionalInitFragment.js +22 -14
  31. package/lib/ConstPlugin.js +104 -64
  32. package/lib/ContextExclusionPlugin.js +3 -3
  33. package/lib/ContextModule.js +283 -108
  34. package/lib/ContextModuleFactory.js +151 -63
  35. package/lib/ContextReplacementPlugin.js +25 -10
  36. package/lib/CssModule.js +166 -0
  37. package/lib/DefinePlugin.js +254 -148
  38. package/lib/DelegatedModule.js +29 -6
  39. package/lib/DelegatedModuleFactoryPlugin.js +42 -22
  40. package/lib/DelegatedPlugin.js +4 -0
  41. package/lib/DependenciesBlock.js +17 -2
  42. package/lib/Dependency.js +58 -29
  43. package/lib/DependencyTemplate.js +24 -3
  44. package/lib/DependencyTemplates.js +2 -2
  45. package/lib/DllEntryPlugin.js +18 -1
  46. package/lib/DllModule.js +21 -4
  47. package/lib/DllModuleFactory.js +2 -1
  48. package/lib/DllPlugin.js +9 -7
  49. package/lib/DllReferencePlugin.js +50 -19
  50. package/lib/EntryOptionPlugin.js +6 -1
  51. package/lib/EntryPlugin.js +7 -4
  52. package/lib/Entrypoint.js +2 -2
  53. package/lib/EnvironmentNotSupportAsyncWarning.js +52 -0
  54. package/lib/EnvironmentPlugin.js +5 -2
  55. package/lib/ErrorHelpers.js +65 -26
  56. package/lib/EvalDevToolModulePlugin.js +37 -13
  57. package/lib/EvalSourceMapDevToolPlugin.js +50 -20
  58. package/lib/ExportsInfo.js +234 -133
  59. package/lib/ExportsInfoApiPlugin.js +31 -15
  60. package/lib/ExternalModule.js +391 -129
  61. package/lib/ExternalModuleFactoryPlugin.js +65 -17
  62. package/lib/FileSystemInfo.js +1038 -523
  63. package/lib/FlagAllModulesAsUsedPlugin.js +27 -27
  64. package/lib/FlagDependencyExportsPlugin.js +352 -349
  65. package/lib/FlagDependencyUsagePlugin.js +10 -10
  66. package/lib/FlagEntryExportAsUsedPlugin.js +26 -23
  67. package/lib/Generator.js +16 -8
  68. package/lib/GraphHelpers.js +3 -2
  69. package/lib/HookWebpackError.js +11 -13
  70. package/lib/HotModuleReplacementPlugin.js +221 -128
  71. package/lib/IgnoreErrorModuleFactory.js +4 -4
  72. package/lib/IgnorePlugin.js +5 -4
  73. package/lib/IgnoreWarningsPlugin.js +6 -9
  74. package/lib/InitFragment.js +39 -15
  75. package/lib/JavascriptMetaInfoPlugin.js +27 -15
  76. package/lib/LibManifestPlugin.js +45 -16
  77. package/lib/LoaderOptionsPlugin.js +13 -3
  78. package/lib/MainTemplate.js +74 -21
  79. package/lib/Module.js +155 -34
  80. package/lib/ModuleBuildError.js +13 -11
  81. package/lib/ModuleDependencyError.js +6 -4
  82. package/lib/ModuleDependencyWarning.js +6 -4
  83. package/lib/ModuleError.js +10 -5
  84. package/lib/ModuleFactory.js +4 -4
  85. package/lib/ModuleFilenameHelpers.js +164 -54
  86. package/lib/ModuleGraph.js +93 -53
  87. package/lib/ModuleGraphConnection.js +27 -13
  88. package/lib/ModuleHashingError.js +29 -0
  89. package/lib/ModuleInfoHeaderPlugin.js +92 -33
  90. package/lib/ModuleNotFoundError.js +5 -2
  91. package/lib/ModuleParseError.js +17 -9
  92. package/lib/ModuleProfile.js +1 -0
  93. package/lib/ModuleRestoreError.js +3 -1
  94. package/lib/ModuleStoreError.js +3 -2
  95. package/lib/ModuleTemplate.js +33 -1
  96. package/lib/ModuleTypeConstants.js +168 -0
  97. package/lib/ModuleWarning.js +10 -5
  98. package/lib/MultiCompiler.js +115 -38
  99. package/lib/MultiStats.js +75 -33
  100. package/lib/MultiWatching.js +6 -2
  101. package/lib/NodeStuffPlugin.js +136 -37
  102. package/lib/NormalModule.js +437 -194
  103. package/lib/NormalModuleFactory.js +313 -116
  104. package/lib/NormalModuleReplacementPlugin.js +10 -4
  105. package/lib/NullFactory.js +1 -1
  106. package/lib/OptimizationStages.js +3 -3
  107. package/lib/Parser.js +1 -1
  108. package/lib/PlatformPlugin.js +39 -0
  109. package/lib/PrefetchPlugin.js +4 -0
  110. package/lib/ProgressPlugin.js +83 -28
  111. package/lib/ProvidePlugin.js +37 -19
  112. package/lib/RawModule.js +18 -5
  113. package/lib/RecordIdsPlugin.js +8 -8
  114. package/lib/RequireJsStuffPlugin.js +22 -15
  115. package/lib/ResolverFactory.js +8 -4
  116. package/lib/RuntimeGlobals.js +99 -65
  117. package/lib/RuntimeModule.js +17 -15
  118. package/lib/RuntimePlugin.js +116 -13
  119. package/lib/RuntimeTemplate.js +304 -102
  120. package/lib/SelfModuleFactory.js +12 -0
  121. package/lib/SizeFormatHelpers.js +2 -4
  122. package/lib/SourceMapDevToolModuleOptionsPlugin.js +4 -0
  123. package/lib/SourceMapDevToolPlugin.js +89 -42
  124. package/lib/Stats.js +12 -7
  125. package/lib/Template.js +30 -33
  126. package/lib/TemplatedPathPlugin.js +102 -34
  127. package/lib/UseStrictPlugin.js +37 -12
  128. package/lib/WarnCaseSensitiveModulesPlugin.js +12 -0
  129. package/lib/WarnDeprecatedOptionPlugin.js +6 -0
  130. package/lib/WatchIgnorePlugin.js +46 -13
  131. package/lib/Watching.js +139 -76
  132. package/lib/WebpackError.js +14 -5
  133. package/lib/WebpackIsIncludedPlugin.js +22 -13
  134. package/lib/WebpackOptionsApply.js +162 -56
  135. package/lib/WebpackOptionsDefaulter.js +10 -3
  136. package/lib/asset/AssetGenerator.js +351 -99
  137. package/lib/asset/AssetModulesPlugin.js +57 -33
  138. package/lib/asset/AssetParser.js +15 -6
  139. package/lib/asset/AssetSourceGenerator.js +30 -10
  140. package/lib/asset/AssetSourceParser.js +8 -2
  141. package/lib/asset/RawDataUrlModule.js +162 -0
  142. package/lib/async-modules/AwaitDependenciesInitFragment.js +16 -13
  143. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  144. package/lib/buildChunkGraph.js +376 -420
  145. package/lib/cache/AddManagedPathsPlugin.js +6 -1
  146. package/lib/cache/IdleFileCachePlugin.js +26 -13
  147. package/lib/cache/MemoryCachePlugin.js +1 -1
  148. package/lib/cache/MemoryWithGcCachePlugin.js +13 -7
  149. package/lib/cache/PackFileCacheStrategy.js +172 -94
  150. package/lib/cache/ResolverCachePlugin.js +115 -43
  151. package/lib/cache/getLazyHashedEtag.js +2 -2
  152. package/lib/cache/mergeEtags.js +16 -21
  153. package/lib/cli.js +195 -110
  154. package/lib/config/browserslistTargetHandler.js +106 -41
  155. package/lib/config/defaults.js +572 -154
  156. package/lib/config/normalization.js +361 -322
  157. package/lib/config/target.js +105 -66
  158. package/lib/container/ContainerEntryDependency.js +2 -1
  159. package/lib/container/ContainerEntryModule.js +27 -11
  160. package/lib/container/ContainerEntryModuleFactory.js +1 -1
  161. package/lib/container/ContainerExposedDependency.js +9 -0
  162. package/lib/container/ContainerPlugin.js +18 -12
  163. package/lib/container/ContainerReferencePlugin.js +1 -1
  164. package/lib/container/FallbackDependency.js +13 -0
  165. package/lib/container/FallbackItemDependency.js +3 -0
  166. package/lib/container/FallbackModule.js +19 -8
  167. package/lib/container/FallbackModuleFactory.js +1 -1
  168. package/lib/container/ModuleFederationPlugin.js +2 -0
  169. package/lib/container/RemoteModule.js +17 -4
  170. package/lib/container/RemoteRuntimeModule.js +31 -17
  171. package/lib/container/RemoteToExternalDependency.js +3 -0
  172. package/lib/container/options.js +18 -4
  173. package/lib/css/CssExportsGenerator.js +203 -0
  174. package/lib/css/CssGenerator.js +151 -0
  175. package/lib/css/CssLoadingRuntimeModule.js +592 -0
  176. package/lib/css/CssModulesPlugin.js +888 -0
  177. package/lib/css/CssParser.js +1049 -0
  178. package/lib/css/walkCssTokens.js +775 -0
  179. package/lib/debug/ProfilingPlugin.js +102 -54
  180. package/lib/dependencies/AMDDefineDependency.js +54 -10
  181. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +204 -61
  182. package/lib/dependencies/AMDPlugin.js +44 -24
  183. package/lib/dependencies/AMDRequireArrayDependency.js +34 -10
  184. package/lib/dependencies/AMDRequireContextDependency.js +15 -0
  185. package/lib/dependencies/AMDRequireDependenciesBlock.js +6 -0
  186. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +185 -54
  187. package/lib/dependencies/AMDRequireDependency.js +21 -6
  188. package/lib/dependencies/AMDRequireItemDependency.js +6 -0
  189. package/lib/dependencies/AMDRuntimeModules.js +4 -4
  190. package/lib/dependencies/CachedConstDependency.js +22 -1
  191. package/lib/dependencies/CommonJsDependencyHelpers.js +16 -2
  192. package/lib/dependencies/CommonJsExportRequireDependency.js +77 -47
  193. package/lib/dependencies/CommonJsExportsDependency.js +28 -5
  194. package/lib/dependencies/CommonJsExportsParserPlugin.js +111 -39
  195. package/lib/dependencies/CommonJsFullRequireDependency.js +42 -8
  196. package/lib/dependencies/CommonJsImportsParserPlugin.js +530 -130
  197. package/lib/dependencies/CommonJsPlugin.js +51 -26
  198. package/lib/dependencies/CommonJsRequireContextDependency.js +23 -2
  199. package/lib/dependencies/CommonJsRequireDependency.js +9 -1
  200. package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -8
  201. package/lib/dependencies/ConstDependency.js +12 -3
  202. package/lib/dependencies/ContextDependency.js +32 -5
  203. package/lib/dependencies/ContextDependencyHelpers.js +92 -62
  204. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -1
  205. package/lib/dependencies/ContextElementDependency.js +41 -4
  206. package/lib/dependencies/CreateScriptUrlDependency.js +22 -1
  207. package/lib/dependencies/CriticalDependencyWarning.js +4 -1
  208. package/lib/dependencies/CssExportDependency.js +156 -0
  209. package/lib/dependencies/CssImportDependency.js +125 -0
  210. package/lib/dependencies/CssLocalIdentifierDependency.js +245 -0
  211. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +111 -0
  212. package/lib/dependencies/CssUrlDependency.js +164 -0
  213. package/lib/dependencies/DelegatedSourceDependency.js +3 -0
  214. package/lib/dependencies/DllEntryDependency.js +14 -0
  215. package/lib/dependencies/DynamicExports.js +15 -11
  216. package/lib/dependencies/ExportsInfoDependency.js +26 -5
  217. package/lib/dependencies/ExternalModuleDependency.js +109 -0
  218. package/lib/dependencies/ExternalModuleInitFragment.js +133 -0
  219. package/lib/dependencies/HarmonyAcceptDependency.js +11 -2
  220. package/lib/dependencies/HarmonyAcceptImportDependency.js +9 -4
  221. package/lib/dependencies/HarmonyCompatibilityDependency.js +6 -5
  222. package/lib/dependencies/HarmonyDetectionParserPlugin.js +29 -3
  223. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +152 -0
  224. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +96 -51
  225. package/lib/dependencies/HarmonyExportExpressionDependency.js +21 -4
  226. package/lib/dependencies/HarmonyExportHeaderDependency.js +13 -0
  227. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +216 -108
  228. package/lib/dependencies/HarmonyExportInitFragment.js +21 -9
  229. package/lib/dependencies/HarmonyExportSpecifierDependency.js +12 -0
  230. package/lib/dependencies/HarmonyExports.js +13 -7
  231. package/lib/dependencies/HarmonyImportDependency.js +65 -19
  232. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +268 -74
  233. package/lib/dependencies/HarmonyImportSideEffectDependency.js +11 -5
  234. package/lib/dependencies/HarmonyImportSpecifierDependency.js +180 -36
  235. package/lib/dependencies/HarmonyModulesPlugin.js +33 -5
  236. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -3
  237. package/lib/dependencies/ImportContextDependency.js +15 -2
  238. package/lib/dependencies/ImportDependency.js +50 -12
  239. package/lib/dependencies/ImportEagerDependency.js +11 -6
  240. package/lib/dependencies/ImportMetaContextDependency.js +42 -0
  241. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +301 -0
  242. package/lib/dependencies/ImportMetaContextPlugin.js +72 -0
  243. package/lib/dependencies/ImportMetaHotAcceptDependency.js +6 -0
  244. package/lib/dependencies/ImportMetaHotDeclineDependency.js +6 -0
  245. package/lib/dependencies/ImportMetaPlugin.js +128 -59
  246. package/lib/dependencies/ImportParserPlugin.js +153 -83
  247. package/lib/dependencies/ImportPlugin.js +21 -7
  248. package/lib/dependencies/ImportWeakDependency.js +11 -6
  249. package/lib/dependencies/JsonExportsDependency.js +38 -30
  250. package/lib/dependencies/LoaderDependency.js +14 -0
  251. package/lib/dependencies/LoaderImportDependency.js +14 -0
  252. package/lib/dependencies/LoaderPlugin.js +54 -40
  253. package/lib/dependencies/LocalModule.js +17 -1
  254. package/lib/dependencies/LocalModuleDependency.js +15 -0
  255. package/lib/dependencies/LocalModulesHelpers.js +22 -4
  256. package/lib/dependencies/ModuleDecoratorDependency.js +9 -1
  257. package/lib/dependencies/ModuleDependency.js +24 -7
  258. package/lib/dependencies/ModuleDependencyTemplateAsId.js +2 -1
  259. package/lib/dependencies/ModuleHotAcceptDependency.js +6 -0
  260. package/lib/dependencies/ModuleHotDeclineDependency.js +6 -0
  261. package/lib/dependencies/PrefetchDependency.js +3 -0
  262. package/lib/dependencies/ProvidedDependency.js +43 -8
  263. package/lib/dependencies/PureExpressionDependency.js +73 -39
  264. package/lib/dependencies/RequireContextDependency.js +6 -16
  265. package/lib/dependencies/RequireContextDependencyParserPlugin.js +14 -6
  266. package/lib/dependencies/RequireContextPlugin.js +20 -7
  267. package/lib/dependencies/RequireEnsureDependenciesBlock.js +7 -0
  268. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +29 -12
  269. package/lib/dependencies/RequireEnsureDependency.js +16 -2
  270. package/lib/dependencies/RequireEnsureItemDependency.js +3 -0
  271. package/lib/dependencies/RequireEnsurePlugin.js +27 -7
  272. package/lib/dependencies/RequireHeaderDependency.js +14 -1
  273. package/lib/dependencies/RequireIncludeDependency.js +6 -1
  274. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +29 -5
  275. package/lib/dependencies/RequireIncludePlugin.js +25 -5
  276. package/lib/dependencies/RequireResolveContextDependency.js +19 -2
  277. package/lib/dependencies/RequireResolveDependency.js +8 -1
  278. package/lib/dependencies/RequireResolveHeaderDependency.js +18 -0
  279. package/lib/dependencies/RuntimeRequirementsDependency.js +9 -1
  280. package/lib/dependencies/StaticExportsDependency.js +8 -0
  281. package/lib/dependencies/SystemPlugin.js +49 -22
  282. package/lib/dependencies/SystemRuntimeModule.js +1 -1
  283. package/lib/dependencies/URLDependency.js +20 -13
  284. package/lib/dependencies/URLPlugin.js +115 -27
  285. package/lib/dependencies/UnsupportedDependency.js +13 -0
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +14 -0
  287. package/lib/dependencies/WebAssemblyImportDependency.js +9 -1
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -1
  289. package/lib/dependencies/WorkerDependency.js +47 -3
  290. package/lib/dependencies/WorkerPlugin.js +143 -59
  291. package/lib/dependencies/getFunctionExpression.js +9 -0
  292. package/lib/dependencies/processExportInfo.js +3 -1
  293. package/lib/electron/ElectronTargetPlugin.js +1 -0
  294. package/lib/esm/ExportWebpackRequireRuntimeModule.js +3 -2
  295. package/lib/esm/ModuleChunkFormatPlugin.js +92 -55
  296. package/lib/esm/ModuleChunkLoadingPlugin.js +12 -1
  297. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +141 -25
  298. package/lib/formatLocation.js +1 -2
  299. package/lib/hmr/HotModuleReplacement.runtime.js +37 -25
  300. package/lib/hmr/HotModuleReplacementRuntimeModule.js +2 -1
  301. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +13 -15
  302. package/lib/hmr/LazyCompilationPlugin.js +94 -41
  303. package/lib/hmr/lazyCompilationBackend.js +107 -44
  304. package/lib/ids/ChunkModuleIdRangePlugin.js +12 -3
  305. package/lib/ids/DeterministicChunkIdsPlugin.js +13 -6
  306. package/lib/ids/DeterministicModuleIdsPlugin.js +59 -35
  307. package/lib/ids/HashedModuleIdsPlugin.js +24 -16
  308. package/lib/ids/IdHelpers.js +59 -49
  309. package/lib/ids/NamedChunkIdsPlugin.js +13 -1
  310. package/lib/ids/NamedModuleIdsPlugin.js +20 -12
  311. package/lib/ids/NaturalModuleIdsPlugin.js +10 -13
  312. package/lib/ids/OccurrenceChunkIdsPlugin.js +6 -2
  313. package/lib/ids/OccurrenceModuleIdsPlugin.js +14 -11
  314. package/lib/ids/SyncModuleIdsPlugin.js +146 -0
  315. package/lib/index.js +44 -5
  316. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +9 -7
  317. package/lib/javascript/BasicEvaluatedExpression.js +133 -19
  318. package/lib/javascript/ChunkHelpers.js +33 -0
  319. package/lib/javascript/CommonJsChunkFormatPlugin.js +18 -15
  320. package/lib/javascript/EnableChunkLoadingPlugin.js +11 -6
  321. package/lib/javascript/JavascriptGenerator.js +37 -6
  322. package/lib/javascript/JavascriptModulesPlugin.js +523 -295
  323. package/lib/javascript/JavascriptParser.js +1591 -574
  324. package/lib/javascript/JavascriptParserHelpers.js +58 -37
  325. package/lib/javascript/StartupHelpers.js +69 -47
  326. package/lib/json/JsonData.js +33 -0
  327. package/lib/json/JsonGenerator.js +29 -21
  328. package/lib/json/JsonModulesPlugin.js +13 -7
  329. package/lib/json/JsonParser.js +30 -16
  330. package/lib/library/AbstractLibraryPlugin.js +6 -2
  331. package/lib/library/AmdLibraryPlugin.js +34 -18
  332. package/lib/library/AssignLibraryPlugin.js +68 -32
  333. package/lib/library/EnableLibraryPlugin.js +39 -14
  334. package/lib/library/ExportPropertyLibraryPlugin.js +14 -5
  335. package/lib/library/JsonpLibraryPlugin.js +4 -3
  336. package/lib/library/ModernModuleLibraryPlugin.js +144 -0
  337. package/lib/library/ModuleLibraryPlugin.js +12 -7
  338. package/lib/library/SystemLibraryPlugin.js +6 -4
  339. package/lib/library/UmdLibraryPlugin.js +119 -100
  340. package/lib/logging/Logger.js +59 -6
  341. package/lib/logging/createConsoleLogger.js +25 -40
  342. package/lib/logging/runtime.js +8 -9
  343. package/lib/logging/truncateArgs.js +9 -8
  344. package/lib/node/CommonJsChunkLoadingPlugin.js +18 -2
  345. package/lib/node/NodeEnvironmentPlugin.js +14 -8
  346. package/lib/node/NodeTargetPlugin.js +7 -0
  347. package/lib/node/NodeTemplatePlugin.js +10 -2
  348. package/lib/node/NodeWatchFileSystem.js +100 -50
  349. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +51 -26
  350. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +13 -2
  351. package/lib/node/ReadFileCompileWasmPlugin.js +21 -3
  352. package/lib/node/RequireChunkLoadingRuntimeModule.js +49 -26
  353. package/lib/node/nodeConsole.js +48 -31
  354. package/lib/optimize/AggressiveMergingPlugin.js +10 -4
  355. package/lib/optimize/AggressiveSplittingPlugin.js +26 -21
  356. package/lib/optimize/ConcatenatedModule.js +353 -212
  357. package/lib/optimize/EnsureChunkConditionsPlugin.js +4 -1
  358. package/lib/optimize/FlagIncludedChunksPlugin.js +14 -8
  359. package/lib/optimize/InnerGraph.js +30 -25
  360. package/lib/optimize/InnerGraphPlugin.js +105 -64
  361. package/lib/optimize/LimitChunkCountPlugin.js +32 -9
  362. package/lib/optimize/MangleExportsPlugin.js +7 -2
  363. package/lib/optimize/MinMaxSizeWarning.js +6 -1
  364. package/lib/optimize/ModuleConcatenationPlugin.js +150 -83
  365. package/lib/optimize/RealContentHashPlugin.js +99 -43
  366. package/lib/optimize/RemoveParentModulesPlugin.js +131 -48
  367. package/lib/optimize/RuntimeChunkPlugin.js +15 -2
  368. package/lib/optimize/SideEffectsFlagPlugin.js +119 -63
  369. package/lib/optimize/SplitChunksPlugin.js +129 -78
  370. package/lib/performance/SizeLimitsPlugin.js +22 -8
  371. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +4 -2
  372. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +4 -1
  373. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +8 -5
  374. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -3
  375. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +5 -3
  376. package/lib/rules/BasicEffectRulePlugin.js +7 -1
  377. package/lib/rules/BasicMatcherRulePlugin.js +8 -1
  378. package/lib/rules/ObjectMatcherRulePlugin.js +19 -2
  379. package/lib/rules/RuleSetCompiler.js +53 -32
  380. package/lib/rules/UseEffectRulePlugin.js +42 -36
  381. package/lib/runtime/AsyncModuleRuntimeModule.js +56 -69
  382. package/lib/runtime/AutoPublicPathRuntimeModule.js +25 -9
  383. package/lib/runtime/BaseUriRuntimeModule.js +35 -0
  384. package/lib/runtime/ChunkNameRuntimeModule.js +1 -1
  385. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +5 -2
  386. package/lib/runtime/CompatRuntimeModule.js +7 -2
  387. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  388. package/lib/runtime/CreateScriptRuntimeModule.js +38 -0
  389. package/lib/runtime/CreateScriptUrlRuntimeModule.js +13 -36
  390. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +6 -3
  391. package/lib/runtime/EnsureChunkRuntimeModule.js +29 -15
  392. package/lib/runtime/GetChunkFilenameRuntimeModule.js +56 -43
  393. package/lib/runtime/GetFullHashRuntimeModule.js +4 -3
  394. package/lib/runtime/GetMainFilenameRuntimeModule.js +5 -2
  395. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +98 -0
  396. package/lib/runtime/GlobalRuntimeModule.js +1 -1
  397. package/lib/runtime/HasOwnPropertyRuntimeModule.js +5 -2
  398. package/lib/runtime/LoadScriptRuntimeModule.js +61 -45
  399. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +5 -2
  400. package/lib/runtime/NonceRuntimeModule.js +24 -0
  401. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -2
  402. package/lib/runtime/PublicPathRuntimeModule.js +9 -2
  403. package/lib/runtime/RelativeUrlRuntimeModule.js +5 -2
  404. package/lib/runtime/RuntimeIdRuntimeModule.js +6 -2
  405. package/lib/runtime/StartupChunkDependenciesPlugin.js +15 -0
  406. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +36 -28
  407. package/lib/runtime/StartupEntrypointRuntimeModule.js +13 -9
  408. package/lib/runtime/SystemContextRuntimeModule.js +1 -1
  409. package/lib/schemes/DataUriPlugin.js +16 -3
  410. package/lib/schemes/HttpUriPlugin.js +336 -120
  411. package/lib/serialization/ArraySerializer.js +22 -6
  412. package/lib/serialization/BinaryMiddleware.js +212 -33
  413. package/lib/serialization/DateObjectSerializer.js +16 -4
  414. package/lib/serialization/ErrorObjectSerializer.js +23 -6
  415. package/lib/serialization/FileMiddleware.js +187 -86
  416. package/lib/serialization/MapObjectSerializer.js +25 -8
  417. package/lib/serialization/NullPrototypeObjectSerializer.js +26 -8
  418. package/lib/serialization/ObjectMiddleware.js +96 -66
  419. package/lib/serialization/PlainObjectSerializer.js +51 -14
  420. package/lib/serialization/RegExpObjectSerializer.js +17 -5
  421. package/lib/serialization/Serializer.js +23 -5
  422. package/lib/serialization/SerializerMiddleware.js +8 -8
  423. package/lib/serialization/SetObjectSerializer.js +22 -6
  424. package/lib/serialization/SingleItemMiddleware.js +2 -2
  425. package/lib/serialization/types.js +2 -2
  426. package/lib/sharing/ConsumeSharedFallbackDependency.js +3 -0
  427. package/lib/sharing/ConsumeSharedModule.js +40 -17
  428. package/lib/sharing/ConsumeSharedPlugin.js +139 -102
  429. package/lib/sharing/ConsumeSharedRuntimeModule.js +144 -130
  430. package/lib/sharing/ProvideForSharedDependency.js +0 -1
  431. package/lib/sharing/ProvideSharedDependency.js +17 -0
  432. package/lib/sharing/ProvideSharedModule.js +19 -6
  433. package/lib/sharing/ProvideSharedModuleFactory.js +1 -1
  434. package/lib/sharing/ProvideSharedPlugin.js +37 -30
  435. package/lib/sharing/SharePlugin.js +2 -2
  436. package/lib/sharing/ShareRuntimeModule.js +20 -10
  437. package/lib/sharing/resolveMatchedConfigs.js +6 -5
  438. package/lib/sharing/utils.js +338 -34
  439. package/lib/stats/DefaultStatsFactoryPlugin.js +660 -396
  440. package/lib/stats/DefaultStatsPresetPlugin.js +85 -25
  441. package/lib/stats/DefaultStatsPrinterPlugin.js +525 -145
  442. package/lib/stats/StatsFactory.js +128 -57
  443. package/lib/stats/StatsPrinter.js +77 -46
  444. package/lib/util/ArrayHelpers.js +35 -1
  445. package/lib/util/ArrayQueue.js +15 -22
  446. package/lib/util/AsyncQueue.js +37 -16
  447. package/lib/util/IterableHelpers.js +3 -4
  448. package/lib/util/LazyBucketSortedSet.js +60 -44
  449. package/lib/util/LazySet.js +11 -2
  450. package/lib/util/MapHelpers.js +17 -5
  451. package/lib/util/ParallelismFactorCalculator.js +11 -1
  452. package/lib/util/Queue.js +9 -3
  453. package/lib/util/Semaphore.js +4 -7
  454. package/lib/util/SetHelpers.js +5 -5
  455. package/lib/util/SortableSet.js +19 -6
  456. package/lib/util/StackedCacheMap.js +33 -3
  457. package/lib/util/StackedMap.js +1 -3
  458. package/lib/util/StringXor.js +46 -0
  459. package/lib/util/TupleQueue.js +9 -3
  460. package/lib/util/TupleSet.js +15 -5
  461. package/lib/util/URLAbsoluteSpecifier.js +8 -8
  462. package/lib/util/WeakTupleMap.js +70 -28
  463. package/lib/util/binarySearchBounds.js +51 -9
  464. package/lib/util/chainedImports.js +97 -0
  465. package/lib/util/cleverMerge.js +51 -36
  466. package/lib/util/comparators.js +146 -83
  467. package/lib/util/compileBooleanMatcher.js +35 -7
  468. package/lib/util/conventions.js +126 -0
  469. package/lib/util/create-schema-validation.js +9 -2
  470. package/lib/util/createHash.js +49 -14
  471. package/lib/util/deprecation.js +48 -15
  472. package/lib/util/deterministicGrouping.js +71 -39
  473. package/lib/util/extractUrlAndGlobal.js +3 -0
  474. package/lib/util/findGraphRoots.js +7 -5
  475. package/lib/util/fs.js +419 -94
  476. package/lib/util/hash/BatchedHash.js +10 -4
  477. package/lib/util/hash/md4.js +20 -0
  478. package/lib/util/hash/wasm-hash.js +163 -0
  479. package/lib/util/hash/xxhash64.js +7 -141
  480. package/lib/util/identifier.js +140 -93
  481. package/lib/util/internalSerializables.js +22 -0
  482. package/lib/util/makeSerializable.js +7 -0
  483. package/lib/util/memoize.js +10 -10
  484. package/lib/util/mergeScope.js +76 -0
  485. package/lib/util/nonNumericOnlyHash.js +22 -0
  486. package/lib/util/numberHash.js +84 -34
  487. package/lib/util/objectToMap.js +0 -1
  488. package/lib/util/processAsyncTree.js +7 -1
  489. package/lib/util/propertyAccess.js +7 -55
  490. package/lib/util/propertyName.js +77 -0
  491. package/lib/util/registerExternalSerializer.js +2 -2
  492. package/lib/util/runtime.js +188 -133
  493. package/lib/util/semver.js +64 -56
  494. package/lib/util/serialization.js +26 -1
  495. package/lib/util/smartGrouping.js +10 -10
  496. package/lib/util/source.js +1 -1
  497. package/lib/validateSchema.js +6 -2
  498. package/lib/wasm/EnableWasmLoadingPlugin.js +9 -4
  499. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +70 -30
  500. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +9 -1
  501. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +34 -16
  502. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +32 -12
  503. package/lib/wasm-async/AsyncWebAssemblyParser.js +17 -4
  504. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +72 -31
  505. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +17 -6
  506. package/lib/wasm-sync/WebAssemblyGenerator.js +72 -52
  507. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -4
  508. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +53 -43
  509. package/lib/wasm-sync/WebAssemblyParser.js +23 -9
  510. package/lib/wasm-sync/WebAssemblyUtils.js +5 -4
  511. package/lib/web/FetchCompileAsyncWasmPlugin.js +11 -1
  512. package/lib/web/FetchCompileWasmPlugin.js +59 -42
  513. package/lib/web/JsonpChunkLoadingPlugin.js +9 -0
  514. package/lib/web/JsonpChunkLoadingRuntimeModule.js +71 -41
  515. package/lib/webpack.js +43 -12
  516. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +15 -12
  517. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +55 -40
  518. package/module.d.ts +233 -0
  519. package/package.json +85 -139
  520. package/schemas/WebpackOptions.check.js +1 -1
  521. package/schemas/WebpackOptions.json +679 -47
  522. package/schemas/plugins/BannerPlugin.check.js +1 -1
  523. package/schemas/plugins/BannerPlugin.json +9 -1
  524. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  525. package/schemas/plugins/HashedModuleIdsPlugin.check.js +1 -1
  526. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  527. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  528. package/schemas/plugins/SourceMapDevToolPlugin.json +4 -0
  529. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  530. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  531. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  532. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  533. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  534. package/schemas/plugins/container/ContainerPlugin.json +10 -1
  535. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  536. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  537. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  538. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  539. package/schemas/plugins/container/ModuleFederationPlugin.json +12 -1
  540. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +7 -0
  541. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +6 -0
  542. package/schemas/plugins/css/CssAutoGeneratorOptions.json +3 -0
  543. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +7 -0
  544. package/schemas/plugins/css/CssAutoParserOptions.check.js +6 -0
  545. package/schemas/plugins/css/CssAutoParserOptions.json +3 -0
  546. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +7 -0
  547. package/schemas/plugins/css/CssGeneratorOptions.check.js +6 -0
  548. package/schemas/plugins/css/CssGeneratorOptions.json +3 -0
  549. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts +7 -0
  550. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +6 -0
  551. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +3 -0
  552. package/schemas/plugins/css/CssGlobalParserOptions.check.d.ts +7 -0
  553. package/schemas/plugins/css/CssGlobalParserOptions.check.js +6 -0
  554. package/schemas/plugins/css/CssGlobalParserOptions.json +3 -0
  555. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +7 -0
  556. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +6 -0
  557. package/schemas/plugins/css/CssModuleGeneratorOptions.json +3 -0
  558. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +7 -0
  559. package/schemas/plugins/css/CssModuleParserOptions.check.js +6 -0
  560. package/schemas/plugins/css/CssModuleParserOptions.json +3 -0
  561. package/schemas/plugins/css/CssParserOptions.check.d.ts +7 -0
  562. package/schemas/plugins/css/CssParserOptions.check.js +6 -0
  563. package/schemas/plugins/css/CssParserOptions.json +3 -0
  564. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  565. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  566. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  567. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  568. package/schemas/plugins/schemes/HttpUriPlugin.json +4 -0
  569. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  570. package/types.d.ts +5026 -1756
@@ -7,6 +7,7 @@
7
7
 
8
8
  const eslintScope = require("eslint-scope");
9
9
  const Referencer = require("eslint-scope/lib/referencer");
10
+ const { SyncBailHook } = require("tapable");
10
11
  const {
11
12
  CachedSource,
12
13
  ConcatSource,
@@ -15,17 +16,20 @@ const {
15
16
  const ConcatenationScope = require("../ConcatenationScope");
16
17
  const { UsageState } = require("../ExportsInfo");
17
18
  const Module = require("../Module");
19
+ const { JAVASCRIPT_MODULE_TYPE_ESM } = require("../ModuleTypeConstants");
18
20
  const RuntimeGlobals = require("../RuntimeGlobals");
19
21
  const Template = require("../Template");
20
22
  const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency");
21
23
  const JavascriptParser = require("../javascript/JavascriptParser");
22
24
  const { equals } = require("../util/ArrayHelpers");
23
25
  const LazySet = require("../util/LazySet");
24
- const { concatComparators, keepOriginalOrder } = require("../util/comparators");
26
+ const { concatComparators } = require("../util/comparators");
25
27
  const createHash = require("../util/createHash");
26
28
  const { makePathsRelative } = require("../util/identifier");
27
29
  const makeSerializable = require("../util/makeSerializable");
30
+ const { getAllReferences, getPathInAst } = require("../util/mergeScope");
28
31
  const propertyAccess = require("../util/propertyAccess");
32
+ const { propertyName } = require("../util/propertyName");
29
33
  const {
30
34
  filterRuntime,
31
35
  intersectRuntime,
@@ -35,43 +39,63 @@ const {
35
39
  subtractRuntimeCondition
36
40
  } = require("../util/runtime");
37
41
 
42
+ /** @typedef {import("eslint-scope").Reference} Reference */
38
43
  /** @typedef {import("eslint-scope").Scope} Scope */
44
+ /** @typedef {import("eslint-scope").Variable} Variable */
39
45
  /** @typedef {import("webpack-sources").Source} Source */
40
46
  /** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
41
47
  /** @typedef {import("../ChunkGraph")} ChunkGraph */
48
+ /** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
42
49
  /** @typedef {import("../Compilation")} Compilation */
43
50
  /** @typedef {import("../Dependency")} Dependency */
44
51
  /** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
45
52
  /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
46
53
  /** @typedef {import("../DependencyTemplates")} DependencyTemplates */
47
54
  /** @typedef {import("../ExportsInfo").ExportInfo} ExportInfo */
48
- /** @template T @typedef {import("../InitFragment")<T>} InitFragment */
55
+ /** @typedef {import("../Module").BuildInfo} BuildInfo */
56
+ /** @typedef {import("../Module").BuildMeta} BuildMeta */
49
57
  /** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */
50
58
  /** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
51
59
  /** @typedef {import("../Module").LibIdentOptions} LibIdentOptions */
60
+ /** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
61
+ /** @typedef {import("../Module").SourceTypes} SourceTypes */
52
62
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
53
63
  /** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
54
64
  /** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
65
+ /** @typedef {import("../ModuleParseError")} ModuleParseError */
55
66
  /** @typedef {import("../RequestShortener")} RequestShortener */
56
67
  /** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
57
68
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
58
69
  /** @typedef {import("../WebpackError")} WebpackError */
59
70
  /** @typedef {import("../javascript/JavascriptModulesPlugin").ChunkRenderContext} ChunkRenderContext */
71
+ /** @typedef {import("../javascript/JavascriptParser").Program} Program */
72
+ /** @typedef {import("../javascript/JavascriptParser").Range} Range */
73
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
60
74
  /** @typedef {import("../util/Hash")} Hash */
61
75
  /** @typedef {typeof import("../util/Hash")} HashConstructor */
62
76
  /** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
63
77
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
64
78
 
79
+ /**
80
+ * @template T
81
+ * @typedef {import("../InitFragment")<T>} InitFragment
82
+ */
83
+
84
+ /**
85
+ * @template T
86
+ * @typedef {import("../util/comparators").Comparator<T>} Comparator
87
+ */
88
+
65
89
  // fix eslint-scope to support class properties correctly
66
90
  // cspell:word Referencer
67
- const ReferencerClass = Referencer;
91
+ const ReferencerClass = /** @type {any} */ (Referencer);
68
92
  if (!ReferencerClass.prototype.PropertyDefinition) {
69
93
  ReferencerClass.prototype.PropertyDefinition =
70
94
  ReferencerClass.prototype.Property;
71
95
  }
72
96
 
73
97
  /**
74
- * @typedef {Object} ReexportInfo
98
+ * @typedef {object} ReexportInfo
75
99
  * @property {Module} module
76
100
  * @property {string[]} export
77
101
  */
@@ -79,7 +103,7 @@ if (!ReferencerClass.prototype.PropertyDefinition) {
79
103
  /** @typedef {RawBinding | SymbolBinding} Binding */
80
104
 
81
105
  /**
82
- * @typedef {Object} RawBinding
106
+ * @typedef {object} RawBinding
83
107
  * @property {ModuleInfo} info
84
108
  * @property {string} rawName
85
109
  * @property {string=} comment
@@ -88,7 +112,7 @@ if (!ReferencerClass.prototype.PropertyDefinition) {
88
112
  */
89
113
 
90
114
  /**
91
- * @typedef {Object} SymbolBinding
115
+ * @typedef {object} SymbolBinding
92
116
  * @property {ConcatenatedModuleInfo} info
93
117
  * @property {string} name
94
118
  * @property {string=} comment
@@ -100,52 +124,54 @@ if (!ReferencerClass.prototype.PropertyDefinition) {
100
124
  /** @typedef {ConcatenatedModuleInfo | ExternalModuleInfo | ReferenceToModuleInfo } ModuleInfoOrReference */
101
125
 
102
126
  /**
103
- * @typedef {Object} ConcatenatedModuleInfo
127
+ * @typedef {object} ConcatenatedModuleInfo
104
128
  * @property {"concatenated"} type
105
129
  * @property {Module} module
106
130
  * @property {number} index
107
- * @property {Object} ast
108
- * @property {Source} internalSource
131
+ * @property {Program | undefined} ast
132
+ * @property {Source | undefined} internalSource
109
133
  * @property {ReplaceSource} source
110
134
  * @property {InitFragment<ChunkRenderContext>[]=} chunkInitFragments
111
- * @property {Iterable<string>} runtimeRequirements
112
- * @property {Scope} globalScope
113
- * @property {Scope} moduleScope
135
+ * @property {ReadOnlyRuntimeRequirements | undefined} runtimeRequirements
136
+ * @property {Scope | undefined} globalScope
137
+ * @property {Scope | undefined} moduleScope
114
138
  * @property {Map<string, string>} internalNames
115
- * @property {Map<string, string>} exportMap
116
- * @property {Map<string, string>} rawExportMap
139
+ * @property {Map<string, string> | undefined} exportMap
140
+ * @property {Map<string, string> | undefined} rawExportMap
117
141
  * @property {string=} namespaceExportSymbol
118
- * @property {string} namespaceObjectName
142
+ * @property {string | undefined} namespaceObjectName
119
143
  * @property {boolean} interopNamespaceObjectUsed
120
- * @property {string} interopNamespaceObjectName
144
+ * @property {string | undefined} interopNamespaceObjectName
121
145
  * @property {boolean} interopNamespaceObject2Used
122
- * @property {string} interopNamespaceObject2Name
146
+ * @property {string | undefined} interopNamespaceObject2Name
123
147
  * @property {boolean} interopDefaultAccessUsed
124
- * @property {string} interopDefaultAccessName
148
+ * @property {string | undefined} interopDefaultAccessName
125
149
  */
126
150
 
127
151
  /**
128
- * @typedef {Object} ExternalModuleInfo
152
+ * @typedef {object} ExternalModuleInfo
129
153
  * @property {"external"} type
130
154
  * @property {Module} module
131
155
  * @property {RuntimeSpec | boolean} runtimeCondition
132
156
  * @property {number} index
133
- * @property {string} name
157
+ * @property {string | undefined} name
134
158
  * @property {boolean} interopNamespaceObjectUsed
135
- * @property {string} interopNamespaceObjectName
159
+ * @property {string | undefined} interopNamespaceObjectName
136
160
  * @property {boolean} interopNamespaceObject2Used
137
- * @property {string} interopNamespaceObject2Name
161
+ * @property {string | undefined} interopNamespaceObject2Name
138
162
  * @property {boolean} interopDefaultAccessUsed
139
- * @property {string} interopDefaultAccessName
163
+ * @property {string | undefined} interopDefaultAccessName
140
164
  */
141
165
 
142
166
  /**
143
- * @typedef {Object} ReferenceToModuleInfo
167
+ * @typedef {object} ReferenceToModuleInfo
144
168
  * @property {"reference"} type
145
169
  * @property {RuntimeSpec | boolean} runtimeCondition
146
170
  * @property {ConcatenatedModuleInfo | ExternalModuleInfo} target
147
171
  */
148
172
 
173
+ /** @typedef {Set<string>} UsedNames */
174
+
149
175
  const RESERVED_NAMES = new Set(
150
176
  [
151
177
  // internal names (should always be renamed)
@@ -184,24 +210,45 @@ const RESERVED_NAMES = new Set(
184
210
  .split(",")
185
211
  );
186
212
 
187
- const bySourceOrder = (a, b) => {
188
- const aOrder = a.sourceOrder;
189
- const bOrder = b.sourceOrder;
190
- if (isNaN(aOrder)) {
191
- if (!isNaN(bOrder)) {
213
+ /**
214
+ * @template T
215
+ * @param {string} property property
216
+ * @param {function(T[keyof T], T[keyof T]): 0 | 1 | -1} comparator comparator
217
+ * @returns {Comparator<T>} comparator
218
+ */
219
+ const createComparator = (property, comparator) => (a, b) =>
220
+ comparator(
221
+ a[/** @type {keyof T} */ (property)],
222
+ b[/** @type {keyof T} */ (property)]
223
+ );
224
+
225
+ /**
226
+ * @param {number} a a
227
+ * @param {number} b b
228
+ * @returns {0 | 1 | -1} result
229
+ */
230
+ const compareNumbers = (a, b) => {
231
+ if (Number.isNaN(a)) {
232
+ if (!Number.isNaN(b)) {
192
233
  return 1;
193
234
  }
194
235
  } else {
195
- if (isNaN(bOrder)) {
236
+ if (Number.isNaN(b)) {
196
237
  return -1;
197
238
  }
198
- if (aOrder !== bOrder) {
199
- return aOrder < bOrder ? -1 : 1;
239
+ if (a !== b) {
240
+ return a < b ? -1 : 1;
200
241
  }
201
242
  }
202
243
  return 0;
203
244
  };
245
+ const bySourceOrder = createComparator("sourceOrder", compareNumbers);
246
+ const byRangeStart = createComparator("rangeStart", compareNumbers);
204
247
 
248
+ /**
249
+ * @param {Iterable<string>} iterable iterable object
250
+ * @returns {string} joined iterable object
251
+ */
205
252
  const joinIterableWithComma = iterable => {
206
253
  // This is more performant than Array.from().join(", ")
207
254
  // as it doesn't create an array
@@ -219,7 +266,7 @@ const joinIterableWithComma = iterable => {
219
266
  };
220
267
 
221
268
  /**
222
- * @typedef {Object} ConcatenationEntry
269
+ * @typedef {object} ConcatenationEntry
223
270
  * @property {"concatenated" | "external"} type
224
271
  * @property {Module} module
225
272
  * @property {RuntimeSpec | boolean} runtimeCondition
@@ -235,7 +282,7 @@ const joinIterableWithComma = iterable => {
235
282
  * @param {RuntimeTemplate} runtimeTemplate the runtime template
236
283
  * @param {Set<ConcatenatedModuleInfo>} neededNamespaceObjects modules for which a namespace object should be generated
237
284
  * @param {boolean} asCall asCall
238
- * @param {boolean} strictHarmonyModule strictHarmonyModule
285
+ * @param {boolean | undefined} strictHarmonyModule strictHarmonyModule
239
286
  * @param {boolean | undefined} asiSafe asiSafe
240
287
  * @param {Set<ExportInfo>} alreadyVisited alreadyVisited
241
288
  * @returns {Binding} the final variable
@@ -264,7 +311,7 @@ const getFinalBinding = (
264
311
  info.interopNamespaceObject2Used = true;
265
312
  return {
266
313
  info,
267
- rawName: info.interopNamespaceObject2Name,
314
+ rawName: /** @type {string} */ (info.interopNamespaceObject2Name),
268
315
  ids: exportName,
269
316
  exportName
270
317
  };
@@ -272,7 +319,7 @@ const getFinalBinding = (
272
319
  info.interopNamespaceObjectUsed = true;
273
320
  return {
274
321
  info,
275
- rawName: info.interopNamespaceObjectName,
322
+ rawName: /** @type {string} */ (info.interopNamespaceObjectName),
276
323
  ids: exportName,
277
324
  exportName
278
325
  };
@@ -330,10 +377,10 @@ const getFinalBinding = (
330
377
  const defaultExport = asCall
331
378
  ? `${info.interopDefaultAccessName}()`
332
379
  : asiSafe
333
- ? `(${info.interopDefaultAccessName}())`
334
- : asiSafe === false
335
- ? `;(${info.interopDefaultAccessName}())`
336
- : `${info.interopDefaultAccessName}.a`;
380
+ ? `(${info.interopDefaultAccessName}())`
381
+ : asiSafe === false
382
+ ? `;(${info.interopDefaultAccessName}())`
383
+ : `${info.interopDefaultAccessName}.a`;
337
384
  return {
338
385
  info,
339
386
  rawName: defaultExport,
@@ -360,12 +407,21 @@ const getFinalBinding = (
360
407
  neededNamespaceObjects.add(info);
361
408
  return {
362
409
  info,
363
- rawName: info.namespaceObjectName,
410
+ rawName:
411
+ /** @type {NonNullable<ConcatenatedModuleInfo["namespaceObjectName"]>} */
412
+ (info.namespaceObjectName),
364
413
  ids: exportName,
365
414
  exportName
366
415
  };
367
416
  case "external":
368
- return { info, rawName: info.name, ids: exportName, exportName };
417
+ return {
418
+ info,
419
+ rawName:
420
+ /** @type {NonNullable<ExternalModuleInfo["name"]>} */
421
+ (info.name),
422
+ ids: exportName,
423
+ exportName
424
+ };
369
425
  }
370
426
  }
371
427
  const exportsInfo = moduleGraph.getExportsInfo(info.module);
@@ -387,7 +443,7 @@ const getFinalBinding = (
387
443
  neededNamespaceObjects.add(info);
388
444
  return {
389
445
  info,
390
- rawName: info.namespaceObjectName,
446
+ rawName: /** @type {string} */ (info.namespaceObjectName),
391
447
  ids: exportName,
392
448
  exportName
393
449
  };
@@ -439,7 +495,7 @@ const getFinalBinding = (
439
495
  const refInfo = moduleToInfoMap.get(reexport.module);
440
496
  return getFinalBinding(
441
497
  moduleGraph,
442
- refInfo,
498
+ /** @type {ModuleInfo} */ (refInfo),
443
499
  reexport.export
444
500
  ? [...reexport.export, ...exportName.slice(1)]
445
501
  : exportName.slice(1),
@@ -449,7 +505,8 @@ const getFinalBinding = (
449
505
  runtimeTemplate,
450
506
  neededNamespaceObjects,
451
507
  asCall,
452
- info.module.buildMeta.strictHarmonyModule,
508
+ /** @type {BuildMeta} */
509
+ (info.module.buildMeta).strictHarmonyModule,
453
510
  asiSafe,
454
511
  alreadyVisited
455
512
  );
@@ -460,7 +517,7 @@ const getFinalBinding = (
460
517
  );
461
518
  return {
462
519
  info,
463
- rawName: info.namespaceObjectName,
520
+ rawName: /** @type {string} */ (info.namespaceObjectName),
464
521
  ids: usedName,
465
522
  exportName
466
523
  };
@@ -502,8 +559,8 @@ const getFinalBinding = (
502
559
  * @param {RuntimeTemplate} runtimeTemplate the runtime template
503
560
  * @param {Set<ConcatenatedModuleInfo>} neededNamespaceObjects modules for which a namespace object should be generated
504
561
  * @param {boolean} asCall asCall
505
- * @param {boolean} callContext callContext
506
- * @param {boolean} strictHarmonyModule strictHarmonyModule
562
+ * @param {boolean | undefined} callContext callContext
563
+ * @param {boolean | undefined} strictHarmonyModule strictHarmonyModule
507
564
  * @param {boolean | undefined} asiSafe asiSafe
508
565
  * @returns {string} the final name
509
566
  */
@@ -563,13 +620,19 @@ const getFinalName = (
563
620
  return asiSafe
564
621
  ? `(0,${reference})`
565
622
  : asiSafe === false
566
- ? `;(0,${reference})`
567
- : `/*#__PURE__*/Object(${reference})`;
623
+ ? `;(0,${reference})`
624
+ : `/*#__PURE__*/Object(${reference})`;
568
625
  }
569
626
  return reference;
570
627
  }
571
628
  };
572
629
 
630
+ /**
631
+ * @param {Scope | null} s scope
632
+ * @param {UsedNames} nameSet name set
633
+ * @param {TODO} scopeSet1 scope set 1
634
+ * @param {TODO} scopeSet2 scope set 2
635
+ */
573
636
  const addScopeSymbols = (s, nameSet, scopeSet1, scopeSet2) => {
574
637
  let scope = s;
575
638
  while (scope) {
@@ -583,71 +646,23 @@ const addScopeSymbols = (s, nameSet, scopeSet1, scopeSet2) => {
583
646
  }
584
647
  };
585
648
 
586
- const getAllReferences = variable => {
587
- let set = variable.references;
588
- // Look for inner scope variables too (like in class Foo { t() { Foo } })
589
- const identifiers = new Set(variable.identifiers);
590
- for (const scope of variable.scope.childScopes) {
591
- for (const innerVar of scope.variables) {
592
- if (innerVar.identifiers.some(id => identifiers.has(id))) {
593
- set = set.concat(innerVar.references);
594
- break;
595
- }
596
- }
597
- }
598
- return set;
599
- };
600
-
601
- const getPathInAst = (ast, node) => {
602
- if (ast === node) {
603
- return [];
604
- }
605
-
606
- const nr = node.range;
607
-
608
- const enterNode = n => {
609
- if (!n) return undefined;
610
- const r = n.range;
611
- if (r) {
612
- if (r[0] <= nr[0] && r[1] >= nr[1]) {
613
- const path = getPathInAst(n, node);
614
- if (path) {
615
- path.push(n);
616
- return path;
617
- }
618
- }
619
- }
620
- return undefined;
621
- };
649
+ const TYPES = new Set(["javascript"]);
622
650
 
623
- if (Array.isArray(ast)) {
624
- for (let i = 0; i < ast.length; i++) {
625
- const enterResult = enterNode(ast[i]);
626
- if (enterResult !== undefined) return enterResult;
627
- }
628
- } else if (ast && typeof ast === "object") {
629
- const keys = Object.keys(ast);
630
- for (let i = 0; i < keys.length; i++) {
631
- const value = ast[keys[i]];
632
- if (Array.isArray(value)) {
633
- const pathResult = getPathInAst(value, node);
634
- if (pathResult !== undefined) return pathResult;
635
- } else if (value && typeof value === "object") {
636
- const enterResult = enterNode(value);
637
- if (enterResult !== undefined) return enterResult;
638
- }
639
- }
640
- }
641
- };
651
+ /**
652
+ * @typedef {object} ConcatenateModuleHooks
653
+ * @property {SyncBailHook<[Record<string, string>], boolean>} exportsDefinitions
654
+ */
642
655
 
643
- const TYPES = new Set(["javascript"]);
656
+ /** @type {WeakMap<Compilation, ConcatenateModuleHooks>} */
657
+ const compilationHooksMap = new WeakMap();
644
658
 
645
659
  class ConcatenatedModule extends Module {
646
660
  /**
647
661
  * @param {Module} rootModule the root module of the concatenation
648
662
  * @param {Set<Module>} modules all modules in the concatenation (including the root module)
649
663
  * @param {RuntimeSpec} runtime the runtime
650
- * @param {Object=} associatedObjectForCache object for caching
664
+ * @param {Compilation} compilation the compilation
665
+ * @param {object=} associatedObjectForCache object for caching
651
666
  * @param {string | HashConstructor=} hashFunction hash function to use
652
667
  * @returns {ConcatenatedModule} the module
653
668
  */
@@ -655,6 +670,7 @@ class ConcatenatedModule extends Module {
655
670
  rootModule,
656
671
  modules,
657
672
  runtime,
673
+ compilation,
658
674
  associatedObjectForCache,
659
675
  hashFunction = "md4"
660
676
  ) {
@@ -668,19 +684,36 @@ class ConcatenatedModule extends Module {
668
684
  identifier,
669
685
  rootModule,
670
686
  modules,
671
- runtime
687
+ runtime,
688
+ compilation
672
689
  });
673
690
  }
674
691
 
675
692
  /**
676
- * @param {Object} options options
693
+ * @param {Compilation} compilation the compilation
694
+ * @returns {ConcatenateModuleHooks} the attached hooks
695
+ */
696
+ static getCompilationHooks(compilation) {
697
+ let hooks = compilationHooksMap.get(compilation);
698
+ if (hooks === undefined) {
699
+ hooks = {
700
+ exportsDefinitions: new SyncBailHook(["definitions"])
701
+ };
702
+ compilationHooksMap.set(compilation, hooks);
703
+ }
704
+ return hooks;
705
+ }
706
+
707
+ /**
708
+ * @param {object} options options
677
709
  * @param {string} options.identifier the identifier of the module
678
710
  * @param {Module=} options.rootModule the root module of the concatenation
679
711
  * @param {RuntimeSpec} options.runtime the selected runtime
680
712
  * @param {Set<Module>=} options.modules all concatenated modules
713
+ * @param {Compilation} options.compilation the compilation
681
714
  */
682
- constructor({ identifier, rootModule, modules, runtime }) {
683
- super("javascript/esm", null, rootModule && rootModule.layer);
715
+ constructor({ identifier, rootModule, modules, runtime, compilation }) {
716
+ super(JAVASCRIPT_MODULE_TYPE_ESM, null, rootModule && rootModule.layer);
684
717
 
685
718
  // Info from Factory
686
719
  /** @type {string} */
@@ -691,6 +724,8 @@ class ConcatenatedModule extends Module {
691
724
  this._modules = modules;
692
725
  this._runtime = runtime;
693
726
  this.factoryMeta = rootModule && rootModule.factoryMeta;
727
+ /** @type {Compilation | undefined} */
728
+ this.compilation = compilation;
694
729
  }
695
730
 
696
731
  /**
@@ -705,7 +740,7 @@ class ConcatenatedModule extends Module {
705
740
  }
706
741
 
707
742
  /**
708
- * @returns {Set<string>} types available (do not mutate)
743
+ * @returns {SourceTypes} types available (do not mutate)
709
744
  */
710
745
  getSourceTypes() {
711
746
  return TYPES;
@@ -727,10 +762,9 @@ class ConcatenatedModule extends Module {
727
762
  * @returns {string} a user readable identifier of the module
728
763
  */
729
764
  readableIdentifier(requestShortener) {
730
- return (
731
- this.rootModule.readableIdentifier(requestShortener) +
732
- ` + ${this._modules.size - 1} modules`
733
- );
765
+ return `${this.rootModule.readableIdentifier(
766
+ requestShortener
767
+ )} + ${this._modules.size - 1} modules`;
734
768
  }
735
769
 
736
770
  /**
@@ -766,11 +800,14 @@ class ConcatenatedModule extends Module {
766
800
  */
767
801
  build(options, compilation, resolver, fs, callback) {
768
802
  const { rootModule } = this;
803
+ const { moduleArgument, exportsArgument } =
804
+ /** @type {BuildInfo} */
805
+ (rootModule.buildInfo);
769
806
  this.buildInfo = {
770
807
  strict: true,
771
808
  cacheable: true,
772
- moduleArgument: rootModule.buildInfo.moduleArgument,
773
- exportsArgument: rootModule.buildInfo.exportsArgument,
809
+ moduleArgument,
810
+ exportsArgument,
774
811
  fileDependencies: new LazySet(),
775
812
  contextDependencies: new LazySet(),
776
813
  missingDependencies: new LazySet(),
@@ -783,7 +820,7 @@ class ConcatenatedModule extends Module {
783
820
 
784
821
  for (const m of this._modules) {
785
822
  // populate cacheable
786
- if (!m.buildInfo.cacheable) {
823
+ if (!(/** @type {BuildInfo} */ (m.buildInfo).cacheable)) {
787
824
  this.buildInfo.cacheable = false;
788
825
  }
789
826
 
@@ -791,7 +828,9 @@ class ConcatenatedModule extends Module {
791
828
  for (const d of m.dependencies.filter(
792
829
  dep =>
793
830
  !(dep instanceof HarmonyImportDependency) ||
794
- !this._modules.has(compilation.moduleGraph.getModule(dep))
831
+ !this._modules.has(
832
+ /** @type {Module} */ (compilation.moduleGraph.getModule(dep))
833
+ )
795
834
  )) {
796
835
  this.dependencies.push(d);
797
836
  }
@@ -816,15 +855,14 @@ class ConcatenatedModule extends Module {
816
855
  }
817
856
  }
818
857
 
858
+ const { assets, assetsInfo, topLevelDeclarations } =
859
+ /** @type {BuildInfo} */ (m.buildInfo);
860
+
819
861
  // populate topLevelDeclarations
820
- if (m.buildInfo.topLevelDeclarations) {
862
+ if (topLevelDeclarations) {
821
863
  const topLevelDeclarations = this.buildInfo.topLevelDeclarations;
822
864
  if (topLevelDeclarations !== undefined) {
823
- for (const decl of m.buildInfo.topLevelDeclarations) {
824
- // reserved names will always be renamed
825
- if (RESERVED_NAMES.has(decl)) continue;
826
- // TODO actually this is incorrect since with renaming there could be more
827
- // We should do the renaming during build
865
+ for (const decl of topLevelDeclarations) {
828
866
  topLevelDeclarations.add(decl);
829
867
  }
830
868
  }
@@ -833,17 +871,24 @@ class ConcatenatedModule extends Module {
833
871
  }
834
872
 
835
873
  // populate assets
836
- if (m.buildInfo.assets) {
874
+ if (assets) {
837
875
  if (this.buildInfo.assets === undefined) {
838
876
  this.buildInfo.assets = Object.create(null);
839
877
  }
840
- Object.assign(this.buildInfo.assets, m.buildInfo.assets);
878
+ Object.assign(
879
+ /** @type {NonNullable<BuildInfo["assets"]>} */
880
+ (
881
+ /** @type {BuildInfo} */
882
+ (this.buildInfo).assets
883
+ ),
884
+ assets
885
+ );
841
886
  }
842
- if (m.buildInfo.assetsInfo) {
887
+ if (assetsInfo) {
843
888
  if (this.buildInfo.assetsInfo === undefined) {
844
889
  this.buildInfo.assetsInfo = new Map();
845
890
  }
846
- for (const [key, value] of m.buildInfo.assetsInfo) {
891
+ for (const [key, value] of assetsInfo) {
847
892
  this.buildInfo.assetsInfo.set(key, value);
848
893
  }
849
894
  }
@@ -883,11 +928,16 @@ class ConcatenatedModule extends Module {
883
928
  * @returns {Iterable<{ connection: ModuleGraphConnection, runtimeCondition: RuntimeSpec | true }>} imported modules in order
884
929
  */
885
930
  const getConcatenatedImports = module => {
886
- let connections = Array.from(moduleGraph.getOutgoingConnections(module));
931
+ const connections = Array.from(
932
+ moduleGraph.getOutgoingConnections(module)
933
+ );
887
934
  if (module === rootModule) {
888
935
  for (const c of moduleGraph.getOutgoingConnections(this))
889
936
  connections.push(c);
890
937
  }
938
+ /**
939
+ * @type {Array<{ connection: ModuleGraphConnection, sourceOrder: number, rangeStart: number }>}
940
+ */
891
941
  const references = connections
892
942
  .filter(connection => {
893
943
  if (!(connection.dependency instanceof HarmonyImportDependency))
@@ -899,15 +949,33 @@ class ConcatenatedModule extends Module {
899
949
  connection.isTargetActive(runtime)
900
950
  );
901
951
  })
902
- .map(connection => ({
903
- connection,
904
- sourceOrder: /** @type {HarmonyImportDependency} */ (
952
+ .map(connection => {
953
+ const dep = /** @type {HarmonyImportDependency} */ (
905
954
  connection.dependency
906
- ).sourceOrder
907
- }));
908
- references.sort(
909
- concatComparators(bySourceOrder, keepOriginalOrder(references))
910
- );
955
+ );
956
+ return {
957
+ connection,
958
+ sourceOrder: dep.sourceOrder,
959
+ rangeStart: dep.range && dep.range[0]
960
+ };
961
+ });
962
+ /**
963
+ * bySourceOrder
964
+ * @example
965
+ * import a from "a"; // sourceOrder=1
966
+ * import b from "b"; // sourceOrder=2
967
+ *
968
+ * byRangeStart
969
+ * @example
970
+ * import {a, b} from "a"; // sourceOrder=1
971
+ * a.a(); // first range
972
+ * b.b(); // second range
973
+ *
974
+ * If there is no reexport, we have the same source.
975
+ * If there is reexport, but module has side effects, this will lead to reexport module only.
976
+ * If there is side-effects-free reexport, we can get simple deterministic result with range start comparison.
977
+ */
978
+ references.sort(concatComparators(bySourceOrder, byRangeStart));
911
979
  /** @type {Map<Module, { connection: ModuleGraphConnection, runtimeCondition: RuntimeSpec | true }>} */
912
980
  const referencesMap = new Map();
913
981
  for (const { connection } of references) {
@@ -1022,7 +1090,7 @@ class ConcatenatedModule extends Module {
1022
1090
  /**
1023
1091
  * @param {Module} rootModule the root module of the concatenation
1024
1092
  * @param {Set<Module>} modules all modules in the concatenation (including the root module)
1025
- * @param {Object=} associatedObjectForCache object for caching
1093
+ * @param {object=} associatedObjectForCache object for caching
1026
1094
  * @param {string | HashConstructor=} hashFunction hash function to use
1027
1095
  * @returns {string} the identifier
1028
1096
  */
@@ -1033,17 +1101,17 @@ class ConcatenatedModule extends Module {
1033
1101
  hashFunction = "md4"
1034
1102
  ) {
1035
1103
  const cachedMakePathsRelative = makePathsRelative.bindContextCache(
1036
- rootModule.context,
1104
+ /** @type {string} */ (rootModule.context),
1037
1105
  associatedObjectForCache
1038
1106
  );
1039
- let identifiers = [];
1107
+ const identifiers = [];
1040
1108
  for (const module of modules) {
1041
1109
  identifiers.push(cachedMakePathsRelative(module.identifier()));
1042
1110
  }
1043
1111
  identifiers.sort();
1044
1112
  const hash = createHash(hashFunction);
1045
1113
  hash.update(identifiers.join(" "));
1046
- return rootModule.identifier() + "|" + hash.digest("hex");
1114
+ return `${rootModule.identifier()}|${hash.digest("hex")}`;
1047
1115
  }
1048
1116
 
1049
1117
  /**
@@ -1077,7 +1145,8 @@ class ConcatenatedModule extends Module {
1077
1145
  runtimeTemplate,
1078
1146
  moduleGraph,
1079
1147
  chunkGraph,
1080
- runtime: generationRuntime
1148
+ runtime: generationRuntime,
1149
+ codeGenerationResults
1081
1150
  }) {
1082
1151
  /** @type {Set<string>} */
1083
1152
  const runtimeRequirements = new Set();
@@ -1104,20 +1173,23 @@ class ConcatenatedModule extends Module {
1104
1173
  runtimeTemplate,
1105
1174
  moduleGraph,
1106
1175
  chunkGraph,
1107
- runtime
1176
+ runtime,
1177
+ codeGenerationResults
1108
1178
  );
1109
1179
  }
1110
1180
 
1111
1181
  // List of all used names to avoid conflicts
1112
1182
  const allUsedNames = new Set(RESERVED_NAMES);
1183
+ // Updated Top level declarations are created by renaming
1184
+ const topLevelDeclarations = new Set();
1113
1185
 
1114
1186
  // List of additional names in scope for module references
1115
- /** @type {Map<string, { usedNames: Set<string>, alreadyCheckedScopes: Set<TODO> }>} */
1187
+ /** @type {Map<string, { usedNames: UsedNames, alreadyCheckedScopes: Set<TODO> }>} */
1116
1188
  const usedNamesInScopeInfo = new Map();
1117
1189
  /**
1118
1190
  * @param {string} module module identifier
1119
1191
  * @param {string} id export id
1120
- * @returns {{ usedNames: Set<string>, alreadyCheckedScopes: Set<TODO> }} info
1192
+ * @returns {{ usedNames: UsedNames, alreadyCheckedScopes: Set<TODO> }} info
1121
1193
  */
1122
1194
  const getUsedNamesInScopeInfo = (module, id) => {
1123
1195
  const key = `${module}-${id}`;
@@ -1147,6 +1219,10 @@ class ConcatenatedModule extends Module {
1147
1219
  // We get ranges of all super class expressions to make
1148
1220
  // renaming to work correctly
1149
1221
  const superClassCache = new WeakMap();
1222
+ /**
1223
+ * @param {Scope} scope scope
1224
+ * @returns {TODO} result
1225
+ */
1150
1226
  const getSuperClassExpressions = scope => {
1151
1227
  const cacheEntry = superClassCache.get(scope);
1152
1228
  if (cacheEntry !== undefined) return cacheEntry;
@@ -1189,7 +1265,8 @@ class ConcatenatedModule extends Module {
1189
1265
  runtimeTemplate,
1190
1266
  neededNamespaceObjects,
1191
1267
  false,
1192
- info.module.buildMeta.strictHarmonyModule,
1268
+ /** @type {BuildMeta} */
1269
+ (info.module.buildMeta).strictHarmonyModule,
1193
1270
  true
1194
1271
  );
1195
1272
  if (!binding.ids) continue;
@@ -1200,8 +1277,10 @@ class ConcatenatedModule extends Module {
1200
1277
  );
1201
1278
  for (const expr of getSuperClassExpressions(reference.from)) {
1202
1279
  if (
1203
- expr.range[0] <= reference.identifier.range[0] &&
1204
- expr.range[1] >= reference.identifier.range[1]
1280
+ expr.range[0] <=
1281
+ /** @type {Range} */ (reference.identifier.range)[0] &&
1282
+ expr.range[1] >=
1283
+ /** @type {Range} */ (reference.identifier.range)[1]
1205
1284
  ) {
1206
1285
  for (const variable of expr.variables) {
1207
1286
  usedNames.add(variable.name);
@@ -1254,13 +1333,18 @@ class ConcatenatedModule extends Module {
1254
1333
  );
1255
1334
  allUsedNames.add(newName);
1256
1335
  info.internalNames.set(name, newName);
1336
+ topLevelDeclarations.add(newName);
1257
1337
  const source = info.source;
1258
1338
  const allIdentifiers = new Set(
1259
1339
  references.map(r => r.identifier).concat(variable.identifiers)
1260
1340
  );
1261
1341
  for (const identifier of allIdentifiers) {
1262
- const r = identifier.range;
1263
- const path = getPathInAst(info.ast, identifier);
1342
+ const r = /** @type {Range} */ (identifier.range);
1343
+ const path = getPathInAst(
1344
+ /** @type {NonNullable<ConcatenatedModuleInfo["ast"]>} */
1345
+ (info.ast),
1346
+ identifier
1347
+ );
1264
1348
  if (path && path.length > 1) {
1265
1349
  const maybeProperty =
1266
1350
  path[1].type === "AssignmentPattern" &&
@@ -1280,6 +1364,7 @@ class ConcatenatedModule extends Module {
1280
1364
  } else {
1281
1365
  allUsedNames.add(name);
1282
1366
  info.internalNames.set(name, name);
1367
+ topLevelDeclarations.add(name);
1283
1368
  }
1284
1369
  }
1285
1370
  let namespaceObjectName;
@@ -1296,7 +1381,10 @@ class ConcatenatedModule extends Module {
1296
1381
  );
1297
1382
  allUsedNames.add(namespaceObjectName);
1298
1383
  }
1299
- info.namespaceObjectName = namespaceObjectName;
1384
+ info.namespaceObjectName =
1385
+ /** @type {string} */
1386
+ (namespaceObjectName);
1387
+ topLevelDeclarations.add(namespaceObjectName);
1300
1388
  break;
1301
1389
  }
1302
1390
  case "external": {
@@ -1308,10 +1396,12 @@ class ConcatenatedModule extends Module {
1308
1396
  );
1309
1397
  allUsedNames.add(externalName);
1310
1398
  info.name = externalName;
1399
+ topLevelDeclarations.add(externalName);
1311
1400
  break;
1312
1401
  }
1313
1402
  }
1314
- if (info.module.buildMeta.exportsType !== "namespace") {
1403
+ const buildMeta = /** @type {BuildMeta} */ (info.module.buildMeta);
1404
+ if (buildMeta.exportsType !== "namespace") {
1315
1405
  const externalNameInterop = this.findNewName(
1316
1406
  "namespaceObject",
1317
1407
  allUsedNames,
@@ -1320,10 +1410,11 @@ class ConcatenatedModule extends Module {
1320
1410
  );
1321
1411
  allUsedNames.add(externalNameInterop);
1322
1412
  info.interopNamespaceObjectName = externalNameInterop;
1413
+ topLevelDeclarations.add(externalNameInterop);
1323
1414
  }
1324
1415
  if (
1325
- info.module.buildMeta.exportsType === "default" &&
1326
- info.module.buildMeta.defaultObject !== "redirect"
1416
+ buildMeta.exportsType === "default" &&
1417
+ buildMeta.defaultObject !== "redirect"
1327
1418
  ) {
1328
1419
  const externalNameInterop = this.findNewName(
1329
1420
  "namespaceObject2",
@@ -1333,11 +1424,9 @@ class ConcatenatedModule extends Module {
1333
1424
  );
1334
1425
  allUsedNames.add(externalNameInterop);
1335
1426
  info.interopNamespaceObject2Name = externalNameInterop;
1427
+ topLevelDeclarations.add(externalNameInterop);
1336
1428
  }
1337
- if (
1338
- info.module.buildMeta.exportsType === "dynamic" ||
1339
- !info.module.buildMeta.exportsType
1340
- ) {
1429
+ if (buildMeta.exportsType === "dynamic" || !buildMeta.exportsType) {
1341
1430
  const externalNameInterop = this.findNewName(
1342
1431
  "default",
1343
1432
  allUsedNames,
@@ -1346,13 +1435,15 @@ class ConcatenatedModule extends Module {
1346
1435
  );
1347
1436
  allUsedNames.add(externalNameInterop);
1348
1437
  info.interopDefaultAccessName = externalNameInterop;
1438
+ topLevelDeclarations.add(externalNameInterop);
1349
1439
  }
1350
1440
  }
1351
1441
 
1352
1442
  // Find and replace references to modules
1353
1443
  for (const info of moduleToInfoMap.values()) {
1354
1444
  if (info.type === "concatenated") {
1355
- for (const reference of info.globalScope.through) {
1445
+ const globalScope = /** @type {Scope} */ (info.globalScope);
1446
+ for (const reference of globalScope.through) {
1356
1447
  const name = reference.identifier.name;
1357
1448
  const match = ConcatenationScope.matchModuleReference(name);
1358
1449
  if (match) {
@@ -1370,10 +1461,11 @@ class ConcatenatedModule extends Module {
1370
1461
  neededNamespaceObjects,
1371
1462
  match.call,
1372
1463
  !match.directImport,
1373
- info.module.buildMeta.strictHarmonyModule,
1464
+ /** @type {BuildMeta} */
1465
+ (info.module.buildMeta).strictHarmonyModule,
1374
1466
  match.asiSafe
1375
1467
  );
1376
- const r = reference.identifier.range;
1468
+ const r = /** @type {Range} */ (reference.identifier.range);
1377
1469
  const source = info.source;
1378
1470
  // range is extended by 2 chars to cover the appended "._"
1379
1471
  source.replace(r[0], r[1] + 1, finalName);
@@ -1393,8 +1485,12 @@ class ConcatenatedModule extends Module {
1393
1485
  const rootInfo = /** @type {ConcatenatedModuleInfo} */ (
1394
1486
  moduleToInfoMap.get(this.rootModule)
1395
1487
  );
1396
- const strictHarmonyModule = rootInfo.module.buildMeta.strictHarmonyModule;
1488
+ const strictHarmonyModule =
1489
+ /** @type {BuildMeta} */
1490
+ (rootInfo.module.buildMeta).strictHarmonyModule;
1397
1491
  const exportsInfo = moduleGraph.getExportsInfo(rootInfo.module);
1492
+ /** @type {Record<string, string>} */
1493
+ const exportsFinalName = {};
1398
1494
  for (const exportInfo of exportsInfo.orderedExports) {
1399
1495
  const name = exportInfo.name;
1400
1496
  if (exportInfo.provided === false) continue;
@@ -1419,12 +1515,15 @@ class ConcatenatedModule extends Module {
1419
1515
  strictHarmonyModule,
1420
1516
  true
1421
1517
  );
1518
+ exportsFinalName[used] = finalName;
1422
1519
  return `/* ${
1423
1520
  exportInfo.isReexport() ? "reexport" : "binding"
1424
1521
  } */ ${finalName}`;
1425
- } catch (e) {
1426
- e.message += `\nwhile generating the root export '${name}' (used name: '${used}')`;
1427
- throw e;
1522
+ } catch (err) {
1523
+ /** @type {Error} */
1524
+ (err).message +=
1525
+ `\nwhile generating the root export '${name}' (used name: '${used}')`;
1526
+ throw err;
1428
1527
  }
1429
1528
  });
1430
1529
  }
@@ -1432,37 +1531,55 @@ class ConcatenatedModule extends Module {
1432
1531
  const result = new ConcatSource();
1433
1532
 
1434
1533
  // add harmony compatibility flag (must be first because of possible circular dependencies)
1534
+ let shouldAddHarmonyFlag = false;
1435
1535
  if (
1436
1536
  moduleGraph.getExportsInfo(this).otherExportsInfo.getUsed(runtime) !==
1437
1537
  UsageState.Unused
1438
1538
  ) {
1439
- result.add(`// ESM COMPAT FLAG\n`);
1440
- result.add(
1441
- runtimeTemplate.defineEsModuleFlagStatement({
1442
- exportsArgument: this.exportsArgument,
1443
- runtimeRequirements
1444
- })
1445
- );
1539
+ shouldAddHarmonyFlag = true;
1446
1540
  }
1447
1541
 
1448
1542
  // define exports
1449
1543
  if (exportsMap.size > 0) {
1450
- runtimeRequirements.add(RuntimeGlobals.exports);
1451
- runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
1544
+ const { exportsDefinitions } = ConcatenatedModule.getCompilationHooks(
1545
+ /** @type {Compilation} */ (this.compilation)
1546
+ );
1547
+
1452
1548
  const definitions = [];
1453
1549
  for (const [key, value] of exportsMap) {
1454
1550
  definitions.push(
1455
- `\n ${JSON.stringify(key)}: ${runtimeTemplate.returningFunction(
1551
+ `\n ${propertyName(key)}: ${runtimeTemplate.returningFunction(
1456
1552
  value(requestShortener)
1457
1553
  )}`
1458
1554
  );
1459
1555
  }
1460
- result.add(`\n// EXPORTS\n`);
1461
- result.add(
1462
- `${RuntimeGlobals.definePropertyGetters}(${
1463
- this.exportsArgument
1464
- }, {${definitions.join(",")}\n});\n`
1465
- );
1556
+ const shouldSkipRenderDefinitions =
1557
+ exportsDefinitions.call(exportsFinalName);
1558
+
1559
+ if (!shouldSkipRenderDefinitions) {
1560
+ runtimeRequirements.add(RuntimeGlobals.exports);
1561
+ runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
1562
+
1563
+ if (shouldAddHarmonyFlag) {
1564
+ result.add("// ESM COMPAT FLAG\n");
1565
+ result.add(
1566
+ runtimeTemplate.defineEsModuleFlagStatement({
1567
+ exportsArgument: this.exportsArgument,
1568
+ runtimeRequirements
1569
+ })
1570
+ );
1571
+ }
1572
+
1573
+ result.add("\n// EXPORTS\n");
1574
+ result.add(
1575
+ `${RuntimeGlobals.definePropertyGetters}(${
1576
+ this.exportsArgument
1577
+ }, {${definitions.join(",")}\n});\n`
1578
+ );
1579
+ } else {
1580
+ /** @type {BuildMeta} */
1581
+ (this.buildMeta).exportsFinalName = exportsFinalName;
1582
+ }
1466
1583
  }
1467
1584
 
1468
1585
  // list unused exports
@@ -1493,13 +1610,14 @@ class ConcatenatedModule extends Module {
1493
1610
  neededNamespaceObjects,
1494
1611
  false,
1495
1612
  undefined,
1496
- info.module.buildMeta.strictHarmonyModule,
1613
+ /** @type {BuildMeta} */
1614
+ (info.module.buildMeta).strictHarmonyModule,
1497
1615
  true
1498
1616
  );
1499
1617
  nsObj.push(
1500
- `\n ${JSON.stringify(
1501
- usedName
1502
- )}: ${runtimeTemplate.returningFunction(finalName)}`
1618
+ `\n ${propertyName(usedName)}: ${runtimeTemplate.returningFunction(
1619
+ finalName
1620
+ )}`
1503
1621
  );
1504
1622
  }
1505
1623
  }
@@ -1508,7 +1626,7 @@ class ConcatenatedModule extends Module {
1508
1626
  nsObj.length > 0
1509
1627
  ? `${RuntimeGlobals.definePropertyGetters}(${name}, {${nsObj.join(
1510
1628
  ","
1511
- )}\n});\n`
1629
+ )}\n});\n`
1512
1630
  : "";
1513
1631
  if (nsObj.length > 0)
1514
1632
  runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
@@ -1578,7 +1696,7 @@ ${defineGetters}`
1578
1696
  result.add(`if (${condition}) {\n`);
1579
1697
  }
1580
1698
  result.add(
1581
- `var ${info.name} = __webpack_require__(${JSON.stringify(
1699
+ `var ${info.name} = ${RuntimeGlobals.require}(${JSON.stringify(
1582
1700
  chunkGraph.getModuleId(info.module)
1583
1701
  )});`
1584
1702
  );
@@ -1615,6 +1733,7 @@ ${defineGetters}`
1615
1733
  const data = new Map();
1616
1734
  if (chunkInitFragments.length > 0)
1617
1735
  data.set("chunkInitFragments", chunkInitFragments);
1736
+ data.set("topLevelDeclarations", topLevelDeclarations);
1618
1737
 
1619
1738
  /** @type {CodeGenerationResult} */
1620
1739
  const resultEntry = {
@@ -1634,6 +1753,7 @@ ${defineGetters}`
1634
1753
  * @param {ModuleGraph} moduleGraph moduleGraph
1635
1754
  * @param {ChunkGraph} chunkGraph chunkGraph
1636
1755
  * @param {RuntimeSpec} runtime runtime
1756
+ * @param {CodeGenerationResults} codeGenerationResults codeGenerationResults
1637
1757
  */
1638
1758
  _analyseModule(
1639
1759
  modulesMap,
@@ -1642,7 +1762,8 @@ ${defineGetters}`
1642
1762
  runtimeTemplate,
1643
1763
  moduleGraph,
1644
1764
  chunkGraph,
1645
- runtime
1765
+ runtime,
1766
+ codeGenerationResults
1646
1767
  ) {
1647
1768
  if (info.type === "concatenated") {
1648
1769
  const m = info.module;
@@ -1657,9 +1778,13 @@ ${defineGetters}`
1657
1778
  moduleGraph,
1658
1779
  chunkGraph,
1659
1780
  runtime,
1660
- concatenationScope
1781
+ concatenationScope,
1782
+ codeGenerationResults,
1783
+ sourceTypes: TYPES
1661
1784
  });
1662
- const source = codeGenResult.sources.get("javascript");
1785
+ const source = /** @type {Source} */ (
1786
+ codeGenResult.sources.get("javascript")
1787
+ );
1663
1788
  const data = codeGenResult.data;
1664
1789
  const chunkInitFragments = data && data.get("chunkInitFragments");
1665
1790
  const code = source.source().toString();
@@ -1668,7 +1793,8 @@ ${defineGetters}`
1668
1793
  ast = JavascriptParser._parse(code, {
1669
1794
  sourceType: "module"
1670
1795
  });
1671
- } catch (err) {
1796
+ } catch (_err) {
1797
+ const err = /** @type {TODO} */ (_err);
1672
1798
  if (
1673
1799
  err.loc &&
1674
1800
  typeof err.loc === "object" &&
@@ -1676,11 +1802,9 @@ ${defineGetters}`
1676
1802
  ) {
1677
1803
  const lineNumber = err.loc.line;
1678
1804
  const lines = code.split("\n");
1679
- err.message +=
1680
- "\n| " +
1681
- lines
1682
- .slice(Math.max(0, lineNumber - 3), lineNumber + 2)
1683
- .join("\n| ");
1805
+ err.message += `\n| ${lines
1806
+ .slice(Math.max(0, lineNumber - 3), lineNumber + 2)
1807
+ .join("\n| ")}`;
1684
1808
  }
1685
1809
  throw err;
1686
1810
  }
@@ -1691,7 +1815,7 @@ ${defineGetters}`
1691
1815
  ignoreEval: true,
1692
1816
  impliedStrict: true
1693
1817
  });
1694
- const globalScope = scopeManager.acquire(ast);
1818
+ const globalScope = /** @type {Scope} */ (scopeManager.acquire(ast));
1695
1819
  const moduleScope = globalScope.childScopes[0];
1696
1820
  const resultSource = new ReplaceSource(source);
1697
1821
  info.runtimeRequirements = codeGenResult.runtimeRequirements;
@@ -1702,7 +1826,9 @@ ${defineGetters}`
1702
1826
  info.globalScope = globalScope;
1703
1827
  info.moduleScope = moduleScope;
1704
1828
  } catch (err) {
1705
- err.message += `\nwhile analysing module ${m.identifier()} for concatenation`;
1829
+ /** @type {Error} */
1830
+ (err).message +=
1831
+ `\nwhile analyzing module ${m.identifier()} for concatenation`;
1706
1832
  throw err;
1707
1833
  }
1708
1834
  }
@@ -1770,21 +1896,30 @@ ${defineGetters}`
1770
1896
  `Unsupported concatenation entry type ${info.type}`
1771
1897
  );
1772
1898
  }
1773
- map.set(item.module, item);
1774
- return item;
1775
- } else {
1776
- /** @type {ReferenceToModuleInfo} */
1777
- const ref = {
1778
- type: "reference",
1779
- runtimeCondition: info.runtimeCondition,
1780
- target: item
1781
- };
1782
- return ref;
1899
+ map.set(
1900
+ /** @type {ModuleInfo} */ (item).module,
1901
+ /** @type {ModuleInfo} */ (item)
1902
+ );
1903
+ return /** @type {ModuleInfo} */ (item);
1783
1904
  }
1905
+ /** @type {ReferenceToModuleInfo} */
1906
+ const ref = {
1907
+ type: "reference",
1908
+ runtimeCondition: info.runtimeCondition,
1909
+ target: item
1910
+ };
1911
+ return ref;
1784
1912
  });
1785
1913
  return [list, map];
1786
1914
  }
1787
1915
 
1916
+ /**
1917
+ * @param {string} oldName old name
1918
+ * @param {UsedNames} usedNamed1 used named 1
1919
+ * @param {UsedNames} usedNamed2 used named 2
1920
+ * @param {string} extraInfo extra info
1921
+ * @returns {string} found new name
1922
+ */
1788
1923
  findNewName(oldName, usedNamed1, usedNamed2, extraInfo) {
1789
1924
  let name = oldName;
1790
1925
 
@@ -1803,7 +1938,7 @@ ${defineGetters}`
1803
1938
 
1804
1939
  const splittedInfo = extraInfo.split("/");
1805
1940
  while (splittedInfo.length) {
1806
- name = splittedInfo.pop() + (name ? "_" + name : "");
1941
+ name = splittedInfo.pop() + (name ? `_${name}` : "");
1807
1942
  const nameIdent = Template.toIdentifier(name);
1808
1943
  if (
1809
1944
  !usedNamed1.has(nameIdent) &&
@@ -1816,6 +1951,7 @@ ${defineGetters}`
1816
1951
  let nameWithNumber = Template.toIdentifier(`${name}_${i}`);
1817
1952
  while (
1818
1953
  usedNamed1.has(nameWithNumber) ||
1954
+ // eslint-disable-next-line no-unmodified-loop-condition
1819
1955
  (usedNamed2 && usedNamed2.has(nameWithNumber))
1820
1956
  ) {
1821
1957
  i++;
@@ -1850,12 +1986,17 @@ ${defineGetters}`
1850
1986
  super.updateHash(hash, context);
1851
1987
  }
1852
1988
 
1989
+ /**
1990
+ * @param {ObjectDeserializerContext} context context
1991
+ * @returns {ConcatenatedModule} ConcatenatedModule
1992
+ */
1853
1993
  static deserialize(context) {
1854
1994
  const obj = new ConcatenatedModule({
1855
1995
  identifier: undefined,
1856
1996
  rootModule: undefined,
1857
1997
  modules: undefined,
1858
- runtime: undefined
1998
+ runtime: undefined,
1999
+ compilation: undefined
1859
2000
  });
1860
2001
  obj.deserialize(context);
1861
2002
  return obj;