@depup/webpack 5.106.1-depup.0 → 5.109.2-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.
- package/README.md +9 -11
- package/bin/webpack.js +12 -0
- package/changes.json +16 -24
- package/hot/dev-server.js +2 -0
- package/lib/APIPlugin.js +60 -35
- package/lib/AsyncDependenciesBlock.js +3 -0
- package/lib/AutomaticPrefetchPlugin.js +6 -1
- package/lib/BannerPlugin.js +13 -5
- package/lib/Cache.js +27 -5
- package/lib/CacheFacade.js +41 -0
- package/lib/Chunk.js +71 -25
- package/lib/ChunkGraph.js +153 -19
- package/lib/ChunkGroup.js +115 -28
- package/lib/ChunkTemplate.js +9 -0
- package/lib/CircularModulesPlugin.js +190 -0
- package/lib/CleanPlugin.js +27 -28
- package/lib/CodeGenerationResults.js +19 -0
- package/lib/CompatibilityPlugin.js +85 -37
- package/lib/Compilation.js +656 -112
- package/lib/Compiler.js +109 -35
- package/lib/ConcatenationScope.js +34 -4
- package/lib/ConditionalInitFragment.js +6 -0
- package/lib/ConstPlugin.js +15 -12
- package/lib/ContextExclusionPlugin.js +3 -1
- package/lib/ContextModule.js +345 -55
- package/lib/ContextModuleFactory.js +193 -51
- package/lib/ContextReplacementPlugin.js +8 -1
- package/lib/DefinePlugin.js +537 -139
- package/lib/DependenciesBlock.js +6 -1
- package/lib/Dependency.js +159 -11
- package/lib/DependencyTemplate.js +7 -1
- package/lib/DependencyTemplates.js +4 -0
- package/lib/DotenvPlugin.js +3 -0
- package/lib/DynamicEntryPlugin.js +3 -1
- package/lib/EntryOptionPlugin.js +42 -2
- package/lib/EntryPlugin.js +4 -1
- package/lib/Entrypoint.js +5 -1
- package/lib/EnvironmentPlugin.js +3 -2
- package/lib/ErrorHelpers.js +7 -0
- package/lib/EvalDevToolModulePlugin.js +3 -1
- package/lib/EvalSourceMapDevToolPlugin.js +11 -11
- package/lib/ExportsInfo.js +421 -113
- package/lib/ExportsInfoApiPlugin.js +4 -3
- package/lib/ExternalModule.js +381 -80
- package/lib/ExternalModuleFactoryPlugin.js +75 -3
- package/lib/ExternalsPlugin.js +3 -1
- package/lib/FileSystemInfo.js +701 -175
- package/lib/FlagAllModulesAsUsedPlugin.js +3 -6
- package/lib/FlagDependencyExportsPlugin.js +82 -9
- package/lib/FlagDependencyUsagePlugin.js +115 -8
- package/lib/FlagEntryExportAsUsedPlugin.js +4 -1
- package/lib/Generator.js +24 -3
- package/lib/HotModuleReplacementPlugin.js +110 -44
- package/lib/IgnorePlugin.js +5 -2
- package/lib/IgnoreWarningsPlugin.js +2 -1
- package/lib/InitFragment.js +33 -30
- package/lib/JavascriptMetaInfoPlugin.js +9 -6
- package/lib/LazyBarrel.js +389 -0
- package/lib/LibraryTemplatePlugin.js +2 -1
- package/lib/LoaderOptionsPlugin.js +3 -1
- package/lib/LoaderTargetPlugin.js +3 -1
- package/lib/MainTemplate.js +15 -0
- package/lib/ManifestPlugin.js +9 -2
- package/lib/Module.js +121 -57
- package/lib/ModuleFactory.js +6 -1
- package/lib/ModuleFilenameHelpers.js +18 -4
- package/lib/ModuleGraph.js +69 -2
- package/lib/ModuleGraphConnection.js +9 -0
- package/lib/ModuleInfoHeaderPlugin.js +5 -0
- package/lib/ModuleNotFoundError.js +3 -83
- package/lib/ModuleProfile.js +27 -1
- package/lib/ModuleSourceTypeConstants.js +52 -19
- package/lib/ModuleTemplate.js +10 -0
- package/lib/ModuleTypeConstants.js +20 -4
- package/lib/MultiCompiler.js +59 -4
- package/lib/MultiStats.js +9 -0
- package/lib/MultiWatching.js +6 -0
- package/lib/NoEmitOnErrorsPlugin.js +1 -1
- package/lib/NodeStuffPlugin.js +78 -46
- package/lib/NormalModule.js +519 -206
- package/lib/NormalModuleFactory.js +156 -31
- package/lib/NormalModuleReplacementPlugin.js +3 -1
- package/lib/NullFactory.js +1 -0
- package/lib/OptionsApply.js +1 -0
- package/lib/Parser.js +3 -1
- package/lib/PlatformPlugin.js +2 -1
- package/lib/PrefetchPlugin.js +4 -1
- package/lib/ProgressPlugin.js +351 -161
- package/lib/ProvidePlugin.js +6 -3
- package/lib/RawModule.js +32 -16
- package/lib/RecordIdsPlugin.js +9 -0
- package/lib/RequestShortener.js +8 -0
- package/lib/ResolverFactory.js +5 -0
- package/lib/RuntimeGlobals.js +58 -5
- package/lib/RuntimeModule.js +22 -7
- package/lib/RuntimePlugin.js +123 -118
- package/lib/RuntimeTemplate.js +616 -37
- package/lib/SelfModuleFactory.js +3 -0
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +2 -0
- package/lib/SourceMapDevToolPlugin.js +341 -63
- package/lib/Stats.js +6 -0
- package/lib/Template.js +52 -6
- package/lib/TemplatedPathPlugin.js +505 -138
- package/lib/UseStrictPlugin.js +3 -2
- package/lib/WarnCaseSensitiveModulesPlugin.js +72 -3
- package/lib/WarnDeprecatedOptionPlugin.js +6 -2
- package/lib/WarnNoModeSetPlugin.js +18 -2
- package/lib/WatchIgnorePlugin.js +5 -1
- package/lib/Watching.js +25 -3
- package/lib/WebpackError.js +3 -74
- package/lib/WebpackIsIncludedPlugin.js +4 -2
- package/lib/WebpackOptionsApply.js +88 -25
- package/lib/WebpackOptionsDefaulter.js +1 -0
- package/lib/asset/AssetBytesGenerator.js +28 -10
- package/lib/asset/AssetBytesParser.js +1 -0
- package/lib/asset/AssetGenerator.js +199 -60
- package/lib/asset/AssetModule.js +47 -0
- package/lib/asset/AssetModulesPlugin.js +115 -24
- package/lib/asset/AssetParser.js +4 -2
- package/lib/asset/AssetSourceGenerator.js +26 -8
- package/lib/asset/AssetSourceParser.js +1 -0
- package/lib/asset/RawDataUrlModule.js +23 -13
- package/lib/asset/WebManifestGenerator.js +164 -0
- package/lib/asset/WebManifestParser.js +130 -0
- package/lib/async-modules/AsyncModuleHelpers.js +1 -0
- package/lib/async-modules/AwaitDependenciesInitFragment.js +18 -4
- package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
- package/lib/async-modules/isGeneratorLowered.js +26 -0
- package/lib/buildChunkGraph.js +107 -15
- package/lib/bun/BunTargetPlugin.js +42 -0
- package/lib/cache/AddBuildDependenciesPlugin.js +3 -1
- package/lib/cache/AddManagedPathsPlugin.js +5 -1
- package/lib/cache/IdleFileCachePlugin.js +6 -1
- package/lib/cache/MemoryCachePlugin.js +1 -1
- package/lib/cache/MemoryWithGcCachePlugin.js +4 -1
- package/lib/cache/PackFileCacheStrategy.js +302 -12
- package/lib/cache/ResolverCachePlugin.js +12 -1
- package/lib/cache/getLazyHashedEtag.js +13 -2
- package/lib/cache/mergeEtags.js +4 -0
- package/lib/cli.js +142 -20
- package/lib/config/browserslistTargetHandler.js +141 -0
- package/lib/config/defaults.js +612 -43
- package/lib/config/defineConfig.js +31 -0
- package/lib/config/normalization.js +46 -1
- package/lib/config/target.js +200 -2
- package/lib/container/ContainerEntryDependency.js +2 -0
- package/lib/container/ContainerEntryModule.js +27 -14
- package/lib/container/ContainerEntryModuleFactory.js +1 -0
- package/lib/container/ContainerExposedDependency.js +6 -2
- package/lib/container/ContainerPlugin.js +2 -1
- package/lib/container/ContainerReferencePlugin.js +3 -2
- package/lib/container/FallbackDependency.js +9 -7
- package/lib/container/FallbackItemDependency.js +1 -0
- package/lib/container/FallbackModule.js +22 -9
- package/lib/container/FallbackModuleFactory.js +1 -0
- package/lib/container/HoistContainerReferencesPlugin.js +47 -55
- package/lib/container/ModuleFederationPlugin.js +21 -29
- package/lib/container/RemoteModule.js +33 -10
- package/lib/container/RemoteRuntimeModule.js +15 -12
- package/lib/container/RemoteToExternalDependency.js +1 -0
- package/lib/container/options.js +7 -0
- package/lib/css/CssGenerator.js +540 -272
- package/lib/css/CssInjectStyleRuntimeModule.js +86 -70
- package/lib/css/CssLoadingRuntimeModule.js +173 -81
- package/lib/{CssModule.js → css/CssModule.js} +72 -37
- package/lib/css/CssModulesPlugin.js +371 -208
- package/lib/css/CssParser.js +3538 -1963
- package/lib/css/syntax.js +4155 -0
- package/lib/debug/ProfilingPlugin.js +33 -2
- package/lib/deno/DenoTargetPlugin.js +41 -0
- package/lib/dependencies/AMDDefineDependency.js +29 -17
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +19 -6
- package/lib/dependencies/AMDPlugin.js +6 -3
- package/lib/dependencies/AMDRequireArrayDependency.js +13 -11
- package/lib/dependencies/AMDRequireContextDependency.js +10 -11
- package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -0
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +28 -14
- package/lib/dependencies/AMDRequireDependency.js +28 -20
- package/lib/dependencies/AMDRequireItemDependency.js +1 -0
- package/lib/dependencies/AMDRuntimeModules.js +3 -0
- package/lib/dependencies/CachedConstDependency.js +9 -1
- package/lib/dependencies/CommonJsDependencyHelpers.js +104 -0
- package/lib/dependencies/CommonJsExportRequireDependency.js +157 -38
- package/lib/dependencies/CommonJsExportsDependency.js +74 -20
- package/lib/dependencies/CommonJsExportsParserPlugin.js +246 -15
- package/lib/dependencies/CommonJsFullRequireDependency.js +91 -27
- package/lib/dependencies/CommonJsImportsParserPlugin.js +189 -24
- package/lib/dependencies/CommonJsPlugin.js +7 -4
- package/lib/dependencies/CommonJsRequireContextDependency.js +13 -13
- package/lib/dependencies/CommonJsRequireDependency.js +135 -13
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +60 -16
- package/lib/dependencies/ConstDependency.js +22 -12
- package/lib/dependencies/ContextDependency.js +13 -2
- package/lib/dependencies/ContextDependencyHelpers.js +7 -4
- package/lib/dependencies/ContextDependencyTemplateAsId.js +2 -1
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +1 -0
- package/lib/dependencies/ContextElementDependency.js +27 -14
- package/lib/dependencies/CreateRequireParserPlugin.js +14 -7
- package/lib/dependencies/CreateScriptUrlDependency.js +9 -7
- package/lib/dependencies/CriticalDependencyWarning.js +3 -1
- package/lib/dependencies/CssIcssExportDependency.js +681 -367
- package/lib/dependencies/CssIcssImportDependency.js +62 -17
- package/lib/dependencies/CssIcssSymbolDependency.js +36 -17
- package/lib/dependencies/CssImportDependency.js +37 -1
- package/lib/dependencies/CssUrlDependency.js +87 -14
- package/lib/dependencies/DelegatedSourceDependency.js +1 -0
- package/lib/dependencies/DllEntryDependency.js +12 -13
- package/lib/dependencies/DynamicExports.js +5 -0
- package/lib/dependencies/EntryDependency.js +1 -0
- package/lib/dependencies/ExportBindingInitFragment.js +164 -0
- package/lib/dependencies/ExportsInfoDependency.js +18 -12
- package/lib/dependencies/ExternalModuleDependency.js +13 -5
- package/lib/dependencies/ExternalModuleInitFragment.js +10 -5
- package/lib/dependencies/ExternalModuleInitFragmentDependency.js +19 -12
- package/lib/dependencies/HarmonyAcceptDependency.js +24 -26
- package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -0
- package/lib/dependencies/HarmonyCompatibilityDependency.js +33 -14
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +108 -30
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +34 -3
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +70 -33
- package/lib/dependencies/HarmonyExportExpressionDependency.js +133 -43
- package/lib/dependencies/HarmonyExportHeaderDependency.js +11 -9
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +268 -44
- package/lib/dependencies/HarmonyExportInitFragment.js +28 -20
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +88 -18
- package/lib/dependencies/HarmonyExports.js +6 -1
- package/lib/dependencies/HarmonyImportDependency.js +60 -4
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +139 -146
- package/lib/dependencies/HarmonyImportGuard.js +427 -0
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +22 -1
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +146 -24
- package/lib/{HarmonyLinkingError.js → dependencies/HarmonyLinkingError.js} +6 -3
- package/lib/dependencies/HarmonyModulesPlugin.js +11 -1
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +2 -1
- package/lib/dependencies/HtmlEntryDependency.js +1295 -0
- package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
- package/lib/dependencies/HtmlInlineScriptDependency.js +126 -0
- package/lib/dependencies/HtmlInlineStyleDependency.js +152 -0
- package/lib/dependencies/HtmlSourceDependency.js +172 -0
- package/lib/dependencies/ImportContextDependency.js +9 -9
- package/lib/dependencies/ImportDependency.js +92 -3
- package/lib/dependencies/ImportEagerDependency.js +2 -0
- package/lib/dependencies/ImportMetaContextDependency.js +1 -0
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +35 -19
- package/lib/dependencies/ImportMetaContextPlugin.js +40 -8
- package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
- package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
- package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
- package/lib/dependencies/ImportMetaHotAcceptDependency.js +2 -0
- package/lib/dependencies/ImportMetaHotDeclineDependency.js +2 -0
- package/lib/dependencies/ImportMetaPlugin.js +595 -209
- package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
- package/lib/dependencies/ImportParserPlugin.js +114 -27
- package/lib/dependencies/ImportPhase.js +17 -11
- package/lib/dependencies/ImportPlugin.js +2 -1
- package/lib/dependencies/ImportWeakDependency.js +3 -0
- package/lib/dependencies/JsonExportsDependency.js +15 -10
- package/lib/dependencies/LoaderDependency.js +2 -0
- package/lib/dependencies/LoaderImportDependency.js +3 -0
- package/lib/dependencies/LoaderPlugin.js +9 -2
- package/lib/dependencies/LocalModule.js +15 -12
- package/lib/dependencies/LocalModuleDependency.js +15 -13
- package/lib/dependencies/LocalModulesHelpers.js +3 -0
- package/lib/dependencies/ModuleDecoratorDependency.js +16 -10
- package/lib/dependencies/ModuleDependency.js +14 -0
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +1 -0
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
- package/lib/dependencies/ModuleHotAcceptDependency.js +2 -0
- package/lib/dependencies/ModuleHotDeclineDependency.js +2 -0
- package/lib/dependencies/ModuleInitFragmentDependency.js +19 -11
- package/lib/dependencies/NullDependency.js +2 -0
- package/lib/dependencies/PrefetchDependency.js +1 -0
- package/lib/dependencies/ProvidedDependency.js +36 -27
- package/lib/dependencies/PureExpressionDependency.js +14 -10
- package/lib/dependencies/RequireContextDependency.js +1 -0
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -1
- package/lib/dependencies/RequireContextPlugin.js +2 -1
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +1 -0
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +4 -6
- package/lib/dependencies/RequireEnsureDependency.js +16 -13
- package/lib/dependencies/RequireEnsureItemDependency.js +1 -0
- package/lib/dependencies/RequireEnsurePlugin.js +2 -1
- package/lib/dependencies/RequireHeaderDependency.js +7 -4
- package/lib/dependencies/RequireIncludeDependency.js +2 -0
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +11 -12
- package/lib/dependencies/RequireIncludePlugin.js +2 -1
- package/lib/{RequireJsStuffPlugin.js → dependencies/RequireJsStuffPlugin.js} +9 -8
- package/lib/dependencies/RequireResolveContextDependency.js +10 -11
- package/lib/dependencies/RequireResolveDependency.js +2 -0
- package/lib/dependencies/RequireResolveHeaderDependency.js +8 -5
- package/lib/dependencies/RuntimeRequirementsDependency.js +11 -8
- package/lib/dependencies/StaticExportsDependency.js +13 -10
- package/lib/dependencies/SystemPlugin.js +9 -6
- package/lib/dependencies/SystemRuntimeModule.js +1 -0
- package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
- package/lib/dependencies/URLContextDependency.js +8 -7
- package/lib/dependencies/URLDependency.js +157 -33
- package/lib/dependencies/URLPlugin.js +2 -0
- package/lib/dependencies/UnsupportedDependency.js +12 -13
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +15 -16
- package/lib/dependencies/WebAssemblyImportDependency.js +19 -18
- package/lib/dependencies/WebpackIsIncludedDependency.js +3 -0
- package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +364 -114
- package/lib/dependencies/WorkerDependency.js +111 -27
- package/lib/dependencies/WorkletDependency.js +278 -0
- package/lib/dependencies/getFunctionExpression.js +1 -0
- package/lib/dependencies/processExportInfo.js +14 -11
- package/lib/{DelegatedModule.js → dll/DelegatedModule.js} +71 -44
- package/lib/{DelegatedModuleFactoryPlugin.js → dll/DelegatedModuleFactoryPlugin.js} +27 -4
- package/lib/{DelegatedPlugin.js → dll/DelegatedPlugin.js} +5 -3
- package/lib/{DllEntryPlugin.js → dll/DllEntryPlugin.js} +9 -5
- package/lib/{DllModule.js → dll/DllModule.js} +36 -24
- package/lib/{DllModuleFactory.js → dll/DllModuleFactory.js} +5 -4
- package/lib/{DllPlugin.js → dll/DllPlugin.js} +24 -6
- package/lib/{DllReferencePlugin.js → dll/DllReferencePlugin.js} +26 -18
- package/lib/{LibManifestPlugin.js → dll/LibManifestPlugin.js} +14 -10
- package/lib/electron/ElectronTargetPlugin.js +24 -5
- package/lib/{AbstractMethodError.js → errors/AbstractMethodError.js} +10 -1
- package/lib/{AsyncDependencyToInitialChunkError.js → errors/AsyncDependencyToInitialChunkError.js} +8 -3
- package/lib/errors/BuildCycleError.js +1 -1
- package/lib/{ChunkRenderError.js → errors/ChunkRenderError.js} +1 -1
- package/lib/{CodeGenerationError.js → errors/CodeGenerationError.js} +1 -1
- package/lib/{CommentCompilationWarning.js → errors/CommentCompilationWarning.js} +9 -3
- package/lib/{ConcurrentCompilationError.js → errors/ConcurrentCompilationError.js} +5 -2
- package/lib/{EnvironmentNotSupportAsyncWarning.js → errors/EnvironmentNotSupportAsyncWarning.js} +5 -5
- package/lib/{HookWebpackError.js → errors/HookWebpackError.js} +20 -16
- package/lib/{IgnoreErrorModuleFactory.js → errors/IgnoreErrorModuleFactory.js} +7 -4
- package/lib/{InvalidDependenciesModuleWarning.js → errors/InvalidDependenciesModuleWarning.js} +6 -3
- package/lib/errors/JSONParseError.js +115 -0
- package/lib/errors/LoaderLoadingError.js +20 -0
- package/lib/{ModuleBuildError.js → errors/ModuleBuildError.js} +22 -16
- package/lib/{ModuleDependencyError.js → errors/ModuleDependencyError.js} +10 -3
- package/lib/{ModuleDependencyWarning.js → errors/ModuleDependencyWarning.js} +13 -5
- package/lib/{ModuleError.js → errors/ModuleError.js} +10 -14
- package/lib/{ModuleHashingError.js → errors/ModuleHashingError.js} +5 -1
- package/lib/errors/ModuleNotFoundError.js +94 -0
- package/lib/errors/ModuleParseError.js +141 -0
- package/lib/{ModuleRestoreError.js → errors/ModuleRestoreError.js} +4 -1
- package/lib/{ModuleStoreError.js → errors/ModuleStoreError.js} +5 -1
- package/lib/{ModuleWarning.js → errors/ModuleWarning.js} +13 -14
- package/lib/{NodeStuffInWebError.js → errors/NodeStuffInWebError.js} +7 -5
- package/lib/errors/NonErrorEmittedError.js +30 -0
- package/lib/{UnhandledSchemeError.js → errors/UnhandledSchemeError.js} +9 -2
- package/lib/{UnsupportedFeatureWarning.js → errors/UnsupportedFeatureWarning.js} +4 -3
- package/lib/errors/WebpackError.js +84 -0
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
- package/lib/esm/ModuleChunkFormatPlugin.js +52 -15
- package/lib/esm/ModuleChunkLoadingPlugin.js +11 -3
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +80 -52
- package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +8 -0
- package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
- package/lib/hmr/JavascriptHotModuleReplacementHelper.js +1 -0
- package/lib/hmr/LazyCompilationPlugin.js +154 -7
- package/lib/hmr/lazyCompilationBackend.js +53 -12
- package/lib/html/HtmlGenerator.js +1490 -0
- package/lib/html/HtmlModule.js +41 -0
- package/lib/html/HtmlModulesPlugin.js +1129 -0
- package/lib/html/HtmlParser.js +1970 -0
- package/lib/html/favicon.svg +1 -0
- package/lib/html/syntax.js +9106 -0
- package/lib/ids/ChunkModuleIdRangePlugin.js +3 -1
- package/lib/ids/DeterministicChunkIdsPlugin.js +3 -1
- package/lib/ids/DeterministicModuleIdsPlugin.js +3 -1
- package/lib/ids/HashedModuleIdsPlugin.js +2 -1
- package/lib/ids/IdHelpers.js +49 -12
- package/lib/ids/NamedChunkIdsPlugin.js +3 -1
- package/lib/ids/NamedModuleIdsPlugin.js +3 -1
- package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
- package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
- package/lib/ids/OccurrenceChunkIdsPlugin.js +2 -1
- package/lib/ids/OccurrenceModuleIdsPlugin.js +4 -1
- package/lib/ids/SyncModuleIdsPlugin.js +3 -1
- package/lib/index.js +66 -15
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +5 -6
- package/lib/javascript/BasicEvaluatedExpression.js +370 -49
- package/lib/javascript/ChunkFormatHelpers.js +2 -1
- package/lib/javascript/ChunkHelpers.js +1 -0
- package/lib/javascript/CommonJsChunkFormatPlugin.js +1 -1
- package/lib/javascript/EnableChunkLoadingPlugin.js +6 -1
- package/lib/javascript/JavascriptGenerator.js +213 -51
- package/lib/javascript/JavascriptModule.js +54 -0
- package/lib/javascript/JavascriptModulesPlugin.js +628 -198
- package/lib/javascript/JavascriptParser.js +1334 -471
- package/lib/javascript/JavascriptParserHelpers.js +10 -7
- package/lib/javascript/StartupHelpers.js +5 -0
- package/lib/javascript/syntax.js +5037 -0
- package/lib/json/JsonData.js +5 -0
- package/lib/json/JsonGenerator.js +21 -0
- package/lib/json/JsonModule.js +40 -0
- package/lib/json/JsonModulesPlugin.js +8 -1
- package/lib/json/JsonParser.js +18 -27
- package/lib/library/AbstractLibraryPlugin.js +17 -2
- package/lib/library/AmdLibraryPlugin.js +8 -0
- package/lib/library/AssignLibraryPlugin.js +21 -3
- package/lib/library/EnableLibraryPlugin.js +8 -2
- package/lib/library/ExportPropertyLibraryPlugin.js +10 -0
- package/lib/{FalseIIFEUmdWarning.js → library/FalseIIFEUmdWarning.js} +2 -1
- package/lib/library/JsonpLibraryPlugin.js +8 -0
- package/lib/library/ModuleLibraryPlugin.js +154 -7
- package/lib/library/SystemLibraryPlugin.js +11 -3
- package/lib/library/UmdLibraryPlugin.js +16 -0
- package/lib/loaders/LoaderRunner.js +714 -0
- package/lib/loaders/loadLoader.js +100 -0
- package/lib/logging/Logger.js +17 -0
- package/lib/logging/createConsoleLogger.js +7 -0
- package/lib/logging/runtime.js +2 -0
- package/lib/logging/truncateArgs.js +2 -0
- package/lib/node/CommonJsChunkLoadingPlugin.js +5 -1
- package/lib/node/NodeEnvironmentPlugin.js +7 -3
- package/lib/node/NodeSourcePlugin.js +1 -1
- package/lib/node/NodeTargetPlugin.js +4 -63
- package/lib/node/NodeTemplatePlugin.js +3 -1
- package/lib/node/NodeWatchFileSystem.js +40 -22
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +13 -9
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +33 -3
- package/lib/node/ReadFileCompileWasmPlugin.js +28 -3
- package/lib/node/RequireChunkLoadingRuntimeModule.js +21 -16
- package/lib/node/nodeBuiltins.js +80 -0
- package/lib/node/nodeConsole.js +116 -64
- package/lib/optimize/AggressiveMergingPlugin.js +22 -16
- package/lib/optimize/AggressiveSplittingPlugin.js +6 -1
- package/lib/optimize/ConcatenatedModule.js +603 -130
- package/lib/optimize/ConstExportsPlugin.js +211 -0
- package/lib/optimize/EnsureChunkConditionsPlugin.js +2 -1
- package/lib/optimize/FlagIncludedChunksPlugin.js +15 -4
- package/lib/optimize/InlineExports.js +178 -0
- package/lib/optimize/InnerGraph.js +374 -262
- package/lib/optimize/InnerGraphPlugin.js +246 -117
- package/lib/optimize/LimitChunkCountPlugin.js +9 -0
- package/lib/optimize/MangleExportsPlugin.js +5 -1
- package/lib/optimize/MergeDuplicateChunksPlugin.js +2 -0
- package/lib/optimize/MinChunkSizePlugin.js +2 -1
- package/lib/optimize/MinMaxSizeWarning.js +5 -4
- package/lib/optimize/ModuleConcatenationPlugin.js +229 -55
- package/lib/optimize/RealContentHashPlugin.js +130 -52
- package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -1
- package/lib/optimize/RemoveParentModulesPlugin.js +3 -1
- package/lib/optimize/RuntimeChunkPlugin.js +2 -1
- package/lib/optimize/SideEffectsFlagPlugin.js +381 -55
- package/lib/optimize/SplitChunksPlugin.js +200 -50
- package/lib/performance/AssetsOverSizeLimitWarning.js +3 -2
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +3 -2
- package/lib/performance/NoAsyncChunksWarning.js +5 -3
- package/lib/performance/SizeLimitsPlugin.js +8 -2
- package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +1 -0
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +21 -0
- package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +1 -0
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -1
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +25 -13
- package/lib/prefetch/ResourceHintPlugin.js +687 -0
- package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
- package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
- package/lib/prefetch/parseResourceHintOptions.js +103 -0
- package/lib/rules/BasicEffectRulePlugin.js +3 -0
- package/lib/rules/BasicMatcherRulePlugin.js +3 -0
- package/lib/rules/ObjectMatcherRulePlugin.js +3 -0
- package/lib/rules/RuleSetCompiler.js +132 -0
- package/lib/rules/UseEffectRulePlugin.js +10 -3
- package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
- package/lib/runtime/AsyncModuleRuntimeModule.js +52 -33
- package/lib/runtime/AutoPublicPathRuntimeModule.js +22 -9
- package/lib/runtime/BaseUriRuntimeModule.js +1 -0
- package/lib/runtime/ChunkNameRuntimeModule.js +1 -0
- package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
- package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -1
- package/lib/runtime/CompatRuntimeModule.js +2 -0
- package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
- package/lib/runtime/CreateScriptRuntimeModule.js +1 -0
- package/lib/runtime/CreateScriptUrlRuntimeModule.js +1 -0
- package/lib/runtime/DefinePropertyGettersRuntimeModule.js +34 -4
- package/lib/runtime/EnsureChunkRuntimeModule.js +1 -0
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +88 -8
- package/lib/runtime/GetFullHashRuntimeModule.js +1 -0
- package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -0
- package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -1
- package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
- package/lib/runtime/GlobalRuntimeModule.js +1 -0
- package/lib/runtime/HasOwnPropertyRuntimeModule.js +2 -1
- package/lib/runtime/HelperRuntimeModule.js +5 -0
- package/lib/runtime/LoadScriptRuntimeModule.js +28 -37
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +354 -37
- package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -1
- package/lib/runtime/NonceRuntimeModule.js +1 -0
- package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -4
- package/lib/runtime/PublicPathRuntimeModule.js +1 -0
- package/lib/runtime/RelativeUrlRuntimeModule.js +4 -2
- package/lib/runtime/RuntimeIdRuntimeModule.js +1 -0
- package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +38 -0
- package/lib/runtime/StartupChunkDependenciesPlugin.js +13 -1
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +2 -1
- package/lib/runtime/StartupEntrypointRuntimeModule.js +5 -3
- package/lib/runtime/SystemContextRuntimeModule.js +1 -0
- package/lib/runtime/ToBinaryRuntimeModule.js +1 -0
- package/lib/runtime/WorkerRuntimeModule.js +33 -0
- package/lib/schemes/DataUriPlugin.js +14 -2
- package/lib/schemes/FileUriPlugin.js +1 -1
- package/lib/schemes/HttpUriPlugin.js +86 -4
- package/lib/schemes/VirtualUrlPlugin.js +8 -4
- package/lib/serialization/AggregateErrorSerializer.js +9 -6
- package/lib/serialization/ArraySerializer.js +6 -8
- package/lib/serialization/BinaryMiddleware.js +427 -1006
- package/lib/serialization/DateObjectSerializer.js +4 -2
- package/lib/serialization/ErrorObjectSerializer.js +10 -6
- package/lib/serialization/FileMiddleware.js +345 -59
- package/lib/serialization/MapObjectSerializer.js +7 -9
- package/lib/serialization/NullPrototypeObjectSerializer.js +9 -9
- package/lib/serialization/ObjectMiddleware.js +73 -13
- package/lib/serialization/PlainObjectSerializer.js +16 -8
- package/lib/serialization/RegExpObjectSerializer.js +4 -2
- package/lib/serialization/Serializer.js +6 -0
- package/lib/serialization/SerializerMiddleware.js +14 -2
- package/lib/serialization/SetObjectSerializer.js +6 -8
- package/lib/serialization/SingleItemMiddleware.js +3 -0
- package/lib/sharing/ConsumeSharedFallbackDependency.js +1 -0
- package/lib/sharing/ConsumeSharedModule.js +21 -7
- package/lib/sharing/ConsumeSharedPlugin.js +11 -11
- package/lib/sharing/ConsumeSharedRuntimeModule.js +55 -45
- package/lib/sharing/ProvideForSharedDependency.js +1 -0
- package/lib/sharing/ProvideSharedDependency.js +34 -15
- package/lib/sharing/ProvideSharedModule.js +42 -12
- package/lib/sharing/ProvideSharedModuleFactory.js +1 -0
- package/lib/sharing/ProvideSharedPlugin.js +13 -8
- package/lib/sharing/SharePlugin.js +5 -1
- package/lib/sharing/ShareRuntimeModule.js +19 -16
- package/lib/sharing/resolveMatchedConfigs.js +6 -2
- package/lib/sharing/utils.js +9 -1
- package/lib/stats/DefaultStatsFactoryPlugin.js +289 -201
- package/lib/stats/DefaultStatsPresetPlugin.js +14 -2
- package/lib/stats/DefaultStatsPrinterPlugin.js +74 -170
- package/lib/stats/StatsFactory.js +70 -27
- package/lib/stats/StatsPrinter.js +16 -2
- package/lib/typescript/TypeScriptPlugin.js +210 -0
- package/lib/url/URLParserPlugin.js +111 -23
- package/lib/util/ArrayHelpers.js +1 -0
- package/lib/util/ArrayQueue.js +10 -5
- package/lib/util/AsyncQueue.js +154 -74
- package/lib/util/Hash.js +2 -2
- package/lib/util/IterableHelpers.js +3 -0
- package/lib/util/LazyBucketSortedSet.js +26 -0
- package/lib/util/LazySet.js +45 -4
- package/lib/util/LocConverter.js +64 -0
- package/lib/util/ParallelismFactorCalculator.js +1 -0
- package/lib/util/Queue.js +6 -3
- package/lib/util/Semaphore.js +15 -1
- package/lib/util/SetHelpers.js +4 -1
- package/lib/util/SortableSet.js +7 -1
- package/lib/util/SourceProcessor.js +119 -0
- package/lib/util/StackedCacheMap.js +20 -3
- package/lib/util/StackedMap.js +162 -43
- package/lib/util/StringXor.js +1 -1
- package/lib/util/TupleQueue.js +7 -3
- package/lib/util/TupleSet.js +14 -0
- package/lib/util/URLAbsoluteSpecifier.js +1 -0
- package/lib/util/WeakTupleMap.js +60 -1
- package/lib/util/binarySearchBounds.js +3 -2
- package/lib/util/chainedImports.js +3 -3
- package/lib/util/cleverMerge.js +19 -2
- package/lib/util/comparators.js +35 -4
- package/lib/util/compileBooleanMatcher.js +9 -0
- package/lib/util/concatenate.js +80 -24
- package/lib/util/conventions.js +46 -1
- package/lib/util/createHash.js +0 -1
- package/lib/util/createHooksRegistry.js +43 -0
- package/lib/util/createMappings.js +118 -0
- package/lib/util/dataURL.js +3 -2
- package/lib/util/deprecation.js +19 -0
- package/lib/util/deterministicGrouping.js +46 -17
- package/lib/util/extractSourceMap.js +2 -1
- package/lib/util/extractUrlAndGlobal.js +1 -0
- package/lib/util/findGraphRoots.js +7 -0
- package/lib/{formatLocation.js → util/formatLocation.js} +4 -2
- package/lib/{SizeFormatHelpers.js → util/formatSize.js} +10 -3
- package/lib/util/fs.js +87 -14
- package/lib/util/generateDebugId.js +1 -0
- package/lib/util/globUtils.js +710 -0
- package/lib/util/hash/BatchedHash.js +1 -0
- package/lib/util/hash/BulkUpdateHash.js +1 -0
- package/lib/util/hash/DebugHash.js +1 -0
- package/lib/util/hash/hash-digest.js +32 -15
- package/lib/util/hash/md4.js +1 -1
- package/lib/util/hash/wasm-hash.js +5 -0
- package/lib/util/hash/xxhash64.js +1 -1
- package/lib/util/identifier.js +118 -7
- package/lib/util/implicitTypeLoaderFallback.js +62 -0
- package/lib/util/internalSerializables.js +102 -60
- package/lib/util/magicComment.js +149 -7
- package/lib/util/makeSerializable.js +7 -0
- package/lib/util/memoize.js +2 -0
- package/lib/util/mimeTypes.js +176 -0
- package/lib/util/nonNumericOnlyHash.js +31 -1
- package/lib/util/numberHash.js +2 -2
- package/lib/util/parseJson.js +41 -0
- package/lib/util/processAsyncTree.js +8 -0
- package/lib/util/property.js +9 -2
- package/lib/util/publicPathPlaceholder.js +64 -0
- package/lib/util/registerExternalSerializer.js +24 -4
- package/lib/util/removeBOM.js +1 -0
- package/lib/util/runtime.js +32 -0
- package/lib/util/semver.js +15 -0
- package/lib/util/serialization.js +2 -0
- package/lib/util/smartGrouping.js +8 -0
- package/lib/util/source.js +23 -0
- package/lib/util/topologicalSort.js +69 -0
- package/lib/validateSchema.js +1 -0
- package/lib/wasm/EnableWasmLoadingPlugin.js +15 -1
- package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +25 -18
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +34 -22
- package/lib/wasm-async/AsyncWasmModule.js +77 -0
- package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -0
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +6 -1
- package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +22 -126
- package/lib/wasm-async/AsyncWebAssemblyParser.js +3 -2
- package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +13 -2
- package/lib/wasm-sync/SyncWasmModule.js +39 -0
- package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +7 -3
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +86 -19
- package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -3
- package/lib/wasm-sync/WebAssemblyGenerator.js +27 -1
- package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +9 -3
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +4 -0
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +20 -1
- package/lib/wasm-sync/WebAssemblyParser.js +9 -3
- package/lib/wasm-sync/WebAssemblyUtils.js +2 -0
- package/lib/web/FetchCompileAsyncWasmPlugin.js +29 -1
- package/lib/web/FetchCompileWasmPlugin.js +27 -1
- package/lib/web/JsonpChunkLoadingPlugin.js +11 -1
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +58 -64
- package/lib/web/JsonpTemplatePlugin.js +2 -1
- package/lib/webpack.js +78 -1
- package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +10 -1
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +15 -10
- package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
- package/module.d.ts +21 -0
- package/package.json +79 -77
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +1173 -80
- package/schemas/plugins/{DllPlugin.check.d.ts → HtmlGeneratorOptions.check.d.ts} +1 -1
- package/schemas/plugins/HtmlGeneratorOptions.check.js +6 -0
- package/schemas/plugins/HtmlGeneratorOptions.json +3 -0
- package/schemas/plugins/{DllReferencePlugin.check.d.ts → HtmlParserOptions.check.d.ts} +1 -1
- package/schemas/plugins/HtmlParserOptions.check.js +6 -0
- package/schemas/plugins/HtmlParserOptions.json +3 -0
- package/schemas/plugins/ProgressPlugin.check.js +1 -1
- package/schemas/plugins/ProgressPlugin.json +38 -0
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
- package/schemas/plugins/container/ExternalsType.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +2 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +6 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.json +3 -0
- package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssParserOptions.check.js +1 -1
- package/schemas/plugins/dll/DllPlugin.check.d.ts +7 -0
- package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +7 -0
- package/types.d.ts +11053 -3019
- package/lib/CaseSensitiveModulesWarning.js +0 -72
- package/lib/GraphHelpers.js +0 -46
- package/lib/ModuleParseError.js +0 -125
- package/lib/NoModeWarning.js +0 -23
- package/lib/css/CssMergeStyleSheetsRuntimeModule.js +0 -56
- package/lib/css/walkCssTokens.js +0 -1843
- package/lib/util/AppendOnlyStackedSet.js +0 -78
- /package/schemas/plugins/{DllPlugin.check.js → dll/DllPlugin.check.js} +0 -0
- /package/schemas/plugins/{DllPlugin.json → dll/DllPlugin.json} +0 -0
- /package/schemas/plugins/{DllReferencePlugin.check.js → dll/DllReferencePlugin.check.js} +0 -0
- /package/schemas/plugins/{DllReferencePlugin.json → dll/DllReferencePlugin.json} +0 -0
|
@@ -12,6 +12,7 @@ const Cache = require("../Cache");
|
|
|
12
12
|
/** @typedef {import("../Compiler")} Compiler */
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
+
* Defines the memory with gc cache plugin options type used by this module.
|
|
15
16
|
* @typedef {object} MemoryWithGcCachePluginOptions
|
|
16
17
|
* @property {number} maxGenerations max generations
|
|
17
18
|
*/
|
|
@@ -20,14 +21,16 @@ const PLUGIN_NAME = "MemoryWithGcCachePlugin";
|
|
|
20
21
|
|
|
21
22
|
class MemoryWithGcCachePlugin {
|
|
22
23
|
/**
|
|
24
|
+
* Creates an instance of MemoryWithGcCachePlugin.
|
|
23
25
|
* @param {MemoryWithGcCachePluginOptions} options options
|
|
24
26
|
*/
|
|
25
27
|
constructor({ maxGenerations }) {
|
|
28
|
+
/** @type {number} */
|
|
26
29
|
this._maxGenerations = maxGenerations;
|
|
27
30
|
}
|
|
28
31
|
|
|
29
32
|
/**
|
|
30
|
-
*
|
|
33
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
31
34
|
* @param {Compiler} compiler the compiler instance
|
|
32
35
|
* @returns {void}
|
|
33
36
|
*/
|
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
|
|
8
8
|
const FileSystemInfo = require("../FileSystemInfo");
|
|
9
9
|
const ProgressPlugin = require("../ProgressPlugin");
|
|
10
|
-
const {
|
|
10
|
+
const { getReferencedFilenames } = require("../serialization/FileMiddleware");
|
|
11
11
|
const SerializerMiddleware = require("../serialization/SerializerMiddleware");
|
|
12
12
|
const LazySet = require("../util/LazySet");
|
|
13
|
+
const formatSize = require("../util/formatSize");
|
|
13
14
|
const makeSerializable = require("../util/makeSerializable");
|
|
14
15
|
const memoize = require("../util/memoize");
|
|
15
16
|
const {
|
|
@@ -34,9 +35,21 @@ const {
|
|
|
34
35
|
/** @typedef {Set<string>} Items */
|
|
35
36
|
/** @typedef {Set<string>} BuildDependencies */
|
|
36
37
|
/** @typedef {Map<string, PackItemInfo>} ItemInfo */
|
|
38
|
+
/** @typedef {{ firstSeen: number, size: number }} UnreferencedFile */
|
|
39
|
+
/** @typedef {Map<string, UnreferencedFile>} UnreferencedFiles */
|
|
40
|
+
|
|
41
|
+
// Unreferenced files are kept for this long to not race concurrent builds sharing the cache directory.
|
|
42
|
+
const CLEANUP_GRACE_PERIOD = 30 * 60 * 1000;
|
|
43
|
+
// Records when each unreferenced file was first seen. Aging by recorded time keeps
|
|
44
|
+
// orphans expiring across caches restored with refreshed modification times.
|
|
45
|
+
const UNREFERENCED_FILE = "unreferenced.json";
|
|
46
|
+
// A file written this recently may belong to a concurrent build that reused the name,
|
|
47
|
+
// in which case the recorded time describes the previous file and must not be trusted.
|
|
48
|
+
const CLEANUP_RECENT_WRITE_PERIOD = 60 * 1000;
|
|
37
49
|
|
|
38
50
|
class PackContainer {
|
|
39
51
|
/**
|
|
52
|
+
* Creates an instance of PackContainer.
|
|
40
53
|
* @param {Pack} data stored data
|
|
41
54
|
* @param {string} version version identifier
|
|
42
55
|
* @param {Snapshot} buildSnapshot snapshot of all build dependencies
|
|
@@ -67,6 +80,7 @@ class PackContainer {
|
|
|
67
80
|
}
|
|
68
81
|
|
|
69
82
|
/**
|
|
83
|
+
* Serializes this instance into the provided serializer context.
|
|
70
84
|
* @param {ObjectSerializerContext} context context
|
|
71
85
|
*/
|
|
72
86
|
serialize({ write, writeLazy }) {
|
|
@@ -80,6 +94,7 @@ class PackContainer {
|
|
|
80
94
|
}
|
|
81
95
|
|
|
82
96
|
/**
|
|
97
|
+
* Restores this instance from the provided deserializer context.
|
|
83
98
|
* @param {ObjectDeserializerContext} context context
|
|
84
99
|
*/
|
|
85
100
|
deserialize({ read }) {
|
|
@@ -102,10 +117,11 @@ const MIN_CONTENT_SIZE = 1024 * 1024; // 1 MB
|
|
|
102
117
|
const CONTENT_COUNT_TO_MERGE = 10;
|
|
103
118
|
const MIN_ITEMS_IN_FRESH_PACK = 100;
|
|
104
119
|
const MAX_ITEMS_IN_FRESH_PACK = 50000;
|
|
105
|
-
const MAX_TIME_IN_FRESH_PACK =
|
|
120
|
+
const MAX_TIME_IN_FRESH_PACK = 60 * 1000; // 1 min
|
|
106
121
|
|
|
107
122
|
class PackItemInfo {
|
|
108
123
|
/**
|
|
124
|
+
* Creates an instance of PackItemInfo.
|
|
109
125
|
* @param {string} identifier identifier of item
|
|
110
126
|
* @param {string | null | undefined} etag etag of item
|
|
111
127
|
* @param {Data} value fresh value of item
|
|
@@ -126,6 +142,7 @@ class PackItemInfo {
|
|
|
126
142
|
|
|
127
143
|
class Pack {
|
|
128
144
|
/**
|
|
145
|
+
* Creates an instance of Pack.
|
|
129
146
|
* @param {Logger} logger a logger
|
|
130
147
|
* @param {number} maxAge max age of cache items
|
|
131
148
|
*/
|
|
@@ -149,6 +166,7 @@ class Pack {
|
|
|
149
166
|
}
|
|
150
167
|
|
|
151
168
|
/**
|
|
169
|
+
* Adds the provided identifier to the pack.
|
|
152
170
|
* @param {string} identifier identifier
|
|
153
171
|
*/
|
|
154
172
|
_addRequest(identifier) {
|
|
@@ -170,6 +188,7 @@ class Pack {
|
|
|
170
188
|
}
|
|
171
189
|
|
|
172
190
|
/**
|
|
191
|
+
* Returns cached content.
|
|
173
192
|
* @param {string} identifier unique name for the resource
|
|
174
193
|
* @param {string | null} etag etag of the resource
|
|
175
194
|
* @returns {Data} cached content
|
|
@@ -193,6 +212,7 @@ class Pack {
|
|
|
193
212
|
}
|
|
194
213
|
|
|
195
214
|
/**
|
|
215
|
+
* Updates value using the provided identifier.
|
|
196
216
|
* @param {string} identifier unique name for the resource
|
|
197
217
|
* @param {string | null} etag etag of the resource
|
|
198
218
|
* @param {Data} data cached content
|
|
@@ -244,6 +264,7 @@ class Pack {
|
|
|
244
264
|
}
|
|
245
265
|
|
|
246
266
|
/**
|
|
267
|
+
* Returns new location of data entries.
|
|
247
268
|
* @returns {number} new location of data entries
|
|
248
269
|
*/
|
|
249
270
|
_findLocation() {
|
|
@@ -254,6 +275,7 @@ class Pack {
|
|
|
254
275
|
}
|
|
255
276
|
|
|
256
277
|
/**
|
|
278
|
+
* Gc and update location.
|
|
257
279
|
* @private
|
|
258
280
|
* @param {Items} items items
|
|
259
281
|
* @param {Items} usedItems used items
|
|
@@ -559,6 +581,41 @@ class Pack {
|
|
|
559
581
|
}
|
|
560
582
|
}
|
|
561
583
|
|
|
584
|
+
/**
|
|
585
|
+
* Drops every content whose items all expired. Unlike a partial collection this
|
|
586
|
+
* never unpacks, so it is not limited to a single content per store and lets a
|
|
587
|
+
* long unused cache shrink in one go instead of one pack per build.
|
|
588
|
+
*/
|
|
589
|
+
_gcExpiredContent() {
|
|
590
|
+
const now = Date.now();
|
|
591
|
+
let packCount = 0;
|
|
592
|
+
let itemCount = 0;
|
|
593
|
+
for (let loc = 0; loc < this.content.length; loc++) {
|
|
594
|
+
const content = this.content[loc];
|
|
595
|
+
if (!content) continue;
|
|
596
|
+
let expired = true;
|
|
597
|
+
for (const identifier of content.items) {
|
|
598
|
+
const info = this.itemInfo.get(identifier);
|
|
599
|
+
if (info !== undefined && now - info.lastAccess <= this.maxAge) {
|
|
600
|
+
expired = false;
|
|
601
|
+
break;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
if (!expired) continue;
|
|
605
|
+
for (const identifier of content.items) this.itemInfo.delete(identifier);
|
|
606
|
+
this.content[loc] = undefined;
|
|
607
|
+
packCount++;
|
|
608
|
+
itemCount += content.items.size;
|
|
609
|
+
}
|
|
610
|
+
if (packCount > 0) {
|
|
611
|
+
this.logger.log(
|
|
612
|
+
"Garbage Collected %d completely expired packs with %d items",
|
|
613
|
+
packCount,
|
|
614
|
+
itemCount
|
|
615
|
+
);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
562
619
|
/**
|
|
563
620
|
* Find the content with the oldest item and run GC on that.
|
|
564
621
|
* Only runs for one content to avoid large invalidation.
|
|
@@ -571,11 +628,10 @@ class Pack {
|
|
|
571
628
|
oldest = info;
|
|
572
629
|
}
|
|
573
630
|
}
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
const loc = /** @type {PackItemInfo} */ (oldest).location;
|
|
631
|
+
// collecting expired content may have left no items at all
|
|
632
|
+
if (oldest === undefined) return;
|
|
633
|
+
if (Date.now() - oldest.lastAccess > this.maxAge) {
|
|
634
|
+
const loc = oldest.location;
|
|
579
635
|
if (loc < 0) return;
|
|
580
636
|
const content = /** @type {PackContent} */ (this.content[loc]);
|
|
581
637
|
const items = new Set(content.items);
|
|
@@ -604,12 +660,14 @@ class Pack {
|
|
|
604
660
|
}
|
|
605
661
|
|
|
606
662
|
/**
|
|
663
|
+
* Serializes this instance into the provided serializer context.
|
|
607
664
|
* @param {ObjectSerializerContext} context context
|
|
608
665
|
*/
|
|
609
666
|
serialize({ write, writeSeparate }) {
|
|
610
667
|
this._persistFreshContent();
|
|
611
668
|
this._optimizeSmallContent();
|
|
612
669
|
this._optimizeUnusedContent();
|
|
670
|
+
this._gcExpiredContent();
|
|
613
671
|
this._gcOldestContent();
|
|
614
672
|
for (const identifier of this.itemInfo.keys()) {
|
|
615
673
|
write(identifier);
|
|
@@ -637,6 +695,7 @@ class Pack {
|
|
|
637
695
|
}
|
|
638
696
|
|
|
639
697
|
/**
|
|
698
|
+
* Restores this instance from the provided deserializer context.
|
|
640
699
|
* @param {ObjectDeserializerContext & { logger: Logger }} context context
|
|
641
700
|
*/
|
|
642
701
|
deserialize({ read, logger }) {
|
|
@@ -694,13 +753,16 @@ makeSerializable(Pack, "webpack/lib/cache/PackFileCacheStrategy", "Pack");
|
|
|
694
753
|
|
|
695
754
|
class PackContentItems {
|
|
696
755
|
/**
|
|
756
|
+
* Creates an instance of PackContentItems.
|
|
697
757
|
* @param {Content} map items
|
|
698
758
|
*/
|
|
699
759
|
constructor(map) {
|
|
760
|
+
/** @type {Content} */
|
|
700
761
|
this.map = map;
|
|
701
762
|
}
|
|
702
763
|
|
|
703
764
|
/**
|
|
765
|
+
* Serializes this instance into the provided serializer context.
|
|
704
766
|
* @param {ObjectSerializerContext & { logger: Logger, profile: boolean | undefined }} context context
|
|
705
767
|
*/
|
|
706
768
|
serialize({ write, snapshot, rollback, logger, profile }) {
|
|
@@ -778,13 +840,14 @@ class PackContentItems {
|
|
|
778
840
|
}
|
|
779
841
|
|
|
780
842
|
/**
|
|
843
|
+
* Restores this instance from the provided deserializer context.
|
|
781
844
|
* @param {ObjectDeserializerContext & { logger: Logger, profile: boolean | undefined }} context context
|
|
782
845
|
*/
|
|
783
846
|
deserialize({ read, logger, profile }) {
|
|
784
847
|
if (read()) {
|
|
785
848
|
this.map = read();
|
|
786
849
|
} else if (profile) {
|
|
787
|
-
/** @type {
|
|
850
|
+
/** @type {Content} */
|
|
788
851
|
const map = new Map();
|
|
789
852
|
let key = read();
|
|
790
853
|
while (key !== null) {
|
|
@@ -810,7 +873,7 @@ class PackContentItems {
|
|
|
810
873
|
}
|
|
811
874
|
this.map = map;
|
|
812
875
|
} else {
|
|
813
|
-
/** @type {
|
|
876
|
+
/** @type {Content} */
|
|
814
877
|
const map = new Map();
|
|
815
878
|
let key = read();
|
|
816
879
|
while (key !== null) {
|
|
@@ -851,6 +914,7 @@ class PackContent {
|
|
|
851
914
|
*/
|
|
852
915
|
|
|
853
916
|
/**
|
|
917
|
+
* Creates an instance of PackContent.
|
|
854
918
|
* @param {Items} items keys
|
|
855
919
|
* @param {Items} usedItems used keys
|
|
856
920
|
* @param {PackContentItems | (() => Promise<PackContentItems>)} dataOrFn sync or async content
|
|
@@ -875,6 +939,7 @@ class PackContent {
|
|
|
875
939
|
}
|
|
876
940
|
|
|
877
941
|
/**
|
|
942
|
+
* Returns result.
|
|
878
943
|
* @param {string} identifier identifier
|
|
879
944
|
* @returns {string | Promise<string>} result
|
|
880
945
|
*/
|
|
@@ -927,6 +992,7 @@ class PackContent {
|
|
|
927
992
|
}
|
|
928
993
|
|
|
929
994
|
/**
|
|
995
|
+
* Returns maybe a promise if lazy.
|
|
930
996
|
* @param {string} reason explanation why unpack is necessary
|
|
931
997
|
* @returns {void | Promise<void>} maybe a promise if lazy
|
|
932
998
|
*/
|
|
@@ -971,6 +1037,7 @@ class PackContent {
|
|
|
971
1037
|
}
|
|
972
1038
|
|
|
973
1039
|
/**
|
|
1040
|
+
* Returns the estimated size for the requested source type.
|
|
974
1041
|
* @returns {number} size of the content or -1 if not known
|
|
975
1042
|
*/
|
|
976
1043
|
getSize() {
|
|
@@ -985,6 +1052,7 @@ class PackContent {
|
|
|
985
1052
|
}
|
|
986
1053
|
|
|
987
1054
|
/**
|
|
1055
|
+
* Processes the provided identifier.
|
|
988
1056
|
* @param {string} identifier identifier
|
|
989
1057
|
*/
|
|
990
1058
|
delete(identifier) {
|
|
@@ -994,6 +1062,7 @@ class PackContent {
|
|
|
994
1062
|
}
|
|
995
1063
|
|
|
996
1064
|
/**
|
|
1065
|
+
* Processes the provided write.
|
|
997
1066
|
* @param {(lazy: LazyFunction) => (() => PackContentItems | Promise<PackContentItems>)} write write function
|
|
998
1067
|
* @returns {void}
|
|
999
1068
|
*/
|
|
@@ -1086,6 +1155,7 @@ class PackContent {
|
|
|
1086
1155
|
}
|
|
1087
1156
|
|
|
1088
1157
|
/**
|
|
1158
|
+
* Allow collecting memory.
|
|
1089
1159
|
* @param {Buffer} buf buffer
|
|
1090
1160
|
* @returns {Buffer} buffer that can be collected
|
|
1091
1161
|
*/
|
|
@@ -1099,6 +1169,7 @@ const allowCollectingMemory = (buf) => {
|
|
|
1099
1169
|
|
|
1100
1170
|
class PackFileCacheStrategy {
|
|
1101
1171
|
/**
|
|
1172
|
+
* Creates an instance of PackFileCacheStrategy.
|
|
1102
1173
|
* @param {object} options options
|
|
1103
1174
|
* @param {Compiler} options.compiler the compiler
|
|
1104
1175
|
* @param {IntermediateFileSystem} options.fs the filesystem
|
|
@@ -1110,7 +1181,7 @@ class PackFileCacheStrategy {
|
|
|
1110
1181
|
* @param {number} options.maxAge max age of cache items
|
|
1111
1182
|
* @param {boolean=} options.profile track and log detailed timing information for individual cache items
|
|
1112
1183
|
* @param {boolean=} options.allowCollectingMemory allow to collect unused memory created during deserialization
|
|
1113
|
-
* @param {false | "gzip" | "brotli"=} options.compression compression used
|
|
1184
|
+
* @param {false | "gzip" | "brotli" | "zstd"=} options.compression compression used
|
|
1114
1185
|
* @param {boolean=} options.readonly disable storing cache into filesystem
|
|
1115
1186
|
*/
|
|
1116
1187
|
constructor({
|
|
@@ -1142,6 +1213,8 @@ class PackFileCacheStrategy {
|
|
|
1142
1213
|
});
|
|
1143
1214
|
/** @type {Compiler} */
|
|
1144
1215
|
this.compiler = compiler;
|
|
1216
|
+
/** @type {IntermediateFileSystem} */
|
|
1217
|
+
this.fs = fs;
|
|
1145
1218
|
/** @type {string} */
|
|
1146
1219
|
this.context = context;
|
|
1147
1220
|
/** @type {string} */
|
|
@@ -1158,15 +1231,25 @@ class PackFileCacheStrategy {
|
|
|
1158
1231
|
this.readonly = readonly;
|
|
1159
1232
|
/** @type {boolean | undefined} */
|
|
1160
1233
|
this.allowCollectingMemory = allowCollectingMemory;
|
|
1161
|
-
|
|
1234
|
+
// referenced names per on-disk file, versioned by mtime since concurrent
|
|
1235
|
+
// processes may rewrite packs in place under the same name
|
|
1236
|
+
/** @type {Map<string, { mtimeMs: number, referenced: string[] }>} */
|
|
1237
|
+
this._referencedFilesCache = new Map();
|
|
1238
|
+
/** @type {false | "gzip" | "brotli" | "zstd" | undefined} */
|
|
1162
1239
|
this.compression = compression;
|
|
1240
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
1241
|
+
if (compression === "zstd" && !require("zlib").createZstdCompress) {
|
|
1242
|
+
throw new Error("cache.compression: 'zstd' requires Node.js >= 22.15.0");
|
|
1243
|
+
}
|
|
1163
1244
|
/** @type {string} */
|
|
1164
1245
|
this._extension =
|
|
1165
1246
|
compression === "brotli"
|
|
1166
1247
|
? ".pack.br"
|
|
1167
1248
|
: compression === "gzip"
|
|
1168
1249
|
? ".pack.gz"
|
|
1169
|
-
: "
|
|
1250
|
+
: compression === "zstd"
|
|
1251
|
+
? ".pack.zst"
|
|
1252
|
+
: ".pack";
|
|
1170
1253
|
/** @type {SnapshotOptions} */
|
|
1171
1254
|
this.snapshot = snapshot;
|
|
1172
1255
|
/** @type {BuildDependencies} */
|
|
@@ -1186,6 +1269,7 @@ class PackFileCacheStrategy {
|
|
|
1186
1269
|
}
|
|
1187
1270
|
|
|
1188
1271
|
/**
|
|
1272
|
+
* Returns pack.
|
|
1189
1273
|
* @returns {Promise<Pack>} pack
|
|
1190
1274
|
*/
|
|
1191
1275
|
_getPack() {
|
|
@@ -1196,6 +1280,7 @@ class PackFileCacheStrategy {
|
|
|
1196
1280
|
}
|
|
1197
1281
|
|
|
1198
1282
|
/**
|
|
1283
|
+
* Returns the pack.
|
|
1199
1284
|
* @returns {Promise<Pack>} the pack
|
|
1200
1285
|
*/
|
|
1201
1286
|
_openPack() {
|
|
@@ -1362,6 +1447,7 @@ class PackFileCacheStrategy {
|
|
|
1362
1447
|
}
|
|
1363
1448
|
|
|
1364
1449
|
/**
|
|
1450
|
+
* Returns promise.
|
|
1365
1451
|
* @param {string} identifier unique name for the resource
|
|
1366
1452
|
* @param {Etag | null} etag etag of the resource
|
|
1367
1453
|
* @param {Data} data cached content
|
|
@@ -1376,6 +1462,7 @@ class PackFileCacheStrategy {
|
|
|
1376
1462
|
}
|
|
1377
1463
|
|
|
1378
1464
|
/**
|
|
1465
|
+
* Returns promise to the cached content.
|
|
1379
1466
|
* @param {string} identifier unique name for the resource
|
|
1380
1467
|
* @param {Etag | null} etag etag of the resource
|
|
1381
1468
|
* @returns {Promise<Data>} promise to the cached content
|
|
@@ -1396,6 +1483,7 @@ class PackFileCacheStrategy {
|
|
|
1396
1483
|
}
|
|
1397
1484
|
|
|
1398
1485
|
/**
|
|
1486
|
+
* Stores build dependencies.
|
|
1399
1487
|
* @param {FileSystemDependencies | Iterable<string>} dependencies dependencies to store
|
|
1400
1488
|
*/
|
|
1401
1489
|
storeBuildDependencies(dependencies) {
|
|
@@ -1429,6 +1517,7 @@ class PackFileCacheStrategy {
|
|
|
1429
1517
|
);
|
|
1430
1518
|
promise = new Promise(
|
|
1431
1519
|
/**
|
|
1520
|
+
* Handles the callback logic for this hook.
|
|
1432
1521
|
* @param {(value?: undefined) => void} resolve resolve
|
|
1433
1522
|
* @param {(reason?: Error) => void} reject reject
|
|
1434
1523
|
*/
|
|
@@ -1552,10 +1641,17 @@ class PackFileCacheStrategy {
|
|
|
1552
1641
|
/** @type {Snapshot} */
|
|
1553
1642
|
(this.resolveBuildDependenciesSnapshot)
|
|
1554
1643
|
);
|
|
1644
|
+
const cleanup = this.fs.unlink !== undefined;
|
|
1645
|
+
/** @type {Set<string> | undefined} */
|
|
1646
|
+
const writtenFiles = cleanup ? new Set() : undefined;
|
|
1647
|
+
/** @type {Set<string> | undefined} */
|
|
1648
|
+
const retainedFiles = cleanup ? new Set() : undefined;
|
|
1555
1649
|
return this.fileSerializer
|
|
1556
1650
|
.serialize(content, {
|
|
1557
1651
|
filename: `${this.cacheLocation}/index${this._extension}`,
|
|
1558
1652
|
extension: `${this._extension}`,
|
|
1653
|
+
writtenFiles,
|
|
1654
|
+
retainedFiles,
|
|
1559
1655
|
logger: this.logger,
|
|
1560
1656
|
profile: this.profile
|
|
1561
1657
|
})
|
|
@@ -1572,9 +1668,17 @@ class PackFileCacheStrategy {
|
|
|
1572
1668
|
stats.count,
|
|
1573
1669
|
Math.round(stats.size / 1024 / 1024)
|
|
1574
1670
|
);
|
|
1671
|
+
if (writtenFiles !== undefined) {
|
|
1672
|
+
return this._cleanupUnusedFiles(
|
|
1673
|
+
writtenFiles,
|
|
1674
|
+
/** @type {Set<string>} */ (retainedFiles)
|
|
1675
|
+
);
|
|
1676
|
+
}
|
|
1575
1677
|
})
|
|
1576
1678
|
.catch((err) => {
|
|
1577
1679
|
this.logger.timeEnd("store pack");
|
|
1680
|
+
// files may be in an unknown state after a failed store
|
|
1681
|
+
this._referencedFilesCache.clear();
|
|
1578
1682
|
this.logger.warn(`Caching failed for pack: ${err}`);
|
|
1579
1683
|
this.logger.debug(err.stack);
|
|
1580
1684
|
});
|
|
@@ -1586,6 +1690,192 @@ class PackFileCacheStrategy {
|
|
|
1586
1690
|
}));
|
|
1587
1691
|
}
|
|
1588
1692
|
|
|
1693
|
+
/**
|
|
1694
|
+
* Reads when the currently unreferenced files were first seen. A missing or
|
|
1695
|
+
* unreadable file just restarts the grace period for every orphan.
|
|
1696
|
+
* @returns {Promise<UnreferencedFiles>} first seen time and size per file name
|
|
1697
|
+
*/
|
|
1698
|
+
_readUnreferencedFiles() {
|
|
1699
|
+
return new Promise((resolve) => {
|
|
1700
|
+
this.fs.readFile(
|
|
1701
|
+
`${this.cacheLocation}/${UNREFERENCED_FILE}`,
|
|
1702
|
+
(err, content) => {
|
|
1703
|
+
/** @type {UnreferencedFiles} */
|
|
1704
|
+
const result = new Map();
|
|
1705
|
+
if (err) return resolve(result);
|
|
1706
|
+
try {
|
|
1707
|
+
const data = JSON.parse(
|
|
1708
|
+
/** @type {Buffer} */ (content).toString("utf8")
|
|
1709
|
+
);
|
|
1710
|
+
for (const [file, entry] of Object.entries(data)) {
|
|
1711
|
+
const { firstSeen, size } = /** @type {UnreferencedFile} */ (
|
|
1712
|
+
entry
|
|
1713
|
+
);
|
|
1714
|
+
if (typeof firstSeen === "number" && typeof size === "number") {
|
|
1715
|
+
result.set(file, { firstSeen, size });
|
|
1716
|
+
}
|
|
1717
|
+
}
|
|
1718
|
+
} catch (_err) {
|
|
1719
|
+
result.clear();
|
|
1720
|
+
}
|
|
1721
|
+
resolve(result);
|
|
1722
|
+
}
|
|
1723
|
+
);
|
|
1724
|
+
});
|
|
1725
|
+
}
|
|
1726
|
+
|
|
1727
|
+
/**
|
|
1728
|
+
* Persists when the still unreferenced files were first seen. Failing to write
|
|
1729
|
+
* only costs the orphans another grace period, so errors are ignored.
|
|
1730
|
+
* @param {UnreferencedFiles} unreferenced first seen time and size per file name
|
|
1731
|
+
* @param {boolean} hadEntries whether a previous state exists that must be replaced
|
|
1732
|
+
* @returns {Promise<void>} promise
|
|
1733
|
+
*/
|
|
1734
|
+
_writeUnreferencedFiles(unreferenced, hadEntries) {
|
|
1735
|
+
if (unreferenced.size === 0 && !hadEntries) return Promise.resolve();
|
|
1736
|
+
/** @type {Record<string, UnreferencedFile>} */
|
|
1737
|
+
const data = {};
|
|
1738
|
+
for (const [file, entry] of unreferenced) data[file] = entry;
|
|
1739
|
+
return new Promise((resolve) => {
|
|
1740
|
+
this.fs.writeFile(
|
|
1741
|
+
`${this.cacheLocation}/${UNREFERENCED_FILE}`,
|
|
1742
|
+
JSON.stringify(data),
|
|
1743
|
+
() => resolve()
|
|
1744
|
+
);
|
|
1745
|
+
});
|
|
1746
|
+
}
|
|
1747
|
+
|
|
1748
|
+
/**
|
|
1749
|
+
* Deletes files from the cache directory that are no longer referenced by the
|
|
1750
|
+
* stored pack. Retained files are walked on disk since nested lazy segments
|
|
1751
|
+
* reference files not visible during serialization. Errors only log a warning.
|
|
1752
|
+
* @param {Set<string>} writtenNames names (without extension) written by this store
|
|
1753
|
+
* @param {Set<string>} retainedNames names (without extension) referenced but not rewritten
|
|
1754
|
+
* @returns {Promise<void>} promise
|
|
1755
|
+
*/
|
|
1756
|
+
async _cleanupUnusedFiles(writtenNames, retainedNames) {
|
|
1757
|
+
this.logger.time("cleanup unused cache files");
|
|
1758
|
+
const fs = this.fs;
|
|
1759
|
+
const extension = this._extension;
|
|
1760
|
+
const cacheLocation = this.cacheLocation;
|
|
1761
|
+
const referencedFilesCache = this._referencedFilesCache;
|
|
1762
|
+
try {
|
|
1763
|
+
// rewritten files may reference different names now
|
|
1764
|
+
for (const name of writtenNames) referencedFilesCache.delete(name);
|
|
1765
|
+
/** @type {Set<string>} */
|
|
1766
|
+
const liveFiles = new Set([`index${extension}`, UNREFERENCED_FILE]);
|
|
1767
|
+
for (const name of writtenNames) liveFiles.add(`${name}${extension}`);
|
|
1768
|
+
/** @type {string[]} */
|
|
1769
|
+
const queue = [];
|
|
1770
|
+
/**
|
|
1771
|
+
* Marks a file live and queues it for walking its references.
|
|
1772
|
+
* @param {string} name file name without extension
|
|
1773
|
+
*/
|
|
1774
|
+
const enqueue = (name) => {
|
|
1775
|
+
const file = `${name}${extension}`;
|
|
1776
|
+
if (liveFiles.has(file)) return;
|
|
1777
|
+
liveFiles.add(file);
|
|
1778
|
+
queue.push(name);
|
|
1779
|
+
};
|
|
1780
|
+
for (const name of retainedNames) enqueue(name);
|
|
1781
|
+
while (queue.length > 0) {
|
|
1782
|
+
const name = /** @type {string} */ (queue.pop());
|
|
1783
|
+
const file = `${cacheLocation}/${name}${extension}`;
|
|
1784
|
+
// an unchanged mtime proves the memo entry still matches the disk
|
|
1785
|
+
const mtimeMs = await new Promise((resolve, reject) => {
|
|
1786
|
+
fs.stat(file, (err, stats) => {
|
|
1787
|
+
if (err) return reject(err);
|
|
1788
|
+
resolve(
|
|
1789
|
+
/** @type {number} */ (
|
|
1790
|
+
/** @type {import("../util/fs").IStats} */ (stats).mtimeMs
|
|
1791
|
+
)
|
|
1792
|
+
);
|
|
1793
|
+
});
|
|
1794
|
+
});
|
|
1795
|
+
const entry = referencedFilesCache.get(name);
|
|
1796
|
+
let referenced;
|
|
1797
|
+
if (entry !== undefined && entry.mtimeMs === mtimeMs) {
|
|
1798
|
+
referenced = entry.referenced;
|
|
1799
|
+
} else {
|
|
1800
|
+
referenced = await getReferencedFilenames(fs, file);
|
|
1801
|
+
referencedFilesCache.set(name, { mtimeMs, referenced });
|
|
1802
|
+
}
|
|
1803
|
+
for (const referencedName of referenced) enqueue(referencedName);
|
|
1804
|
+
}
|
|
1805
|
+
const files = await new Promise((resolve, reject) => {
|
|
1806
|
+
fs.readdir(cacheLocation, (err, files) => {
|
|
1807
|
+
if (err) return reject(err);
|
|
1808
|
+
resolve(/** @type {string[]} */ (files));
|
|
1809
|
+
});
|
|
1810
|
+
});
|
|
1811
|
+
const seenFiles = await this._readUnreferencedFiles();
|
|
1812
|
+
const now = Date.now();
|
|
1813
|
+
// every store rewrites the index backup, so a recorded time would age a file
|
|
1814
|
+
// that is in fact new; renaming carries the previous index mtime onto it
|
|
1815
|
+
const indexBackup = `index${extension}.old`;
|
|
1816
|
+
/** @type {UnreferencedFiles} */
|
|
1817
|
+
const stillUnreferenced = new Map();
|
|
1818
|
+
let deletedCount = 0;
|
|
1819
|
+
for (const file of files) {
|
|
1820
|
+
if (typeof file !== "string" || liveFiles.has(file)) continue;
|
|
1821
|
+
const path = `${cacheLocation}/${file}`;
|
|
1822
|
+
const stats = await new Promise((resolve) => {
|
|
1823
|
+
fs.stat(path, (err, stats) => {
|
|
1824
|
+
resolve(
|
|
1825
|
+
err
|
|
1826
|
+
? undefined
|
|
1827
|
+
: /** @type {import("../util/fs").IStats} */ (stats)
|
|
1828
|
+
);
|
|
1829
|
+
});
|
|
1830
|
+
});
|
|
1831
|
+
if (stats === undefined || !stats.isFile()) continue;
|
|
1832
|
+
const size = /** @type {number} */ (stats.size);
|
|
1833
|
+
const seen = seenFiles.get(file);
|
|
1834
|
+
// a differing size means the name was rewritten, so it is a new orphan
|
|
1835
|
+
const firstSeen =
|
|
1836
|
+
seen !== undefined && seen.size === size ? seen.firstSeen : now;
|
|
1837
|
+
const expireTime = now - CLEANUP_GRACE_PERIOD;
|
|
1838
|
+
const mtimeMs = /** @type {number} */ (stats.mtimeMs);
|
|
1839
|
+
// either signal is enough: modification times are lost when a cache is
|
|
1840
|
+
// restored, and recorded times are lost when the cache directory is new
|
|
1841
|
+
const expired =
|
|
1842
|
+
mtimeMs <= expireTime ||
|
|
1843
|
+
(file !== indexBackup &&
|
|
1844
|
+
firstSeen <= expireTime &&
|
|
1845
|
+
mtimeMs <= now - CLEANUP_RECENT_WRITE_PERIOD);
|
|
1846
|
+
if (expired) {
|
|
1847
|
+
const deleted = await new Promise((resolve) => {
|
|
1848
|
+
/** @type {NonNullable<IntermediateFileSystem["unlink"]>} */
|
|
1849
|
+
(fs.unlink)(path, (err) => resolve(!err));
|
|
1850
|
+
});
|
|
1851
|
+
if (deleted) {
|
|
1852
|
+
deletedCount++;
|
|
1853
|
+
continue;
|
|
1854
|
+
}
|
|
1855
|
+
}
|
|
1856
|
+
if (file !== indexBackup) {
|
|
1857
|
+
stillUnreferenced.set(file, { firstSeen, size });
|
|
1858
|
+
}
|
|
1859
|
+
}
|
|
1860
|
+
await this._writeUnreferencedFiles(stillUnreferenced, seenFiles.size > 0);
|
|
1861
|
+
// drop entries of files that are no longer alive
|
|
1862
|
+
for (const name of referencedFilesCache.keys()) {
|
|
1863
|
+
if (!liveFiles.has(`${name}${extension}`)) {
|
|
1864
|
+
referencedFilesCache.delete(name);
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
1867
|
+
if (deletedCount > 0) {
|
|
1868
|
+
this.logger.log("Deleted %d unused cache files", deletedCount);
|
|
1869
|
+
}
|
|
1870
|
+
} catch (err) {
|
|
1871
|
+
this.logger.warn(
|
|
1872
|
+
`Cleanup of unused cache files failed: ${/** @type {Error} */ (err)}`
|
|
1873
|
+
);
|
|
1874
|
+
this.logger.debug(/** @type {Error} */ (err).stack);
|
|
1875
|
+
}
|
|
1876
|
+
this.logger.timeEnd("cleanup unused cache files");
|
|
1877
|
+
}
|
|
1878
|
+
|
|
1589
1879
|
clear() {
|
|
1590
1880
|
this.fileSystemInfo.clear();
|
|
1591
1881
|
this.buildDependencies.clear();
|