webpack 5.59.0 → 5.94.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -38
- package/bin/webpack.js +34 -10
- package/hot/dev-server.js +19 -5
- package/hot/lazy-compilation-node.js +13 -1
- package/hot/lazy-compilation-web.js +9 -0
- package/hot/log-apply-result.js +5 -0
- package/hot/log.js +23 -4
- package/hot/only-dev-server.js +3 -2
- package/hot/poll.js +5 -2
- package/hot/signal.js +6 -2
- package/lib/APIPlugin.js +226 -122
- package/lib/AbstractMethodError.js +10 -5
- package/lib/AsyncDependenciesBlock.js +13 -5
- package/lib/AutomaticPrefetchPlugin.js +2 -1
- package/lib/BannerPlugin.js +33 -12
- package/lib/Cache.js +16 -12
- package/lib/CacheFacade.js +13 -16
- package/lib/CaseSensitiveModulesWarning.js +8 -8
- package/lib/Chunk.js +60 -33
- package/lib/ChunkGraph.js +207 -72
- package/lib/ChunkGroup.js +40 -20
- package/lib/ChunkTemplate.js +43 -0
- package/lib/CleanPlugin.js +117 -32
- package/lib/CodeGenerationResults.js +8 -7
- package/lib/CommentCompilationWarning.js +0 -1
- package/lib/CompatibilityPlugin.js +85 -46
- package/lib/Compilation.js +712 -392
- package/lib/Compiler.js +393 -172
- package/lib/ConcatenationScope.js +10 -13
- package/lib/ConditionalInitFragment.js +22 -14
- package/lib/ConstPlugin.js +104 -64
- package/lib/ContextExclusionPlugin.js +3 -3
- package/lib/ContextModule.js +283 -108
- package/lib/ContextModuleFactory.js +151 -63
- package/lib/ContextReplacementPlugin.js +25 -10
- package/lib/CssModule.js +166 -0
- package/lib/DefinePlugin.js +254 -148
- package/lib/DelegatedModule.js +29 -6
- package/lib/DelegatedModuleFactoryPlugin.js +42 -22
- package/lib/DelegatedPlugin.js +4 -0
- package/lib/DependenciesBlock.js +17 -2
- package/lib/Dependency.js +58 -29
- package/lib/DependencyTemplate.js +24 -3
- package/lib/DependencyTemplates.js +2 -2
- package/lib/DllEntryPlugin.js +18 -1
- package/lib/DllModule.js +21 -4
- package/lib/DllModuleFactory.js +2 -1
- package/lib/DllPlugin.js +9 -7
- package/lib/DllReferencePlugin.js +50 -19
- package/lib/EntryOptionPlugin.js +6 -1
- package/lib/EntryPlugin.js +7 -4
- package/lib/Entrypoint.js +2 -2
- package/lib/EnvironmentNotSupportAsyncWarning.js +52 -0
- package/lib/EnvironmentPlugin.js +5 -2
- package/lib/ErrorHelpers.js +65 -26
- package/lib/EvalDevToolModulePlugin.js +37 -13
- package/lib/EvalSourceMapDevToolPlugin.js +50 -20
- package/lib/ExportsInfo.js +234 -133
- package/lib/ExportsInfoApiPlugin.js +31 -15
- package/lib/ExternalModule.js +391 -129
- package/lib/ExternalModuleFactoryPlugin.js +65 -17
- package/lib/FileSystemInfo.js +1038 -523
- package/lib/FlagAllModulesAsUsedPlugin.js +27 -27
- package/lib/FlagDependencyExportsPlugin.js +352 -349
- package/lib/FlagDependencyUsagePlugin.js +10 -10
- package/lib/FlagEntryExportAsUsedPlugin.js +26 -23
- package/lib/Generator.js +16 -8
- package/lib/GraphHelpers.js +3 -2
- package/lib/HookWebpackError.js +11 -13
- package/lib/HotModuleReplacementPlugin.js +221 -128
- package/lib/IgnoreErrorModuleFactory.js +4 -4
- package/lib/IgnorePlugin.js +5 -4
- package/lib/IgnoreWarningsPlugin.js +6 -9
- package/lib/InitFragment.js +39 -15
- package/lib/JavascriptMetaInfoPlugin.js +27 -15
- package/lib/LibManifestPlugin.js +45 -16
- package/lib/LoaderOptionsPlugin.js +13 -3
- package/lib/MainTemplate.js +74 -21
- package/lib/Module.js +155 -34
- package/lib/ModuleBuildError.js +13 -11
- package/lib/ModuleDependencyError.js +6 -4
- package/lib/ModuleDependencyWarning.js +6 -4
- package/lib/ModuleError.js +10 -5
- package/lib/ModuleFactory.js +4 -4
- package/lib/ModuleFilenameHelpers.js +164 -54
- package/lib/ModuleGraph.js +93 -53
- package/lib/ModuleGraphConnection.js +27 -13
- package/lib/ModuleHashingError.js +29 -0
- package/lib/ModuleInfoHeaderPlugin.js +92 -33
- package/lib/ModuleNotFoundError.js +5 -2
- package/lib/ModuleParseError.js +17 -9
- package/lib/ModuleProfile.js +1 -0
- package/lib/ModuleRestoreError.js +3 -1
- package/lib/ModuleStoreError.js +3 -2
- package/lib/ModuleTemplate.js +33 -1
- package/lib/ModuleTypeConstants.js +168 -0
- package/lib/ModuleWarning.js +10 -5
- package/lib/MultiCompiler.js +115 -38
- package/lib/MultiStats.js +75 -33
- package/lib/MultiWatching.js +6 -2
- package/lib/NodeStuffPlugin.js +136 -37
- package/lib/NormalModule.js +437 -194
- package/lib/NormalModuleFactory.js +313 -116
- package/lib/NormalModuleReplacementPlugin.js +10 -4
- package/lib/NullFactory.js +1 -1
- package/lib/OptimizationStages.js +3 -3
- package/lib/Parser.js +1 -1
- package/lib/PlatformPlugin.js +39 -0
- package/lib/PrefetchPlugin.js +4 -0
- package/lib/ProgressPlugin.js +83 -28
- package/lib/ProvidePlugin.js +37 -19
- package/lib/RawModule.js +18 -5
- package/lib/RecordIdsPlugin.js +8 -8
- package/lib/RequireJsStuffPlugin.js +22 -15
- package/lib/ResolverFactory.js +8 -4
- package/lib/RuntimeGlobals.js +99 -65
- package/lib/RuntimeModule.js +17 -15
- package/lib/RuntimePlugin.js +116 -13
- package/lib/RuntimeTemplate.js +304 -102
- package/lib/SelfModuleFactory.js +12 -0
- package/lib/SizeFormatHelpers.js +2 -4
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +4 -0
- package/lib/SourceMapDevToolPlugin.js +89 -42
- package/lib/Stats.js +12 -7
- package/lib/Template.js +30 -33
- package/lib/TemplatedPathPlugin.js +102 -34
- package/lib/UseStrictPlugin.js +37 -12
- package/lib/WarnCaseSensitiveModulesPlugin.js +12 -0
- package/lib/WarnDeprecatedOptionPlugin.js +6 -0
- package/lib/WatchIgnorePlugin.js +46 -13
- package/lib/Watching.js +139 -76
- package/lib/WebpackError.js +14 -5
- package/lib/WebpackIsIncludedPlugin.js +22 -13
- package/lib/WebpackOptionsApply.js +162 -56
- package/lib/WebpackOptionsDefaulter.js +10 -3
- package/lib/asset/AssetGenerator.js +351 -99
- package/lib/asset/AssetModulesPlugin.js +57 -33
- package/lib/asset/AssetParser.js +15 -6
- package/lib/asset/AssetSourceGenerator.js +30 -10
- package/lib/asset/AssetSourceParser.js +8 -2
- package/lib/asset/RawDataUrlModule.js +162 -0
- package/lib/async-modules/AwaitDependenciesInitFragment.js +16 -13
- package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
- package/lib/buildChunkGraph.js +376 -420
- package/lib/cache/AddManagedPathsPlugin.js +6 -1
- package/lib/cache/IdleFileCachePlugin.js +26 -13
- package/lib/cache/MemoryCachePlugin.js +1 -1
- package/lib/cache/MemoryWithGcCachePlugin.js +13 -7
- package/lib/cache/PackFileCacheStrategy.js +172 -94
- package/lib/cache/ResolverCachePlugin.js +115 -43
- package/lib/cache/getLazyHashedEtag.js +2 -2
- package/lib/cache/mergeEtags.js +16 -21
- package/lib/cli.js +195 -110
- package/lib/config/browserslistTargetHandler.js +106 -41
- package/lib/config/defaults.js +572 -154
- package/lib/config/normalization.js +361 -322
- package/lib/config/target.js +105 -66
- package/lib/container/ContainerEntryDependency.js +2 -1
- package/lib/container/ContainerEntryModule.js +27 -11
- package/lib/container/ContainerEntryModuleFactory.js +1 -1
- package/lib/container/ContainerExposedDependency.js +9 -0
- package/lib/container/ContainerPlugin.js +18 -12
- package/lib/container/ContainerReferencePlugin.js +1 -1
- package/lib/container/FallbackDependency.js +13 -0
- package/lib/container/FallbackItemDependency.js +3 -0
- package/lib/container/FallbackModule.js +19 -8
- package/lib/container/FallbackModuleFactory.js +1 -1
- package/lib/container/ModuleFederationPlugin.js +2 -0
- package/lib/container/RemoteModule.js +17 -4
- package/lib/container/RemoteRuntimeModule.js +31 -17
- package/lib/container/RemoteToExternalDependency.js +3 -0
- package/lib/container/options.js +18 -4
- package/lib/css/CssExportsGenerator.js +203 -0
- package/lib/css/CssGenerator.js +151 -0
- package/lib/css/CssLoadingRuntimeModule.js +592 -0
- package/lib/css/CssModulesPlugin.js +888 -0
- package/lib/css/CssParser.js +1049 -0
- package/lib/css/walkCssTokens.js +775 -0
- package/lib/debug/ProfilingPlugin.js +102 -54
- package/lib/dependencies/AMDDefineDependency.js +54 -10
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +204 -61
- package/lib/dependencies/AMDPlugin.js +44 -24
- package/lib/dependencies/AMDRequireArrayDependency.js +34 -10
- package/lib/dependencies/AMDRequireContextDependency.js +15 -0
- package/lib/dependencies/AMDRequireDependenciesBlock.js +6 -0
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +185 -54
- package/lib/dependencies/AMDRequireDependency.js +21 -6
- package/lib/dependencies/AMDRequireItemDependency.js +6 -0
- package/lib/dependencies/AMDRuntimeModules.js +4 -4
- package/lib/dependencies/CachedConstDependency.js +22 -1
- package/lib/dependencies/CommonJsDependencyHelpers.js +16 -2
- package/lib/dependencies/CommonJsExportRequireDependency.js +77 -47
- package/lib/dependencies/CommonJsExportsDependency.js +28 -5
- package/lib/dependencies/CommonJsExportsParserPlugin.js +111 -39
- package/lib/dependencies/CommonJsFullRequireDependency.js +42 -8
- package/lib/dependencies/CommonJsImportsParserPlugin.js +530 -130
- package/lib/dependencies/CommonJsPlugin.js +51 -26
- package/lib/dependencies/CommonJsRequireContextDependency.js +23 -2
- package/lib/dependencies/CommonJsRequireDependency.js +9 -1
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -8
- package/lib/dependencies/ConstDependency.js +12 -3
- package/lib/dependencies/ContextDependency.js +32 -5
- package/lib/dependencies/ContextDependencyHelpers.js +92 -62
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -1
- package/lib/dependencies/ContextElementDependency.js +41 -4
- package/lib/dependencies/CreateScriptUrlDependency.js +22 -1
- package/lib/dependencies/CriticalDependencyWarning.js +4 -1
- package/lib/dependencies/CssExportDependency.js +156 -0
- package/lib/dependencies/CssImportDependency.js +125 -0
- package/lib/dependencies/CssLocalIdentifierDependency.js +245 -0
- package/lib/dependencies/CssSelfLocalIdentifierDependency.js +111 -0
- package/lib/dependencies/CssUrlDependency.js +164 -0
- package/lib/dependencies/DelegatedSourceDependency.js +3 -0
- package/lib/dependencies/DllEntryDependency.js +14 -0
- package/lib/dependencies/DynamicExports.js +15 -11
- package/lib/dependencies/ExportsInfoDependency.js +26 -5
- package/lib/dependencies/ExternalModuleDependency.js +109 -0
- package/lib/dependencies/ExternalModuleInitFragment.js +133 -0
- package/lib/dependencies/HarmonyAcceptDependency.js +11 -2
- package/lib/dependencies/HarmonyAcceptImportDependency.js +9 -4
- package/lib/dependencies/HarmonyCompatibilityDependency.js +6 -5
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +29 -3
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +152 -0
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +96 -51
- package/lib/dependencies/HarmonyExportExpressionDependency.js +21 -4
- package/lib/dependencies/HarmonyExportHeaderDependency.js +13 -0
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +216 -108
- package/lib/dependencies/HarmonyExportInitFragment.js +21 -9
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +12 -0
- package/lib/dependencies/HarmonyExports.js +13 -7
- package/lib/dependencies/HarmonyImportDependency.js +65 -19
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +268 -74
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +11 -5
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +180 -36
- package/lib/dependencies/HarmonyModulesPlugin.js +33 -5
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -3
- package/lib/dependencies/ImportContextDependency.js +15 -2
- package/lib/dependencies/ImportDependency.js +50 -12
- package/lib/dependencies/ImportEagerDependency.js +11 -6
- package/lib/dependencies/ImportMetaContextDependency.js +42 -0
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +301 -0
- package/lib/dependencies/ImportMetaContextPlugin.js +72 -0
- package/lib/dependencies/ImportMetaHotAcceptDependency.js +6 -0
- package/lib/dependencies/ImportMetaHotDeclineDependency.js +6 -0
- package/lib/dependencies/ImportMetaPlugin.js +128 -59
- package/lib/dependencies/ImportParserPlugin.js +153 -83
- package/lib/dependencies/ImportPlugin.js +21 -7
- package/lib/dependencies/ImportWeakDependency.js +11 -6
- package/lib/dependencies/JsonExportsDependency.js +38 -30
- package/lib/dependencies/LoaderDependency.js +14 -0
- package/lib/dependencies/LoaderImportDependency.js +14 -0
- package/lib/dependencies/LoaderPlugin.js +54 -40
- package/lib/dependencies/LocalModule.js +17 -1
- package/lib/dependencies/LocalModuleDependency.js +15 -0
- package/lib/dependencies/LocalModulesHelpers.js +22 -4
- package/lib/dependencies/ModuleDecoratorDependency.js +9 -1
- package/lib/dependencies/ModuleDependency.js +24 -7
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +2 -1
- package/lib/dependencies/ModuleHotAcceptDependency.js +6 -0
- package/lib/dependencies/ModuleHotDeclineDependency.js +6 -0
- package/lib/dependencies/PrefetchDependency.js +3 -0
- package/lib/dependencies/ProvidedDependency.js +43 -8
- package/lib/dependencies/PureExpressionDependency.js +73 -39
- package/lib/dependencies/RequireContextDependency.js +6 -16
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +14 -6
- package/lib/dependencies/RequireContextPlugin.js +20 -7
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +7 -0
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +29 -12
- package/lib/dependencies/RequireEnsureDependency.js +16 -2
- package/lib/dependencies/RequireEnsureItemDependency.js +3 -0
- package/lib/dependencies/RequireEnsurePlugin.js +27 -7
- package/lib/dependencies/RequireHeaderDependency.js +14 -1
- package/lib/dependencies/RequireIncludeDependency.js +6 -1
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +29 -5
- package/lib/dependencies/RequireIncludePlugin.js +25 -5
- package/lib/dependencies/RequireResolveContextDependency.js +19 -2
- package/lib/dependencies/RequireResolveDependency.js +8 -1
- package/lib/dependencies/RequireResolveHeaderDependency.js +18 -0
- package/lib/dependencies/RuntimeRequirementsDependency.js +9 -1
- package/lib/dependencies/StaticExportsDependency.js +8 -0
- package/lib/dependencies/SystemPlugin.js +49 -22
- package/lib/dependencies/SystemRuntimeModule.js +1 -1
- package/lib/dependencies/URLDependency.js +20 -13
- package/lib/dependencies/URLPlugin.js +115 -27
- package/lib/dependencies/UnsupportedDependency.js +13 -0
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +14 -0
- package/lib/dependencies/WebAssemblyImportDependency.js +9 -1
- package/lib/dependencies/WebpackIsIncludedDependency.js +6 -1
- package/lib/dependencies/WorkerDependency.js +47 -3
- package/lib/dependencies/WorkerPlugin.js +143 -59
- package/lib/dependencies/getFunctionExpression.js +9 -0
- package/lib/dependencies/processExportInfo.js +3 -1
- package/lib/electron/ElectronTargetPlugin.js +1 -0
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +3 -2
- package/lib/esm/ModuleChunkFormatPlugin.js +92 -55
- package/lib/esm/ModuleChunkLoadingPlugin.js +12 -1
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +141 -25
- package/lib/formatLocation.js +1 -2
- package/lib/hmr/HotModuleReplacement.runtime.js +37 -25
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +2 -1
- package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +13 -15
- package/lib/hmr/LazyCompilationPlugin.js +94 -41
- package/lib/hmr/lazyCompilationBackend.js +107 -44
- package/lib/ids/ChunkModuleIdRangePlugin.js +12 -3
- package/lib/ids/DeterministicChunkIdsPlugin.js +13 -6
- package/lib/ids/DeterministicModuleIdsPlugin.js +59 -35
- package/lib/ids/HashedModuleIdsPlugin.js +24 -16
- package/lib/ids/IdHelpers.js +59 -49
- package/lib/ids/NamedChunkIdsPlugin.js +13 -1
- package/lib/ids/NamedModuleIdsPlugin.js +20 -12
- package/lib/ids/NaturalModuleIdsPlugin.js +10 -13
- package/lib/ids/OccurrenceChunkIdsPlugin.js +6 -2
- package/lib/ids/OccurrenceModuleIdsPlugin.js +14 -11
- package/lib/ids/SyncModuleIdsPlugin.js +146 -0
- package/lib/index.js +44 -5
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +9 -7
- package/lib/javascript/BasicEvaluatedExpression.js +133 -19
- package/lib/javascript/ChunkHelpers.js +33 -0
- package/lib/javascript/CommonJsChunkFormatPlugin.js +18 -15
- package/lib/javascript/EnableChunkLoadingPlugin.js +11 -6
- package/lib/javascript/JavascriptGenerator.js +37 -6
- package/lib/javascript/JavascriptModulesPlugin.js +523 -295
- package/lib/javascript/JavascriptParser.js +1591 -574
- package/lib/javascript/JavascriptParserHelpers.js +58 -37
- package/lib/javascript/StartupHelpers.js +69 -47
- package/lib/json/JsonData.js +33 -0
- package/lib/json/JsonGenerator.js +29 -21
- package/lib/json/JsonModulesPlugin.js +13 -7
- package/lib/json/JsonParser.js +30 -16
- package/lib/library/AbstractLibraryPlugin.js +6 -2
- package/lib/library/AmdLibraryPlugin.js +34 -18
- package/lib/library/AssignLibraryPlugin.js +68 -32
- package/lib/library/EnableLibraryPlugin.js +39 -14
- package/lib/library/ExportPropertyLibraryPlugin.js +14 -5
- package/lib/library/JsonpLibraryPlugin.js +4 -3
- package/lib/library/ModernModuleLibraryPlugin.js +144 -0
- package/lib/library/ModuleLibraryPlugin.js +12 -7
- package/lib/library/SystemLibraryPlugin.js +6 -4
- package/lib/library/UmdLibraryPlugin.js +119 -100
- package/lib/logging/Logger.js +59 -6
- package/lib/logging/createConsoleLogger.js +25 -40
- package/lib/logging/runtime.js +8 -9
- package/lib/logging/truncateArgs.js +9 -8
- package/lib/node/CommonJsChunkLoadingPlugin.js +18 -2
- package/lib/node/NodeEnvironmentPlugin.js +14 -8
- package/lib/node/NodeTargetPlugin.js +7 -0
- package/lib/node/NodeTemplatePlugin.js +10 -2
- package/lib/node/NodeWatchFileSystem.js +100 -50
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +51 -26
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +13 -2
- package/lib/node/ReadFileCompileWasmPlugin.js +21 -3
- package/lib/node/RequireChunkLoadingRuntimeModule.js +49 -26
- package/lib/node/nodeConsole.js +48 -31
- package/lib/optimize/AggressiveMergingPlugin.js +10 -4
- package/lib/optimize/AggressiveSplittingPlugin.js +26 -21
- package/lib/optimize/ConcatenatedModule.js +353 -212
- package/lib/optimize/EnsureChunkConditionsPlugin.js +4 -1
- package/lib/optimize/FlagIncludedChunksPlugin.js +14 -8
- package/lib/optimize/InnerGraph.js +30 -25
- package/lib/optimize/InnerGraphPlugin.js +105 -64
- package/lib/optimize/LimitChunkCountPlugin.js +32 -9
- package/lib/optimize/MangleExportsPlugin.js +7 -2
- package/lib/optimize/MinMaxSizeWarning.js +6 -1
- package/lib/optimize/ModuleConcatenationPlugin.js +150 -83
- package/lib/optimize/RealContentHashPlugin.js +99 -43
- package/lib/optimize/RemoveParentModulesPlugin.js +131 -48
- package/lib/optimize/RuntimeChunkPlugin.js +15 -2
- package/lib/optimize/SideEffectsFlagPlugin.js +119 -63
- package/lib/optimize/SplitChunksPlugin.js +129 -78
- package/lib/performance/SizeLimitsPlugin.js +22 -8
- package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +4 -2
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +4 -1
- package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +8 -5
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -3
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +5 -3
- package/lib/rules/BasicEffectRulePlugin.js +7 -1
- package/lib/rules/BasicMatcherRulePlugin.js +8 -1
- package/lib/rules/ObjectMatcherRulePlugin.js +19 -2
- package/lib/rules/RuleSetCompiler.js +53 -32
- package/lib/rules/UseEffectRulePlugin.js +42 -36
- package/lib/runtime/AsyncModuleRuntimeModule.js +56 -69
- package/lib/runtime/AutoPublicPathRuntimeModule.js +25 -9
- package/lib/runtime/BaseUriRuntimeModule.js +35 -0
- package/lib/runtime/ChunkNameRuntimeModule.js +1 -1
- package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +5 -2
- package/lib/runtime/CompatRuntimeModule.js +7 -2
- package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
- package/lib/runtime/CreateScriptRuntimeModule.js +38 -0
- package/lib/runtime/CreateScriptUrlRuntimeModule.js +13 -36
- package/lib/runtime/DefinePropertyGettersRuntimeModule.js +6 -3
- package/lib/runtime/EnsureChunkRuntimeModule.js +29 -15
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +56 -43
- package/lib/runtime/GetFullHashRuntimeModule.js +4 -3
- package/lib/runtime/GetMainFilenameRuntimeModule.js +5 -2
- package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +98 -0
- package/lib/runtime/GlobalRuntimeModule.js +1 -1
- package/lib/runtime/HasOwnPropertyRuntimeModule.js +5 -2
- package/lib/runtime/LoadScriptRuntimeModule.js +61 -45
- package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +5 -2
- package/lib/runtime/NonceRuntimeModule.js +24 -0
- package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -2
- package/lib/runtime/PublicPathRuntimeModule.js +9 -2
- package/lib/runtime/RelativeUrlRuntimeModule.js +5 -2
- package/lib/runtime/RuntimeIdRuntimeModule.js +6 -2
- package/lib/runtime/StartupChunkDependenciesPlugin.js +15 -0
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +36 -28
- package/lib/runtime/StartupEntrypointRuntimeModule.js +13 -9
- package/lib/runtime/SystemContextRuntimeModule.js +1 -1
- package/lib/schemes/DataUriPlugin.js +16 -3
- package/lib/schemes/HttpUriPlugin.js +336 -120
- package/lib/serialization/ArraySerializer.js +22 -6
- package/lib/serialization/BinaryMiddleware.js +212 -33
- package/lib/serialization/DateObjectSerializer.js +16 -4
- package/lib/serialization/ErrorObjectSerializer.js +23 -6
- package/lib/serialization/FileMiddleware.js +187 -86
- package/lib/serialization/MapObjectSerializer.js +25 -8
- package/lib/serialization/NullPrototypeObjectSerializer.js +26 -8
- package/lib/serialization/ObjectMiddleware.js +96 -66
- package/lib/serialization/PlainObjectSerializer.js +51 -14
- package/lib/serialization/RegExpObjectSerializer.js +17 -5
- package/lib/serialization/Serializer.js +23 -5
- package/lib/serialization/SerializerMiddleware.js +8 -8
- package/lib/serialization/SetObjectSerializer.js +22 -6
- package/lib/serialization/SingleItemMiddleware.js +2 -2
- package/lib/serialization/types.js +2 -2
- package/lib/sharing/ConsumeSharedFallbackDependency.js +3 -0
- package/lib/sharing/ConsumeSharedModule.js +40 -17
- package/lib/sharing/ConsumeSharedPlugin.js +139 -102
- package/lib/sharing/ConsumeSharedRuntimeModule.js +144 -130
- package/lib/sharing/ProvideForSharedDependency.js +0 -1
- package/lib/sharing/ProvideSharedDependency.js +17 -0
- package/lib/sharing/ProvideSharedModule.js +19 -6
- package/lib/sharing/ProvideSharedModuleFactory.js +1 -1
- package/lib/sharing/ProvideSharedPlugin.js +37 -30
- package/lib/sharing/SharePlugin.js +2 -2
- package/lib/sharing/ShareRuntimeModule.js +20 -10
- package/lib/sharing/resolveMatchedConfigs.js +6 -5
- package/lib/sharing/utils.js +338 -34
- package/lib/stats/DefaultStatsFactoryPlugin.js +660 -396
- package/lib/stats/DefaultStatsPresetPlugin.js +85 -25
- package/lib/stats/DefaultStatsPrinterPlugin.js +525 -145
- package/lib/stats/StatsFactory.js +128 -57
- package/lib/stats/StatsPrinter.js +77 -46
- package/lib/util/ArrayHelpers.js +35 -1
- package/lib/util/ArrayQueue.js +15 -22
- package/lib/util/AsyncQueue.js +37 -16
- package/lib/util/IterableHelpers.js +3 -4
- package/lib/util/LazyBucketSortedSet.js +60 -44
- package/lib/util/LazySet.js +11 -2
- package/lib/util/MapHelpers.js +17 -5
- package/lib/util/ParallelismFactorCalculator.js +11 -1
- package/lib/util/Queue.js +9 -3
- package/lib/util/Semaphore.js +4 -7
- package/lib/util/SetHelpers.js +5 -5
- package/lib/util/SortableSet.js +19 -6
- package/lib/util/StackedCacheMap.js +33 -3
- package/lib/util/StackedMap.js +1 -3
- package/lib/util/StringXor.js +46 -0
- package/lib/util/TupleQueue.js +9 -3
- package/lib/util/TupleSet.js +15 -5
- package/lib/util/URLAbsoluteSpecifier.js +8 -8
- package/lib/util/WeakTupleMap.js +70 -28
- package/lib/util/binarySearchBounds.js +51 -9
- package/lib/util/chainedImports.js +97 -0
- package/lib/util/cleverMerge.js +51 -36
- package/lib/util/comparators.js +146 -83
- package/lib/util/compileBooleanMatcher.js +35 -7
- package/lib/util/conventions.js +126 -0
- package/lib/util/create-schema-validation.js +9 -2
- package/lib/util/createHash.js +49 -14
- package/lib/util/deprecation.js +48 -15
- package/lib/util/deterministicGrouping.js +71 -39
- package/lib/util/extractUrlAndGlobal.js +3 -0
- package/lib/util/findGraphRoots.js +7 -5
- package/lib/util/fs.js +419 -94
- package/lib/util/hash/BatchedHash.js +10 -4
- package/lib/util/hash/md4.js +20 -0
- package/lib/util/hash/wasm-hash.js +163 -0
- package/lib/util/hash/xxhash64.js +7 -141
- package/lib/util/identifier.js +140 -93
- package/lib/util/internalSerializables.js +22 -0
- package/lib/util/makeSerializable.js +7 -0
- package/lib/util/memoize.js +10 -10
- package/lib/util/mergeScope.js +76 -0
- package/lib/util/nonNumericOnlyHash.js +22 -0
- package/lib/util/numberHash.js +84 -34
- package/lib/util/objectToMap.js +0 -1
- package/lib/util/processAsyncTree.js +7 -1
- package/lib/util/propertyAccess.js +7 -55
- package/lib/util/propertyName.js +77 -0
- package/lib/util/registerExternalSerializer.js +2 -2
- package/lib/util/runtime.js +188 -133
- package/lib/util/semver.js +64 -56
- package/lib/util/serialization.js +26 -1
- package/lib/util/smartGrouping.js +10 -10
- package/lib/util/source.js +1 -1
- package/lib/validateSchema.js +6 -2
- package/lib/wasm/EnableWasmLoadingPlugin.js +9 -4
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +70 -30
- package/lib/wasm-async/AsyncWebAssemblyGenerator.js +9 -1
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +34 -16
- package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +32 -12
- package/lib/wasm-async/AsyncWebAssemblyParser.js +17 -4
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +72 -31
- package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +17 -6
- package/lib/wasm-sync/WebAssemblyGenerator.js +72 -52
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -4
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +53 -43
- package/lib/wasm-sync/WebAssemblyParser.js +23 -9
- package/lib/wasm-sync/WebAssemblyUtils.js +5 -4
- package/lib/web/FetchCompileAsyncWasmPlugin.js +11 -1
- package/lib/web/FetchCompileWasmPlugin.js +59 -42
- package/lib/web/JsonpChunkLoadingPlugin.js +9 -0
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +71 -41
- package/lib/webpack.js +43 -12
- package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +15 -12
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +55 -40
- package/module.d.ts +233 -0
- package/package.json +85 -139
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +679 -47
- package/schemas/plugins/BannerPlugin.check.js +1 -1
- package/schemas/plugins/BannerPlugin.json +9 -1
- package/schemas/plugins/DllReferencePlugin.check.js +1 -1
- package/schemas/plugins/HashedModuleIdsPlugin.check.js +1 -1
- package/schemas/plugins/ProgressPlugin.check.js +1 -1
- package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
- package/schemas/plugins/SourceMapDevToolPlugin.json +4 -0
- package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
- package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
- package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
- package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.json +10 -1
- 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 +12 -1
- package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +6 -0
- package/schemas/plugins/css/CssAutoGeneratorOptions.json +3 -0
- package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssAutoParserOptions.check.js +6 -0
- package/schemas/plugins/css/CssAutoParserOptions.json +3 -0
- package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssGeneratorOptions.check.js +6 -0
- package/schemas/plugins/css/CssGeneratorOptions.json +3 -0
- package/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +6 -0
- package/schemas/plugins/css/CssGlobalGeneratorOptions.json +3 -0
- package/schemas/plugins/css/CssGlobalParserOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssGlobalParserOptions.check.js +6 -0
- package/schemas/plugins/css/CssGlobalParserOptions.json +3 -0
- package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +6 -0
- package/schemas/plugins/css/CssModuleGeneratorOptions.json +3 -0
- package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssModuleParserOptions.check.js +6 -0
- package/schemas/plugins/css/CssModuleParserOptions.json +3 -0
- package/schemas/plugins/css/CssParserOptions.check.d.ts +7 -0
- package/schemas/plugins/css/CssParserOptions.check.js +6 -0
- package/schemas/plugins/css/CssParserOptions.json +3 -0
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
- package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
- package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
- package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
- package/schemas/plugins/schemes/HttpUriPlugin.json +4 -0
- package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
- package/types.d.ts +5026 -1756
@@ -19,6 +19,7 @@ const memoize = require("../util/memoize");
|
|
19
19
|
const SerializerMiddleware = require("./SerializerMiddleware");
|
20
20
|
|
21
21
|
/** @typedef {typeof import("../util/Hash")} Hash */
|
22
|
+
/** @typedef {import("../util/fs").IStats} IStats */
|
22
23
|
/** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */
|
23
24
|
/** @typedef {import("./types").BufferSerializableType} BufferSerializableType */
|
24
25
|
|
@@ -40,6 +41,8 @@ Section -> Buffer
|
|
40
41
|
|
41
42
|
// "wpc" + 1 in little-endian
|
42
43
|
const VERSION = 0x01637077;
|
44
|
+
const WRITE_LIMIT_TOTAL = 0x7fff0000;
|
45
|
+
const WRITE_LIMIT_CHUNK = 511 * 1024 * 1024;
|
43
46
|
|
44
47
|
/**
|
45
48
|
* @param {Buffer[]} buffers buffers
|
@@ -55,39 +58,39 @@ const hashForName = (buffers, hashFunction) => {
|
|
55
58
|
const COMPRESSION_CHUNK_SIZE = 100 * 1024 * 1024;
|
56
59
|
const DECOMPRESSION_CHUNK_SIZE = 100 * 1024 * 1024;
|
57
60
|
|
61
|
+
/** @type {function(Buffer, number, number): void} */
|
58
62
|
const writeUInt64LE = Buffer.prototype.writeBigUInt64LE
|
59
63
|
? (buf, value, offset) => {
|
60
64
|
buf.writeBigUInt64LE(BigInt(value), offset);
|
61
|
-
|
65
|
+
}
|
62
66
|
: (buf, value, offset) => {
|
63
67
|
const low = value % 0x100000000;
|
64
68
|
const high = (value - low) / 0x100000000;
|
65
69
|
buf.writeUInt32LE(low, offset);
|
66
70
|
buf.writeUInt32LE(high, offset + 4);
|
67
|
-
|
71
|
+
};
|
68
72
|
|
73
|
+
/** @type {function(Buffer, number): void} */
|
69
74
|
const readUInt64LE = Buffer.prototype.readBigUInt64LE
|
70
|
-
? (buf, offset) =>
|
71
|
-
return Number(buf.readBigUInt64LE(offset));
|
72
|
-
}
|
75
|
+
? (buf, offset) => Number(buf.readBigUInt64LE(offset))
|
73
76
|
: (buf, offset) => {
|
74
77
|
const low = buf.readUInt32LE(offset);
|
75
78
|
const high = buf.readUInt32LE(offset + 4);
|
76
79
|
return high * 0x100000000 + low;
|
77
|
-
|
80
|
+
};
|
78
81
|
|
79
82
|
/**
|
80
|
-
* @typedef {
|
83
|
+
* @typedef {object} SerializeResult
|
81
84
|
* @property {string | false} name
|
82
85
|
* @property {number} size
|
83
|
-
* @property {Promise
|
86
|
+
* @property {Promise<any>=} backgroundJob
|
84
87
|
*/
|
85
88
|
|
86
89
|
/**
|
87
90
|
* @param {FileMiddleware} middleware this
|
88
91
|
* @param {BufferSerializableType[] | Promise<BufferSerializableType[]>} data data to be serialized
|
89
92
|
* @param {string | boolean} name file base name
|
90
|
-
* @param {function(string | false, Buffer[]): Promise<void>} writeFile writes a file
|
93
|
+
* @param {function(string | false, Buffer[], number): Promise<void>} writeFile writes a file
|
91
94
|
* @param {string | Hash} hashFunction hash function to use
|
92
95
|
* @returns {Promise<SerializeResult>} resulting file pointer and promise
|
93
96
|
*/
|
@@ -102,8 +105,8 @@ const serialize = async (
|
|
102
105
|
const processedData = [];
|
103
106
|
/** @type {WeakMap<SerializeResult, function(): any | Promise<any>>} */
|
104
107
|
const resultToLazy = new WeakMap();
|
105
|
-
/** @type {Buffer[]} */
|
106
|
-
let lastBuffers
|
108
|
+
/** @type {Buffer[] | undefined} */
|
109
|
+
let lastBuffers;
|
107
110
|
for (const item of await data) {
|
108
111
|
if (typeof item === "function") {
|
109
112
|
if (!SerializerMiddleware.isLazy(item))
|
@@ -161,9 +164,8 @@ const serialize = async (
|
|
161
164
|
const backgroundJobs = [];
|
162
165
|
const resolvedData = (
|
163
166
|
await Promise.all(
|
164
|
-
/** @type {Promise<Buffer[] | Buffer | SerializeResult>[]} */
|
165
|
-
|
166
|
-
)
|
167
|
+
/** @type {Promise<Buffer[] | Buffer | SerializeResult>[]} */
|
168
|
+
(processedData)
|
167
169
|
)
|
168
170
|
).map(item => {
|
169
171
|
if (Array.isArray(item) || Buffer.isBuffer(item)) return item;
|
@@ -179,6 +181,7 @@ const serialize = async (
|
|
179
181
|
SerializerMiddleware.setLazySerializedValue(lazy, buf);
|
180
182
|
return buf;
|
181
183
|
});
|
184
|
+
/** @type {number[]} */
|
182
185
|
const lengths = [];
|
183
186
|
for (const item of resolvedData) {
|
184
187
|
if (Array.isArray(item)) {
|
@@ -192,7 +195,7 @@ const serialize = async (
|
|
192
195
|
} else if (item) {
|
193
196
|
lengths.push(-item.length);
|
194
197
|
} else {
|
195
|
-
throw new Error(
|
198
|
+
throw new Error(`Unexpected falsy value in resolved data ${item}`);
|
196
199
|
}
|
197
200
|
}
|
198
201
|
const header = Buffer.allocUnsafe(8 + lengths.length * 4);
|
@@ -201,6 +204,7 @@ const serialize = async (
|
|
201
204
|
for (let i = 0; i < lengths.length; i++) {
|
202
205
|
header.writeInt32LE(lengths[i], 8 + i * 4);
|
203
206
|
}
|
207
|
+
/** @type {Buffer[]} */
|
204
208
|
const buf = [header];
|
205
209
|
for (const item of resolvedData) {
|
206
210
|
if (Array.isArray(item)) {
|
@@ -212,9 +216,9 @@ const serialize = async (
|
|
212
216
|
if (name === true) {
|
213
217
|
name = hashForName(buf, hashFunction);
|
214
218
|
}
|
215
|
-
backgroundJobs.push(writeFile(name, buf));
|
216
219
|
let size = 0;
|
217
220
|
for (const b of buf) size += b.length;
|
221
|
+
backgroundJobs.push(writeFile(name, buf, size));
|
218
222
|
return {
|
219
223
|
size,
|
220
224
|
name,
|
@@ -233,18 +237,21 @@ const serialize = async (
|
|
233
237
|
*/
|
234
238
|
const deserialize = async (middleware, name, readFile) => {
|
235
239
|
const contents = await readFile(name);
|
236
|
-
if (contents.length === 0) throw new Error(
|
240
|
+
if (contents.length === 0) throw new Error(`Empty file ${name}`);
|
237
241
|
let contentsIndex = 0;
|
238
242
|
let contentItem = contents[0];
|
239
243
|
let contentItemLength = contentItem.length;
|
240
244
|
let contentPosition = 0;
|
241
|
-
if (contentItemLength === 0) throw new Error(
|
245
|
+
if (contentItemLength === 0) throw new Error(`Empty file ${name}`);
|
242
246
|
const nextContent = () => {
|
243
247
|
contentsIndex++;
|
244
248
|
contentItem = contents[contentsIndex];
|
245
249
|
contentItemLength = contentItem.length;
|
246
250
|
contentPosition = 0;
|
247
251
|
};
|
252
|
+
/**
|
253
|
+
* @param {number} n number of bytes to ensure
|
254
|
+
*/
|
248
255
|
const ensureData = n => {
|
249
256
|
if (contentPosition === contentItemLength) {
|
250
257
|
nextContent();
|
@@ -272,18 +279,28 @@ const deserialize = async (middleware, name, readFile) => {
|
|
272
279
|
contentPosition = 0;
|
273
280
|
}
|
274
281
|
};
|
282
|
+
/**
|
283
|
+
* @returns {number} value value
|
284
|
+
*/
|
275
285
|
const readUInt32LE = () => {
|
276
286
|
ensureData(4);
|
277
287
|
const value = contentItem.readUInt32LE(contentPosition);
|
278
288
|
contentPosition += 4;
|
279
289
|
return value;
|
280
290
|
};
|
291
|
+
/**
|
292
|
+
* @returns {number} value value
|
293
|
+
*/
|
281
294
|
const readInt32LE = () => {
|
282
295
|
ensureData(4);
|
283
296
|
const value = contentItem.readInt32LE(contentPosition);
|
284
297
|
contentPosition += 4;
|
285
298
|
return value;
|
286
299
|
};
|
300
|
+
/**
|
301
|
+
* @param {number} l length
|
302
|
+
* @returns {Buffer} buffer
|
303
|
+
*/
|
287
304
|
const readSlice = l => {
|
288
305
|
ensureData(l);
|
289
306
|
if (contentPosition === 0 && contentItemLength === l) {
|
@@ -361,18 +378,16 @@ const deserialize = async (middleware, name, readFile) => {
|
|
361
378
|
length -= l;
|
362
379
|
contentPosition = contentItemLength;
|
363
380
|
}
|
381
|
+
} else if (length >= contentItemLength) {
|
382
|
+
result.push(contentItem);
|
383
|
+
length -= contentItemLength;
|
384
|
+
contentPosition = contentItemLength;
|
364
385
|
} else {
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
result.push(
|
371
|
-
Buffer.from(contentItem.buffer, contentItem.byteOffset, length)
|
372
|
-
);
|
373
|
-
contentPosition += length;
|
374
|
-
length = 0;
|
375
|
-
}
|
386
|
+
result.push(
|
387
|
+
Buffer.from(contentItem.buffer, contentItem.byteOffset, length)
|
388
|
+
);
|
389
|
+
contentPosition += length;
|
390
|
+
length = 0;
|
376
391
|
}
|
377
392
|
while (length > 0) {
|
378
393
|
nextContent();
|
@@ -393,6 +408,8 @@ const deserialize = async (middleware, name, readFile) => {
|
|
393
408
|
return result;
|
394
409
|
};
|
395
410
|
|
411
|
+
/** @typedef {{ filename: string, extension?: string }} FileMiddlewareContext */
|
412
|
+
|
396
413
|
/**
|
397
414
|
* @typedef {BufferSerializableType[]} DeserializedType
|
398
415
|
* @typedef {true} SerializedType
|
@@ -408,9 +425,10 @@ class FileMiddleware extends SerializerMiddleware {
|
|
408
425
|
this.fs = fs;
|
409
426
|
this._hashFunction = hashFunction;
|
410
427
|
}
|
428
|
+
|
411
429
|
/**
|
412
430
|
* @param {DeserializedType} data data
|
413
|
-
* @param {
|
431
|
+
* @param {object} context context object
|
414
432
|
* @returns {SerializedType|Promise<SerializedType>} serialized data
|
415
433
|
*/
|
416
434
|
serialize(data, context) {
|
@@ -422,43 +440,92 @@ class FileMiddleware extends SerializerMiddleware {
|
|
422
440
|
// It's important that we don't touch existing files during serialization
|
423
441
|
// because serialize may read existing files (when deserializing)
|
424
442
|
const allWrittenFiles = new Set();
|
425
|
-
|
443
|
+
/**
|
444
|
+
* @param {string | false} name name
|
445
|
+
* @param {Buffer[]} content content
|
446
|
+
* @param {number} size size
|
447
|
+
* @returns {Promise<void>}
|
448
|
+
*/
|
449
|
+
const writeFile = async (name, content, size) => {
|
426
450
|
const file = name
|
427
451
|
? join(this.fs, filename, `../${name}${extension}`)
|
428
452
|
: filename;
|
429
|
-
await new Promise(
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
453
|
+
await new Promise(
|
454
|
+
/**
|
455
|
+
* @param {(value?: undefined) => void} resolve resolve
|
456
|
+
* @param {(reason?: Error | null) => void} reject reject
|
457
|
+
*/
|
458
|
+
(resolve, reject) => {
|
459
|
+
let stream = this.fs.createWriteStream(`${file}_`);
|
460
|
+
let compression;
|
461
|
+
if (file.endsWith(".gz")) {
|
462
|
+
compression = createGzip({
|
463
|
+
chunkSize: COMPRESSION_CHUNK_SIZE,
|
464
|
+
level: zConstants.Z_BEST_SPEED
|
465
|
+
});
|
466
|
+
} else if (file.endsWith(".br")) {
|
467
|
+
compression = createBrotliCompress({
|
468
|
+
chunkSize: COMPRESSION_CHUNK_SIZE,
|
469
|
+
params: {
|
470
|
+
[zConstants.BROTLI_PARAM_MODE]: zConstants.BROTLI_MODE_TEXT,
|
471
|
+
[zConstants.BROTLI_PARAM_QUALITY]: 2,
|
472
|
+
[zConstants.BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING]: true,
|
473
|
+
[zConstants.BROTLI_PARAM_SIZE_HINT]: size
|
474
|
+
}
|
475
|
+
});
|
476
|
+
}
|
477
|
+
if (compression) {
|
478
|
+
pipeline(compression, stream, reject);
|
479
|
+
stream = compression;
|
480
|
+
stream.on("finish", () => resolve());
|
481
|
+
} else {
|
482
|
+
stream.on("error", err => reject(err));
|
483
|
+
stream.on("finish", () => resolve());
|
484
|
+
}
|
485
|
+
// split into chunks for WRITE_LIMIT_CHUNK size
|
486
|
+
/** @type {TODO[]} */
|
487
|
+
const chunks = [];
|
488
|
+
for (const b of content) {
|
489
|
+
if (b.length < WRITE_LIMIT_CHUNK) {
|
490
|
+
chunks.push(b);
|
491
|
+
} else {
|
492
|
+
for (let i = 0; i < b.length; i += WRITE_LIMIT_CHUNK) {
|
493
|
+
chunks.push(b.slice(i, i + WRITE_LIMIT_CHUNK));
|
494
|
+
}
|
448
495
|
}
|
449
|
-
}
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
496
|
+
}
|
497
|
+
|
498
|
+
const len = chunks.length;
|
499
|
+
let i = 0;
|
500
|
+
/**
|
501
|
+
* @param {(Error | null)=} err err
|
502
|
+
*/
|
503
|
+
const batchWrite = err => {
|
504
|
+
// will be handled in "on" error handler
|
505
|
+
if (err) return;
|
506
|
+
|
507
|
+
if (i === len) {
|
508
|
+
stream.end();
|
509
|
+
return;
|
510
|
+
}
|
511
|
+
|
512
|
+
// queue up a batch of chunks up to the write limit
|
513
|
+
// end is exclusive
|
514
|
+
let end = i;
|
515
|
+
let sum = chunks[end++].length;
|
516
|
+
while (end < len) {
|
517
|
+
sum += chunks[end].length;
|
518
|
+
if (sum > WRITE_LIMIT_TOTAL) break;
|
519
|
+
end++;
|
520
|
+
}
|
521
|
+
while (i < end - 1) {
|
522
|
+
stream.write(chunks[i++]);
|
523
|
+
}
|
524
|
+
stream.write(chunks[i++], batchWrite);
|
525
|
+
};
|
526
|
+
batchWrite();
|
458
527
|
}
|
459
|
-
|
460
|
-
stream.end();
|
461
|
-
});
|
528
|
+
);
|
462
529
|
if (name) allWrittenFiles.add(file);
|
463
530
|
};
|
464
531
|
|
@@ -468,10 +535,15 @@ class FileMiddleware extends SerializerMiddleware {
|
|
468
535
|
await backgroundJob;
|
469
536
|
|
470
537
|
// Rename the index file to disallow access during inconsistent file state
|
471
|
-
await new Promise(
|
472
|
-
|
473
|
-
|
474
|
-
|
538
|
+
await new Promise(
|
539
|
+
/**
|
540
|
+
* @param {(value?: undefined) => void} resolve resolve
|
541
|
+
*/
|
542
|
+
resolve => {
|
543
|
+
this.fs.rename(filename, `${filename}.old`, err => {
|
544
|
+
resolve();
|
545
|
+
});
|
546
|
+
}
|
475
547
|
);
|
476
548
|
|
477
549
|
// update all written files
|
@@ -479,22 +551,35 @@ class FileMiddleware extends SerializerMiddleware {
|
|
479
551
|
Array.from(
|
480
552
|
allWrittenFiles,
|
481
553
|
file =>
|
482
|
-
new Promise(
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
554
|
+
new Promise(
|
555
|
+
/**
|
556
|
+
* @param {(value?: undefined) => void} resolve resolve
|
557
|
+
* @param {(reason?: Error | null) => void} reject reject
|
558
|
+
* @returns {void}
|
559
|
+
*/
|
560
|
+
(resolve, reject) => {
|
561
|
+
this.fs.rename(`${file}_`, file, err => {
|
562
|
+
if (err) return reject(err);
|
563
|
+
resolve();
|
564
|
+
});
|
565
|
+
}
|
566
|
+
)
|
488
567
|
)
|
489
568
|
);
|
490
569
|
|
491
570
|
// As final step automatically update the index file to have a consistent pack again
|
492
|
-
await new Promise(
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
571
|
+
await new Promise(
|
572
|
+
/**
|
573
|
+
* @param {(value?: undefined) => void} resolve resolve
|
574
|
+
* @returns {void}
|
575
|
+
*/
|
576
|
+
resolve => {
|
577
|
+
this.fs.rename(`${filename}_`, filename, err => {
|
578
|
+
if (err) return reject(err);
|
579
|
+
resolve();
|
580
|
+
});
|
581
|
+
}
|
582
|
+
);
|
498
583
|
return /** @type {true} */ (true);
|
499
584
|
}
|
500
585
|
)
|
@@ -505,11 +590,15 @@ class FileMiddleware extends SerializerMiddleware {
|
|
505
590
|
|
506
591
|
/**
|
507
592
|
* @param {SerializedType} data data
|
508
|
-
* @param {
|
593
|
+
* @param {object} context context object
|
509
594
|
* @returns {DeserializedType|Promise<DeserializedType>} deserialized data
|
510
595
|
*/
|
511
596
|
deserialize(data, context) {
|
512
597
|
const { filename, extension = "" } = context;
|
598
|
+
/**
|
599
|
+
* @param {string | boolean} name name
|
600
|
+
* @returns {Promise<TODO>} result
|
601
|
+
*/
|
513
602
|
const readFile = name =>
|
514
603
|
new Promise((resolve, reject) => {
|
515
604
|
const file = name
|
@@ -520,10 +609,14 @@ class FileMiddleware extends SerializerMiddleware {
|
|
520
609
|
reject(err);
|
521
610
|
return;
|
522
611
|
}
|
523
|
-
let remaining = /** @type {
|
612
|
+
let remaining = /** @type {IStats} */ (stats).size;
|
613
|
+
/** @type {Buffer | undefined} */
|
524
614
|
let currentBuffer;
|
615
|
+
/** @type {number | undefined} */
|
525
616
|
let currentBufferUsed;
|
617
|
+
/** @type {any[]} */
|
526
618
|
const buf = [];
|
619
|
+
/** @type {import("zlib").Zlib & import("stream").Transform | undefined} */
|
527
620
|
let decompression;
|
528
621
|
if (file.endsWith(".gz")) {
|
529
622
|
decompression = createGunzip({
|
@@ -535,7 +628,8 @@ class FileMiddleware extends SerializerMiddleware {
|
|
535
628
|
});
|
536
629
|
}
|
537
630
|
if (decompression) {
|
538
|
-
let newResolve
|
631
|
+
let newResolve;
|
632
|
+
let newReject;
|
539
633
|
resolve(
|
540
634
|
Promise.all([
|
541
635
|
new Promise((rs, rj) => {
|
@@ -552,11 +646,12 @@ class FileMiddleware extends SerializerMiddleware {
|
|
552
646
|
resolve = newResolve;
|
553
647
|
reject = newReject;
|
554
648
|
}
|
555
|
-
this.fs.open(file, "r", (err,
|
649
|
+
this.fs.open(file, "r", (err, _fd) => {
|
556
650
|
if (err) {
|
557
651
|
reject(err);
|
558
652
|
return;
|
559
653
|
}
|
654
|
+
const fd = /** @type {number} */ (_fd);
|
560
655
|
const read = () => {
|
561
656
|
if (currentBuffer === undefined) {
|
562
657
|
currentBuffer = Buffer.allocUnsafeSlow(
|
@@ -569,8 +664,10 @@ class FileMiddleware extends SerializerMiddleware {
|
|
569
664
|
currentBufferUsed = 0;
|
570
665
|
}
|
571
666
|
let readBuffer = currentBuffer;
|
572
|
-
let readOffset = currentBufferUsed;
|
573
|
-
let readLength =
|
667
|
+
let readOffset = /** @type {number} */ (currentBufferUsed);
|
668
|
+
let readLength =
|
669
|
+
currentBuffer.length -
|
670
|
+
/** @type {number} */ (currentBufferUsed);
|
574
671
|
// values passed to fs.read must be valid int32 values
|
575
672
|
if (readOffset > 0x7fffffff) {
|
576
673
|
readBuffer = currentBuffer.slice(readOffset);
|
@@ -592,9 +689,13 @@ class FileMiddleware extends SerializerMiddleware {
|
|
592
689
|
});
|
593
690
|
return;
|
594
691
|
}
|
595
|
-
|
692
|
+
/** @type {number} */
|
693
|
+
(currentBufferUsed) += bytesRead;
|
596
694
|
remaining -= bytesRead;
|
597
|
-
if (
|
695
|
+
if (
|
696
|
+
currentBufferUsed ===
|
697
|
+
/** @type {Buffer} */ (currentBuffer).length
|
698
|
+
) {
|
598
699
|
if (decompression) {
|
599
700
|
decompression.write(currentBuffer);
|
600
701
|
} else {
|
@@ -4,25 +4,42 @@
|
|
4
4
|
|
5
5
|
"use strict";
|
6
6
|
|
7
|
+
/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
|
8
|
+
/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
|
9
|
+
|
7
10
|
class MapObjectSerializer {
|
8
|
-
|
9
|
-
|
11
|
+
/**
|
12
|
+
* @template K, V
|
13
|
+
* @param {Map<K, V>} obj map
|
14
|
+
* @param {ObjectSerializerContext} context context
|
15
|
+
*/
|
16
|
+
serialize(obj, context) {
|
17
|
+
context.write(obj.size);
|
10
18
|
for (const key of obj.keys()) {
|
11
|
-
write(key);
|
19
|
+
context.write(key);
|
12
20
|
}
|
13
21
|
for (const value of obj.values()) {
|
14
|
-
write(value);
|
22
|
+
context.write(value);
|
15
23
|
}
|
16
24
|
}
|
17
|
-
|
18
|
-
|
25
|
+
|
26
|
+
/**
|
27
|
+
* @template K, V
|
28
|
+
* @param {ObjectDeserializerContext} context context
|
29
|
+
* @returns {Map<K, V>} map
|
30
|
+
*/
|
31
|
+
deserialize(context) {
|
32
|
+
/** @type {number} */
|
33
|
+
const size = context.read();
|
34
|
+
/** @type {Map<K, V>} */
|
19
35
|
const map = new Map();
|
36
|
+
/** @type {K[]} */
|
20
37
|
const keys = [];
|
21
38
|
for (let i = 0; i < size; i++) {
|
22
|
-
keys.push(read());
|
39
|
+
keys.push(context.read());
|
23
40
|
}
|
24
41
|
for (let i = 0; i < size; i++) {
|
25
|
-
map.set(keys[i], read());
|
42
|
+
map.set(keys[i], context.read());
|
26
43
|
}
|
27
44
|
return map;
|
28
45
|
}
|
@@ -4,27 +4,45 @@
|
|
4
4
|
|
5
5
|
"use strict";
|
6
6
|
|
7
|
+
/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
|
8
|
+
/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
|
9
|
+
|
7
10
|
class NullPrototypeObjectSerializer {
|
8
|
-
|
11
|
+
/**
|
12
|
+
* @template {object} T
|
13
|
+
* @param {T} obj null object
|
14
|
+
* @param {ObjectSerializerContext} context context
|
15
|
+
*/
|
16
|
+
serialize(obj, context) {
|
17
|
+
/** @type {string[]} */
|
9
18
|
const keys = Object.keys(obj);
|
10
19
|
for (const key of keys) {
|
11
|
-
write(key);
|
20
|
+
context.write(key);
|
12
21
|
}
|
13
|
-
write(null);
|
22
|
+
context.write(null);
|
14
23
|
for (const key of keys) {
|
15
|
-
write(obj[key]);
|
24
|
+
context.write(obj[/** @type {keyof T} */ (key)]);
|
16
25
|
}
|
17
26
|
}
|
18
|
-
|
27
|
+
|
28
|
+
/**
|
29
|
+
* @template {object} T
|
30
|
+
* @param {ObjectDeserializerContext} context context
|
31
|
+
* @returns {T} null object
|
32
|
+
*/
|
33
|
+
deserialize(context) {
|
34
|
+
/** @type {T} */
|
19
35
|
const obj = Object.create(null);
|
36
|
+
/** @type {string[]} */
|
20
37
|
const keys = [];
|
21
|
-
|
38
|
+
/** @type {string | null} */
|
39
|
+
let key = context.read();
|
22
40
|
while (key !== null) {
|
23
41
|
keys.push(key);
|
24
|
-
key = read();
|
42
|
+
key = context.read();
|
25
43
|
}
|
26
44
|
for (const key of keys) {
|
27
|
-
obj[key] = read();
|
45
|
+
obj[/** @type {keyof T} */ (key)] = context.read();
|
28
46
|
}
|
29
47
|
return obj;
|
30
48
|
}
|