@depup/webpack 5.109.0-depup.0 → 5.110.1-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 (641) hide show
  1. package/README.md +7 -7
  2. package/bin/webpack.js +12 -0
  3. package/changes.json +10 -10
  4. package/lib/APIPlugin.js +123 -17
  5. package/lib/AsyncDependenciesBlock.js +10 -7
  6. package/lib/AutomaticPrefetchPlugin.js +1 -1
  7. package/lib/BannerPlugin.js +10 -6
  8. package/lib/CacheFacade.js +6 -6
  9. package/lib/Chunk.js +14 -11
  10. package/lib/ChunkGraph.js +43 -32
  11. package/lib/ChunkGroup.js +7 -7
  12. package/lib/ChunkTemplate.js +35 -44
  13. package/lib/CircularModulesPlugin.js +205 -28
  14. package/lib/CleanPlugin.js +15 -16
  15. package/lib/CodeGenerationResults.js +11 -8
  16. package/lib/CompatibilityPlugin.js +38 -7
  17. package/lib/Compilation.js +709 -414
  18. package/lib/Compiler.js +69 -42
  19. package/lib/ConcatenationScope.js +117 -8
  20. package/lib/ConditionalInitFragment.js +3 -3
  21. package/lib/ConstPlugin.js +13 -11
  22. package/lib/ContextExclusionPlugin.js +1 -1
  23. package/lib/ContextModule.js +146 -54
  24. package/lib/ContextModuleFactory.js +46 -14
  25. package/lib/ContextReplacementPlugin.js +12 -14
  26. package/lib/DefinePlugin.js +168 -57
  27. package/lib/DependenciesBlock.js +9 -6
  28. package/lib/Dependency.js +36 -16
  29. package/lib/DependencyTemplate.js +11 -12
  30. package/lib/DependencyTemplates.js +3 -3
  31. package/lib/DotenvPlugin.js +50 -13
  32. package/lib/DynamicEntryPlugin.js +8 -4
  33. package/lib/EntryOptionPlugin.js +8 -4
  34. package/lib/EntryPlugin.js +2 -2
  35. package/lib/Entrypoint.js +6 -2
  36. package/lib/EnvironmentPlugin.js +2 -2
  37. package/lib/EvalDevToolModulePlugin.js +8 -4
  38. package/lib/EvalSourceMapDevToolPlugin.js +15 -8
  39. package/lib/ExportsInfo.js +123 -19
  40. package/lib/ExportsInfoApiPlugin.js +2 -4
  41. package/lib/ExternalModule.js +242 -84
  42. package/lib/ExternalModuleFactoryPlugin.js +97 -38
  43. package/lib/ExternalsPlugin.js +10 -6
  44. package/lib/FileSystemInfo.js +116 -42
  45. package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
  46. package/lib/FlagDependencyExportsPlugin.js +76 -19
  47. package/lib/FlagDependencyUsagePlugin.js +63 -57
  48. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  49. package/lib/Generator.js +36 -15
  50. package/lib/HotModuleReplacementPlugin.js +16 -44
  51. package/lib/IgnorePlugin.js +8 -4
  52. package/lib/IgnoreWarningsPlugin.js +2 -2
  53. package/lib/InitFragment.js +28 -36
  54. package/lib/JavascriptMetaInfoPlugin.js +35 -4
  55. package/lib/LazyBarrel.js +3 -4
  56. package/lib/LibraryTemplatePlugin.js +10 -6
  57. package/lib/LoaderOptionsPlugin.js +7 -3
  58. package/lib/LoaderTargetPlugin.js +1 -1
  59. package/lib/MainTemplate.js +49 -42
  60. package/lib/ManifestPlugin.js +12 -11
  61. package/lib/Module.js +62 -33
  62. package/lib/ModuleFactory.js +3 -3
  63. package/lib/ModuleFilenameHelpers.js +22 -6
  64. package/lib/ModuleGraph.js +195 -21
  65. package/lib/ModuleGraphConnection.js +6 -13
  66. package/lib/ModuleInfoHeaderPlugin.js +8 -10
  67. package/lib/ModuleTemplate.js +62 -63
  68. package/lib/MultiCompiler.js +130 -64
  69. package/lib/MultiStats.js +40 -9
  70. package/lib/MultiWatching.js +3 -3
  71. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  72. package/lib/NodeStuffPlugin.js +29 -19
  73. package/lib/NormalModule.js +221 -156
  74. package/lib/NormalModuleFactory.js +563 -112
  75. package/lib/NormalModuleReplacementPlugin.js +5 -8
  76. package/lib/NullFactory.js +6 -2
  77. package/lib/OptionsApply.js +7 -3
  78. package/lib/Parser.js +7 -3
  79. package/lib/PlatformPlugin.js +2 -2
  80. package/lib/PrefetchPlugin.js +1 -1
  81. package/lib/ProgressPlugin.js +16 -13
  82. package/lib/ProvidePlugin.js +3 -5
  83. package/lib/RawModule.js +25 -17
  84. package/lib/RecordIdsPlugin.js +3 -3
  85. package/lib/RequestShortener.js +1 -1
  86. package/lib/ResolverFactory.js +2 -2
  87. package/lib/RuntimeGlobals.js +22 -10
  88. package/lib/RuntimeModule.js +29 -19
  89. package/lib/RuntimePlugin.js +346 -256
  90. package/lib/RuntimeTemplate.js +2792 -352
  91. package/lib/SelfModuleFactory.js +7 -3
  92. package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
  93. package/lib/SourceMapDevToolPlugin.js +30 -20
  94. package/lib/Stats.js +3 -4
  95. package/lib/Template.js +55 -25
  96. package/lib/TemplatedPathPlugin.js +96 -14
  97. package/lib/UseStrictPlugin.js +4 -6
  98. package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
  99. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  100. package/lib/WarnNoModeSetPlugin.js +1 -1
  101. package/lib/WatchIgnorePlugin.js +8 -6
  102. package/lib/Watching.js +8 -8
  103. package/lib/WebpackIsIncludedPlugin.js +2 -4
  104. package/lib/WebpackOptionsApply.js +308 -18
  105. package/lib/WebpackOptionsDefaulter.js +6 -2
  106. package/lib/asset/AssetBytesGenerator.js +12 -10
  107. package/lib/asset/AssetBytesParser.js +2 -4
  108. package/lib/asset/AssetGenerator.js +188 -95
  109. package/lib/asset/AssetModule.js +7 -3
  110. package/lib/asset/AssetModulesPlugin.js +110 -38
  111. package/lib/asset/AssetParser.js +9 -7
  112. package/lib/asset/AssetSourceGenerator.js +60 -13
  113. package/lib/asset/AssetSourceParser.js +2 -4
  114. package/lib/asset/RawDataUrlModule.js +24 -16
  115. package/lib/asset/WebManifestGenerator.js +8 -10
  116. package/lib/asset/WebManifestParser.js +24 -10
  117. package/lib/async-modules/AsyncModuleHelpers.js +2 -2
  118. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  119. package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
  120. package/lib/async-modules/isGeneratorLowered.js +4 -4
  121. package/lib/buildChunkGraph.js +36 -27
  122. package/lib/bun/BunTargetPlugin.js +1 -1
  123. package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
  124. package/lib/cache/AddManagedPathsPlugin.js +1 -1
  125. package/lib/cache/IdleFileCachePlugin.js +2 -2
  126. package/lib/cache/MemoryCachePlugin.js +18 -10
  127. package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
  128. package/lib/cache/PackFileCacheStrategy.js +289 -28
  129. package/lib/cache/ResolverCachePlugin.js +38 -18
  130. package/lib/cache/getLazyHashedEtag.js +1 -2
  131. package/lib/cache/mergeEtags.js +1 -1
  132. package/lib/cli.js +1 -3
  133. package/lib/config/browserslistTargetHandler.js +41 -5
  134. package/lib/config/defaults.js +282 -81
  135. package/lib/config/defineConfig.js +10 -2
  136. package/lib/config/getClaimedAssetTypes.js +65 -0
  137. package/lib/config/normalization.js +36 -16
  138. package/lib/config/target.js +46 -3
  139. package/lib/container/ContainerEntryDependency.js +1 -1
  140. package/lib/container/ContainerEntryModule.js +24 -15
  141. package/lib/container/ContainerEntryModuleFactory.js +7 -3
  142. package/lib/container/ContainerPlugin.js +9 -10
  143. package/lib/container/ContainerReferencePlugin.js +6 -2
  144. package/lib/container/FallbackDependency.js +1 -1
  145. package/lib/container/FallbackModule.js +24 -17
  146. package/lib/container/FallbackModuleFactory.js +7 -3
  147. package/lib/container/HoistContainerReferencesPlugin.js +53 -66
  148. package/lib/container/ModuleFederationPlugin.js +7 -18
  149. package/lib/container/RemoteModule.js +27 -19
  150. package/lib/container/RemoteRuntimeModule.js +10 -8
  151. package/lib/container/moduleFederationHooks.js +32 -0
  152. package/lib/css/CssGenerator.js +178 -44
  153. package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
  154. package/lib/css/CssLoadingRuntimeModule.js +82 -36
  155. package/lib/css/CssModule.js +10 -7
  156. package/lib/css/CssModulesPlugin.js +197 -106
  157. package/lib/css/CssParser.js +1248 -618
  158. package/lib/css/CssServerStylesRuntimeModule.js +54 -0
  159. package/lib/css/cssMinify.js +168 -0
  160. package/lib/css/data.js +5324 -0
  161. package/lib/css/syntax.js +10396 -952
  162. package/lib/debug/ProfilingPlugin.js +14 -9
  163. package/lib/deno/DenoTargetPlugin.js +1 -1
  164. package/lib/dependencies/AMDDefineDependency.js +112 -87
  165. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
  166. package/lib/dependencies/AMDPlugin.js +9 -7
  167. package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
  168. package/lib/dependencies/AMDRequireContextDependency.js +2 -2
  169. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
  170. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
  171. package/lib/dependencies/AMDRequireDependency.js +8 -7
  172. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  173. package/lib/dependencies/AMDRuntimeModules.js +21 -1
  174. package/lib/dependencies/BuildTimeConstDependency.js +102 -0
  175. package/lib/dependencies/CachedConstDependency.js +11 -8
  176. package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
  177. package/lib/dependencies/CommonJsExportRequireDependency.js +140 -45
  178. package/lib/dependencies/CommonJsExportsDependency.js +53 -49
  179. package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
  180. package/lib/dependencies/CommonJsFullRequireDependency.js +140 -26
  181. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -48
  182. package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
  183. package/lib/dependencies/CommonJsPlugin.js +35 -6
  184. package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
  185. package/lib/dependencies/CommonJsRequireDependency.js +156 -27
  186. package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
  187. package/lib/dependencies/ConstDependency.js +8 -9
  188. package/lib/dependencies/ContextDependency.js +12 -8
  189. package/lib/dependencies/ContextDependencyHelpers.js +14 -9
  190. package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
  191. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -4
  192. package/lib/dependencies/ContextElementDependency.js +31 -12
  193. package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
  194. package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
  195. package/lib/dependencies/CssIcssExportDependency.js +56 -28
  196. package/lib/dependencies/CssIcssImportDependency.js +17 -13
  197. package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
  198. package/lib/dependencies/CssImportDependency.js +18 -9
  199. package/lib/dependencies/CssUrlDependency.js +17 -13
  200. package/lib/dependencies/DllEntryDependency.js +1 -1
  201. package/lib/dependencies/DynamicExports.js +2 -2
  202. package/lib/dependencies/ExportBindingInitFragment.js +36 -9
  203. package/lib/dependencies/ExportsInfoDependency.js +7 -8
  204. package/lib/dependencies/ExternalModuleDependency.js +9 -5
  205. package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
  206. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
  207. package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
  208. package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
  209. package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
  210. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +15 -11
  211. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +78 -12
  212. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  213. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  214. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +159 -71
  215. package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
  216. package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
  217. package/lib/dependencies/HarmonyExports.js +7 -4
  218. package/lib/dependencies/HarmonyImportDependency.js +28 -20
  219. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
  220. package/lib/dependencies/HarmonyImportGuard.js +21 -30
  221. package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -9
  222. package/lib/dependencies/HarmonyImportSpecifierDependency.js +106 -55
  223. package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
  224. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
  225. package/lib/dependencies/HtmlEntryDependency.js +37 -29
  226. package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
  227. package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
  228. package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
  229. package/lib/dependencies/HtmlSourceDependency.js +22 -14
  230. package/lib/dependencies/ImportContextDependency.js +2 -2
  231. package/lib/dependencies/ImportDependency.js +24 -20
  232. package/lib/dependencies/ImportEagerDependency.js +6 -9
  233. package/lib/dependencies/ImportMetaContextDependency.js +2 -2
  234. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
  235. package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
  236. package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
  237. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
  238. package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
  239. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
  240. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
  241. package/lib/dependencies/ImportMetaPlugin.js +154 -71
  242. package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
  243. package/lib/dependencies/ImportParserPlugin.js +49 -35
  244. package/lib/dependencies/ImportPhase.js +12 -5
  245. package/lib/dependencies/ImportPlugin.js +7 -3
  246. package/lib/dependencies/ImportWeakDependency.js +6 -9
  247. package/lib/dependencies/JsonExportsDependency.js +11 -7
  248. package/lib/dependencies/LoaderDependency.js +2 -2
  249. package/lib/dependencies/LoaderImportDependency.js +2 -2
  250. package/lib/dependencies/LoaderPlugin.js +11 -7
  251. package/lib/dependencies/LocalModuleDependency.js +5 -5
  252. package/lib/dependencies/LocalModulesHelpers.js +1 -1
  253. package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
  254. package/lib/dependencies/ModuleDependency.js +9 -6
  255. package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
  256. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
  257. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  258. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
  259. package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
  260. package/lib/dependencies/NullDependency.js +3 -3
  261. package/lib/dependencies/ProvidedDependency.js +14 -10
  262. package/lib/dependencies/PureExpressionDependency.js +9 -10
  263. package/lib/dependencies/RequireContextDependency.js +2 -2
  264. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
  265. package/lib/dependencies/RequireContextPlugin.js +8 -4
  266. package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
  267. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
  268. package/lib/dependencies/RequireEnsureDependency.js +8 -7
  269. package/lib/dependencies/RequireEnsurePlugin.js +7 -3
  270. package/lib/dependencies/RequireHeaderDependency.js +51 -12
  271. package/lib/dependencies/RequireIncludeDependency.js +6 -6
  272. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
  273. package/lib/dependencies/RequireIncludePlugin.js +7 -3
  274. package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
  275. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  276. package/lib/dependencies/RequireResolveDependency.js +4 -4
  277. package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
  278. package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
  279. package/lib/dependencies/StaticExportsDependency.js +2 -2
  280. package/lib/dependencies/SystemPlugin.js +10 -6
  281. package/lib/dependencies/SystemRuntimeModule.js +10 -0
  282. package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
  283. package/lib/dependencies/URLContextDependency.js +2 -2
  284. package/lib/dependencies/URLDependency.js +110 -64
  285. package/lib/dependencies/URLPlugin.js +7 -3
  286. package/lib/dependencies/UnsupportedDependency.js +4 -4
  287. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
  288. package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
  289. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
  290. package/lib/dependencies/WorkerAndWorkletPlugin.js +46 -28
  291. package/lib/dependencies/WorkerDependency.js +28 -22
  292. package/lib/dependencies/WorkletDependency.js +15 -14
  293. package/lib/dependencies/getFunctionExpression.js +8 -4
  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/DuplicateModulesWarning.js +45 -0
  316. package/lib/errors/DynamicExportsWarning.js +30 -0
  317. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  318. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  319. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  320. package/lib/errors/EvalUsageWarning.js +28 -0
  321. package/lib/errors/HookWebpackError.js +5 -5
  322. package/lib/errors/HotspotsWarning.js +57 -0
  323. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  324. package/lib/errors/InlinedAssetsWarning.js +36 -0
  325. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  326. package/lib/errors/LargeModulesWarning.js +45 -0
  327. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  328. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  329. package/lib/errors/MixedExportsWarning.js +41 -0
  330. package/lib/errors/ModuleDependencyError.js +13 -16
  331. package/lib/errors/ModuleDependencyWarning.js +5 -15
  332. package/lib/errors/ModuleHashingError.js +1 -1
  333. package/lib/errors/ModuleNotFoundError.js +2 -2
  334. package/lib/errors/ModuleParseError.js +1 -2
  335. package/lib/errors/ModuleRestoreError.js +1 -1
  336. package/lib/errors/ModuleStoreError.js +1 -1
  337. package/lib/errors/NodeStuffInWebError.js +1 -1
  338. package/lib/errors/OsDependentRuleWarning.js +31 -0
  339. package/lib/errors/PureAnnotationsWarning.js +36 -0
  340. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  341. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  342. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  343. package/lib/errors/TinyChunksWarning.js +40 -0
  344. package/lib/errors/TopLevelThisWarning.js +34 -0
  345. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  346. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  347. package/lib/errors/UnusedAliasesWarning.js +29 -0
  348. package/lib/errors/UnusedDefinesWarning.js +29 -0
  349. package/lib/errors/UnusedExternalsWarning.js +29 -0
  350. package/lib/errors/UnusedReexportsWarning.js +42 -0
  351. package/lib/errors/UnusedRuleWarning.js +29 -0
  352. package/lib/errors/WebpackError.js +9 -5
  353. package/lib/errors/deriveStackFromNestedError.js +90 -0
  354. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  355. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  356. package/lib/esm/ModuleChunkLoadingPlugin.js +89 -51
  357. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +170 -71
  358. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  359. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  360. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  361. package/lib/hmr/lazyCompilationBackend.js +28 -10
  362. package/lib/hmr/parserHooks.js +56 -0
  363. package/lib/html/HtmlGenerator.js +299 -79
  364. package/lib/html/HtmlModule.js +7 -3
  365. package/lib/html/HtmlModulesPlugin.js +312 -174
  366. package/lib/html/HtmlParser.js +31 -86
  367. package/lib/html/data.js +1928 -0
  368. package/lib/html/htmlMinify.js +288 -0
  369. package/lib/html/syntax.js +7819 -3331
  370. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  371. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  372. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  373. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  374. package/lib/ids/IdHelpers.js +31 -18
  375. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  376. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  377. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  378. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  379. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  380. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  381. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  382. package/lib/index.js +10 -0
  383. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  384. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  385. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  386. package/lib/javascript/ChunkHelpers.js +1 -1
  387. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  388. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  389. package/lib/javascript/JavascriptGenerator.js +65 -165
  390. package/lib/javascript/JavascriptModule.js +9 -3
  391. package/lib/javascript/JavascriptModulesPlugin.js +181 -162
  392. package/lib/javascript/JavascriptParser.js +291 -112
  393. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  394. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  395. package/lib/javascript/StartupHelpers.js +55 -9
  396. package/lib/javascript/syntax.js +3403 -300
  397. package/lib/json/JsonData.js +8 -4
  398. package/lib/json/JsonGenerator.js +38 -16
  399. package/lib/json/JsonModule.js +7 -3
  400. package/lib/json/JsonModulesPlugin.js +1 -1
  401. package/lib/json/JsonParser.js +5 -6
  402. package/lib/library/AbstractLibraryPlugin.js +20 -14
  403. package/lib/library/AmdLibraryPlugin.js +11 -7
  404. package/lib/library/AssignLibraryPlugin.js +19 -13
  405. package/lib/library/EnableLibraryPlugin.js +2 -2
  406. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  407. package/lib/library/JsonpLibraryPlugin.js +11 -7
  408. package/lib/library/ModuleLibraryPlugin.js +256 -64
  409. package/lib/library/SystemLibraryPlugin.js +12 -8
  410. package/lib/library/UmdLibraryPlugin.js +62 -25
  411. package/lib/loaders/LoaderRunner.js +14 -1
  412. package/lib/loaders/loadLoader.js +8 -4
  413. package/lib/logging/createConsoleLogger.js +7 -4
  414. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  415. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  416. package/lib/node/NodeSourcePlugin.js +1 -1
  417. package/lib/node/NodeTargetPlugin.js +4 -3
  418. package/lib/node/NodeTemplatePlugin.js +1 -1
  419. package/lib/node/NodeWatchFileSystem.js +70 -9
  420. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  421. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +81 -20
  422. package/lib/node/ReadFileCompileWasmPlugin.js +37 -17
  423. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  424. package/lib/node/nodeConsole.js +7 -3
  425. package/lib/optimize/AggressiveMergingPlugin.js +21 -17
  426. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  427. package/lib/optimize/ConcatenatedModule.js +996 -477
  428. package/lib/optimize/ConstExportsPlugin.js +11 -7
  429. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  430. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  431. package/lib/optimize/InlineExports.js +9 -5
  432. package/lib/optimize/InnerGraph.js +28 -12
  433. package/lib/optimize/InnerGraphPlugin.js +23 -18
  434. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  435. package/lib/optimize/MangleExportsPlugin.js +7 -8
  436. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  437. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  438. package/lib/optimize/ModuleConcatenationPlugin.js +124 -59
  439. package/lib/optimize/RealContentHashPlugin.js +20 -13
  440. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  441. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  442. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  443. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  444. package/lib/optimize/SplitChunksPlugin.js +232 -68
  445. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  446. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  447. package/lib/performance/BroadContextsPlugin.js +142 -0
  448. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  449. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  450. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  451. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  452. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  453. package/lib/performance/DynamicExportsPlugin.js +120 -0
  454. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  455. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  456. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  457. package/lib/performance/EvalUsagePlugin.js +115 -0
  458. package/lib/performance/HotspotsPlugin.js +296 -0
  459. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  460. package/lib/performance/LargeModulesPlugin.js +126 -0
  461. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  462. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  463. package/lib/performance/MixedExportsPlugin.js +136 -0
  464. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  465. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  466. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  467. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  468. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  469. package/lib/performance/SizeLimitsPlugin.js +139 -7
  470. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  471. package/lib/performance/TinyChunksPlugin.js +128 -0
  472. package/lib/performance/TopLevelThisPlugin.js +208 -0
  473. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  474. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  475. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  476. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  477. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  478. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  479. package/lib/performance/getModuleSize.js +22 -0
  480. package/lib/performance/getSourceModules.js +22 -0
  481. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  482. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  483. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  484. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  485. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  486. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  487. package/lib/prefetch/ResourceHintPlugin.js +377 -136
  488. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  489. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  490. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  491. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  492. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  493. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  494. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  495. package/lib/rules/RuleSetCompiler.js +146 -12
  496. package/lib/rules/UseEffectRulePlugin.js +18 -11
  497. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  498. package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
  499. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  500. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  501. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  502. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  503. package/lib/runtime/CompatRuntimeModule.js +5 -3
  504. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  505. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  506. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  507. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  508. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  509. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  510. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  511. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  512. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  513. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  514. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  515. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  516. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  517. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  518. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  519. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +23 -6
  520. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  521. package/lib/runtime/NonceRuntimeModule.js +10 -0
  522. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  523. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  524. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  525. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  526. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  527. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  528. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  529. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  530. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  531. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  532. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  533. package/lib/runtime/baseUri.js +63 -0
  534. package/lib/schemes/DataUriPlugin.js +1 -1
  535. package/lib/schemes/FileUriPlugin.js +1 -1
  536. package/lib/schemes/HttpUriPlugin.js +24 -15
  537. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  538. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  539. package/lib/serialization/BinaryMiddleware.js +274 -942
  540. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  541. package/lib/serialization/FileMiddleware.js +305 -66
  542. package/lib/serialization/ObjectMiddleware.js +139 -114
  543. package/lib/serialization/PlainObjectSerializer.js +19 -16
  544. package/lib/sharing/ConsumeSharedModule.js +30 -21
  545. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  546. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  547. package/lib/sharing/ProvideSharedModule.js +25 -16
  548. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  549. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  550. package/lib/sharing/SharePlugin.js +17 -5
  551. package/lib/sharing/ShareRuntimeModule.js +4 -4
  552. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  553. package/lib/sharing/utils.js +1 -3
  554. package/lib/stats/DefaultStatsFactoryPlugin.js +253 -226
  555. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  556. package/lib/stats/DefaultStatsPrinterPlugin.js +60 -192
  557. package/lib/stats/StatsFactory.js +56 -35
  558. package/lib/stats/StatsPrinter.js +16 -12
  559. package/lib/typescript/TypeScriptPlugin.js +12 -14
  560. package/lib/url/URLParserPlugin.js +26 -13
  561. package/lib/util/AsyncQueue.js +4 -3
  562. package/lib/util/Hash.js +5 -1
  563. package/lib/util/LazySet.js +35 -22
  564. package/lib/util/LocConverter.js +36 -13
  565. package/lib/util/SourceProcessor.js +1050 -24
  566. package/lib/util/StringXor.js +1 -1
  567. package/lib/util/chainedImports.js +9 -5
  568. package/lib/util/cleverMerge.js +1 -1
  569. package/lib/util/comparators.js +45 -14
  570. package/lib/util/concatenate.js +203 -77
  571. package/lib/util/conventions.js +5 -1
  572. package/lib/util/createHash.js +2 -2
  573. package/lib/util/createHooksRegistry.js +8 -10
  574. package/lib/util/dataURL.js +225 -1
  575. package/lib/util/extractSourceMap.js +4 -3
  576. package/lib/util/findCaseMismatch.js +139 -0
  577. package/lib/util/formatLocation.js +1 -2
  578. package/lib/util/fs.js +22 -5
  579. package/lib/util/globUtils.js +298 -24
  580. package/lib/util/hash/BatchedHash.js +5 -1
  581. package/lib/util/hash/BulkUpdateHash.js +5 -1
  582. package/lib/util/hash/DebugHash.js +5 -1
  583. package/lib/util/hash/hash-digest.js +6 -2
  584. package/lib/util/identifier.js +25 -1
  585. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  586. package/lib/util/internalSerializables.js +6 -0
  587. package/lib/util/lazyModule.js +56 -0
  588. package/lib/util/makeSerializable.js +7 -3
  589. package/lib/util/matchAlias.js +25 -0
  590. package/lib/util/mimeTypes.js +11 -5
  591. package/lib/util/nonNumericOnlyHash.js +4 -3
  592. package/lib/util/parseJson.js +5 -3
  593. package/lib/util/preloadModuleType.js +32 -0
  594. package/lib/util/registerExternalSerializer.js +7 -5
  595. package/lib/util/runtime.js +2 -2
  596. package/lib/util/semver.js +1 -1
  597. package/lib/util/serialization.js +28 -28
  598. package/lib/util/source.js +2 -2
  599. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  600. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  601. package/lib/wasm/wasmModuleFilename.js +54 -0
  602. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +41 -21
  603. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +43 -21
  604. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  605. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  606. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  607. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  608. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  609. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +34 -8
  610. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  611. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  612. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  613. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  614. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  615. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  616. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  617. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  618. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  619. package/lib/web/FetchCompileAsyncWasmPlugin.js +101 -19
  620. package/lib/web/FetchCompileWasmPlugin.js +46 -16
  621. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  622. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  623. package/lib/web/JsonpTemplatePlugin.js +2 -2
  624. package/lib/webpack.js +22 -11
  625. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  626. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  627. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  628. package/module.d.ts +1 -0
  629. package/package.json +37 -30
  630. package/schemas/WebpackOptions.check.js +1 -1
  631. package/schemas/WebpackOptions.json +780 -91
  632. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  633. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  634. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  635. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  636. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  637. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  638. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  639. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  640. package/types.d.ts +4013 -738
  641. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -7,6 +7,7 @@
7
7
 
8
8
  const FileSystemInfo = require("../FileSystemInfo");
9
9
  const ProgressPlugin = require("../ProgressPlugin");
10
+ const { getReferencedFilenames } = require("../serialization/FileMiddleware");
10
11
  const SerializerMiddleware = require("../serialization/SerializerMiddleware");
11
12
  const LazySet = require("../util/LazySet");
12
13
  const formatSize = require("../util/formatSize");
@@ -17,33 +18,51 @@ const {
17
18
  createFileSerializer
18
19
  } = require("../util/serialization");
19
20
 
20
- /** @typedef {import("../../declarations/WebpackOptions").SnapshotOptions} SnapshotOptions */
21
- /** @typedef {import("../Compilation").FileSystemDependencies} FileSystemDependencies */
22
- /** @typedef {import("../Cache").Data} Data */
23
- /** @typedef {import("../Cache").Etag} Etag */
24
- /** @typedef {import("../Compiler")} Compiler */
25
- /** @typedef {import("../FileSystemInfo").ResolveBuildDependenciesResult} ResolveBuildDependenciesResult */
26
- /** @typedef {import("../FileSystemInfo").ResolveResults} ResolveResults */
27
- /** @typedef {import("../FileSystemInfo").Snapshot} Snapshot */
28
- /** @typedef {import("../logging/Logger").Logger} Logger */
29
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
30
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
31
- /** @typedef {import("../util/Hash").HashFunction} HashFunction */
32
- /** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */
21
+ /** @import { SnapshotOptions } from "../../declarations/WebpackOptions" */
22
+ /** @import { FileSystemDependencies } from "../Compilation" */
23
+ /** @import { Data, Etag } from "../Cache" */
24
+ /** @import Compiler from "../Compiler" */
25
+ /**
26
+ * @import {
27
+ * ResolveBuildDependenciesResult,
28
+ * ResolveResults,
29
+ * Snapshot
30
+ * } from "../FileSystemInfo"
31
+ */
32
+ /** @import { Logger } from "../logging/Logger" */
33
+ /**
34
+ * @import {
35
+ * ObjectDeserializerContext,
36
+ * ObjectSerializerContext
37
+ * } from "../serialization/ObjectMiddleware"
38
+ */
39
+ /** @import { HashFunction } from "../util/Hash" */
40
+ /** @import { IntermediateFileSystem } from "../util/fs" */
33
41
 
34
42
  /** @typedef {Set<string>} Items */
35
43
  /** @typedef {Set<string>} BuildDependencies */
36
44
  /** @typedef {Map<string, PackItemInfo>} ItemInfo */
45
+ /** @typedef {{ firstSeen: number, size: number }} UnreferencedFile */
46
+ /** @typedef {Map<string, UnreferencedFile>} UnreferencedFiles */
47
+
48
+ // Unreferenced files are kept for this long to not race concurrent builds sharing the cache directory.
49
+ const CLEANUP_GRACE_PERIOD = 30 * 60 * 1000;
50
+ // Records when each unreferenced file was first seen. Aging by recorded time keeps
51
+ // orphans expiring across caches restored with refreshed modification times.
52
+ const UNREFERENCED_FILE = "unreferenced.json";
53
+ // A file written this recently may belong to a concurrent build that reused the name,
54
+ // in which case the recorded time describes the previous file and must not be trusted.
55
+ const CLEANUP_RECENT_WRITE_PERIOD = 60 * 1000;
37
56
 
38
57
  class PackContainer {
39
58
  /**
40
59
  * Creates an instance of PackContainer.
41
60
  * @param {Pack} data stored data
42
61
  * @param {string} version version identifier
43
- * @param {Snapshot} buildSnapshot snapshot of all build dependencies
62
+ * @param {InstanceType<Snapshot>} buildSnapshot snapshot of all build dependencies
44
63
  * @param {BuildDependencies} buildDependencies list of all unresolved build dependencies captured
45
64
  * @param {ResolveResults} resolveResults result of the resolved build dependencies
46
- * @param {Snapshot} resolveBuildDependenciesSnapshot snapshot of the dependencies of the build dependencies resolving
65
+ * @param {InstanceType<Snapshot>} resolveBuildDependenciesSnapshot snapshot of the dependencies of the build dependencies resolving
47
66
  */
48
67
  constructor(
49
68
  data,
@@ -57,13 +76,13 @@ class PackContainer {
57
76
  this.data = data;
58
77
  /** @type {string} */
59
78
  this.version = version;
60
- /** @type {Snapshot} */
79
+ /** @type {InstanceType<Snapshot>} */
61
80
  this.buildSnapshot = buildSnapshot;
62
81
  /** @type {BuildDependencies} */
63
82
  this.buildDependencies = buildDependencies;
64
83
  /** @type {ResolveResults} */
65
84
  this.resolveResults = resolveResults;
66
- /** @type {Snapshot} */
85
+ /** @type {InstanceType<Snapshot>} */
67
86
  this.resolveBuildDependenciesSnapshot = resolveBuildDependenciesSnapshot;
68
87
  }
69
88
 
@@ -569,6 +588,41 @@ class Pack {
569
588
  }
570
589
  }
571
590
 
591
+ /**
592
+ * Drops every content whose items all expired. Unlike a partial collection this
593
+ * never unpacks, so it is not limited to a single content per store and lets a
594
+ * long unused cache shrink in one go instead of one pack per build.
595
+ */
596
+ _gcExpiredContent() {
597
+ const now = Date.now();
598
+ let packCount = 0;
599
+ let itemCount = 0;
600
+ for (let loc = 0; loc < this.content.length; loc++) {
601
+ const content = this.content[loc];
602
+ if (!content) continue;
603
+ let expired = true;
604
+ for (const identifier of content.items) {
605
+ const info = this.itemInfo.get(identifier);
606
+ if (info !== undefined && now - info.lastAccess <= this.maxAge) {
607
+ expired = false;
608
+ break;
609
+ }
610
+ }
611
+ if (!expired) continue;
612
+ for (const identifier of content.items) this.itemInfo.delete(identifier);
613
+ this.content[loc] = undefined;
614
+ packCount++;
615
+ itemCount += content.items.size;
616
+ }
617
+ if (packCount > 0) {
618
+ this.logger.log(
619
+ "Garbage Collected %d completely expired packs with %d items",
620
+ packCount,
621
+ itemCount
622
+ );
623
+ }
624
+ }
625
+
572
626
  /**
573
627
  * Find the content with the oldest item and run GC on that.
574
628
  * Only runs for one content to avoid large invalidation.
@@ -581,11 +635,10 @@ class Pack {
581
635
  oldest = info;
582
636
  }
583
637
  }
584
- if (
585
- Date.now() - /** @type {PackItemInfo} */ (oldest).lastAccess >
586
- this.maxAge
587
- ) {
588
- const loc = /** @type {PackItemInfo} */ (oldest).location;
638
+ // collecting expired content may have left no items at all
639
+ if (oldest === undefined) return;
640
+ if (Date.now() - oldest.lastAccess > this.maxAge) {
641
+ const loc = oldest.location;
589
642
  if (loc < 0) return;
590
643
  const content = /** @type {PackContent} */ (this.content[loc]);
591
644
  const items = new Set(content.items);
@@ -621,6 +674,7 @@ class Pack {
621
674
  this._persistFreshContent();
622
675
  this._optimizeSmallContent();
623
676
  this._optimizeUnusedContent();
677
+ this._gcExpiredContent();
624
678
  this._gcOldestContent();
625
679
  for (const identifier of this.itemInfo.keys()) {
626
680
  write(identifier);
@@ -1166,6 +1220,8 @@ class PackFileCacheStrategy {
1166
1220
  });
1167
1221
  /** @type {Compiler} */
1168
1222
  this.compiler = compiler;
1223
+ /** @type {IntermediateFileSystem} */
1224
+ this.fs = fs;
1169
1225
  /** @type {string} */
1170
1226
  this.context = context;
1171
1227
  /** @type {string} */
@@ -1182,6 +1238,10 @@ class PackFileCacheStrategy {
1182
1238
  this.readonly = readonly;
1183
1239
  /** @type {boolean | undefined} */
1184
1240
  this.allowCollectingMemory = allowCollectingMemory;
1241
+ // referenced names per on-disk file, versioned by mtime since concurrent
1242
+ // processes may rewrite packs in place under the same name
1243
+ /** @type {Map<string, { mtimeMs: number, referenced: string[] }>} */
1244
+ this._referencedFilesCache = new Map();
1185
1245
  /** @type {false | "gzip" | "brotli" | "zstd" | undefined} */
1186
1246
  this.compression = compression;
1187
1247
  // eslint-disable-next-line n/no-unsupported-features/node-builtins
@@ -1203,11 +1263,11 @@ class PackFileCacheStrategy {
1203
1263
  this.buildDependencies = new Set();
1204
1264
  /** @type {FileSystemDependencies} */
1205
1265
  this.newBuildDependencies = new LazySet();
1206
- /** @type {Snapshot | undefined} */
1266
+ /** @type {InstanceType<Snapshot> | undefined} */
1207
1267
  this.resolveBuildDependenciesSnapshot = undefined;
1208
1268
  /** @type {ResolveResults | undefined} */
1209
1269
  this.resolveResults = undefined;
1210
- /** @type {Snapshot | undefined} */
1270
+ /** @type {InstanceType<Snapshot> | undefined} */
1211
1271
  this.buildSnapshot = undefined;
1212
1272
  /** @type {Promise<Pack> | undefined} */
1213
1273
  this.packPromise = this._openPack();
@@ -1232,13 +1292,13 @@ class PackFileCacheStrategy {
1232
1292
  */
1233
1293
  _openPack() {
1234
1294
  const { logger, profile, cacheLocation, version } = this;
1235
- /** @type {Snapshot} */
1295
+ /** @type {InstanceType<Snapshot>} */
1236
1296
  let buildSnapshot;
1237
1297
  /** @type {BuildDependencies} */
1238
1298
  let buildDependencies;
1239
1299
  /** @type {BuildDependencies} */
1240
1300
  let newBuildDependencies;
1241
- /** @type {Snapshot} */
1301
+ /** @type {InstanceType<Snapshot>} */
1242
1302
  let resolveBuildDependenciesSnapshot;
1243
1303
  /** @type {ResolveResults | undefined} */
1244
1304
  let resolveResults;
@@ -1580,18 +1640,25 @@ class PackFileCacheStrategy {
1580
1640
  const content = new PackContainer(
1581
1641
  pack,
1582
1642
  this.version,
1583
- /** @type {Snapshot} */
1643
+ /** @type {InstanceType<Snapshot>} */
1584
1644
  (this.buildSnapshot),
1585
1645
  updatedBuildDependencies,
1586
1646
  /** @type {ResolveResults} */
1587
1647
  (this.resolveResults),
1588
- /** @type {Snapshot} */
1648
+ /** @type {InstanceType<Snapshot>} */
1589
1649
  (this.resolveBuildDependenciesSnapshot)
1590
1650
  );
1651
+ const cleanup = this.fs.unlink !== undefined;
1652
+ /** @type {Set<string> | undefined} */
1653
+ const writtenFiles = cleanup ? new Set() : undefined;
1654
+ /** @type {Set<string> | undefined} */
1655
+ const retainedFiles = cleanup ? new Set() : undefined;
1591
1656
  return this.fileSerializer
1592
1657
  .serialize(content, {
1593
1658
  filename: `${this.cacheLocation}/index${this._extension}`,
1594
1659
  extension: `${this._extension}`,
1660
+ writtenFiles,
1661
+ retainedFiles,
1595
1662
  logger: this.logger,
1596
1663
  profile: this.profile
1597
1664
  })
@@ -1608,9 +1675,17 @@ class PackFileCacheStrategy {
1608
1675
  stats.count,
1609
1676
  Math.round(stats.size / 1024 / 1024)
1610
1677
  );
1678
+ if (writtenFiles !== undefined) {
1679
+ return this._cleanupUnusedFiles(
1680
+ writtenFiles,
1681
+ /** @type {Set<string>} */ (retainedFiles)
1682
+ );
1683
+ }
1611
1684
  })
1612
1685
  .catch((err) => {
1613
1686
  this.logger.timeEnd("store pack");
1687
+ // files may be in an unknown state after a failed store
1688
+ this._referencedFilesCache.clear();
1614
1689
  this.logger.warn(`Caching failed for pack: ${err}`);
1615
1690
  this.logger.debug(err.stack);
1616
1691
  });
@@ -1622,6 +1697,192 @@ class PackFileCacheStrategy {
1622
1697
  }));
1623
1698
  }
1624
1699
 
1700
+ /**
1701
+ * Reads when the currently unreferenced files were first seen. A missing or
1702
+ * unreadable file just restarts the grace period for every orphan.
1703
+ * @returns {Promise<UnreferencedFiles>} first seen time and size per file name
1704
+ */
1705
+ _readUnreferencedFiles() {
1706
+ return new Promise((resolve) => {
1707
+ this.fs.readFile(
1708
+ `${this.cacheLocation}/${UNREFERENCED_FILE}`,
1709
+ (err, content) => {
1710
+ /** @type {UnreferencedFiles} */
1711
+ const result = new Map();
1712
+ if (err) return resolve(result);
1713
+ try {
1714
+ const data = JSON.parse(
1715
+ /** @type {Buffer} */ (content).toString("utf8")
1716
+ );
1717
+ for (const [file, entry] of Object.entries(data)) {
1718
+ const { firstSeen, size } = /** @type {UnreferencedFile} */ (
1719
+ entry
1720
+ );
1721
+ if (typeof firstSeen === "number" && typeof size === "number") {
1722
+ result.set(file, { firstSeen, size });
1723
+ }
1724
+ }
1725
+ } catch (_err) {
1726
+ result.clear();
1727
+ }
1728
+ resolve(result);
1729
+ }
1730
+ );
1731
+ });
1732
+ }
1733
+
1734
+ /**
1735
+ * Persists when the still unreferenced files were first seen. Failing to write
1736
+ * only costs the orphans another grace period, so errors are ignored.
1737
+ * @param {UnreferencedFiles} unreferenced first seen time and size per file name
1738
+ * @param {boolean} hadEntries whether a previous state exists that must be replaced
1739
+ * @returns {Promise<void>} promise
1740
+ */
1741
+ _writeUnreferencedFiles(unreferenced, hadEntries) {
1742
+ if (unreferenced.size === 0 && !hadEntries) return Promise.resolve();
1743
+ /** @type {Record<string, UnreferencedFile>} */
1744
+ const data = {};
1745
+ for (const [file, entry] of unreferenced) data[file] = entry;
1746
+ return new Promise((resolve) => {
1747
+ this.fs.writeFile(
1748
+ `${this.cacheLocation}/${UNREFERENCED_FILE}`,
1749
+ JSON.stringify(data),
1750
+ () => resolve()
1751
+ );
1752
+ });
1753
+ }
1754
+
1755
+ /**
1756
+ * Deletes files from the cache directory that are no longer referenced by the
1757
+ * stored pack. Retained files are walked on disk since nested lazy segments
1758
+ * reference files not visible during serialization. Errors only log a warning.
1759
+ * @param {Set<string>} writtenNames names (without extension) written by this store
1760
+ * @param {Set<string>} retainedNames names (without extension) referenced but not rewritten
1761
+ * @returns {Promise<void>} promise
1762
+ */
1763
+ async _cleanupUnusedFiles(writtenNames, retainedNames) {
1764
+ this.logger.time("cleanup unused cache files");
1765
+ const fs = this.fs;
1766
+ const extension = this._extension;
1767
+ const cacheLocation = this.cacheLocation;
1768
+ const referencedFilesCache = this._referencedFilesCache;
1769
+ try {
1770
+ // rewritten files may reference different names now
1771
+ for (const name of writtenNames) referencedFilesCache.delete(name);
1772
+ /** @type {Set<string>} */
1773
+ const liveFiles = new Set([`index${extension}`, UNREFERENCED_FILE]);
1774
+ for (const name of writtenNames) liveFiles.add(`${name}${extension}`);
1775
+ /** @type {string[]} */
1776
+ const queue = [];
1777
+ /**
1778
+ * Marks a file live and queues it for walking its references.
1779
+ * @param {string} name file name without extension
1780
+ */
1781
+ const enqueue = (name) => {
1782
+ const file = `${name}${extension}`;
1783
+ if (liveFiles.has(file)) return;
1784
+ liveFiles.add(file);
1785
+ queue.push(name);
1786
+ };
1787
+ for (const name of retainedNames) enqueue(name);
1788
+ while (queue.length > 0) {
1789
+ const name = /** @type {string} */ (queue.pop());
1790
+ const file = `${cacheLocation}/${name}${extension}`;
1791
+ // an unchanged mtime proves the memo entry still matches the disk
1792
+ const mtimeMs = await new Promise((resolve, reject) => {
1793
+ fs.stat(file, (err, stats) => {
1794
+ if (err) return reject(err);
1795
+ resolve(
1796
+ /** @type {number} */ (
1797
+ /** @type {import("../util/fs").IStats} */ (stats).mtimeMs
1798
+ )
1799
+ );
1800
+ });
1801
+ });
1802
+ const entry = referencedFilesCache.get(name);
1803
+ let referenced;
1804
+ if (entry !== undefined && entry.mtimeMs === mtimeMs) {
1805
+ referenced = entry.referenced;
1806
+ } else {
1807
+ referenced = await getReferencedFilenames(fs, file);
1808
+ referencedFilesCache.set(name, { mtimeMs, referenced });
1809
+ }
1810
+ for (const referencedName of referenced) enqueue(referencedName);
1811
+ }
1812
+ const files = await new Promise((resolve, reject) => {
1813
+ fs.readdir(cacheLocation, (err, files) => {
1814
+ if (err) return reject(err);
1815
+ resolve(/** @type {string[]} */ (files));
1816
+ });
1817
+ });
1818
+ const seenFiles = await this._readUnreferencedFiles();
1819
+ const now = Date.now();
1820
+ // every store rewrites the index backup, so a recorded time would age a file
1821
+ // that is in fact new; renaming carries the previous index mtime onto it
1822
+ const indexBackup = `index${extension}.old`;
1823
+ /** @type {UnreferencedFiles} */
1824
+ const stillUnreferenced = new Map();
1825
+ let deletedCount = 0;
1826
+ for (const file of files) {
1827
+ if (typeof file !== "string" || liveFiles.has(file)) continue;
1828
+ const path = `${cacheLocation}/${file}`;
1829
+ const stats = await new Promise((resolve) => {
1830
+ fs.stat(path, (err, stats) => {
1831
+ resolve(
1832
+ err
1833
+ ? undefined
1834
+ : /** @type {import("../util/fs").IStats} */ (stats)
1835
+ );
1836
+ });
1837
+ });
1838
+ if (stats === undefined || !stats.isFile()) continue;
1839
+ const size = /** @type {number} */ (stats.size);
1840
+ const seen = seenFiles.get(file);
1841
+ // a differing size means the name was rewritten, so it is a new orphan
1842
+ const firstSeen =
1843
+ seen !== undefined && seen.size === size ? seen.firstSeen : now;
1844
+ const expireTime = now - CLEANUP_GRACE_PERIOD;
1845
+ const mtimeMs = /** @type {number} */ (stats.mtimeMs);
1846
+ // either signal is enough: modification times are lost when a cache is
1847
+ // restored, and recorded times are lost when the cache directory is new
1848
+ const expired =
1849
+ mtimeMs <= expireTime ||
1850
+ (file !== indexBackup &&
1851
+ firstSeen <= expireTime &&
1852
+ mtimeMs <= now - CLEANUP_RECENT_WRITE_PERIOD);
1853
+ if (expired) {
1854
+ const deleted = await new Promise((resolve) => {
1855
+ /** @type {NonNullable<IntermediateFileSystem["unlink"]>} */
1856
+ (fs.unlink)(path, (err) => resolve(!err));
1857
+ });
1858
+ if (deleted) {
1859
+ deletedCount++;
1860
+ continue;
1861
+ }
1862
+ }
1863
+ if (file !== indexBackup) {
1864
+ stillUnreferenced.set(file, { firstSeen, size });
1865
+ }
1866
+ }
1867
+ await this._writeUnreferencedFiles(stillUnreferenced, seenFiles.size > 0);
1868
+ // drop entries of files that are no longer alive
1869
+ for (const name of referencedFilesCache.keys()) {
1870
+ if (!liveFiles.has(`${name}${extension}`)) {
1871
+ referencedFilesCache.delete(name);
1872
+ }
1873
+ }
1874
+ if (deletedCount > 0) {
1875
+ this.logger.log("Deleted %d unused cache files", deletedCount);
1876
+ }
1877
+ } catch (err) {
1878
+ this.logger.warn(
1879
+ `Cleanup of unused cache files failed: ${/** @type {Error} */ (err)}`
1880
+ );
1881
+ this.logger.debug(/** @type {Error} */ (err).stack);
1882
+ }
1883
+ this.logger.timeEnd("cleanup unused cache files");
1884
+ }
1885
+
1625
1886
  clear() {
1626
1887
  this.fileSystemInfo.clear();
1627
1888
  this.buildDependencies.clear();
@@ -8,18 +8,29 @@
8
8
  const LazySet = require("../util/LazySet");
9
9
  const makeSerializable = require("../util/makeSerializable");
10
10
 
11
- /** @typedef {import("enhanced-resolve").ResolveContext} ResolveContext */
12
- /** @typedef {import("enhanced-resolve").ResolveOptions} ResolveOptions */
13
- /** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */
14
- /** @typedef {import("enhanced-resolve").Resolver} Resolver */
15
- /** @typedef {import("../CacheFacade").ItemCacheFacade} ItemCacheFacade */
16
- /** @typedef {import("../Compiler")} Compiler */
17
- /** @typedef {import("../FileSystemInfo")} FileSystemInfo */
18
- /** @typedef {import("../FileSystemInfo").Snapshot} Snapshot */
19
- /** @typedef {import("../FileSystemInfo").SnapshotOptions} SnapshotOptions */
20
- /** @typedef {import("../ResolverFactory").ResolveOptionsWithDependencyType} ResolveOptionsWithDependencyType */
21
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
22
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
11
+ /**
12
+ * @import {
13
+ * ResolveContext,
14
+ * ResolveOptions,
15
+ * ResolveRequest,
16
+ * Resolver
17
+ * } from "enhanced-resolve"
18
+ */
19
+ /** @import { ItemCacheFacade } from "../CacheFacade" */
20
+ /** @import Compiler from "../Compiler" */
21
+ /**
22
+ * @import FileSystemInfo, {
23
+ * Snapshot,
24
+ * SnapshotOptions
25
+ * } from "../FileSystemInfo"
26
+ */
27
+ /** @import { ResolveOptionsWithDependencyType } from "../ResolverFactory" */
28
+ /**
29
+ * @import {
30
+ * ObjectDeserializerContext,
31
+ * ObjectSerializerContext
32
+ * } from "../serialization/ObjectMiddleware"
33
+ */
23
34
 
24
35
  /**
25
36
  * Defines the sync hook type used by this module.
@@ -33,12 +44,12 @@ class CacheEntry {
33
44
  /**
34
45
  * Creates an instance of CacheEntry.
35
46
  * @param {ResolveRequest} result result
36
- * @param {Snapshot} snapshot snapshot
47
+ * @param {InstanceType<Snapshot>} snapshot snapshot
37
48
  */
38
49
  constructor(result, snapshot) {
39
50
  /** @type {ResolveRequest} */
40
51
  this.result = result;
41
- /** @type {Snapshot} */
52
+ /** @type {InstanceType<Snapshot>} */
42
53
  this.snapshot = snapshot;
43
54
  }
44
55
 
@@ -112,7 +123,7 @@ class ResolverCachePlugin {
112
123
  */
113
124
  apply(compiler) {
114
125
  const cache = compiler.getCache(PLUGIN_NAME);
115
- /** @type {FileSystemInfo} */
126
+ /** @type {FileSystemInfo | undefined} */
116
127
  let fileSystemInfo;
117
128
  /** @type {SnapshotOptions | undefined} */
118
129
  let snapshotOptions;
@@ -120,6 +131,12 @@ class ResolverCachePlugin {
120
131
  let cachedResolves = 0;
121
132
  let cacheInvalidResolves = 0;
122
133
  let concurrentResolves = 0;
134
+ // FileSystemInfo reaches the whole Compilation through its logger, so this
135
+ // compiler-lifetime closure would outlive what `Compiler.close()` releases.
136
+ compiler.hooks.shutdown.tap(PLUGIN_NAME, () => {
137
+ fileSystemInfo = undefined;
138
+ snapshotOptions = undefined;
139
+ });
123
140
  compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
124
141
  snapshotOptions = compilation.options.snapshot.resolve;
125
142
  fileSystemInfo = compilation.fileSystemInfo;
@@ -144,7 +161,7 @@ class ResolverCachePlugin {
144
161
 
145
162
  /**
146
163
  * Processes the provided item cache.
147
- * @param {ItemCacheFacade} itemCache cache
164
+ * @param {InstanceType<ItemCacheFacade>} itemCache cache
148
165
  * @param {Resolver} resolver the resolver
149
166
  * @param {ResolveContext} resolveContext context for resolving meta info
150
167
  * @param {ResolveRequest} request the request info object
@@ -209,7 +226,9 @@ class ResolverCachePlugin {
209
226
  const fileDependencies = newResolveContext.fileDependencies;
210
227
  const contextDependencies = newResolveContext.contextDependencies;
211
228
  const missingDependencies = newResolveContext.missingDependencies;
212
- fileSystemInfo.createSnapshot(
229
+ // Only reachable past the `!fileSystemInfo` guard on the resolve tap.
230
+ const fsInfo = /** @type {FileSystemInfo} */ (fileSystemInfo);
231
+ fsInfo.createSnapshot(
213
232
  resolveTime,
214
233
  /** @type {Dependencies} */
215
234
  (fileDependencies),
@@ -395,7 +414,8 @@ class ResolverCachePlugin {
395
414
 
396
415
  if (cacheEntry) {
397
416
  const { snapshot, result } = cacheEntry;
398
- fileSystemInfo.checkSnapshotValid(snapshot, (err, valid) => {
417
+ const fsInfo = /** @type {FileSystemInfo} */ (fileSystemInfo);
418
+ fsInfo.checkSnapshotValid(snapshot, (err, valid) => {
399
419
  if (err || !valid) {
400
420
  cacheInvalidResolves++;
401
421
  return doRealResolve(
@@ -8,9 +8,8 @@
8
8
  const { DEFAULTS } = require("../config/defaults");
9
9
  const createHash = require("../util/createHash");
10
10
 
11
- /** @typedef {import("../util/Hash")} Hash */
11
+ /** @import Hash, { HashFunction } from "../util/Hash" */
12
12
  /** @typedef {typeof import("../util/Hash")} HashConstructor */
13
- /** @typedef {import("../util/Hash").HashFunction} HashFunction */
14
13
 
15
14
  /**
16
15
  * Represents the lazy hashed etag runtime component.
@@ -5,7 +5,7 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- /** @typedef {import("../Cache").Etag} Etag */
8
+ /** @import { Etag } from "../Cache" */
9
9
 
10
10
  class MergedEtag {
11
11
  /**
package/lib/cli.js CHANGED
@@ -11,9 +11,7 @@ const webpackSchema =
11
11
  /** @type {EXPECTED_ANY} */
12
12
  (require("../schemas/WebpackOptions.json"));
13
13
 
14
- /** @typedef {import("json-schema").JSONSchema4} JSONSchema4 */
15
- /** @typedef {import("json-schema").JSONSchema6} JSONSchema6 */
16
- /** @typedef {import("json-schema").JSONSchema7} JSONSchema7 */
14
+ /** @import { JSONSchema4, JSONSchema6, JSONSchema7 } from "json-schema" */
17
15
  /** @typedef {JSONSchema4 | JSONSchema6 | JSONSchema7} JSONSchema */
18
16
  /** @typedef {JSONSchema & { absolutePath: boolean, instanceof: string, cli: { helper?: boolean, exclude?: boolean, description?: string, negatedDescription?: string, resetDescription?: string } }} Schema */
19
17
 
@@ -8,13 +8,23 @@
8
8
  const path = require("path");
9
9
  const browserslist = require("browserslist");
10
10
 
11
- /** @typedef {import("./target").ApiTargetProperties} ApiTargetProperties */
12
- /** @typedef {import("./target").EcmaTargetProperties} EcmaTargetProperties */
13
- /** @typedef {import("./target").PlatformTargetProperties} PlatformTargetProperties */
11
+ /**
12
+ * @import {
13
+ * ApiTargetProperties,
14
+ * EcmaTargetProperties,
15
+ * PlatformTargetProperties
16
+ * } from "./target"
17
+ */
14
18
 
15
19
  // [[C:]/path/to/config][:env]
16
20
  const inputRx = /^(?:((?:[A-Z]:)?[/\\].*?))?(?::(.+?))?$/i;
17
21
 
22
+ // One resolution per `[input, context]` — several callers ask for the same
23
+ // target, and each miss re-reads the config and re-runs the queries. The list is
24
+ // handed out as it stands, so no caller may write to it.
25
+ /** @type {Map<string, string[] | undefined> | null} */
26
+ const cache = process.env.BROWSERSLIST_DISABLE_CACHE ? null : new Map();
27
+
18
28
  /**
19
29
  * Returns selected browsers.
20
30
  * @param {string | null | undefined} input input string
@@ -22,6 +32,25 @@ const inputRx = /^(?:((?:[A-Z]:)?[/\\].*?))?(?::(.+?))?$/i;
22
32
  * @returns {string[] | undefined} selected browsers
23
33
  */
24
34
  const load = (input, context) => {
35
+ if (cache === null) return loadBrowsers(input, context);
36
+ // A newline separates the two: an input carries a config path, an env or a
37
+ // query, and a directory carries none.
38
+ const key = `${input || ""}\n${context}`;
39
+ let browsers = cache.get(key);
40
+ if (browsers === undefined && !cache.has(key)) {
41
+ browsers = loadBrowsers(input, context);
42
+ cache.set(key, browsers);
43
+ }
44
+ return browsers;
45
+ };
46
+
47
+ /**
48
+ * Read the selection out of the browserslist config or query.
49
+ * @param {string | null | undefined} input input string
50
+ * @param {string} context the context directory
51
+ * @returns {string[] | undefined} selected browsers
52
+ */
53
+ const loadBrowsers = (input, context) => {
25
54
  // browserslist:path-to-config
26
55
  // browserslist:path-to-config:env
27
56
  if (input && path.isAbsolute(input)) {
@@ -69,8 +98,15 @@ const resolve = (browsers) => {
69
98
  * @param {Record<string, number | [number, number]>} versions first supported version
70
99
  * @returns {boolean} true if supports
71
100
  */
72
- const rawChecker = (versions) =>
73
- browsers.every((v) => {
101
+ const rawChecker = (versions) => checkAll(browsers, versions);
102
+ /**
103
+ * Checks a subset of the list against a version number
104
+ * @param {string[]} list the browsers to check
105
+ * @param {Record<string, number | [number, number]>} versions first supported version
106
+ * @returns {boolean} true if all support
107
+ */
108
+ const checkAll = (list, versions) =>
109
+ list.every((v) => {
74
110
  const [name, parsedVersion] = v.split(" ");
75
111
  if (!name) return false;
76
112
  const requiredVersion = versions[name];