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
@@ -6,9 +6,11 @@
6
6
  "use strict";
7
7
 
8
8
  const Dependency = require("../Dependency");
9
+ const Template = require("../Template");
9
10
  const {
10
11
  getDependencyUsedByExportsCondition
11
12
  } = require("../optimize/InnerGraph");
13
+ const { getTrimmedIdsAndRange } = require("../util/chainedImports");
12
14
  const makeSerializable = require("../util/makeSerializable");
13
15
  const propertyAccess = require("../util/propertyAccess");
14
16
  const HarmonyImportDependency = require("./HarmonyImportDependency");
@@ -16,40 +18,64 @@ const HarmonyImportDependency = require("./HarmonyImportDependency");
16
18
  /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
17
19
  /** @typedef {import("../ChunkGraph")} ChunkGraph */
18
20
  /** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
21
+ /** @typedef {import("../Dependency").GetConditionFn} GetConditionFn */
19
22
  /** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
20
23
  /** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
21
24
  /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
25
+ /** @typedef {import("../Module")} Module */
26
+ /** @typedef {import("../Module").BuildMeta} BuildMeta */
22
27
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
23
28
  /** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
24
29
  /** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
25
30
  /** @typedef {import("../WebpackError")} WebpackError */
31
+ /** @typedef {import("../javascript/JavascriptParser").DestructuringAssignmentProperty} DestructuringAssignmentProperty */
32
+ /** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
33
+ /** @typedef {import("../javascript/JavascriptParser").Range} Range */
34
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
35
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
26
36
  /** @typedef {import("../util/Hash")} Hash */
27
37
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
28
38
 
29
39
  const idsSymbol = Symbol("HarmonyImportSpecifierDependency.ids");
30
40
 
41
+ const { ExportPresenceModes } = HarmonyImportDependency;
42
+
31
43
  class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
44
+ /**
45
+ * @param {string} request request
46
+ * @param {number} sourceOrder source order
47
+ * @param {string[]} ids ids
48
+ * @param {string} name name
49
+ * @param {Range} range range
50
+ * @param {TODO} exportPresenceMode export presence mode
51
+ * @param {ImportAttributes | undefined} attributes import attributes
52
+ * @param {Range[] | undefined} idRanges ranges for members of ids; the two arrays are right-aligned
53
+ */
32
54
  constructor(
33
55
  request,
34
56
  sourceOrder,
35
57
  ids,
36
58
  name,
37
59
  range,
38
- strictExportPresence,
39
- assertions
60
+ exportPresenceMode,
61
+ attributes,
62
+ idRanges // TODO webpack 6 make this non-optional. It must always be set to properly trim ids.
40
63
  ) {
41
- super(request, sourceOrder, assertions);
64
+ super(request, sourceOrder, attributes);
42
65
  this.ids = ids;
43
66
  this.name = name;
44
67
  this.range = range;
45
- this.strictExportPresence = strictExportPresence;
68
+ this.idRanges = idRanges;
69
+ this.exportPresenceMode = exportPresenceMode;
46
70
  this.namespaceObjectAsContext = false;
47
71
  this.call = undefined;
48
72
  this.directImport = undefined;
49
73
  this.shorthand = undefined;
50
74
  this.asiSafe = undefined;
51
- /** @type {Set<string> | boolean} */
75
+ /** @type {Set<string> | boolean | undefined} */
52
76
  this.usedByExports = undefined;
77
+ /** @type {Set<DestructuringAssignmentProperty> | undefined} */
78
+ this.referencedPropertiesInDestructuring = undefined;
53
79
  }
54
80
 
55
81
  // TODO webpack 6 remove
@@ -78,7 +104,7 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
78
104
  getIds(moduleGraph) {
79
105
  const meta = moduleGraph.getMetaIfExisting(this);
80
106
  if (meta === undefined) return this.ids;
81
- const ids = meta[idsSymbol];
107
+ const ids = meta[/** @type {keyof object} */ (idsSymbol)];
82
108
  return ids !== undefined ? ids : this.ids;
83
109
  }
84
110
 
@@ -93,7 +119,7 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
93
119
 
94
120
  /**
95
121
  * @param {ModuleGraph} moduleGraph module graph
96
- * @returns {null | false | function(ModuleGraphConnection, RuntimeSpec): ConnectionState} function to determine if the connection is active
122
+ * @returns {null | false | GetConditionFn} function to determine if the connection is active
97
123
  */
98
124
  getCondition(moduleGraph) {
99
125
  return getDependencyUsedByExportsCondition(
@@ -119,20 +145,26 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
119
145
  */
120
146
  getReferencedExports(moduleGraph, runtime) {
121
147
  let ids = this.getIds(moduleGraph);
122
- if (ids.length === 0) return Dependency.EXPORTS_OBJECT_REFERENCED;
148
+ if (ids.length === 0) return this._getReferencedExportsInDestructuring();
123
149
  let namespaceObjectAsContext = this.namespaceObjectAsContext;
124
150
  if (ids[0] === "default") {
125
- const selfModule = moduleGraph.getParentModule(this);
126
- const importedModule = moduleGraph.getModule(this);
151
+ const selfModule =
152
+ /** @type {Module} */
153
+ (moduleGraph.getParentModule(this));
154
+ const importedModule =
155
+ /** @type {Module} */
156
+ (moduleGraph.getModule(this));
127
157
  switch (
128
158
  importedModule.getExportsType(
129
159
  moduleGraph,
130
- selfModule.buildMeta.strictHarmonyModule
160
+ /** @type {BuildMeta} */
161
+ (selfModule.buildMeta).strictHarmonyModule
131
162
  )
132
163
  ) {
133
164
  case "default-only":
134
165
  case "default-with-named":
135
- if (ids.length === 1) return Dependency.EXPORTS_OBJECT_REFERENCED;
166
+ if (ids.length === 1)
167
+ return this._getReferencedExportsInDestructuring();
136
168
  ids = ids.slice(1);
137
169
  namespaceObjectAsContext = true;
138
170
  break;
@@ -150,34 +182,64 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
150
182
  ids = ids.slice(0, -1);
151
183
  }
152
184
 
153
- return [ids];
185
+ return this._getReferencedExportsInDestructuring(ids);
186
+ }
187
+
188
+ /**
189
+ * @param {string[]=} ids ids
190
+ * @returns {string[][]} referenced exports
191
+ */
192
+ _getReferencedExportsInDestructuring(ids) {
193
+ if (this.referencedPropertiesInDestructuring) {
194
+ /** @type {string[][]} */
195
+ const refs = [];
196
+ for (const { id } of this.referencedPropertiesInDestructuring) {
197
+ refs.push(ids ? ids.concat([id]) : [id]);
198
+ }
199
+ return refs;
200
+ }
201
+ return ids ? [ids] : Dependency.EXPORTS_OBJECT_REFERENCED;
202
+ }
203
+
204
+ /**
205
+ * @param {ModuleGraph} moduleGraph module graph
206
+ * @returns {number} effective mode
207
+ */
208
+ _getEffectiveExportPresenceLevel(moduleGraph) {
209
+ if (this.exportPresenceMode !== ExportPresenceModes.AUTO)
210
+ return this.exportPresenceMode;
211
+ const buildMeta =
212
+ /** @type {BuildMeta} */
213
+ (
214
+ /** @type {Module} */
215
+ (moduleGraph.getParentModule(this)).buildMeta
216
+ );
217
+ return buildMeta.strictHarmonyModule
218
+ ? ExportPresenceModes.ERROR
219
+ : ExportPresenceModes.WARN;
154
220
  }
155
221
 
156
222
  /**
157
223
  * Returns warnings
158
224
  * @param {ModuleGraph} moduleGraph module graph
159
- * @returns {WebpackError[]} warnings
225
+ * @returns {WebpackError[] | null | undefined} warnings
160
226
  */
161
227
  getWarnings(moduleGraph) {
162
- if (
163
- this.strictExportPresence ||
164
- moduleGraph.getParentModule(this).buildMeta.strictHarmonyModule
165
- ) {
166
- return null;
228
+ const exportsPresence = this._getEffectiveExportPresenceLevel(moduleGraph);
229
+ if (exportsPresence === ExportPresenceModes.WARN) {
230
+ return this._getErrors(moduleGraph);
167
231
  }
168
- return this._getErrors(moduleGraph);
232
+ return null;
169
233
  }
170
234
 
171
235
  /**
172
236
  * Returns errors
173
237
  * @param {ModuleGraph} moduleGraph module graph
174
- * @returns {WebpackError[]} errors
238
+ * @returns {WebpackError[] | null | undefined} errors
175
239
  */
176
240
  getErrors(moduleGraph) {
177
- if (
178
- this.strictExportPresence ||
179
- moduleGraph.getParentModule(this).buildMeta.strictHarmonyModule
180
- ) {
241
+ const exportsPresence = this._getEffectiveExportPresenceLevel(moduleGraph);
242
+ if (exportsPresence === ExportPresenceModes.ERROR) {
181
243
  return this._getErrors(moduleGraph);
182
244
  }
183
245
  return null;
@@ -204,33 +266,43 @@ class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
204
266
  return 0;
205
267
  }
206
268
 
269
+ /**
270
+ * @param {ObjectSerializerContext} context context
271
+ */
207
272
  serialize(context) {
208
273
  const { write } = context;
209
274
  write(this.ids);
210
275
  write(this.name);
211
276
  write(this.range);
212
- write(this.strictExportPresence);
277
+ write(this.idRanges);
278
+ write(this.exportPresenceMode);
213
279
  write(this.namespaceObjectAsContext);
214
280
  write(this.call);
215
281
  write(this.directImport);
216
282
  write(this.shorthand);
217
283
  write(this.asiSafe);
218
284
  write(this.usedByExports);
285
+ write(this.referencedPropertiesInDestructuring);
219
286
  super.serialize(context);
220
287
  }
221
288
 
289
+ /**
290
+ * @param {ObjectDeserializerContext} context context
291
+ */
222
292
  deserialize(context) {
223
293
  const { read } = context;
224
294
  this.ids = read();
225
295
  this.name = read();
226
296
  this.range = read();
227
- this.strictExportPresence = read();
297
+ this.idRanges = read();
298
+ this.exportPresenceMode = read();
228
299
  this.namespaceObjectAsContext = read();
229
300
  this.call = read();
230
301
  this.directImport = read();
231
302
  this.shorthand = read();
232
303
  this.asiSafe = read();
233
304
  this.usedByExports = read();
305
+ this.referencedPropertiesInDestructuring = read();
234
306
  super.deserialize(context);
235
307
  }
236
308
  }
@@ -251,14 +323,90 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen
251
323
  */
252
324
  apply(dependency, source, templateContext) {
253
325
  const dep = /** @type {HarmonyImportSpecifierDependency} */ (dependency);
254
- const { moduleGraph, module, runtime, concatenationScope } =
255
- templateContext;
326
+ const { moduleGraph, runtime } = templateContext;
256
327
  const connection = moduleGraph.getConnection(dep);
257
328
  // Skip rendering depending when dependency is conditional
258
329
  if (connection && !connection.isTargetActive(runtime)) return;
259
330
 
260
331
  const ids = dep.getIds(moduleGraph);
332
+ const {
333
+ trimmedRange: [trimmedRangeStart, trimmedRangeEnd],
334
+ trimmedIds
335
+ } = getTrimmedIdsAndRange(ids, dep.range, dep.idRanges, moduleGraph, dep);
336
+
337
+ const exportExpr = this._getCodeForIds(
338
+ dep,
339
+ source,
340
+ templateContext,
341
+ trimmedIds
342
+ );
343
+ if (dep.shorthand) {
344
+ source.insert(trimmedRangeEnd, `: ${exportExpr}`);
345
+ } else {
346
+ source.replace(trimmedRangeStart, trimmedRangeEnd - 1, exportExpr);
347
+ }
348
+
349
+ if (dep.referencedPropertiesInDestructuring) {
350
+ let prefixedIds = ids;
261
351
 
352
+ if (ids[0] === "default") {
353
+ const selfModule = moduleGraph.getParentModule(dep);
354
+ const importedModule =
355
+ /** @type {Module} */
356
+ (moduleGraph.getModule(dep));
357
+ const exportsType = importedModule.getExportsType(
358
+ moduleGraph,
359
+ /** @type {BuildMeta} */
360
+ (selfModule.buildMeta).strictHarmonyModule
361
+ );
362
+ if (
363
+ (exportsType === "default-only" ||
364
+ exportsType === "default-with-named") &&
365
+ ids.length >= 1
366
+ ) {
367
+ prefixedIds = ids.slice(1);
368
+ }
369
+ }
370
+
371
+ for (const {
372
+ id,
373
+ shorthand,
374
+ range
375
+ } of dep.referencedPropertiesInDestructuring) {
376
+ const concatedIds = prefixedIds.concat([id]);
377
+ const module = /** @type {Module} */ (moduleGraph.getModule(dep));
378
+ const used = moduleGraph
379
+ .getExportsInfo(module)
380
+ .getUsedName(concatedIds, runtime);
381
+ if (!used) return;
382
+ const newName = used[used.length - 1];
383
+ const name = concatedIds[concatedIds.length - 1];
384
+ if (newName === name) continue;
385
+
386
+ const comment = `${Template.toNormalComment(name)} `;
387
+ const key = comment + JSON.stringify(newName);
388
+ source.replace(
389
+ /** @type {Range} */
390
+ (range)[0],
391
+ /** @type {Range} */
392
+ (range)[1] - 1,
393
+ shorthand ? `${key}: ${name}` : `${key}`
394
+ );
395
+ }
396
+ }
397
+ }
398
+
399
+ /**
400
+ * @param {HarmonyImportSpecifierDependency} dep dependency
401
+ * @param {ReplaceSource} source source
402
+ * @param {DependencyTemplateContext} templateContext context
403
+ * @param {string[]} ids ids
404
+ * @returns {string} generated code
405
+ */
406
+ _getCodeForIds(dep, source, templateContext, ids) {
407
+ const { moduleGraph, module, runtime, concatenationScope } =
408
+ templateContext;
409
+ const connection = moduleGraph.getConnection(dep);
262
410
  let exportExpr;
263
411
  if (
264
412
  connection &&
@@ -289,14 +437,14 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen
289
437
  );
290
438
  }
291
439
  } else {
292
- super.apply(dependency, source, templateContext);
440
+ super.apply(dep, source, templateContext);
293
441
 
294
442
  const { runtimeTemplate, initFragments, runtimeRequirements } =
295
443
  templateContext;
296
444
 
297
445
  exportExpr = runtimeTemplate.exportFromImport({
298
446
  moduleGraph,
299
- module: moduleGraph.getModule(dep),
447
+ module: /** @type {Module} */ (moduleGraph.getModule(dep)),
300
448
  request: dep.request,
301
449
  exportName: ids,
302
450
  originModule: module,
@@ -310,11 +458,7 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen
310
458
  runtimeRequirements
311
459
  });
312
460
  }
313
- if (dep.shorthand) {
314
- source.insert(dep.range[1], `: ${exportExpr}`);
315
- } else {
316
- source.replace(dep.range[0], dep.range[1] - 1, exportExpr);
317
- }
461
+ return exportExpr;
318
462
  }
319
463
  };
320
464
 
@@ -8,6 +8,7 @@
8
8
  const HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
9
9
  const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
10
10
  const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
11
+ const HarmonyEvaluatedImportSpecifierDependency = require("./HarmonyEvaluatedImportSpecifierDependency");
11
12
  const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
12
13
  const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
13
14
  const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
@@ -15,14 +16,27 @@ const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDepend
15
16
  const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
16
17
  const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
17
18
 
19
+ const {
20
+ JAVASCRIPT_MODULE_TYPE_AUTO,
21
+ JAVASCRIPT_MODULE_TYPE_ESM
22
+ } = require("../ModuleTypeConstants");
18
23
  const HarmonyDetectionParserPlugin = require("./HarmonyDetectionParserPlugin");
19
24
  const HarmonyExportDependencyParserPlugin = require("./HarmonyExportDependencyParserPlugin");
20
25
  const HarmonyImportDependencyParserPlugin = require("./HarmonyImportDependencyParserPlugin");
21
26
  const HarmonyTopLevelThisParserPlugin = require("./HarmonyTopLevelThisParserPlugin");
22
27
 
28
+ /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
23
29
  /** @typedef {import("../Compiler")} Compiler */
30
+ /** @typedef {import("../javascript/JavascriptParser")} Parser */
31
+
32
+ const PLUGIN_NAME = "HarmonyModulesPlugin";
33
+
34
+ /** @typedef {{ topLevelAwait?: boolean }} HarmonyModulesPluginOptions */
24
35
 
25
36
  class HarmonyModulesPlugin {
37
+ /**
38
+ * @param {HarmonyModulesPluginOptions} options options
39
+ */
26
40
  constructor(options) {
27
41
  this.options = options;
28
42
  }
@@ -34,7 +48,7 @@ class HarmonyModulesPlugin {
34
48
  */
35
49
  apply(compiler) {
36
50
  compiler.hooks.compilation.tap(
37
- "HarmonyModulesPlugin",
51
+ PLUGIN_NAME,
38
52
  (compilation, { normalModuleFactory }) => {
39
53
  compilation.dependencyTemplates.set(
40
54
  HarmonyCompatibilityDependency,
@@ -59,6 +73,15 @@ class HarmonyModulesPlugin {
59
73
  new HarmonyImportSpecifierDependency.Template()
60
74
  );
61
75
 
76
+ compilation.dependencyFactories.set(
77
+ HarmonyEvaluatedImportSpecifierDependency,
78
+ normalModuleFactory
79
+ );
80
+ compilation.dependencyTemplates.set(
81
+ HarmonyEvaluatedImportSpecifierDependency,
82
+ new HarmonyEvaluatedImportSpecifierDependency.Template()
83
+ );
84
+
62
85
  compilation.dependencyTemplates.set(
63
86
  HarmonyExportHeaderDependency,
64
87
  new HarmonyExportHeaderDependency.Template()
@@ -97,6 +120,11 @@ class HarmonyModulesPlugin {
97
120
  new HarmonyAcceptImportDependency.Template()
98
121
  );
99
122
 
123
+ /**
124
+ * @param {Parser} parser parser parser
125
+ * @param {JavascriptParserOptions} parserOptions parserOptions
126
+ * @returns {void}
127
+ */
100
128
  const handler = (parser, parserOptions) => {
101
129
  // TODO webpack 6: rename harmony to esm or module
102
130
  if (parserOptions.harmony !== undefined && !parserOptions.harmony)
@@ -109,11 +137,11 @@ class HarmonyModulesPlugin {
109
137
  };
110
138
 
111
139
  normalModuleFactory.hooks.parser
112
- .for("javascript/auto")
113
- .tap("HarmonyModulesPlugin", handler);
140
+ .for(JAVASCRIPT_MODULE_TYPE_AUTO)
141
+ .tap(PLUGIN_NAME, handler);
114
142
  normalModuleFactory.hooks.parser
115
- .for("javascript/esm")
116
- .tap("HarmonyModulesPlugin", handler);
143
+ .for(JAVASCRIPT_MODULE_TYPE_ESM)
144
+ .tap(PLUGIN_NAME, handler);
117
145
  }
118
146
  );
119
147
  }
@@ -8,17 +8,29 @@
8
8
  const ConstDependency = require("./ConstDependency");
9
9
  const HarmonyExports = require("./HarmonyExports");
10
10
 
11
+ /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
12
+ /** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
13
+ /** @typedef {import("../javascript/JavascriptParser").Range} Range */
14
+
11
15
  class HarmonyTopLevelThisParserPlugin {
16
+ /**
17
+ * @param {JavascriptParser} parser the parser
18
+ * @returns {void}
19
+ */
12
20
  apply(parser) {
13
21
  parser.hooks.expression
14
22
  .for("this")
15
23
  .tap("HarmonyTopLevelThisParserPlugin", node => {
16
24
  if (!parser.scope.topLevelScope) return;
17
25
  if (HarmonyExports.isEnabled(parser.state)) {
18
- const dep = new ConstDependency("undefined", node.range, null);
19
- dep.loc = node.loc;
26
+ const dep = new ConstDependency(
27
+ "undefined",
28
+ /** @type {Range} */ (node.range),
29
+ null
30
+ );
31
+ dep.loc = /** @type {DependencyLocation} */ (node.loc);
20
32
  parser.state.module.addPresentationalDependency(dep);
21
- return this;
33
+ return true;
22
34
  }
23
35
  });
24
36
  }
@@ -9,7 +9,16 @@ const makeSerializable = require("../util/makeSerializable");
9
9
  const ContextDependency = require("./ContextDependency");
10
10
  const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
11
11
 
12
+ /** @typedef {import("../javascript/JavascriptParser").Range} Range */
13
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
14
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
15
+
12
16
  class ImportContextDependency extends ContextDependency {
17
+ /**
18
+ * @param {TODO} options options
19
+ * @param {Range} range range
20
+ * @param {Range} valueRange value range
21
+ */
13
22
  constructor(options, range, valueRange) {
14
23
  super(options);
15
24
 
@@ -25,19 +34,23 @@ class ImportContextDependency extends ContextDependency {
25
34
  return "esm";
26
35
  }
27
36
 
37
+ /**
38
+ * @param {ObjectSerializerContext} context context
39
+ */
28
40
  serialize(context) {
29
41
  const { write } = context;
30
42
 
31
- write(this.range);
32
43
  write(this.valueRange);
33
44
 
34
45
  super.serialize(context);
35
46
  }
36
47
 
48
+ /**
49
+ * @param {ObjectDeserializerContext} context context
50
+ */
37
51
  deserialize(context) {
38
52
  const { read } = context;
39
53
 
40
- this.range = read();
41
54
  this.valueRange = read();
42
55
 
43
56
  super.deserialize(context);
@@ -13,19 +13,27 @@ const ModuleDependency = require("./ModuleDependency");
13
13
  /** @typedef {import("../AsyncDependenciesBlock")} AsyncDependenciesBlock */
14
14
  /** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
15
15
  /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
16
+ /** @typedef {import("../Module")} Module */
17
+ /** @typedef {import("../Module").BuildMeta} BuildMeta */
16
18
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
19
+ /** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
20
+ /** @typedef {import("../javascript/JavascriptParser").Range} Range */
21
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
22
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
17
23
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
18
24
 
19
25
  class ImportDependency extends ModuleDependency {
20
26
  /**
21
27
  * @param {string} request the request
22
- * @param {[number, number]} range expression range
23
- * @param {string[][]=} referencedExports list of referenced exports
28
+ * @param {Range} range expression range
29
+ * @param {(string[][] | null)=} referencedExports list of referenced exports
30
+ * @param {ImportAttributes=} attributes import attributes
24
31
  */
25
- constructor(request, range, referencedExports) {
32
+ constructor(request, range, referencedExports, attributes) {
26
33
  super(request);
27
34
  this.range = range;
28
35
  this.referencedExports = referencedExports;
36
+ this.assertions = attributes;
29
37
  }
30
38
 
31
39
  get type() {
@@ -43,23 +51,53 @@ class ImportDependency extends ModuleDependency {
43
51
  * @returns {(string[] | ReferencedExport)[]} referenced exports
44
52
  */
45
53
  getReferencedExports(moduleGraph, runtime) {
46
- return this.referencedExports
47
- ? this.referencedExports.map(e => ({
48
- name: e,
49
- canMangle: false
50
- }))
51
- : Dependency.EXPORTS_OBJECT_REFERENCED;
54
+ if (!this.referencedExports) return Dependency.EXPORTS_OBJECT_REFERENCED;
55
+ const refs = [];
56
+ for (const referencedExport of this.referencedExports) {
57
+ if (referencedExport[0] === "default") {
58
+ const selfModule =
59
+ /** @type {Module} */
60
+ (moduleGraph.getParentModule(this));
61
+ const importedModule =
62
+ /** @type {Module} */
63
+ (moduleGraph.getModule(this));
64
+ const exportsType = importedModule.getExportsType(
65
+ moduleGraph,
66
+ /** @type {BuildMeta} */
67
+ (selfModule.buildMeta).strictHarmonyModule
68
+ );
69
+ if (
70
+ exportsType === "default-only" ||
71
+ exportsType === "default-with-named"
72
+ ) {
73
+ return Dependency.EXPORTS_OBJECT_REFERENCED;
74
+ }
75
+ }
76
+ refs.push({
77
+ name: referencedExport,
78
+ canMangle: false
79
+ });
80
+ }
81
+ return refs;
52
82
  }
53
83
 
84
+ /**
85
+ * @param {ObjectSerializerContext} context context
86
+ */
54
87
  serialize(context) {
55
88
  context.write(this.range);
56
89
  context.write(this.referencedExports);
90
+ context.write(this.assertions);
57
91
  super.serialize(context);
58
92
  }
59
93
 
94
+ /**
95
+ * @param {ObjectDeserializerContext} context context
96
+ */
60
97
  deserialize(context) {
61
98
  this.range = context.read();
62
99
  this.referencedExports = context.read();
100
+ this.assertions = context.read();
63
101
  super.deserialize(context);
64
102
  }
65
103
  }
@@ -86,10 +124,10 @@ ImportDependency.Template = class ImportDependencyTemplate extends (
86
124
  );
87
125
  const content = runtimeTemplate.moduleNamespacePromise({
88
126
  chunkGraph,
89
- block: block,
90
- module: moduleGraph.getModule(dep),
127
+ block,
128
+ module: /** @type {Module} */ (moduleGraph.getModule(dep)),
91
129
  request: dep.request,
92
- strict: module.buildMeta.strictHarmonyModule,
130
+ strict: /** @type {BuildMeta} */ (module.buildMeta).strictHarmonyModule,
93
131
  message: "import()",
94
132
  runtimeRequirements
95
133
  });
@@ -12,16 +12,21 @@ const ImportDependency = require("./ImportDependency");
12
12
  /** @typedef {import("../Dependency")} Dependency */
13
13
  /** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
14
14
  /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
15
+ /** @typedef {import("../Module")} Module */
16
+ /** @typedef {import("../Module").BuildMeta} BuildMeta */
15
17
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
18
+ /** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
19
+ /** @typedef {import("../javascript/JavascriptParser").Range} Range */
16
20
 
17
21
  class ImportEagerDependency extends ImportDependency {
18
22
  /**
19
23
  * @param {string} request the request
20
- * @param {[number, number]} range expression range
21
- * @param {string[][]=} referencedExports list of referenced exports
24
+ * @param {Range} range expression range
25
+ * @param {(string[][] | null)=} referencedExports list of referenced exports
26
+ * @param {ImportAttributes=} attributes import attributes
22
27
  */
23
- constructor(request, range, referencedExports) {
24
- super(request, range, referencedExports);
28
+ constructor(request, range, referencedExports, attributes) {
29
+ super(request, range, referencedExports, attributes);
25
30
  }
26
31
 
27
32
  get type() {
@@ -55,9 +60,9 @@ ImportEagerDependency.Template = class ImportEagerDependencyTemplate extends (
55
60
  const dep = /** @type {ImportEagerDependency} */ (dependency);
56
61
  const content = runtimeTemplate.moduleNamespacePromise({
57
62
  chunkGraph,
58
- module: moduleGraph.getModule(dep),
63
+ module: /** @type {Module} */ (moduleGraph.getModule(dep)),
59
64
  request: dep.request,
60
- strict: module.buildMeta.strictHarmonyModule,
65
+ strict: /** @type {BuildMeta} */ (module.buildMeta).strictHarmonyModule,
61
66
  message: "import() eager",
62
67
  runtimeRequirements
63
68
  });