@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
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
"use strict";
|
|
6
6
|
|
|
7
|
-
/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
|
|
8
|
-
/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
|
|
7
|
+
/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext<[number]>} ObjectDeserializerContext */
|
|
8
|
+
/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext<[number]>} ObjectSerializerContext */
|
|
9
9
|
|
|
10
10
|
class DateObjectSerializer {
|
|
11
11
|
/**
|
|
12
|
+
* Serializes this instance into the provided serializer context.
|
|
12
13
|
* @param {Date} obj date
|
|
13
14
|
* @param {ObjectSerializerContext} context context
|
|
14
15
|
*/
|
|
@@ -17,6 +18,7 @@ class DateObjectSerializer {
|
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
/**
|
|
21
|
+
* Restores this instance from the provided deserializer context.
|
|
20
22
|
* @param {ObjectDeserializerContext} context context
|
|
21
23
|
* @returns {Date} date
|
|
22
24
|
*/
|
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
"use strict";
|
|
6
6
|
|
|
7
|
-
/** @typedef {import("./
|
|
8
|
-
/** @typedef {import("./ObjectMiddleware").
|
|
7
|
+
/** @typedef {import("./types").ComplexSerializableType} ComplexSerializableType */
|
|
8
|
+
/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext<ComplexSerializableType[]>} ObjectDeserializerContext */
|
|
9
|
+
/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext<ComplexSerializableType[]>} ObjectSerializerContext */
|
|
9
10
|
|
|
10
11
|
/** @typedef {Error & { cause?: unknown }} ErrorWithCause */
|
|
11
12
|
|
|
12
13
|
class ErrorObjectSerializer {
|
|
13
14
|
/**
|
|
15
|
+
* Creates an instance of ErrorObjectSerializer.
|
|
14
16
|
* @param {ErrorConstructor | EvalErrorConstructor | RangeErrorConstructor | ReferenceErrorConstructor | SyntaxErrorConstructor | TypeErrorConstructor} Type error type
|
|
15
17
|
*/
|
|
16
18
|
constructor(Type) {
|
|
@@ -18,6 +20,7 @@ class ErrorObjectSerializer {
|
|
|
18
20
|
}
|
|
19
21
|
|
|
20
22
|
/**
|
|
23
|
+
* Serializes this instance into the provided serializer context.
|
|
21
24
|
* @param {Error | EvalError | RangeError | ReferenceError | SyntaxError | TypeError} obj error
|
|
22
25
|
* @param {ObjectSerializerContext} context context
|
|
23
26
|
*/
|
|
@@ -25,20 +28,21 @@ class ErrorObjectSerializer {
|
|
|
25
28
|
context.write(obj.message);
|
|
26
29
|
context.write(obj.stack);
|
|
27
30
|
context.write(
|
|
28
|
-
/** @type {
|
|
29
|
-
(obj).cause
|
|
31
|
+
/** @type {ComplexSerializableType} */
|
|
32
|
+
(/** @type {ErrorWithCause} */ (obj).cause)
|
|
30
33
|
);
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
/**
|
|
37
|
+
* Restores this instance from the provided deserializer context.
|
|
34
38
|
* @param {ObjectDeserializerContext} context context
|
|
35
39
|
* @returns {Error | EvalError | RangeError | ReferenceError | SyntaxError | TypeError} error
|
|
36
40
|
*/
|
|
37
41
|
deserialize(context) {
|
|
38
42
|
const err = new this.Type();
|
|
39
43
|
|
|
40
|
-
err.message = context.read();
|
|
41
|
-
err.stack = context.read();
|
|
44
|
+
err.message = /** @type {string} */ (context.read());
|
|
45
|
+
err.stack = /** @type {string | undefined} */ (context.read());
|
|
42
46
|
/** @type {ErrorWithCause} */
|
|
43
47
|
(err).cause = context.read();
|
|
44
48
|
|
|
@@ -7,13 +7,23 @@
|
|
|
7
7
|
const { constants } = require("buffer");
|
|
8
8
|
const { pipeline } = require("stream");
|
|
9
9
|
const {
|
|
10
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
11
|
+
brotliDecompress,
|
|
10
12
|
constants: zConstants,
|
|
11
13
|
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
12
14
|
createBrotliCompress,
|
|
13
15
|
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
14
16
|
createBrotliDecompress,
|
|
15
17
|
createGunzip,
|
|
16
|
-
createGzip
|
|
18
|
+
createGzip,
|
|
19
|
+
// zstd is only available on Node.js >= 22.15; guarded at use sites
|
|
20
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
21
|
+
createZstdCompress,
|
|
22
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
23
|
+
createZstdDecompress,
|
|
24
|
+
gunzip,
|
|
25
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
26
|
+
zstdDecompress
|
|
17
27
|
} = require("zlib");
|
|
18
28
|
const { DEFAULTS } = require("../config/defaults");
|
|
19
29
|
const createHash = require("../util/createHash");
|
|
@@ -46,8 +56,11 @@ Section -> Buffer
|
|
|
46
56
|
const VERSION = 0x01637077;
|
|
47
57
|
const WRITE_LIMIT_TOTAL = 0x7fff0000;
|
|
48
58
|
const WRITE_LIMIT_CHUNK = 511 * 1024 * 1024;
|
|
59
|
+
// headers and pointer sections are tiny; anything above this is a corrupt file
|
|
60
|
+
const MAX_HEADER_OR_POINTER_SIZE = 256 * 1024 * 1024;
|
|
49
61
|
|
|
50
62
|
/**
|
|
63
|
+
* Returns hash.
|
|
51
64
|
* @param {Buffer[]} buffers buffers
|
|
52
65
|
* @param {HashFunction} hashFunction hash function to use
|
|
53
66
|
* @returns {string} hash
|
|
@@ -85,6 +98,7 @@ const readUInt64LE = Buffer.prototype.readBigUInt64LE
|
|
|
85
98
|
/** @typedef {Promise<void | void[]>} BackgroundJob */
|
|
86
99
|
|
|
87
100
|
/**
|
|
101
|
+
* Defines the serialize result type used by this module.
|
|
88
102
|
* @typedef {object} SerializeResult
|
|
89
103
|
* @property {string | false} name
|
|
90
104
|
* @property {number} size
|
|
@@ -93,15 +107,18 @@ const readUInt64LE = Buffer.prototype.readBigUInt64LE
|
|
|
93
107
|
|
|
94
108
|
/** @typedef {{ name: string, size: number }} LazyOptions */
|
|
95
109
|
/**
|
|
110
|
+
* Defines the lazy function type used by this module.
|
|
96
111
|
* @typedef {import("./SerializerMiddleware").LazyFunction<BufferSerializableType[], Buffer, FileMiddleware, LazyOptions>} LazyFunction
|
|
97
112
|
*/
|
|
98
113
|
|
|
99
114
|
/**
|
|
115
|
+
* Serializes this instance into the provided serializer context.
|
|
100
116
|
* @param {FileMiddleware} middleware this
|
|
101
117
|
* @param {(BufferSerializableType | LazyFunction)[]} data data to be serialized
|
|
102
118
|
* @param {string | boolean} name file base name
|
|
103
119
|
* @param {(name: string | false, buffers: Buffer[], size: number) => Promise<void>} writeFile writes a file
|
|
104
120
|
* @param {HashFunction=} hashFunction hash function to use
|
|
121
|
+
* @param {Set<string>=} retainedNames collects names of files that stay referenced without being rewritten
|
|
105
122
|
* @returns {Promise<SerializeResult>} resulting file pointer and promise
|
|
106
123
|
*/
|
|
107
124
|
const serialize = async (
|
|
@@ -109,7 +126,8 @@ const serialize = async (
|
|
|
109
126
|
data,
|
|
110
127
|
name,
|
|
111
128
|
writeFile,
|
|
112
|
-
hashFunction = DEFAULTS.HASH_FUNCTION
|
|
129
|
+
hashFunction = DEFAULTS.HASH_FUNCTION,
|
|
130
|
+
retainedNames = undefined
|
|
113
131
|
) => {
|
|
114
132
|
/** @type {(Buffer[] | Buffer | Promise<SerializeResult>)[]} */
|
|
115
133
|
const processedData = [];
|
|
@@ -135,6 +153,10 @@ const serialize = async (
|
|
|
135
153
|
"Unexpected lazy value with non-this target (can't pass through lazy values)"
|
|
136
154
|
);
|
|
137
155
|
} else {
|
|
156
|
+
if (retainedNames !== undefined) {
|
|
157
|
+
// pointer buffer layout: u64 size + utf-8 file name
|
|
158
|
+
retainedNames.add(serializedInfo.toString("utf8", 8));
|
|
159
|
+
}
|
|
138
160
|
processedData.push(serializedInfo);
|
|
139
161
|
}
|
|
140
162
|
} else {
|
|
@@ -148,7 +170,8 @@ const serialize = async (
|
|
|
148
170
|
(content),
|
|
149
171
|
(options && options.name) || true,
|
|
150
172
|
writeFile,
|
|
151
|
-
hashFunction
|
|
173
|
+
hashFunction,
|
|
174
|
+
retainedNames
|
|
152
175
|
).then((result) => {
|
|
153
176
|
/** @type {LazyOptions} */
|
|
154
177
|
(item.options).size = result.size;
|
|
@@ -243,6 +266,7 @@ const serialize = async (
|
|
|
243
266
|
};
|
|
244
267
|
|
|
245
268
|
/**
|
|
269
|
+
* Restores this instance from the provided deserializer context.
|
|
246
270
|
* @param {FileMiddleware} middleware this
|
|
247
271
|
* @param {string | false} name filename
|
|
248
272
|
* @param {(name: string | false) => Promise<Buffer[]>} readFile read content of a file
|
|
@@ -263,6 +287,7 @@ const deserialize = async (middleware, name, readFile) => {
|
|
|
263
287
|
contentPosition = 0;
|
|
264
288
|
};
|
|
265
289
|
/**
|
|
290
|
+
* Processes the provided n.
|
|
266
291
|
* @param {number} n number of bytes to ensure
|
|
267
292
|
*/
|
|
268
293
|
const ensureData = (n) => {
|
|
@@ -294,6 +319,7 @@ const deserialize = async (middleware, name, readFile) => {
|
|
|
294
319
|
}
|
|
295
320
|
};
|
|
296
321
|
/**
|
|
322
|
+
* Returns value value.
|
|
297
323
|
* @returns {number} value value
|
|
298
324
|
*/
|
|
299
325
|
const readUInt32LE = () => {
|
|
@@ -303,6 +329,7 @@ const deserialize = async (middleware, name, readFile) => {
|
|
|
303
329
|
return value;
|
|
304
330
|
};
|
|
305
331
|
/**
|
|
332
|
+
* Returns value value.
|
|
306
333
|
* @returns {number} value value
|
|
307
334
|
*/
|
|
308
335
|
const readInt32LE = () => {
|
|
@@ -312,6 +339,7 @@ const deserialize = async (middleware, name, readFile) => {
|
|
|
312
339
|
return value;
|
|
313
340
|
};
|
|
314
341
|
/**
|
|
342
|
+
* Returns buffer.
|
|
315
343
|
* @param {number} l length
|
|
316
344
|
* @returns {Buffer} buffer
|
|
317
345
|
*/
|
|
@@ -369,9 +397,13 @@ const deserialize = async (middleware, name, readFile) => {
|
|
|
369
397
|
);
|
|
370
398
|
result.push(lazy);
|
|
371
399
|
} else {
|
|
400
|
+
// A section may start exactly at a content-buffer boundary; advance
|
|
401
|
+
// first, then read from the fresh buffer (don't fall through to the
|
|
402
|
+
// `while` below, which would skip it).
|
|
372
403
|
if (contentPosition === contentItemLength) {
|
|
373
404
|
nextContent();
|
|
374
|
-
}
|
|
405
|
+
}
|
|
406
|
+
if (contentPosition !== 0) {
|
|
375
407
|
if (length <= contentItemLength - contentPosition) {
|
|
376
408
|
result.push(
|
|
377
409
|
Buffer.from(
|
|
@@ -426,13 +458,22 @@ const deserialize = async (middleware, name, readFile) => {
|
|
|
426
458
|
|
|
427
459
|
/** @typedef {BufferSerializableType[]} DeserializedType */
|
|
428
460
|
/** @typedef {true} SerializedType */
|
|
429
|
-
/**
|
|
461
|
+
/**
|
|
462
|
+
* `writtenFiles`/`retainedFiles` collect file names (without extension) during
|
|
463
|
+
* `serialize`: files written in this run and files that stay referenced by
|
|
464
|
+
* lazy pointers without being rewritten. Retained files may reference further
|
|
465
|
+
* files on disk not listed here (nested lazy segments); use
|
|
466
|
+
* `getReferencedFilenames` to walk them.
|
|
467
|
+
* @typedef {{ filename: string, extension?: string, writtenFiles?: Set<string>, retainedFiles?: Set<string> }} Context
|
|
468
|
+
*/
|
|
430
469
|
|
|
431
470
|
/**
|
|
471
|
+
* Represents FileMiddleware.
|
|
432
472
|
* @extends {SerializerMiddleware<DeserializedType, SerializedType, Context>}
|
|
433
473
|
*/
|
|
434
474
|
class FileMiddleware extends SerializerMiddleware {
|
|
435
475
|
/**
|
|
476
|
+
* Creates an instance of FileMiddleware.
|
|
436
477
|
* @param {IntermediateFileSystem} fs filesystem
|
|
437
478
|
* @param {HashFunction} hashFunction hash function to use
|
|
438
479
|
*/
|
|
@@ -445,12 +486,13 @@ class FileMiddleware extends SerializerMiddleware {
|
|
|
445
486
|
}
|
|
446
487
|
|
|
447
488
|
/**
|
|
489
|
+
* Serializes this instance into the provided serializer context.
|
|
448
490
|
* @param {DeserializedType} data data
|
|
449
491
|
* @param {Context} context context object
|
|
450
492
|
* @returns {SerializedType | Promise<SerializedType> | null} serialized data
|
|
451
493
|
*/
|
|
452
494
|
serialize(data, context) {
|
|
453
|
-
const { filename, extension = "" } = context;
|
|
495
|
+
const { filename, extension = "", writtenFiles, retainedFiles } = context;
|
|
454
496
|
return new Promise((resolve, reject) => {
|
|
455
497
|
mkdirp(this.fs, dirname(this.fs, filename), (err) => {
|
|
456
498
|
if (err) return reject(err);
|
|
@@ -460,6 +502,7 @@ class FileMiddleware extends SerializerMiddleware {
|
|
|
460
502
|
/** @type {Set<string>} */
|
|
461
503
|
const allWrittenFiles = new Set();
|
|
462
504
|
/**
|
|
505
|
+
* Processes the provided name.
|
|
463
506
|
* @param {string | false} name name
|
|
464
507
|
* @param {Buffer[]} content content
|
|
465
508
|
* @param {number} size size
|
|
@@ -471,12 +514,13 @@ class FileMiddleware extends SerializerMiddleware {
|
|
|
471
514
|
: filename;
|
|
472
515
|
await new Promise(
|
|
473
516
|
/**
|
|
517
|
+
* Handles the callback logic for this hook.
|
|
474
518
|
* @param {(value?: undefined) => void} resolve resolve
|
|
475
519
|
* @param {(reason?: Error | null) => void} reject reject
|
|
476
520
|
*/
|
|
477
521
|
(resolve, reject) => {
|
|
478
522
|
let stream = this.fs.createWriteStream(`${file}_`);
|
|
479
|
-
/** @type {undefined | import("zlib").Gzip | import("zlib").BrotliCompress} */
|
|
523
|
+
/** @type {undefined | import("zlib").Gzip | import("zlib").BrotliCompress | import("zlib").ZstdCompress} */
|
|
480
524
|
let compression;
|
|
481
525
|
if (file.endsWith(".gz")) {
|
|
482
526
|
compression = createGzip({
|
|
@@ -493,6 +537,17 @@ class FileMiddleware extends SerializerMiddleware {
|
|
|
493
537
|
[zConstants.BROTLI_PARAM_SIZE_HINT]: size
|
|
494
538
|
}
|
|
495
539
|
});
|
|
540
|
+
} else if (file.endsWith(".zst")) {
|
|
541
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
542
|
+
const levelParam = zConstants.ZSTD_c_compressionLevel;
|
|
543
|
+
// default level 3; some runtimes (e.g. Deno) don't expose ZSTD_CLEVEL_DEFAULT
|
|
544
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
545
|
+
const defaultLevel = zConstants.ZSTD_CLEVEL_DEFAULT;
|
|
546
|
+
const level = defaultLevel === undefined ? 3 : defaultLevel;
|
|
547
|
+
compression = createZstdCompress({
|
|
548
|
+
chunkSize: COMPRESSION_CHUNK_SIZE,
|
|
549
|
+
params: { [levelParam]: level }
|
|
550
|
+
});
|
|
496
551
|
}
|
|
497
552
|
if (compression) {
|
|
498
553
|
pipeline(compression, stream, reject);
|
|
@@ -518,6 +573,7 @@ class FileMiddleware extends SerializerMiddleware {
|
|
|
518
573
|
const len = chunks.length;
|
|
519
574
|
let i = 0;
|
|
520
575
|
/**
|
|
576
|
+
* Processes the provided err.
|
|
521
577
|
* @param {(Error | null)=} err err
|
|
522
578
|
*/
|
|
523
579
|
const batchWrite = (err) => {
|
|
@@ -546,69 +602,81 @@ class FileMiddleware extends SerializerMiddleware {
|
|
|
546
602
|
batchWrite();
|
|
547
603
|
}
|
|
548
604
|
);
|
|
549
|
-
if (name)
|
|
605
|
+
if (name) {
|
|
606
|
+
allWrittenFiles.add(file);
|
|
607
|
+
if (writtenFiles !== undefined) writtenFiles.add(name);
|
|
608
|
+
}
|
|
550
609
|
};
|
|
551
610
|
|
|
552
611
|
resolve(
|
|
553
|
-
serialize(
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
(resolve) => {
|
|
563
|
-
this.fs.rename(filename, `${filename}.old`, (_err) => {
|
|
564
|
-
resolve();
|
|
565
|
-
});
|
|
566
|
-
}
|
|
567
|
-
);
|
|
612
|
+
serialize(
|
|
613
|
+
this,
|
|
614
|
+
data,
|
|
615
|
+
false,
|
|
616
|
+
writeFile,
|
|
617
|
+
this._hashFunction,
|
|
618
|
+
retainedFiles
|
|
619
|
+
).then(async ({ backgroundJob }) => {
|
|
620
|
+
await backgroundJob;
|
|
568
621
|
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
this.fs.rename(`${file}_`, file, (err) => {
|
|
582
|
-
if (err) return reject(err);
|
|
583
|
-
resolve();
|
|
584
|
-
});
|
|
585
|
-
}
|
|
586
|
-
)
|
|
587
|
-
)
|
|
588
|
-
);
|
|
622
|
+
// Rename the index file to disallow access during inconsistent file state
|
|
623
|
+
await new Promise(
|
|
624
|
+
/**
|
|
625
|
+
* Handles the callback logic for this hook.
|
|
626
|
+
* @param {(value?: undefined) => void} resolve resolve
|
|
627
|
+
*/
|
|
628
|
+
(resolve) => {
|
|
629
|
+
this.fs.rename(filename, `${filename}.old`, (_err) => {
|
|
630
|
+
resolve();
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
);
|
|
589
634
|
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
635
|
+
// update all written files
|
|
636
|
+
await Promise.all(
|
|
637
|
+
Array.from(
|
|
638
|
+
allWrittenFiles,
|
|
639
|
+
(file) =>
|
|
640
|
+
new Promise(
|
|
641
|
+
/**
|
|
642
|
+
* Handles the callback logic for this hook.
|
|
643
|
+
* @param {(value?: undefined) => void} resolve resolve
|
|
644
|
+
* @param {(reason?: Error | null) => void} reject reject
|
|
645
|
+
* @returns {void}
|
|
646
|
+
*/
|
|
647
|
+
(resolve, reject) => {
|
|
648
|
+
this.fs.rename(`${file}_`, file, (err) => {
|
|
649
|
+
if (err) return reject(err);
|
|
650
|
+
resolve();
|
|
651
|
+
});
|
|
652
|
+
}
|
|
653
|
+
)
|
|
654
|
+
)
|
|
655
|
+
);
|
|
656
|
+
|
|
657
|
+
// As final step automatically update the index file to have a consistent pack again
|
|
658
|
+
await new Promise(
|
|
659
|
+
/**
|
|
660
|
+
* Handles the callback logic for this hook.
|
|
661
|
+
* @param {(value?: undefined) => void} resolve resolve
|
|
662
|
+
* @returns {void}
|
|
663
|
+
*/
|
|
664
|
+
(resolve) => {
|
|
665
|
+
this.fs.rename(`${filename}_`, filename, (err) => {
|
|
666
|
+
if (err) return reject(err);
|
|
667
|
+
resolve();
|
|
668
|
+
});
|
|
669
|
+
}
|
|
670
|
+
);
|
|
671
|
+
return /** @type {true} */ (true);
|
|
672
|
+
})
|
|
606
673
|
);
|
|
607
674
|
});
|
|
608
675
|
});
|
|
609
676
|
}
|
|
610
677
|
|
|
611
678
|
/**
|
|
679
|
+
* Restores this instance from the provided deserializer context.
|
|
612
680
|
* @param {SerializedType} data data
|
|
613
681
|
* @param {Context} context context object
|
|
614
682
|
* @returns {DeserializedType | Promise<DeserializedType>} deserialized data
|
|
@@ -616,6 +684,7 @@ class FileMiddleware extends SerializerMiddleware {
|
|
|
616
684
|
deserialize(data, context) {
|
|
617
685
|
const { filename, extension = "" } = context;
|
|
618
686
|
/**
|
|
687
|
+
* Returns result.
|
|
619
688
|
* @param {string | boolean} name name
|
|
620
689
|
* @returns {Promise<Buffer[]>} result
|
|
621
690
|
*/
|
|
@@ -646,6 +715,10 @@ class FileMiddleware extends SerializerMiddleware {
|
|
|
646
715
|
decompression = createBrotliDecompress({
|
|
647
716
|
chunkSize: DECOMPRESSION_CHUNK_SIZE
|
|
648
717
|
});
|
|
718
|
+
} else if (file.endsWith(".zst")) {
|
|
719
|
+
decompression = createZstdDecompress({
|
|
720
|
+
chunkSize: DECOMPRESSION_CHUNK_SIZE
|
|
721
|
+
});
|
|
649
722
|
}
|
|
650
723
|
if (decompression) {
|
|
651
724
|
/** @typedef {(value: Buffer[] | PromiseLike<Buffer[]>) => void} NewResolve */
|
|
@@ -663,6 +736,7 @@ class FileMiddleware extends SerializerMiddleware {
|
|
|
663
736
|
}),
|
|
664
737
|
new Promise(
|
|
665
738
|
/**
|
|
739
|
+
* Handles the chunk size callback for this hook.
|
|
666
740
|
* @param {(value?: undefined) => void} resolve resolve
|
|
667
741
|
* @param {(reason?: Error) => void} reject reject
|
|
668
742
|
*/
|
|
@@ -763,4 +837,216 @@ class FileMiddleware extends SerializerMiddleware {
|
|
|
763
837
|
}
|
|
764
838
|
}
|
|
765
839
|
|
|
840
|
+
/**
|
|
841
|
+
* Extracts the file names referenced by lazy pointer sections from serialized content.
|
|
842
|
+
* @param {Buffer} buf decompressed file content
|
|
843
|
+
* @returns {string[]} referenced file names (without extension)
|
|
844
|
+
*/
|
|
845
|
+
const parsePointerNames = (buf) => {
|
|
846
|
+
const version = buf.readUInt32LE(0);
|
|
847
|
+
if (version !== VERSION) {
|
|
848
|
+
throw new Error(`Invalid file version ${version}`);
|
|
849
|
+
}
|
|
850
|
+
const sectionCount = buf.readUInt32LE(4);
|
|
851
|
+
let offset = 8 + sectionCount * 4;
|
|
852
|
+
// a corrupt section table must abort the walk, never silently drop a name
|
|
853
|
+
if (offset > buf.length) {
|
|
854
|
+
throw new Error(`Invalid section count ${sectionCount}`);
|
|
855
|
+
}
|
|
856
|
+
/** @type {string[]} */
|
|
857
|
+
const names = [];
|
|
858
|
+
for (let i = 0; i < sectionCount; i++) {
|
|
859
|
+
const length = buf.readInt32LE(8 + i * 4);
|
|
860
|
+
if (length < 0) {
|
|
861
|
+
// pointer section: u64 size + utf-8 file name
|
|
862
|
+
const end = offset - length;
|
|
863
|
+
if (end > buf.length) {
|
|
864
|
+
throw new Error("Truncated pointer section");
|
|
865
|
+
}
|
|
866
|
+
names.push(buf.toString("utf8", offset + 8, end));
|
|
867
|
+
offset = end;
|
|
868
|
+
} else {
|
|
869
|
+
offset += length;
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
if (offset !== buf.length) {
|
|
873
|
+
throw new Error("Section table does not match file size");
|
|
874
|
+
}
|
|
875
|
+
return names;
|
|
876
|
+
};
|
|
877
|
+
|
|
878
|
+
/**
|
|
879
|
+
* Reads the pointer names of a compressed file by decompressing it fully
|
|
880
|
+
* (compressed content cannot be read by byte range).
|
|
881
|
+
* @param {IntermediateFileSystem} fs a file system
|
|
882
|
+
* @param {string} file absolute path of the serialized file
|
|
883
|
+
* @returns {Promise<string[]>} referenced file names (without extension)
|
|
884
|
+
*/
|
|
885
|
+
const getReferencedFilenamesCompressed = (fs, file) =>
|
|
886
|
+
new Promise((resolve, reject) => {
|
|
887
|
+
fs.readFile(file, (err, rawContent) => {
|
|
888
|
+
if (err) return reject(err);
|
|
889
|
+
/**
|
|
890
|
+
* Parses the decompressed content.
|
|
891
|
+
* @param {Error | null} err error
|
|
892
|
+
* @param {Buffer=} content decompressed content
|
|
893
|
+
* @returns {void}
|
|
894
|
+
*/
|
|
895
|
+
const onContent = (err, content) => {
|
|
896
|
+
if (err) return reject(err);
|
|
897
|
+
try {
|
|
898
|
+
resolve(parsePointerNames(/** @type {Buffer} */ (content)));
|
|
899
|
+
} catch (err_) {
|
|
900
|
+
reject(/** @type {Error} */ (err_));
|
|
901
|
+
}
|
|
902
|
+
};
|
|
903
|
+
const buf = /** @type {Buffer} */ (rawContent);
|
|
904
|
+
if (file.endsWith(".gz")) {
|
|
905
|
+
gunzip(buf, onContent);
|
|
906
|
+
} else if (file.endsWith(".br")) {
|
|
907
|
+
brotliDecompress(buf, onContent);
|
|
908
|
+
} else {
|
|
909
|
+
if (!zstdDecompress) {
|
|
910
|
+
return reject(
|
|
911
|
+
new Error("zstd decompression requires Node.js >= 22.15.0")
|
|
912
|
+
);
|
|
913
|
+
}
|
|
914
|
+
zstdDecompress(buf, onContent);
|
|
915
|
+
}
|
|
916
|
+
});
|
|
917
|
+
});
|
|
918
|
+
|
|
919
|
+
/**
|
|
920
|
+
* Reads the pointer names of an uncompressed file by reading only the header
|
|
921
|
+
* and the pointer sections instead of the whole file.
|
|
922
|
+
* @param {IntermediateFileSystem} fs a file system
|
|
923
|
+
* @param {string} file absolute path of the serialized file
|
|
924
|
+
* @returns {Promise<string[]>} referenced file names (without extension)
|
|
925
|
+
*/
|
|
926
|
+
const getReferencedFilenamesUncompressed = (fs, file) =>
|
|
927
|
+
new Promise((resolve, reject) => {
|
|
928
|
+
fs.open(file, "r", (err, _fd) => {
|
|
929
|
+
if (err) return reject(err);
|
|
930
|
+
const fd = /** @type {number} */ (_fd);
|
|
931
|
+
/**
|
|
932
|
+
* Closes the file descriptor and rejects.
|
|
933
|
+
* @param {Error} err error
|
|
934
|
+
*/
|
|
935
|
+
const fail = (err) => {
|
|
936
|
+
fs.close(fd, () => reject(err));
|
|
937
|
+
};
|
|
938
|
+
/**
|
|
939
|
+
* Reads exactly `length` bytes at `position`.
|
|
940
|
+
* @param {number} position file position
|
|
941
|
+
* @param {number} length byte count
|
|
942
|
+
* @param {(buffer: Buffer) => void} callback called with the filled buffer
|
|
943
|
+
* @returns {void}
|
|
944
|
+
*/
|
|
945
|
+
const readAt = (position, length, callback) => {
|
|
946
|
+
// corrupt headers can request absurd sizes; must reject, not crash
|
|
947
|
+
if (length > MAX_HEADER_OR_POINTER_SIZE) {
|
|
948
|
+
return fail(new Error(`Invalid section size ${length} in ${file}`));
|
|
949
|
+
}
|
|
950
|
+
/** @type {Buffer} */
|
|
951
|
+
let buffer;
|
|
952
|
+
try {
|
|
953
|
+
buffer = Buffer.allocUnsafe(length);
|
|
954
|
+
} catch (err) {
|
|
955
|
+
return fail(/** @type {Error} */ (err));
|
|
956
|
+
}
|
|
957
|
+
let bytesDone = 0;
|
|
958
|
+
const readMore = () => {
|
|
959
|
+
fs.read(
|
|
960
|
+
fd,
|
|
961
|
+
buffer,
|
|
962
|
+
bytesDone,
|
|
963
|
+
length - bytesDone,
|
|
964
|
+
position + bytesDone,
|
|
965
|
+
(err, bytesRead) => {
|
|
966
|
+
if (err) return fail(err);
|
|
967
|
+
if (bytesRead === 0) {
|
|
968
|
+
return fail(new Error(`Unexpected end of file ${file}`));
|
|
969
|
+
}
|
|
970
|
+
bytesDone += bytesRead;
|
|
971
|
+
if (bytesDone < length) return readMore();
|
|
972
|
+
callback(buffer);
|
|
973
|
+
}
|
|
974
|
+
);
|
|
975
|
+
};
|
|
976
|
+
readMore();
|
|
977
|
+
};
|
|
978
|
+
readAt(0, 8, (header) => {
|
|
979
|
+
const version = header.readUInt32LE(0);
|
|
980
|
+
if (version !== VERSION) {
|
|
981
|
+
return fail(new Error(`Invalid file version ${version}`));
|
|
982
|
+
}
|
|
983
|
+
const sectionCount = header.readUInt32LE(4);
|
|
984
|
+
if (sectionCount === 0) {
|
|
985
|
+
return fs.close(fd, (err) => (err ? reject(err) : resolve([])));
|
|
986
|
+
}
|
|
987
|
+
readAt(8, sectionCount * 4, (lengthsBuffer) => {
|
|
988
|
+
/** @type {{ position: number, length: number }[]} */
|
|
989
|
+
const pointerSections = [];
|
|
990
|
+
let position = 8 + sectionCount * 4;
|
|
991
|
+
for (let i = 0; i < sectionCount; i++) {
|
|
992
|
+
const length = lengthsBuffer.readInt32LE(i * 4);
|
|
993
|
+
if (length < 0) {
|
|
994
|
+
pointerSections.push({ position, length: -length });
|
|
995
|
+
position -= length;
|
|
996
|
+
} else {
|
|
997
|
+
position += length;
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
// the section table must account for exactly the whole file,
|
|
1001
|
+
// otherwise pointer reads land on wrong bytes and under-report
|
|
1002
|
+
fs.stat(file, (err, stats) => {
|
|
1003
|
+
if (err) return fail(err);
|
|
1004
|
+
const stat = /** @type {import("../util/fs").IStats} */ (stats);
|
|
1005
|
+
if (stat.size !== position) {
|
|
1006
|
+
return fail(
|
|
1007
|
+
new Error(`Section table does not match size of ${file}`)
|
|
1008
|
+
);
|
|
1009
|
+
}
|
|
1010
|
+
/** @type {string[]} */
|
|
1011
|
+
const names = [];
|
|
1012
|
+
/**
|
|
1013
|
+
* Reads the pointer section at `index`, then the next one.
|
|
1014
|
+
* @param {number} index pointer section index
|
|
1015
|
+
* @returns {void}
|
|
1016
|
+
*/
|
|
1017
|
+
const readNext = (index) => {
|
|
1018
|
+
if (index >= pointerSections.length) {
|
|
1019
|
+
return fs.close(fd, (err) =>
|
|
1020
|
+
err ? reject(err) : resolve(names)
|
|
1021
|
+
);
|
|
1022
|
+
}
|
|
1023
|
+
const section = pointerSections[index];
|
|
1024
|
+
readAt(section.position, section.length, (buffer) => {
|
|
1025
|
+
// pointer section: u64 size + utf-8 file name
|
|
1026
|
+
names.push(buffer.toString("utf8", 8));
|
|
1027
|
+
readNext(index + 1);
|
|
1028
|
+
});
|
|
1029
|
+
};
|
|
1030
|
+
readNext(0);
|
|
1031
|
+
});
|
|
1032
|
+
});
|
|
1033
|
+
});
|
|
1034
|
+
});
|
|
1035
|
+
});
|
|
1036
|
+
|
|
1037
|
+
/**
|
|
1038
|
+
* Reads the file names referenced by a serialized file (its lazy pointer sections)
|
|
1039
|
+
* without deserializing its content. Referenced files may reference further files.
|
|
1040
|
+
* @param {IntermediateFileSystem} fs a file system
|
|
1041
|
+
* @param {string} file absolute path of the serialized file
|
|
1042
|
+
* @returns {Promise<string[]>} referenced file names (without extension)
|
|
1043
|
+
*/
|
|
1044
|
+
const getReferencedFilenames = (fs, file) =>
|
|
1045
|
+
file.endsWith(".gz") || file.endsWith(".br") || file.endsWith(".zst")
|
|
1046
|
+
? getReferencedFilenamesCompressed(fs, file)
|
|
1047
|
+
: getReferencedFilenamesUncompressed(fs, file);
|
|
1048
|
+
|
|
766
1049
|
module.exports = FileMiddleware;
|
|
1050
|
+
// Exposed for testing the content-buffer boundary handling in `deserialize`.
|
|
1051
|
+
module.exports._deserialize = deserialize;
|
|
1052
|
+
module.exports.getReferencedFilenames = getReferencedFilenames;
|