webpack 5.111.0 → 5.112.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 +1 -1
- package/lib/Chunk.js +3 -966
- package/lib/Compilation.js +237 -138
- package/lib/Compiler.js +23 -24
- package/lib/Dependency.js +3 -551
- package/lib/DependencyTemplate.js +3 -69
- package/lib/EntryPlugin.js +3 -68
- package/lib/Entrypoint.js +3 -121
- package/lib/ExternalsPlugin.js +3 -92
- package/lib/FileSystemInfo.js +3 -4629
- package/lib/InitFragment.js +3 -204
- package/lib/LibraryTemplatePlugin.js +3 -46
- package/lib/ModuleFilenameHelpers.js +3 -400
- package/lib/ModuleNotFoundError.js +2 -2
- package/lib/MultiCompiler.js +43 -24
- package/lib/NormalModule.js +3 -2190
- package/lib/NullFactory.js +3 -22
- package/lib/ProgressPlugin.js +3 -908
- package/lib/RawModule.js +3 -197
- package/lib/RequestShortener.js +3 -37
- package/lib/SingleEntryPlugin.js +1 -1
- package/lib/WebpackError.js +2 -2
- package/lib/asset/AssetBytesGenerator.js +15 -9
- package/lib/asset/AssetBytesParser.js +3 -3
- package/lib/asset/AssetGenerator.js +61 -38
- package/lib/asset/AssetModule.js +2 -2
- package/lib/asset/AssetModulesPlugin.js +6 -9
- package/lib/asset/AssetParser.js +3 -3
- package/lib/asset/AssetSourceGenerator.js +15 -9
- package/lib/asset/AssetSourceParser.js +3 -3
- package/lib/asset/RawDataUrlModule.js +17 -10
- package/lib/asset/WebManifestGenerator.js +7 -7
- package/lib/asset/WebManifestParser.js +5 -5
- package/lib/async-modules/AsyncModuleHelpers.js +6 -5
- package/lib/async-modules/AwaitDependenciesInitFragment.js +4 -4
- package/lib/async-modules/InferAsyncModulesPlugin.js +4 -3
- package/lib/async-modules/isGeneratorLowered.js +3 -3
- package/lib/bun/BunTargetPlugin.js +1 -1
- package/lib/cache/AddBuildDependenciesPlugin.js +2 -19
- package/lib/{Cache.js → cache/Cache.js} +1 -1
- package/lib/{CacheFacade.js → cache/CacheFacade.js} +5 -5
- package/lib/cache/IdleFileCachePlugin.js +2 -2
- package/lib/cache/MemoryCachePlugin.js +6 -6
- package/lib/cache/MemoryWithGcCachePlugin.js +9 -10
- package/lib/cache/PackFileCacheStrategy.js +11 -28
- package/lib/cache/ResolverCachePlugin.js +8 -4
- package/lib/cache/getLazyHashedEtag.js +3 -5
- package/lib/cache/mergeEtags.js +1 -1
- package/lib/{OptionsApply.js → config/OptionsApply.js} +3 -3
- package/lib/{PlatformPlugin.js → config/PlatformPlugin.js} +2 -2
- package/lib/{WebpackOptionsApply.js → config/WebpackOptionsApply.js} +217 -200
- package/lib/{WebpackOptionsDefaulter.js → config/WebpackOptionsDefaulter.js} +3 -3
- package/lib/config/browserslistTargetHandler.js +3 -9
- package/lib/{cli.js → config/cli.js} +5 -158
- package/lib/config/defaults.js +192 -122
- package/lib/config/getClaimedAssetTypes.js +28 -21
- package/lib/config/normalization.js +18 -7
- package/lib/config/target.js +13 -4
- package/lib/container/ContainerEntryDependency.js +1 -1
- package/lib/container/ContainerEntryModule.js +13 -11
- package/lib/container/ContainerEntryModuleFactory.js +2 -2
- package/lib/container/ContainerExposedDependency.js +1 -1
- package/lib/container/ContainerPlugin.js +178 -5
- package/lib/container/ContainerReferencePlugin.js +75 -14
- package/lib/container/FallbackDependency.js +1 -1
- package/lib/container/FallbackItemDependency.js +1 -1
- package/lib/container/FallbackModule.js +12 -10
- package/lib/container/FallbackModuleFactory.js +2 -2
- package/lib/container/HoistContainerReferencesPlugin.js +10 -11
- package/lib/container/ModuleFederationPlugin.js +306 -7
- package/lib/container/RemoteModule.js +14 -10
- package/lib/container/RemoteRuntimeModule.js +5 -5
- package/lib/container/RemoteToExternalDependency.js +1 -1
- package/lib/container/moduleFederationHooks.js +1 -1
- package/lib/{ContextExclusionPlugin.js → context/ContextExclusionPlugin.js} +1 -1
- package/lib/{ContextModule.js → context/ContextModule.js} +50 -36
- package/lib/{ContextModuleFactory.js → context/ContextModuleFactory.js} +25 -24
- package/lib/{ContextReplacementPlugin.js → context/ContextReplacementPlugin.js} +4 -4
- package/lib/css/CssGenerator.js +57 -42
- package/lib/css/CssInjectStyleRuntimeModule.js +36 -30
- package/lib/css/CssLoadingRuntimeModule.js +77 -44
- package/lib/css/CssModule.js +27 -29
- package/lib/css/CssModulesPlugin.js +128 -44
- package/lib/css/CssParser.js +700 -311
- package/lib/css/CssServerStylesRuntimeModule.js +3 -3
- package/lib/css/cssMinify.js +130 -54
- package/lib/css/data.js +7017 -4648
- package/lib/css/syntax-parser.js +19873 -0
- package/lib/css/syntax-printer.js +6037 -0
- package/lib/css/syntax.js +37 -17370
- package/lib/debug/ProfilingPlugin.js +55 -23
- package/lib/{DefinePlugin.js → define/DefinePlugin.js} +407 -41
- package/lib/{DotenvPlugin.js → define/DotenvPlugin.js} +25 -29
- package/lib/{EnvironmentPlugin.js → define/EnvironmentPlugin.js} +2 -2
- package/lib/deno/DenoTargetPlugin.js +1 -1
- package/lib/dependencies/ConstDependency.js +3 -120
- package/lib/dependencies/ContextElementDependency.js +5 -172
- package/lib/dependencies/NullDependency.js +3 -37
- package/lib/dependencies/{AMDDefineDependency.js → amd/AMDDefineDependency.js} +12 -11
- package/lib/dependencies/{AMDDefineDependencyParserPlugin.js → amd/AMDDefineDependencyParserPlugin.js} +10 -10
- package/lib/dependencies/{AMDPlugin.js → amd/AMDPlugin.js} +11 -11
- package/lib/dependencies/{AMDRequireArrayDependency.js → amd/AMDRequireArrayDependency.js} +15 -13
- package/lib/dependencies/{AMDRequireContextDependency.js → amd/AMDRequireContextDependency.js} +11 -10
- package/lib/dependencies/{AMDRequireDependenciesBlock.js → amd/AMDRequireDependenciesBlock.js} +7 -6
- package/lib/dependencies/{AMDRequireDependenciesBlockParserPlugin.js → amd/AMDRequireDependenciesBlockParserPlugin.js} +10 -10
- package/lib/dependencies/{AMDRequireDependency.js → amd/AMDRequireDependency.js} +13 -12
- package/lib/dependencies/{AMDRequireItemDependency.js → amd/AMDRequireItemDependency.js} +8 -7
- package/lib/dependencies/{AMDRuntimeModules.js → amd/AMDRuntimeModules.js} +3 -3
- package/lib/dependencies/{LocalModule.js → amd/LocalModule.js} +8 -4
- package/lib/dependencies/{LocalModuleDependency.js → amd/LocalModuleDependency.js} +17 -10
- package/lib/dependencies/{LocalModulesHelpers.js → amd/LocalModulesHelpers.js} +1 -1
- package/lib/dependencies/{RequireJsStuffPlugin.js → amd/RequireJsStuffPlugin.js} +9 -9
- package/lib/dependencies/{UnsupportedDependency.js → amd/UnsupportedDependency.js} +11 -10
- package/lib/dependencies/{CommonJsDependencyHelpers.js → commonjs/CommonJsDependencyHelpers.js} +8 -9
- package/lib/dependencies/{CommonJsExportRequireDependency.js → commonjs/CommonJsExportRequireDependency.js} +176 -44
- package/lib/dependencies/{CommonJsExportsDependency.js → commonjs/CommonJsExportsDependency.js} +15 -14
- package/lib/dependencies/{CommonJsExportsParserPlugin.js → commonjs/CommonJsExportsParserPlugin.js} +138 -61
- package/lib/dependencies/{CommonJsFullRequireDependency.js → commonjs/CommonJsFullRequireDependency.js} +32 -24
- package/lib/dependencies/{CommonJsImportsParserPlugin.js → commonjs/CommonJsImportsParserPlugin.js} +39 -35
- package/lib/dependencies/{CommonJsObjectExportDependency.js → commonjs/CommonJsObjectExportDependency.js} +13 -12
- package/lib/dependencies/{CommonJsPlugin.js → commonjs/CommonJsPlugin.js} +47 -35
- package/lib/dependencies/{CommonJsRequireContextDependency.js → commonjs/CommonJsRequireContextDependency.js} +15 -14
- package/lib/dependencies/{CommonJsRequireDependency.js → commonjs/CommonJsRequireDependency.js} +33 -25
- package/lib/dependencies/{CommonJsSelfReferenceDependency.js → commonjs/CommonJsSelfReferenceDependency.js} +19 -20
- package/lib/dependencies/{ModuleDecoratorDependency.js → commonjs/ModuleDecoratorDependency.js} +16 -15
- package/lib/dependencies/{RequireEnsureDependenciesBlock.js → commonjs/RequireEnsureDependenciesBlock.js} +8 -7
- package/lib/dependencies/{RequireEnsureDependenciesBlockParserPlugin.js → commonjs/RequireEnsureDependenciesBlockParserPlugin.js} +5 -5
- package/lib/dependencies/{RequireEnsureDependency.js → commonjs/RequireEnsureDependency.js} +13 -12
- package/lib/dependencies/{RequireEnsureItemDependency.js → commonjs/RequireEnsureItemDependency.js} +7 -6
- package/lib/dependencies/{RequireEnsurePlugin.js → commonjs/RequireEnsurePlugin.js} +8 -8
- package/lib/dependencies/{RequireHeaderDependency.js → commonjs/RequireHeaderDependency.js} +14 -13
- package/lib/dependencies/{RequireIncludeDependency.js → commonjs/RequireIncludeDependency.js} +13 -12
- package/lib/dependencies/{RequireIncludeDependencyParserPlugin.js → commonjs/RequireIncludeDependencyParserPlugin.js} +3 -27
- package/lib/dependencies/{RequireIncludePlugin.js → commonjs/RequireIncludePlugin.js} +4 -4
- package/lib/dependencies/{RequireResolveContextDependency.js → commonjs/RequireResolveContextDependency.js} +11 -10
- package/lib/dependencies/{RequireResolveDependency.js → commonjs/RequireResolveDependency.js} +12 -11
- package/lib/dependencies/{RequireResolveHeaderDependency.js → commonjs/RequireResolveHeaderDependency.js} +13 -12
- package/lib/dependencies/commonjs/TopLevelThisParserPlugin.js +59 -0
- package/lib/dependencies/{ContextDependency.js → context/ContextDependency.js} +15 -14
- package/lib/dependencies/{ContextDependencyHelpers.js → context/ContextDependencyHelpers.js} +34 -18
- package/lib/dependencies/{ContextDependencyTemplateAsId.js → context/ContextDependencyTemplateAsId.js} +3 -3
- package/lib/dependencies/{ContextDependencyTemplateAsRequireCall.js → context/ContextDependencyTemplateAsRequireCall.js} +3 -3
- package/lib/dependencies/context/ContextElementDependency.js +198 -0
- package/lib/dependencies/{ImportMetaContextDependency.js → context/ImportMetaContextDependency.js} +7 -6
- package/lib/dependencies/{ImportMetaContextDependencyParserPlugin.js → context/ImportMetaContextDependencyParserPlugin.js} +9 -9
- package/lib/dependencies/{ImportMetaContextPlugin.js → context/ImportMetaContextPlugin.js} +5 -5
- package/lib/dependencies/{ImportMetaGlobDependency.js → context/ImportMetaGlobDependency.js} +7 -6
- package/lib/dependencies/{ImportMetaGlobDependencyParserPlugin.js → context/ImportMetaGlobDependencyParserPlugin.js} +4 -4
- package/lib/dependencies/{ImportMetaGlobHelpers.js → context/ImportMetaGlobHelpers.js} +9 -9
- package/lib/dependencies/{RequireContextDependency.js → context/RequireContextDependency.js} +7 -6
- package/lib/dependencies/{RequireContextDependencyParserPlugin.js → context/RequireContextDependencyParserPlugin.js} +2 -2
- package/lib/dependencies/{RequireContextPlugin.js → context/RequireContextPlugin.js} +5 -5
- package/lib/dependencies/{CachedConstDependency.js → core/CachedConstDependency.js} +12 -11
- package/lib/dependencies/core/ConstDependency.js +131 -0
- package/lib/dependencies/{ImportPhase.js → core/ImportPhase.js} +5 -4
- package/lib/dependencies/{ModuleDependency.js → core/ModuleDependency.js} +10 -7
- package/lib/dependencies/{ModuleDependencyTemplateAsId.js → core/ModuleDependencyTemplateAsId.js} +3 -3
- package/lib/dependencies/{ModuleDependencyTemplateAsRequireId.js → core/ModuleDependencyTemplateAsRequireId.js} +2 -2
- package/lib/dependencies/{ModuleInitFragmentDependency.js → core/ModuleInitFragmentDependency.js} +10 -9
- package/lib/dependencies/core/NullDependency.js +44 -0
- package/lib/dependencies/{RuntimeRequirementsDependency.js → core/RuntimeRequirementsDependency.js} +10 -9
- package/lib/dependencies/{StaticExportsDependency.js → core/StaticExportsDependency.js} +15 -8
- package/lib/dependencies/{CssIcssExportDependency.js → css/CssIcssExportDependency.js} +375 -100
- package/lib/dependencies/{CssIcssImportDependency.js → css/CssIcssImportDependency.js} +26 -22
- package/lib/dependencies/{CssIcssSymbolDependency.js → css/CssIcssSymbolDependency.js} +13 -12
- package/lib/dependencies/{CssImportDependency.js → css/CssImportDependency.js} +15 -11
- package/lib/dependencies/{CssUrlDependency.js → css/CssUrlDependency.js} +26 -21
- package/lib/dependencies/{CreateRequireParserPlugin.js → esm/CreateRequireParserPlugin.js} +9 -9
- package/lib/dependencies/{HarmonyAcceptDependency.js → esm/ESMAcceptDependency.js} +41 -38
- package/lib/dependencies/esm/ESMAcceptImportDependency.js +39 -0
- package/lib/dependencies/{HarmonyCompatibilityDependency.js → esm/ESMCompatibilityDependency.js} +40 -41
- package/lib/dependencies/{HarmonyDetectionParserPlugin.js → esm/ESMDetectionParserPlugin.js} +22 -21
- package/lib/dependencies/{HarmonyEvaluatedImportSpecifierDependency.js → esm/ESMEvaluatedImportSpecifierDependency.js} +33 -30
- package/lib/dependencies/{HarmonyExportDependencyParserPlugin.js → esm/ESMExportDependencyParserPlugin.js} +62 -93
- package/lib/dependencies/{HarmonyExportExpressionDependency.js → esm/ESMExportExpressionDependency.js} +83 -49
- package/lib/dependencies/{HarmonyExportHeaderDependency.js → esm/ESMExportHeaderDependency.js} +17 -15
- package/lib/dependencies/esm/ESMExportImportedSideEffectDependency.js +37 -0
- package/lib/dependencies/{HarmonyExportImportedSpecifierDependency.js → esm/ESMExportImportedSpecifierDependency.js} +136 -122
- package/lib/dependencies/{HarmonyExportInitFragment.js → esm/ESMExportInitFragment.js} +68 -43
- package/lib/dependencies/{HarmonyExportSpecifierDependency.js → esm/ESMExportSpecifierDependency.js} +68 -65
- package/lib/dependencies/{HarmonyExports.js → esm/ESMExports.js} +4 -4
- package/lib/dependencies/{HarmonyImportBareSideEffectDependency.js → esm/ESMImportBareSideEffectDependency.js} +21 -13
- package/lib/dependencies/{HarmonyImportDependency.js → esm/ESMImportDependency.js} +74 -71
- package/lib/dependencies/{HarmonyImportDependencyParserPlugin.js → esm/ESMImportDependencyParserPlugin.js} +199 -97
- package/lib/dependencies/{HarmonyImportGuard.js → esm/ESMImportGuard.js} +26 -29
- package/lib/dependencies/{HarmonyImportSideEffectDependency.js → esm/ESMImportSideEffectDependency.js} +86 -43
- package/lib/dependencies/{HarmonyImportSpecifierDependency.js → esm/ESMImportSpecifierDependency.js} +110 -61
- package/lib/dependencies/esm/ESMModulesPlugin.js +207 -0
- package/lib/dependencies/{HarmonyTopLevelThisParserPlugin.js → esm/ESMTopLevelThisParserPlugin.js} +7 -7
- package/lib/dependencies/{TopLevelAwaitDependency.js → esm/TopLevelAwaitDependency.js} +12 -11
- package/lib/dependencies/{DynamicExports.js → helpers/DynamicExports.js} +2 -2
- package/lib/{util → dependencies/helpers}/chainedImports.js +8 -9
- package/lib/dependencies/{processExportInfo.js → helpers/processExportInfo.js} +4 -4
- package/lib/{util → dependencies/helpers}/traverseDestructuringAssignmentProperties.js +1 -1
- package/lib/dependencies/{ImportMetaHotAcceptDependency.js → hmr/ImportMetaHotAcceptDependency.js} +8 -7
- package/lib/dependencies/{ImportMetaHotDeclineDependency.js → hmr/ImportMetaHotDeclineDependency.js} +8 -7
- package/lib/dependencies/{ModuleHotAcceptDependency.js → hmr/ModuleHotAcceptDependency.js} +8 -7
- package/lib/dependencies/{ModuleHotDeclineDependency.js → hmr/ModuleHotDeclineDependency.js} +8 -7
- package/lib/dependencies/{HtmlEntryDependency.js → html/HtmlEntryDependency.js} +125 -243
- package/lib/dependencies/{HtmlInlineHtmlDependency.js → html/HtmlInlineHtmlDependency.js} +13 -12
- package/lib/dependencies/{HtmlInlineScriptDependency.js → html/HtmlInlineScriptDependency.js} +72 -23
- package/lib/dependencies/{HtmlInlineStyleDependency.js → html/HtmlInlineStyleDependency.js} +53 -19
- package/lib/dependencies/{HtmlSourceDependency.js → html/HtmlSourceDependency.js} +23 -16
- package/lib/dependencies/{ImportContextDependency.js → import/ImportContextDependency.js} +24 -10
- package/lib/dependencies/{ImportDependency.js → import/ImportDependency.js} +26 -18
- package/lib/dependencies/{ImportEagerDependency.js → import/ImportEagerDependency.js} +18 -10
- package/lib/dependencies/{ImportParserPlugin.js → import/ImportParserPlugin.js} +20 -20
- package/lib/dependencies/{ImportPlugin.js → import/ImportPlugin.js} +4 -4
- package/lib/dependencies/{ImportWeakDependency.js → import/ImportWeakDependency.js} +18 -10
- package/lib/dependencies/{importOptionsCheck.js → import/importOptionsCheck.js} +2 -2
- package/lib/dependencies/{BuildTimeConstDependency.js → import-meta/BuildTimeConstDependency.js} +12 -11
- package/lib/dependencies/{ImportMetaMainDependency.js → import-meta/ImportMetaMainDependency.js} +12 -11
- package/lib/dependencies/{ImportMetaPlugin.js → import-meta/ImportMetaPlugin.js} +126 -107
- package/lib/dependencies/{SystemPlugin.js → system/SystemPlugin.js} +11 -38
- package/lib/dependencies/{SystemRuntimeModule.js → system/SystemRuntimeModule.js} +3 -3
- package/lib/dependencies/{ImportMetaResolveDependency.js → url/ImportMetaResolveDependency.js} +9 -8
- package/lib/dependencies/{URLContextDependency.js → url/URLContextDependency.js} +11 -10
- package/lib/dependencies/{URLDependency.js → url/URLDependency.js} +34 -25
- package/lib/{url → dependencies/url}/URLParserPlugin.js +22 -26
- package/lib/dependencies/{URLPlugin.js → url/URLPlugin.js} +6 -7
- package/lib/dependencies/{WebAssemblyExportImportedDependency.js → wasm/WebAssemblyExportImportedDependency.js} +18 -11
- package/lib/dependencies/{WebAssemblyImportDependency.js → wasm/WebAssemblyImportDependency.js} +19 -12
- package/lib/dependencies/{CreateScriptUrlDependency.js → worker/CreateScriptUrlDependency.js} +12 -11
- package/lib/dependencies/{WorkerAndWorkletPlugin.js → worker/WorkerAndWorkletPlugin.js} +46 -54
- package/lib/dependencies/{WorkerDependency.js → worker/WorkerDependency.js} +28 -20
- package/lib/dependencies/{WorkletDependency.js → worker/WorkletDependency.js} +25 -27
- package/lib/{EvalDevToolModulePlugin.js → devtool/EvalDevToolModulePlugin.js} +20 -6
- package/lib/{EvalSourceMapDevToolPlugin.js → devtool/EvalSourceMapDevToolPlugin.js} +32 -24
- package/lib/devtool/ModuleFilenameHelpers.js +413 -0
- package/lib/{SourceMapDevToolModuleOptionsPlugin.js → devtool/SourceMapDevToolModuleOptionsPlugin.js} +10 -3
- package/lib/{SourceMapDevToolPlugin.js → devtool/SourceMapDevToolPlugin.js} +207 -129
- package/lib/{util → devtool}/generateDebugId.js +1 -1
- package/lib/{IgnoreWarningsPlugin.js → diagnostics/IgnoreWarningsPlugin.js} +2 -2
- package/lib/{NoEmitOnErrorsPlugin.js → diagnostics/NoEmitOnErrorsPlugin.js} +1 -1
- package/lib/diagnostics/WarnCaseSensitiveModulesPlugin.js +64 -0
- package/lib/{WarnDeprecatedOptionPlugin.js → diagnostics/WarnDeprecatedOptionPlugin.js} +2 -22
- package/lib/diagnostics/WarnNoModeSetPlugin.js +27 -0
- package/lib/dll/DelegatedModule.js +20 -18
- package/lib/dll/DelegatedModuleFactoryPlugin.js +2 -2
- package/lib/dll/DelegatedPlugin.js +1 -1
- package/lib/{dependencies → dll}/DelegatedSourceDependency.js +5 -4
- package/lib/{dependencies → dll}/DllEntryDependency.js +6 -5
- package/lib/dll/DllEntryPlugin.js +3 -3
- package/lib/dll/DllModule.js +11 -9
- package/lib/dll/DllModuleFactory.js +3 -3
- package/lib/dll/DllPlugin.js +18 -6
- package/lib/dll/DllReferencePlugin.js +102 -26
- package/lib/dll/LibManifestPlugin.js +9 -7
- package/lib/electron/ElectronTargetPlugin.js +2 -2
- package/lib/{DynamicEntryPlugin.js → entry/DynamicEntryPlugin.js} +3 -3
- package/lib/{dependencies → entry}/EntryDependency.js +11 -2
- package/lib/{EntryOptionPlugin.js → entry/EntryOptionPlugin.js} +6 -6
- package/lib/entry/EntryPlugin.js +75 -0
- package/lib/{performance → errors}/AssetsOverSizeLimitWarning.js +2 -2
- package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
- package/lib/errors/BuildCycleError.js +1 -1
- package/lib/{WarnCaseSensitiveModulesPlugin.js → errors/CaseSensitiveModulesWarning.js} +4 -56
- package/lib/errors/ChunkRenderError.js +1 -1
- package/lib/errors/CodeGenerationError.js +1 -1
- package/lib/errors/CommentCompilationWarning.js +1 -1
- package/lib/errors/ConflictingEntryExportsWarning.js +38 -0
- package/lib/{dependencies → errors}/CriticalDependencyWarning.js +4 -3
- package/lib/errors/DeprecatedOptionWarning.js +30 -0
- package/lib/errors/DllManifestError.js +26 -0
- package/lib/{performance → errors}/DuplicatePackagesWarning.js +6 -6
- package/lib/{dependencies/HarmonyLinkingError.js → errors/ESMLinkingError.js} +4 -4
- package/lib/{performance → errors}/EntrypointsOverSizeLimitWarning.js +2 -2
- package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
- package/lib/errors/ErrorHelpers.js +222 -0
- package/lib/errors/ExternalStarReexportError.js +2 -2
- package/lib/{library → errors}/FalseIIFEUmdWarning.js +1 -1
- package/lib/errors/HookWebpackError.js +6 -5
- package/lib/errors/IgnoreErrorModuleFactory.js +3 -3
- package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
- package/lib/{optimize → errors}/MinMaxSizeWarning.js +1 -1
- package/lib/errors/ModuleBuildError.js +1 -1
- package/lib/errors/ModuleDependencyError.js +2 -2
- package/lib/errors/ModuleDependencyWarning.js +2 -2
- package/lib/errors/ModuleError.js +1 -1
- package/lib/errors/ModuleHashingError.js +1 -1
- package/lib/errors/ModuleNotFoundError.js +3 -3
- package/lib/errors/ModuleParseError.js +1 -1
- package/lib/errors/ModuleRestoreError.js +1 -1
- package/lib/errors/ModuleStoreError.js +1 -1
- package/lib/errors/ModuleWarning.js +1 -1
- package/lib/{performance → errors}/NoAsyncChunksWarning.js +1 -1
- package/lib/{WarnNoModeSetPlugin.js → errors/NoModeWarning.js} +2 -19
- package/lib/errors/NodeStuffInWebError.js +7 -2
- package/lib/errors/PathVariableError.js +31 -0
- package/lib/errors/RequireIncludeDeprecationWarning.js +40 -0
- package/lib/{performance → errors}/RuntimeInLargeChunkWarning.js +1 -1
- package/lib/errors/RuntimeModuleGenerationError.js +51 -0
- package/lib/errors/SSRManifestAutoPublicPathWarning.js +24 -0
- package/lib/errors/SystemImportDeprecationWarning.js +43 -0
- package/lib/errors/UnmergeableEntryExportsError.js +34 -0
- package/lib/errors/UnsupportedFeatureWarning.js +1 -1
- package/lib/{wasm-sync → errors}/UnsupportedWebAssemblyFeatureError.js +1 -1
- package/lib/{wasm-sync → errors}/WebAssemblyInInitialChunkError.js +7 -5
- package/lib/errors/WebpackError.js +12 -3
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -2
- package/lib/esm/ModuleChunkFormatPlugin.js +19 -19
- package/lib/esm/ModuleChunkLoadingPlugin.js +3 -3
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +8 -8
- package/lib/{ExternalModule.js → externals/ExternalModule.js} +85 -63
- package/lib/{ExternalModuleFactoryPlugin.js → externals/ExternalModuleFactoryPlugin.js} +41 -39
- package/lib/externals/ExternalsPlugin.js +99 -0
- package/lib/fs/FileSystemInfo.js +4642 -0
- package/lib/{util → fs}/fs.js +22 -9
- package/lib/{AsyncDependenciesBlock.js → graph/AsyncDependenciesBlock.js} +27 -4
- package/lib/graph/Chunk.js +985 -0
- package/lib/{ChunkGraph.js → graph/ChunkGraph.js} +187 -80
- package/lib/{ChunkGroup.js → graph/ChunkGroup.js} +11 -3
- package/lib/{DependenciesBlock.js → graph/DependenciesBlock.js} +16 -4
- package/lib/graph/Dependency.js +628 -0
- package/lib/graph/Entrypoint.js +136 -0
- package/lib/{ExportsInfo.js → graph/ExportsInfo.js} +151 -99
- package/lib/{HotUpdateChunk.js → graph/HotUpdateChunk.js} +8 -0
- package/lib/{ModuleGraph.js → graph/ModuleGraph.js} +36 -39
- package/lib/{ModuleGraphConnection.js → graph/ModuleGraphConnection.js} +2 -2
- package/lib/{buildChunkGraph.js → graph/buildChunkGraph.js} +163 -72
- package/lib/{util → graph}/findGraphRoots.js +20 -21
- package/lib/graph/isDependencyKind.js +23 -0
- package/lib/hmr/HotModuleReplacement.runtime.js +2 -2
- package/lib/{HotModuleReplacementPlugin.js → hmr/HotModuleReplacementPlugin.js} +49 -47
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +3 -3
- package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +10 -8
- package/lib/hmr/JavascriptHotModuleReplacementHelper.js +2 -2
- package/lib/hmr/LazyCompilationPlugin.js +34 -26
- package/lib/html/HtmlGenerator.js +168 -125
- package/lib/html/HtmlModule.js +6 -2
- package/lib/html/HtmlModulesPlugin.js +260 -215
- package/lib/html/HtmlParser.js +598 -292
- package/lib/html/builtinEmbeddedRenderer.js +60 -13
- package/lib/html/data.js +23 -1
- package/lib/html/htmlMinify.js +120 -51
- package/lib/html/syntax-parser.js +15796 -0
- package/lib/html/syntax-printer.js +1034 -0
- package/lib/html/syntax.js +37 -14062
- package/lib/html/xmlMinify.js +67 -0
- package/lib/ids/ChunkModuleIdRangePlugin.js +2 -2
- package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
- package/lib/ids/HashedModuleIdsPlugin.js +31 -4
- package/lib/ids/IdHelpers.js +4 -4
- package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
- package/lib/ids/OccurrenceChunkIdsPlugin.js +6 -5
- package/lib/ids/OccurrenceModuleIdsPlugin.js +6 -5
- package/lib/{RecordIdsPlugin.js → ids/RecordIdsPlugin.js} +5 -5
- package/lib/ids/SyncModuleIdsPlugin.js +3 -3
- package/lib/{util → ids}/numberHash.js +1 -1
- package/lib/index.js +348 -99
- package/lib/{APIPlugin.js → javascript/APIPlugin.js} +29 -30
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +4 -5
- package/lib/javascript/BasicEvaluatedExpression.js +4 -4
- package/lib/javascript/ChunkHelpers.js +64 -4
- package/lib/javascript/CommonJsChunkFormatPlugin.js +4 -7
- package/lib/{CompatibilityPlugin.js → javascript/CompatibilityPlugin.js} +10 -11
- package/lib/{ConstPlugin.js → javascript/ConstPlugin.js} +90 -139
- package/lib/{ExportsInfoApiPlugin.js → javascript/ExportsInfoApiPlugin.js} +5 -5
- package/lib/{dependencies → javascript}/ExportsInfoDependency.js +10 -9
- package/lib/javascript/JavascriptGenerator.js +25 -18
- package/lib/{JavascriptMetaInfoPlugin.js → javascript/JavascriptMetaInfoPlugin.js} +7 -7
- package/lib/javascript/JavascriptModule.js +4 -3
- package/lib/javascript/JavascriptModulesPlugin.js +458 -256
- package/lib/javascript/JavascriptParser.js +916 -287
- package/lib/javascript/JavascriptParserHelpers.js +1 -1
- package/lib/javascript/MergedEntryExports.js +196 -0
- package/lib/javascript/ScopeAnalyzer.js +3840 -5
- package/lib/javascript/StartupHelpers.js +6 -6
- package/lib/{UseStrictPlugin.js → javascript/UseStrictPlugin.js} +12 -15
- package/lib/{dependencies → javascript}/WebpackIsIncludedDependency.js +10 -9
- package/lib/{WebpackIsIncludedPlugin.js → javascript/WebpackIsIncludedPlugin.js} +8 -8
- package/lib/javascript/data.js +533 -122
- package/lib/javascript/jsMinify.js +272 -0
- package/lib/javascript/regexp.js +67 -32
- package/lib/javascript/syntax-parser.js +18561 -0
- package/lib/javascript/syntax-printer-data.js +933 -0
- package/lib/javascript/syntax-printer.js +47106 -0
- package/lib/javascript/syntax.js +20 -10946
- package/lib/json/JsonData.js +1 -1
- package/lib/{dependencies → json}/JsonExportsDependency.js +8 -7
- package/lib/json/JsonGenerator.js +17 -11
- package/lib/json/JsonModule.js +2 -2
- package/lib/json/JsonModulesPlugin.js +1 -1
- package/lib/json/JsonParser.js +5 -5
- package/lib/json/jsonMinify.js +69 -0
- package/lib/library/AbstractLibraryPlugin.js +28 -15
- package/lib/library/AmdLibraryPlugin.js +4 -4
- package/lib/library/AssignLibraryPlugin.js +27 -11
- package/lib/library/EnableLibraryPlugin.js +1 -1
- package/lib/library/ExportPropertyLibraryPlugin.js +4 -4
- package/lib/library/JsonpLibraryPlugin.js +1 -1
- package/lib/library/LibraryTemplatePlugin.js +53 -0
- package/lib/library/ModuleLibraryPlugin.js +207 -285
- package/lib/library/SystemLibraryPlugin.js +6 -8
- package/lib/library/UmdLibraryPlugin.js +3 -4
- package/lib/{dependencies → loaders}/LoaderDependency.js +3 -3
- package/lib/{dependencies → loaders}/LoaderImportDependency.js +9 -3
- package/lib/{LoaderOptionsPlugin.js → loaders/LoaderOptionsPlugin.js} +30 -12
- package/lib/{dependencies → loaders}/LoaderPlugin.js +27 -2
- package/lib/loaders/LoaderRunner.js +160 -22
- package/lib/{LoaderTargetPlugin.js → loaders/LoaderTargetPlugin.js} +2 -2
- package/lib/logging/Logger.js +7 -9
- package/lib/logging/ProgressPlugin.js +957 -0
- package/lib/{CodeGenerationResults.js → module/CodeGenerationResults.js} +7 -7
- package/lib/{Generator.js → module/Generator.js} +38 -14
- package/lib/{Module.js → module/Module.js} +122 -54
- package/lib/{ModuleFactory.js → module/ModuleFactory.js} +3 -3
- package/lib/module/NormalModule.js +2348 -0
- package/lib/{NormalModuleFactory.js → module/NormalModuleFactory.js} +53 -54
- package/lib/module/NullFactory.js +29 -0
- package/lib/{Parser.js → module/Parser.js} +3 -3
- package/lib/module/RawModule.js +208 -0
- package/lib/{SelfModuleFactory.js → module/SelfModuleFactory.js} +1 -1
- package/lib/{util → module}/extractSourceMap.js +2 -2
- package/lib/{util → module}/findCaseMismatch.js +2 -2
- package/lib/node/CommonJsChunkLoadingPlugin.js +3 -3
- package/lib/{dependencies → node}/ExternalModuleDependency.js +8 -7
- package/lib/{dependencies → node}/ExternalModuleInitFragment.js +6 -5
- package/lib/{dependencies → node}/ExternalModuleInitFragmentDependency.js +14 -9
- package/lib/node/NodeEnvironmentPlugin.js +11 -1
- package/lib/{NodeStuffPlugin.js → node/NodeStuffPlugin.js} +17 -17
- package/lib/node/NodeTargetPlugin.js +1 -1
- package/lib/node/NodeWatchFileSystem.js +61 -15
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +7 -7
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +9 -7
- package/lib/node/ReadFileCompileWasmPlugin.js +7 -5
- package/lib/node/RequireChunkLoadingRuntimeModule.js +7 -7
- package/lib/node/nodeConsole.js +2 -4
- package/lib/optimize/AggressiveMergingPlugin.js +5 -7
- package/lib/optimize/AggressiveSplittingPlugin.js +12 -8
- package/lib/{CircularModulesPlugin.js → optimize/CircularModulesPlugin.js} +13 -13
- package/lib/optimize/ConcatenatedModule.js +305 -309
- package/lib/{ConcatenationScope.js → optimize/ConcatenationScope.js} +39 -6
- package/lib/optimize/ConstExportsPlugin.js +7 -7
- package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
- package/lib/{FlagAllModulesAsUsedPlugin.js → optimize/FlagAllModulesAsUsedPlugin.js} +3 -3
- package/lib/{FlagDependencyExportsPlugin.js → optimize/FlagDependencyExportsPlugin.js} +25 -30
- package/lib/{FlagDependencyUsagePlugin.js → optimize/FlagDependencyUsagePlugin.js} +26 -30
- package/lib/{FlagEntryExportAsUsedPlugin.js → optimize/FlagEntryExportAsUsedPlugin.js} +2 -2
- package/lib/optimize/FlagIncludedChunksPlugin.js +5 -13
- package/lib/optimize/InlineExports.js +11 -3
- package/lib/optimize/InnerGraph.js +5 -13
- package/lib/optimize/InnerGraphPlugin.js +17 -23
- package/lib/optimize/LazyBarrels.js +584 -0
- package/lib/{util → optimize}/LazyBucketSortedSet.js +2 -2
- package/lib/optimize/LimitChunkCountPlugin.js +21 -15
- package/lib/optimize/MangleExportsPlugin.js +8 -9
- package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -6
- package/lib/optimize/MinChunkSizePlugin.js +9 -6
- package/lib/optimize/ModuleConcatenationPlugin.js +23 -16
- package/lib/{dependencies → optimize}/PureExpressionDependency.js +11 -10
- package/lib/optimize/RealContentHashPlugin.js +16 -7
- package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
- package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
- package/lib/optimize/SideEffectsFlagPlugin.js +25 -37
- package/lib/optimize/SplitChunksPlugin.js +715 -159
- package/lib/{util → optimize}/TupleQueue.js +9 -9
- package/lib/optimize/chunkSetIntersections.js +437 -0
- package/lib/{util → optimize}/deterministicGrouping.js +25 -30
- package/lib/{BannerPlugin.js → output/BannerPlugin.js} +82 -14
- package/lib/{CleanPlugin.js → output/CleanPlugin.js} +66 -24
- package/lib/{CopyPlugin.js → output/CopyPlugin.js} +142 -67
- package/lib/{ManifestPlugin.js → output/ManifestPlugin.js} +91 -17
- package/lib/output/SSRManifestPlugin.js +349 -0
- package/lib/performance/AnalyzableBailoutsPlugin.js +1 -1
- package/lib/performance/AsyncChunkWaterfallsPlugin.js +1 -1
- package/lib/performance/BroadContextsPlugin.js +4 -4
- package/lib/performance/CacheEffectivenessPlugin.js +5 -7
- package/lib/performance/ConflictingResourceHintsPlugin.js +1 -1
- package/lib/performance/DuplicateModulesPlugin.js +3 -4
- package/lib/performance/DuplicatePackagesPlugin.js +3 -3
- package/lib/performance/DynamicExportsPlugin.js +2 -2
- package/lib/performance/EvalUsagePlugin.js +3 -3
- package/lib/performance/HotspotsPlugin.js +11 -10
- package/lib/performance/LargeModulesPlugin.js +2 -3
- package/lib/performance/LegacyJavascriptPlugin.js +1 -2
- package/lib/performance/MissingSideEffectsPlugin.js +2 -3
- package/lib/performance/MissingSourceMapsPlugin.js +5 -6
- package/lib/performance/PureAnnotationsPlugin.js +3 -3
- package/lib/performance/RedundantDynamicImportsPlugin.js +6 -8
- package/lib/performance/ScopeHoistingBailoutsPlugin.js +2 -2
- package/lib/performance/SizeLimitsPlugin.js +13 -16
- package/lib/performance/TopLevelThisPlugin.js +8 -7
- package/lib/performance/UnsplitVendorsPlugin.js +1 -2
- package/lib/performance/UnusedAliasesPlugin.js +6 -7
- package/lib/performance/UnusedAssetsPlugin.js +5 -5
- package/lib/performance/UnusedDefinesPlugin.js +2 -2
- package/lib/performance/UnusedExternalsPlugin.js +3 -4
- package/lib/performance/UnusedFederationPlugin.js +2 -4
- package/lib/performance/UnusedModulesPlugin.js +5 -4
- package/lib/performance/getModuleSize.js +1 -1
- package/lib/performance/hasOnlyUnusedExports.js +4 -4
- package/lib/performance/isOnlyReexported.js +7 -6
- package/lib/{AutomaticPrefetchPlugin.js → prefetch/AutomaticPrefetchPlugin.js} +4 -5
- package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +2 -2
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +7 -9
- package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +4 -4
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +4 -4
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +4 -4
- package/lib/{dependencies → prefetch}/PrefetchDependency.js +1 -1
- package/lib/{PrefetchPlugin.js → prefetch/PrefetchPlugin.js} +2 -2
- package/lib/prefetch/ResourceHintPlugin.js +82 -65
- package/lib/prefetch/ResourceHintRuntimeModule.js +3 -3
- package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -13
- package/lib/prefetch/parseResourceHintOptions.js +4 -3
- package/lib/{ProvidePlugin.js → provide/ProvidePlugin.js} +7 -7
- package/lib/{dependencies → provide}/ProvidedDependency.js +14 -13
- package/lib/{IgnorePlugin.js → resolve/IgnorePlugin.js} +30 -13
- package/lib/{NormalModuleReplacementPlugin.js → resolve/NormalModuleReplacementPlugin.js} +4 -4
- package/lib/{ResolverFactory.js → resolve/ResolverFactory.js} +18 -5
- package/lib/resolve/getResolveOptionsKey.js +59 -0
- package/lib/rules/RuleSetCompiler.js +27 -46
- package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +2 -2
- package/lib/runtime/AsyncModuleRuntimeModule.js +10 -9
- package/lib/runtime/AutoPublicPathRuntimeModule.js +5 -5
- package/lib/runtime/BaseUriRuntimeModule.js +3 -3
- package/lib/runtime/ChunkNameRuntimeModule.js +2 -2
- package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -2
- package/lib/runtime/CompatRuntimeModule.js +4 -4
- package/lib/runtime/ConcatenationWrapRuntimeModule.js +2 -2
- package/lib/runtime/ConstructRequireRuntimeModule.js +2 -2
- package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +2 -2
- package/lib/runtime/CreateScriptRuntimeModule.js +2 -2
- package/lib/runtime/CreateScriptUrlRuntimeModule.js +2 -2
- package/lib/runtime/DefinePropertyGettersRuntimeModule.js +6 -6
- package/lib/runtime/EnsureChunkRuntimeModule.js +4 -4
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +9 -10
- package/lib/runtime/GetFullHashRuntimeModule.js +2 -2
- package/lib/runtime/GetMainFilenameRuntimeModule.js +4 -4
- package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +3 -3
- package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +3 -3
- package/lib/runtime/GlobalRuntimeModule.js +5 -7
- package/lib/runtime/HasOwnPropertyRuntimeModule.js +3 -3
- package/lib/runtime/HelperRuntimeModule.js +16 -1
- package/lib/runtime/LoadScriptRuntimeModule.js +3 -3
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +135 -102
- package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -2
- package/lib/runtime/NonceRuntimeModule.js +2 -2
- package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -4
- package/lib/runtime/PublicPathRuntimeModule.js +2 -2
- package/lib/runtime/RelativeUrlRuntimeModule.js +2 -2
- package/lib/{RuntimeGlobals.js → runtime/RuntimeGlobals.js} +18 -1
- package/lib/runtime/RuntimeIdRuntimeModule.js +4 -4
- package/lib/{RuntimeModule.js → runtime/RuntimeModule.js} +36 -21
- package/lib/{RuntimePlugin.js → runtime/RuntimePlugin.js} +48 -50
- package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +2 -2
- package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +2 -2
- package/lib/runtime/StartupChunkDependenciesPlugin.js +2 -2
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +5 -5
- package/lib/runtime/StartupEntrypointRuntimeModule.js +3 -3
- package/lib/runtime/SystemContextRuntimeModule.js +2 -2
- package/lib/runtime/ToBinaryRuntimeModule.js +3 -3
- package/lib/runtime/WorkerRuntimeModule.js +1 -1
- package/lib/runtime/baseUri.js +1 -1
- package/lib/schemes/DataUriPlugin.js +4 -7
- package/lib/schemes/HttpUriPlugin.js +67 -11
- package/lib/schemes/VirtualUrlPlugin.js +50 -16
- package/lib/serialization/AggregateErrorSerializer.js +2 -2
- package/lib/serialization/BinaryMiddleware.js +9 -9
- package/lib/serialization/FileMiddleware.js +19 -19
- package/lib/serialization/ObjectMiddleware.js +77 -49
- package/lib/serialization/SerializerMiddleware.js +2 -2
- package/lib/serialization/SingleItemMiddleware.js +4 -2
- package/lib/sharing/ConsumeSharedFallbackDependency.js +9 -1
- package/lib/sharing/ConsumeSharedModule.js +18 -14
- package/lib/sharing/ConsumeSharedPlugin.js +148 -42
- package/lib/sharing/ConsumeSharedRuntimeModule.js +8 -8
- package/lib/sharing/ProvideForSharedDependency.js +9 -1
- package/lib/sharing/ProvideSharedDependency.js +1 -1
- package/lib/sharing/ProvideSharedModule.js +11 -9
- package/lib/sharing/ProvideSharedModuleFactory.js +2 -2
- package/lib/sharing/ProvideSharedPlugin.js +111 -20
- package/lib/sharing/SharePlugin.js +102 -9
- package/lib/sharing/ShareRuntimeModule.js +6 -6
- package/lib/sharing/resolveMatchedConfigs.js +1 -1
- package/lib/{util → sharing}/semver.js +19 -19
- package/lib/sharing/utils.js +59 -2
- package/lib/stats/DefaultStatsFactoryPlugin.js +25 -23
- package/lib/stats/DefaultStatsPresetPlugin.js +1 -1
- package/lib/stats/DefaultStatsPrinterPlugin.js +3 -3
- package/lib/{MultiStats.js → stats/MultiStats.js} +4 -4
- package/lib/{Stats.js → stats/Stats.js} +4 -4
- package/lib/stats/StatsFactory.js +14 -13
- package/lib/{ChunkTemplate.js → template/ChunkTemplate.js} +7 -7
- package/lib/{ConditionalInitFragment.js → template/ConditionalInitFragment.js} +3 -3
- package/lib/template/DependencyTemplate.js +77 -0
- package/lib/{DependencyTemplates.js → template/DependencyTemplates.js} +9 -4
- package/lib/template/InitFragment.js +223 -0
- package/lib/{MainTemplate.js → template/MainTemplate.js} +11 -11
- package/lib/{ModuleInfoHeaderPlugin.js → template/ModuleInfoHeaderPlugin.js} +30 -8
- package/lib/{ModuleTemplate.js → template/ModuleTemplate.js} +6 -6
- package/lib/{RuntimeTemplate.js → template/RuntimeTemplate.js} +178 -106
- package/lib/{Template.js → template/Template.js} +13 -11
- package/lib/{TemplatedPathPlugin.js → template/TemplatedPathPlugin.js} +35 -82
- package/lib/typescript/TypeScriptPlugin.js +5 -6
- package/lib/util/LocConverter.js +4 -7
- package/lib/util/RequestShortener.js +44 -0
- package/lib/util/SortableSet.js +87 -22
- package/lib/util/SourceProcessor.js +364 -66
- package/lib/util/TupleSet.js +27 -27
- package/lib/util/WeakTupleMap.js +10 -12
- package/lib/util/buildDiagnostics.js +2 -2
- package/lib/util/comparators.js +10 -10
- package/lib/util/concatenate.js +32 -151
- package/lib/util/createHooksRegistry.js +1 -2
- package/lib/util/createMappings.js +111 -0
- package/lib/util/dataURL.js +96 -18
- package/lib/util/deprecation.js +1 -1
- package/lib/util/extractComments.js +118 -0
- package/lib/util/formatLocation.js +1 -1
- package/lib/util/globUtils.js +197 -16
- package/lib/util/haltVisitors.js +51 -0
- package/lib/util/handlerKeys.js +2 -2
- package/lib/util/hash/wasm-hash.js +3 -4
- package/lib/util/identifier.js +117 -1
- package/lib/util/implicitTypeLoaderFallback.js +6 -4
- package/lib/util/internalSerializables.js +295 -103
- package/lib/util/magicComment.js +12 -7
- package/lib/util/makeSerializable.js +23 -4
- package/lib/util/parseJson.js +1 -1
- package/lib/util/preloadModuleType.js +5 -2
- package/lib/util/registerExternalSerializer.js +2 -2
- package/lib/util/removeBOM.js +1 -1
- package/lib/util/runtime.js +1 -1
- package/lib/util/serialization.js +4 -1
- package/lib/util/source.js +2 -2
- package/lib/util/terminalColors.js +161 -0
- package/lib/{wasm-async → wasm}/AsyncWasmCompileRuntimeModule.js +5 -5
- package/lib/{wasm-async → wasm}/AsyncWasmLoadingRuntimeModule.js +5 -5
- package/lib/{wasm-async → wasm}/AsyncWasmModule.js +9 -5
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyGenerator.js +11 -6
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyJavascriptGenerator.js +16 -11
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyModulesPlugin.js +26 -10
- package/lib/{wasm-async → wasm}/AsyncWebAssemblyParser.js +8 -8
- package/lib/wasm/EnableWasmLoadingPlugin.js +1 -1
- package/lib/{wasm-async → wasm}/UniversalCompileAsyncWasmPlugin.js +9 -7
- package/lib/wasm/wasmModuleFilename.js +2 -2
- package/lib/wasm-sync/SyncWasmModule.js +3 -3
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +11 -12
- package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +3 -3
- package/lib/wasm-sync/WebAssemblyGenerator.js +15 -9
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +19 -16
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +9 -7
- package/lib/wasm-sync/WebAssemblyParser.js +6 -6
- package/lib/wasm-sync/WebAssemblyUtils.js +8 -9
- package/lib/{MultiWatching.js → watch/MultiWatching.js} +3 -3
- package/lib/{WatchIgnorePlugin.js → watch/WatchIgnorePlugin.js} +43 -9
- package/lib/{Watching.js → watch/Watching.js} +8 -8
- package/lib/web/FetchCompileAsyncWasmPlugin.js +8 -6
- package/lib/web/FetchCompileWasmPlugin.js +6 -4
- package/lib/web/JsonpChunkLoadingPlugin.js +3 -3
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +6 -6
- package/lib/web/JsonpTemplatePlugin.js +1 -1
- package/lib/webpack.js +27 -17
- package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -3
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +6 -6
- package/package.json +70 -40
- package/schemas/WebpackOptions.check.js +2 -1
- package/schemas/WebpackOptions.d.json.ts +2 -0
- package/schemas/WebpackOptions.json +294 -74
- package/schemas/plugins/BannerPlugin.check.js +2 -1
- package/schemas/plugins/BannerPlugin.json +29 -2
- package/schemas/plugins/HtmlGeneratorOptions.check.js +1 -0
- package/schemas/plugins/HtmlParserOptions.check.js +2 -1
- package/schemas/plugins/IgnorePlugin.check.js +1 -0
- package/schemas/plugins/IgnorePlugin.d.json.ts +2 -0
- package/schemas/plugins/IgnorePlugin.json +1 -1
- package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -0
- package/schemas/plugins/ManifestPlugin.check.js +1 -0
- package/schemas/plugins/ManifestPlugin.json +3 -3
- package/schemas/plugins/ProgressPlugin.check.js +2 -1
- package/schemas/plugins/ProgressPlugin.json +2 -7
- package/schemas/plugins/SSRManifestPlugin.check.js +7 -0
- package/schemas/plugins/SSRManifestPlugin.json +20 -0
- package/schemas/plugins/SourceMapDevToolPlugin.check.js +2 -1
- package/schemas/plugins/SourceMapDevToolPlugin.json +44 -12
- package/schemas/plugins/WatchIgnorePlugin.check.js +2 -1
- package/schemas/plugins/WatchIgnorePlugin.json +12 -3
- package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -0
- package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -0
- package/schemas/plugins/asset/AssetParserOptions.check.js +1 -0
- package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -0
- package/schemas/plugins/container/ContainerPlugin.check.js +2 -1
- package/schemas/plugins/container/ContainerPlugin.json +8 -0
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -0
- package/schemas/plugins/container/ExternalsType.check.js +1 -0
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +2 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +40 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -0
- package/schemas/plugins/css/CssGeneratorOptions.check.js +1 -0
- package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +1 -0
- package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -0
- package/schemas/plugins/css/CssParserOptions.check.js +1 -0
- package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -0
- package/schemas/plugins/dll/DllPlugin.check.js +1 -0
- package/schemas/plugins/dll/DllReferencePlugin.check.js +2 -1
- package/schemas/plugins/dll/DllReferencePlugin.json +3 -18
- package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +1 -0
- package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js +1 -0
- package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js +1 -0
- package/schemas/plugins/json/JsonModulesPluginGenerator.check.js +1 -0
- package/schemas/plugins/json/JsonModulesPluginParser.check.js +1 -0
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -0
- package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -0
- package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js +1 -0
- package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -0
- package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -0
- package/schemas/plugins/schemes/VirtualUrlPlugin.check.js +1 -0
- package/schemas/plugins/sharing/ConsumeSharedPlugin.check.js +2 -1
- package/schemas/plugins/sharing/ConsumeSharedPlugin.json +32 -0
- package/schemas/plugins/sharing/ProvideSharedPlugin.check.js +2 -1
- package/schemas/plugins/sharing/ProvideSharedPlugin.json +32 -0
- package/schemas/plugins/sharing/SharePlugin.check.js +2 -1
- package/schemas/plugins/sharing/SharePlugin.json +32 -0
- package/types.d.ts +13915 -8414
- package/lib/ErrorHelpers.js +0 -107
- package/lib/LazyBarrel.js +0 -388
- package/lib/dependencies/HarmonyAcceptImportDependency.js +0 -39
- package/lib/dependencies/HarmonyModulesPlugin.js +0 -192
- package/lib/javascript/ChunkFormatHelpers.js +0 -71
- package/lib/javascript/grammar.js +0 -5546
- package/lib/javascript/parser.js +0 -1494
- package/lib/javascript/regexpData.js +0 -51
- package/lib/performance/getSourceModules.js +0 -22
- package/lib/util/Semaphore.js +0 -65
- package/lib/util/objectToMap.js +0 -15
- package/schemas/WebpackOptions.check.d.ts +0 -7
- package/schemas/_container.json +0 -155
- package/schemas/_sharing.json +0 -118
- package/schemas/plugins/BannerPlugin.check.d.ts +0 -7
- package/schemas/plugins/HtmlGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/HtmlParserOptions.check.d.ts +0 -7
- package/schemas/plugins/IgnorePlugin.check.d.ts +0 -7
- package/schemas/plugins/LoaderOptionsPlugin.check.d.ts +0 -7
- package/schemas/plugins/ManifestPlugin.check.d.ts +0 -7
- package/schemas/plugins/ProgressPlugin.check.d.ts +0 -7
- package/schemas/plugins/SourceMapDevToolPlugin.check.d.ts +0 -7
- package/schemas/plugins/WatchIgnorePlugin.check.d.ts +0 -7
- package/schemas/plugins/asset/AssetGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/asset/AssetParserOptions.check.d.ts +0 -7
- package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/container/ContainerPlugin.check.d.ts +0 -7
- package/schemas/plugins/container/ContainerReferencePlugin.check.d.ts +0 -7
- package/schemas/plugins/container/ExternalsType.check.d.ts +0 -7
- package/schemas/plugins/container/ModuleFederationPlugin.check.d.ts +0 -7
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +0 -7
- package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +0 -7
- package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +0 -7
- package/schemas/plugins/css/CssParserOptions.check.d.ts +0 -7
- package/schemas/plugins/debug/ProfilingPlugin.check.d.ts +0 -7
- package/schemas/plugins/dll/DllPlugin.check.d.ts +0 -7
- package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +0 -7
- package/schemas/plugins/ids/HashedModuleIdsPlugin.check.d.ts +0 -7
- package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts +0 -7
- package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts +0 -7
- package/schemas/plugins/json/JsonModulesPluginGenerator.check.d.ts +0 -7
- package/schemas/plugins/json/JsonModulesPluginParser.check.d.ts +0 -7
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts +0 -7
- package/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts +0 -7
- package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts +0 -7
- package/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts +0 -7
- package/schemas/plugins/schemes/HttpUriPlugin.check.d.ts +0 -7
- package/schemas/plugins/schemes/VirtualUrlPlugin.check.d.ts +0 -7
- package/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts +0 -7
- package/schemas/plugins/sharing/ProvideSharedPlugin.check.d.ts +0 -7
- package/schemas/plugins/sharing/SharePlugin.check.d.ts +0 -7
- /package/lib/{validateSchema.js → config/validateSchema.js} +0 -0
- /package/lib/{util → css}/conventions.js +0 -0
- /package/lib/{util → css}/topologicalSort.js +0 -0
- /package/lib/dependencies/{getFunctionExpression.js → helpers/getFunctionExpression.js} +0 -0
- /package/lib/{util → externals}/extractUrlAndGlobal.js +0 -0
- /package/lib/{util → fs}/StackedCacheMap.js +0 -0
- /package/lib/{util → javascript}/StackedMap.js +0 -0
- /package/lib/{ModuleProfile.js → module/ModuleProfile.js} +0 -0
- /package/lib/{ModuleSourceTypeConstants.js → module/ModuleSourceTypeConstants.js} +0 -0
- /package/lib/{ModuleTypeConstants.js → module/ModuleTypeConstants.js} +0 -0
- /package/lib/{OptimizationStages.js → optimize/OptimizationStages.js} +0 -0
- /package/lib/{util → optimize}/Queue.js +0 -0
- /package/lib/{util → stats}/smartGrouping.js +0 -0
|
@@ -38,6 +38,8 @@ const chooseDeferredInfix = (input) => {
|
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
const DEFERRED_ID_RE = /^\d+$/;
|
|
41
|
+
// A character a stylesheet's bytes cannot spell without naming an encoding.
|
|
42
|
+
const NON_ASCII_RE = /[^\0-\u007F]/;
|
|
41
43
|
|
|
42
44
|
/**
|
|
43
45
|
* Read the deferred write standing at `start`, if one does.
|
|
@@ -117,10 +119,10 @@ const declineDeferredWrites = (text, writes) =>
|
|
|
117
119
|
);
|
|
118
120
|
|
|
119
121
|
/**
|
|
120
|
-
*
|
|
122
|
+
* Visitor map keyed by a numeric node-type discriminator; a bucket
|
|
121
123
|
* is a function (enter-only) or `{ enter?, exit? }`.
|
|
122
124
|
*
|
|
123
|
-
* A visitor receives a single `path` argument
|
|
125
|
+
* A visitor receives a single `path` argument: the
|
|
124
126
|
* language's AST accessor with the current position on it — `path.node`,
|
|
125
127
|
* `path.parent` (null at a root) — plus `path.skipChildren()` (enter only)
|
|
126
128
|
* to stop the walk descending, and every field-read method (which defaults
|
|
@@ -130,6 +132,122 @@ const declineDeferredWrites = (text, writes) =>
|
|
|
130
132
|
* @template TPath
|
|
131
133
|
* @typedef {(path: TPath) => void} VisitorFn
|
|
132
134
|
*/
|
|
135
|
+
/**
|
|
136
|
+
* The members every language's `path` has under the same name and meaning, so
|
|
137
|
+
* a visitor written against it reads any grammar; see `docs/syntax.md`.
|
|
138
|
+
* @template TNode
|
|
139
|
+
* @template [TValue=unknown]
|
|
140
|
+
* @typedef {NodePathReads<TNode, TValue> & NodePathFields<TNode>} NodePath
|
|
141
|
+
*/
|
|
142
|
+
/**
|
|
143
|
+
* @template TNode
|
|
144
|
+
* @template [TValue=unknown]
|
|
145
|
+
* @typedef {object} NodePathReads
|
|
146
|
+
* @property {TNode} node the current node
|
|
147
|
+
* @property {TNode | null} parent the enclosing node (null at a root)
|
|
148
|
+
* @property {number} index the current node's index among its siblings
|
|
149
|
+
* @property {() => void} skipChildren stop the walk descending into the current node (enter only)
|
|
150
|
+
* @property {() => void} stop end the walk: no visitor fires after the current one returns, and a print still completes
|
|
151
|
+
* @property {unknown} state the run's state, as `process` was given it
|
|
152
|
+
* @property {(n?: TNode) => number} type the node's `NodeType`
|
|
153
|
+
* @property {(n?: TNode) => [number, number]} range start and end offsets in the input
|
|
154
|
+
* @property {(n?: TNode) => number} start where the node starts in the input
|
|
155
|
+
* @property {(n?: TNode) => number} end where the node ends in the input
|
|
156
|
+
* @property {(n?: TNode) => [number, number, number, number]} loc start line and column, end line and column (lines from 1, columns from 0)
|
|
157
|
+
* @property {(n?: TNode | number, end?: number) => string} source the node's source text, or the input between two offsets
|
|
158
|
+
* @property {(n?: TNode) => string} name the node's name as the language defines it, decoded ("" when it has none)
|
|
159
|
+
* @property {(n?: TNode) => TValue} value the node's value as the language defines it, decoded
|
|
160
|
+
* @property {(n?: TNode) => number} childCount number of children
|
|
161
|
+
* @property {(i: number, n?: TNode) => TNode} child the i-th child
|
|
162
|
+
* @property {(n?: TNode) => TNode[]} children every child as a new array
|
|
163
|
+
*/
|
|
164
|
+
/**
|
|
165
|
+
* Structure read through a language's `Field`, `Flag` and `Part`. Declared as
|
|
166
|
+
* methods so a language's path may accept only the parts each node type has.
|
|
167
|
+
* @template TNode
|
|
168
|
+
* @typedef {{
|
|
169
|
+
* field(i: number, field: number, n?: TNode): TNode,
|
|
170
|
+
* fieldCount(field: number, n?: TNode): number,
|
|
171
|
+
* fieldNamed(field: number, name: string, n?: TNode): TNode,
|
|
172
|
+
* flag(flag: number, n?: TNode): boolean,
|
|
173
|
+
* rangeOf(part: number, n?: TNode): [number, number] | null,
|
|
174
|
+
* startOf(part: number, n?: TNode): number,
|
|
175
|
+
* endOf(part: number, n?: TNode): number,
|
|
176
|
+
* textOf(part: number, n?: TNode): string | null,
|
|
177
|
+
* within(type: number): boolean,
|
|
178
|
+
* }} NodePathFields
|
|
179
|
+
*/
|
|
180
|
+
/**
|
|
181
|
+
* A node that also says which `NodeType` it is, so reading a part that type
|
|
182
|
+
* lacks fails to type-check; a plain `TNode` can be any node.
|
|
183
|
+
* @template TNode
|
|
184
|
+
* @template T
|
|
185
|
+
* @typedef {TNode & { readonly __nodeType: T }} TypedNode
|
|
186
|
+
*/
|
|
187
|
+
/**
|
|
188
|
+
* What part `M` gives the node type `R` says it is; every part `D` when `R`
|
|
189
|
+
* says none (a plain node reads `unknown` there).
|
|
190
|
+
* @template R
|
|
191
|
+
* @template {Record<number, number>} M
|
|
192
|
+
* @template D
|
|
193
|
+
* @typedef {number extends (R & { readonly __nodeType: unknown })["__nodeType"] ? D : M[(R & { readonly __nodeType: unknown })["__nodeType"] & number]} PartOf
|
|
194
|
+
*/
|
|
195
|
+
/**
|
|
196
|
+
* A language's parts, by node type: what its `Field`s and `Flag`s apply to.
|
|
197
|
+
* @typedef {object} NodeParts
|
|
198
|
+
* @property {number} types every `NodeType` member
|
|
199
|
+
* @property {number} field every `Field`
|
|
200
|
+
* @property {number} flag every `Flag`
|
|
201
|
+
* @property {number} part every `Part` with a position
|
|
202
|
+
* @property {number} text every `Part` with text beyond the name and value
|
|
203
|
+
* @property {Record<number, number>} fields the `Field`s of each node type
|
|
204
|
+
* @property {Record<number, number>} flags the `Flag`s of each node type
|
|
205
|
+
* @property {Record<number, number>} parts the `Part`s with a position, by node type
|
|
206
|
+
* @property {Record<number, number>} texts the `Part`s with text, by node type
|
|
207
|
+
* @property {Record<number, number>} items the node type of each `Field`'s items
|
|
208
|
+
*/
|
|
209
|
+
/**
|
|
210
|
+
* The path a visitor of node type `T` receives: its structure reads take only
|
|
211
|
+
* the parts that type has, and its `state` is the run's.
|
|
212
|
+
* @template TPath
|
|
213
|
+
* @template TNode
|
|
214
|
+
* @template {NodeParts} P
|
|
215
|
+
* @template T
|
|
216
|
+
* @template [S=unknown]
|
|
217
|
+
* @typedef {Omit<TPath, "node" | "state" | "within" | "field" | "fieldCount" | "fieldNamed" | "flag" | "rangeOf" | "startOf" | "endOf" | "textOf"> & {
|
|
218
|
+
* readonly node: TypedNode<TNode, T>,
|
|
219
|
+
* readonly state: S,
|
|
220
|
+
* within(type: P["types"]): boolean,
|
|
221
|
+
* field<R extends TNode = TypedNode<TNode, T>, F extends number = number>(i: number, field: F & PartOf<R, P["fields"], P["field"]>, n?: R): TypedNode<TNode, P["items"][F]>,
|
|
222
|
+
* fieldCount<R extends TNode = TypedNode<TNode, T>>(field: PartOf<R, P["fields"], P["field"]>, n?: R): number,
|
|
223
|
+
* fieldNamed<R extends TNode = TypedNode<TNode, T>, F extends number = number>(field: F & PartOf<R, P["fields"], P["field"]>, name: string, n?: R): TypedNode<TNode, P["items"][F]>,
|
|
224
|
+
* flag<R extends TNode = TypedNode<TNode, T>>(flag: PartOf<R, P["flags"], P["flag"]>, n?: R): boolean,
|
|
225
|
+
* rangeOf<R extends TNode = TypedNode<TNode, T>>(part: PartOf<R, P["parts"], P["part"]>, n?: R): [number, number] | null,
|
|
226
|
+
* startOf<R extends TNode = TypedNode<TNode, T>>(part: PartOf<R, P["parts"], P["part"]>, n?: R): number,
|
|
227
|
+
* endOf<R extends TNode = TypedNode<TNode, T>>(part: PartOf<R, P["parts"], P["part"]>, n?: R): number,
|
|
228
|
+
* textOf<R extends TNode = TypedNode<TNode, T>>(part: PartOf<R, P["texts"], P["text"]>, n?: R): string | null
|
|
229
|
+
* }} TypedNodePath
|
|
230
|
+
*/
|
|
231
|
+
/**
|
|
232
|
+
* The parts of a language that names none: every node type has every part.
|
|
233
|
+
* @typedef {{
|
|
234
|
+
* types: number,
|
|
235
|
+
* field: number,
|
|
236
|
+
* flag: number,
|
|
237
|
+
* part: number,
|
|
238
|
+
* text: number,
|
|
239
|
+
* fields: Record<number, number>,
|
|
240
|
+
* flags: Record<number, number>,
|
|
241
|
+
* parts: Record<number, number>,
|
|
242
|
+
* texts: Record<number, number>,
|
|
243
|
+
* items: Record<number, number>,
|
|
244
|
+
* }} AnyParts
|
|
245
|
+
*/
|
|
246
|
+
/**
|
|
247
|
+
* @template S
|
|
248
|
+
* @typedef {{ state?: S }} RunState what a run hands its visitors as `path.state`
|
|
249
|
+
*/
|
|
250
|
+
|
|
133
251
|
/**
|
|
134
252
|
* @template TPath
|
|
135
253
|
* @typedef {VisitorFn<TPath> | { enter?: VisitorFn<TPath>, exit?: VisitorFn<TPath> }} VisitorBucket
|
|
@@ -154,15 +272,32 @@ const declineDeferredWrites = (text, writes) =>
|
|
|
154
272
|
* typedef HTML also depends on.
|
|
155
273
|
* @typedef {{ mode: "minify" | "beautify" }} PrintOptions
|
|
156
274
|
*/
|
|
275
|
+
/**
|
|
276
|
+
* What names one offer whatever print made it: every field but the functions,
|
|
277
|
+
* so the second print of `processAsync` finds the first one's answer by it.
|
|
278
|
+
* @param {Omit<DeferredWrite, "build">} offer an offer, `build` and all or without it
|
|
279
|
+
* @returns {string} its key
|
|
280
|
+
*/
|
|
281
|
+
const deferredKey = (offer) => {
|
|
282
|
+
let key = "";
|
|
283
|
+
for (const name of Object.keys(offer).sort()) {
|
|
284
|
+
const value = /** @type {Record<string, unknown>} */ (offer)[name];
|
|
285
|
+
if (typeof value !== "function") key += `${name}\0${value}\0`;
|
|
286
|
+
}
|
|
287
|
+
return key;
|
|
288
|
+
};
|
|
289
|
+
|
|
157
290
|
/**
|
|
158
291
|
* One write the print left a marker for, collected into the `deferEmbeddedSource`
|
|
159
292
|
* print option by whichever grammar offered it — the other half of
|
|
160
|
-
* {@link deferredWrite}. `source` is the text offered
|
|
161
|
-
* printed around the answer
|
|
162
|
-
*
|
|
293
|
+
* {@link deferredWrite}. `source` is the text offered, `build` spells what is
|
|
294
|
+
* printed around the answer (an untapped run's spelling where there is none), and
|
|
295
|
+
* `decides` says whether the answer overturns a choice the print made without it.
|
|
296
|
+
* A grammar carries whatever else describes the offer (`type`, `hostType`, `as`,
|
|
163
297
|
* …) on the same object.
|
|
164
|
-
* @typedef {{ source: string, build: (answer: string | undefined) => string }} DeferredWrite
|
|
298
|
+
* @typedef {{ source: string, build: (answer: string | undefined) => string, decides?: (answer: string | undefined) => boolean }} DeferredWrite
|
|
165
299
|
*/
|
|
300
|
+
/** @import { DeferredEmbeddedSource } from "./dataURL" */
|
|
166
301
|
/**
|
|
167
302
|
* A version-3 source map. Written structurally (with the `3` literal) so it
|
|
168
303
|
* satisfies both `webpack-sources` and the minimizer plugin's map types without
|
|
@@ -195,6 +330,11 @@ const _makeMap = (options, mappings) => ({
|
|
|
195
330
|
// small enough that the un-flattened fragments behind it stay bounded.
|
|
196
331
|
const FLATTEN_BLOCK = 64 * 1024;
|
|
197
332
|
|
|
333
|
+
// Most prints do not ask for a source map. Sharing their permanently empty
|
|
334
|
+
// mapping column avoids allocating an array for every inline CSS/HTML body.
|
|
335
|
+
/** @type {[number, number, number, number][]} */
|
|
336
|
+
const EMPTY_MAPPINGS = [];
|
|
337
|
+
|
|
198
338
|
// Base64 VLQ, the source-map `mappings` encoding. Hand-rolled so producing a map
|
|
199
339
|
// pulls in no dependency (`source-map` is not a webpack dep).
|
|
200
340
|
const _B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
@@ -272,12 +412,9 @@ class PrintContext {
|
|
|
272
412
|
this._storeLow = 0x7fffffff;
|
|
273
413
|
/** @type {number} highest slot written since the epoch last moved */
|
|
274
414
|
this._storeHigh = -1;
|
|
275
|
-
// Output
|
|
276
|
-
//
|
|
277
|
-
//
|
|
278
|
-
// taken back ({@link emitRetractable}) — that is what lets a printer emit
|
|
279
|
-
// before it knows a later sibling overrides it, without every other emit
|
|
280
|
-
// paying for the ability. The output is `_chunks` joined, then `_tail`.
|
|
415
|
+
// Output is `_chunks` joined, then `_tail`. Printing that never takes
|
|
416
|
+
// anything back only appends to `_tail`; a piece is cut off into `_chunks`
|
|
417
|
+
// for retractable text alone, so no other emit pays for that ability.
|
|
281
418
|
/** @type {string[]} pieces already cut off, in output order */
|
|
282
419
|
this._chunks = [];
|
|
283
420
|
/** @type {string} output after the last cut piece */
|
|
@@ -286,23 +423,22 @@ class PrintContext {
|
|
|
286
423
|
this._tailLength = 0;
|
|
287
424
|
/** @type {number} scratch for the flattening read in {@link _cutTail} */
|
|
288
425
|
this._flattened = 0;
|
|
289
|
-
/** @type {[number, number, number, number][]} `[chunkIndex, offsetInChunk, srcLine, srcCol]`, output-ordered; a `srcLine` of -1 is one {@link retract} took back with its piece */
|
|
290
|
-
this._mappings = [];
|
|
291
|
-
/** @type {number[] | null} by retractable piece index, the mapping anchored to it, so taking the piece back takes its mapping too */
|
|
292
|
-
this._retractableMappings = null;
|
|
293
426
|
// A map is built only for a caller that named the input, and that is known
|
|
294
427
|
// before printing — so a print nobody asks a map of collects none.
|
|
295
428
|
/** @type {boolean} whether {@link sourceMap} can still be asked for one */
|
|
296
429
|
this.mapWanted =
|
|
297
430
|
/** @type {{ source?: string }} */ (options).source !== undefined;
|
|
431
|
+
/** @type {[number, number, number, number][]} `[chunkIndex, offsetInChunk, srcLine, srcCol]`, output-ordered; a `srcLine` of -1 is one {@link retract} took back with its piece */
|
|
432
|
+
this._mappings = this.mapWanted ? [] : EMPTY_MAPPINGS;
|
|
433
|
+
/** @type {number[] | null} by retractable piece index, the mapping anchored to it, so taking the piece back takes its mapping too */
|
|
434
|
+
this._retractableMappings = null;
|
|
298
435
|
/** @type {[number, string][]} source-anchored literals to keep (comments), source-ordered */
|
|
299
436
|
this._inserts = [];
|
|
300
437
|
/** @type {number} next `_inserts` entry not yet flushed */
|
|
301
438
|
this._insertIdx = 0;
|
|
302
|
-
// Openers of the nodes
|
|
303
|
-
//
|
|
304
|
-
//
|
|
305
|
-
// emitting an opener eagerly would give up.
|
|
439
|
+
// Openers of the nodes printed in pieces, innermost last, held back until
|
|
440
|
+
// one has content — which is what lets a node whose children all print to
|
|
441
|
+
// nothing still be dropped whole.
|
|
306
442
|
/** @type {string[]} openers not yet emitted, outermost first */
|
|
307
443
|
this._pending = [];
|
|
308
444
|
/** @type {[number | undefined, number | undefined, number | undefined] | null} anchor for the first pending opener */
|
|
@@ -477,6 +613,42 @@ class PrintContext {
|
|
|
477
613
|
}
|
|
478
614
|
}
|
|
479
615
|
|
|
616
|
+
/**
|
|
617
|
+
* Stand `text` in place of the output's end, where that is `printed` followed
|
|
618
|
+
* only by `closer`s — what the printer wrote after a value the input ran out in.
|
|
619
|
+
* @param {string} printed the text the output must end with, before the closers
|
|
620
|
+
* @param {string} text what to write in place of it and them
|
|
621
|
+
* @param {number} closer the character that may follow `printed`
|
|
622
|
+
* @returns {boolean} true when the output ended that way and was rewritten
|
|
623
|
+
*/
|
|
624
|
+
replaceEnd(printed, text, closer) {
|
|
625
|
+
this._cutTail();
|
|
626
|
+
const chunks = this._chunks;
|
|
627
|
+
// Joined once: this runs only where a value ran into the end of the input.
|
|
628
|
+
const output = chunks.join("");
|
|
629
|
+
let end = output.length;
|
|
630
|
+
while (end > 0 && output.charCodeAt(end - 1) === closer) end--;
|
|
631
|
+
// The closers the printed text wrote itself are its own, not the blocks'.
|
|
632
|
+
let own = printed.length;
|
|
633
|
+
while (own > 0 && printed.charCodeAt(own - 1) === closer) own--;
|
|
634
|
+
end += printed.length - own;
|
|
635
|
+
if (end > output.length || !output.slice(0, end).endsWith(printed)) {
|
|
636
|
+
return false;
|
|
637
|
+
}
|
|
638
|
+
let remove = output.length - end + printed.length;
|
|
639
|
+
for (let i = chunks.length - 1; remove > 0; i--) {
|
|
640
|
+
const kept = Math.max(0, chunks[i].length - remove);
|
|
641
|
+
remove -= chunks[i].length - kept;
|
|
642
|
+
chunks[i] = chunks[i].slice(0, kept);
|
|
643
|
+
// A mapping into what went would point past its piece.
|
|
644
|
+
this._mappings = this._mappings.filter(
|
|
645
|
+
([chunk, offset]) => chunk !== i || offset <= kept
|
|
646
|
+
);
|
|
647
|
+
}
|
|
648
|
+
this._emit(text);
|
|
649
|
+
return true;
|
|
650
|
+
}
|
|
651
|
+
|
|
480
652
|
/**
|
|
481
653
|
* Run the node printer for `node` and store what it returns (the grammar calls
|
|
482
654
|
* this once the node's visitors and children are done). `path` is on `node`.
|
|
@@ -485,7 +657,7 @@ class PrintContext {
|
|
|
485
657
|
*/
|
|
486
658
|
printNode(node, path) {
|
|
487
659
|
const text = this._printer(path, this);
|
|
488
|
-
const n = /** @type {
|
|
660
|
+
const n = /** @type {number} */ (node);
|
|
489
661
|
if (n >= this._storeText.length) this._growStore(n + 1);
|
|
490
662
|
this._storeText[n] = text;
|
|
491
663
|
this._storeGen[n] = this._gen;
|
|
@@ -509,7 +681,7 @@ class PrintContext {
|
|
|
509
681
|
* @returns {string} its printed text
|
|
510
682
|
*/
|
|
511
683
|
get(node) {
|
|
512
|
-
const n = /** @type {
|
|
684
|
+
const n = /** @type {number} */ (node);
|
|
513
685
|
return /** @type {string} */ (
|
|
514
686
|
this._storeGen[n] === this._gen ? this._storeText[n] : undefined
|
|
515
687
|
);
|
|
@@ -524,14 +696,12 @@ class PrintContext {
|
|
|
524
696
|
_emit(text) {
|
|
525
697
|
this._tail += text;
|
|
526
698
|
this._tailLength += text.length;
|
|
527
|
-
// A printer returns
|
|
528
|
-
//
|
|
529
|
-
//
|
|
530
|
-
//
|
|
531
|
-
//
|
|
532
|
-
//
|
|
533
|
-
// the result would have paid for anyway, but paying it per piece means an
|
|
534
|
-
// allocation for each, and the pieces are small.
|
|
699
|
+
// WHY: A printer returns a rope of its children's pieces, and appending a
|
|
700
|
+
// rope onto a rope keeps every fragment reachable until the output is
|
|
701
|
+
// flattened — a second copy of a large stylesheet. Cutting the tail once it
|
|
702
|
+
// passes a block forces that block flat and drops the fragments behind it.
|
|
703
|
+
// Per block rather than per piece: the copy is one the result pays anyway,
|
|
704
|
+
// while per piece it would be an allocation each, and the pieces are small.
|
|
535
705
|
if (this._tailLength >= FLATTEN_BLOCK) this._cutTail();
|
|
536
706
|
}
|
|
537
707
|
|
|
@@ -578,6 +748,24 @@ class PrintContext {
|
|
|
578
748
|
if (mapping !== undefined) this._mappings[mapping][2] = -1;
|
|
579
749
|
}
|
|
580
750
|
|
|
751
|
+
/**
|
|
752
|
+
* Whether the output after a piece holds a character outside ASCII, the
|
|
753
|
+
* comments still waiting to be placed included.
|
|
754
|
+
* @param {number} index the piece's index, from {@link emitRetractable}
|
|
755
|
+
* @returns {boolean} true when it does
|
|
756
|
+
*/
|
|
757
|
+
writesNonAscii(index) {
|
|
758
|
+
const chunks = this._chunks;
|
|
759
|
+
for (let i = index + 1; i < chunks.length; i++) {
|
|
760
|
+
if (NON_ASCII_RE.test(chunks[i])) return true;
|
|
761
|
+
}
|
|
762
|
+
const inserts = this._inserts;
|
|
763
|
+
for (let i = this._insertIdx; i < inserts.length; i++) {
|
|
764
|
+
if (NON_ASCII_RE.test(inserts[i][1])) return true;
|
|
765
|
+
}
|
|
766
|
+
return NON_ASCII_RE.test(this._tail);
|
|
767
|
+
}
|
|
768
|
+
|
|
581
769
|
/**
|
|
582
770
|
* Fold `text` into an already-emitted piece, in front of the character it ends
|
|
583
771
|
* with — a later sibling whose body belongs inside that piece, as a repeated
|
|
@@ -925,29 +1113,38 @@ class PrintContext {
|
|
|
925
1113
|
* Visitor coordinator: owns the visitor registry and drives a language
|
|
926
1114
|
* `grammar` over the source. Language-agnostic — each syntax (CSS, HTML, …)
|
|
927
1115
|
* binds its own grammar, node-type enum and (optionally) node printer.
|
|
928
|
-
*
|
|
1116
|
+
* Usage:
|
|
929
1117
|
*
|
|
930
1118
|
* ```
|
|
931
1119
|
* processor.use({ [NodeType.X]: (path) => {}, [NodeType.Y]: { enter, exit } });
|
|
932
1120
|
* processor.process(source);
|
|
933
1121
|
* ```
|
|
934
|
-
* @template TPath
|
|
1122
|
+
* @template {NodePath<TNode>} TPath
|
|
935
1123
|
* @template TNode
|
|
936
1124
|
* @template [TProcessOptions=object]
|
|
937
1125
|
* @template [TPrintOptions=object]
|
|
1126
|
+
* @template {NodeParts} [TParts=AnyParts] the language's parts, which type each visitor's path by node type
|
|
1127
|
+
* @template [TState=unknown] what `process` hands every visitor as `path.state`
|
|
1128
|
+
* @template [TVisitors=VisitorMap<TPath>] the language's visitor map, each path typed by its key and with `TState`
|
|
938
1129
|
*/
|
|
939
1130
|
class SourceProcessor {
|
|
940
1131
|
/**
|
|
941
1132
|
* @param {Grammar<TPath, TNode, TProcessOptions, TPrintOptions>} grammar the grammar to drive over the source
|
|
942
1133
|
* @param {NodePrinter<TPath, TNode, TPrintOptions>=} printer the node printer, fired per node once its visitors and children are done; the same `path` a visitor gets plus the print context as its writer. Required to print (e.g. `mode`); a future API can let a developer supply their own
|
|
1134
|
+
* @param {(() => NodePrinter<TPath, TNode, TPrintOptions>)=} loadPrinter asked for the printer the first time something prints, for a language that keeps its printer in a module of its own — so a walk that never prints never loads it
|
|
1135
|
+
* @param {TPath=} path the path the grammar hands its visitors, whose `state` a run sets
|
|
943
1136
|
*/
|
|
944
|
-
constructor(grammar, printer) {
|
|
1137
|
+
constructor(grammar, printer, loadPrinter, path) {
|
|
945
1138
|
/** @type {Grammar<TPath, TNode, TProcessOptions, TPrintOptions>} */
|
|
946
1139
|
this._grammar = grammar;
|
|
947
1140
|
/** @type {CompiledVisitorMap<TPath>} */
|
|
948
1141
|
this._visitors = [];
|
|
949
1142
|
/** @type {NodePrinter<TPath, TNode, TPrintOptions> | undefined} */
|
|
950
1143
|
this._printer = printer;
|
|
1144
|
+
/** @type {(() => NodePrinter<TPath, TNode, TPrintOptions>) | undefined} */
|
|
1145
|
+
this._loadPrinter = loadPrinter;
|
|
1146
|
+
/** @type {TPath | undefined} */
|
|
1147
|
+
this._path = path;
|
|
951
1148
|
// Set for the one print {@link processDeferred} holds open, so `process`
|
|
952
1149
|
// hands it the context instead of building the output straight away.
|
|
953
1150
|
/** @type {((ctx: PrintContext<TPath, TNode, TPrintOptions>, build: () => { code: string, map: SourceMap | undefined }) => void) | null} */
|
|
@@ -955,32 +1152,92 @@ class SourceProcessor {
|
|
|
955
1152
|
}
|
|
956
1153
|
|
|
957
1154
|
/**
|
|
958
|
-
* Register
|
|
1155
|
+
* Register one bucket for several node types, as a map naming each would;
|
|
1156
|
+
* its path takes only the parts those types have.
|
|
1157
|
+
* @template {number} T
|
|
1158
|
+
* @overload
|
|
1159
|
+
* @param {T[]} types the node types the bucket visits
|
|
1160
|
+
* @param {VisitorBucket<TypedNodePath<TPath, TNode, TParts, T, TState>>} bucket the visitor
|
|
1161
|
+
* @returns {SourceProcessor<TPath, TNode, TProcessOptions, TPrintOptions, TParts, TState, TVisitors>} `this`, for chaining
|
|
1162
|
+
*/
|
|
1163
|
+
/**
|
|
1164
|
+
* Register a visitor map; calls accumulate per node type, and each
|
|
1165
|
+
* visitor's path takes only its type's parts.
|
|
959
1166
|
* A bucket is a function (= `{ enter }`) or `{ enter?, exit? }`.
|
|
1167
|
+
* @overload
|
|
1168
|
+
* @param {TVisitors} map visitor map keyed by node type
|
|
1169
|
+
* @returns {SourceProcessor<TPath, TNode, TProcessOptions, TPrintOptions, TParts, TState, TVisitors>} `this`, for chaining
|
|
1170
|
+
*/
|
|
1171
|
+
/**
|
|
1172
|
+
* Register a visitor map built at runtime, keyed by any node type.
|
|
1173
|
+
* @overload
|
|
960
1174
|
* @param {VisitorMap<TPath>} map visitor map keyed by node type
|
|
961
|
-
* @returns {SourceProcessor<TPath, TNode, TProcessOptions, TPrintOptions>} `this`, for chaining
|
|
1175
|
+
* @returns {SourceProcessor<TPath, TNode, TProcessOptions, TPrintOptions, TParts, TState, TVisitors>} `this`, for chaining
|
|
962
1176
|
*/
|
|
963
|
-
|
|
1177
|
+
/**
|
|
1178
|
+
* @param {EXPECTED_ANY} map visitor map, or the node types `bucket` visits
|
|
1179
|
+
* @param {VisitorBucket<EXPECTED_ANY>=} bucket the visitor, with an array of types
|
|
1180
|
+
* @returns {SourceProcessor<TPath, TNode, TProcessOptions, TPrintOptions, TParts, TState, TVisitors>} `this`, for chaining
|
|
1181
|
+
*/
|
|
1182
|
+
use(map, bucket) {
|
|
1183
|
+
if (Array.isArray(map)) {
|
|
1184
|
+
if (bucket === undefined) {
|
|
1185
|
+
throw new TypeError(
|
|
1186
|
+
"SourceProcessor.use(types, bucket): a visitor is required"
|
|
1187
|
+
);
|
|
1188
|
+
}
|
|
1189
|
+
for (let i = 0; i < map.length; i++) this._add(map[i], bucket);
|
|
1190
|
+
return this;
|
|
1191
|
+
}
|
|
964
1192
|
// `map`'s keys are node-type enum members; `Object.keys` stringifies them,
|
|
965
1193
|
// so index the compiled array by the number to match the numeric `node.type`.
|
|
966
1194
|
for (const type of Object.keys(map)) {
|
|
967
1195
|
const key = Number(type);
|
|
968
|
-
|
|
969
|
-
let bucket = this._visitors[key];
|
|
970
|
-
if (!bucket) {
|
|
971
|
-
bucket = { enter: [], exit: [] };
|
|
972
|
-
this._visitors[key] = bucket;
|
|
973
|
-
}
|
|
974
|
-
if (typeof v === "function") {
|
|
975
|
-
bucket.enter.push(v);
|
|
976
|
-
} else {
|
|
977
|
-
if (v.enter) bucket.enter.push(v.enter);
|
|
978
|
-
if (v.exit) bucket.exit.push(v.exit);
|
|
979
|
-
}
|
|
1196
|
+
this._add(key, map[key]);
|
|
980
1197
|
}
|
|
981
1198
|
return this;
|
|
982
1199
|
}
|
|
983
1200
|
|
|
1201
|
+
/**
|
|
1202
|
+
* @param {number} type node type
|
|
1203
|
+
* @param {VisitorBucket<TPath>} visitor its visitor
|
|
1204
|
+
*/
|
|
1205
|
+
_add(type, visitor) {
|
|
1206
|
+
let compiled = this._visitors[type];
|
|
1207
|
+
if (!compiled) {
|
|
1208
|
+
compiled = { enter: [], exit: [] };
|
|
1209
|
+
this._visitors[type] = compiled;
|
|
1210
|
+
}
|
|
1211
|
+
if (typeof visitor === "function") {
|
|
1212
|
+
compiled.enter.push(visitor);
|
|
1213
|
+
} else {
|
|
1214
|
+
if (visitor.enter) compiled.enter.push(visitor.enter);
|
|
1215
|
+
if (visitor.exit) compiled.exit.push(visitor.exit);
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
/**
|
|
1220
|
+
* Run the grammar with the path's `state` set to the run's, put back after so
|
|
1221
|
+
* a run nested in a visitor leaves its caller's.
|
|
1222
|
+
* @param {string} input the source
|
|
1223
|
+
* @param {PrintContext<TPath, TNode, TPrintOptions> | undefined} ctx the print context, when printing
|
|
1224
|
+
* @param {TProcessOptions} opts process options
|
|
1225
|
+
*/
|
|
1226
|
+
_run(input, ctx, opts) {
|
|
1227
|
+
const path = this._path;
|
|
1228
|
+
if (path === undefined) {
|
|
1229
|
+
this._grammar(input, this._visitors, ctx, opts);
|
|
1230
|
+
return;
|
|
1231
|
+
}
|
|
1232
|
+
const outer = path.state;
|
|
1233
|
+
path.state = /** @type {RunState<TState>} */ (opts).state;
|
|
1234
|
+
try {
|
|
1235
|
+
this._grammar(input, this._visitors, ctx, opts);
|
|
1236
|
+
} finally {
|
|
1237
|
+
path.state = outer;
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
|
|
984
1241
|
/**
|
|
985
1242
|
* Parse `input` once and fire the visitors in source order. Asking for output
|
|
986
1243
|
* — `mode`, the one thing that names it — makes the same walk print, given a
|
|
@@ -993,44 +1250,52 @@ class SourceProcessor {
|
|
|
993
1250
|
* never re-parses; all configuration is per-call.
|
|
994
1251
|
* @overload
|
|
995
1252
|
* @param {string} input the source
|
|
996
|
-
* @param {TProcessOptions & { mode: PrintOptions["mode"] } & { source: string, content?: string }} options process options, naming the input so a map is built
|
|
1253
|
+
* @param {TProcessOptions & RunState<TState> & { mode: PrintOptions["mode"] } & { source: string, content?: string }} options process options, naming the input so a map is built
|
|
997
1254
|
* @returns {{ code: string, map: SourceMap }} the output and its map
|
|
998
1255
|
*/
|
|
999
1256
|
/**
|
|
1000
1257
|
* @overload
|
|
1001
1258
|
* @param {string} input the source
|
|
1002
|
-
* @param {TProcessOptions & { mode: PrintOptions["mode"] }} options process options, asking for output but no map
|
|
1259
|
+
* @param {TProcessOptions & RunState<TState> & { mode: PrintOptions["mode"] }} options process options, asking for output but no map
|
|
1003
1260
|
* @returns {{ code: string, map: undefined }} the output alone
|
|
1004
1261
|
*/
|
|
1005
1262
|
/**
|
|
1006
1263
|
* @overload
|
|
1007
1264
|
* @param {string} input the source
|
|
1008
|
-
* @param {TProcessOptions=} options process options, asking for no output
|
|
1265
|
+
* @param {(TProcessOptions & RunState<TState>)=} options process options, asking for no output
|
|
1009
1266
|
* @returns {undefined} nothing — the walk alone
|
|
1010
1267
|
*/
|
|
1011
1268
|
/**
|
|
1012
1269
|
* @param {string} input source text
|
|
1013
|
-
* @param {TProcessOptions=} options grammar-specific options (`skip`, …) plus `mode
|
|
1014
|
-
* @returns {
|
|
1270
|
+
* @param {(TProcessOptions & RunState<TState>)=} options grammar-specific options (`skip`, …) plus `mode`, for the map `source` / `content`, and the visitors' `state`
|
|
1271
|
+
* @returns {{ code: string, map: SourceMap | undefined } | undefined} `{ code, map }` when printing, else `undefined` — see the overloads
|
|
1015
1272
|
*/
|
|
1016
1273
|
process(input, options) {
|
|
1017
1274
|
const opts = options || /** @type {TProcessOptions} */ ({});
|
|
1018
1275
|
const asked = /** @type {{ mode?: PrintOptions["mode"] }} */ (opts).mode;
|
|
1276
|
+
// Asked for once per `process` and never per node, which is what lets a
|
|
1277
|
+
// language hold its printer back until something actually prints.
|
|
1278
|
+
if (
|
|
1279
|
+
this._printer === undefined &&
|
|
1280
|
+
asked !== undefined &&
|
|
1281
|
+
this._loadPrinter
|
|
1282
|
+
) {
|
|
1283
|
+
this._printer = this._loadPrinter();
|
|
1284
|
+
}
|
|
1019
1285
|
if (this._printer === undefined || asked === undefined) {
|
|
1020
|
-
this.
|
|
1286
|
+
this._run(input, undefined, opts);
|
|
1021
1287
|
return undefined;
|
|
1022
1288
|
}
|
|
1023
|
-
// Handed over whole rather than copied entry by entry: which
|
|
1024
|
-
// print options is the language's to say, and
|
|
1025
|
-
//
|
|
1026
|
-
// along is inert — a printer reads only what its own type declares.
|
|
1289
|
+
// Handed over whole rather than copied entry by entry: which entries are
|
|
1290
|
+
// print options is the language's to say, and a grammar-only one riding
|
|
1291
|
+
// along is inert, since a printer reads only what its own type declares.
|
|
1027
1292
|
const ctx = new PrintContext(
|
|
1028
1293
|
/** @type {PrintOptions & TPrintOptions} */ (
|
|
1029
|
-
/** @type {unknown} */ (
|
|
1294
|
+
/** @type {unknown} */ (opts)
|
|
1030
1295
|
),
|
|
1031
1296
|
/** @type {NodePrinter<TPath, TNode, TPrintOptions>} */ (this._printer)
|
|
1032
1297
|
);
|
|
1033
|
-
this.
|
|
1298
|
+
this._run(input, ctx, opts);
|
|
1034
1299
|
const name = /** @type {{ source?: string, content?: string }} */ (opts);
|
|
1035
1300
|
const build = () => {
|
|
1036
1301
|
const code = ctx.result();
|
|
@@ -1068,7 +1333,7 @@ class SourceProcessor {
|
|
|
1068
1333
|
* This is the shape `process` itself takes once it is async: how the answers
|
|
1069
1334
|
* are waited for is this method's business, so nothing above it changes.
|
|
1070
1335
|
* @param {string} input the source
|
|
1071
|
-
* @param {Omit<TProcessOptions, "renderEmbeddedSource"> & { mode: PrintOptions["mode"] } & { source?: string, content?: string, renderEmbeddedSource?: (source: string, hole:
|
|
1336
|
+
* @param {Omit<TProcessOptions, "renderEmbeddedSource"> & RunState<TState> & { mode: PrintOptions["mode"] } & { source?: string, content?: string, renderEmbeddedSource?: (source: string, hole: DeferredEmbeddedSource) => Promise<string | undefined> | string | undefined }} options process options; a print, so `mode` names which one, and naming the input builds a map. `renderEmbeddedSource` is the grammar's own option with a wider answer — it may answer asynchronously, and is handed each {@link DeferredWrite} whole. Absent, this is `process` with a promise around it
|
|
1072
1337
|
* @returns {Promise<{ code: string, map: SourceMap | undefined }>} the output and its map
|
|
1073
1338
|
*/
|
|
1074
1339
|
async processAsync(input, options) {
|
|
@@ -1086,7 +1351,7 @@ class SourceProcessor {
|
|
|
1086
1351
|
);
|
|
1087
1352
|
}
|
|
1088
1353
|
|
|
1089
|
-
/** @type {
|
|
1354
|
+
/** @type {DeferredEmbeddedSource[]} */
|
|
1090
1355
|
const deferred = [];
|
|
1091
1356
|
const { finish } = this._processDeferred(input, {
|
|
1092
1357
|
...opts,
|
|
@@ -1101,10 +1366,43 @@ class SourceProcessor {
|
|
|
1101
1366
|
deferred.map((hole) => render(hole.source, hole))
|
|
1102
1367
|
);
|
|
1103
1368
|
|
|
1104
|
-
|
|
1105
|
-
|
|
1369
|
+
if (
|
|
1370
|
+
!deferred.some(
|
|
1371
|
+
(hole, id) => hole.decides !== undefined && hole.decides(answers[id])
|
|
1372
|
+
)
|
|
1373
|
+
) {
|
|
1374
|
+
return finish((id) => {
|
|
1375
|
+
const hole = deferred[id];
|
|
1376
|
+
|
|
1377
|
+
return hole === undefined ? undefined : hole.build(answers[id]);
|
|
1378
|
+
});
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
// An answer overturned a choice the print made on the source, so it runs
|
|
1382
|
+
// again with every answer in hand. Nothing is asked twice: this print offers
|
|
1383
|
+
// a subset of the first's, and an offer it alone made is left as written.
|
|
1384
|
+
/** @type {Map<string, string | undefined>} */
|
|
1385
|
+
const known = new Map();
|
|
1386
|
+
for (let id = 0; id < deferred.length; id++) {
|
|
1387
|
+
known.set(deferredKey(deferred[id]), answers[id]);
|
|
1388
|
+
}
|
|
1389
|
+
/**
|
|
1390
|
+
* @param {Omit<DeferredWrite, "build">} offer an offer, `build` and all or without it
|
|
1391
|
+
* @returns {string | undefined} what the first print was answered for it
|
|
1392
|
+
*/
|
|
1393
|
+
const embeddedAnswers = (offer) => known.get(deferredKey(offer));
|
|
1394
|
+
/** @type {DeferredWrite[]} */
|
|
1395
|
+
const again = [];
|
|
1396
|
+
const reprint = this._processDeferred(input, {
|
|
1397
|
+
...opts,
|
|
1398
|
+
renderEmbeddedSource: undefined,
|
|
1399
|
+
deferEmbeddedSource: again,
|
|
1400
|
+
embeddedAnswers
|
|
1401
|
+
});
|
|
1402
|
+
return reprint.finish((id) => {
|
|
1403
|
+
const hole = again[id];
|
|
1106
1404
|
|
|
1107
|
-
return hole === undefined ? undefined : hole.build(
|
|
1405
|
+
return hole === undefined ? undefined : hole.build(embeddedAnswers(hole));
|
|
1108
1406
|
});
|
|
1109
1407
|
}
|
|
1110
1408
|
|
|
@@ -1115,7 +1413,7 @@ class SourceProcessor {
|
|
|
1115
1413
|
* {@link processAsync} is built on, and private for that reason: a caller
|
|
1116
1414
|
* asks for an asynchronous print, not for the way one is arranged.
|
|
1117
1415
|
* @param {string} input the source
|
|
1118
|
-
* @param {TProcessOptions & { mode: PrintOptions["mode"] } & { source?: string, content?: string }} options process options; a print, so `mode` names which one, and naming the input builds a map
|
|
1416
|
+
* @param {TProcessOptions & RunState<TState> & { mode: PrintOptions["mode"] } & { source?: string, content?: string }} options process options; a print, so `mode` names which one, and naming the input builds a map
|
|
1119
1417
|
* @returns {{ finish: (resolve: (id: number) => string | undefined) => { code: string, map: SourceMap | undefined } }} the deferred print
|
|
1120
1418
|
*/
|
|
1121
1419
|
_processDeferred(input, options) {
|