webpack 5.59.0 → 5.94.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (570) hide show
  1. package/README.md +48 -38
  2. package/bin/webpack.js +34 -10
  3. package/hot/dev-server.js +19 -5
  4. package/hot/lazy-compilation-node.js +13 -1
  5. package/hot/lazy-compilation-web.js +9 -0
  6. package/hot/log-apply-result.js +5 -0
  7. package/hot/log.js +23 -4
  8. package/hot/only-dev-server.js +3 -2
  9. package/hot/poll.js +5 -2
  10. package/hot/signal.js +6 -2
  11. package/lib/APIPlugin.js +226 -122
  12. package/lib/AbstractMethodError.js +10 -5
  13. package/lib/AsyncDependenciesBlock.js +13 -5
  14. package/lib/AutomaticPrefetchPlugin.js +2 -1
  15. package/lib/BannerPlugin.js +33 -12
  16. package/lib/Cache.js +16 -12
  17. package/lib/CacheFacade.js +13 -16
  18. package/lib/CaseSensitiveModulesWarning.js +8 -8
  19. package/lib/Chunk.js +60 -33
  20. package/lib/ChunkGraph.js +207 -72
  21. package/lib/ChunkGroup.js +40 -20
  22. package/lib/ChunkTemplate.js +43 -0
  23. package/lib/CleanPlugin.js +117 -32
  24. package/lib/CodeGenerationResults.js +8 -7
  25. package/lib/CommentCompilationWarning.js +0 -1
  26. package/lib/CompatibilityPlugin.js +85 -46
  27. package/lib/Compilation.js +712 -392
  28. package/lib/Compiler.js +393 -172
  29. package/lib/ConcatenationScope.js +10 -13
  30. package/lib/ConditionalInitFragment.js +22 -14
  31. package/lib/ConstPlugin.js +104 -64
  32. package/lib/ContextExclusionPlugin.js +3 -3
  33. package/lib/ContextModule.js +283 -108
  34. package/lib/ContextModuleFactory.js +151 -63
  35. package/lib/ContextReplacementPlugin.js +25 -10
  36. package/lib/CssModule.js +166 -0
  37. package/lib/DefinePlugin.js +254 -148
  38. package/lib/DelegatedModule.js +29 -6
  39. package/lib/DelegatedModuleFactoryPlugin.js +42 -22
  40. package/lib/DelegatedPlugin.js +4 -0
  41. package/lib/DependenciesBlock.js +17 -2
  42. package/lib/Dependency.js +58 -29
  43. package/lib/DependencyTemplate.js +24 -3
  44. package/lib/DependencyTemplates.js +2 -2
  45. package/lib/DllEntryPlugin.js +18 -1
  46. package/lib/DllModule.js +21 -4
  47. package/lib/DllModuleFactory.js +2 -1
  48. package/lib/DllPlugin.js +9 -7
  49. package/lib/DllReferencePlugin.js +50 -19
  50. package/lib/EntryOptionPlugin.js +6 -1
  51. package/lib/EntryPlugin.js +7 -4
  52. package/lib/Entrypoint.js +2 -2
  53. package/lib/EnvironmentNotSupportAsyncWarning.js +52 -0
  54. package/lib/EnvironmentPlugin.js +5 -2
  55. package/lib/ErrorHelpers.js +65 -26
  56. package/lib/EvalDevToolModulePlugin.js +37 -13
  57. package/lib/EvalSourceMapDevToolPlugin.js +50 -20
  58. package/lib/ExportsInfo.js +234 -133
  59. package/lib/ExportsInfoApiPlugin.js +31 -15
  60. package/lib/ExternalModule.js +391 -129
  61. package/lib/ExternalModuleFactoryPlugin.js +65 -17
  62. package/lib/FileSystemInfo.js +1038 -523
  63. package/lib/FlagAllModulesAsUsedPlugin.js +27 -27
  64. package/lib/FlagDependencyExportsPlugin.js +352 -349
  65. package/lib/FlagDependencyUsagePlugin.js +10 -10
  66. package/lib/FlagEntryExportAsUsedPlugin.js +26 -23
  67. package/lib/Generator.js +16 -8
  68. package/lib/GraphHelpers.js +3 -2
  69. package/lib/HookWebpackError.js +11 -13
  70. package/lib/HotModuleReplacementPlugin.js +221 -128
  71. package/lib/IgnoreErrorModuleFactory.js +4 -4
  72. package/lib/IgnorePlugin.js +5 -4
  73. package/lib/IgnoreWarningsPlugin.js +6 -9
  74. package/lib/InitFragment.js +39 -15
  75. package/lib/JavascriptMetaInfoPlugin.js +27 -15
  76. package/lib/LibManifestPlugin.js +45 -16
  77. package/lib/LoaderOptionsPlugin.js +13 -3
  78. package/lib/MainTemplate.js +74 -21
  79. package/lib/Module.js +155 -34
  80. package/lib/ModuleBuildError.js +13 -11
  81. package/lib/ModuleDependencyError.js +6 -4
  82. package/lib/ModuleDependencyWarning.js +6 -4
  83. package/lib/ModuleError.js +10 -5
  84. package/lib/ModuleFactory.js +4 -4
  85. package/lib/ModuleFilenameHelpers.js +164 -54
  86. package/lib/ModuleGraph.js +93 -53
  87. package/lib/ModuleGraphConnection.js +27 -13
  88. package/lib/ModuleHashingError.js +29 -0
  89. package/lib/ModuleInfoHeaderPlugin.js +92 -33
  90. package/lib/ModuleNotFoundError.js +5 -2
  91. package/lib/ModuleParseError.js +17 -9
  92. package/lib/ModuleProfile.js +1 -0
  93. package/lib/ModuleRestoreError.js +3 -1
  94. package/lib/ModuleStoreError.js +3 -2
  95. package/lib/ModuleTemplate.js +33 -1
  96. package/lib/ModuleTypeConstants.js +168 -0
  97. package/lib/ModuleWarning.js +10 -5
  98. package/lib/MultiCompiler.js +115 -38
  99. package/lib/MultiStats.js +75 -33
  100. package/lib/MultiWatching.js +6 -2
  101. package/lib/NodeStuffPlugin.js +136 -37
  102. package/lib/NormalModule.js +437 -194
  103. package/lib/NormalModuleFactory.js +313 -116
  104. package/lib/NormalModuleReplacementPlugin.js +10 -4
  105. package/lib/NullFactory.js +1 -1
  106. package/lib/OptimizationStages.js +3 -3
  107. package/lib/Parser.js +1 -1
  108. package/lib/PlatformPlugin.js +39 -0
  109. package/lib/PrefetchPlugin.js +4 -0
  110. package/lib/ProgressPlugin.js +83 -28
  111. package/lib/ProvidePlugin.js +37 -19
  112. package/lib/RawModule.js +18 -5
  113. package/lib/RecordIdsPlugin.js +8 -8
  114. package/lib/RequireJsStuffPlugin.js +22 -15
  115. package/lib/ResolverFactory.js +8 -4
  116. package/lib/RuntimeGlobals.js +99 -65
  117. package/lib/RuntimeModule.js +17 -15
  118. package/lib/RuntimePlugin.js +116 -13
  119. package/lib/RuntimeTemplate.js +304 -102
  120. package/lib/SelfModuleFactory.js +12 -0
  121. package/lib/SizeFormatHelpers.js +2 -4
  122. package/lib/SourceMapDevToolModuleOptionsPlugin.js +4 -0
  123. package/lib/SourceMapDevToolPlugin.js +89 -42
  124. package/lib/Stats.js +12 -7
  125. package/lib/Template.js +30 -33
  126. package/lib/TemplatedPathPlugin.js +102 -34
  127. package/lib/UseStrictPlugin.js +37 -12
  128. package/lib/WarnCaseSensitiveModulesPlugin.js +12 -0
  129. package/lib/WarnDeprecatedOptionPlugin.js +6 -0
  130. package/lib/WatchIgnorePlugin.js +46 -13
  131. package/lib/Watching.js +139 -76
  132. package/lib/WebpackError.js +14 -5
  133. package/lib/WebpackIsIncludedPlugin.js +22 -13
  134. package/lib/WebpackOptionsApply.js +162 -56
  135. package/lib/WebpackOptionsDefaulter.js +10 -3
  136. package/lib/asset/AssetGenerator.js +351 -99
  137. package/lib/asset/AssetModulesPlugin.js +57 -33
  138. package/lib/asset/AssetParser.js +15 -6
  139. package/lib/asset/AssetSourceGenerator.js +30 -10
  140. package/lib/asset/AssetSourceParser.js +8 -2
  141. package/lib/asset/RawDataUrlModule.js +162 -0
  142. package/lib/async-modules/AwaitDependenciesInitFragment.js +16 -13
  143. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  144. package/lib/buildChunkGraph.js +376 -420
  145. package/lib/cache/AddManagedPathsPlugin.js +6 -1
  146. package/lib/cache/IdleFileCachePlugin.js +26 -13
  147. package/lib/cache/MemoryCachePlugin.js +1 -1
  148. package/lib/cache/MemoryWithGcCachePlugin.js +13 -7
  149. package/lib/cache/PackFileCacheStrategy.js +172 -94
  150. package/lib/cache/ResolverCachePlugin.js +115 -43
  151. package/lib/cache/getLazyHashedEtag.js +2 -2
  152. package/lib/cache/mergeEtags.js +16 -21
  153. package/lib/cli.js +195 -110
  154. package/lib/config/browserslistTargetHandler.js +106 -41
  155. package/lib/config/defaults.js +572 -154
  156. package/lib/config/normalization.js +361 -322
  157. package/lib/config/target.js +105 -66
  158. package/lib/container/ContainerEntryDependency.js +2 -1
  159. package/lib/container/ContainerEntryModule.js +27 -11
  160. package/lib/container/ContainerEntryModuleFactory.js +1 -1
  161. package/lib/container/ContainerExposedDependency.js +9 -0
  162. package/lib/container/ContainerPlugin.js +18 -12
  163. package/lib/container/ContainerReferencePlugin.js +1 -1
  164. package/lib/container/FallbackDependency.js +13 -0
  165. package/lib/container/FallbackItemDependency.js +3 -0
  166. package/lib/container/FallbackModule.js +19 -8
  167. package/lib/container/FallbackModuleFactory.js +1 -1
  168. package/lib/container/ModuleFederationPlugin.js +2 -0
  169. package/lib/container/RemoteModule.js +17 -4
  170. package/lib/container/RemoteRuntimeModule.js +31 -17
  171. package/lib/container/RemoteToExternalDependency.js +3 -0
  172. package/lib/container/options.js +18 -4
  173. package/lib/css/CssExportsGenerator.js +203 -0
  174. package/lib/css/CssGenerator.js +151 -0
  175. package/lib/css/CssLoadingRuntimeModule.js +592 -0
  176. package/lib/css/CssModulesPlugin.js +888 -0
  177. package/lib/css/CssParser.js +1049 -0
  178. package/lib/css/walkCssTokens.js +775 -0
  179. package/lib/debug/ProfilingPlugin.js +102 -54
  180. package/lib/dependencies/AMDDefineDependency.js +54 -10
  181. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +204 -61
  182. package/lib/dependencies/AMDPlugin.js +44 -24
  183. package/lib/dependencies/AMDRequireArrayDependency.js +34 -10
  184. package/lib/dependencies/AMDRequireContextDependency.js +15 -0
  185. package/lib/dependencies/AMDRequireDependenciesBlock.js +6 -0
  186. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +185 -54
  187. package/lib/dependencies/AMDRequireDependency.js +21 -6
  188. package/lib/dependencies/AMDRequireItemDependency.js +6 -0
  189. package/lib/dependencies/AMDRuntimeModules.js +4 -4
  190. package/lib/dependencies/CachedConstDependency.js +22 -1
  191. package/lib/dependencies/CommonJsDependencyHelpers.js +16 -2
  192. package/lib/dependencies/CommonJsExportRequireDependency.js +77 -47
  193. package/lib/dependencies/CommonJsExportsDependency.js +28 -5
  194. package/lib/dependencies/CommonJsExportsParserPlugin.js +111 -39
  195. package/lib/dependencies/CommonJsFullRequireDependency.js +42 -8
  196. package/lib/dependencies/CommonJsImportsParserPlugin.js +530 -130
  197. package/lib/dependencies/CommonJsPlugin.js +51 -26
  198. package/lib/dependencies/CommonJsRequireContextDependency.js +23 -2
  199. package/lib/dependencies/CommonJsRequireDependency.js +9 -1
  200. package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -8
  201. package/lib/dependencies/ConstDependency.js +12 -3
  202. package/lib/dependencies/ContextDependency.js +32 -5
  203. package/lib/dependencies/ContextDependencyHelpers.js +92 -62
  204. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -1
  205. package/lib/dependencies/ContextElementDependency.js +41 -4
  206. package/lib/dependencies/CreateScriptUrlDependency.js +22 -1
  207. package/lib/dependencies/CriticalDependencyWarning.js +4 -1
  208. package/lib/dependencies/CssExportDependency.js +156 -0
  209. package/lib/dependencies/CssImportDependency.js +125 -0
  210. package/lib/dependencies/CssLocalIdentifierDependency.js +245 -0
  211. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +111 -0
  212. package/lib/dependencies/CssUrlDependency.js +164 -0
  213. package/lib/dependencies/DelegatedSourceDependency.js +3 -0
  214. package/lib/dependencies/DllEntryDependency.js +14 -0
  215. package/lib/dependencies/DynamicExports.js +15 -11
  216. package/lib/dependencies/ExportsInfoDependency.js +26 -5
  217. package/lib/dependencies/ExternalModuleDependency.js +109 -0
  218. package/lib/dependencies/ExternalModuleInitFragment.js +133 -0
  219. package/lib/dependencies/HarmonyAcceptDependency.js +11 -2
  220. package/lib/dependencies/HarmonyAcceptImportDependency.js +9 -4
  221. package/lib/dependencies/HarmonyCompatibilityDependency.js +6 -5
  222. package/lib/dependencies/HarmonyDetectionParserPlugin.js +29 -3
  223. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +152 -0
  224. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +96 -51
  225. package/lib/dependencies/HarmonyExportExpressionDependency.js +21 -4
  226. package/lib/dependencies/HarmonyExportHeaderDependency.js +13 -0
  227. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +216 -108
  228. package/lib/dependencies/HarmonyExportInitFragment.js +21 -9
  229. package/lib/dependencies/HarmonyExportSpecifierDependency.js +12 -0
  230. package/lib/dependencies/HarmonyExports.js +13 -7
  231. package/lib/dependencies/HarmonyImportDependency.js +65 -19
  232. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +268 -74
  233. package/lib/dependencies/HarmonyImportSideEffectDependency.js +11 -5
  234. package/lib/dependencies/HarmonyImportSpecifierDependency.js +180 -36
  235. package/lib/dependencies/HarmonyModulesPlugin.js +33 -5
  236. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -3
  237. package/lib/dependencies/ImportContextDependency.js +15 -2
  238. package/lib/dependencies/ImportDependency.js +50 -12
  239. package/lib/dependencies/ImportEagerDependency.js +11 -6
  240. package/lib/dependencies/ImportMetaContextDependency.js +42 -0
  241. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +301 -0
  242. package/lib/dependencies/ImportMetaContextPlugin.js +72 -0
  243. package/lib/dependencies/ImportMetaHotAcceptDependency.js +6 -0
  244. package/lib/dependencies/ImportMetaHotDeclineDependency.js +6 -0
  245. package/lib/dependencies/ImportMetaPlugin.js +128 -59
  246. package/lib/dependencies/ImportParserPlugin.js +153 -83
  247. package/lib/dependencies/ImportPlugin.js +21 -7
  248. package/lib/dependencies/ImportWeakDependency.js +11 -6
  249. package/lib/dependencies/JsonExportsDependency.js +38 -30
  250. package/lib/dependencies/LoaderDependency.js +14 -0
  251. package/lib/dependencies/LoaderImportDependency.js +14 -0
  252. package/lib/dependencies/LoaderPlugin.js +54 -40
  253. package/lib/dependencies/LocalModule.js +17 -1
  254. package/lib/dependencies/LocalModuleDependency.js +15 -0
  255. package/lib/dependencies/LocalModulesHelpers.js +22 -4
  256. package/lib/dependencies/ModuleDecoratorDependency.js +9 -1
  257. package/lib/dependencies/ModuleDependency.js +24 -7
  258. package/lib/dependencies/ModuleDependencyTemplateAsId.js +2 -1
  259. package/lib/dependencies/ModuleHotAcceptDependency.js +6 -0
  260. package/lib/dependencies/ModuleHotDeclineDependency.js +6 -0
  261. package/lib/dependencies/PrefetchDependency.js +3 -0
  262. package/lib/dependencies/ProvidedDependency.js +43 -8
  263. package/lib/dependencies/PureExpressionDependency.js +73 -39
  264. package/lib/dependencies/RequireContextDependency.js +6 -16
  265. package/lib/dependencies/RequireContextDependencyParserPlugin.js +14 -6
  266. package/lib/dependencies/RequireContextPlugin.js +20 -7
  267. package/lib/dependencies/RequireEnsureDependenciesBlock.js +7 -0
  268. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +29 -12
  269. package/lib/dependencies/RequireEnsureDependency.js +16 -2
  270. package/lib/dependencies/RequireEnsureItemDependency.js +3 -0
  271. package/lib/dependencies/RequireEnsurePlugin.js +27 -7
  272. package/lib/dependencies/RequireHeaderDependency.js +14 -1
  273. package/lib/dependencies/RequireIncludeDependency.js +6 -1
  274. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +29 -5
  275. package/lib/dependencies/RequireIncludePlugin.js +25 -5
  276. package/lib/dependencies/RequireResolveContextDependency.js +19 -2
  277. package/lib/dependencies/RequireResolveDependency.js +8 -1
  278. package/lib/dependencies/RequireResolveHeaderDependency.js +18 -0
  279. package/lib/dependencies/RuntimeRequirementsDependency.js +9 -1
  280. package/lib/dependencies/StaticExportsDependency.js +8 -0
  281. package/lib/dependencies/SystemPlugin.js +49 -22
  282. package/lib/dependencies/SystemRuntimeModule.js +1 -1
  283. package/lib/dependencies/URLDependency.js +20 -13
  284. package/lib/dependencies/URLPlugin.js +115 -27
  285. package/lib/dependencies/UnsupportedDependency.js +13 -0
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +14 -0
  287. package/lib/dependencies/WebAssemblyImportDependency.js +9 -1
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -1
  289. package/lib/dependencies/WorkerDependency.js +47 -3
  290. package/lib/dependencies/WorkerPlugin.js +143 -59
  291. package/lib/dependencies/getFunctionExpression.js +9 -0
  292. package/lib/dependencies/processExportInfo.js +3 -1
  293. package/lib/electron/ElectronTargetPlugin.js +1 -0
  294. package/lib/esm/ExportWebpackRequireRuntimeModule.js +3 -2
  295. package/lib/esm/ModuleChunkFormatPlugin.js +92 -55
  296. package/lib/esm/ModuleChunkLoadingPlugin.js +12 -1
  297. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +141 -25
  298. package/lib/formatLocation.js +1 -2
  299. package/lib/hmr/HotModuleReplacement.runtime.js +37 -25
  300. package/lib/hmr/HotModuleReplacementRuntimeModule.js +2 -1
  301. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +13 -15
  302. package/lib/hmr/LazyCompilationPlugin.js +94 -41
  303. package/lib/hmr/lazyCompilationBackend.js +107 -44
  304. package/lib/ids/ChunkModuleIdRangePlugin.js +12 -3
  305. package/lib/ids/DeterministicChunkIdsPlugin.js +13 -6
  306. package/lib/ids/DeterministicModuleIdsPlugin.js +59 -35
  307. package/lib/ids/HashedModuleIdsPlugin.js +24 -16
  308. package/lib/ids/IdHelpers.js +59 -49
  309. package/lib/ids/NamedChunkIdsPlugin.js +13 -1
  310. package/lib/ids/NamedModuleIdsPlugin.js +20 -12
  311. package/lib/ids/NaturalModuleIdsPlugin.js +10 -13
  312. package/lib/ids/OccurrenceChunkIdsPlugin.js +6 -2
  313. package/lib/ids/OccurrenceModuleIdsPlugin.js +14 -11
  314. package/lib/ids/SyncModuleIdsPlugin.js +146 -0
  315. package/lib/index.js +44 -5
  316. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +9 -7
  317. package/lib/javascript/BasicEvaluatedExpression.js +133 -19
  318. package/lib/javascript/ChunkHelpers.js +33 -0
  319. package/lib/javascript/CommonJsChunkFormatPlugin.js +18 -15
  320. package/lib/javascript/EnableChunkLoadingPlugin.js +11 -6
  321. package/lib/javascript/JavascriptGenerator.js +37 -6
  322. package/lib/javascript/JavascriptModulesPlugin.js +523 -295
  323. package/lib/javascript/JavascriptParser.js +1591 -574
  324. package/lib/javascript/JavascriptParserHelpers.js +58 -37
  325. package/lib/javascript/StartupHelpers.js +69 -47
  326. package/lib/json/JsonData.js +33 -0
  327. package/lib/json/JsonGenerator.js +29 -21
  328. package/lib/json/JsonModulesPlugin.js +13 -7
  329. package/lib/json/JsonParser.js +30 -16
  330. package/lib/library/AbstractLibraryPlugin.js +6 -2
  331. package/lib/library/AmdLibraryPlugin.js +34 -18
  332. package/lib/library/AssignLibraryPlugin.js +68 -32
  333. package/lib/library/EnableLibraryPlugin.js +39 -14
  334. package/lib/library/ExportPropertyLibraryPlugin.js +14 -5
  335. package/lib/library/JsonpLibraryPlugin.js +4 -3
  336. package/lib/library/ModernModuleLibraryPlugin.js +144 -0
  337. package/lib/library/ModuleLibraryPlugin.js +12 -7
  338. package/lib/library/SystemLibraryPlugin.js +6 -4
  339. package/lib/library/UmdLibraryPlugin.js +119 -100
  340. package/lib/logging/Logger.js +59 -6
  341. package/lib/logging/createConsoleLogger.js +25 -40
  342. package/lib/logging/runtime.js +8 -9
  343. package/lib/logging/truncateArgs.js +9 -8
  344. package/lib/node/CommonJsChunkLoadingPlugin.js +18 -2
  345. package/lib/node/NodeEnvironmentPlugin.js +14 -8
  346. package/lib/node/NodeTargetPlugin.js +7 -0
  347. package/lib/node/NodeTemplatePlugin.js +10 -2
  348. package/lib/node/NodeWatchFileSystem.js +100 -50
  349. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +51 -26
  350. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +13 -2
  351. package/lib/node/ReadFileCompileWasmPlugin.js +21 -3
  352. package/lib/node/RequireChunkLoadingRuntimeModule.js +49 -26
  353. package/lib/node/nodeConsole.js +48 -31
  354. package/lib/optimize/AggressiveMergingPlugin.js +10 -4
  355. package/lib/optimize/AggressiveSplittingPlugin.js +26 -21
  356. package/lib/optimize/ConcatenatedModule.js +353 -212
  357. package/lib/optimize/EnsureChunkConditionsPlugin.js +4 -1
  358. package/lib/optimize/FlagIncludedChunksPlugin.js +14 -8
  359. package/lib/optimize/InnerGraph.js +30 -25
  360. package/lib/optimize/InnerGraphPlugin.js +105 -64
  361. package/lib/optimize/LimitChunkCountPlugin.js +32 -9
  362. package/lib/optimize/MangleExportsPlugin.js +7 -2
  363. package/lib/optimize/MinMaxSizeWarning.js +6 -1
  364. package/lib/optimize/ModuleConcatenationPlugin.js +150 -83
  365. package/lib/optimize/RealContentHashPlugin.js +99 -43
  366. package/lib/optimize/RemoveParentModulesPlugin.js +131 -48
  367. package/lib/optimize/RuntimeChunkPlugin.js +15 -2
  368. package/lib/optimize/SideEffectsFlagPlugin.js +119 -63
  369. package/lib/optimize/SplitChunksPlugin.js +129 -78
  370. package/lib/performance/SizeLimitsPlugin.js +22 -8
  371. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +4 -2
  372. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +4 -1
  373. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +8 -5
  374. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -3
  375. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +5 -3
  376. package/lib/rules/BasicEffectRulePlugin.js +7 -1
  377. package/lib/rules/BasicMatcherRulePlugin.js +8 -1
  378. package/lib/rules/ObjectMatcherRulePlugin.js +19 -2
  379. package/lib/rules/RuleSetCompiler.js +53 -32
  380. package/lib/rules/UseEffectRulePlugin.js +42 -36
  381. package/lib/runtime/AsyncModuleRuntimeModule.js +56 -69
  382. package/lib/runtime/AutoPublicPathRuntimeModule.js +25 -9
  383. package/lib/runtime/BaseUriRuntimeModule.js +35 -0
  384. package/lib/runtime/ChunkNameRuntimeModule.js +1 -1
  385. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +5 -2
  386. package/lib/runtime/CompatRuntimeModule.js +7 -2
  387. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  388. package/lib/runtime/CreateScriptRuntimeModule.js +38 -0
  389. package/lib/runtime/CreateScriptUrlRuntimeModule.js +13 -36
  390. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +6 -3
  391. package/lib/runtime/EnsureChunkRuntimeModule.js +29 -15
  392. package/lib/runtime/GetChunkFilenameRuntimeModule.js +56 -43
  393. package/lib/runtime/GetFullHashRuntimeModule.js +4 -3
  394. package/lib/runtime/GetMainFilenameRuntimeModule.js +5 -2
  395. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +98 -0
  396. package/lib/runtime/GlobalRuntimeModule.js +1 -1
  397. package/lib/runtime/HasOwnPropertyRuntimeModule.js +5 -2
  398. package/lib/runtime/LoadScriptRuntimeModule.js +61 -45
  399. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +5 -2
  400. package/lib/runtime/NonceRuntimeModule.js +24 -0
  401. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -2
  402. package/lib/runtime/PublicPathRuntimeModule.js +9 -2
  403. package/lib/runtime/RelativeUrlRuntimeModule.js +5 -2
  404. package/lib/runtime/RuntimeIdRuntimeModule.js +6 -2
  405. package/lib/runtime/StartupChunkDependenciesPlugin.js +15 -0
  406. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +36 -28
  407. package/lib/runtime/StartupEntrypointRuntimeModule.js +13 -9
  408. package/lib/runtime/SystemContextRuntimeModule.js +1 -1
  409. package/lib/schemes/DataUriPlugin.js +16 -3
  410. package/lib/schemes/HttpUriPlugin.js +336 -120
  411. package/lib/serialization/ArraySerializer.js +22 -6
  412. package/lib/serialization/BinaryMiddleware.js +212 -33
  413. package/lib/serialization/DateObjectSerializer.js +16 -4
  414. package/lib/serialization/ErrorObjectSerializer.js +23 -6
  415. package/lib/serialization/FileMiddleware.js +187 -86
  416. package/lib/serialization/MapObjectSerializer.js +25 -8
  417. package/lib/serialization/NullPrototypeObjectSerializer.js +26 -8
  418. package/lib/serialization/ObjectMiddleware.js +96 -66
  419. package/lib/serialization/PlainObjectSerializer.js +51 -14
  420. package/lib/serialization/RegExpObjectSerializer.js +17 -5
  421. package/lib/serialization/Serializer.js +23 -5
  422. package/lib/serialization/SerializerMiddleware.js +8 -8
  423. package/lib/serialization/SetObjectSerializer.js +22 -6
  424. package/lib/serialization/SingleItemMiddleware.js +2 -2
  425. package/lib/serialization/types.js +2 -2
  426. package/lib/sharing/ConsumeSharedFallbackDependency.js +3 -0
  427. package/lib/sharing/ConsumeSharedModule.js +40 -17
  428. package/lib/sharing/ConsumeSharedPlugin.js +139 -102
  429. package/lib/sharing/ConsumeSharedRuntimeModule.js +144 -130
  430. package/lib/sharing/ProvideForSharedDependency.js +0 -1
  431. package/lib/sharing/ProvideSharedDependency.js +17 -0
  432. package/lib/sharing/ProvideSharedModule.js +19 -6
  433. package/lib/sharing/ProvideSharedModuleFactory.js +1 -1
  434. package/lib/sharing/ProvideSharedPlugin.js +37 -30
  435. package/lib/sharing/SharePlugin.js +2 -2
  436. package/lib/sharing/ShareRuntimeModule.js +20 -10
  437. package/lib/sharing/resolveMatchedConfigs.js +6 -5
  438. package/lib/sharing/utils.js +338 -34
  439. package/lib/stats/DefaultStatsFactoryPlugin.js +660 -396
  440. package/lib/stats/DefaultStatsPresetPlugin.js +85 -25
  441. package/lib/stats/DefaultStatsPrinterPlugin.js +525 -145
  442. package/lib/stats/StatsFactory.js +128 -57
  443. package/lib/stats/StatsPrinter.js +77 -46
  444. package/lib/util/ArrayHelpers.js +35 -1
  445. package/lib/util/ArrayQueue.js +15 -22
  446. package/lib/util/AsyncQueue.js +37 -16
  447. package/lib/util/IterableHelpers.js +3 -4
  448. package/lib/util/LazyBucketSortedSet.js +60 -44
  449. package/lib/util/LazySet.js +11 -2
  450. package/lib/util/MapHelpers.js +17 -5
  451. package/lib/util/ParallelismFactorCalculator.js +11 -1
  452. package/lib/util/Queue.js +9 -3
  453. package/lib/util/Semaphore.js +4 -7
  454. package/lib/util/SetHelpers.js +5 -5
  455. package/lib/util/SortableSet.js +19 -6
  456. package/lib/util/StackedCacheMap.js +33 -3
  457. package/lib/util/StackedMap.js +1 -3
  458. package/lib/util/StringXor.js +46 -0
  459. package/lib/util/TupleQueue.js +9 -3
  460. package/lib/util/TupleSet.js +15 -5
  461. package/lib/util/URLAbsoluteSpecifier.js +8 -8
  462. package/lib/util/WeakTupleMap.js +70 -28
  463. package/lib/util/binarySearchBounds.js +51 -9
  464. package/lib/util/chainedImports.js +97 -0
  465. package/lib/util/cleverMerge.js +51 -36
  466. package/lib/util/comparators.js +146 -83
  467. package/lib/util/compileBooleanMatcher.js +35 -7
  468. package/lib/util/conventions.js +126 -0
  469. package/lib/util/create-schema-validation.js +9 -2
  470. package/lib/util/createHash.js +49 -14
  471. package/lib/util/deprecation.js +48 -15
  472. package/lib/util/deterministicGrouping.js +71 -39
  473. package/lib/util/extractUrlAndGlobal.js +3 -0
  474. package/lib/util/findGraphRoots.js +7 -5
  475. package/lib/util/fs.js +419 -94
  476. package/lib/util/hash/BatchedHash.js +10 -4
  477. package/lib/util/hash/md4.js +20 -0
  478. package/lib/util/hash/wasm-hash.js +163 -0
  479. package/lib/util/hash/xxhash64.js +7 -141
  480. package/lib/util/identifier.js +140 -93
  481. package/lib/util/internalSerializables.js +22 -0
  482. package/lib/util/makeSerializable.js +7 -0
  483. package/lib/util/memoize.js +10 -10
  484. package/lib/util/mergeScope.js +76 -0
  485. package/lib/util/nonNumericOnlyHash.js +22 -0
  486. package/lib/util/numberHash.js +84 -34
  487. package/lib/util/objectToMap.js +0 -1
  488. package/lib/util/processAsyncTree.js +7 -1
  489. package/lib/util/propertyAccess.js +7 -55
  490. package/lib/util/propertyName.js +77 -0
  491. package/lib/util/registerExternalSerializer.js +2 -2
  492. package/lib/util/runtime.js +188 -133
  493. package/lib/util/semver.js +64 -56
  494. package/lib/util/serialization.js +26 -1
  495. package/lib/util/smartGrouping.js +10 -10
  496. package/lib/util/source.js +1 -1
  497. package/lib/validateSchema.js +6 -2
  498. package/lib/wasm/EnableWasmLoadingPlugin.js +9 -4
  499. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +70 -30
  500. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +9 -1
  501. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +34 -16
  502. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +32 -12
  503. package/lib/wasm-async/AsyncWebAssemblyParser.js +17 -4
  504. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +72 -31
  505. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +17 -6
  506. package/lib/wasm-sync/WebAssemblyGenerator.js +72 -52
  507. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -4
  508. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +53 -43
  509. package/lib/wasm-sync/WebAssemblyParser.js +23 -9
  510. package/lib/wasm-sync/WebAssemblyUtils.js +5 -4
  511. package/lib/web/FetchCompileAsyncWasmPlugin.js +11 -1
  512. package/lib/web/FetchCompileWasmPlugin.js +59 -42
  513. package/lib/web/JsonpChunkLoadingPlugin.js +9 -0
  514. package/lib/web/JsonpChunkLoadingRuntimeModule.js +71 -41
  515. package/lib/webpack.js +43 -12
  516. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +15 -12
  517. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +55 -40
  518. package/module.d.ts +233 -0
  519. package/package.json +85 -139
  520. package/schemas/WebpackOptions.check.js +1 -1
  521. package/schemas/WebpackOptions.json +679 -47
  522. package/schemas/plugins/BannerPlugin.check.js +1 -1
  523. package/schemas/plugins/BannerPlugin.json +9 -1
  524. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  525. package/schemas/plugins/HashedModuleIdsPlugin.check.js +1 -1
  526. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  527. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  528. package/schemas/plugins/SourceMapDevToolPlugin.json +4 -0
  529. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  530. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  531. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  532. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  533. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  534. package/schemas/plugins/container/ContainerPlugin.json +10 -1
  535. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  536. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  537. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  538. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  539. package/schemas/plugins/container/ModuleFederationPlugin.json +12 -1
  540. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +7 -0
  541. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +6 -0
  542. package/schemas/plugins/css/CssAutoGeneratorOptions.json +3 -0
  543. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +7 -0
  544. package/schemas/plugins/css/CssAutoParserOptions.check.js +6 -0
  545. package/schemas/plugins/css/CssAutoParserOptions.json +3 -0
  546. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +7 -0
  547. package/schemas/plugins/css/CssGeneratorOptions.check.js +6 -0
  548. package/schemas/plugins/css/CssGeneratorOptions.json +3 -0
  549. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts +7 -0
  550. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +6 -0
  551. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +3 -0
  552. package/schemas/plugins/css/CssGlobalParserOptions.check.d.ts +7 -0
  553. package/schemas/plugins/css/CssGlobalParserOptions.check.js +6 -0
  554. package/schemas/plugins/css/CssGlobalParserOptions.json +3 -0
  555. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +7 -0
  556. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +6 -0
  557. package/schemas/plugins/css/CssModuleGeneratorOptions.json +3 -0
  558. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +7 -0
  559. package/schemas/plugins/css/CssModuleParserOptions.check.js +6 -0
  560. package/schemas/plugins/css/CssModuleParserOptions.json +3 -0
  561. package/schemas/plugins/css/CssParserOptions.check.d.ts +7 -0
  562. package/schemas/plugins/css/CssParserOptions.check.js +6 -0
  563. package/schemas/plugins/css/CssParserOptions.json +3 -0
  564. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  565. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  566. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  567. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  568. package/schemas/plugins/schemes/HttpUriPlugin.json +4 -0
  569. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  570. package/types.d.ts +5026 -1756
@@ -7,6 +7,10 @@
7
7
 
8
8
  const { pathToFileURL } = require("url");
9
9
  const ModuleDependencyWarning = require("../ModuleDependencyWarning");
10
+ const {
11
+ JAVASCRIPT_MODULE_TYPE_AUTO,
12
+ JAVASCRIPT_MODULE_TYPE_ESM
13
+ } = require("../ModuleTypeConstants");
10
14
  const Template = require("../Template");
11
15
  const BasicEvaluatedExpression = require("../javascript/BasicEvaluatedExpression");
12
16
  const {
@@ -20,141 +24,206 @@ const propertyAccess = require("../util/propertyAccess");
20
24
  const ConstDependency = require("./ConstDependency");
21
25
 
22
26
  /** @typedef {import("estree").MemberExpression} MemberExpression */
27
+ /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
23
28
  /** @typedef {import("../Compiler")} Compiler */
29
+ /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
24
30
  /** @typedef {import("../NormalModule")} NormalModule */
25
31
  /** @typedef {import("../javascript/JavascriptParser")} Parser */
32
+ /** @typedef {import("../javascript/JavascriptParser").Range} Range */
26
33
 
27
34
  const getCriticalDependencyWarning = memoize(() =>
28
35
  require("./CriticalDependencyWarning")
29
36
  );
30
37
 
38
+ const PLUGIN_NAME = "ImportMetaPlugin";
39
+
31
40
  class ImportMetaPlugin {
32
41
  /**
33
42
  * @param {Compiler} compiler compiler
34
43
  */
35
44
  apply(compiler) {
36
45
  compiler.hooks.compilation.tap(
37
- "ImportMetaPlugin",
46
+ PLUGIN_NAME,
38
47
  (compilation, { normalModuleFactory }) => {
39
48
  /**
40
49
  * @param {NormalModule} module module
41
50
  * @returns {string} file url
42
51
  */
43
- const getUrl = module => {
44
- return pathToFileURL(module.resource).toString();
45
- };
52
+ const getUrl = module => pathToFileURL(module.resource).toString();
46
53
  /**
47
- * @param {Parser} parser parser
48
- * @param {Object} parserOptions parserOptions
54
+ * @param {Parser} parser parser parser
55
+ * @param {JavascriptParserOptions} parserOptions parserOptions
49
56
  * @returns {void}
50
57
  */
51
- const parserHandler = (parser, parserOptions) => {
52
- /// import.meta direct ///
58
+ const parserHandler = (parser, { importMeta }) => {
59
+ if (importMeta === false) {
60
+ const { importMetaName } = compilation.outputOptions;
61
+ if (importMetaName === "import.meta") return;
62
+
63
+ parser.hooks.expression
64
+ .for("import.meta")
65
+ .tap(PLUGIN_NAME, metaProperty => {
66
+ const dep = new ConstDependency(
67
+ /** @type {string} */ (importMetaName),
68
+ /** @type {Range} */ (metaProperty.range)
69
+ );
70
+ dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc);
71
+ parser.state.module.addPresentationalDependency(dep);
72
+ return true;
73
+ });
74
+ return;
75
+ }
76
+
77
+ // import.meta direct
78
+ const webpackVersion = Number.parseInt(
79
+ require("../../package.json").version,
80
+ 10
81
+ );
82
+ const importMetaUrl = () =>
83
+ JSON.stringify(getUrl(parser.state.module));
84
+ const importMetaWebpackVersion = () => JSON.stringify(webpackVersion);
85
+ /**
86
+ * @param {string[]} members members
87
+ * @returns {string} error message
88
+ */
89
+ const importMetaUnknownProperty = members =>
90
+ `${Template.toNormalComment(
91
+ `unsupported import.meta.${members.join(".")}`
92
+ )} undefined${propertyAccess(members, 1)}`;
53
93
  parser.hooks.typeof
54
94
  .for("import.meta")
55
95
  .tap(
56
- "ImportMetaPlugin",
96
+ PLUGIN_NAME,
57
97
  toConstantDependency(parser, JSON.stringify("object"))
58
98
  );
59
99
  parser.hooks.expression
60
100
  .for("import.meta")
61
- .tap("ImportMetaPlugin", metaProperty => {
62
- const CriticalDependencyWarning = getCriticalDependencyWarning();
63
- parser.state.module.addWarning(
64
- new ModuleDependencyWarning(
65
- parser.state.module,
66
- new CriticalDependencyWarning(
67
- "Accessing import.meta directly is unsupported (only property access is supported)"
68
- ),
69
- metaProperty.loc
70
- )
71
- );
101
+ .tap(PLUGIN_NAME, metaProperty => {
102
+ const referencedPropertiesInDestructuring =
103
+ parser.destructuringAssignmentPropertiesFor(metaProperty);
104
+ if (!referencedPropertiesInDestructuring) {
105
+ const CriticalDependencyWarning =
106
+ getCriticalDependencyWarning();
107
+ parser.state.module.addWarning(
108
+ new ModuleDependencyWarning(
109
+ parser.state.module,
110
+ new CriticalDependencyWarning(
111
+ "Accessing import.meta directly is unsupported (only property access or destructuring is supported)"
112
+ ),
113
+ /** @type {DependencyLocation} */ (metaProperty.loc)
114
+ )
115
+ );
116
+ const dep = new ConstDependency(
117
+ `${
118
+ parser.isAsiPosition(
119
+ /** @type {Range} */ (metaProperty.range)[0]
120
+ )
121
+ ? ";"
122
+ : ""
123
+ }({})`,
124
+ /** @type {Range} */ (metaProperty.range)
125
+ );
126
+ dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc);
127
+ parser.state.module.addPresentationalDependency(dep);
128
+ return true;
129
+ }
130
+
131
+ let str = "";
132
+ for (const { id: prop } of referencedPropertiesInDestructuring) {
133
+ switch (prop) {
134
+ case "url":
135
+ str += `url: ${importMetaUrl()},`;
136
+ break;
137
+ case "webpack":
138
+ str += `webpack: ${importMetaWebpackVersion()},`;
139
+ break;
140
+ default:
141
+ str += `[${JSON.stringify(
142
+ prop
143
+ )}]: ${importMetaUnknownProperty([prop])},`;
144
+ break;
145
+ }
146
+ }
72
147
  const dep = new ConstDependency(
73
- `${parser.isAsiPosition(metaProperty.range[0]) ? ";" : ""}({})`,
74
- metaProperty.range
148
+ `({${str}})`,
149
+ /** @type {Range} */ (metaProperty.range)
75
150
  );
76
- dep.loc = metaProperty.loc;
151
+ dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc);
77
152
  parser.state.module.addPresentationalDependency(dep);
78
153
  return true;
79
154
  });
80
155
  parser.hooks.evaluateTypeof
81
156
  .for("import.meta")
82
- .tap("ImportMetaPlugin", evaluateToString("object"));
157
+ .tap(PLUGIN_NAME, evaluateToString("object"));
83
158
  parser.hooks.evaluateIdentifier.for("import.meta").tap(
84
- "ImportMetaPlugin",
159
+ PLUGIN_NAME,
85
160
  evaluateToIdentifier("import.meta", "import.meta", () => [], true)
86
161
  );
87
162
 
88
- /// import.meta.url ///
163
+ // import.meta.url
89
164
  parser.hooks.typeof
90
165
  .for("import.meta.url")
91
166
  .tap(
92
- "ImportMetaPlugin",
167
+ PLUGIN_NAME,
93
168
  toConstantDependency(parser, JSON.stringify("string"))
94
169
  );
95
170
  parser.hooks.expression
96
171
  .for("import.meta.url")
97
- .tap("ImportMetaPlugin", expr => {
172
+ .tap(PLUGIN_NAME, expr => {
98
173
  const dep = new ConstDependency(
99
- JSON.stringify(getUrl(parser.state.module)),
100
- expr.range
174
+ importMetaUrl(),
175
+ /** @type {Range} */ (expr.range)
101
176
  );
102
- dep.loc = expr.loc;
177
+ dep.loc = /** @type {DependencyLocation} */ (expr.loc);
103
178
  parser.state.module.addPresentationalDependency(dep);
104
179
  return true;
105
180
  });
106
181
  parser.hooks.evaluateTypeof
107
182
  .for("import.meta.url")
108
- .tap("ImportMetaPlugin", evaluateToString("string"));
183
+ .tap(PLUGIN_NAME, evaluateToString("string"));
109
184
  parser.hooks.evaluateIdentifier
110
185
  .for("import.meta.url")
111
- .tap("ImportMetaPlugin", expr => {
112
- return new BasicEvaluatedExpression()
186
+ .tap(PLUGIN_NAME, expr =>
187
+ new BasicEvaluatedExpression()
113
188
  .setString(getUrl(parser.state.module))
114
- .setRange(expr.range);
115
- });
189
+ .setRange(/** @type {Range} */ (expr.range))
190
+ );
116
191
 
117
- /// import.meta.webpack ///
118
- const webpackVersion = parseInt(
119
- require("../../package.json").version,
120
- 10
121
- );
192
+ // import.meta.webpack
122
193
  parser.hooks.typeof
123
194
  .for("import.meta.webpack")
124
195
  .tap(
125
- "ImportMetaPlugin",
196
+ PLUGIN_NAME,
126
197
  toConstantDependency(parser, JSON.stringify("number"))
127
198
  );
128
199
  parser.hooks.expression
129
200
  .for("import.meta.webpack")
130
201
  .tap(
131
- "ImportMetaPlugin",
132
- toConstantDependency(parser, JSON.stringify(webpackVersion))
202
+ PLUGIN_NAME,
203
+ toConstantDependency(parser, importMetaWebpackVersion())
133
204
  );
134
205
  parser.hooks.evaluateTypeof
135
206
  .for("import.meta.webpack")
136
- .tap("ImportMetaPlugin", evaluateToString("number"));
207
+ .tap(PLUGIN_NAME, evaluateToString("number"));
137
208
  parser.hooks.evaluateIdentifier
138
209
  .for("import.meta.webpack")
139
- .tap("ImportMetaPlugin", evaluateToNumber(webpackVersion));
210
+ .tap(PLUGIN_NAME, evaluateToNumber(webpackVersion));
140
211
 
141
- /// Unknown properties ///
212
+ // Unknown properties
142
213
  parser.hooks.unhandledExpressionMemberChain
143
214
  .for("import.meta")
144
- .tap("ImportMetaPlugin", (expr, members) => {
215
+ .tap(PLUGIN_NAME, (expr, members) => {
145
216
  const dep = new ConstDependency(
146
- `${Template.toNormalComment(
147
- "unsupported import.meta." + members.join(".")
148
- )} undefined${propertyAccess(members, 1)}`,
149
- expr.range
217
+ importMetaUnknownProperty(members),
218
+ /** @type {Range} */ (expr.range)
150
219
  );
151
- dep.loc = expr.loc;
220
+ dep.loc = /** @type {DependencyLocation} */ (expr.loc);
152
221
  parser.state.module.addPresentationalDependency(dep);
153
222
  return true;
154
223
  });
155
224
  parser.hooks.evaluate
156
225
  .for("MemberExpression")
157
- .tap("ImportMetaPlugin", expression => {
226
+ .tap(PLUGIN_NAME, expression => {
158
227
  const expr = /** @type {MemberExpression} */ (expression);
159
228
  if (
160
229
  expr.object.type === "MetaProperty" &&
@@ -165,17 +234,17 @@ class ImportMetaPlugin {
165
234
  ) {
166
235
  return new BasicEvaluatedExpression()
167
236
  .setUndefined()
168
- .setRange(expr.range);
237
+ .setRange(/** @type {Range} */ (expr.range));
169
238
  }
170
239
  });
171
240
  };
172
241
 
173
242
  normalModuleFactory.hooks.parser
174
- .for("javascript/auto")
175
- .tap("ImportMetaPlugin", parserHandler);
243
+ .for(JAVASCRIPT_MODULE_TYPE_AUTO)
244
+ .tap(PLUGIN_NAME, parserHandler);
176
245
  normalModuleFactory.hooks.parser
177
- .for("javascript/esm")
178
- .tap("ImportMetaPlugin", parserHandler);
246
+ .for(JAVASCRIPT_MODULE_TYPE_ESM)
247
+ .tap(PLUGIN_NAME, parserHandler);
179
248
  }
180
249
  );
181
250
  }
@@ -9,26 +9,46 @@ const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
9
9
  const CommentCompilationWarning = require("../CommentCompilationWarning");
10
10
  const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
11
11
  const ContextDependencyHelpers = require("./ContextDependencyHelpers");
12
+ const { getAttributes } = require("./HarmonyImportDependencyParserPlugin");
12
13
  const ImportContextDependency = require("./ImportContextDependency");
13
14
  const ImportDependency = require("./ImportDependency");
14
15
  const ImportEagerDependency = require("./ImportEagerDependency");
15
16
  const ImportWeakDependency = require("./ImportWeakDependency");
16
17
 
18
+ /** @typedef {import("estree").ImportExpression} ImportExpression */
19
+ /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
17
20
  /** @typedef {import("../ChunkGroup").RawChunkGroupOptions} RawChunkGroupOptions */
18
21
  /** @typedef {import("../ContextModule").ContextMode} ContextMode */
22
+ /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
23
+ /** @typedef {import("../Module").BuildMeta} BuildMeta */
24
+ /** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
25
+ /** @typedef {import("../javascript/JavascriptParser").Range} Range */
19
26
 
20
27
  class ImportParserPlugin {
28
+ /**
29
+ * @param {JavascriptParserOptions} options options
30
+ */
21
31
  constructor(options) {
22
32
  this.options = options;
23
33
  }
24
34
 
35
+ /**
36
+ * @param {JavascriptParser} parser the parser
37
+ * @returns {void}
38
+ */
25
39
  apply(parser) {
40
+ /**
41
+ * @template T
42
+ * @param {Iterable<T>} enumerable enumerable
43
+ * @returns {T[][]} array of array
44
+ */
45
+ const exportsFromEnumerable = enumerable =>
46
+ Array.from(enumerable, e => [e]);
26
47
  parser.hooks.importCall.tap("ImportParserPlugin", expr => {
27
48
  const param = parser.evaluateExpression(expr.source);
28
49
 
29
50
  let chunkName = null;
30
- /** @type {ContextMode} */
31
- let mode = "lazy";
51
+ let mode = /** @type {ContextMode} */ (this.options.dynamicImportMode);
32
52
  let include = null;
33
53
  let exclude = null;
34
54
  /** @type {string[][] | null} */
@@ -36,8 +56,28 @@ class ImportParserPlugin {
36
56
  /** @type {RawChunkGroupOptions} */
37
57
  const groupOptions = {};
38
58
 
59
+ const {
60
+ dynamicImportPreload,
61
+ dynamicImportPrefetch,
62
+ dynamicImportFetchPriority
63
+ } = this.options;
64
+ if (dynamicImportPreload !== undefined && dynamicImportPreload !== false)
65
+ groupOptions.preloadOrder =
66
+ dynamicImportPreload === true ? 0 : dynamicImportPreload;
67
+ if (
68
+ dynamicImportPrefetch !== undefined &&
69
+ dynamicImportPrefetch !== false
70
+ )
71
+ groupOptions.prefetchOrder =
72
+ dynamicImportPrefetch === true ? 0 : dynamicImportPrefetch;
73
+ if (
74
+ dynamicImportFetchPriority !== undefined &&
75
+ dynamicImportFetchPriority !== false
76
+ )
77
+ groupOptions.fetchPriority = dynamicImportFetchPriority;
78
+
39
79
  const { options: importOptions, errors: commentErrors } =
40
- parser.parseCommentOptions(expr.range);
80
+ parser.parseCommentOptions(/** @type {Range} */ (expr.range));
41
81
 
42
82
  if (commentErrors) {
43
83
  for (const e of commentErrors) {
@@ -57,14 +97,12 @@ class ImportParserPlugin {
57
97
  parser.state.module.addWarning(
58
98
  new UnsupportedFeatureWarning(
59
99
  `\`webpackIgnore\` expected a boolean, but received: ${importOptions.webpackIgnore}.`,
60
- expr.loc
100
+ /** @type {DependencyLocation} */ (expr.loc)
61
101
  )
62
102
  );
63
- } else {
103
+ } else if (importOptions.webpackIgnore) {
64
104
  // Do not instrument `import()` if `webpackIgnore` is `true`
65
- if (importOptions.webpackIgnore) {
66
- return false;
67
- }
105
+ return false;
68
106
  }
69
107
  }
70
108
  if (importOptions.webpackChunkName !== undefined) {
@@ -72,7 +110,7 @@ class ImportParserPlugin {
72
110
  parser.state.module.addWarning(
73
111
  new UnsupportedFeatureWarning(
74
112
  `\`webpackChunkName\` expected a string, but received: ${importOptions.webpackChunkName}.`,
75
- expr.loc
113
+ /** @type {DependencyLocation} */ (expr.loc)
76
114
  )
77
115
  );
78
116
  } else {
@@ -84,7 +122,7 @@ class ImportParserPlugin {
84
122
  parser.state.module.addWarning(
85
123
  new UnsupportedFeatureWarning(
86
124
  `\`webpackMode\` expected a string, but received: ${importOptions.webpackMode}.`,
87
- expr.loc
125
+ /** @type {DependencyLocation} */ (expr.loc)
88
126
  )
89
127
  );
90
128
  } else {
@@ -100,7 +138,7 @@ class ImportParserPlugin {
100
138
  parser.state.module.addWarning(
101
139
  new UnsupportedFeatureWarning(
102
140
  `\`webpackPrefetch\` expected true or a number, but received: ${importOptions.webpackPrefetch}.`,
103
- expr.loc
141
+ /** @type {DependencyLocation} */ (expr.loc)
104
142
  )
105
143
  );
106
144
  }
@@ -114,7 +152,22 @@ class ImportParserPlugin {
114
152
  parser.state.module.addWarning(
115
153
  new UnsupportedFeatureWarning(
116
154
  `\`webpackPreload\` expected true or a number, but received: ${importOptions.webpackPreload}.`,
117
- expr.loc
155
+ /** @type {DependencyLocation} */ (expr.loc)
156
+ )
157
+ );
158
+ }
159
+ }
160
+ if (importOptions.webpackFetchPriority !== undefined) {
161
+ if (
162
+ typeof importOptions.webpackFetchPriority === "string" &&
163
+ ["high", "low", "auto"].includes(importOptions.webpackFetchPriority)
164
+ ) {
165
+ groupOptions.fetchPriority = importOptions.webpackFetchPriority;
166
+ } else {
167
+ parser.state.module.addWarning(
168
+ new UnsupportedFeatureWarning(
169
+ `\`webpackFetchPriority\` expected true or "low", "high" or "auto", but received: ${importOptions.webpackFetchPriority}.`,
170
+ /** @type {DependencyLocation} */ (expr.loc)
118
171
  )
119
172
  );
120
173
  }
@@ -122,31 +175,31 @@ class ImportParserPlugin {
122
175
  if (importOptions.webpackInclude !== undefined) {
123
176
  if (
124
177
  !importOptions.webpackInclude ||
125
- importOptions.webpackInclude.constructor.name !== "RegExp"
178
+ !(importOptions.webpackInclude instanceof RegExp)
126
179
  ) {
127
180
  parser.state.module.addWarning(
128
181
  new UnsupportedFeatureWarning(
129
182
  `\`webpackInclude\` expected a regular expression, but received: ${importOptions.webpackInclude}.`,
130
- expr.loc
183
+ /** @type {DependencyLocation} */ (expr.loc)
131
184
  )
132
185
  );
133
186
  } else {
134
- include = new RegExp(importOptions.webpackInclude);
187
+ include = importOptions.webpackInclude;
135
188
  }
136
189
  }
137
190
  if (importOptions.webpackExclude !== undefined) {
138
191
  if (
139
192
  !importOptions.webpackExclude ||
140
- importOptions.webpackExclude.constructor.name !== "RegExp"
193
+ !(importOptions.webpackExclude instanceof RegExp)
141
194
  ) {
142
195
  parser.state.module.addWarning(
143
196
  new UnsupportedFeatureWarning(
144
197
  `\`webpackExclude\` expected a regular expression, but received: ${importOptions.webpackExclude}.`,
145
- expr.loc
198
+ /** @type {DependencyLocation} */ (expr.loc)
146
199
  )
147
200
  );
148
201
  } else {
149
- exclude = new RegExp(importOptions.webpackExclude);
202
+ exclude = importOptions.webpackExclude;
150
203
  }
151
204
  }
152
205
  if (importOptions.webpackExports !== undefined) {
@@ -154,7 +207,7 @@ class ImportParserPlugin {
154
207
  !(
155
208
  typeof importOptions.webpackExports === "string" ||
156
209
  (Array.isArray(importOptions.webpackExports) &&
157
- importOptions.webpackExports.every(
210
+ /** @type {string[]} */ (importOptions.webpackExports).every(
158
211
  item => typeof item === "string"
159
212
  ))
160
213
  )
@@ -162,41 +215,65 @@ class ImportParserPlugin {
162
215
  parser.state.module.addWarning(
163
216
  new UnsupportedFeatureWarning(
164
217
  `\`webpackExports\` expected a string or an array of strings, but received: ${importOptions.webpackExports}.`,
165
- expr.loc
218
+ /** @type {DependencyLocation} */ (expr.loc)
166
219
  )
167
220
  );
221
+ } else if (typeof importOptions.webpackExports === "string") {
222
+ exports = [[importOptions.webpackExports]];
168
223
  } else {
169
- if (typeof importOptions.webpackExports === "string") {
170
- exports = [[importOptions.webpackExports]];
171
- } else {
172
- exports = Array.from(importOptions.webpackExports, e => [e]);
173
- }
224
+ exports = exportsFromEnumerable(importOptions.webpackExports);
174
225
  }
175
226
  }
176
227
  }
177
228
 
178
- if (param.isString()) {
179
- if (mode !== "lazy" && mode !== "eager" && mode !== "weak") {
229
+ if (
230
+ mode !== "lazy" &&
231
+ mode !== "lazy-once" &&
232
+ mode !== "eager" &&
233
+ mode !== "weak"
234
+ ) {
235
+ parser.state.module.addWarning(
236
+ new UnsupportedFeatureWarning(
237
+ `\`webpackMode\` expected 'lazy', 'lazy-once', 'eager' or 'weak', but received: ${mode}.`,
238
+ /** @type {DependencyLocation} */ (expr.loc)
239
+ )
240
+ );
241
+ mode = "lazy";
242
+ }
243
+
244
+ const referencedPropertiesInDestructuring =
245
+ parser.destructuringAssignmentPropertiesFor(expr);
246
+ if (referencedPropertiesInDestructuring) {
247
+ if (exports) {
180
248
  parser.state.module.addWarning(
181
249
  new UnsupportedFeatureWarning(
182
- `\`webpackMode\` expected 'lazy', 'eager' or 'weak', but received: ${mode}.`,
183
- expr.loc
250
+ "`webpackExports` could not be used with destructuring assignment.",
251
+ /** @type {DependencyLocation} */ (expr.loc)
184
252
  )
185
253
  );
186
254
  }
255
+ exports = exportsFromEnumerable(
256
+ [...referencedPropertiesInDestructuring].map(({ id }) => id)
257
+ );
258
+ }
259
+
260
+ if (param.isString()) {
261
+ const attributes = getAttributes(expr);
187
262
 
188
263
  if (mode === "eager") {
189
264
  const dep = new ImportEagerDependency(
190
- param.string,
191
- expr.range,
192
- exports
265
+ /** @type {string} */ (param.string),
266
+ /** @type {Range} */ (expr.range),
267
+ exports,
268
+ attributes
193
269
  );
194
270
  parser.state.current.addDependency(dep);
195
271
  } else if (mode === "weak") {
196
272
  const dep = new ImportWeakDependency(
197
- param.string,
198
- expr.range,
199
- exports
273
+ /** @type {string} */ (param.string),
274
+ /** @type {Range} */ (expr.range),
275
+ exports,
276
+ attributes
200
277
  );
201
278
  parser.state.current.addDependency(dep);
202
279
  } else {
@@ -205,61 +282,54 @@ class ImportParserPlugin {
205
282
  ...groupOptions,
206
283
  name: chunkName
207
284
  },
208
- expr.loc,
285
+ /** @type {DependencyLocation} */ (expr.loc),
209
286
  param.string
210
287
  );
211
- const dep = new ImportDependency(param.string, expr.range, exports);
212
- dep.loc = expr.loc;
288
+ const dep = new ImportDependency(
289
+ /** @type {string} */ (param.string),
290
+ /** @type {Range} */ (expr.range),
291
+ exports,
292
+ attributes
293
+ );
294
+ dep.loc = /** @type {DependencyLocation} */ (expr.loc);
295
+ dep.optional = Boolean(parser.scope.inTry);
213
296
  depBlock.addDependency(dep);
214
297
  parser.state.current.addBlock(depBlock);
215
298
  }
216
299
  return true;
217
- } else {
218
- if (
219
- mode !== "lazy" &&
220
- mode !== "lazy-once" &&
221
- mode !== "eager" &&
222
- mode !== "weak"
223
- ) {
224
- parser.state.module.addWarning(
225
- new UnsupportedFeatureWarning(
226
- `\`webpackMode\` expected 'lazy', 'lazy-once', 'eager' or 'weak', but received: ${mode}.`,
227
- expr.loc
228
- )
229
- );
230
- mode = "lazy";
231
- }
232
-
233
- if (mode === "weak") {
234
- mode = "async-weak";
235
- }
236
- const dep = ContextDependencyHelpers.create(
237
- ImportContextDependency,
238
- expr.range,
239
- param,
240
- expr,
241
- this.options,
242
- {
243
- chunkName,
244
- groupOptions,
245
- include,
246
- exclude,
247
- mode,
248
- namespaceObject: parser.state.module.buildMeta.strictHarmonyModule
249
- ? "strict"
250
- : true,
251
- typePrefix: "import()",
252
- category: "esm",
253
- referencedExports: exports
254
- },
255
- parser
256
- );
257
- if (!dep) return;
258
- dep.loc = expr.loc;
259
- dep.optional = !!parser.scope.inTry;
260
- parser.state.current.addDependency(dep);
261
- return true;
262
300
  }
301
+ if (mode === "weak") {
302
+ mode = "async-weak";
303
+ }
304
+ const dep = ContextDependencyHelpers.create(
305
+ ImportContextDependency,
306
+ /** @type {Range} */ (expr.range),
307
+ param,
308
+ expr,
309
+ this.options,
310
+ {
311
+ chunkName,
312
+ groupOptions,
313
+ include,
314
+ exclude,
315
+ mode,
316
+ namespaceObject: /** @type {BuildMeta} */ (
317
+ parser.state.module.buildMeta
318
+ ).strictHarmonyModule
319
+ ? "strict"
320
+ : true,
321
+ typePrefix: "import()",
322
+ category: "esm",
323
+ referencedExports: exports,
324
+ attributes: getAttributes(expr)
325
+ },
326
+ parser
327
+ );
328
+ if (!dep) return;
329
+ dep.loc = /** @type {DependencyLocation} */ (expr.loc);
330
+ dep.optional = Boolean(parser.scope.inTry);
331
+ parser.state.current.addDependency(dep);
332
+ return true;
263
333
  });
264
334
  }
265
335
  }