webpack 5.97.1 → 5.104.1

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 (610) hide show
  1. package/README.md +368 -434
  2. package/bin/webpack.js +15 -9
  3. package/hot/dev-server.js +18 -3
  4. package/hot/emitter-event-target.js +7 -0
  5. package/hot/lazy-compilation-node.js +45 -29
  6. package/hot/lazy-compilation-universal.js +18 -0
  7. package/hot/lazy-compilation-web.js +15 -5
  8. package/hot/load-http.js +7 -0
  9. package/hot/log.js +15 -15
  10. package/hot/only-dev-server.js +19 -4
  11. package/hot/poll.js +1 -0
  12. package/lib/APIPlugin.js +48 -50
  13. package/lib/AbstractMethodError.js +1 -0
  14. package/lib/AsyncDependenciesBlock.js +4 -5
  15. package/lib/AutomaticPrefetchPlugin.js +22 -22
  16. package/lib/BannerPlugin.js +35 -40
  17. package/lib/Cache.js +12 -9
  18. package/lib/CacheFacade.js +13 -13
  19. package/lib/CaseSensitiveModulesWarning.js +6 -6
  20. package/lib/Chunk.js +68 -47
  21. package/lib/ChunkGraph.js +174 -95
  22. package/lib/ChunkGroup.js +32 -24
  23. package/lib/ChunkTemplate.js +8 -8
  24. package/lib/CleanPlugin.js +90 -42
  25. package/lib/CodeGenerationResults.js +12 -9
  26. package/lib/CompatibilityPlugin.js +70 -21
  27. package/lib/Compilation.js +827 -550
  28. package/lib/Compiler.js +137 -109
  29. package/lib/ConcatenationScope.js +45 -8
  30. package/lib/ConditionalInitFragment.js +1 -1
  31. package/lib/ConstPlugin.js +89 -59
  32. package/lib/ContextExclusionPlugin.js +5 -4
  33. package/lib/ContextModule.js +66 -51
  34. package/lib/ContextModuleFactory.js +51 -30
  35. package/lib/ContextReplacementPlugin.js +89 -34
  36. package/lib/CssModule.js +8 -4
  37. package/lib/DefinePlugin.js +209 -57
  38. package/lib/DelegatedModule.js +34 -23
  39. package/lib/DelegatedModuleFactoryPlugin.js +27 -24
  40. package/lib/DelegatedPlugin.js +4 -2
  41. package/lib/DependenciesBlock.js +0 -2
  42. package/lib/Dependency.js +37 -19
  43. package/lib/DependencyTemplate.js +2 -0
  44. package/lib/DependencyTemplates.js +5 -6
  45. package/lib/DllEntryPlugin.js +8 -4
  46. package/lib/DllModule.js +11 -12
  47. package/lib/DllModuleFactory.js +2 -2
  48. package/lib/DllPlugin.js +9 -6
  49. package/lib/DllReferencePlugin.js +60 -65
  50. package/lib/DotenvPlugin.js +462 -0
  51. package/lib/DynamicEntryPlugin.js +8 -8
  52. package/lib/EntryOptionPlugin.js +8 -6
  53. package/lib/EntryPlugin.js +5 -3
  54. package/lib/Entrypoint.js +19 -0
  55. package/lib/EnvironmentNotSupportAsyncWarning.js +0 -3
  56. package/lib/EnvironmentPlugin.js +26 -19
  57. package/lib/ErrorHelpers.js +6 -6
  58. package/lib/EvalDevToolModulePlugin.js +17 -14
  59. package/lib/EvalSourceMapDevToolPlugin.js +156 -142
  60. package/lib/ExportsInfo.js +180 -115
  61. package/lib/ExportsInfoApiPlugin.js +2 -2
  62. package/lib/ExternalModule.js +256 -102
  63. package/lib/ExternalModuleFactoryPlugin.js +66 -29
  64. package/lib/ExternalsPlugin.js +57 -2
  65. package/lib/FileSystemInfo.js +313 -247
  66. package/lib/FlagAllModulesAsUsedPlugin.js +2 -2
  67. package/lib/FlagDependencyExportsPlugin.js +29 -19
  68. package/lib/FlagDependencyUsagePlugin.js +9 -10
  69. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  70. package/lib/Generator.js +43 -10
  71. package/lib/GraphHelpers.js +11 -3
  72. package/lib/HookWebpackError.js +35 -7
  73. package/lib/HotModuleReplacementPlugin.js +149 -108
  74. package/lib/HotUpdateChunk.js +0 -3
  75. package/lib/IgnoreErrorModuleFactory.js +2 -2
  76. package/lib/IgnorePlugin.js +16 -13
  77. package/lib/IgnoreWarningsPlugin.js +6 -4
  78. package/lib/InitFragment.js +41 -23
  79. package/lib/InvalidDependenciesModuleWarning.js +2 -3
  80. package/lib/JavascriptMetaInfoPlugin.js +2 -4
  81. package/lib/LibManifestPlugin.js +12 -13
  82. package/lib/LoaderOptionsPlugin.js +12 -14
  83. package/lib/LoaderTargetPlugin.js +5 -3
  84. package/lib/MainTemplate.js +18 -29
  85. package/lib/ManifestPlugin.js +235 -0
  86. package/lib/Module.js +138 -60
  87. package/lib/ModuleBuildError.js +4 -2
  88. package/lib/ModuleDependencyError.js +4 -3
  89. package/lib/ModuleDependencyWarning.js +4 -3
  90. package/lib/ModuleError.js +1 -1
  91. package/lib/ModuleFactory.js +10 -3
  92. package/lib/ModuleFilenameHelpers.js +63 -60
  93. package/lib/ModuleGraph.js +195 -70
  94. package/lib/ModuleGraphConnection.js +14 -20
  95. package/lib/ModuleInfoHeaderPlugin.js +15 -16
  96. package/lib/ModuleNotFoundError.js +1 -1
  97. package/lib/ModuleParseError.js +8 -4
  98. package/lib/ModuleSourceTypeConstants.js +189 -0
  99. package/lib/ModuleTemplate.js +7 -8
  100. package/lib/ModuleTypeConstants.js +37 -15
  101. package/lib/ModuleWarning.js +1 -1
  102. package/lib/MultiCompiler.js +64 -49
  103. package/lib/MultiStats.js +19 -14
  104. package/lib/MultiWatching.js +7 -11
  105. package/lib/NoEmitOnErrorsPlugin.js +5 -3
  106. package/lib/NodeStuffPlugin.js +438 -126
  107. package/lib/NormalModule.js +322 -201
  108. package/lib/NormalModuleFactory.js +230 -117
  109. package/lib/NormalModuleReplacementPlugin.js +37 -39
  110. package/lib/NullFactory.js +3 -2
  111. package/lib/OptimizationStages.js +1 -1
  112. package/lib/OptionsApply.js +1 -1
  113. package/lib/Parser.js +5 -3
  114. package/lib/PlatformPlugin.js +3 -1
  115. package/lib/PrefetchPlugin.js +6 -4
  116. package/lib/ProgressPlugin.js +48 -49
  117. package/lib/ProvidePlugin.js +7 -5
  118. package/lib/RawModule.js +26 -12
  119. package/lib/RecordIdsPlugin.js +88 -110
  120. package/lib/RequestShortener.js +3 -1
  121. package/lib/ResolverFactory.js +15 -14
  122. package/lib/RuntimeGlobals.js +216 -153
  123. package/lib/RuntimeModule.js +7 -6
  124. package/lib/RuntimePlugin.js +115 -62
  125. package/lib/RuntimeTemplate.js +248 -76
  126. package/lib/SelfModuleFactory.js +2 -2
  127. package/lib/SizeFormatHelpers.js +2 -2
  128. package/lib/SourceMapDevToolModuleOptionsPlugin.js +17 -27
  129. package/lib/SourceMapDevToolPlugin.js +72 -59
  130. package/lib/Stats.js +2 -3
  131. package/lib/Template.js +31 -24
  132. package/lib/TemplatedPathPlugin.js +24 -21
  133. package/lib/UseStrictPlugin.js +1 -1
  134. package/lib/WarnCaseSensitiveModulesPlugin.js +36 -37
  135. package/lib/WarnDeprecatedOptionPlugin.js +7 -8
  136. package/lib/WarnNoModeSetPlugin.js +3 -1
  137. package/lib/WatchIgnorePlugin.js +11 -9
  138. package/lib/Watching.js +27 -29
  139. package/lib/WebpackError.js +10 -3
  140. package/lib/WebpackIsIncludedPlugin.js +4 -5
  141. package/lib/WebpackOptionsApply.js +263 -135
  142. package/lib/asset/AssetBytesGenerator.js +171 -0
  143. package/lib/asset/AssetBytesParser.js +37 -0
  144. package/lib/asset/AssetGenerator.js +285 -223
  145. package/lib/asset/AssetModulesPlugin.js +103 -41
  146. package/lib/asset/AssetParser.js +7 -3
  147. package/lib/asset/AssetSourceGenerator.js +41 -17
  148. package/lib/asset/RawDataUrlModule.js +17 -9
  149. package/lib/async-modules/AsyncModuleHelpers.js +52 -0
  150. package/lib/async-modules/AwaitDependenciesInitFragment.js +39 -24
  151. package/lib/async-modules/InferAsyncModulesPlugin.js +25 -26
  152. package/lib/buildChunkGraph.js +36 -17
  153. package/lib/cache/AddBuildDependenciesPlugin.js +5 -6
  154. package/lib/cache/IdleFileCachePlugin.js +22 -20
  155. package/lib/cache/MemoryCachePlugin.js +3 -3
  156. package/lib/cache/MemoryWithGcCachePlugin.js +17 -11
  157. package/lib/cache/PackFileCacheStrategy.js +198 -170
  158. package/lib/cache/ResolverCachePlugin.js +58 -48
  159. package/lib/cache/getLazyHashedEtag.js +5 -4
  160. package/lib/cli.js +197 -39
  161. package/lib/config/browserslistTargetHandler.js +110 -85
  162. package/lib/config/defaults.js +514 -113
  163. package/lib/config/normalization.js +91 -64
  164. package/lib/config/target.js +30 -18
  165. package/lib/container/ContainerEntryDependency.js +0 -1
  166. package/lib/container/ContainerEntryModule.js +16 -15
  167. package/lib/container/ContainerEntryModuleFactory.js +2 -2
  168. package/lib/container/ContainerPlugin.js +5 -6
  169. package/lib/container/ContainerReferencePlugin.js +27 -30
  170. package/lib/container/FallbackDependency.js +2 -1
  171. package/lib/container/FallbackModule.js +19 -14
  172. package/lib/container/FallbackModuleFactory.js +2 -2
  173. package/lib/container/HoistContainerReferencesPlugin.js +7 -7
  174. package/lib/container/ModuleFederationPlugin.js +4 -4
  175. package/lib/container/RemoteModule.js +14 -14
  176. package/lib/container/RemoteRuntimeModule.js +2 -2
  177. package/lib/container/options.js +9 -9
  178. package/lib/css/CssGenerator.js +366 -74
  179. package/lib/css/CssLoadingRuntimeModule.js +26 -16
  180. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +56 -0
  181. package/lib/css/CssModulesPlugin.js +191 -142
  182. package/lib/css/CssParser.js +1756 -740
  183. package/lib/css/walkCssTokens.js +180 -67
  184. package/lib/debug/ProfilingPlugin.js +135 -51
  185. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +29 -28
  186. package/lib/dependencies/AMDPlugin.js +18 -11
  187. package/lib/dependencies/AMDRequireArrayDependency.js +5 -4
  188. package/lib/dependencies/AMDRequireContextDependency.js +2 -1
  189. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +35 -26
  190. package/lib/dependencies/AMDRuntimeModules.js +3 -1
  191. package/lib/dependencies/CachedConstDependency.js +24 -18
  192. package/lib/dependencies/CommonJsExportRequireDependency.js +31 -24
  193. package/lib/dependencies/CommonJsExportsDependency.js +2 -1
  194. package/lib/dependencies/CommonJsExportsParserPlugin.js +50 -36
  195. package/lib/dependencies/CommonJsFullRequireDependency.js +7 -13
  196. package/lib/dependencies/CommonJsImportsParserPlugin.js +146 -127
  197. package/lib/dependencies/CommonJsPlugin.js +29 -18
  198. package/lib/dependencies/CommonJsRequireContextDependency.js +4 -3
  199. package/lib/dependencies/CommonJsSelfReferenceDependency.js +4 -4
  200. package/lib/dependencies/ConstDependency.js +2 -2
  201. package/lib/dependencies/ContextDependency.js +10 -5
  202. package/lib/dependencies/ContextDependencyHelpers.js +21 -13
  203. package/lib/dependencies/ContextDependencyTemplateAsId.js +10 -9
  204. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +13 -10
  205. package/lib/dependencies/ContextElementDependency.js +23 -12
  206. package/lib/dependencies/CssIcssExportDependency.js +402 -22
  207. package/lib/dependencies/CssIcssImportDependency.js +116 -51
  208. package/lib/dependencies/CssIcssSymbolDependency.js +33 -35
  209. package/lib/dependencies/CssImportDependency.js +17 -14
  210. package/lib/dependencies/CssUrlDependency.js +8 -13
  211. package/lib/dependencies/DynamicExports.js +19 -19
  212. package/lib/dependencies/ExportsInfoDependency.js +13 -10
  213. package/lib/dependencies/ExternalModuleDependency.js +7 -7
  214. package/lib/dependencies/ExternalModuleInitFragment.js +3 -2
  215. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +96 -0
  216. package/lib/dependencies/HarmonyAcceptDependency.js +96 -5
  217. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -5
  218. package/lib/dependencies/HarmonyCompatibilityDependency.js +0 -1
  219. package/lib/dependencies/HarmonyDetectionParserPlugin.js +10 -30
  220. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +19 -8
  221. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +136 -99
  222. package/lib/dependencies/HarmonyExportExpressionDependency.js +1 -1
  223. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +152 -61
  224. package/lib/dependencies/HarmonyExportInitFragment.js +2 -2
  225. package/lib/dependencies/HarmonyExportSpecifierDependency.js +2 -2
  226. package/lib/dependencies/HarmonyExports.js +5 -5
  227. package/lib/dependencies/HarmonyImportDependency.js +92 -45
  228. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +201 -163
  229. package/lib/dependencies/HarmonyImportSideEffectDependency.js +5 -6
  230. package/lib/dependencies/HarmonyImportSpecifierDependency.js +69 -42
  231. package/lib/dependencies/HarmonyModulesPlugin.js +16 -11
  232. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -15
  233. package/lib/dependencies/ImportContextDependency.js +15 -1
  234. package/lib/dependencies/ImportDependency.js +25 -7
  235. package/lib/dependencies/ImportEagerDependency.js +7 -5
  236. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +23 -13
  237. package/lib/dependencies/ImportMetaContextPlugin.js +2 -2
  238. package/lib/dependencies/ImportMetaPlugin.js +172 -20
  239. package/lib/dependencies/ImportParserPlugin.js +327 -49
  240. package/lib/dependencies/ImportPhase.js +121 -0
  241. package/lib/dependencies/ImportPlugin.js +3 -1
  242. package/lib/dependencies/ImportWeakDependency.js +7 -5
  243. package/lib/dependencies/JsonExportsDependency.js +54 -28
  244. package/lib/dependencies/LoaderDependency.js +0 -3
  245. package/lib/dependencies/LoaderImportDependency.js +0 -3
  246. package/lib/dependencies/LoaderPlugin.js +24 -25
  247. package/lib/dependencies/LocalModulesHelpers.js +4 -4
  248. package/lib/dependencies/ModuleDecoratorDependency.js +2 -4
  249. package/lib/dependencies/ModuleDependency.js +14 -13
  250. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  251. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  252. package/lib/dependencies/NullDependency.js +2 -0
  253. package/lib/dependencies/ProvidedDependency.js +8 -10
  254. package/lib/dependencies/PureExpressionDependency.js +1 -2
  255. package/lib/dependencies/RequireContextDependency.js +2 -1
  256. package/lib/dependencies/RequireContextDependencyParserPlugin.js +47 -44
  257. package/lib/dependencies/RequireContextPlugin.js +5 -2
  258. package/lib/dependencies/RequireEnsureDependenciesBlock.js +3 -3
  259. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +101 -99
  260. package/lib/dependencies/RequireEnsurePlugin.js +6 -6
  261. package/lib/dependencies/RequireIncludeDependency.js +2 -2
  262. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +33 -34
  263. package/lib/dependencies/RequireIncludePlugin.js +1 -0
  264. package/lib/dependencies/RequireResolveContextDependency.js +1 -1
  265. package/lib/dependencies/RequireResolveDependency.js +3 -3
  266. package/lib/dependencies/RuntimeRequirementsDependency.js +3 -4
  267. package/lib/dependencies/StaticExportsDependency.js +3 -5
  268. package/lib/dependencies/SystemPlugin.js +4 -4
  269. package/lib/dependencies/URLContextDependency.js +65 -0
  270. package/lib/dependencies/URLDependency.js +3 -8
  271. package/lib/dependencies/URLPlugin.js +18 -159
  272. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -3
  273. package/lib/dependencies/WebAssemblyImportDependency.js +2 -2
  274. package/lib/dependencies/WebpackIsIncludedDependency.js +2 -3
  275. package/lib/dependencies/WorkerDependency.js +8 -6
  276. package/lib/dependencies/WorkerPlugin.js +131 -67
  277. package/lib/dependencies/getFunctionExpression.js +2 -2
  278. package/lib/dependencies/processExportInfo.js +4 -4
  279. package/lib/esm/ExportWebpackRequireRuntimeModule.js +1 -1
  280. package/lib/esm/ModuleChunkFormatPlugin.js +232 -179
  281. package/lib/esm/ModuleChunkLoadingPlugin.js +112 -57
  282. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +102 -28
  283. package/lib/formatLocation.js +2 -2
  284. package/lib/hmr/HotModuleReplacement.runtime.js +41 -29
  285. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  286. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +43 -33
  287. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +37 -0
  288. package/lib/hmr/LazyCompilationPlugin.js +67 -54
  289. package/lib/hmr/lazyCompilationBackend.js +23 -18
  290. package/lib/ids/ChunkModuleIdRangePlugin.js +14 -11
  291. package/lib/ids/DeterministicChunkIdsPlugin.js +32 -37
  292. package/lib/ids/DeterministicModuleIdsPlugin.js +52 -52
  293. package/lib/ids/HashedModuleIdsPlugin.js +15 -13
  294. package/lib/ids/IdHelpers.js +66 -49
  295. package/lib/ids/NamedChunkIdsPlugin.js +14 -17
  296. package/lib/ids/NamedModuleIdsPlugin.js +12 -14
  297. package/lib/ids/NaturalChunkIdsPlugin.js +6 -4
  298. package/lib/ids/NaturalModuleIdsPlugin.js +4 -3
  299. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -5
  300. package/lib/ids/OccurrenceModuleIdsPlugin.js +8 -7
  301. package/lib/ids/SyncModuleIdsPlugin.js +18 -13
  302. package/lib/index.js +54 -14
  303. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +116 -119
  304. package/lib/javascript/BasicEvaluatedExpression.js +26 -18
  305. package/lib/javascript/ChunkFormatHelpers.js +70 -0
  306. package/lib/javascript/ChunkHelpers.js +17 -5
  307. package/lib/javascript/CommonJsChunkFormatPlugin.js +114 -141
  308. package/lib/javascript/EnableChunkLoadingPlugin.js +7 -4
  309. package/lib/javascript/JavascriptGenerator.js +122 -100
  310. package/lib/javascript/JavascriptModulesPlugin.js +332 -152
  311. package/lib/javascript/JavascriptParser.js +1488 -1052
  312. package/lib/javascript/JavascriptParserHelpers.js +48 -47
  313. package/lib/javascript/StartupHelpers.js +23 -22
  314. package/lib/json/JsonData.js +4 -4
  315. package/lib/json/JsonGenerator.js +66 -32
  316. package/lib/json/JsonModulesPlugin.js +16 -6
  317. package/lib/json/JsonParser.js +23 -8
  318. package/lib/library/AbstractLibraryPlugin.js +45 -10
  319. package/lib/library/AmdLibraryPlugin.js +7 -5
  320. package/lib/library/AssignLibraryPlugin.js +71 -17
  321. package/lib/library/EnableLibraryPlugin.js +51 -25
  322. package/lib/library/ExportPropertyLibraryPlugin.js +12 -18
  323. package/lib/library/JsonpLibraryPlugin.js +5 -2
  324. package/lib/library/ModuleLibraryPlugin.js +230 -18
  325. package/lib/library/SystemLibraryPlugin.js +29 -11
  326. package/lib/library/UmdLibraryPlugin.js +35 -32
  327. package/lib/logging/Logger.js +18 -15
  328. package/lib/logging/createConsoleLogger.js +27 -27
  329. package/lib/logging/runtime.js +11 -11
  330. package/lib/logging/truncateArgs.js +5 -5
  331. package/lib/node/CommonJsChunkLoadingPlugin.js +72 -75
  332. package/lib/node/NodeEnvironmentPlugin.js +9 -3
  333. package/lib/node/NodeTargetPlugin.js +9 -1
  334. package/lib/node/NodeTemplatePlugin.js +2 -2
  335. package/lib/node/NodeWatchFileSystem.js +4 -4
  336. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -38
  337. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +10 -11
  338. package/lib/node/ReadFileCompileWasmPlugin.js +11 -14
  339. package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -30
  340. package/lib/node/nodeConsole.js +12 -7
  341. package/lib/optimize/AggressiveMergingPlugin.js +46 -47
  342. package/lib/optimize/AggressiveSplittingPlugin.js +233 -238
  343. package/lib/optimize/ConcatenatedModule.js +620 -251
  344. package/lib/optimize/EnsureChunkConditionsPlugin.js +58 -58
  345. package/lib/optimize/FlagIncludedChunksPlugin.js +93 -96
  346. package/lib/optimize/InnerGraph.js +139 -124
  347. package/lib/optimize/InnerGraphPlugin.js +29 -24
  348. package/lib/optimize/LimitChunkCountPlugin.js +32 -8
  349. package/lib/optimize/MangleExportsPlugin.js +22 -22
  350. package/lib/optimize/MergeDuplicateChunksPlugin.js +80 -81
  351. package/lib/optimize/MinChunkSizePlugin.js +12 -7
  352. package/lib/optimize/ModuleConcatenationPlugin.js +92 -71
  353. package/lib/optimize/RealContentHashPlugin.js +58 -44
  354. package/lib/optimize/RemoveEmptyChunksPlugin.js +8 -5
  355. package/lib/optimize/RemoveParentModulesPlugin.js +7 -4
  356. package/lib/optimize/RuntimeChunkPlugin.js +22 -25
  357. package/lib/optimize/SideEffectsFlagPlugin.js +44 -26
  358. package/lib/optimize/SplitChunksPlugin.js +209 -158
  359. package/lib/performance/AssetsOverSizeLimitWarning.js +1 -1
  360. package/lib/performance/EntrypointsOverSizeLimitWarning.js +2 -2
  361. package/lib/performance/SizeLimitsPlugin.js +8 -5
  362. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +5 -7
  363. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +61 -64
  364. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +3 -4
  365. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  366. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  367. package/lib/rules/BasicEffectRulePlugin.js +14 -5
  368. package/lib/rules/BasicMatcherRulePlugin.js +18 -7
  369. package/lib/rules/ObjectMatcherRulePlugin.js +17 -6
  370. package/lib/rules/RuleSetCompiler.js +73 -32
  371. package/lib/rules/UseEffectRulePlugin.js +61 -25
  372. package/lib/runtime/AsyncModuleRuntimeModule.js +74 -9
  373. package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -4
  374. package/lib/runtime/BaseUriRuntimeModule.js +2 -2
  375. package/lib/runtime/CompatRuntimeModule.js +0 -1
  376. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +1 -1
  377. package/lib/runtime/GetChunkFilenameRuntimeModule.js +34 -35
  378. package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -1
  379. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +1 -1
  380. package/lib/runtime/LoadScriptRuntimeModule.js +0 -2
  381. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +248 -0
  382. package/lib/runtime/PublicPathRuntimeModule.js +2 -2
  383. package/lib/runtime/RuntimeIdRuntimeModule.js +2 -1
  384. package/lib/runtime/StartupChunkDependenciesPlugin.js +39 -42
  385. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +10 -9
  386. package/lib/runtime/StartupEntrypointRuntimeModule.js +0 -1
  387. package/lib/runtime/SystemContextRuntimeModule.js +0 -2
  388. package/lib/runtime/ToBinaryRuntimeModule.js +64 -0
  389. package/lib/schemes/DataUriPlugin.js +9 -31
  390. package/lib/schemes/FileUriPlugin.js +11 -6
  391. package/lib/schemes/HttpUriPlugin.js +381 -261
  392. package/lib/schemes/VirtualUrlPlugin.js +222 -0
  393. package/lib/serialization/AggregateErrorSerializer.js +41 -0
  394. package/lib/serialization/BinaryMiddleware.js +51 -33
  395. package/lib/serialization/ErrorObjectSerializer.js +7 -2
  396. package/lib/serialization/FileMiddleware.js +101 -71
  397. package/lib/serialization/NullPrototypeObjectSerializer.js +5 -3
  398. package/lib/serialization/ObjectMiddleware.js +130 -54
  399. package/lib/serialization/PlainObjectSerializer.js +1 -1
  400. package/lib/serialization/Serializer.js +38 -20
  401. package/lib/serialization/SerializerMiddleware.js +121 -49
  402. package/lib/serialization/SingleItemMiddleware.js +9 -7
  403. package/lib/serialization/types.js +1 -1
  404. package/lib/sharing/ConsumeSharedModule.js +9 -9
  405. package/lib/sharing/ConsumeSharedPlugin.js +14 -14
  406. package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -8
  407. package/lib/sharing/ProvideSharedModule.js +9 -11
  408. package/lib/sharing/ProvideSharedModuleFactory.js +5 -3
  409. package/lib/sharing/ProvideSharedPlugin.js +15 -10
  410. package/lib/sharing/SharePlugin.js +3 -4
  411. package/lib/sharing/ShareRuntimeModule.js +7 -6
  412. package/lib/sharing/resolveMatchedConfigs.js +27 -13
  413. package/lib/sharing/utils.js +37 -43
  414. package/lib/stats/DefaultStatsFactoryPlugin.js +455 -286
  415. package/lib/stats/DefaultStatsPresetPlugin.js +77 -46
  416. package/lib/stats/DefaultStatsPrinterPlugin.js +583 -419
  417. package/lib/stats/StatsFactory.js +75 -32
  418. package/lib/stats/StatsPrinter.js +71 -51
  419. package/lib/url/URLParserPlugin.js +264 -0
  420. package/lib/util/ArrayHelpers.js +6 -8
  421. package/lib/util/ArrayQueue.js +1 -1
  422. package/lib/util/AsyncQueue.js +11 -10
  423. package/lib/util/Hash.js +37 -5
  424. package/lib/util/IterableHelpers.js +4 -4
  425. package/lib/util/LazyBucketSortedSet.js +46 -27
  426. package/lib/util/LazySet.js +16 -10
  427. package/lib/util/MapHelpers.js +1 -1
  428. package/lib/util/ParallelismFactorCalculator.js +2 -2
  429. package/lib/util/Semaphore.js +3 -3
  430. package/lib/util/SetHelpers.js +6 -6
  431. package/lib/util/SortableSet.js +11 -9
  432. package/lib/util/StackedCacheMap.js +2 -2
  433. package/lib/util/StackedMap.js +3 -3
  434. package/lib/util/StringXor.js +2 -1
  435. package/lib/util/TupleQueue.js +11 -8
  436. package/lib/util/TupleSet.js +44 -19
  437. package/lib/util/URLAbsoluteSpecifier.js +3 -4
  438. package/lib/util/WeakTupleMap.js +56 -42
  439. package/lib/util/binarySearchBounds.js +4 -3
  440. package/lib/util/chainedImports.js +3 -1
  441. package/lib/util/cleverMerge.js +171 -107
  442. package/lib/util/comparators.js +265 -162
  443. package/lib/util/compileBooleanMatcher.js +120 -41
  444. package/lib/util/concatenate.js +20 -16
  445. package/lib/util/conventions.js +73 -74
  446. package/lib/util/create-schema-validation.js +8 -8
  447. package/lib/util/createHash.js +32 -135
  448. package/lib/util/dataURL.js +39 -0
  449. package/lib/util/deprecation.js +119 -116
  450. package/lib/util/deterministicGrouping.js +56 -47
  451. package/lib/util/extractSourceMap.js +319 -0
  452. package/lib/util/extractUrlAndGlobal.js +1 -1
  453. package/lib/util/findGraphRoots.js +19 -9
  454. package/lib/util/fs.js +169 -141
  455. package/lib/util/hash/BatchedHash.js +50 -10
  456. package/lib/util/hash/BulkUpdateHash.js +138 -0
  457. package/lib/util/hash/DebugHash.js +75 -0
  458. package/lib/util/hash/hash-digest.js +216 -0
  459. package/lib/util/hash/md4.js +2 -2
  460. package/lib/util/hash/wasm-hash.js +59 -17
  461. package/lib/util/identifier.js +124 -61
  462. package/lib/util/internalSerializables.js +4 -6
  463. package/lib/util/magicComment.js +9 -5
  464. package/lib/util/makeSerializable.js +2 -2
  465. package/lib/util/memoize.js +5 -2
  466. package/lib/util/objectToMap.js +3 -2
  467. package/lib/util/processAsyncTree.js +5 -5
  468. package/lib/util/propertyAccess.js +1 -1
  469. package/lib/util/propertyName.js +2 -3
  470. package/lib/util/registerExternalSerializer.js +16 -20
  471. package/lib/util/removeBOM.js +25 -0
  472. package/lib/util/runtime.js +72 -56
  473. package/lib/util/semver.js +44 -33
  474. package/lib/util/serialization.js +56 -56
  475. package/lib/util/smartGrouping.js +42 -27
  476. package/lib/util/source.js +5 -4
  477. package/lib/util/traverseDestructuringAssignmentProperties.js +45 -0
  478. package/lib/validateSchema.js +7 -9
  479. package/lib/wasm/EnableWasmLoadingPlugin.js +22 -12
  480. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +9 -5
  481. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +15 -3
  482. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +28 -22
  483. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +47 -57
  484. package/lib/wasm-async/AsyncWebAssemblyParser.js +2 -10
  485. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +8 -4
  486. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +23 -17
  487. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +55 -57
  488. package/lib/wasm-sync/WebAssemblyGenerator.js +56 -41
  489. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +6 -3
  490. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +25 -10
  491. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +11 -12
  492. package/lib/wasm-sync/WebAssemblyParser.js +10 -17
  493. package/lib/wasm-sync/WebAssemblyUtils.js +1 -1
  494. package/lib/web/FetchCompileAsyncWasmPlugin.js +4 -4
  495. package/lib/web/FetchCompileWasmPlugin.js +6 -8
  496. package/lib/web/JsonpChunkLoadingPlugin.js +74 -74
  497. package/lib/web/JsonpChunkLoadingRuntimeModule.js +10 -26
  498. package/lib/web/JsonpTemplatePlugin.js +0 -1
  499. package/lib/webpack.js +107 -87
  500. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +79 -75
  501. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +38 -51
  502. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -0
  503. package/module.d.ts +5 -0
  504. package/package.json +149 -129
  505. package/schemas/WebpackOptions.check.d.ts +1 -1
  506. package/schemas/WebpackOptions.check.js +2 -2
  507. package/schemas/WebpackOptions.json +543 -190
  508. package/schemas/plugins/BannerPlugin.check.d.ts +1 -1
  509. package/schemas/plugins/BannerPlugin.check.js +2 -2
  510. package/schemas/plugins/BannerPlugin.json +4 -0
  511. package/schemas/plugins/DllPlugin.check.d.ts +1 -1
  512. package/schemas/plugins/DllPlugin.check.js +1 -1
  513. package/schemas/plugins/DllReferencePlugin.check.d.ts +1 -1
  514. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  515. package/schemas/plugins/IgnorePlugin.check.d.ts +1 -1
  516. package/schemas/plugins/IgnorePlugin.check.js +1 -1
  517. package/schemas/plugins/IgnorePlugin.json +1 -1
  518. package/schemas/plugins/LoaderOptionsPlugin.check.d.ts +1 -1
  519. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
  520. package/schemas/plugins/{HashedModuleIdsPlugin.check.d.ts → ManifestPlugin.check.d.ts} +2 -2
  521. package/schemas/plugins/ManifestPlugin.check.js +6 -0
  522. package/schemas/plugins/ManifestPlugin.json +98 -0
  523. package/schemas/plugins/ProgressPlugin.check.d.ts +1 -1
  524. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  525. package/schemas/plugins/ProgressPlugin.json +1 -1
  526. package/schemas/plugins/SourceMapDevToolPlugin.check.d.ts +1 -1
  527. package/schemas/plugins/SourceMapDevToolPlugin.check.js +2 -2
  528. package/schemas/plugins/SourceMapDevToolPlugin.json +23 -6
  529. package/schemas/plugins/WatchIgnorePlugin.check.d.ts +1 -1
  530. package/schemas/plugins/WatchIgnorePlugin.check.js +1 -1
  531. package/schemas/plugins/asset/AssetGeneratorOptions.check.d.ts +1 -1
  532. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  533. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts +1 -1
  534. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  535. package/schemas/plugins/asset/AssetParserOptions.check.d.ts +1 -1
  536. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  537. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts +1 -1
  538. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  539. package/schemas/plugins/container/ContainerPlugin.check.d.ts +1 -1
  540. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  541. package/schemas/plugins/container/ContainerReferencePlugin.check.d.ts +1 -1
  542. package/schemas/plugins/container/ContainerReferencePlugin.check.js +2 -2
  543. package/schemas/plugins/container/ContainerReferencePlugin.json +4 -1
  544. package/schemas/plugins/container/ExternalsType.check.d.ts +1 -1
  545. package/schemas/plugins/container/ExternalsType.check.js +2 -2
  546. package/schemas/plugins/container/ModuleFederationPlugin.check.d.ts +1 -1
  547. package/schemas/plugins/container/ModuleFederationPlugin.check.js +2 -2
  548. package/schemas/plugins/container/ModuleFederationPlugin.json +4 -1
  549. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +1 -1
  550. package/schemas/plugins/css/CssGeneratorOptions.check.js +1 -1
  551. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +1 -1
  552. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +2 -2
  553. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +1 -1
  554. package/schemas/plugins/css/CssModuleParserOptions.check.js +2 -2
  555. package/schemas/plugins/css/CssParserOptions.check.d.ts +1 -1
  556. package/schemas/plugins/css/CssParserOptions.check.js +2 -2
  557. package/schemas/plugins/debug/ProfilingPlugin.check.d.ts +1 -1
  558. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
  559. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.d.ts +7 -0
  560. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +6 -0
  561. package/schemas/plugins/{HashedModuleIdsPlugin.json → ids/HashedModuleIdsPlugin.json} +15 -2
  562. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts +1 -1
  563. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js +1 -1
  564. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts +1 -1
  565. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js +1 -1
  566. package/schemas/plugins/{css/CssGlobalParserOptions.check.d.ts → json/JsonModulesPluginGenerator.check.d.ts} +1 -1
  567. package/schemas/plugins/json/JsonModulesPluginGenerator.check.js +6 -0
  568. package/schemas/plugins/json/JsonModulesPluginGenerator.json +3 -0
  569. package/schemas/plugins/{css/CssGlobalGeneratorOptions.check.d.ts → json/JsonModulesPluginParser.check.d.ts} +1 -1
  570. package/schemas/plugins/json/JsonModulesPluginParser.check.js +6 -0
  571. package/schemas/plugins/json/JsonModulesPluginParser.json +3 -0
  572. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts +1 -1
  573. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  574. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts +1 -1
  575. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  576. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts +1 -1
  577. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js +1 -1
  578. package/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts +1 -1
  579. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  580. package/schemas/plugins/schemes/HttpUriPlugin.check.d.ts +1 -1
  581. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  582. package/schemas/plugins/schemes/VirtualUrlPlugin.check.d.ts +7 -0
  583. package/schemas/plugins/schemes/VirtualUrlPlugin.check.js +6 -0
  584. package/schemas/plugins/schemes/VirtualUrlPlugin.json +77 -0
  585. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts +1 -1
  586. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.js +1 -1
  587. package/schemas/plugins/sharing/ProvideSharedPlugin.check.d.ts +1 -1
  588. package/schemas/plugins/sharing/ProvideSharedPlugin.check.js +1 -1
  589. package/schemas/plugins/sharing/SharePlugin.check.d.ts +1 -1
  590. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  591. package/types.d.ts +5115 -1863
  592. package/SECURITY.md +0 -9
  593. package/lib/ModuleSourceTypesConstants.js +0 -112
  594. package/lib/dependencies/CssLocalIdentifierDependency.js +0 -250
  595. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +0 -111
  596. package/lib/library/ModernModuleLibraryPlugin.js +0 -144
  597. package/schemas/plugins/HashedModuleIdsPlugin.check.js +0 -6
  598. package/schemas/plugins/JsonModulesPluginParser.check.d.ts +0 -7
  599. package/schemas/plugins/JsonModulesPluginParser.check.js +0 -6
  600. package/schemas/plugins/JsonModulesPluginParser.json +0 -12
  601. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +0 -7
  602. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +0 -6
  603. package/schemas/plugins/css/CssAutoGeneratorOptions.json +0 -3
  604. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +0 -7
  605. package/schemas/plugins/css/CssAutoParserOptions.check.js +0 -6
  606. package/schemas/plugins/css/CssAutoParserOptions.json +0 -3
  607. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +0 -6
  608. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +0 -3
  609. package/schemas/plugins/css/CssGlobalParserOptions.check.js +0 -6
  610. package/schemas/plugins/css/CssGlobalParserOptions.json +0 -3
@@ -8,21 +8,162 @@
8
8
  const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
9
9
  const CommentCompilationWarning = require("../CommentCompilationWarning");
10
10
  const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
11
- const { getImportAttributes } = require("../javascript/JavascriptParser");
11
+ const {
12
+ VariableInfo,
13
+ getImportAttributes
14
+ } = require("../javascript/JavascriptParser");
15
+ const traverseDestructuringAssignmentProperties = require("../util/traverseDestructuringAssignmentProperties");
12
16
  const ContextDependencyHelpers = require("./ContextDependencyHelpers");
13
17
  const ImportContextDependency = require("./ImportContextDependency");
14
18
  const ImportDependency = require("./ImportDependency");
15
19
  const ImportEagerDependency = require("./ImportEagerDependency");
20
+ const { ImportPhaseUtils, createGetImportPhase } = require("./ImportPhase");
16
21
  const ImportWeakDependency = require("./ImportWeakDependency");
17
22
 
18
23
  /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
19
24
  /** @typedef {import("../ChunkGroup").RawChunkGroupOptions} RawChunkGroupOptions */
20
25
  /** @typedef {import("../ContextModule").ContextMode} ContextMode */
21
26
  /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
27
+ /** @typedef {import("../Dependency").RawReferencedExports} RawReferencedExports */
22
28
  /** @typedef {import("../Module").BuildMeta} BuildMeta */
23
29
  /** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
24
30
  /** @typedef {import("../javascript/JavascriptParser").ImportExpression} ImportExpression */
25
31
  /** @typedef {import("../javascript/JavascriptParser").Range} Range */
32
+ /** @typedef {import("../javascript/JavascriptParser").JavascriptParserState} JavascriptParserState */
33
+ /** @typedef {import("../javascript/JavascriptParser").Members} Members */
34
+ /** @typedef {import("../javascript/JavascriptParser").MembersOptionals} MembersOptionals */
35
+ /** @typedef {import("../javascript/JavascriptParser").ArrowFunctionExpression} ArrowFunctionExpression */
36
+ /** @typedef {import("../javascript/JavascriptParser").FunctionExpression} FunctionExpression */
37
+ /** @typedef {import("../javascript/JavascriptParser").Identifier} Identifier */
38
+ /** @typedef {import("../javascript/JavascriptParser").ObjectPattern} ObjectPattern */
39
+ /** @typedef {import("../javascript/JavascriptParser").CallExpression} CallExpression */
40
+
41
+ /** @typedef {{ references: RawReferencedExports, expression: ImportExpression }} ImportSettings */
42
+ /** @typedef {WeakMap<ImportExpression, RawReferencedExports>} State */
43
+
44
+ /** @type {WeakMap<JavascriptParserState, State>} */
45
+ const parserStateMap = new WeakMap();
46
+ const dynamicImportTag = Symbol("import()");
47
+
48
+ /**
49
+ * @param {JavascriptParser} parser javascript parser
50
+ * @returns {State} import parser plugin state
51
+ */
52
+ function getState(parser) {
53
+ if (!parserStateMap.has(parser.state)) {
54
+ parserStateMap.set(parser.state, new WeakMap());
55
+ }
56
+ return /** @type {State} */ (parserStateMap.get(parser.state));
57
+ }
58
+
59
+ /**
60
+ * @param {JavascriptParser} parser javascript parser
61
+ * @param {ImportExpression} importCall import expression
62
+ * @param {string} variableName variable name
63
+ */
64
+ function tagDynamicImportReferenced(parser, importCall, variableName) {
65
+ const state = getState(parser);
66
+ /** @type {RawReferencedExports} */
67
+ const references = state.get(importCall) || [];
68
+ state.set(importCall, references);
69
+ parser.tagVariable(
70
+ variableName,
71
+ dynamicImportTag,
72
+ /** @type {ImportSettings} */ ({
73
+ references,
74
+ expression: importCall
75
+ })
76
+ );
77
+ }
78
+
79
+ /**
80
+ * @param {CallExpression} importThen import().then() call
81
+ * @returns {Identifier | ObjectPattern | undefined} the dynamic imported namespace obj
82
+ */
83
+ function getFulfilledCallbackNamespaceObj(importThen) {
84
+ const fulfilledCallback = importThen.arguments[0];
85
+ if (
86
+ fulfilledCallback &&
87
+ (fulfilledCallback.type === "ArrowFunctionExpression" ||
88
+ fulfilledCallback.type === "FunctionExpression") &&
89
+ fulfilledCallback.params[0] &&
90
+ (fulfilledCallback.params[0].type === "Identifier" ||
91
+ fulfilledCallback.params[0].type === "ObjectPattern")
92
+ ) {
93
+ return fulfilledCallback.params[0];
94
+ }
95
+ }
96
+
97
+ /**
98
+ * @param {JavascriptParser} parser javascript parser
99
+ * @param {ImportExpression} importCall import expression
100
+ * @param {ArrowFunctionExpression | FunctionExpression} fulfilledCallback the fulfilled callback
101
+ * @param {Identifier | ObjectPattern} namespaceObjArg the argument of namespace object=
102
+ */
103
+ function walkImportThenFulfilledCallback(
104
+ parser,
105
+ importCall,
106
+ fulfilledCallback,
107
+ namespaceObjArg
108
+ ) {
109
+ const arrow = fulfilledCallback.type === "ArrowFunctionExpression";
110
+ const wasTopLevel = parser.scope.topLevelScope;
111
+ parser.scope.topLevelScope = arrow ? (wasTopLevel ? "arrow" : false) : false;
112
+ const scopeParams = [...fulfilledCallback.params];
113
+
114
+ // Add function name in scope for recursive calls
115
+ if (!arrow && fulfilledCallback.id) {
116
+ scopeParams.push(fulfilledCallback.id);
117
+ }
118
+
119
+ parser.inFunctionScope(!arrow, scopeParams, () => {
120
+ if (namespaceObjArg.type === "Identifier") {
121
+ tagDynamicImportReferenced(parser, importCall, namespaceObjArg.name);
122
+ } else {
123
+ parser.enterDestructuringAssignment(namespaceObjArg, importCall);
124
+ const referencedPropertiesInDestructuring =
125
+ parser.destructuringAssignmentPropertiesFor(importCall);
126
+ if (referencedPropertiesInDestructuring) {
127
+ const state = getState(parser);
128
+ const references = /** @type {RawReferencedExports} */ (
129
+ state.get(importCall)
130
+ );
131
+ /** @type {RawReferencedExports} */
132
+ const refsInDestructuring = [];
133
+ traverseDestructuringAssignmentProperties(
134
+ referencedPropertiesInDestructuring,
135
+ (stack) => refsInDestructuring.push(stack.map((p) => p.id))
136
+ );
137
+ for (const ids of refsInDestructuring) {
138
+ references.push(ids);
139
+ }
140
+ }
141
+ }
142
+ for (const param of fulfilledCallback.params) {
143
+ parser.walkPattern(param);
144
+ }
145
+ if (fulfilledCallback.body.type === "BlockStatement") {
146
+ parser.detectMode(fulfilledCallback.body.body);
147
+ const prev = parser.prevStatement;
148
+ parser.preWalkStatement(fulfilledCallback.body);
149
+ parser.prevStatement = prev;
150
+ parser.walkStatement(fulfilledCallback.body);
151
+ } else {
152
+ parser.walkExpression(fulfilledCallback.body);
153
+ }
154
+ });
155
+ parser.scope.topLevelScope = wasTopLevel;
156
+ }
157
+
158
+ /**
159
+ * @template T
160
+ * @param {Iterable<T>} enumerable enumerable
161
+ * @returns {T[][]} array of array
162
+ */
163
+ const exportsFromEnumerable = (enumerable) =>
164
+ Array.from(enumerable, (e) => [e]);
165
+
166
+ const PLUGIN_NAME = "ImportParserPlugin";
26
167
 
27
168
  class ImportParserPlugin {
28
169
  /**
@@ -38,20 +179,94 @@ class ImportParserPlugin {
38
179
  */
39
180
  apply(parser) {
40
181
  /**
41
- * @template T
42
- * @param {Iterable<T>} enumerable enumerable
43
- * @returns {T[][]} array of array
182
+ * @param {Members} members members
183
+ * @param {MembersOptionals} membersOptionals members Optionals
184
+ * @returns {string[]} a non optional part
44
185
  */
45
- const exportsFromEnumerable = enumerable =>
46
- Array.from(enumerable, e => [e]);
47
- parser.hooks.importCall.tap("ImportParserPlugin", expr => {
186
+ function getNonOptionalPart(members, membersOptionals) {
187
+ let i = 0;
188
+ while (i < members.length && membersOptionals[i] === false) i++;
189
+ return i !== members.length ? members.slice(0, i) : members;
190
+ }
191
+
192
+ parser.hooks.collectDestructuringAssignmentProperties.tap(
193
+ PLUGIN_NAME,
194
+ (expr) => {
195
+ if (expr.type === "ImportExpression") return true;
196
+ const nameInfo = parser.getNameForExpression(expr);
197
+ if (
198
+ nameInfo &&
199
+ nameInfo.rootInfo instanceof VariableInfo &&
200
+ nameInfo.rootInfo.name &&
201
+ parser.getTagData(nameInfo.rootInfo.name, dynamicImportTag)
202
+ ) {
203
+ return true;
204
+ }
205
+ }
206
+ );
207
+ parser.hooks.preDeclarator.tap(PLUGIN_NAME, (decl) => {
208
+ if (
209
+ decl.init &&
210
+ decl.init.type === "AwaitExpression" &&
211
+ decl.init.argument.type === "ImportExpression" &&
212
+ decl.id.type === "Identifier"
213
+ ) {
214
+ parser.defineVariable(decl.id.name);
215
+ tagDynamicImportReferenced(parser, decl.init.argument, decl.id.name);
216
+ }
217
+ });
218
+ parser.hooks.expression.for(dynamicImportTag).tap(PLUGIN_NAME, (expr) => {
219
+ const settings = /** @type {ImportSettings} */ (parser.currentTagData);
220
+ const referencedPropertiesInDestructuring =
221
+ parser.destructuringAssignmentPropertiesFor(expr);
222
+ if (referencedPropertiesInDestructuring) {
223
+ /** @type {RawReferencedExports} */
224
+ const refsInDestructuring = [];
225
+ traverseDestructuringAssignmentProperties(
226
+ referencedPropertiesInDestructuring,
227
+ (stack) => refsInDestructuring.push(stack.map((p) => p.id))
228
+ );
229
+ for (const ids of refsInDestructuring) {
230
+ settings.references.push(ids);
231
+ }
232
+ } else {
233
+ settings.references.push([]);
234
+ }
235
+ return true;
236
+ });
237
+ parser.hooks.expressionMemberChain
238
+ .for(dynamicImportTag)
239
+ .tap(PLUGIN_NAME, (_expression, members, membersOptionals) => {
240
+ const settings = /** @type {ImportSettings} */ (parser.currentTagData);
241
+ const ids = getNonOptionalPart(members, membersOptionals);
242
+ settings.references.push(ids);
243
+ return true;
244
+ });
245
+ parser.hooks.callMemberChain
246
+ .for(dynamicImportTag)
247
+ .tap(PLUGIN_NAME, (expression, members, membersOptionals) => {
248
+ const { arguments: args } = expression;
249
+ const settings = /** @type {ImportSettings} */ (parser.currentTagData);
250
+ let ids = getNonOptionalPart(members, membersOptionals);
251
+ const directImport = members.length === 0;
252
+ if (
253
+ !directImport &&
254
+ (this.options.strictThisContextOnImports || ids.length > 1)
255
+ ) {
256
+ ids = ids.slice(0, -1);
257
+ }
258
+ settings.references.push(ids);
259
+ if (args) parser.walkExpressions(args);
260
+ return true;
261
+ });
262
+ parser.hooks.importCall.tap(PLUGIN_NAME, (expr, importThen) => {
48
263
  const param = parser.evaluateExpression(expr.source);
49
264
 
50
265
  let chunkName = null;
51
266
  let mode = /** @type {ContextMode} */ (this.options.dynamicImportMode);
52
267
  let include = null;
53
268
  let exclude = null;
54
- /** @type {string[][] | null} */
269
+ /** @type {RawReferencedExports | null} */
55
270
  let exports = null;
56
271
  /** @type {RawChunkGroupOptions} */
57
272
  const groupOptions = {};
@@ -61,20 +276,26 @@ class ImportParserPlugin {
61
276
  dynamicImportPrefetch,
62
277
  dynamicImportFetchPriority
63
278
  } = this.options;
64
- if (dynamicImportPreload !== undefined && dynamicImportPreload !== false)
279
+ if (
280
+ dynamicImportPreload !== undefined &&
281
+ dynamicImportPreload !== false
282
+ ) {
65
283
  groupOptions.preloadOrder =
66
284
  dynamicImportPreload === true ? 0 : dynamicImportPreload;
285
+ }
67
286
  if (
68
287
  dynamicImportPrefetch !== undefined &&
69
288
  dynamicImportPrefetch !== false
70
- )
289
+ ) {
71
290
  groupOptions.prefetchOrder =
72
291
  dynamicImportPrefetch === true ? 0 : dynamicImportPrefetch;
292
+ }
73
293
  if (
74
294
  dynamicImportFetchPriority !== undefined &&
75
295
  dynamicImportFetchPriority !== false
76
- )
296
+ ) {
77
297
  groupOptions.fetchPriority = dynamicImportFetchPriority;
298
+ }
78
299
 
79
300
  const { options: importOptions, errors: commentErrors } =
80
301
  parser.parseCommentOptions(/** @type {Range} */ (expr.range));
@@ -91,6 +312,12 @@ class ImportParserPlugin {
91
312
  }
92
313
  }
93
314
 
315
+ const phase = createGetImportPhase(this.options.deferImport)(
316
+ parser,
317
+ expr,
318
+ () => importOptions
319
+ );
320
+
94
321
  if (importOptions) {
95
322
  if (importOptions.webpackIgnore !== undefined) {
96
323
  if (typeof importOptions.webpackIgnore !== "boolean") {
@@ -209,8 +436,8 @@ class ImportParserPlugin {
209
436
  !(
210
437
  typeof importOptions.webpackExports === "string" ||
211
438
  (Array.isArray(importOptions.webpackExports) &&
212
- /** @type {string[]} */ (importOptions.webpackExports).every(
213
- item => typeof item === "string"
439
+ importOptions.webpackExports.every(
440
+ (item) => typeof item === "string"
214
441
  ))
215
442
  )
216
443
  ) {
@@ -245,18 +472,42 @@ class ImportParserPlugin {
245
472
 
246
473
  const referencedPropertiesInDestructuring =
247
474
  parser.destructuringAssignmentPropertiesFor(expr);
248
- if (referencedPropertiesInDestructuring) {
475
+ const state = getState(parser);
476
+ const referencedPropertiesInMember = state.get(expr);
477
+ const fulfilledNamespaceObj =
478
+ importThen && getFulfilledCallbackNamespaceObj(importThen);
479
+ if (
480
+ referencedPropertiesInDestructuring ||
481
+ referencedPropertiesInMember ||
482
+ fulfilledNamespaceObj
483
+ ) {
249
484
  if (exports) {
250
485
  parser.state.module.addWarning(
251
486
  new UnsupportedFeatureWarning(
252
- "`webpackExports` could not be used with destructuring assignment.",
487
+ "You don't need `webpackExports` if the usage of dynamic import is statically analyse-able. You can safely remove the `webpackExports` magic comment.",
253
488
  /** @type {DependencyLocation} */ (expr.loc)
254
489
  )
255
490
  );
256
491
  }
257
- exports = exportsFromEnumerable(
258
- [...referencedPropertiesInDestructuring].map(({ id }) => id)
259
- );
492
+
493
+ if (referencedPropertiesInDestructuring) {
494
+ /** @type {RawReferencedExports} */
495
+ const refsInDestructuring = [];
496
+ traverseDestructuringAssignmentProperties(
497
+ referencedPropertiesInDestructuring,
498
+ (stack) => refsInDestructuring.push(stack.map((p) => p.id))
499
+ );
500
+
501
+ exports = refsInDestructuring;
502
+ } else if (referencedPropertiesInMember) {
503
+ exports = referencedPropertiesInMember;
504
+ } else {
505
+ /** @type {RawReferencedExports} */
506
+ const references = [];
507
+ state.set(expr, references);
508
+
509
+ exports = references;
510
+ }
260
511
  }
261
512
 
262
513
  if (param.isString()) {
@@ -267,6 +518,7 @@ class ImportParserPlugin {
267
518
  /** @type {string} */ (param.string),
268
519
  /** @type {Range} */ (expr.range),
269
520
  exports,
521
+ phase,
270
522
  attributes
271
523
  );
272
524
  parser.state.current.addDependency(dep);
@@ -275,6 +527,7 @@ class ImportParserPlugin {
275
527
  /** @type {string} */ (param.string),
276
528
  /** @type {Range} */ (expr.range),
277
529
  exports,
530
+ phase,
278
531
  attributes
279
532
  );
280
533
  parser.state.current.addDependency(dep);
@@ -291,6 +544,7 @@ class ImportParserPlugin {
291
544
  /** @type {string} */ (param.string),
292
545
  /** @type {Range} */ (expr.range),
293
546
  exports,
547
+ phase,
294
548
  attributes
295
549
  );
296
550
  dep.loc = /** @type {DependencyLocation} */ (expr.loc);
@@ -298,39 +552,63 @@ class ImportParserPlugin {
298
552
  depBlock.addDependency(dep);
299
553
  parser.state.current.addBlock(depBlock);
300
554
  }
301
- return true;
555
+ } else {
556
+ if (mode === "weak") {
557
+ mode = "async-weak";
558
+ }
559
+
560
+ if (ImportPhaseUtils.isDefer(phase)) {
561
+ parser.state.module.addWarning(
562
+ new UnsupportedFeatureWarning(
563
+ "import.defer() is not yet supported for ContextModule (the import path is a dynamic expression).",
564
+ /** @type {DependencyLocation} */ (expr.loc)
565
+ )
566
+ );
567
+ }
568
+
569
+ const dep = ContextDependencyHelpers.create(
570
+ ImportContextDependency,
571
+ /** @type {Range} */ (expr.range),
572
+ param,
573
+ expr,
574
+ this.options,
575
+ {
576
+ chunkName,
577
+ groupOptions,
578
+ include,
579
+ exclude,
580
+ mode,
581
+ namespaceObject:
582
+ /** @type {BuildMeta} */
583
+ (parser.state.module.buildMeta).strictHarmonyModule
584
+ ? "strict"
585
+ : true,
586
+ typePrefix: "import()",
587
+ category: "esm",
588
+ referencedExports: exports,
589
+ attributes: getImportAttributes(expr)
590
+ },
591
+ parser
592
+ );
593
+ if (!dep) return;
594
+ dep.loc = /** @type {DependencyLocation} */ (expr.loc);
595
+ dep.optional = Boolean(parser.scope.inTry);
596
+ parser.state.current.addDependency(dep);
302
597
  }
303
- if (mode === "weak") {
304
- mode = "async-weak";
598
+
599
+ if (fulfilledNamespaceObj) {
600
+ walkImportThenFulfilledCallback(
601
+ parser,
602
+ expr,
603
+ /** @type {ArrowFunctionExpression | FunctionExpression} */
604
+ (importThen.arguments[0]),
605
+ fulfilledNamespaceObj
606
+ );
607
+ parser.walkExpressions(importThen.arguments.slice(1));
608
+ } else if (importThen) {
609
+ parser.walkExpressions(importThen.arguments);
305
610
  }
306
- const dep = ContextDependencyHelpers.create(
307
- ImportContextDependency,
308
- /** @type {Range} */ (expr.range),
309
- param,
310
- expr,
311
- this.options,
312
- {
313
- chunkName,
314
- groupOptions,
315
- include,
316
- exclude,
317
- mode,
318
- namespaceObject: /** @type {BuildMeta} */ (
319
- parser.state.module.buildMeta
320
- ).strictHarmonyModule
321
- ? "strict"
322
- : true,
323
- typePrefix: "import()",
324
- category: "esm",
325
- referencedExports: exports,
326
- attributes: getImportAttributes(expr)
327
- },
328
- parser
329
- );
330
- if (!dep) return;
331
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
332
- dep.optional = Boolean(parser.scope.inTry);
333
- parser.state.current.addDependency(dep);
611
+
334
612
  return true;
335
613
  });
336
614
  }
@@ -0,0 +1,121 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Haijie Xie @hai-x
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const memoize = require("../util/memoize");
9
+
10
+ const getCommentCompilationWarning = memoize(() =>
11
+ require("../CommentCompilationWarning")
12
+ );
13
+
14
+ /** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
15
+ /** @typedef {import("../javascript/JavascriptParser").ExportAllDeclaration} ExportAllDeclaration */
16
+ /** @typedef {import("../javascript/JavascriptParser").ExportNamedDeclaration} ExportNamedDeclaration */
17
+ /** @typedef {import("../javascript/JavascriptParser").ImportDeclaration} ImportDeclaration */
18
+ /** @typedef {import("../javascript/JavascriptParser").ImportExpression} ImportExpression */
19
+
20
+ /** @typedef {typeof ImportPhase.Evaluation | typeof ImportPhase.Defer | typeof ImportPhase.Source} ImportPhaseType */
21
+
22
+ const ImportPhase = Object.freeze({
23
+ Evaluation: 0b00,
24
+ Defer: 0b01,
25
+ Source: 0b10
26
+ });
27
+
28
+ /**
29
+ * @typedef {object} ImportPhaseUtils
30
+ * @property {(phase: ImportPhaseType) => boolean} isDefer true if phase is defer
31
+ * @property {(phase: ImportPhaseType) => boolean} isSource true if phase is source
32
+ */
33
+
34
+ /** @type {ImportPhaseUtils} */
35
+ const ImportPhaseUtils = {
36
+ isDefer(phase) {
37
+ return phase === ImportPhase.Defer;
38
+ },
39
+ isSource(phase) {
40
+ return phase === ImportPhase.Source;
41
+ }
42
+ };
43
+
44
+ /**
45
+ * @typedef {() => Record<string, EXPECTED_ANY> | null} GetCommentOptions
46
+ */
47
+
48
+ /**
49
+ * @callback GetImportPhase
50
+ * @param {JavascriptParser} parser parser
51
+ * @param {ExportNamedDeclaration | ExportAllDeclaration | ImportDeclaration | ImportExpression} node node
52
+ * @param {GetCommentOptions=} getCommentOptions optional function that returns the comment options object.
53
+ * @returns {ImportPhaseType} import phase
54
+ */
55
+
56
+ /**
57
+ * @param {boolean=} enableImportPhase enable import phase detection
58
+ * @returns {GetImportPhase} evaluates the import phase for ast node
59
+ */
60
+ function createGetImportPhase(enableImportPhase) {
61
+ return (parser, node, getCommentOptions) => {
62
+ if (!enableImportPhase) return ImportPhase.Evaluation;
63
+
64
+ // We now only support `defer import`
65
+ const phaseBySyntax =
66
+ "phase" in node && node.phase === "defer"
67
+ ? ImportPhase.Defer
68
+ : ImportPhase.Evaluation;
69
+
70
+ if (!node.range) {
71
+ return phaseBySyntax;
72
+ }
73
+
74
+ getCommentOptions =
75
+ getCommentOptions ||
76
+ (() => {
77
+ if (!node.range) return null;
78
+ const { options, errors } = parser.parseCommentOptions(node.range);
79
+ if (errors) {
80
+ for (const e of errors) {
81
+ const { comment } = e;
82
+ if (!comment.loc) continue;
83
+
84
+ const CommentCompilationWarning = getCommentCompilationWarning();
85
+ parser.state.module.addWarning(
86
+ new CommentCompilationWarning(
87
+ `Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
88
+ comment.loc
89
+ )
90
+ );
91
+ }
92
+ }
93
+ return options;
94
+ });
95
+
96
+ const options = getCommentOptions();
97
+
98
+ if (!options || !options.webpackDefer) return phaseBySyntax;
99
+
100
+ const { webpackDefer } = options;
101
+ if (typeof webpackDefer === "boolean") {
102
+ return webpackDefer ? ImportPhase.Defer : phaseBySyntax;
103
+ } else if (node.loc) {
104
+ const CommentCompilationWarning = getCommentCompilationWarning();
105
+ parser.state.module.addWarning(
106
+ new CommentCompilationWarning(
107
+ "webpackDefer magic comment expected a boolean value.",
108
+ node.loc
109
+ )
110
+ );
111
+ }
112
+
113
+ return phaseBySyntax;
114
+ };
115
+ }
116
+
117
+ module.exports = {
118
+ ImportPhase,
119
+ ImportPhaseUtils,
120
+ createGetImportPhase
121
+ };
@@ -74,8 +74,9 @@ class ImportPlugin {
74
74
  * @returns {void}
75
75
  */
76
76
  const handler = (parser, parserOptions) => {
77
- if (parserOptions.import !== undefined && !parserOptions.import)
77
+ if (parserOptions.import !== undefined && !parserOptions.import) {
78
78
  return;
79
+ }
79
80
 
80
81
  new ImportParserPlugin(parserOptions).apply(parser);
81
82
  };
@@ -93,4 +94,5 @@ class ImportPlugin {
93
94
  );
94
95
  }
95
96
  }
97
+
96
98
  module.exports = ImportPlugin;
@@ -10,23 +10,24 @@ const ImportDependency = require("./ImportDependency");
10
10
 
11
11
  /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
12
12
  /** @typedef {import("../Dependency")} Dependency */
13
- /** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
14
13
  /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
15
14
  /** @typedef {import("../Module")} Module */
16
15
  /** @typedef {import("../Module").BuildMeta} BuildMeta */
17
- /** @typedef {import("../ModuleGraph")} ModuleGraph */
18
16
  /** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
19
17
  /** @typedef {import("../javascript/JavascriptParser").Range} Range */
18
+ /** @typedef {ImportDependency.RawReferencedExports} RawReferencedExports */
19
+ /** @typedef {import("./ImportPhase").ImportPhaseType} ImportPhaseType */
20
20
 
21
21
  class ImportWeakDependency extends ImportDependency {
22
22
  /**
23
23
  * @param {string} request the request
24
24
  * @param {Range} range expression range
25
- * @param {(string[][] | null)=} referencedExports list of referenced exports
25
+ * @param {RawReferencedExports | null} referencedExports list of referenced exports
26
+ * @param {ImportPhaseType} phase import phase
26
27
  * @param {ImportAttributes=} attributes import attributes
27
28
  */
28
- constructor(request, range, referencedExports, attributes) {
29
- super(request, range, referencedExports, attributes);
29
+ constructor(request, range, referencedExports, phase, attributes) {
30
+ super(request, range, referencedExports, phase, attributes);
30
31
  this.weak = true;
31
32
  }
32
33
 
@@ -62,6 +63,7 @@ ImportWeakDependency.Template = class ImportDependencyTemplate extends (
62
63
  strict: /** @type {BuildMeta} */ (module.buildMeta).strictHarmonyModule,
63
64
  message: "import() weak",
64
65
  weak: true,
66
+ dependency: dep,
65
67
  runtimeRequirements
66
68
  });
67
69