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
package/lib/html/HtmlParser.js
CHANGED
|
@@ -4,21 +4,22 @@
|
|
|
4
4
|
|
|
5
5
|
"use strict";
|
|
6
6
|
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
|
|
10
|
-
const HtmlInlineHtmlDependency = require("../dependencies/HtmlInlineHtmlDependency");
|
|
11
|
-
const HtmlInlineScriptDependency = require("../dependencies/HtmlInlineScriptDependency");
|
|
12
|
-
const HtmlInlineStyleDependency = require("../dependencies/HtmlInlineStyleDependency");
|
|
13
|
-
const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
|
|
14
|
-
const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
|
|
7
|
+
const ConstDependency = require("../dependencies/core/ConstDependency");
|
|
8
|
+
const StaticExportsDependency = require("../dependencies/core/StaticExportsDependency");
|
|
9
|
+
const HtmlEntryDependency = require("../dependencies/html/HtmlEntryDependency");
|
|
10
|
+
const HtmlInlineHtmlDependency = require("../dependencies/html/HtmlInlineHtmlDependency");
|
|
11
|
+
const HtmlInlineScriptDependency = require("../dependencies/html/HtmlInlineScriptDependency");
|
|
12
|
+
const HtmlInlineStyleDependency = require("../dependencies/html/HtmlInlineStyleDependency");
|
|
13
|
+
const HtmlSourceDependency = require("../dependencies/html/HtmlSourceDependency");
|
|
15
14
|
const WebpackError = require("../errors/WebpackError");
|
|
15
|
+
const Parser = require("../module/Parser");
|
|
16
16
|
const ResourceHintPlugin = require("../prefetch/ResourceHintPlugin");
|
|
17
17
|
const parseResourceHintOptions = require("../prefetch/parseResourceHintOptions");
|
|
18
|
+
const ModuleInfoHeaderPlugin = require("../template/ModuleInfoHeaderPlugin");
|
|
18
19
|
const LazySet = require("../util/LazySet");
|
|
19
20
|
const LocConverter = require("../util/LocConverter");
|
|
20
21
|
const createHash = require("../util/createHash");
|
|
21
|
-
const { contextify } = require("../util/identifier");
|
|
22
|
+
const { contextify, getRequestBaseName } = require("../util/identifier");
|
|
22
23
|
const {
|
|
23
24
|
createMagicCommentContext,
|
|
24
25
|
parseMagicComment,
|
|
@@ -26,12 +27,13 @@ const {
|
|
|
26
27
|
} = require("../util/magicComment");
|
|
27
28
|
const memoize = require("../util/memoize");
|
|
28
29
|
const { JAVASCRIPT_SCRIPT_TYPES } = require("./data");
|
|
30
|
+
const { SVG_TAG_ADJUST } = require("./data");
|
|
31
|
+
const { SourceProcessor } = require("./syntax");
|
|
29
32
|
const {
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
Field,
|
|
34
|
+
Flag,
|
|
32
35
|
NodeType,
|
|
33
|
-
|
|
34
|
-
SourceProcessor,
|
|
36
|
+
Part,
|
|
35
37
|
baseTag,
|
|
36
38
|
buildHeadTags,
|
|
37
39
|
decodeEntities,
|
|
@@ -43,7 +45,7 @@ const {
|
|
|
43
45
|
parseMsapplicationTask,
|
|
44
46
|
parseSrc,
|
|
45
47
|
parseSrcset
|
|
46
|
-
} = require("./syntax");
|
|
48
|
+
} = require("./syntax-parser");
|
|
47
49
|
|
|
48
50
|
const getUnsupportedFeatureWarning = memoize(() =>
|
|
49
51
|
require("../errors/UnsupportedFeatureWarning")
|
|
@@ -59,10 +61,10 @@ const getCommentCompilationWarning = memoize(() =>
|
|
|
59
61
|
|
|
60
62
|
/** @import { HtmlParserOptions } from "../../declarations/WebpackOptions" */
|
|
61
63
|
/** @import { Range } from "../javascript/JavascriptParser" */
|
|
62
|
-
/** @import Module, { BuildInfo, BuildMeta } from "../Module" */
|
|
64
|
+
/** @import Module, { BuildInfo, BuildMeta } from "../module/Module" */
|
|
63
65
|
/** @import { FileSystemDependencies } from "../Compilation" */
|
|
64
|
-
/** @import NormalModule from "../NormalModule" */
|
|
65
|
-
/** @import { ParserState, PreparsedAst } from "../Parser" */
|
|
66
|
+
/** @import NormalModule from "../module/NormalModule" */
|
|
67
|
+
/** @import { ParserState, PreparsedAst } from "../module/Parser" */
|
|
66
68
|
/** @import { HtmlModuleBuildInfo } from "./HtmlModule" */
|
|
67
69
|
|
|
68
70
|
/**
|
|
@@ -78,7 +80,8 @@ const getCommentCompilationWarning = memoize(() =>
|
|
|
78
80
|
*/
|
|
79
81
|
/** @typedef {(source: string, context: HtmlTemplateContext) => string} HtmlTemplateFunction */
|
|
80
82
|
|
|
81
|
-
/** @import { ParsedSource } from "./syntax" */
|
|
83
|
+
/** @import { ParsedSource } from "./syntax-parser" */
|
|
84
|
+
/** @import { MagicCommentOptions } from "../util/magicComment" */
|
|
82
85
|
|
|
83
86
|
// Cheap pre-filter for a `style="..."` attribute: only route it through the
|
|
84
87
|
// CSS pipeline when it can hold a URL-bearing function (`url()` / `src()` /
|
|
@@ -90,10 +93,9 @@ const STYLE_ATTR_URL_REGEXP = /url\(|src\(|image\(|image-set\(/i;
|
|
|
90
93
|
// hold a `url(...)` FuncIRI. Most are plain colors/keywords (`#fff`, `red`).
|
|
91
94
|
const FUNC_IRI_URL_REGEXP = /url\(/i;
|
|
92
95
|
|
|
93
|
-
// Cheap pre-filter for `<iframe srcdoc
|
|
94
|
-
//
|
|
95
|
-
// `
|
|
96
|
-
// formatting/text markup (`<p>hi</p>`) rewrites to itself, so skip it.
|
|
96
|
+
// Cheap pre-filter for `<iframe srcdoc>`: a nested HTML module is only worth
|
|
97
|
+
// building when the markup can reference an asset — any attribute, a CSS
|
|
98
|
+
// `url(...)` or an `@import`. Pure text markup rewrites to itself.
|
|
97
99
|
const SRCDOC_ASSET_REGEXP = /[=]|url\(|@import/i;
|
|
98
100
|
|
|
99
101
|
// A URL carrying its own scheme (`https:`, `data:`, …) ignores the document
|
|
@@ -106,6 +108,12 @@ const CHARSET_DECLARATION_REGEXP = /charset\s*=/i;
|
|
|
106
108
|
// CSP/fetch attributes copied verbatim onto a synthesized sibling `<link>` /
|
|
107
109
|
// `<script>` (`HtmlEntryDependency`). Fixed output order, independent of
|
|
108
110
|
// source order.
|
|
111
|
+
/**
|
|
112
|
+
* @param {import("./syntax-parser").HtmlPath} path walk path at an element
|
|
113
|
+
* @returns {boolean} whether the element is in the HTML namespace
|
|
114
|
+
*/
|
|
115
|
+
const isHtmlElement = (path) => !path.flag(Flag.svg) && !path.flag(Flag.mathml);
|
|
116
|
+
|
|
109
117
|
const COPYABLE_SIBLING_ATTRS = ["nonce", "crossorigin", "referrerpolicy"];
|
|
110
118
|
|
|
111
119
|
const CC_QUOTATION = '"'.charCodeAt(0);
|
|
@@ -116,54 +124,135 @@ const CC_SLASH = "/".charCodeAt(0);
|
|
|
116
124
|
* Byte-exact source span of an attribute including the single leading
|
|
117
125
|
* whitespace (` name`, ` name=value`, ` name="value"`), mirroring the
|
|
118
126
|
* tokenizer's end-of-attribute rule (`valueEnd + 1` past the closing quote).
|
|
119
|
-
* @param {import("./syntax").HtmlPath} path walk path (used only for attribute-ref reads)
|
|
127
|
+
* @param {import("./syntax-parser").HtmlPath} path walk path (used only for attribute-ref reads)
|
|
120
128
|
* @param {string} source HTML source
|
|
121
|
-
* @param {import("./syntax").HtmlAttributeRef} attr attribute ref
|
|
129
|
+
* @param {import("./syntax-parser").HtmlAttributeRef} attr attribute ref
|
|
122
130
|
* @returns {string} the attribute's source slice
|
|
123
131
|
*/
|
|
124
132
|
const attrSourceSpan = (path, source, attr) => {
|
|
125
|
-
const valueStart = path.
|
|
126
|
-
const valueEnd = path.
|
|
133
|
+
const valueStart = path.startOf(Part.value, attr);
|
|
134
|
+
const valueEnd = path.endOf(Part.value, attr);
|
|
127
135
|
const end =
|
|
128
136
|
valueStart === -1
|
|
129
|
-
? path.
|
|
137
|
+
? path.endOf(Part.name, attr)
|
|
130
138
|
: source.charCodeAt(valueStart - 1) === CC_QUOTATION ||
|
|
131
139
|
source.charCodeAt(valueStart - 1) === CC_APOSTROPHE
|
|
132
140
|
? valueEnd + 1
|
|
133
141
|
: valueEnd;
|
|
134
|
-
return source.slice(path.
|
|
142
|
+
return source.slice(path.startOf(Part.name, attr) - 1, end);
|
|
135
143
|
};
|
|
136
144
|
|
|
137
145
|
/**
|
|
138
146
|
* Source span of a tag's `integrity` attribute (offsets relative to
|
|
139
147
|
* `elementStart`, leading whitespace and quotes included), so the template can
|
|
140
148
|
* drop the content-specific author value without re-parsing. Null when absent.
|
|
141
|
-
* @param {import("./syntax").HtmlPath} path walk path (for attribute reads)
|
|
149
|
+
* @param {import("./syntax-parser").HtmlPath} path walk path (for attribute reads)
|
|
142
150
|
* @param {string} source HTML source
|
|
143
151
|
* @param {number} elementStart offset of the tag's opening `<`
|
|
144
152
|
* @returns {Range | null} the span, or null when there is no `integrity`
|
|
145
153
|
*/
|
|
146
154
|
const captureIntegrityRange = (path, source, elementStart) => {
|
|
147
|
-
const integrityAttr = path.
|
|
148
|
-
if (integrityAttr === 0 || path.
|
|
155
|
+
const integrityAttr = path.fieldNamed(Field.attributes, "integrity");
|
|
156
|
+
if (integrityAttr === 0 || path.startOf(Part.name, integrityAttr) < 0) {
|
|
149
157
|
return null;
|
|
150
158
|
}
|
|
151
|
-
let rs = path.
|
|
159
|
+
let rs = path.startOf(Part.name, integrityAttr);
|
|
152
160
|
while (rs > 0 && isAsciiWhitespace(source.charCodeAt(rs - 1))) {
|
|
153
161
|
rs--;
|
|
154
162
|
}
|
|
155
163
|
let re;
|
|
156
|
-
const ivs = path.
|
|
164
|
+
const ivs = path.startOf(Part.value, integrityAttr);
|
|
157
165
|
if (ivs === -1) {
|
|
158
|
-
re = path.
|
|
166
|
+
re = path.endOf(Part.name, integrityAttr);
|
|
159
167
|
} else {
|
|
160
168
|
const q = source.charCodeAt(ivs - 1);
|
|
161
|
-
const ive = path.
|
|
169
|
+
const ive = path.endOf(Part.value, integrityAttr);
|
|
162
170
|
re = q === CC_QUOTATION || q === CC_APOSTROPHE ? ive + 1 : ive;
|
|
163
171
|
}
|
|
164
172
|
return [rs - elementStart, re - elementStart];
|
|
165
173
|
};
|
|
166
174
|
|
|
175
|
+
/**
|
|
176
|
+
* Whether a span holds nothing a script body could have read — whitespace and
|
|
177
|
+
* comments only. Scanned rather than matched: the pattern for it backtracks.
|
|
178
|
+
* @param {string} source HTML source
|
|
179
|
+
* @param {number} start offset the span starts at
|
|
180
|
+
* @param {number} end offset the span ends at
|
|
181
|
+
* @returns {boolean} true when no node of the span reaches the DOM
|
|
182
|
+
*/
|
|
183
|
+
const isEmptyRunGap = (source, start, end) => {
|
|
184
|
+
let offset = start;
|
|
185
|
+
while (offset < end) {
|
|
186
|
+
if (isAsciiWhitespace(source.charCodeAt(offset))) {
|
|
187
|
+
offset++;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (!source.startsWith("<!--", offset)) return false;
|
|
191
|
+
const close = source.indexOf("-->", offset + 4);
|
|
192
|
+
if (close === -1 || close + 3 > end) return false;
|
|
193
|
+
offset = close + 3;
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// What an entry name keeps from a page's path. The mapping is reversible, so
|
|
199
|
+
// two pages of one compilation can never sanitize to the same name.
|
|
200
|
+
const ENTRY_NAME_KEPT_REGEXP = /[^\w.]/g;
|
|
201
|
+
const ENTRY_NAME_EXTENSION_REGEXP = /\.[^./\\]*$/;
|
|
202
|
+
const ENTRY_NAME_TRIM_REGEXP = /^[-.]+|[-.]+$/g;
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Names the entries a page's tags are extracted under, after the page itself.
|
|
206
|
+
* A `data:` document has no path to be named after, so it keeps a digest of
|
|
207
|
+
* the one thing that tells it from another such document.
|
|
208
|
+
* @param {string} pagePath the page's path, relative to the compiler context
|
|
209
|
+
* @param {import("../util/Hash").HashFunction | undefined} hashFunction `output.hashFunction`
|
|
210
|
+
* @returns {string} the prefix every entry name of this page starts with
|
|
211
|
+
*/
|
|
212
|
+
const entryNamePrefix = (pagePath, hashFunction) => {
|
|
213
|
+
if (pagePath.startsWith("data:")) {
|
|
214
|
+
const digest = createHash(hashFunction || "md4")
|
|
215
|
+
.update(pagePath)
|
|
216
|
+
.digest("hex")
|
|
217
|
+
.slice(0, 8);
|
|
218
|
+
return `data-${digest}`;
|
|
219
|
+
}
|
|
220
|
+
return pagePath
|
|
221
|
+
.replace(ENTRY_NAME_EXTENSION_REGEXP, "")
|
|
222
|
+
.replace(ENTRY_NAME_KEPT_REGEXP, (character) => {
|
|
223
|
+
if (character === "-") return "--";
|
|
224
|
+
if (character === "/" || character === "\\") return "-";
|
|
225
|
+
return `_${character.charCodeAt(0).toString(16)}_`;
|
|
226
|
+
})
|
|
227
|
+
.replace(ENTRY_NAME_TRIM_REGEXP, "");
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* @typedef {object} HtmlChunkNameData
|
|
232
|
+
* @property {string} page the page's path, escaped for use in a name
|
|
233
|
+
* @property {string} name the tag's own basename, empty for an inline body
|
|
234
|
+
* @property {number} index the tag's position in the page, across all kinds
|
|
235
|
+
* @property {"script" | "script-module" | "modulepreload" | "stylesheet" | "html" | "preload" | "prefetch"} type what the tag is extracted as
|
|
236
|
+
*/
|
|
237
|
+
|
|
238
|
+
/** @typedef {(data: HtmlChunkNameData) => string} HtmlChunkNameFn */
|
|
239
|
+
|
|
240
|
+
const CHUNK_NAME_PLACEHOLDER_REGEXP = /\[(page|name|index|type)\]/g;
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* End offset of a raw-text element, its closing tag included. `contentEnd`
|
|
244
|
+
* sits at the `</` that ended the body, and at the body's end without one.
|
|
245
|
+
* @param {string} source HTML source
|
|
246
|
+
* @param {number} contentEnd end offset of the element's raw text
|
|
247
|
+
* @returns {number} offset just past the element
|
|
248
|
+
*/
|
|
249
|
+
const rawTextElementEnd = (source, contentEnd) => {
|
|
250
|
+
const close = source.startsWith("</", contentEnd)
|
|
251
|
+
? source.indexOf(">", contentEnd)
|
|
252
|
+
: -1;
|
|
253
|
+
return close === -1 ? contentEnd : close + 1;
|
|
254
|
+
};
|
|
255
|
+
|
|
167
256
|
/**
|
|
168
257
|
* @param {Map<string, string>} attributes attributes
|
|
169
258
|
* @param {string} name name
|
|
@@ -349,8 +438,8 @@ const isLinkStylesheet = (attributes) => {
|
|
|
349
438
|
/** @typedef {SourceType | ((attrs: Map<string, string>, css: boolean) => SourceType)} SourceTypeOrResolver */
|
|
350
439
|
/** @typedef {(attributes: Map<string, string>, value: string) => boolean} SourceFilter */
|
|
351
440
|
/** @typedef {{ tag?: string, attribute: string, type: SourceType, filter?: SourceFilter }} SourceEntry */
|
|
352
|
-
/** A `type` plus optional gates: `filter` (the decoded attribute map + the decoded value; return false to skip — covers both cross-attribute checks and cheap value checks) and `namespace` (restrict to an element namespace, e.g. SVG). */
|
|
353
|
-
/** @typedef {{ type: SourceTypeOrResolver, filter?: SourceFilter, namespace?:
|
|
441
|
+
/** A `type` plus optional gates: `filter` (the decoded attribute map + the decoded value; return false to skip — covers both cross-attribute checks and cheap value checks) and `namespace` (restrict to an element namespace, by its `Flag`, e.g. SVG). */
|
|
442
|
+
/** @typedef {{ type: SourceTypeOrResolver, filter?: SourceFilter, namespace?: typeof Flag.svg | typeof Flag.mathml }} SourceItem */
|
|
354
443
|
/** A tag→attribute lookup; a `undefined` value marks a built-in source disabled via `sources` (`type: false`). */
|
|
355
444
|
/** @typedef {Record<string, SourceItem | undefined>} SourceBucket */
|
|
356
445
|
/** @typedef {Record<string, SourceBucket>} SourceTable */
|
|
@@ -365,15 +454,15 @@ const isLinkStylesheet = (attributes) => {
|
|
|
365
454
|
* `constructor`, or `toString` resolve to inherited values at lookup
|
|
366
455
|
* time — producing bogus dependencies and letting `sources: false` be
|
|
367
456
|
* bypassed.
|
|
368
|
-
* @
|
|
369
|
-
* @
|
|
457
|
+
* @template T
|
|
458
|
+
* @param {...(Record<string, T> | undefined)} bags property bags
|
|
459
|
+
* @returns {Record<string, T>} null-prototype dictionary
|
|
370
460
|
*/
|
|
371
461
|
const dict = (...bags) => Object.assign(Object.create(null), ...bags);
|
|
372
462
|
|
|
373
|
-
//
|
|
374
|
-
//
|
|
375
|
-
//
|
|
376
|
-
// `parseSrcset` parser for it and otherwise treats it like `src`.
|
|
463
|
+
// One shared `SourceItem` per kind, so the walk's lookups stay on a single V8
|
|
464
|
+
// hidden class. `srcset` is its own type: the walk picks `parseSrcset` for it
|
|
465
|
+
// and otherwise treats it like `src`.
|
|
377
466
|
/** @type {SourceItem} */
|
|
378
467
|
const PLAIN_SRC = { type: "src", filter: undefined };
|
|
379
468
|
/** @type {SourceItem} */
|
|
@@ -389,10 +478,9 @@ const LINK_HREF = {
|
|
|
389
478
|
type: (attrs, css) => {
|
|
390
479
|
if (isLinkModulePreload(attrs)) return "modulepreload";
|
|
391
480
|
if (css && isLinkStylesheet(attrs)) return "stylesheet";
|
|
392
|
-
// `rel="preload"/"prefetch"` with `as="script"`
|
|
393
|
-
// `experiments.css`
|
|
394
|
-
//
|
|
395
|
-
// font, fetch, …) stay plain asset URLs.
|
|
481
|
+
// `rel="preload"/"prefetch"` with `as="script"` — or `as="style"` under
|
|
482
|
+
// `experiments.css` — becomes a non-executing entry pointing at the built
|
|
483
|
+
// chunk; every other `as` target stays a plain asset URL.
|
|
396
484
|
const rel = getAttributeValue(attrs, "rel");
|
|
397
485
|
if (rel) {
|
|
398
486
|
const rels = rel.trim().toLowerCase().split(/\s+/);
|
|
@@ -446,11 +534,9 @@ const META_CONTENT = {
|
|
|
446
534
|
filter: filterMetaContent
|
|
447
535
|
};
|
|
448
536
|
|
|
449
|
-
//
|
|
450
|
-
//
|
|
451
|
-
//
|
|
452
|
-
// the default `sources` config just references this table and pays
|
|
453
|
-
// zero per-parser work.
|
|
537
|
+
// Written in its final resolved shape, `[tag][attribute] = item`, rather than
|
|
538
|
+
// built from an array at module load: a parser on the default `sources` config
|
|
539
|
+
// references this table and pays nothing per instance.
|
|
454
540
|
/** @type {Record<string, Record<string, SourceItem>>} */
|
|
455
541
|
const DEFAULT_SOURCES_BY_TAG = dict({
|
|
456
542
|
// Obsolete Java-applet element; `code`/`object` are single class/object URLs.
|
|
@@ -489,13 +575,14 @@ const DEFAULT_SOURCES_BY_TAG = dict({
|
|
|
489
575
|
th: dict({ background: PLAIN_SRC }),
|
|
490
576
|
track: dict({ src: PLAIN_SRC }),
|
|
491
577
|
video: dict({ poster: PLAIN_SRC, src: PLAIN_SRC }),
|
|
492
|
-
// SVG. Tag names match the tree builder's adjusted camelCase
|
|
493
|
-
// (`feImage`/`textPath`/`linearGradient`/`radialGradient`). `href
|
|
494
|
-
// `xlink:href` reference another element
|
|
495
|
-
//
|
|
496
|
-
// `color-profile`'s `xlink:href` points at an external ICC profile
|
|
497
|
-
// `cursor
|
|
498
|
-
// `glyphRef
|
|
578
|
+
// WHY: SVG. Tag names match the tree builder's adjusted camelCase
|
|
579
|
+
// (`feImage`/`textPath`/`linearGradient`/`radialGradient`). `href` and
|
|
580
|
+
// `xlink:href` reference another element or resource, and a fragment-only
|
|
581
|
+
// `#id` value is left untouched, so only an external `file.svg#id` is
|
|
582
|
+
// rewritten. `color-profile`'s `xlink:href` points at an external ICC profile
|
|
583
|
+
// file; `cursor` and `font-face-uri` at an external image or font file; and
|
|
584
|
+
// `altGlyph`, `glyphRef` and `tref` are legacy element references, removed in
|
|
585
|
+
// SVG 2.
|
|
499
586
|
altGlyph: dict({ "xlink:href": PLAIN_SRC, href: PLAIN_SRC }),
|
|
500
587
|
"color-profile": dict({ "xlink:href": PLAIN_SRC, href: PLAIN_SRC }),
|
|
501
588
|
cursor: dict({ "xlink:href": PLAIN_SRC, href: PLAIN_SRC }),
|
|
@@ -515,33 +602,30 @@ const DEFAULT_SOURCES_BY_TAG = dict({
|
|
|
515
602
|
// clip-path, …) are handled separately during the walk (`parseCssUrls`).
|
|
516
603
|
});
|
|
517
604
|
|
|
518
|
-
// SVG presentation attributes (`fill`, `stroke`, …) carry CSS `url(...)`
|
|
519
|
-
// FuncIRIs
|
|
520
|
-
// `url(#id)`
|
|
521
|
-
// the item is `namespace`-gated rather than placed in a tag bucket
|
|
522
|
-
// is a cheap pre-check skipping the common plain values (`red`, `none
|
|
605
|
+
// WHY: SVG presentation attributes (`fill`, `stroke`, …) carry CSS `url(...)`
|
|
606
|
+
// FuncIRIs, whose external refs `parseCssUrls` extracts as assets, leaving an
|
|
607
|
+
// internal `url(#id)` untouched. They apply to every SVG-namespace element, so
|
|
608
|
+
// the item is `namespace`-gated rather than placed in a tag bucket, and the
|
|
609
|
+
// filter is a cheap pre-check skipping the common plain values (`red`, `none`).
|
|
523
610
|
/** @type {SourceItem} */
|
|
524
611
|
const SVG_CSS_URL = {
|
|
525
612
|
type: "css-url",
|
|
526
613
|
filter: (attributes, value) => FUNC_IRI_URL_REGEXP.test(value),
|
|
527
|
-
namespace:
|
|
614
|
+
namespace: Flag.svg
|
|
528
615
|
};
|
|
529
616
|
|
|
530
|
-
// The global `style=""` attribute
|
|
531
|
-
//
|
|
532
|
-
//
|
|
533
|
-
// created); the filter is a cheap pre-check skipping declarations without a
|
|
534
|
-
// `url()`/`src()`/… .
|
|
617
|
+
// The global `style=""` attribute, available on every tag and even under
|
|
618
|
+
// `sources: false`. Like every `stylesheet-style*` source it only emits when
|
|
619
|
+
// `experiments.css` is on, checked where the dependency is created.
|
|
535
620
|
/** @type {SourceItem} */
|
|
536
621
|
const STYLE_ATTRIBUTE = {
|
|
537
622
|
type: "stylesheet-style-attribute",
|
|
538
623
|
filter: (attributes, value) => STYLE_ATTR_URL_REGEXP.test(value)
|
|
539
624
|
};
|
|
540
625
|
|
|
541
|
-
// Any-tag sources
|
|
542
|
-
//
|
|
543
|
-
//
|
|
544
|
-
// unless `sources: false`; only the always-on style attribute survives `false`.
|
|
626
|
+
// Any-tag sources, folded into each tag bucket so the walk resolves one object
|
|
627
|
+
// per element and one property per attribute. `sources: false` leaves only the
|
|
628
|
+
// always-on style attribute.
|
|
545
629
|
/** @type {Record<string, SourceItem>} */
|
|
546
630
|
const DEFAULT_ANY_SOURCES = dict({ style: STYLE_ATTRIBUTE });
|
|
547
631
|
for (const name of [
|
|
@@ -625,10 +709,9 @@ const styleContentFilter = (attrs) => {
|
|
|
625
709
|
return t === "" || t === "text/css";
|
|
626
710
|
};
|
|
627
711
|
|
|
628
|
-
// Element-body sources, independent of the `sources` option
|
|
629
|
-
//
|
|
630
|
-
//
|
|
631
|
-
// created, like every `stylesheet-style*` source).
|
|
712
|
+
// Element-body sources, independent of the `sources` option: a `<script>` body
|
|
713
|
+
// is always processed, while a `<style>` body only emits when `experiments.css`
|
|
714
|
+
// is on, checked where the dependency is created.
|
|
632
715
|
/** @type {Record<string, ContentSourceItem>} */
|
|
633
716
|
const CONTENT_SOURCES = dict({
|
|
634
717
|
script: { type: scriptContentType, filter: scriptContentFilter },
|
|
@@ -649,11 +732,11 @@ class HtmlParser extends Parser {
|
|
|
649
732
|
this.template = options.template;
|
|
650
733
|
/** @type {import("../../declarations/WebpackOptions").UrlHintRule[] | undefined} */
|
|
651
734
|
this._urlHints = options.urlHints;
|
|
652
|
-
// `as` selects the parse mode
|
|
653
|
-
//
|
|
654
|
-
//
|
|
655
|
-
|
|
656
|
-
|
|
735
|
+
// `as` selects the parse mode: `"document"` parses a full page, any other
|
|
736
|
+
// value names the context element whose inner HTML this is, so that a
|
|
737
|
+
// partial's `<tr>`, `<td>` or `<option>` is kept rather than dropped.
|
|
738
|
+
/** @type {string | HtmlChunkNameFn | undefined} */
|
|
739
|
+
this._chunkName = options.chunkName;
|
|
657
740
|
/** @type {string | undefined} */
|
|
658
741
|
this.fragmentContext =
|
|
659
742
|
options.as === undefined || options.as === "document"
|
|
@@ -673,13 +756,9 @@ class HtmlParser extends Parser {
|
|
|
673
756
|
return;
|
|
674
757
|
}
|
|
675
758
|
|
|
676
|
-
//
|
|
677
|
-
//
|
|
678
|
-
//
|
|
679
|
-
// `{ attribute: "data-style", type: "stylesheet-style-attribute" }`).
|
|
680
|
-
// User entries override regardless of position. `dict()` keeps every
|
|
681
|
-
// table null-prototype (see its doc), and per-tag writes rebuild the
|
|
682
|
-
// bucket so the aliased default buckets stay intact.
|
|
759
|
+
// `"..."` anywhere opts the per-tag defaults in as the base, and a user
|
|
760
|
+
// entry with no `tag` is an any-tag source; user entries override wherever
|
|
761
|
+
// they sit. Per-tag writes rebuild the bucket, so the defaults stay intact.
|
|
683
762
|
/** @type {SourceTable} */
|
|
684
763
|
const byTag = sources.includes("...")
|
|
685
764
|
? dict(DEFAULT_SOURCES_BY_TAG)
|
|
@@ -804,27 +883,18 @@ class HtmlParser extends Parser {
|
|
|
804
883
|
const css = Boolean(compilation.options.experiments.css);
|
|
805
884
|
const urlHints = this._urlHints;
|
|
806
885
|
|
|
807
|
-
//
|
|
808
|
-
//
|
|
809
|
-
// HTML modules in the same compilation. We hash the module's resource
|
|
810
|
-
// path (a plain absolute path) — going through `contextify` against
|
|
811
|
-
// the compilation root keeps the hash machine-stable for the same
|
|
812
|
-
// project layout. Note: `module.identifier()` returns `html|<path>`
|
|
813
|
-
// for HTML modules, which doesn't start with `/`, so contextify would
|
|
814
|
-
// leave it absolute. `module.resource` is the bare path.
|
|
886
|
+
// An entry name starts with the page's own path, so two pages never claim
|
|
887
|
+
// one — from `resource`, since `identifier()` is `html|<path>`.
|
|
815
888
|
/** @type {string} */
|
|
816
|
-
const resource =
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
.slice(0, 8);
|
|
889
|
+
const resource = module.resource || module.identifier();
|
|
890
|
+
const entryPrefix = entryNamePrefix(
|
|
891
|
+
context ? contextify(context, resource) : resource,
|
|
892
|
+
hashFunction
|
|
893
|
+
);
|
|
822
894
|
|
|
823
|
-
// `output.html` head injection
|
|
824
|
-
//
|
|
825
|
-
//
|
|
826
|
-
// wrappers already carry the tags and iframe srcdoc pages must stay
|
|
827
|
-
// untouched.
|
|
895
|
+
// `output.html` head injection collects facts during the walk and turns
|
|
896
|
+
// them into presentational dependencies after, so no later pass re-parses
|
|
897
|
+
// the page. `data:` documents are skipped — they already carry the tags.
|
|
828
898
|
const htmlOutputOptions =
|
|
829
899
|
compilation.options && compilation.options.output
|
|
830
900
|
? compilation.options.output.html
|
|
@@ -837,6 +907,72 @@ class HtmlParser extends Parser {
|
|
|
837
907
|
!resource.startsWith("data:")
|
|
838
908
|
? htmlOutputOptions
|
|
839
909
|
: undefined;
|
|
910
|
+
const chunkNameOption = this._chunkName;
|
|
911
|
+
/** @type {Set<string>} */
|
|
912
|
+
const claimedEntryNames = new Set();
|
|
913
|
+
/** @type {Set<string>} */
|
|
914
|
+
const requestedEntryNames = new Set();
|
|
915
|
+
|
|
916
|
+
/**
|
|
917
|
+
* Claims `base`, counting up from the tag's own position while another tag
|
|
918
|
+
* of this page holds it: one name would merge entries the document parts.
|
|
919
|
+
* @param {string} base the name the tag asks for
|
|
920
|
+
* @param {number} index the tag's position in the page
|
|
921
|
+
* @returns {string} the name it claimed
|
|
922
|
+
*/
|
|
923
|
+
const claimEntryName = (base, index) => {
|
|
924
|
+
let claimed = base;
|
|
925
|
+
for (let suffix = index; claimedEntryNames.has(claimed); suffix++) {
|
|
926
|
+
claimed = `${base}-${suffix}`;
|
|
927
|
+
}
|
|
928
|
+
claimedEntryNames.add(claimed);
|
|
929
|
+
return claimed;
|
|
930
|
+
};
|
|
931
|
+
|
|
932
|
+
/**
|
|
933
|
+
* The name a tag's extracted entry claims: what its own
|
|
934
|
+
* `webpackChunkName` comment asked for, else what
|
|
935
|
+
* `module.parser.html.chunkName` makes of it, else the page and the position.
|
|
936
|
+
* @param {string | undefined} requested name from the tag's magic comment
|
|
937
|
+
* @param {string} request the tag's request
|
|
938
|
+
* @param {number} index the tag's position in the page
|
|
939
|
+
* @param {HtmlChunkNameData["type"]} type what the tag is extracted as
|
|
940
|
+
* @returns {string} an entry name no other tag of this page claims
|
|
941
|
+
*/
|
|
942
|
+
const entryNameFor = (requested, request, index, type) => {
|
|
943
|
+
let name = requested;
|
|
944
|
+
if (name === undefined && chunkNameOption !== undefined) {
|
|
945
|
+
const tagName = getRequestBaseName(request) || "";
|
|
946
|
+
name =
|
|
947
|
+
typeof chunkNameOption === "function"
|
|
948
|
+
? chunkNameOption({ page: entryPrefix, name: tagName, index, type })
|
|
949
|
+
: chunkNameOption.replace(
|
|
950
|
+
CHUNK_NAME_PLACEHOLDER_REGEXP,
|
|
951
|
+
(_, placeholder) => {
|
|
952
|
+
if (placeholder === "page") return entryPrefix;
|
|
953
|
+
if (placeholder === "name") return tagName;
|
|
954
|
+
if (placeholder === "index") return `${index}`;
|
|
955
|
+
return type;
|
|
956
|
+
}
|
|
957
|
+
);
|
|
958
|
+
}
|
|
959
|
+
if (typeof name !== "string" || name === "") {
|
|
960
|
+
return claimEntryName(`${entryPrefix}-${index}`, index);
|
|
961
|
+
}
|
|
962
|
+
const claimed = claimEntryName(name, index);
|
|
963
|
+
requestedEntryNames.add(claimed);
|
|
964
|
+
return claimed;
|
|
965
|
+
};
|
|
966
|
+
|
|
967
|
+
/**
|
|
968
|
+
* The name a tag's file is emitted under when the page asked for one, so
|
|
969
|
+
* a named chunk is not left to be called after the tag's url.
|
|
970
|
+
* @param {string} entryName the entry name the tag claimed
|
|
971
|
+
* @returns {string | undefined} the asked-for name, else undefined
|
|
972
|
+
*/
|
|
973
|
+
const requestedFileName = (entryName) =>
|
|
974
|
+
requestedEntryNames.has(entryName) ? entryName : undefined;
|
|
975
|
+
|
|
840
976
|
let doctypeEnd = -1;
|
|
841
977
|
let htmlTagEnd = -1;
|
|
842
978
|
// insertion offsets just inside the (possibly implicit) head
|
|
@@ -846,10 +982,9 @@ class HtmlParser extends Parser {
|
|
|
846
982
|
let inHead = false;
|
|
847
983
|
// `<template>` contents are inert
|
|
848
984
|
let headTemplateDepth = 0;
|
|
849
|
-
// Depth of open `<template>` elements anywhere in the tree
|
|
850
|
-
//
|
|
851
|
-
//
|
|
852
|
-
// templates seen while in `<head>`, so it can't guard body templates).
|
|
985
|
+
// Depth of open `<template>` elements anywhere in the tree: their content
|
|
986
|
+
// is an inert fragment, so a `<base>` inside one must not set the document
|
|
987
|
+
// base. `headTemplateDepth` covers only `<head>`, so it cannot guard this.
|
|
853
988
|
let templateDepth = 0;
|
|
854
989
|
let headHasTitle = false;
|
|
855
990
|
let headHasBase = false;
|
|
@@ -857,13 +992,9 @@ class HtmlParser extends Parser {
|
|
|
857
992
|
/** @type {Set<string> | undefined} */
|
|
858
993
|
let headMetaNames;
|
|
859
994
|
|
|
860
|
-
//
|
|
861
|
-
//
|
|
862
|
-
//
|
|
863
|
-
// leader-only dependOn so they share a runtime.
|
|
864
|
-
// `<link rel="modulepreload">` entries are kept independent — they
|
|
865
|
-
// must preload without running, so they can never become a runtime
|
|
866
|
-
// leader that other entries would import.
|
|
995
|
+
// Collected per type during the walk; HtmlModulesPlugin turns them into
|
|
996
|
+
// entries. `script` and `script-module` chain through a leader-only
|
|
997
|
+
// dependOn; modulepreload stays independent, as it must not run.
|
|
867
998
|
/**
|
|
868
999
|
* @typedef {object} HtmlEntryInfo
|
|
869
1000
|
* @property {string} request
|
|
@@ -871,6 +1002,7 @@ class HtmlParser extends Parser {
|
|
|
871
1002
|
* @property {number} index position in the document, across all groups — the order the emitted files are named in
|
|
872
1003
|
* @property {"script" | "script-module" | "modulepreload" | "stylesheet" | "html" | "preload" | "prefetch"} type
|
|
873
1004
|
* @property {boolean=} css entry emits a CSS chunk (`<link rel="preload" as="style">`), so it needs the CSS filename template
|
|
1005
|
+
* @property {string=} chunkName name the page asked this tag's chunk to claim, which names its file too
|
|
874
1006
|
*/
|
|
875
1007
|
/** @type {HtmlEntryInfo[]} */
|
|
876
1008
|
const scriptEntries = [];
|
|
@@ -892,28 +1024,40 @@ class HtmlParser extends Parser {
|
|
|
892
1024
|
/** @type {HtmlEntryInfo[]} */
|
|
893
1025
|
const prefetchEntries = [];
|
|
894
1026
|
|
|
895
|
-
// Offset of the first classic blocking script tag
|
|
896
|
-
// `<link>`s stay ahead of
|
|
897
|
-
//
|
|
898
|
-
// so CSS may follow their tags (the order Vite emits).
|
|
1027
|
+
// Offset of the first classic blocking script tag, which injected stylesheet
|
|
1028
|
+
// `<link>`s stay ahead of. `defer`/`async`/module scripts do not anchor: they
|
|
1029
|
+
// run after parsing and after pending stylesheets.
|
|
899
1030
|
let firstBlockingScriptStart = -1;
|
|
900
1031
|
|
|
901
1032
|
let nextEntryIndex = 0;
|
|
902
|
-
|
|
903
|
-
//
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
//
|
|
907
|
-
|
|
1033
|
+
// One chunk per run of inline `<script>`: under module output every
|
|
1034
|
+
// extracted tag is deferred, so only what executes between them matters.
|
|
1035
|
+
/** @type {string | undefined} */
|
|
1036
|
+
let inlineRunEntryName;
|
|
1037
|
+
// Element offset of the run's last member — any other `<script>` ends it.
|
|
1038
|
+
let inlineRunTag = -1;
|
|
1039
|
+
// End offset of that member, for the gap a classic run may not span.
|
|
1040
|
+
let inlineRunEnd = -1;
|
|
1041
|
+
// How the run's tags are scheduled, which a member has to share.
|
|
1042
|
+
/** @type {string | undefined} */
|
|
1043
|
+
let inlineRunScheduling;
|
|
1044
|
+
// The run's first tag, which carries the chunk and so the inline request.
|
|
1045
|
+
/** @type {HtmlInlineScriptDependency | undefined} */
|
|
1046
|
+
let inlineRunLeaderDependency;
|
|
1047
|
+
|
|
1048
|
+
// WHY: `<base href>` resolves the relative URLs that follow it. A relative base
|
|
1049
|
+
// (`./assets/`) rewrites them into a subdirectory and they stay bundled; a
|
|
1050
|
+
// root-relative or absolute one (`/`, `https://cdn/`) points outside the
|
|
1051
|
+
// build, so those URLs are left untouched. Resolved in the walk below from
|
|
1052
|
+
// the first `<base href>` seen, `documentBase` being undefined until then.
|
|
908
1053
|
/** @type {string | undefined} */
|
|
909
1054
|
let documentBase;
|
|
910
1055
|
/** @type {string | undefined} */
|
|
911
1056
|
let baseDir;
|
|
912
1057
|
let baseIsExternal = false;
|
|
913
|
-
// Prepended to the emitted URLs' auto-public-path undo path
|
|
914
|
-
//
|
|
915
|
-
//
|
|
916
|
-
// it. Undefined for absolute publicPath (no undo path is emitted).
|
|
1058
|
+
// Prepended to the emitted URLs' auto-public-path undo path: the browser
|
|
1059
|
+
// resolves them against the base dir, so one `../` per base segment cancels
|
|
1060
|
+
// it. Undefined for an absolute publicPath, which emits no undo path.
|
|
917
1061
|
/** @type {string | undefined} */
|
|
918
1062
|
let baseUrlPrefix;
|
|
919
1063
|
|
|
@@ -926,6 +1070,12 @@ class HtmlParser extends Parser {
|
|
|
926
1070
|
let pendingWebpackIgnore;
|
|
927
1071
|
/** @type {boolean | undefined} */
|
|
928
1072
|
let pendingWebpackInline;
|
|
1073
|
+
/**
|
|
1074
|
+
* The name the most recent comment asked the next tag's chunk to claim,
|
|
1075
|
+
* cleared the same way as the flags above.
|
|
1076
|
+
* @type {string | undefined}
|
|
1077
|
+
*/
|
|
1078
|
+
let pendingWebpackChunkName;
|
|
929
1079
|
/**
|
|
930
1080
|
* Tracks the resource-hint values from the most recent `<!-- webpackPrefetch: … -->`
|
|
931
1081
|
* (etc.) comment so the next asset URL attribute picks them up.
|
|
@@ -936,16 +1086,16 @@ class HtmlParser extends Parser {
|
|
|
936
1086
|
const magicCommentContext = this.magicCommentContext;
|
|
937
1087
|
|
|
938
1088
|
/**
|
|
939
|
-
* @param {import("./syntax").HtmlPath} path walk path (used only for attribute-ref reads)
|
|
940
|
-
* @param {import("./syntax").HtmlAttributeRef} typeAttr type attribute ref (0 = none)
|
|
1089
|
+
* @param {import("./syntax-parser").HtmlPath} path walk path (used only for attribute-ref reads)
|
|
1090
|
+
* @param {import("./syntax-parser").HtmlAttributeRef} typeAttr type attribute ref (0 = none)
|
|
941
1091
|
* @param {number} nameEnd end offset of the tag name
|
|
942
1092
|
* @param {string} type type of the script
|
|
943
1093
|
* @param {string} input source string
|
|
944
1094
|
*/
|
|
945
1095
|
const reconcileScriptTypeAttr = (path, typeAttr, nameEnd, type, input) => {
|
|
946
1096
|
const valueStart =
|
|
947
|
-
typeAttr !== 0 ? path.
|
|
948
|
-
const valueEnd = typeAttr !== 0 ? path.
|
|
1097
|
+
typeAttr !== 0 ? path.startOf(Part.value, typeAttr) : -1;
|
|
1098
|
+
const valueEnd = typeAttr !== 0 ? path.endOf(Part.value, typeAttr) : -1;
|
|
949
1099
|
if (outputModule && type === "script") {
|
|
950
1100
|
// Chunk is an ES module; upgrade the tag.
|
|
951
1101
|
if (typeAttr !== 0 && valueStart !== -1) {
|
|
@@ -962,13 +1112,13 @@ class HtmlParser extends Parser {
|
|
|
962
1112
|
// browser doesn't load it under module semantics.
|
|
963
1113
|
let attrEnd;
|
|
964
1114
|
if (valueStart === -1) {
|
|
965
|
-
attrEnd = path.
|
|
1115
|
+
attrEnd = path.endOf(Part.name, typeAttr);
|
|
966
1116
|
} else if (input[valueEnd] === '"' || input[valueEnd] === "'") {
|
|
967
1117
|
attrEnd = valueEnd + 1;
|
|
968
1118
|
} else {
|
|
969
1119
|
attrEnd = valueEnd;
|
|
970
1120
|
}
|
|
971
|
-
let attrStart = path.
|
|
1121
|
+
let attrStart = path.startOf(Part.name, typeAttr);
|
|
972
1122
|
if (
|
|
973
1123
|
attrStart > 0 &&
|
|
974
1124
|
isAsciiWhitespace(input.charCodeAt(attrStart - 1))
|
|
@@ -1004,11 +1154,11 @@ class HtmlParser extends Parser {
|
|
|
1004
1154
|
* Classifies the first `<base href>` seen in the walk, setting
|
|
1005
1155
|
* `documentBase`/`baseDir`/`baseIsExternal`/`baseUrlPrefix` for the URLs
|
|
1006
1156
|
* that follow it.
|
|
1007
|
-
* @param {import("./syntax").HtmlPath} path walk path (for attribute reads)
|
|
1008
|
-
* @param {import("./syntax").HtmlAttributeRef} hrefAttr the base's href attribute
|
|
1157
|
+
* @param {import("./syntax-parser").HtmlPath} path walk path (for attribute reads)
|
|
1158
|
+
* @param {import("./syntax-parser").HtmlAttributeRef} hrefAttr the base's href attribute
|
|
1009
1159
|
*/
|
|
1010
1160
|
const resolveDocumentBase = (path, hrefAttr) => {
|
|
1011
|
-
documentBase =
|
|
1161
|
+
documentBase = path.value(hrefAttr).trim();
|
|
1012
1162
|
if (!documentBase) return;
|
|
1013
1163
|
if (
|
|
1014
1164
|
ABSOLUTE_URL_SCHEME_REGEXP.test(documentBase) ||
|
|
@@ -1017,10 +1167,9 @@ class HtmlParser extends Parser {
|
|
|
1017
1167
|
baseIsExternal = true;
|
|
1018
1168
|
return;
|
|
1019
1169
|
}
|
|
1020
|
-
// Normalize the base path into
|
|
1021
|
-
//
|
|
1022
|
-
//
|
|
1023
|
-
// dot-segment; `up` counts `..`s that climb above the document dir.
|
|
1170
|
+
// Normalize the base path into descending directory segments, resolving
|
|
1171
|
+
// `.`/`..` as the URL spec does. The final segment names a file and is
|
|
1172
|
+
// dropped; `up` counts the `..`s climbing above the document dir.
|
|
1024
1173
|
const parts = documentBase.split("/");
|
|
1025
1174
|
/** @type {string[]} */
|
|
1026
1175
|
const dirs = [];
|
|
@@ -1048,7 +1197,7 @@ class HtmlParser extends Parser {
|
|
|
1048
1197
|
|
|
1049
1198
|
// Lazy decoded-attribute map for the current element — parse-scoped
|
|
1050
1199
|
// to avoid a closure and memo slot per element.
|
|
1051
|
-
/** @type {import("./syntax").HtmlPath | undefined} */
|
|
1200
|
+
/** @type {import("./syntax-parser").HtmlPath | undefined} */
|
|
1052
1201
|
let attrMapPath;
|
|
1053
1202
|
let attrMapCount = 0;
|
|
1054
1203
|
/** @type {Map<string, string> | undefined} */
|
|
@@ -1056,28 +1205,26 @@ class HtmlParser extends Parser {
|
|
|
1056
1205
|
const getAttributesMap = () => {
|
|
1057
1206
|
if (currentAttributesMap) return currentAttributesMap;
|
|
1058
1207
|
currentAttributesMap = new Map();
|
|
1059
|
-
const path = /** @type {import("./syntax").HtmlPath} */ (
|
|
1208
|
+
const path = /** @type {import("./syntax-parser").HtmlPath} */ (
|
|
1209
|
+
attrMapPath
|
|
1210
|
+
);
|
|
1060
1211
|
for (let i = 0; i < attrMapCount; i++) {
|
|
1061
|
-
const attr = path.
|
|
1212
|
+
const attr = path.field(i, Field.attributes);
|
|
1062
1213
|
// Decoded values — filters and type resolvers compare what
|
|
1063
1214
|
// the browser sees (e.g. `rel="icon"` means `icon`)
|
|
1064
|
-
currentAttributesMap.set(
|
|
1065
|
-
path.attributeName(attr),
|
|
1066
|
-
decodeEntities(path.attributeValue(attr), true)
|
|
1067
|
-
);
|
|
1215
|
+
currentAttributesMap.set(path.name(attr), path.value(attr));
|
|
1068
1216
|
}
|
|
1069
1217
|
return currentAttributesMap;
|
|
1070
1218
|
};
|
|
1071
1219
|
|
|
1072
1220
|
// TODO implement full HTML parser (WASM)
|
|
1073
|
-
// The walker descends into children
|
|
1074
|
-
//
|
|
1075
|
-
// children are done (the old `walkChildren` behaviour).
|
|
1221
|
+
// The walker descends into children and `<template>` content itself, and the
|
|
1222
|
+
// Element `exit` clears a pending `webpackIgnore` once they are done.
|
|
1076
1223
|
new SourceProcessor()
|
|
1077
1224
|
.use({
|
|
1078
1225
|
[NodeType.Comment]: (path) => {
|
|
1079
|
-
const start = path.start();
|
|
1080
|
-
const end = path.end();
|
|
1226
|
+
const start = path.start(path.node);
|
|
1227
|
+
const end = path.end(path.node);
|
|
1081
1228
|
// comments count toward the head-end insertion anchor
|
|
1082
1229
|
if (inHead && headTemplateDepth === 0 && end > headLastEnd) {
|
|
1083
1230
|
headLastEnd = end;
|
|
@@ -1095,17 +1242,19 @@ class HtmlParser extends Parser {
|
|
|
1095
1242
|
) {
|
|
1096
1243
|
pendingWebpackIgnore = undefined;
|
|
1097
1244
|
pendingWebpackInline = undefined;
|
|
1245
|
+
pendingWebpackChunkName = undefined;
|
|
1098
1246
|
pendingHints = undefined;
|
|
1099
1247
|
return;
|
|
1100
1248
|
}
|
|
1101
|
-
const value = path.
|
|
1249
|
+
const value = path.value();
|
|
1102
1250
|
if (!webpackCommentRegExp.test(value)) {
|
|
1103
1251
|
pendingWebpackIgnore = undefined;
|
|
1104
1252
|
pendingWebpackInline = undefined;
|
|
1253
|
+
pendingWebpackChunkName = undefined;
|
|
1105
1254
|
pendingHints = undefined;
|
|
1106
1255
|
return;
|
|
1107
1256
|
}
|
|
1108
|
-
/** @type {
|
|
1257
|
+
/** @type {MagicCommentOptions} */
|
|
1109
1258
|
let options;
|
|
1110
1259
|
try {
|
|
1111
1260
|
options = parseMagicComment(value, magicCommentContext);
|
|
@@ -1125,18 +1274,21 @@ class HtmlParser extends Parser {
|
|
|
1125
1274
|
);
|
|
1126
1275
|
pendingWebpackIgnore = undefined;
|
|
1127
1276
|
pendingWebpackInline = undefined;
|
|
1277
|
+
pendingWebpackChunkName = undefined;
|
|
1128
1278
|
pendingHints = undefined;
|
|
1129
1279
|
return;
|
|
1130
1280
|
}
|
|
1131
1281
|
if (
|
|
1132
1282
|
options.webpackIgnore === undefined &&
|
|
1133
1283
|
options.webpackInline === undefined &&
|
|
1284
|
+
options.webpackChunkName === undefined &&
|
|
1134
1285
|
options.webpackPrefetch === undefined &&
|
|
1135
1286
|
options.webpackPreload === undefined &&
|
|
1136
1287
|
options.webpackFetchPriority === undefined
|
|
1137
1288
|
) {
|
|
1138
1289
|
pendingWebpackIgnore = undefined;
|
|
1139
1290
|
pendingWebpackInline = undefined;
|
|
1291
|
+
pendingWebpackChunkName = undefined;
|
|
1140
1292
|
pendingHints = undefined;
|
|
1141
1293
|
return;
|
|
1142
1294
|
}
|
|
@@ -1157,6 +1309,7 @@ class HtmlParser extends Parser {
|
|
|
1157
1309
|
);
|
|
1158
1310
|
pendingWebpackIgnore = undefined;
|
|
1159
1311
|
pendingWebpackInline = undefined;
|
|
1312
|
+
pendingWebpackChunkName = undefined;
|
|
1160
1313
|
pendingHints = undefined;
|
|
1161
1314
|
return;
|
|
1162
1315
|
}
|
|
@@ -1177,11 +1330,35 @@ class HtmlParser extends Parser {
|
|
|
1177
1330
|
);
|
|
1178
1331
|
pendingWebpackIgnore = undefined;
|
|
1179
1332
|
pendingWebpackInline = undefined;
|
|
1333
|
+
pendingWebpackChunkName = undefined;
|
|
1334
|
+
pendingHints = undefined;
|
|
1335
|
+
return;
|
|
1336
|
+
}
|
|
1337
|
+
if (
|
|
1338
|
+
options.webpackChunkName !== undefined &&
|
|
1339
|
+
(typeof options.webpackChunkName !== "string" ||
|
|
1340
|
+
options.webpackChunkName === "")
|
|
1341
|
+
) {
|
|
1342
|
+
const { line: sl, column: sc } = locConverter.get(start);
|
|
1343
|
+
const { line: el, column: ec } = locConverter.get(end);
|
|
1344
|
+
module.addWarning(
|
|
1345
|
+
new (getUnsupportedFeatureWarning())(
|
|
1346
|
+
`\`webpackChunkName\` expected a non-empty string, but received: ${options.webpackChunkName}.`,
|
|
1347
|
+
{
|
|
1348
|
+
start: { line: sl, column: sc },
|
|
1349
|
+
end: { line: el, column: ec }
|
|
1350
|
+
}
|
|
1351
|
+
)
|
|
1352
|
+
);
|
|
1353
|
+
pendingWebpackIgnore = undefined;
|
|
1354
|
+
pendingWebpackInline = undefined;
|
|
1355
|
+
pendingWebpackChunkName = undefined;
|
|
1180
1356
|
pendingHints = undefined;
|
|
1181
1357
|
return;
|
|
1182
1358
|
}
|
|
1183
1359
|
pendingWebpackIgnore = options.webpackIgnore;
|
|
1184
1360
|
pendingWebpackInline = options.webpackInline;
|
|
1361
|
+
pendingWebpackChunkName = options.webpackChunkName;
|
|
1185
1362
|
if (
|
|
1186
1363
|
options.webpackPrefetch !== undefined ||
|
|
1187
1364
|
options.webpackPreload !== undefined ||
|
|
@@ -1205,9 +1382,10 @@ class HtmlParser extends Parser {
|
|
|
1205
1382
|
},
|
|
1206
1383
|
[NodeType.Doctype]: (path) => {
|
|
1207
1384
|
// only visited when head injection is active (see `skip` below)
|
|
1208
|
-
if (doctypeEnd === -1) doctypeEnd = path.end();
|
|
1385
|
+
if (doctypeEnd === -1) doctypeEnd = path.end(path.node);
|
|
1209
1386
|
pendingWebpackIgnore = undefined;
|
|
1210
1387
|
pendingWebpackInline = undefined;
|
|
1388
|
+
pendingWebpackChunkName = undefined;
|
|
1211
1389
|
pendingHints = undefined;
|
|
1212
1390
|
},
|
|
1213
1391
|
[NodeType.Element]: {
|
|
@@ -1217,24 +1395,25 @@ class HtmlParser extends Parser {
|
|
|
1217
1395
|
enter: (path) => {
|
|
1218
1396
|
const ignore = pendingWebpackIgnore === true;
|
|
1219
1397
|
const forceInline = pendingWebpackInline === true;
|
|
1398
|
+
const chunkName = pendingWebpackChunkName;
|
|
1220
1399
|
pendingWebpackIgnore = undefined;
|
|
1221
1400
|
pendingWebpackInline = undefined;
|
|
1401
|
+
pendingWebpackChunkName = undefined;
|
|
1222
1402
|
|
|
1223
|
-
// `<head>` anchors are collected for every page
|
|
1224
|
-
// `inject: "head"` siblings and resource hints
|
|
1225
|
-
// title/meta/base facts only when configured. Structural, so it
|
|
1403
|
+
// `<head>` anchors are collected for every page, since they place
|
|
1404
|
+
// `inject: "head"` siblings and resource hints. Structural, so this
|
|
1226
1405
|
// runs even for `webpackIgnore`d elements.
|
|
1227
1406
|
{
|
|
1228
|
-
const name = path.
|
|
1229
|
-
if (name === "template" && path
|
|
1407
|
+
const name = path.name();
|
|
1408
|
+
if (name === "template" && isHtmlElement(path)) {
|
|
1230
1409
|
templateDepth++;
|
|
1231
1410
|
}
|
|
1232
1411
|
if (headTemplateDepth > 0) {
|
|
1233
|
-
if (name === "template" && path
|
|
1412
|
+
if (name === "template" && isHtmlElement(path)) {
|
|
1234
1413
|
headTemplateDepth++;
|
|
1235
1414
|
}
|
|
1236
1415
|
} else if (inHead) {
|
|
1237
|
-
if (headOptions !== undefined && path
|
|
1416
|
+
if (headOptions !== undefined && isHtmlElement(path)) {
|
|
1238
1417
|
switch (name) {
|
|
1239
1418
|
case "title":
|
|
1240
1419
|
headHasTitle = true;
|
|
@@ -1243,50 +1422,48 @@ class HtmlParser extends Parser {
|
|
|
1243
1422
|
headHasBase = true;
|
|
1244
1423
|
break;
|
|
1245
1424
|
case "meta": {
|
|
1246
|
-
if (path.
|
|
1247
|
-
headCharsetEnd = path.
|
|
1425
|
+
if (path.fieldNamed(Field.attributes, "charset") !== 0) {
|
|
1426
|
+
headCharsetEnd = path.startOf(Part.content, path.node);
|
|
1248
1427
|
} else {
|
|
1249
|
-
const httpEquiv = path.
|
|
1428
|
+
const httpEquiv = path.fieldNamed(
|
|
1429
|
+
Field.attributes,
|
|
1430
|
+
"http-equiv"
|
|
1431
|
+
);
|
|
1250
1432
|
const contentAttr =
|
|
1251
1433
|
httpEquiv !== 0 &&
|
|
1252
|
-
|
|
1253
|
-
path.
|
|
1254
|
-
true
|
|
1255
|
-
).toLowerCase() === "content-type"
|
|
1256
|
-
? path.findAttribute("content")
|
|
1434
|
+
path.value(httpEquiv).toLowerCase() === "content-type"
|
|
1435
|
+
? path.fieldNamed(Field.attributes, "content")
|
|
1257
1436
|
: 0;
|
|
1258
1437
|
if (
|
|
1259
1438
|
contentAttr !== 0 &&
|
|
1260
1439
|
CHARSET_DECLARATION_REGEXP.test(
|
|
1261
|
-
|
|
1262
|
-
path.attributeValue(contentAttr),
|
|
1263
|
-
true
|
|
1264
|
-
)
|
|
1440
|
+
path.value(contentAttr)
|
|
1265
1441
|
)
|
|
1266
1442
|
) {
|
|
1267
|
-
headCharsetEnd = path.
|
|
1443
|
+
headCharsetEnd = path.startOf(
|
|
1444
|
+
Part.content,
|
|
1445
|
+
path.node
|
|
1446
|
+
);
|
|
1268
1447
|
}
|
|
1269
1448
|
}
|
|
1270
|
-
const nameAttr = path.
|
|
1271
|
-
|
|
1449
|
+
const nameAttr = path.fieldNamed(
|
|
1450
|
+
Field.attributes,
|
|
1451
|
+
"name"
|
|
1452
|
+
);
|
|
1453
|
+
const propertyAttr = path.fieldNamed(
|
|
1454
|
+
Field.attributes,
|
|
1455
|
+
"property"
|
|
1456
|
+
);
|
|
1272
1457
|
if (nameAttr !== 0 || propertyAttr !== 0) {
|
|
1273
1458
|
if (headMetaNames === undefined) {
|
|
1274
1459
|
headMetaNames = new Set();
|
|
1275
1460
|
}
|
|
1276
1461
|
if (nameAttr !== 0) {
|
|
1277
|
-
headMetaNames.add(
|
|
1278
|
-
decodeEntities(
|
|
1279
|
-
path.attributeValue(nameAttr),
|
|
1280
|
-
true
|
|
1281
|
-
).toLowerCase()
|
|
1282
|
-
);
|
|
1462
|
+
headMetaNames.add(path.value(nameAttr).toLowerCase());
|
|
1283
1463
|
}
|
|
1284
1464
|
if (propertyAttr !== 0) {
|
|
1285
1465
|
headMetaNames.add(
|
|
1286
|
-
|
|
1287
|
-
path.attributeValue(propertyAttr),
|
|
1288
|
-
true
|
|
1289
|
-
).toLowerCase()
|
|
1466
|
+
path.value(propertyAttr).toLowerCase()
|
|
1290
1467
|
);
|
|
1291
1468
|
}
|
|
1292
1469
|
}
|
|
@@ -1296,23 +1473,22 @@ class HtmlParser extends Parser {
|
|
|
1296
1473
|
headTemplateDepth++;
|
|
1297
1474
|
break;
|
|
1298
1475
|
}
|
|
1299
|
-
} else if (
|
|
1300
|
-
name === "template" &&
|
|
1301
|
-
path.namespace() === NS_HTML
|
|
1302
|
-
) {
|
|
1476
|
+
} else if (name === "template" && isHtmlElement(path)) {
|
|
1303
1477
|
headTemplateDepth++;
|
|
1304
1478
|
}
|
|
1305
|
-
if (path.end() > headLastEnd)
|
|
1306
|
-
|
|
1479
|
+
if (path.end(path.node) > headLastEnd) {
|
|
1480
|
+
headLastEnd = path.end(path.node);
|
|
1481
|
+
}
|
|
1482
|
+
} else if (!headSeen && isHtmlElement(path)) {
|
|
1307
1483
|
if (name === "html") {
|
|
1308
|
-
htmlTagEnd = path.
|
|
1484
|
+
htmlTagEnd = path.startOf(Part.content, path.node);
|
|
1309
1485
|
} else if (name === "head") {
|
|
1310
1486
|
headSeen = true;
|
|
1311
1487
|
inHead = true;
|
|
1312
1488
|
// explicit head has real offsets; an implicit one (head
|
|
1313
1489
|
// tags are optional in HTML5) anchors after `<html>`,
|
|
1314
1490
|
// the doctype, or the document start
|
|
1315
|
-
const tagEnd = path.
|
|
1491
|
+
const tagEnd = path.startOf(Part.content, path.node);
|
|
1316
1492
|
headStart =
|
|
1317
1493
|
tagEnd > 0
|
|
1318
1494
|
? tagEnd
|
|
@@ -1327,14 +1503,21 @@ class HtmlParser extends Parser {
|
|
|
1327
1503
|
}
|
|
1328
1504
|
|
|
1329
1505
|
if (ignore) {
|
|
1506
|
+
// It stays in the document and runs where it stands, so a run
|
|
1507
|
+
// may not span it either.
|
|
1508
|
+
if (path.name() === "script") {
|
|
1509
|
+
inlineRunEntryName = undefined;
|
|
1510
|
+
inlineRunLeaderDependency = undefined;
|
|
1511
|
+
inlineRunScheduling = undefined;
|
|
1512
|
+
}
|
|
1330
1513
|
return;
|
|
1331
1514
|
}
|
|
1332
1515
|
|
|
1333
|
-
const elementName = path.
|
|
1334
|
-
const attributeCount = path.
|
|
1335
|
-
const elementStart = path.start();
|
|
1336
|
-
const tagEnd = path.
|
|
1337
|
-
const nameEnd = path.
|
|
1516
|
+
const elementName = path.name();
|
|
1517
|
+
const attributeCount = path.fieldCount(Field.attributes);
|
|
1518
|
+
const elementStart = path.start(path.node);
|
|
1519
|
+
const tagEnd = path.startOf(Part.content, path.node);
|
|
1520
|
+
const nameEnd = path.endOf(Part.name, path.node);
|
|
1338
1521
|
|
|
1339
1522
|
// The first `<base href>` freezes the base for later URLs — but
|
|
1340
1523
|
// only one in the real document tree, not inside an inert
|
|
@@ -1343,9 +1526,9 @@ class HtmlParser extends Parser {
|
|
|
1343
1526
|
documentBase === undefined &&
|
|
1344
1527
|
templateDepth === 0 &&
|
|
1345
1528
|
elementName === "base" &&
|
|
1346
|
-
path
|
|
1529
|
+
isHtmlElement(path)
|
|
1347
1530
|
) {
|
|
1348
|
-
const hrefAttr = path.
|
|
1531
|
+
const hrefAttr = path.fieldNamed(Field.attributes, "href");
|
|
1349
1532
|
if (hrefAttr !== 0) resolveDocumentBase(path, hrefAttr);
|
|
1350
1533
|
}
|
|
1351
1534
|
|
|
@@ -1373,7 +1556,7 @@ class HtmlParser extends Parser {
|
|
|
1373
1556
|
let start;
|
|
1374
1557
|
/** @type {number} */
|
|
1375
1558
|
let end;
|
|
1376
|
-
/** @type {import("./syntax").HtmlAttributeRef} */
|
|
1559
|
+
/** @type {import("./syntax-parser").HtmlAttributeRef} */
|
|
1377
1560
|
let attr = 0;
|
|
1378
1561
|
if (content) {
|
|
1379
1562
|
if (!bodyItem) continue;
|
|
@@ -1383,7 +1566,7 @@ class HtmlParser extends Parser {
|
|
|
1383
1566
|
// `skip.text` drops the body `Text` node; the raw content
|
|
1384
1567
|
// span is [`tagEnd`, `contentEnd`] on the element.
|
|
1385
1568
|
const bodyStart = tagEnd;
|
|
1386
|
-
const bodyEnd = path.
|
|
1569
|
+
const bodyEnd = path.endOf(Part.content, path.node);
|
|
1387
1570
|
if (bodyEnd <= bodyStart) continue;
|
|
1388
1571
|
value = source.slice(bodyStart, bodyEnd);
|
|
1389
1572
|
if (value.trim() === "") continue;
|
|
@@ -1394,20 +1577,19 @@ class HtmlParser extends Parser {
|
|
|
1394
1577
|
? bodyItem.type(getAttributesMap(), css)
|
|
1395
1578
|
: bodyItem.type;
|
|
1396
1579
|
} else {
|
|
1397
|
-
attr = path.
|
|
1398
|
-
const item = sources[path.
|
|
1580
|
+
attr = path.field(i, Field.attributes);
|
|
1581
|
+
const item = sources[path.name(attr)];
|
|
1399
1582
|
if (!item) continue;
|
|
1400
1583
|
if (
|
|
1401
1584
|
item.namespace !== undefined &&
|
|
1402
|
-
path.
|
|
1585
|
+
!path.flag(item.namespace)
|
|
1403
1586
|
) {
|
|
1404
1587
|
continue;
|
|
1405
1588
|
}
|
|
1406
1589
|
// Adoption-agency clones carry no offsets; skip blank values.
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
value = path.attributeValue(attr);
|
|
1590
|
+
const valueStart = path.startOf(Part.value, attr);
|
|
1591
|
+
if (valueStart === -1) continue;
|
|
1592
|
+
value = path.source(valueStart, path.endOf(Part.value, attr));
|
|
1411
1593
|
if (!value || !/\S/.test(value)) continue;
|
|
1412
1594
|
const filter = item.filter;
|
|
1413
1595
|
if (filter) {
|
|
@@ -1418,8 +1600,8 @@ class HtmlParser extends Parser {
|
|
|
1418
1600
|
: value;
|
|
1419
1601
|
if (!filter(getAttributesMap(), decoded)) continue;
|
|
1420
1602
|
}
|
|
1421
|
-
start =
|
|
1422
|
-
end = path.
|
|
1603
|
+
start = valueStart;
|
|
1604
|
+
end = path.endOf(Part.value, attr);
|
|
1423
1605
|
type =
|
|
1424
1606
|
typeof item.type === "function"
|
|
1425
1607
|
? item.type(getAttributesMap(), css)
|
|
@@ -1428,30 +1610,44 @@ class HtmlParser extends Parser {
|
|
|
1428
1610
|
// A resolved `type` selects the parse algorithm and the dependency
|
|
1429
1611
|
// kind — the only dispatch in the parser.
|
|
1430
1612
|
switch (type) {
|
|
1431
|
-
// Inline CSS — a `<style>` body (
|
|
1613
|
+
// Inline CSS — a `<style>` body (a full stylesheet) or an
|
|
1432
1614
|
// attribute value (decoded, re-escaped on write-back; `*-attribute`
|
|
1433
1615
|
// is a declaration list). Needs `experiments.css`.
|
|
1434
1616
|
case "stylesheet-style":
|
|
1435
1617
|
case "stylesheet-style-attribute": {
|
|
1436
1618
|
if (!css) break;
|
|
1437
|
-
|
|
1619
|
+
// WHY: an HTML `<style>` body is raw text, so its source is its
|
|
1620
|
+
// text. The same element in a foreign subtree holds character
|
|
1621
|
+
// data, where `.a` is the selector `.a` — so the sheet has
|
|
1622
|
+
// to be decoded going in and escaped coming back out, which is
|
|
1623
|
+
// what `characterData` tells the write-back.
|
|
1624
|
+
const characterData = content && !isHtmlElement(path);
|
|
1625
|
+
// A page webpack emitted is one it can be pointed at again,
|
|
1626
|
+
// where a sheet arrives headed by the module the last build
|
|
1627
|
+
// read it as. That header was that build's; this writes its own.
|
|
1628
|
+
const cssText = ModuleInfoHeaderPlugin.stripHeaders(
|
|
1629
|
+
content
|
|
1630
|
+
? characterData
|
|
1631
|
+
? decodeEntities(value, false)
|
|
1632
|
+
: value
|
|
1633
|
+
: decodeEntities(value, true)
|
|
1634
|
+
);
|
|
1438
1635
|
if (cssText.trim() === "") break;
|
|
1439
1636
|
const dep = new HtmlInlineStyleDependency(
|
|
1440
1637
|
dataUri("text/css", cssText),
|
|
1441
1638
|
[start, end],
|
|
1442
1639
|
content ? false : type === "stylesheet-style-attribute",
|
|
1443
|
-
!content
|
|
1640
|
+
!content,
|
|
1641
|
+
characterData
|
|
1444
1642
|
);
|
|
1445
1643
|
setLoc(dep, start, end);
|
|
1446
1644
|
module.addDependency(dep);
|
|
1447
1645
|
module.addCodeGenerationDependency(dep);
|
|
1448
1646
|
break;
|
|
1449
1647
|
}
|
|
1450
|
-
// `<iframe srcdoc
|
|
1451
|
-
//
|
|
1452
|
-
// `
|
|
1453
|
-
// whose URL is `about:srcdoc`, so its base URL is inherited from
|
|
1454
|
-
// this document — asset URLs resolve against this file's context.
|
|
1648
|
+
// `<iframe srcdoc>` is an entity-encoded document, fed back through
|
|
1649
|
+
// the pipeline as a nested `data:text/html` module. Its URL is
|
|
1650
|
+
// `about:srcdoc`, so asset URLs resolve against this file.
|
|
1455
1651
|
case "srcdoc": {
|
|
1456
1652
|
const htmlText = decodeEntities(value, true);
|
|
1457
1653
|
// Only spin up a nested module when there is markup that can
|
|
@@ -1478,25 +1674,101 @@ class HtmlParser extends Parser {
|
|
|
1478
1674
|
if (content) {
|
|
1479
1675
|
const scriptType =
|
|
1480
1676
|
/** @type {"script" | "script-module"} */ (type);
|
|
1481
|
-
|
|
1677
|
+
// WHY: an HTML `<script>` body is raw text, so its source
|
|
1678
|
+
// is its text. The same element in a foreign subtree holds
|
|
1679
|
+
// character data, where a character reference stands for
|
|
1680
|
+
// what it names — `1 < 2` is `1 < 2` there, but reads
|
|
1681
|
+
// as `1 & lt < 2` when taken as written. Character data
|
|
1682
|
+
// also decodes `©=1`, which an attribute keeps whole.
|
|
1683
|
+
const scriptText = isHtmlElement(path)
|
|
1684
|
+
? value
|
|
1685
|
+
: decodeEntities(value, false);
|
|
1686
|
+
const request = dataUri("text/javascript", scriptText);
|
|
1482
1687
|
const index = nextEntryIndex++;
|
|
1483
|
-
|
|
1688
|
+
// Module output upgrades a classic tag, so every extracted
|
|
1689
|
+
// tag defers; without it the authored kind parts the run.
|
|
1690
|
+
const scheduling = outputModule ? "deferred" : scriptType;
|
|
1691
|
+
// `async` fires whenever it loads and a `<template>` body never
|
|
1692
|
+
// does, so neither joins — and only a deferred run spans markup.
|
|
1693
|
+
const joinsRun =
|
|
1694
|
+
templateDepth === 0 &&
|
|
1695
|
+
path.fieldNamed(Field.attributes, "async") === 0 &&
|
|
1696
|
+
(outputModule ||
|
|
1697
|
+
inlineRunEntryName === undefined ||
|
|
1698
|
+
isEmptyRunGap(source, inlineRunEnd, elementStart));
|
|
1699
|
+
/** @type {Range | undefined} */
|
|
1700
|
+
let removeRange;
|
|
1701
|
+
/** @type {string} */
|
|
1702
|
+
let entryName;
|
|
1703
|
+
if (joinsRun) {
|
|
1704
|
+
// A tag the page named leads a run of its own rather than
|
|
1705
|
+
// joining one, so the name covers what follows it.
|
|
1706
|
+
if (
|
|
1707
|
+
chunkName !== undefined ||
|
|
1708
|
+
inlineRunEntryName === undefined ||
|
|
1709
|
+
inlineRunScheduling !== scheduling
|
|
1710
|
+
) {
|
|
1711
|
+
entryName = entryNameFor(
|
|
1712
|
+
chunkName,
|
|
1713
|
+
request,
|
|
1714
|
+
index,
|
|
1715
|
+
scriptType
|
|
1716
|
+
);
|
|
1717
|
+
inlineRunEntryName = entryName;
|
|
1718
|
+
inlineRunScheduling = scheduling;
|
|
1719
|
+
} else {
|
|
1720
|
+
entryName = inlineRunEntryName;
|
|
1721
|
+
// The body rides in the run's chunk already, so the
|
|
1722
|
+
// element goes rather than gaining a `src`.
|
|
1723
|
+
removeRange = [
|
|
1724
|
+
elementStart,
|
|
1725
|
+
rawTextElementEnd(source, end)
|
|
1726
|
+
];
|
|
1727
|
+
}
|
|
1728
|
+
inlineRunTag = elementStart;
|
|
1729
|
+
inlineRunEnd = rawTextElementEnd(source, end);
|
|
1730
|
+
} else {
|
|
1731
|
+
entryName = entryNameFor(
|
|
1732
|
+
chunkName,
|
|
1733
|
+
request,
|
|
1734
|
+
index,
|
|
1735
|
+
scriptType
|
|
1736
|
+
);
|
|
1737
|
+
}
|
|
1484
1738
|
const dep = new HtmlInlineScriptDependency(
|
|
1485
1739
|
request,
|
|
1486
1740
|
nameEnd,
|
|
1487
1741
|
[start, end],
|
|
1488
1742
|
entryName,
|
|
1489
|
-
scriptType === "script-module" ? "esm" : "commonjs"
|
|
1743
|
+
scriptType === "script-module" ? "esm" : "commonjs",
|
|
1744
|
+
removeRange,
|
|
1745
|
+
forceInline
|
|
1490
1746
|
);
|
|
1747
|
+
if (joinsRun) {
|
|
1748
|
+
if (removeRange === undefined) {
|
|
1749
|
+
inlineRunLeaderDependency = dep;
|
|
1750
|
+
} else if (
|
|
1751
|
+
forceInline &&
|
|
1752
|
+
inlineRunLeaderDependency !== undefined
|
|
1753
|
+
) {
|
|
1754
|
+
// A run is one chunk, so a tag asking to be written
|
|
1755
|
+
// into the page asks it of the whole run.
|
|
1756
|
+
inlineRunLeaderDependency.forceInline = true;
|
|
1757
|
+
}
|
|
1758
|
+
}
|
|
1491
1759
|
setLoc(dep, start, end);
|
|
1492
1760
|
module.addPresentationalDependency(dep);
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1761
|
+
// A dropped tag is not rewritten: an edit inside the
|
|
1762
|
+
// removed range would survive it as loose text.
|
|
1763
|
+
if (removeRange === undefined) {
|
|
1764
|
+
reconcileScriptTypeAttr(
|
|
1765
|
+
path,
|
|
1766
|
+
path.fieldNamed(Field.attributes, "type"),
|
|
1767
|
+
nameEnd,
|
|
1768
|
+
scriptType,
|
|
1769
|
+
source
|
|
1770
|
+
);
|
|
1771
|
+
}
|
|
1500
1772
|
(scriptType === "script"
|
|
1501
1773
|
? scriptEntries
|
|
1502
1774
|
: scriptModuleEntries
|
|
@@ -1504,7 +1776,8 @@ class HtmlParser extends Parser {
|
|
|
1504
1776
|
request,
|
|
1505
1777
|
entryName,
|
|
1506
1778
|
index,
|
|
1507
|
-
type: scriptType
|
|
1779
|
+
type: scriptType,
|
|
1780
|
+
chunkName: requestedFileName(entryName)
|
|
1508
1781
|
});
|
|
1509
1782
|
break;
|
|
1510
1783
|
}
|
|
@@ -1547,7 +1820,7 @@ class HtmlParser extends Parser {
|
|
|
1547
1820
|
new (getModuleDependencyError())(
|
|
1548
1821
|
module,
|
|
1549
1822
|
new WebpackError(
|
|
1550
|
-
`Bad value for attribute "${path.
|
|
1823
|
+
`Bad value for attribute "${path.name(
|
|
1551
1824
|
attr
|
|
1552
1825
|
)}" on element "${elementName}": ${
|
|
1553
1826
|
/** @type {Error} */ (err).message
|
|
@@ -1579,13 +1852,17 @@ class HtmlParser extends Parser {
|
|
|
1579
1852
|
}
|
|
1580
1853
|
const s = start + (map ? map[us] : us);
|
|
1581
1854
|
const e = start + (map ? map[ue] : ue);
|
|
1582
|
-
// `html` links the URL as its own emitted page: the same
|
|
1583
|
-
//
|
|
1584
|
-
//
|
|
1585
|
-
// Recorded as an independent entry (no `dependOn`), like an entry point.
|
|
1855
|
+
// `html` links the URL as its own emitted page: the same dependency
|
|
1856
|
+
// as `<script src>`, but rewriting to the page's filename and
|
|
1857
|
+
// emitting no siblings. Independent, like an entry point.
|
|
1586
1858
|
if (type === "html") {
|
|
1587
1859
|
const index = nextEntryIndex++;
|
|
1588
|
-
const entryName =
|
|
1860
|
+
const entryName = entryNameFor(
|
|
1861
|
+
chunkName,
|
|
1862
|
+
request,
|
|
1863
|
+
index,
|
|
1864
|
+
"html"
|
|
1865
|
+
);
|
|
1589
1866
|
const dep = new HtmlEntryDependency(
|
|
1590
1867
|
request,
|
|
1591
1868
|
[s, e],
|
|
@@ -1595,24 +1872,33 @@ class HtmlParser extends Parser {
|
|
|
1595
1872
|
);
|
|
1596
1873
|
setLoc(dep, s, e);
|
|
1597
1874
|
module.addPresentationalDependency(dep);
|
|
1598
|
-
htmlLinkEntries.push({
|
|
1875
|
+
htmlLinkEntries.push({
|
|
1876
|
+
request,
|
|
1877
|
+
entryName,
|
|
1878
|
+
index,
|
|
1879
|
+
type,
|
|
1880
|
+
chunkName: requestedFileName(entryName)
|
|
1881
|
+
});
|
|
1599
1882
|
continue;
|
|
1600
1883
|
}
|
|
1601
|
-
// `rel="preload"/"prefetch"` of a bundled resource: an
|
|
1602
|
-
//
|
|
1603
|
-
//
|
|
1604
|
-
// sibling tags — a resource hint references exactly one URL.
|
|
1884
|
+
// `rel="preload"/"prefetch"` of a bundled resource: an independent,
|
|
1885
|
+
// non-executing entry rewritten to the built chunk's URL. No
|
|
1886
|
+
// siblings — a resource hint references exactly one URL.
|
|
1605
1887
|
if (type === "preload" || type === "prefetch") {
|
|
1606
1888
|
const as = getAttributeValue(getAttributesMap(), "as");
|
|
1607
1889
|
const asStyle = as
|
|
1608
1890
|
? as.trim().toLowerCase() === "style"
|
|
1609
1891
|
: false;
|
|
1610
1892
|
const index = nextEntryIndex++;
|
|
1611
|
-
const entryName =
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1893
|
+
const entryName = entryNameFor(
|
|
1894
|
+
chunkName,
|
|
1895
|
+
request,
|
|
1896
|
+
index,
|
|
1897
|
+
type
|
|
1898
|
+
);
|
|
1899
|
+
// Tag metadata letting the template mirror `crossorigin` and
|
|
1900
|
+
// `integrity` onto a native `preload` `<link>`. `prefetch` is not
|
|
1901
|
+
// integrity-eligible per the SRI spec, so its is left uncaptured.
|
|
1616
1902
|
const isNativeLink = elementName === "link";
|
|
1617
1903
|
const dep = new HtmlEntryDependency(
|
|
1618
1904
|
request,
|
|
@@ -1625,7 +1911,9 @@ class HtmlParser extends Parser {
|
|
|
1625
1911
|
isNativeLink,
|
|
1626
1912
|
"",
|
|
1627
1913
|
nameEnd,
|
|
1628
|
-
isNativeLink &&
|
|
1914
|
+
isNativeLink &&
|
|
1915
|
+
path.fieldNamed(Field.attributes, "crossorigin") !==
|
|
1916
|
+
0,
|
|
1629
1917
|
-1,
|
|
1630
1918
|
type === "preload" && isNativeLink
|
|
1631
1919
|
? captureIntegrityRange(path, source, elementStart)
|
|
@@ -1642,7 +1930,8 @@ class HtmlParser extends Parser {
|
|
|
1642
1930
|
entryName,
|
|
1643
1931
|
index,
|
|
1644
1932
|
type,
|
|
1645
|
-
css: asStyle
|
|
1933
|
+
css: asStyle,
|
|
1934
|
+
chunkName: requestedFileName(entryName)
|
|
1646
1935
|
});
|
|
1647
1936
|
continue;
|
|
1648
1937
|
}
|
|
@@ -1656,7 +1945,12 @@ class HtmlParser extends Parser {
|
|
|
1656
1945
|
type === "stylesheet"
|
|
1657
1946
|
) {
|
|
1658
1947
|
const index = nextEntryIndex++;
|
|
1659
|
-
const entryName =
|
|
1948
|
+
const entryName = entryNameFor(
|
|
1949
|
+
chunkName,
|
|
1950
|
+
request,
|
|
1951
|
+
index,
|
|
1952
|
+
type
|
|
1953
|
+
);
|
|
1660
1954
|
const willBeModuleScript =
|
|
1661
1955
|
type === "script-module" ||
|
|
1662
1956
|
(outputModule && type === "script");
|
|
@@ -1687,7 +1981,10 @@ class HtmlParser extends Parser {
|
|
|
1687
1981
|
let hasOwnCrossOrigin = false;
|
|
1688
1982
|
if (elementStart >= 0) {
|
|
1689
1983
|
for (const copyableName of COPYABLE_SIBLING_ATTRS) {
|
|
1690
|
-
const copyableAttr = path.
|
|
1984
|
+
const copyableAttr = path.fieldNamed(
|
|
1985
|
+
Field.attributes,
|
|
1986
|
+
copyableName
|
|
1987
|
+
);
|
|
1691
1988
|
if (copyableAttr !== 0) {
|
|
1692
1989
|
copyableAttrsText += attrSourceSpan(
|
|
1693
1990
|
path,
|
|
@@ -1700,28 +1997,22 @@ class HtmlParser extends Parser {
|
|
|
1700
1997
|
}
|
|
1701
1998
|
}
|
|
1702
1999
|
}
|
|
1703
|
-
// Blocking-ness of the tag as
|
|
1704
|
-
// `reconcileScriptTypeAttr`
|
|
1705
|
-
//
|
|
1706
|
-
// authored `type="module"` otherwise — so only non-module
|
|
1707
|
-
// output without `defer`/`async` blocks. Non-native
|
|
1708
|
-
// elements anchor conservatively (their synthesized
|
|
1709
|
-
// siblings may be plain blocking `<script>`s).
|
|
2000
|
+
// Blocking-ness of the tag as emitted, not as authored:
|
|
2001
|
+
// `reconcileScriptTypeAttr` decides the final `type`, so only
|
|
2002
|
+
// non-module output without `defer`/`async` blocks.
|
|
1710
2003
|
if (
|
|
1711
2004
|
firstBlockingScriptStart === -1 &&
|
|
1712
2005
|
(type === "script" || type === "script-module") &&
|
|
1713
2006
|
!outputModule &&
|
|
1714
2007
|
(elementName !== nativeTag ||
|
|
1715
|
-
(path.
|
|
1716
|
-
path.
|
|
2008
|
+
(path.fieldNamed(Field.attributes, "defer") === 0 &&
|
|
2009
|
+
path.fieldNamed(Field.attributes, "async") === 0))
|
|
1717
2010
|
) {
|
|
1718
2011
|
firstBlockingScriptStart = elementStart;
|
|
1719
2012
|
}
|
|
1720
|
-
// Sibling-clone attribute edits, captured
|
|
1721
|
-
//
|
|
1722
|
-
//
|
|
1723
|
-
// (content-specific) and `script-module` clones are forced
|
|
1724
|
-
// to `type="module"` (its value range, else inserted).
|
|
2013
|
+
// Sibling-clone attribute edits, captured as offsets relative to
|
|
2014
|
+
// the tag so the template need not re-parse it: `integrity` is
|
|
2015
|
+
// content-specific and dropped, `script-module` forces `type`.
|
|
1725
2016
|
const integrityRange =
|
|
1726
2017
|
elementStart >= 0 && elementName === nativeTag
|
|
1727
2018
|
? captureIntegrityRange(path, source, elementStart)
|
|
@@ -1733,14 +2024,17 @@ class HtmlParser extends Parser {
|
|
|
1733
2024
|
elementName === nativeTag &&
|
|
1734
2025
|
elementKind === "script-module"
|
|
1735
2026
|
) {
|
|
1736
|
-
const typeAttr = path.
|
|
2027
|
+
const typeAttr = path.fieldNamed(
|
|
2028
|
+
Field.attributes,
|
|
2029
|
+
"type"
|
|
2030
|
+
);
|
|
1737
2031
|
if (
|
|
1738
2032
|
typeAttr !== 0 &&
|
|
1739
|
-
path.
|
|
2033
|
+
path.startOf(Part.value, typeAttr) >= 0
|
|
1740
2034
|
) {
|
|
1741
2035
|
typeValueRange = [
|
|
1742
|
-
path.
|
|
1743
|
-
path.
|
|
2036
|
+
path.startOf(Part.value, typeAttr) - elementStart,
|
|
2037
|
+
path.endOf(Part.value, typeAttr) - elementStart
|
|
1744
2038
|
];
|
|
1745
2039
|
}
|
|
1746
2040
|
}
|
|
@@ -1771,7 +2065,7 @@ class HtmlParser extends Parser {
|
|
|
1771
2065
|
) {
|
|
1772
2066
|
reconcileScriptTypeAttr(
|
|
1773
2067
|
path,
|
|
1774
|
-
path.
|
|
2068
|
+
path.fieldNamed(Field.attributes, "type"),
|
|
1775
2069
|
nameEnd,
|
|
1776
2070
|
type,
|
|
1777
2071
|
source
|
|
@@ -1784,7 +2078,13 @@ class HtmlParser extends Parser {
|
|
|
1784
2078
|
: type === "stylesheet"
|
|
1785
2079
|
? stylesheetEntries
|
|
1786
2080
|
: modulePreloadEntries
|
|
1787
|
-
).push({
|
|
2081
|
+
).push({
|
|
2082
|
+
request,
|
|
2083
|
+
entryName,
|
|
2084
|
+
index,
|
|
2085
|
+
type,
|
|
2086
|
+
chunkName: requestedFileName(entryName)
|
|
2087
|
+
});
|
|
1788
2088
|
} else {
|
|
1789
2089
|
const dep = new HtmlSourceDependency(request, [s, e]);
|
|
1790
2090
|
ResourceHintPlugin.applyDefaults(
|
|
@@ -1806,10 +2106,17 @@ class HtmlParser extends Parser {
|
|
|
1806
2106
|
}
|
|
1807
2107
|
}
|
|
1808
2108
|
}
|
|
2109
|
+
// A `<script>` that joined no run ends the open one: the chunk runs
|
|
2110
|
+
// where its first tag stands, so nothing may execute in between.
|
|
2111
|
+
if (elementName === "script" && inlineRunTag !== elementStart) {
|
|
2112
|
+
inlineRunEntryName = undefined;
|
|
2113
|
+
inlineRunLeaderDependency = undefined;
|
|
2114
|
+
inlineRunScheduling = undefined;
|
|
2115
|
+
}
|
|
1809
2116
|
},
|
|
1810
2117
|
exit: (path) => {
|
|
1811
|
-
if (path
|
|
1812
|
-
const name = path.
|
|
2118
|
+
if (isHtmlElement(path)) {
|
|
2119
|
+
const name = path.name();
|
|
1813
2120
|
if (name === "template") {
|
|
1814
2121
|
if (templateDepth > 0) templateDepth--;
|
|
1815
2122
|
if (headTemplateDepth > 0) headTemplateDepth--;
|
|
@@ -1819,14 +2126,14 @@ class HtmlParser extends Parser {
|
|
|
1819
2126
|
}
|
|
1820
2127
|
pendingWebpackIgnore = undefined;
|
|
1821
2128
|
pendingWebpackInline = undefined;
|
|
2129
|
+
pendingWebpackChunkName = undefined;
|
|
1822
2130
|
pendingHints = undefined;
|
|
1823
2131
|
}
|
|
1824
2132
|
}
|
|
1825
2133
|
})
|
|
1826
|
-
// Skip AST output this walk never reads: `text
|
|
1827
|
-
// read by offset
|
|
1828
|
-
//
|
|
1829
|
-
// magic comments (`webpackIgnore`).
|
|
2134
|
+
// Skip AST output this walk never reads: `text`, since script and style
|
|
2135
|
+
// bodies are read by offset, and `doctype` unless head injection needs it
|
|
2136
|
+
// as an anchor. `comments` stays, for `webpackIgnore`.
|
|
1830
2137
|
.process(source, {
|
|
1831
2138
|
fragmentContext: this.fragmentContext,
|
|
1832
2139
|
skip: { text: true, doctype: headOptions === undefined }
|
|
@@ -1881,13 +2188,12 @@ class HtmlParser extends Parser {
|
|
|
1881
2188
|
const buildInfo = /** @type {HtmlModuleBuildInfo} */ (module.buildInfo);
|
|
1882
2189
|
buildInfo.strict = true;
|
|
1883
2190
|
if (baseUrlPrefix !== undefined) buildInfo.baseUrlPrefix = baseUrlPrefix;
|
|
1884
|
-
//
|
|
1885
|
-
// real compilation entries during the finishMake hook. The `script`
|
|
1886
|
-
//
|
|
1887
|
-
//
|
|
1888
|
-
//
|
|
1889
|
-
//
|
|
1890
|
-
// links are independent page entries too.
|
|
2191
|
+
// WHY: hand the collected entries to HtmlModulesPlugin, which creates the
|
|
2192
|
+
// real compilation entries during the finishMake hook. The `script` and
|
|
2193
|
+
// `script-module` groups chain through a leader-only `dependOn` so they share
|
|
2194
|
+
// a runtime, while `modulepreload` and `stylesheet` entries are independent:
|
|
2195
|
+
// `<link rel=modulepreload>` must preload without running, and a stylesheet
|
|
2196
|
+
// has no runtime. `html` links are independent page entries too.
|
|
1891
2197
|
if (
|
|
1892
2198
|
scriptEntries.length > 0 ||
|
|
1893
2199
|
scriptModuleEntries.length > 0 ||
|