@depup/webpack 5.109.2-depup.0 → 5.110.3-depup.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 (647) hide show
  1. package/README.md +5 -5
  2. package/changes.json +7 -7
  3. package/lib/APIPlugin.js +123 -17
  4. package/lib/AsyncDependenciesBlock.js +10 -7
  5. package/lib/AutomaticPrefetchPlugin.js +1 -1
  6. package/lib/BannerPlugin.js +10 -6
  7. package/lib/CacheFacade.js +6 -6
  8. package/lib/Chunk.js +14 -11
  9. package/lib/ChunkGraph.js +46 -35
  10. package/lib/ChunkGroup.js +7 -7
  11. package/lib/ChunkTemplate.js +35 -44
  12. package/lib/CircularModulesPlugin.js +205 -28
  13. package/lib/CleanPlugin.js +4 -7
  14. package/lib/CodeGenerationResults.js +11 -8
  15. package/lib/CompatibilityPlugin.js +7 -7
  16. package/lib/Compilation.js +688 -409
  17. package/lib/Compiler.js +53 -38
  18. package/lib/ConcatenationScope.js +107 -8
  19. package/lib/ConditionalInitFragment.js +3 -3
  20. package/lib/ConstPlugin.js +13 -11
  21. package/lib/ContextExclusionPlugin.js +1 -1
  22. package/lib/ContextModule.js +146 -54
  23. package/lib/ContextModuleFactory.js +46 -14
  24. package/lib/ContextReplacementPlugin.js +12 -14
  25. package/lib/DefinePlugin.js +121 -37
  26. package/lib/DependenciesBlock.js +9 -6
  27. package/lib/Dependency.js +36 -16
  28. package/lib/DependencyTemplate.js +11 -12
  29. package/lib/DependencyTemplates.js +3 -3
  30. package/lib/DotenvPlugin.js +91 -26
  31. package/lib/DynamicEntryPlugin.js +8 -4
  32. package/lib/EntryOptionPlugin.js +8 -4
  33. package/lib/EntryPlugin.js +2 -2
  34. package/lib/Entrypoint.js +6 -2
  35. package/lib/EnvironmentPlugin.js +2 -2
  36. package/lib/EvalDevToolModulePlugin.js +8 -4
  37. package/lib/EvalSourceMapDevToolPlugin.js +15 -8
  38. package/lib/ExportsInfo.js +111 -14
  39. package/lib/ExportsInfoApiPlugin.js +2 -4
  40. package/lib/ExternalModule.js +232 -77
  41. package/lib/ExternalModuleFactoryPlugin.js +97 -38
  42. package/lib/ExternalsPlugin.js +10 -6
  43. package/lib/FileSystemInfo.js +44 -70
  44. package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
  45. package/lib/FlagDependencyExportsPlugin.js +76 -19
  46. package/lib/FlagDependencyUsagePlugin.js +40 -49
  47. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  48. package/lib/Generator.js +36 -15
  49. package/lib/HotModuleReplacementPlugin.js +16 -44
  50. package/lib/IgnorePlugin.js +8 -4
  51. package/lib/IgnoreWarningsPlugin.js +2 -2
  52. package/lib/InitFragment.js +8 -4
  53. package/lib/JavascriptMetaInfoPlugin.js +35 -4
  54. package/lib/LazyBarrel.js +3 -4
  55. package/lib/LibraryTemplatePlugin.js +10 -6
  56. package/lib/LoaderOptionsPlugin.js +7 -3
  57. package/lib/LoaderTargetPlugin.js +1 -1
  58. package/lib/MainTemplate.js +49 -42
  59. package/lib/ManifestPlugin.js +12 -11
  60. package/lib/Module.js +62 -33
  61. package/lib/ModuleFactory.js +3 -3
  62. package/lib/ModuleFilenameHelpers.js +9 -4
  63. package/lib/ModuleGraph.js +195 -21
  64. package/lib/ModuleGraphConnection.js +6 -13
  65. package/lib/ModuleInfoHeaderPlugin.js +8 -10
  66. package/lib/ModuleTemplate.js +62 -63
  67. package/lib/MultiCompiler.js +130 -64
  68. package/lib/MultiStats.js +40 -9
  69. package/lib/MultiWatching.js +3 -3
  70. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  71. package/lib/NodeStuffPlugin.js +29 -19
  72. package/lib/NormalModule.js +152 -103
  73. package/lib/NormalModuleFactory.js +555 -110
  74. package/lib/NormalModuleReplacementPlugin.js +5 -8
  75. package/lib/NullFactory.js +6 -2
  76. package/lib/OptionsApply.js +7 -3
  77. package/lib/Parser.js +7 -3
  78. package/lib/PlatformPlugin.js +2 -2
  79. package/lib/PrefetchPlugin.js +1 -1
  80. package/lib/ProgressPlugin.js +16 -13
  81. package/lib/ProvidePlugin.js +3 -5
  82. package/lib/RawModule.js +25 -17
  83. package/lib/RecordIdsPlugin.js +3 -3
  84. package/lib/RequestShortener.js +1 -1
  85. package/lib/ResolverFactory.js +2 -2
  86. package/lib/RuntimeGlobals.js +22 -10
  87. package/lib/RuntimeModule.js +29 -19
  88. package/lib/RuntimePlugin.js +335 -169
  89. package/lib/RuntimeTemplate.js +2761 -316
  90. package/lib/SelfModuleFactory.js +7 -3
  91. package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
  92. package/lib/SourceMapDevToolPlugin.js +30 -20
  93. package/lib/Stats.js +3 -4
  94. package/lib/Template.js +32 -22
  95. package/lib/TemplatedPathPlugin.js +96 -14
  96. package/lib/UseStrictPlugin.js +4 -6
  97. package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
  98. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  99. package/lib/WarnNoModeSetPlugin.js +1 -1
  100. package/lib/WatchIgnorePlugin.js +8 -6
  101. package/lib/Watching.js +8 -8
  102. package/lib/WebpackIsIncludedPlugin.js +2 -4
  103. package/lib/WebpackOptionsApply.js +308 -18
  104. package/lib/WebpackOptionsDefaulter.js +6 -2
  105. package/lib/asset/AssetBytesGenerator.js +12 -10
  106. package/lib/asset/AssetBytesParser.js +2 -4
  107. package/lib/asset/AssetGenerator.js +188 -95
  108. package/lib/asset/AssetModule.js +7 -3
  109. package/lib/asset/AssetModulesPlugin.js +110 -38
  110. package/lib/asset/AssetParser.js +9 -7
  111. package/lib/asset/AssetSourceGenerator.js +60 -13
  112. package/lib/asset/AssetSourceParser.js +2 -4
  113. package/lib/asset/RawDataUrlModule.js +24 -16
  114. package/lib/asset/WebManifestGenerator.js +8 -10
  115. package/lib/asset/WebManifestParser.js +24 -10
  116. package/lib/async-modules/AsyncModuleHelpers.js +12 -6
  117. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  118. package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
  119. package/lib/async-modules/isGeneratorLowered.js +4 -4
  120. package/lib/buildChunkGraph.js +36 -27
  121. package/lib/bun/BunTargetPlugin.js +1 -1
  122. package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
  123. package/lib/cache/AddManagedPathsPlugin.js +1 -1
  124. package/lib/cache/IdleFileCachePlugin.js +2 -2
  125. package/lib/cache/MemoryCachePlugin.js +18 -10
  126. package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
  127. package/lib/cache/PackFileCacheStrategy.js +30 -23
  128. package/lib/cache/ResolverCachePlugin.js +38 -18
  129. package/lib/cache/getLazyHashedEtag.js +1 -2
  130. package/lib/cache/mergeEtags.js +1 -1
  131. package/lib/cli.js +1 -3
  132. package/lib/config/browserslistTargetHandler.js +41 -5
  133. package/lib/config/defaults.js +270 -78
  134. package/lib/config/defineConfig.js +10 -2
  135. package/lib/config/getClaimedAssetTypes.js +65 -0
  136. package/lib/config/normalization.js +46 -16
  137. package/lib/config/target.js +46 -3
  138. package/lib/container/ContainerEntryDependency.js +1 -1
  139. package/lib/container/ContainerEntryModule.js +24 -15
  140. package/lib/container/ContainerEntryModuleFactory.js +7 -3
  141. package/lib/container/ContainerPlugin.js +9 -10
  142. package/lib/container/ContainerReferencePlugin.js +6 -2
  143. package/lib/container/FallbackDependency.js +1 -1
  144. package/lib/container/FallbackModule.js +24 -17
  145. package/lib/container/FallbackModuleFactory.js +7 -3
  146. package/lib/container/HoistContainerReferencesPlugin.js +6 -11
  147. package/lib/container/ModuleFederationPlugin.js +7 -24
  148. package/lib/container/RemoteModule.js +27 -19
  149. package/lib/container/RemoteRuntimeModule.js +10 -8
  150. package/lib/container/moduleFederationHooks.js +32 -0
  151. package/lib/css/CssGenerator.js +171 -43
  152. package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
  153. package/lib/css/CssLoadingRuntimeModule.js +84 -32
  154. package/lib/css/CssModule.js +10 -7
  155. package/lib/css/CssModulesPlugin.js +172 -100
  156. package/lib/css/CssParser.js +1113 -568
  157. package/lib/css/CssServerStylesRuntimeModule.js +54 -0
  158. package/lib/css/cssMinify.js +168 -0
  159. package/lib/css/data.js +5334 -0
  160. package/lib/css/syntax.js +9647 -232
  161. package/lib/debug/ProfilingPlugin.js +14 -9
  162. package/lib/deno/DenoTargetPlugin.js +1 -1
  163. package/lib/dependencies/AMDDefineDependency.js +112 -87
  164. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
  165. package/lib/dependencies/AMDPlugin.js +9 -7
  166. package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
  167. package/lib/dependencies/AMDRequireContextDependency.js +2 -2
  168. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
  169. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
  170. package/lib/dependencies/AMDRequireDependency.js +8 -7
  171. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  172. package/lib/dependencies/AMDRuntimeModules.js +21 -1
  173. package/lib/dependencies/BuildTimeConstDependency.js +102 -0
  174. package/lib/dependencies/CachedConstDependency.js +11 -8
  175. package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
  176. package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
  177. package/lib/dependencies/CommonJsExportsDependency.js +53 -49
  178. package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
  179. package/lib/dependencies/CommonJsFullRequireDependency.js +119 -34
  180. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -50
  181. package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
  182. package/lib/dependencies/CommonJsPlugin.js +35 -6
  183. package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
  184. package/lib/dependencies/CommonJsRequireDependency.js +170 -27
  185. package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
  186. package/lib/dependencies/ConstDependency.js +8 -9
  187. package/lib/dependencies/ContextDependency.js +12 -8
  188. package/lib/dependencies/ContextDependencyHelpers.js +14 -9
  189. package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
  190. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +24 -11
  191. package/lib/dependencies/ContextElementDependency.js +31 -12
  192. package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
  193. package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
  194. package/lib/dependencies/CssIcssExportDependency.js +56 -28
  195. package/lib/dependencies/CssIcssImportDependency.js +17 -13
  196. package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
  197. package/lib/dependencies/CssImportDependency.js +18 -9
  198. package/lib/dependencies/CssUrlDependency.js +17 -13
  199. package/lib/dependencies/DllEntryDependency.js +1 -1
  200. package/lib/dependencies/DynamicExports.js +2 -2
  201. package/lib/dependencies/ExportBindingInitFragment.js +36 -9
  202. package/lib/dependencies/ExportsInfoDependency.js +7 -8
  203. package/lib/dependencies/ExternalModuleDependency.js +9 -5
  204. package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
  205. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
  206. package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
  207. package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
  208. package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
  209. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +23 -14
  210. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +80 -12
  211. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  212. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  213. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +286 -80
  214. package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
  215. package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
  216. package/lib/dependencies/HarmonyExports.js +7 -4
  217. package/lib/dependencies/HarmonyImportDependency.js +121 -60
  218. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +124 -38
  219. package/lib/dependencies/HarmonyImportGuard.js +20 -30
  220. package/lib/dependencies/HarmonyImportSideEffectDependency.js +152 -9
  221. package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
  222. package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
  223. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
  224. package/lib/dependencies/HtmlEntryDependency.js +49 -31
  225. package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
  226. package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
  227. package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
  228. package/lib/dependencies/HtmlSourceDependency.js +22 -14
  229. package/lib/dependencies/ImportContextDependency.js +45 -5
  230. package/lib/dependencies/ImportDependency.js +33 -50
  231. package/lib/dependencies/ImportEagerDependency.js +6 -9
  232. package/lib/dependencies/ImportMetaContextDependency.js +2 -2
  233. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
  234. package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
  235. package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
  236. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
  237. package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
  238. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
  239. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
  240. package/lib/dependencies/ImportMetaPlugin.js +154 -71
  241. package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
  242. package/lib/dependencies/ImportParserPlugin.js +73 -49
  243. package/lib/dependencies/ImportPhase.js +12 -5
  244. package/lib/dependencies/ImportPlugin.js +7 -3
  245. package/lib/dependencies/ImportWeakDependency.js +6 -9
  246. package/lib/dependencies/JsonExportsDependency.js +11 -7
  247. package/lib/dependencies/LoaderDependency.js +2 -2
  248. package/lib/dependencies/LoaderImportDependency.js +2 -2
  249. package/lib/dependencies/LoaderPlugin.js +11 -7
  250. package/lib/dependencies/LocalModuleDependency.js +5 -5
  251. package/lib/dependencies/LocalModulesHelpers.js +1 -1
  252. package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
  253. package/lib/dependencies/ModuleDependency.js +9 -6
  254. package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
  255. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
  256. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  257. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
  258. package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
  259. package/lib/dependencies/NullDependency.js +3 -3
  260. package/lib/dependencies/ProvidedDependency.js +14 -10
  261. package/lib/dependencies/PureExpressionDependency.js +9 -10
  262. package/lib/dependencies/RequireContextDependency.js +2 -2
  263. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
  264. package/lib/dependencies/RequireContextPlugin.js +8 -4
  265. package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
  266. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
  267. package/lib/dependencies/RequireEnsureDependency.js +8 -7
  268. package/lib/dependencies/RequireEnsurePlugin.js +7 -3
  269. package/lib/dependencies/RequireHeaderDependency.js +50 -12
  270. package/lib/dependencies/RequireIncludeDependency.js +6 -6
  271. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
  272. package/lib/dependencies/RequireIncludePlugin.js +7 -3
  273. package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
  274. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  275. package/lib/dependencies/RequireResolveDependency.js +4 -4
  276. package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
  277. package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
  278. package/lib/dependencies/StaticExportsDependency.js +2 -2
  279. package/lib/dependencies/SystemPlugin.js +10 -6
  280. package/lib/dependencies/SystemRuntimeModule.js +10 -0
  281. package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
  282. package/lib/dependencies/URLContextDependency.js +2 -2
  283. package/lib/dependencies/URLDependency.js +110 -64
  284. package/lib/dependencies/URLPlugin.js +7 -3
  285. package/lib/dependencies/UnsupportedDependency.js +4 -4
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
  287. package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
  289. package/lib/dependencies/WorkerAndWorkletPlugin.js +47 -28
  290. package/lib/dependencies/WorkerDependency.js +22 -22
  291. package/lib/dependencies/WorkletDependency.js +18 -21
  292. package/lib/dependencies/getFunctionExpression.js +8 -4
  293. package/lib/dependencies/importOptionsCheck.js +47 -0
  294. package/lib/dependencies/processExportInfo.js +5 -5
  295. package/lib/dll/DelegatedModule.js +34 -22
  296. package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
  297. package/lib/dll/DelegatedPlugin.js +2 -2
  298. package/lib/dll/DllEntryPlugin.js +2 -2
  299. package/lib/dll/DllModule.js +22 -15
  300. package/lib/dll/DllModuleFactory.js +7 -3
  301. package/lib/dll/DllPlugin.js +7 -5
  302. package/lib/dll/DllReferencePlugin.js +10 -7
  303. package/lib/dll/LibManifestPlugin.js +5 -5
  304. package/lib/electron/ElectronTargetPlugin.js +53 -49
  305. package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
  306. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  307. package/lib/errors/BroadContextsWarning.js +43 -0
  308. package/lib/errors/BuildCycleError.js +1 -1
  309. package/lib/errors/CacheEffectivenessWarning.js +55 -0
  310. package/lib/errors/ChunkRenderError.js +1 -1
  311. package/lib/errors/CircularDependenciesWarning.js +38 -0
  312. package/lib/errors/CodeGenerationError.js +1 -1
  313. package/lib/errors/CommentCompilationWarning.js +1 -1
  314. package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
  315. package/lib/errors/DotenvFileError.js +29 -0
  316. package/lib/errors/DuplicateModulesWarning.js +45 -0
  317. package/lib/errors/DynamicExportsWarning.js +30 -0
  318. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  319. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  320. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  321. package/lib/errors/EvalUsageWarning.js +28 -0
  322. package/lib/errors/HookWebpackError.js +5 -5
  323. package/lib/errors/HotspotsWarning.js +57 -0
  324. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  325. package/lib/errors/ImportedBindingAssignmentError.js +30 -0
  326. package/lib/errors/InlinedAssetsWarning.js +36 -0
  327. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  328. package/lib/errors/LargeModulesWarning.js +45 -0
  329. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  330. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  331. package/lib/errors/MixedExportsWarning.js +41 -0
  332. package/lib/errors/ModuleDependencyError.js +13 -16
  333. package/lib/errors/ModuleDependencyWarning.js +5 -15
  334. package/lib/errors/ModuleHashingError.js +1 -1
  335. package/lib/errors/ModuleNotFoundError.js +2 -2
  336. package/lib/errors/ModuleParseError.js +1 -2
  337. package/lib/errors/ModuleRestoreError.js +1 -1
  338. package/lib/errors/ModuleStoreError.js +1 -1
  339. package/lib/errors/NodeStuffInWebError.js +1 -1
  340. package/lib/errors/OsDependentRuleWarning.js +31 -0
  341. package/lib/errors/PureAnnotationsWarning.js +36 -0
  342. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  343. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  344. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  345. package/lib/errors/TinyChunksWarning.js +40 -0
  346. package/lib/errors/TopLevelThisWarning.js +34 -0
  347. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  348. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  349. package/lib/errors/UnusedAliasesWarning.js +29 -0
  350. package/lib/errors/UnusedDefinesWarning.js +29 -0
  351. package/lib/errors/UnusedExternalsWarning.js +29 -0
  352. package/lib/errors/UnusedReexportsWarning.js +42 -0
  353. package/lib/errors/UnusedRuleWarning.js +29 -0
  354. package/lib/errors/WebpackError.js +9 -5
  355. package/lib/errors/deriveStackFromNestedError.js +90 -0
  356. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  357. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  358. package/lib/esm/ModuleChunkLoadingPlugin.js +86 -51
  359. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +161 -62
  360. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  361. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  362. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  363. package/lib/hmr/lazyCompilationBackend.js +9 -6
  364. package/lib/hmr/parserHooks.js +56 -0
  365. package/lib/html/HtmlGenerator.js +277 -77
  366. package/lib/html/HtmlModule.js +7 -3
  367. package/lib/html/HtmlModulesPlugin.js +366 -200
  368. package/lib/html/HtmlParser.js +31 -86
  369. package/lib/html/data.js +1928 -0
  370. package/lib/html/htmlMinify.js +288 -0
  371. package/lib/html/syntax.js +6034 -1384
  372. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  373. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  374. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  375. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  376. package/lib/ids/IdHelpers.js +7 -8
  377. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  378. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  379. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  380. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  381. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  382. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  383. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  384. package/lib/index.js +10 -0
  385. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  386. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  387. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  388. package/lib/javascript/ChunkHelpers.js +1 -1
  389. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  390. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  391. package/lib/javascript/JavascriptGenerator.js +65 -165
  392. package/lib/javascript/JavascriptModule.js +9 -3
  393. package/lib/javascript/JavascriptModulesPlugin.js +103 -123
  394. package/lib/javascript/JavascriptParser.js +242 -99
  395. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  396. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  397. package/lib/javascript/StartupHelpers.js +55 -9
  398. package/lib/javascript/syntax.js +2678 -232
  399. package/lib/json/JsonData.js +8 -4
  400. package/lib/json/JsonGenerator.js +38 -16
  401. package/lib/json/JsonModule.js +7 -3
  402. package/lib/json/JsonModulesPlugin.js +1 -1
  403. package/lib/json/JsonParser.js +5 -6
  404. package/lib/library/AbstractLibraryPlugin.js +20 -14
  405. package/lib/library/AmdLibraryPlugin.js +11 -7
  406. package/lib/library/AssignLibraryPlugin.js +19 -13
  407. package/lib/library/EnableLibraryPlugin.js +2 -2
  408. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  409. package/lib/library/JsonpLibraryPlugin.js +11 -7
  410. package/lib/library/ModuleLibraryPlugin.js +256 -64
  411. package/lib/library/SystemLibraryPlugin.js +12 -8
  412. package/lib/library/UmdLibraryPlugin.js +62 -25
  413. package/lib/loaders/LoaderRunner.js +47 -6
  414. package/lib/loaders/loadLoader.js +8 -4
  415. package/lib/logging/createConsoleLogger.js +7 -4
  416. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  417. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  418. package/lib/node/NodeSourcePlugin.js +1 -1
  419. package/lib/node/NodeTargetPlugin.js +4 -3
  420. package/lib/node/NodeTemplatePlugin.js +1 -1
  421. package/lib/node/NodeWatchFileSystem.js +70 -9
  422. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  423. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +65 -19
  424. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  425. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  426. package/lib/node/nodeConsole.js +7 -3
  427. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  428. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  429. package/lib/optimize/ConcatenatedModule.js +1030 -476
  430. package/lib/optimize/ConstExportsPlugin.js +16 -7
  431. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  432. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  433. package/lib/optimize/InlineExports.js +130 -5
  434. package/lib/optimize/InnerGraph.js +28 -12
  435. package/lib/optimize/InnerGraphPlugin.js +23 -18
  436. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  437. package/lib/optimize/MangleExportsPlugin.js +7 -8
  438. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  439. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  440. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  441. package/lib/optimize/RealContentHashPlugin.js +121 -41
  442. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  443. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  444. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  445. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  446. package/lib/optimize/SplitChunksPlugin.js +86 -24
  447. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  448. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  449. package/lib/performance/BroadContextsPlugin.js +142 -0
  450. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  451. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  452. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  453. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  454. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  455. package/lib/performance/DynamicExportsPlugin.js +120 -0
  456. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  457. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  458. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  459. package/lib/performance/EvalUsagePlugin.js +115 -0
  460. package/lib/performance/HotspotsPlugin.js +296 -0
  461. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  462. package/lib/performance/LargeModulesPlugin.js +126 -0
  463. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  464. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  465. package/lib/performance/MixedExportsPlugin.js +136 -0
  466. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  467. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  468. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  469. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  470. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  471. package/lib/performance/SizeLimitsPlugin.js +139 -7
  472. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  473. package/lib/performance/TinyChunksPlugin.js +128 -0
  474. package/lib/performance/TopLevelThisPlugin.js +208 -0
  475. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  476. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  477. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  478. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  479. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  480. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  481. package/lib/performance/getModuleSize.js +22 -0
  482. package/lib/performance/getSourceModules.js +22 -0
  483. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  484. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  485. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  486. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  487. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  488. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  489. package/lib/prefetch/ResourceHintPlugin.js +295 -79
  490. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  491. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  492. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  493. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  494. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  495. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  496. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  497. package/lib/rules/RuleSetCompiler.js +146 -12
  498. package/lib/rules/UseEffectRulePlugin.js +18 -11
  499. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  500. package/lib/runtime/AsyncModuleRuntimeModule.js +6 -2
  501. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  502. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  503. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  504. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  505. package/lib/runtime/CompatRuntimeModule.js +5 -3
  506. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  507. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  508. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  509. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  510. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  511. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  512. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  513. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  514. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  515. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  516. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  517. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  518. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  519. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  520. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  521. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +34 -7
  522. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  523. package/lib/runtime/NonceRuntimeModule.js +10 -0
  524. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  525. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  526. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  527. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  528. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  529. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  530. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  531. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  532. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  533. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  534. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  535. package/lib/runtime/baseUri.js +63 -0
  536. package/lib/schemes/DataUriPlugin.js +1 -1
  537. package/lib/schemes/FileUriPlugin.js +1 -1
  538. package/lib/schemes/HttpUriPlugin.js +46 -20
  539. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  540. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  541. package/lib/serialization/BinaryMiddleware.js +4 -4
  542. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  543. package/lib/serialization/FileMiddleware.js +22 -9
  544. package/lib/serialization/ObjectMiddleware.js +139 -114
  545. package/lib/serialization/PlainObjectSerializer.js +19 -16
  546. package/lib/sharing/ConsumeSharedModule.js +30 -21
  547. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  548. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  549. package/lib/sharing/ProvideSharedModule.js +25 -16
  550. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  551. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  552. package/lib/sharing/SharePlugin.js +17 -5
  553. package/lib/sharing/ShareRuntimeModule.js +4 -4
  554. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  555. package/lib/sharing/utils.js +1 -3
  556. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  557. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  558. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  559. package/lib/stats/StatsFactory.js +25 -26
  560. package/lib/stats/StatsPrinter.js +16 -12
  561. package/lib/typescript/TypeScriptPlugin.js +20 -24
  562. package/lib/url/URLParserPlugin.js +26 -13
  563. package/lib/util/ArrayQueue.js +3 -3
  564. package/lib/util/AsyncQueue.js +4 -3
  565. package/lib/util/Hash.js +5 -1
  566. package/lib/util/LazySet.js +35 -22
  567. package/lib/util/LocConverter.js +36 -13
  568. package/lib/util/SourceProcessor.js +1066 -24
  569. package/lib/util/StringXor.js +1 -1
  570. package/lib/util/URLAbsoluteSpecifier.js +3 -1
  571. package/lib/util/chainedImports.js +9 -5
  572. package/lib/util/cleverMerge.js +1 -1
  573. package/lib/util/comparators.js +45 -14
  574. package/lib/util/concatenate.js +203 -77
  575. package/lib/util/conventions.js +10 -2
  576. package/lib/util/createHash.js +2 -2
  577. package/lib/util/createHooksRegistry.js +8 -10
  578. package/lib/util/createMappings.js +25 -3
  579. package/lib/util/dataURL.js +225 -1
  580. package/lib/util/extractSourceMap.js +4 -3
  581. package/lib/util/findCaseMismatch.js +139 -0
  582. package/lib/util/formatLocation.js +1 -2
  583. package/lib/util/fs.js +22 -5
  584. package/lib/util/globUtils.js +298 -24
  585. package/lib/util/hash/BatchedHash.js +5 -1
  586. package/lib/util/hash/BulkUpdateHash.js +5 -1
  587. package/lib/util/hash/DebugHash.js +5 -1
  588. package/lib/util/hash/hash-digest.js +6 -2
  589. package/lib/util/identifier.js +4 -0
  590. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  591. package/lib/util/internalSerializables.js +8 -0
  592. package/lib/util/lazyModule.js +56 -0
  593. package/lib/util/makeSerializable.js +7 -3
  594. package/lib/util/matchAlias.js +25 -0
  595. package/lib/util/mimeTypes.js +11 -5
  596. package/lib/util/nonNumericOnlyHash.js +4 -3
  597. package/lib/util/parseJson.js +5 -3
  598. package/lib/util/preloadModuleType.js +32 -0
  599. package/lib/util/registerExternalSerializer.js +7 -5
  600. package/lib/util/removeBOM.js +82 -1
  601. package/lib/util/runtime.js +2 -2
  602. package/lib/util/semver.js +1 -1
  603. package/lib/util/serialization.js +28 -28
  604. package/lib/util/source.js +2 -2
  605. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  606. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  607. package/lib/wasm/wasmModuleFilename.js +54 -0
  608. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +43 -21
  609. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +45 -21
  610. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  611. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  612. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  613. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  614. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  615. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +29 -8
  616. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  617. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  618. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  619. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  620. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  621. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  622. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  623. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  624. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  625. package/lib/web/FetchCompileAsyncWasmPlugin.js +105 -19
  626. package/lib/web/FetchCompileWasmPlugin.js +48 -16
  627. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  628. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  629. package/lib/web/JsonpTemplatePlugin.js +2 -2
  630. package/lib/webpack.js +22 -11
  631. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  632. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  633. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  634. package/module.d.ts +1 -0
  635. package/package.json +32 -25
  636. package/schemas/WebpackOptions.check.js +1 -1
  637. package/schemas/WebpackOptions.json +667 -34
  638. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  639. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  640. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  641. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  642. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  643. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  644. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  645. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  646. package/types.d.ts +3223 -465
  647. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -0,0 +1,1094 @@
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
+ /**
9
+ * @import {
10
+ * Function as ESTreeFunction,
11
+ * Identifier,
12
+ * Node,
13
+ * Program
14
+ * } from "estree"
15
+ */
16
+
17
+ /**
18
+ * @typedef {"global" | "module" | "function" | "function-expression-name" | "block" | "switch" | "catch" | "with" | "for" | "class" | "class-field-initializer" | "class-static-block"} ScopeType
19
+ */
20
+
21
+ /**
22
+ * Acorn records every node's offset as `start`, but the nodes are typed as
23
+ * `estree`, which models the spec and has only the optional `range`/`loc`.
24
+ * Intersect with this to read the offset the parser really wrote.
25
+ * @typedef {{ start: number }} Offset
26
+ */
27
+
28
+ /**
29
+ * A node's visitable slots, as `CHILD_KEYS` names them.
30
+ * @typedef {Record<string, Node | Node[] | null | undefined>} NodeChildren
31
+ */
32
+
33
+ /**
34
+ * Child properties to visit for node types with no special scoping or
35
+ * referencing behaviour. Types handled by the walker's `switch` never reach
36
+ * this table.
37
+ * @type {Record<string, string[]>}
38
+ */
39
+ const CHILD_KEYS = {
40
+ ArrayExpression: ["elements"],
41
+ ArrayPattern: ["elements"],
42
+ ArrowFunctionExpression: ["params", "body"],
43
+ AssignmentExpression: ["left", "right"],
44
+ AssignmentPattern: ["left", "right"],
45
+ AwaitExpression: ["argument"],
46
+ BinaryExpression: ["left", "right"],
47
+ BlockStatement: ["body"],
48
+ BreakStatement: ["label"],
49
+ CallExpression: ["callee", "arguments"],
50
+ CatchClause: ["param", "body"],
51
+ ChainExpression: ["expression"],
52
+ ClassBody: ["body"],
53
+ ClassDeclaration: ["id", "superClass", "body"],
54
+ ClassExpression: ["id", "superClass", "body"],
55
+ ConditionalExpression: ["test", "consequent", "alternate"],
56
+ ContinueStatement: ["label"],
57
+ DoWhileStatement: ["body", "test"],
58
+ EmptyStatement: [],
59
+ ExportAllDeclaration: ["source"],
60
+ ExportDefaultDeclaration: ["declaration"],
61
+ ExportNamedDeclaration: ["declaration", "specifiers", "source"],
62
+ ExportSpecifier: ["exported", "local"],
63
+ ExpressionStatement: ["expression"],
64
+ ForInStatement: ["left", "right", "body"],
65
+ ForOfStatement: ["left", "right", "body"],
66
+ ForStatement: ["init", "test", "update", "body"],
67
+ FunctionDeclaration: ["id", "params", "body"],
68
+ FunctionExpression: ["id", "params", "body"],
69
+ Identifier: [],
70
+ IfStatement: ["test", "consequent", "alternate"],
71
+ ImportDeclaration: ["specifiers", "source"],
72
+ ImportDefaultSpecifier: ["local"],
73
+ ImportExpression: ["source", "options"],
74
+ ImportNamespaceSpecifier: ["local"],
75
+ ImportSpecifier: ["imported", "local"],
76
+ LabeledStatement: ["label", "body"],
77
+ Literal: [],
78
+ LogicalExpression: ["left", "right"],
79
+ MemberExpression: ["object", "property"],
80
+ MetaProperty: ["meta", "property"],
81
+ MethodDefinition: ["key", "value"],
82
+ NewExpression: ["callee", "arguments"],
83
+ ObjectExpression: ["properties"],
84
+ ObjectPattern: ["properties"],
85
+ PrivateIdentifier: [],
86
+ Program: ["body"],
87
+ Property: ["key", "value"],
88
+ PropertyDefinition: ["key", "value"],
89
+ RestElement: ["argument"],
90
+ ReturnStatement: ["argument"],
91
+ SequenceExpression: ["expressions"],
92
+ SpreadElement: ["argument"],
93
+ StaticBlock: ["body"],
94
+ Super: [],
95
+ SwitchCase: ["test", "consequent"],
96
+ SwitchStatement: ["discriminant", "cases"],
97
+ TaggedTemplateExpression: ["tag", "quasi"],
98
+ TemplateElement: [],
99
+ TemplateLiteral: ["quasis", "expressions"],
100
+ ThisExpression: [],
101
+ ThrowStatement: ["argument"],
102
+ TryStatement: ["block", "handler", "finalizer"],
103
+ UnaryExpression: ["argument"],
104
+ UpdateExpression: ["argument"],
105
+ VariableDeclaration: ["declarations"],
106
+ VariableDeclarator: ["id", "init"],
107
+ WhileStatement: ["test", "body"],
108
+ WithStatement: ["object", "body"],
109
+ YieldExpression: ["argument"]
110
+ };
111
+
112
+ /**
113
+ * A lexical scope. One shape for every kind, so the property loads in the
114
+ * resolution loop stay monomorphic.
115
+ */
116
+ class Scope {
117
+ /**
118
+ * @param {ScopeType} type what opened this scope
119
+ * @param {Node} block the node that opened this scope
120
+ * @param {Scope | null} upper the enclosing scope
121
+ * @param {boolean} isVarScope whether `var` and function declarations hoist to here
122
+ * @param {boolean} recordEveryReference whether every binding collects its references, not only the ones webpack reads
123
+ */
124
+ constructor(type, block, upper, isVarScope, recordEveryReference) {
125
+ /** @type {ScopeType} */
126
+ this.type = type;
127
+ /** @type {Node} */
128
+ this.block = block;
129
+ /** @type {Scope | null} */
130
+ this.upper = upper;
131
+ /** @type {Scope[]} */
132
+ this.childScopes = NO_CHILD_SCOPES;
133
+ /** @type {Variable[]} */
134
+ this.variables = NO_VARIABLE_LIST;
135
+ /** @type {Map<string, Variable> | undefined} the index, once this scope outgrows a scan */
136
+ this._index = undefined;
137
+ /** @type {Scope} the nearest enclosing scope `var` hoists to */
138
+ this.variableScope = isVarScope
139
+ ? this
140
+ : /** @type {Scope} */ (upper).variableScope;
141
+ /**
142
+ * For a function scope with parameters, the offset where its body
143
+ * starts; `-1` for every other scope. Separates the two regions that
144
+ * share this scope, so a reference in the parameter list can be kept
145
+ * from resolving to a binding declared in the body — see
146
+ * `isHiddenBodyBinding`.
147
+ * @type {number}
148
+ */
149
+ this.paramBoundary = -1;
150
+ /**
151
+ * Whether this scope's bindings collect their references — only the
152
+ * module scope and its direct children are ever asked. See `_resolve`.
153
+ * @type {boolean}
154
+ */
155
+ this._recorded =
156
+ recordEveryReference ||
157
+ type === "module" ||
158
+ (upper !== null && upper.type === "module");
159
+ if (upper !== null) {
160
+ if (upper.childScopes === NO_CHILD_SCOPES) upper.childScopes = [this];
161
+ else upper.childScopes.push(this);
162
+ }
163
+ }
164
+
165
+ /**
166
+ * @param {string} name name to look up
167
+ * @returns {Variable | undefined} the binding this scope declares under that name
168
+ */
169
+ getBinding(name) {
170
+ const index = this._index;
171
+ if (index !== undefined) return index.get(name);
172
+ const variables = this.variables;
173
+ for (let i = 0; i < variables.length; i++) {
174
+ const variable = variables[i];
175
+ if (variable.name === name) return variable;
176
+ }
177
+ return undefined;
178
+ }
179
+ }
180
+
181
+ /** A binding: one name declared in one scope. */
182
+ class Variable {
183
+ /**
184
+ * @param {string} name the declared name
185
+ * @param {Scope} scope the declaring scope
186
+ */
187
+ constructor(name, scope) {
188
+ /** @type {string} */
189
+ this.name = name;
190
+ /** @type {Identifier[]} declaring occurrences */
191
+ this.identifiers = NO_IDENTIFIERS;
192
+ /** @type {Reference[]} occurrences that resolved here, at any depth */
193
+ this.references = NO_REFERENCES;
194
+ /** @type {Scope} */
195
+ this.scope = scope;
196
+ }
197
+ }
198
+
199
+ /** One identifier occurrence that refers to a binding. */
200
+ class Reference {
201
+ /**
202
+ * @param {Identifier} identifier the identifier node
203
+ * @param {Scope} from the scope the identifier was seen in
204
+ */
205
+ constructor(identifier, from) {
206
+ /** @type {Identifier} */
207
+ this.identifier = identifier;
208
+ /** @type {Scope} */
209
+ this.from = from;
210
+ /** @type {Variable | undefined} set during resolution, absent when free */
211
+ this.resolved = undefined;
212
+ }
213
+ }
214
+
215
+ /**
216
+ * Returned by `_pattern` for a plain identifier. Never mutated by callers.
217
+ * @type {Node[]}
218
+ */
219
+ const NO_RIGHT_HAND_NODES = [];
220
+
221
+ /**
222
+ * Stand-ins for the collections of a scope that declares nothing and encloses
223
+ * nothing — over half of them are one or both. Each is replaced by a real
224
+ * collection when the scope first needs it. None of them is ever mutated.
225
+ * @type {Variable[]}
226
+ */
227
+ const NO_VARIABLE_LIST = [];
228
+ /** @type {Scope[]} */
229
+ const NO_CHILD_SCOPES = [];
230
+ /** @type {Reference[]} */
231
+ const NO_REFERENCES = [];
232
+ /** @type {Identifier[]} */
233
+ const NO_IDENTIFIERS = [];
234
+
235
+ /**
236
+ * Above this many bindings a scope indexes them in a `Map`; below it, scanning
237
+ * the list is as fast and costs no second structure. ~96% of the scopes that
238
+ * bind anything stay below.
239
+ */
240
+ const INDEX_THRESHOLD = 8;
241
+
242
+ /**
243
+ * What `_pattern` does with each name it binds. An integer rather than a
244
+ * callback, so walking a pattern allocates no closure.
245
+ */
246
+ const PATTERN_DEFINE = 0;
247
+ const PATTERN_DEFINE_INIT = 1;
248
+ const PATTERN_REFERENCE = 2;
249
+ const PATTERN_REFERENCE_PLAIN = 3;
250
+
251
+ /**
252
+ * Adds a binding to a scope, seeding its list on the first one and building an
253
+ * index once the scope has outgrown a scan.
254
+ * @param {Scope} scope the scope that just declared a name
255
+ * @param {Variable} variable the binding it declared
256
+ * @returns {void}
257
+ */
258
+ const addBinding = (scope, variable) => {
259
+ const variables = scope.variables;
260
+ if (variables === NO_VARIABLE_LIST) {
261
+ scope.variables = [variable];
262
+ return;
263
+ }
264
+ variables.push(variable);
265
+ const index = scope._index;
266
+ if (index !== undefined) {
267
+ index.set(variable.name, variable);
268
+ return;
269
+ }
270
+ if (variables.length <= INDEX_THRESHOLD) return;
271
+ /** @type {Map<string, Variable>} */
272
+ const built = new Map();
273
+ for (let i = 0; i < variables.length; i++) {
274
+ built.set(variables[i].name, variables[i]);
275
+ }
276
+ scope._index = built;
277
+ };
278
+
279
+ /**
280
+ * Statement types that provably declare nothing in the block that holds them —
281
+ * `var` hoists past it, and the rest bind nowhere. Anything else, a syntax
282
+ * this list has not heard of included, is assumed to declare.
283
+ * @type {Set<string>}
284
+ */
285
+ const STATEMENTS_WITHOUT_BINDINGS = new Set([
286
+ "BlockStatement",
287
+ "BreakStatement",
288
+ "ContinueStatement",
289
+ "DebuggerStatement",
290
+ "DoWhileStatement",
291
+ "EmptyStatement",
292
+ "ExpressionStatement",
293
+ "ForInStatement",
294
+ "ForOfStatement",
295
+ "ForStatement",
296
+ "IfStatement",
297
+ "ReturnStatement",
298
+ "SwitchStatement",
299
+ "ThrowStatement",
300
+ "TryStatement",
301
+ "WhileStatement",
302
+ "WithStatement"
303
+ ]);
304
+
305
+ /**
306
+ * Whether a statement list needs a scope of its own to hold what it declares.
307
+ * @param {(Node | null | undefined)[]} body statement list
308
+ * @returns {boolean} true when a scope has to be opened for it
309
+ */
310
+ const needsScope = (body) => {
311
+ for (let i = 0; i < body.length; i++) {
312
+ const statement = body[i];
313
+ if (statement === null || statement === undefined) continue;
314
+ const type = statement.type;
315
+ if (type === "VariableDeclaration") {
316
+ if (statement.kind !== "var") return true;
317
+ } else if (type === "SwitchCase") {
318
+ if (needsScope(statement.consequent)) return true;
319
+ } else if (!STATEMENTS_WITHOUT_BINDINGS.has(type)) {
320
+ return true;
321
+ }
322
+ }
323
+ return false;
324
+ };
325
+
326
+ /**
327
+ * Node types that may appear as an assignment or binding target.
328
+ * @param {Node} node node to test
329
+ * @returns {boolean} true when the node can hold bindings
330
+ */
331
+ const isPattern = (node) => {
332
+ const type = node.type;
333
+ return (
334
+ type === "Identifier" ||
335
+ type === "ObjectPattern" ||
336
+ type === "ArrayPattern" ||
337
+ type === "SpreadElement" ||
338
+ type === "RestElement" ||
339
+ type === "AssignmentPattern"
340
+ );
341
+ };
342
+
343
+ /**
344
+ * Whether a binding found in a function scope is invisible to a reference,
345
+ * because the reference sits in the parameter list and the binding is declared
346
+ * in the body.
347
+ *
348
+ * Parameters and body share one scope here, but the language gives them two:
349
+ * a function with parameters evaluates them first, and only then creates the
350
+ * environment its body declarations live in. So a parameter default reads the
351
+ * enclosing scope, never the body.
352
+ *
353
+ * A name declared in *both* places is not hidden — that is what keeps the `x`
354
+ * in `function f(x) { var x = 1; return x }` resolving to the parameter.
355
+ * @param {Variable} variable a binding found in a function scope with parameters
356
+ * @param {Identifier} identifier the identifier being resolved
357
+ * @param {number} boundary source offset where that function's body starts
358
+ * @returns {boolean} true when resolution must skip this binding and climb
359
+ * @example
360
+ * ```js
361
+ * const x = 1;
362
+ * function f(a = x) { const x = 2; }
363
+ * // the default reads the outer `x`; the body's `x` does not exist yet
364
+ * ```
365
+ */
366
+ const isHiddenBodyBinding = (variable, identifier, boundary) => {
367
+ // a reference in the body sees everything the scope holds
368
+ if (/** @type {Identifier & Offset} */ (identifier).start >= boundary) {
369
+ return false;
370
+ }
371
+ const identifiers = variable.identifiers;
372
+ for (let i = 0; i < identifiers.length; i++) {
373
+ // declared in the parameter list too, so the parameters do see it
374
+ if (/** @type {Identifier & Offset} */ (identifiers[i]).start < boundary) {
375
+ return false;
376
+ }
377
+ }
378
+ return true;
379
+ };
380
+
381
+ class ScopeAnalyzer {
382
+ /**
383
+ * @param {boolean} recordEveryReference whether every binding collects its references
384
+ */
385
+ constructor(recordEveryReference) {
386
+ /** @type {Scope} the scope the walker is currently inside */
387
+ this.scope = /** @type {Scope} */ (/** @type {unknown} */ (null));
388
+ /** @type {Identifier[]} identifiers awaiting resolution */
389
+ this.pendingIdentifiers = [];
390
+ /** @type {Scope[]} the scope each pending identifier was seen in */
391
+ this.pendingScopes = [];
392
+ /** @type {boolean} */
393
+ this.recordEveryReference = recordEveryReference;
394
+ }
395
+
396
+ /**
397
+ * @param {ScopeType} type scope kind
398
+ * @param {Node} block node opening the scope
399
+ * @param {boolean} isVarScope whether `var` hoists to here
400
+ * @returns {Scope} the new scope, now current
401
+ */
402
+ _push(type, block, isVarScope) {
403
+ const scope = new Scope(
404
+ type,
405
+ block,
406
+ this.scope,
407
+ isVarScope,
408
+ this.recordEveryReference
409
+ );
410
+ this.scope = scope;
411
+ return scope;
412
+ }
413
+
414
+ /**
415
+ * @returns {void}
416
+ */
417
+ _pop() {
418
+ this.scope = /** @type {Scope} */ (this.scope.upper);
419
+ }
420
+
421
+ /**
422
+ * Declares a name in a scope, reusing the binding when it already exists
423
+ * (`var x; var x;`, a function and its hoisted declaration, and so on).
424
+ * @param {Scope} scope scope to declare in
425
+ * @param {Node | null} node the declaring identifier, absent for an anonymous `export default` declaration
426
+ * @returns {void}
427
+ */
428
+ _define(scope, node) {
429
+ if (node === null || node.type !== "Identifier") return;
430
+ const name = node.name;
431
+ let variable = scope.getBinding(name);
432
+ if (variable === undefined) {
433
+ variable = new Variable(name, scope);
434
+ addBinding(scope, variable);
435
+ }
436
+ if (variable.identifiers === NO_IDENTIFIERS) {
437
+ variable.identifiers = [/** @type {Identifier} */ (node)];
438
+ } else {
439
+ variable.identifiers.push(/** @type {Identifier} */ (node));
440
+ }
441
+ }
442
+
443
+ /**
444
+ * Records an identifier occurrence to be resolved once the walk is done.
445
+ * @param {Node} node the identifier
446
+ * @returns {void}
447
+ */
448
+ _reference(node) {
449
+ this.pendingIdentifiers.push(/** @type {Identifier} */ (node));
450
+ this.pendingScopes.push(this.scope);
451
+ }
452
+
453
+ /**
454
+ * Binds or references one name of a pattern, as `mode` asks.
455
+ * @param {Node} node the bound identifier
456
+ * @param {number} defaults number of enclosing defaults
457
+ * @param {number} mode one of the `PATTERN_*` constants
458
+ * @param {Scope} target scope to declare in
459
+ * @returns {void}
460
+ */
461
+ _bind(node, defaults, mode, target) {
462
+ if (mode <= PATTERN_DEFINE_INIT) this._define(target, node);
463
+ if (mode !== PATTERN_REFERENCE_PLAIN) {
464
+ for (let d = 0; d < defaults; d++) this._reference(node);
465
+ }
466
+ if (mode >= PATTERN_DEFINE_INIT) this._reference(node);
467
+ }
468
+
469
+ /**
470
+ * Walks a binding pattern, binding each name it holds. The expressions
471
+ * inside it are returned rather than visited, so every name binds first.
472
+ * @param {Node} root the pattern
473
+ * @param {number} mode one of the `PATTERN_*` constants
474
+ * @param {Scope} target scope to declare in
475
+ * @returns {Node[]} expressions still to visit
476
+ */
477
+ _pattern(root, mode, target) {
478
+ // a bare identifier is ~97% of calls and holds no expressions, so it
479
+ // needs neither the result array nor a walk
480
+ if (root.type === "Identifier") {
481
+ this._bind(root, 0, mode, target);
482
+ return NO_RIGHT_HAND_NODES;
483
+ }
484
+ /** @type {Node[]} */
485
+ const rightHandNodes = [];
486
+ this._patternWalk(root, mode, target, 0, rightHandNodes);
487
+ return rightHandNodes;
488
+ }
489
+
490
+ /**
491
+ * @param {Node | null} node current pattern node
492
+ * @param {number} mode one of the `PATTERN_*` constants
493
+ * @param {Scope} target scope to declare in
494
+ * @param {number} defaults number of enclosing defaults
495
+ * @param {Node[]} rightHandNodes collects the expressions still to visit
496
+ * @returns {void}
497
+ */
498
+ _patternWalk(node, mode, target, defaults, rightHandNodes) {
499
+ if (node === null || node === undefined) return;
500
+ switch (node.type) {
501
+ case "Identifier":
502
+ this._bind(node, defaults, mode, target);
503
+ return;
504
+ case "ObjectPattern":
505
+ for (const property of node.properties) {
506
+ this._patternWalk(property, mode, target, defaults, rightHandNodes);
507
+ }
508
+ return;
509
+ case "ArrayPattern":
510
+ for (const element of node.elements) {
511
+ this._patternWalk(element, mode, target, defaults, rightHandNodes);
512
+ }
513
+ return;
514
+ case "Property":
515
+ if (node.computed) rightHandNodes.push(node.key);
516
+ this._patternWalk(node.value, mode, target, defaults, rightHandNodes);
517
+ return;
518
+ case "AssignmentPattern":
519
+ this._patternWalk(
520
+ node.left,
521
+ mode,
522
+ target,
523
+ defaults + 1,
524
+ rightHandNodes
525
+ );
526
+ rightHandNodes.push(node.right);
527
+ return;
528
+ case "RestElement":
529
+ case "SpreadElement":
530
+ this._patternWalk(
531
+ node.argument,
532
+ mode,
533
+ target,
534
+ defaults,
535
+ rightHandNodes
536
+ );
537
+ return;
538
+ case "MemberExpression":
539
+ // the object is only read; the write lands on its property
540
+ if (node.computed) rightHandNodes.push(node.property);
541
+ rightHandNodes.push(node.object);
542
+ return;
543
+ // assignment targets the parser reports as expressions
544
+ case "ArrayExpression":
545
+ for (const element of node.elements) {
546
+ this._patternWalk(element, mode, target, defaults, rightHandNodes);
547
+ }
548
+ return;
549
+ case "ObjectExpression":
550
+ for (const property of node.properties) {
551
+ this._patternWalk(property, mode, target, defaults, rightHandNodes);
552
+ }
553
+ return;
554
+ case "AssignmentExpression":
555
+ this._patternWalk(
556
+ node.left,
557
+ mode,
558
+ target,
559
+ defaults + 1,
560
+ rightHandNodes
561
+ );
562
+ rightHandNodes.push(node.right);
563
+ return;
564
+ default:
565
+ rightHandNodes.push(node);
566
+ }
567
+ }
568
+
569
+ /**
570
+ * @param {(Node | null | undefined)[]} nodes statement or expression list, holes and all
571
+ * @returns {void}
572
+ */
573
+ _visitAll(nodes) {
574
+ for (let i = 0; i < nodes.length; i++) {
575
+ const node = nodes[i];
576
+ if (node !== null && node !== undefined) this._visit(node);
577
+ }
578
+ }
579
+
580
+ /**
581
+ * A function's parameters and body share one scope, so a named function
582
+ * expression gets an extra scope above it holding only its own name.
583
+ * @param {ESTreeFunction} node Function node
584
+ * @returns {void}
585
+ */
586
+ _visitFunction(node) {
587
+ if (node.type === "FunctionDeclaration") {
588
+ // block scoped in ES6, so it lands in the enclosing scope
589
+ this._define(this.scope, /** @type {Node} */ (node.id));
590
+ }
591
+
592
+ const named =
593
+ node.type === "FunctionExpression" &&
594
+ node.id !== null &&
595
+ node.id !== undefined;
596
+ if (named) {
597
+ this._push("function-expression-name", node, false);
598
+ this._define(this.scope, /** @type {Node} */ (node.id));
599
+ }
600
+
601
+ const scope = this._push("function", node, true);
602
+
603
+ if (node.type !== "ArrowFunctionExpression") {
604
+ // every non-arrow function has an implicit `arguments`
605
+ addBinding(scope, new Variable("arguments", scope));
606
+ }
607
+
608
+ const params = node.params;
609
+ if (params.length !== 0) {
610
+ scope.paramBoundary = /** @type {Node & Offset} */ (node.body).start;
611
+ for (let i = 0; i < params.length; i++) {
612
+ const rightHandNodes = this._pattern(params[i], PATTERN_DEFINE, scope);
613
+ this._visitAll(rightHandNodes);
614
+ }
615
+ }
616
+
617
+ const body = node.body;
618
+ if (body.type === "BlockStatement") {
619
+ // the body block is the function scope; it gets no scope of its own
620
+ this._visitAll(body.body);
621
+ } else {
622
+ this._visit(body);
623
+ }
624
+
625
+ this._pop();
626
+ if (named) this._pop();
627
+ }
628
+
629
+ /**
630
+ * The class name is bound twice: outside, so siblings can see the class,
631
+ * and inside, so the body and the heritage clause see a binding that an
632
+ * outer reassignment cannot change.
633
+ * @param {import("estree").ClassDeclaration | import("estree").ClassExpression} node Class node
634
+ * @returns {void}
635
+ */
636
+ _visitClass(node) {
637
+ if (node.type === "ClassDeclaration") {
638
+ this._define(this.scope, /** @type {Node} */ (node.id));
639
+ }
640
+ const scope = this._push("class", node, false);
641
+ if (node.id !== null && node.id !== undefined) {
642
+ this._define(scope, node.id);
643
+ }
644
+ // the heritage clause is evaluated inside the class scope
645
+ if (node.superClass !== null && node.superClass !== undefined) {
646
+ this._visit(node.superClass);
647
+ }
648
+ this._visit(node.body);
649
+ this._pop();
650
+ }
651
+
652
+ /**
653
+ * @param {import("estree").ForInStatement | import("estree").ForOfStatement} node the loop
654
+ * @returns {void}
655
+ */
656
+ _visitForIn(node) {
657
+ const left = node.left;
658
+ const lexical = left.type === "VariableDeclaration" && left.kind !== "var";
659
+ if (lexical) this._push("for", node, false);
660
+
661
+ if (left.type === "VariableDeclaration") {
662
+ this._visit(left);
663
+ // the loop head writes each iteration; right-hand nodes were
664
+ // already visited by the declaration above
665
+ this._pattern(
666
+ left.declarations[0].id,
667
+ PATTERN_REFERENCE_PLAIN,
668
+ this.scope
669
+ );
670
+ } else {
671
+ const rightHandNodes = this._pattern(left, PATTERN_REFERENCE, this.scope);
672
+ this._visitAll(rightHandNodes);
673
+ }
674
+
675
+ this._visit(node.right);
676
+ this._visit(node.body);
677
+ if (lexical) this._pop();
678
+ }
679
+
680
+ /**
681
+ * Fallback for node types the key table does not know, so unfamiliar
682
+ * syntax still contributes its references instead of silently vanishing.
683
+ * @param {Node} node node of an unknown type
684
+ * @returns {void}
685
+ */
686
+ _visitUnknown(node) {
687
+ for (const key in node) {
688
+ if (
689
+ key === "type" ||
690
+ key === "start" ||
691
+ key === "end" ||
692
+ key === "range" ||
693
+ key === "loc" ||
694
+ key === "parent" ||
695
+ key === "leadingComments" ||
696
+ key === "trailingComments"
697
+ ) {
698
+ continue;
699
+ }
700
+ if (key === "key" && "computed" in node && node.computed === false) {
701
+ continue;
702
+ }
703
+ const child = /** @type {Record<string, unknown>} */ (
704
+ /** @type {unknown} */ (node)
705
+ )[key];
706
+ if (child === null || typeof child !== "object") continue;
707
+ if (Array.isArray(child)) {
708
+ for (const item of child) {
709
+ if (item !== null && typeof item === "object" && item.type) {
710
+ this._visit(item);
711
+ }
712
+ }
713
+ } else if (/** @type {Node} */ (child).type) {
714
+ this._visit(/** @type {Node} */ (child));
715
+ }
716
+ }
717
+ }
718
+
719
+ /**
720
+ * @param {Node} node node to visit
721
+ * @returns {void}
722
+ */
723
+ _visit(node) {
724
+ // cases are ordered by measured frequency: the chain is a sequence of
725
+ // comparisons, so a type that falls through to `default` pays all of them
726
+ switch (node.type) {
727
+ case "Identifier":
728
+ this._reference(node);
729
+ return;
730
+
731
+ // leaves too common to leave at the end of the chain: together they
732
+ // are ~14% of all visits, and every case above them is a comparison
733
+ case "Literal":
734
+ case "ThisExpression":
735
+ return;
736
+
737
+ case "MemberExpression":
738
+ this._visit(node.object);
739
+ // `a.b` reads `a`; `b` is a property name, not a binding
740
+ if (node.computed) this._visit(node.property);
741
+ return;
742
+
743
+ // the types the key table below would otherwise handle, and which
744
+ // together are ~31% of all visits — a call alone is 10%
745
+ case "CallExpression":
746
+ case "NewExpression":
747
+ this._visit(node.callee);
748
+ this._visitAll(node.arguments);
749
+ return;
750
+
751
+ case "ExpressionStatement":
752
+ this._visit(node.expression);
753
+ return;
754
+
755
+ case "BinaryExpression":
756
+ case "LogicalExpression":
757
+ this._visit(node.left);
758
+ this._visit(node.right);
759
+ return;
760
+
761
+ case "ReturnStatement":
762
+ case "ThrowStatement":
763
+ case "UnaryExpression":
764
+ case "AwaitExpression":
765
+ case "SpreadElement":
766
+ case "YieldExpression":
767
+ if (node.argument !== null && node.argument !== undefined) {
768
+ this._visit(node.argument);
769
+ }
770
+ return;
771
+
772
+ case "IfStatement":
773
+ case "ConditionalExpression":
774
+ this._visit(node.test);
775
+ this._visit(node.consequent);
776
+ if (node.alternate !== null && node.alternate !== undefined) {
777
+ this._visit(node.alternate);
778
+ }
779
+ return;
780
+
781
+ case "SwitchCase":
782
+ if (node.test !== null && node.test !== undefined) {
783
+ this._visit(node.test);
784
+ }
785
+ this._visitAll(node.consequent);
786
+ return;
787
+
788
+ case "ArrayExpression":
789
+ this._visitAll(node.elements);
790
+ return;
791
+
792
+ case "ObjectExpression":
793
+ this._visitAll(node.properties);
794
+ return;
795
+
796
+ case "Property":
797
+ case "MethodDefinition":
798
+ if (node.computed) this._visit(node.key);
799
+ this._visit(node.value);
800
+ return;
801
+
802
+ case "PropertyDefinition":
803
+ if (node.computed) this._visit(node.key);
804
+ if (node.value !== null && node.value !== undefined) {
805
+ // each field initializer runs in its own scope
806
+ this._push("class-field-initializer", node.value, true);
807
+ this._visit(node.value);
808
+ this._pop();
809
+ }
810
+ return;
811
+
812
+ case "StaticBlock":
813
+ this._push("class-static-block", node, true);
814
+ this._visitAll(node.body);
815
+ this._pop();
816
+ return;
817
+
818
+ case "BlockStatement": {
819
+ const scoped = needsScope(node.body);
820
+ if (scoped) this._push("block", node, false);
821
+ this._visitAll(node.body);
822
+ if (scoped) this._pop();
823
+ return;
824
+ }
825
+
826
+ case "SwitchStatement": {
827
+ this._visit(node.discriminant);
828
+ const scoped = needsScope(node.cases);
829
+ if (scoped) this._push("switch", node, false);
830
+ this._visitAll(node.cases);
831
+ if (scoped) this._pop();
832
+ return;
833
+ }
834
+
835
+ case "ForStatement": {
836
+ const init = node.init;
837
+ const lexical =
838
+ init !== null &&
839
+ init !== undefined &&
840
+ init.type === "VariableDeclaration" &&
841
+ init.kind !== "var";
842
+ if (lexical) this._push("for", node, false);
843
+ if (init !== null && init !== undefined) this._visit(init);
844
+ if (node.test !== null && node.test !== undefined) {
845
+ this._visit(node.test);
846
+ }
847
+ if (node.update !== null && node.update !== undefined) {
848
+ this._visit(node.update);
849
+ }
850
+ this._visit(node.body);
851
+ if (lexical) this._pop();
852
+ return;
853
+ }
854
+
855
+ case "ForInStatement":
856
+ case "ForOfStatement":
857
+ this._visitForIn(node);
858
+ return;
859
+
860
+ case "VariableDeclaration": {
861
+ // `var` hoists to the nearest function-like scope, everything
862
+ // else binds right here
863
+ const target =
864
+ node.kind === "var" ? this.scope.variableScope : this.scope;
865
+ for (const declarator of node.declarations) {
866
+ const init = declarator.init;
867
+ const initialized = init !== null && init !== undefined;
868
+ const rightHandNodes = this._pattern(
869
+ declarator.id,
870
+ initialized ? PATTERN_DEFINE_INIT : PATTERN_DEFINE,
871
+ target
872
+ );
873
+ this._visitAll(rightHandNodes);
874
+ if (initialized) this._visit(init);
875
+ }
876
+ return;
877
+ }
878
+
879
+ case "AssignmentExpression":
880
+ if (isPattern(node.left)) {
881
+ if (node.operator === "=") {
882
+ const rightHandNodes = this._pattern(
883
+ node.left,
884
+ PATTERN_REFERENCE,
885
+ this.scope
886
+ );
887
+ this._visitAll(rightHandNodes);
888
+ } else if (node.left.type === "Identifier") {
889
+ // `x += 1` reads and writes the same binding
890
+ this._reference(node.left);
891
+ } else {
892
+ this._visit(node.left);
893
+ }
894
+ } else {
895
+ this._visit(node.left);
896
+ }
897
+ this._visit(node.right);
898
+ return;
899
+
900
+ case "UpdateExpression":
901
+ if (node.argument.type === "Identifier") {
902
+ this._reference(node.argument);
903
+ } else {
904
+ this._visit(node.argument);
905
+ }
906
+ return;
907
+
908
+ case "FunctionDeclaration":
909
+ case "FunctionExpression":
910
+ case "ArrowFunctionExpression":
911
+ this._visitFunction(node);
912
+ return;
913
+
914
+ case "ClassDeclaration":
915
+ case "ClassExpression":
916
+ this._visitClass(node);
917
+ return;
918
+
919
+ case "CatchClause":
920
+ this._push("catch", node, false);
921
+ if (node.param !== null && node.param !== undefined) {
922
+ const rightHandNodes = this._pattern(
923
+ node.param,
924
+ PATTERN_DEFINE,
925
+ this.scope
926
+ );
927
+ this._visitAll(rightHandNodes);
928
+ }
929
+ this._visit(node.body);
930
+ this._pop();
931
+ return;
932
+
933
+ case "WithStatement":
934
+ this._visit(node.object);
935
+ this._push("with", node, false);
936
+ this._visit(node.body);
937
+ this._pop();
938
+ return;
939
+
940
+ case "ImportDeclaration":
941
+ // every specifier introduces a local binding; the source is a
942
+ // literal and attributes hold no references
943
+ for (const specifier of node.specifiers) {
944
+ const local = specifier.local;
945
+ if (local !== null && local !== undefined) {
946
+ this._define(this.scope, local);
947
+ }
948
+ }
949
+ return;
950
+
951
+ case "ExportAllDeclaration":
952
+ // always re-exports from a source, so nothing local is referenced
953
+ return;
954
+
955
+ case "ExportDefaultDeclaration":
956
+ this._visit(/** @type {Node} */ (node.declaration));
957
+ return;
958
+
959
+ case "ExportNamedDeclaration":
960
+ if (node.source !== null && node.source !== undefined) return;
961
+ if (node.declaration !== null && node.declaration !== undefined) {
962
+ this._visit(node.declaration);
963
+ return;
964
+ }
965
+ this._visitAll(node.specifiers);
966
+ return;
967
+
968
+ case "ExportSpecifier":
969
+ // `export { x }` reads `x`; the exported name is not a binding
970
+ if (node.local.type === "Identifier") this._reference(node.local);
971
+ return;
972
+
973
+ case "LabeledStatement":
974
+ // labels share the identifier node type but are not bindings
975
+ this._visit(node.body);
976
+ return;
977
+
978
+ case "BreakStatement":
979
+ case "ContinueStatement":
980
+ case "MetaProperty":
981
+ case "PrivateIdentifier":
982
+ case "Super":
983
+ case "EmptyStatement":
984
+ case "DebuggerStatement":
985
+ return;
986
+
987
+ default: {
988
+ const keys = CHILD_KEYS[node.type];
989
+ if (keys === undefined) {
990
+ this._visitUnknown(node);
991
+ return;
992
+ }
993
+ for (let i = 0; i < keys.length; i++) {
994
+ const child = /** @type {NodeChildren} */ (
995
+ /** @type {unknown} */ (node)
996
+ )[keys[i]];
997
+ if (child === null || child === undefined) continue;
998
+ if (Array.isArray(child)) {
999
+ for (let j = 0; j < child.length; j++) {
1000
+ const item = child[j];
1001
+ if (item !== null && item !== undefined) this._visit(item);
1002
+ }
1003
+ } else {
1004
+ this._visit(child);
1005
+ }
1006
+ }
1007
+ }
1008
+ }
1009
+ }
1010
+
1011
+ /**
1012
+ * Resolves every recorded reference by climbing the scope chain from where
1013
+ * it was seen. Runs once, after the whole tree has been walked, so a
1014
+ * reference to a binding declared later still finds it.
1015
+ * @returns {Reference[]} references that resolved to no binding
1016
+ */
1017
+ _resolve() {
1018
+ const identifiers = this.pendingIdentifiers;
1019
+ const scopes = this.pendingScopes;
1020
+ /** @type {Reference[]} */
1021
+ const unresolved = [];
1022
+
1023
+ for (let i = 0; i < identifiers.length; i++) {
1024
+ const identifier = identifiers[i];
1025
+ const name = identifier.name;
1026
+ const from = scopes[i];
1027
+ /** @type {Scope | null} */
1028
+ let scope = from;
1029
+ let resolved = false;
1030
+
1031
+ while (scope !== null) {
1032
+ const variable = scope.getBinding(name);
1033
+ if (variable !== undefined) {
1034
+ // `-1` is every scope but a function scope with parameters, so
1035
+ // the common case is one integer compare and no call
1036
+ const boundary = scope.paramBoundary;
1037
+ if (
1038
+ boundary === -1 ||
1039
+ !isHiddenBodyBinding(variable, identifier, boundary)
1040
+ ) {
1041
+ // most identifiers resolve into a scope nothing reads back,
1042
+ // so the `Reference` is built only where one is kept
1043
+ if (scope._recorded) {
1044
+ const reference = new Reference(identifier, from);
1045
+ reference.resolved = variable;
1046
+ if (variable.references === NO_REFERENCES) {
1047
+ variable.references = [reference];
1048
+ } else {
1049
+ variable.references.push(reference);
1050
+ }
1051
+ }
1052
+ resolved = true;
1053
+ break;
1054
+ }
1055
+ }
1056
+ scope = scope.upper;
1057
+ }
1058
+
1059
+ if (!resolved) unresolved.push(new Reference(identifier, from));
1060
+ }
1061
+
1062
+ return unresolved;
1063
+ }
1064
+ }
1065
+
1066
+ /**
1067
+ * @typedef {object} ScopeAnalysis
1068
+ * @property {Scope} globalScope the outermost scope
1069
+ * @property {Scope} moduleScope the module body scope, where top-level declarations live
1070
+ * @property {Reference[]} unresolvedReferences every identifier that resolved to no binding — the module's free names
1071
+ */
1072
+
1073
+ /**
1074
+ * Analyses a generated module source as a strict ES module. Only the module
1075
+ * scope and its direct children collect references; `recordEveryReference`
1076
+ * widens that to the whole tree, retaining one per identifier.
1077
+ * @param {Program} ast the program to analyse
1078
+ * @param {boolean=} recordEveryReference whether every binding collects its references
1079
+ * @returns {ScopeAnalysis} the scope tree and the module's free references
1080
+ */
1081
+ const analyzeScope = (ast, recordEveryReference = false) => {
1082
+ const analyzer = new ScopeAnalyzer(recordEveryReference);
1083
+ const globalScope = analyzer._push("global", ast, true);
1084
+ const moduleScope = analyzer._push("module", ast, true);
1085
+ analyzer._visitAll(ast.body);
1086
+ const unresolvedReferences = analyzer._resolve();
1087
+ return { globalScope, moduleScope, unresolvedReferences };
1088
+ };
1089
+
1090
+ analyzeScope.Reference = Reference;
1091
+ analyzeScope.Scope = Scope;
1092
+ analyzeScope.Variable = Variable;
1093
+
1094
+ module.exports = analyzeScope;