@depup/webpack 5.109.2-depup.0 → 5.110.3-depup.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/changes.json +7 -7
- package/lib/APIPlugin.js +123 -17
- package/lib/AsyncDependenciesBlock.js +10 -7
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/BannerPlugin.js +10 -6
- package/lib/CacheFacade.js +6 -6
- package/lib/Chunk.js +14 -11
- package/lib/ChunkGraph.js +46 -35
- package/lib/ChunkGroup.js +7 -7
- package/lib/ChunkTemplate.js +35 -44
- package/lib/CircularModulesPlugin.js +205 -28
- package/lib/CleanPlugin.js +4 -7
- package/lib/CodeGenerationResults.js +11 -8
- package/lib/CompatibilityPlugin.js +7 -7
- package/lib/Compilation.js +688 -409
- package/lib/Compiler.js +53 -38
- package/lib/ConcatenationScope.js +107 -8
- package/lib/ConditionalInitFragment.js +3 -3
- package/lib/ConstPlugin.js +13 -11
- package/lib/ContextExclusionPlugin.js +1 -1
- package/lib/ContextModule.js +146 -54
- package/lib/ContextModuleFactory.js +46 -14
- package/lib/ContextReplacementPlugin.js +12 -14
- package/lib/DefinePlugin.js +121 -37
- package/lib/DependenciesBlock.js +9 -6
- package/lib/Dependency.js +36 -16
- package/lib/DependencyTemplate.js +11 -12
- package/lib/DependencyTemplates.js +3 -3
- package/lib/DotenvPlugin.js +91 -26
- package/lib/DynamicEntryPlugin.js +8 -4
- package/lib/EntryOptionPlugin.js +8 -4
- package/lib/EntryPlugin.js +2 -2
- package/lib/Entrypoint.js +6 -2
- package/lib/EnvironmentPlugin.js +2 -2
- package/lib/EvalDevToolModulePlugin.js +8 -4
- package/lib/EvalSourceMapDevToolPlugin.js +15 -8
- package/lib/ExportsInfo.js +111 -14
- package/lib/ExportsInfoApiPlugin.js +2 -4
- package/lib/ExternalModule.js +232 -77
- package/lib/ExternalModuleFactoryPlugin.js +97 -38
- package/lib/ExternalsPlugin.js +10 -6
- package/lib/FileSystemInfo.js +44 -70
- package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
- package/lib/FlagDependencyExportsPlugin.js +76 -19
- package/lib/FlagDependencyUsagePlugin.js +40 -49
- package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
- package/lib/Generator.js +36 -15
- package/lib/HotModuleReplacementPlugin.js +16 -44
- package/lib/IgnorePlugin.js +8 -4
- package/lib/IgnoreWarningsPlugin.js +2 -2
- package/lib/InitFragment.js +8 -4
- package/lib/JavascriptMetaInfoPlugin.js +35 -4
- package/lib/LazyBarrel.js +3 -4
- package/lib/LibraryTemplatePlugin.js +10 -6
- package/lib/LoaderOptionsPlugin.js +7 -3
- package/lib/LoaderTargetPlugin.js +1 -1
- package/lib/MainTemplate.js +49 -42
- package/lib/ManifestPlugin.js +12 -11
- package/lib/Module.js +62 -33
- package/lib/ModuleFactory.js +3 -3
- package/lib/ModuleFilenameHelpers.js +9 -4
- package/lib/ModuleGraph.js +195 -21
- package/lib/ModuleGraphConnection.js +6 -13
- package/lib/ModuleInfoHeaderPlugin.js +8 -10
- package/lib/ModuleTemplate.js +62 -63
- package/lib/MultiCompiler.js +130 -64
- package/lib/MultiStats.js +40 -9
- package/lib/MultiWatching.js +3 -3
- package/lib/NoEmitOnErrorsPlugin.js +1 -1
- package/lib/NodeStuffPlugin.js +29 -19
- package/lib/NormalModule.js +152 -103
- package/lib/NormalModuleFactory.js +555 -110
- package/lib/NormalModuleReplacementPlugin.js +5 -8
- package/lib/NullFactory.js +6 -2
- package/lib/OptionsApply.js +7 -3
- package/lib/Parser.js +7 -3
- package/lib/PlatformPlugin.js +2 -2
- package/lib/PrefetchPlugin.js +1 -1
- package/lib/ProgressPlugin.js +16 -13
- package/lib/ProvidePlugin.js +3 -5
- package/lib/RawModule.js +25 -17
- package/lib/RecordIdsPlugin.js +3 -3
- package/lib/RequestShortener.js +1 -1
- package/lib/ResolverFactory.js +2 -2
- package/lib/RuntimeGlobals.js +22 -10
- package/lib/RuntimeModule.js +29 -19
- package/lib/RuntimePlugin.js +335 -169
- package/lib/RuntimeTemplate.js +2761 -316
- package/lib/SelfModuleFactory.js +7 -3
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
- package/lib/SourceMapDevToolPlugin.js +30 -20
- package/lib/Stats.js +3 -4
- package/lib/Template.js +32 -22
- package/lib/TemplatedPathPlugin.js +96 -14
- package/lib/UseStrictPlugin.js +4 -6
- package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
- package/lib/WarnDeprecatedOptionPlugin.js +1 -1
- package/lib/WarnNoModeSetPlugin.js +1 -1
- package/lib/WatchIgnorePlugin.js +8 -6
- package/lib/Watching.js +8 -8
- package/lib/WebpackIsIncludedPlugin.js +2 -4
- package/lib/WebpackOptionsApply.js +308 -18
- package/lib/WebpackOptionsDefaulter.js +6 -2
- package/lib/asset/AssetBytesGenerator.js +12 -10
- package/lib/asset/AssetBytesParser.js +2 -4
- package/lib/asset/AssetGenerator.js +188 -95
- package/lib/asset/AssetModule.js +7 -3
- package/lib/asset/AssetModulesPlugin.js +110 -38
- package/lib/asset/AssetParser.js +9 -7
- package/lib/asset/AssetSourceGenerator.js +60 -13
- package/lib/asset/AssetSourceParser.js +2 -4
- package/lib/asset/RawDataUrlModule.js +24 -16
- package/lib/asset/WebManifestGenerator.js +8 -10
- package/lib/asset/WebManifestParser.js +24 -10
- package/lib/async-modules/AsyncModuleHelpers.js +12 -6
- package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
- package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
- package/lib/async-modules/isGeneratorLowered.js +4 -4
- package/lib/buildChunkGraph.js +36 -27
- package/lib/bun/BunTargetPlugin.js +1 -1
- package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
- package/lib/cache/AddManagedPathsPlugin.js +1 -1
- package/lib/cache/IdleFileCachePlugin.js +2 -2
- package/lib/cache/MemoryCachePlugin.js +18 -10
- package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
- package/lib/cache/PackFileCacheStrategy.js +30 -23
- package/lib/cache/ResolverCachePlugin.js +38 -18
- package/lib/cache/getLazyHashedEtag.js +1 -2
- package/lib/cache/mergeEtags.js +1 -1
- package/lib/cli.js +1 -3
- package/lib/config/browserslistTargetHandler.js +41 -5
- package/lib/config/defaults.js +270 -78
- package/lib/config/defineConfig.js +10 -2
- package/lib/config/getClaimedAssetTypes.js +65 -0
- package/lib/config/normalization.js +46 -16
- package/lib/config/target.js +46 -3
- package/lib/container/ContainerEntryDependency.js +1 -1
- package/lib/container/ContainerEntryModule.js +24 -15
- package/lib/container/ContainerEntryModuleFactory.js +7 -3
- package/lib/container/ContainerPlugin.js +9 -10
- package/lib/container/ContainerReferencePlugin.js +6 -2
- package/lib/container/FallbackDependency.js +1 -1
- package/lib/container/FallbackModule.js +24 -17
- package/lib/container/FallbackModuleFactory.js +7 -3
- package/lib/container/HoistContainerReferencesPlugin.js +6 -11
- package/lib/container/ModuleFederationPlugin.js +7 -24
- package/lib/container/RemoteModule.js +27 -19
- package/lib/container/RemoteRuntimeModule.js +10 -8
- package/lib/container/moduleFederationHooks.js +32 -0
- package/lib/css/CssGenerator.js +171 -43
- package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
- package/lib/css/CssLoadingRuntimeModule.js +84 -32
- package/lib/css/CssModule.js +10 -7
- package/lib/css/CssModulesPlugin.js +172 -100
- package/lib/css/CssParser.js +1113 -568
- package/lib/css/CssServerStylesRuntimeModule.js +54 -0
- package/lib/css/cssMinify.js +168 -0
- package/lib/css/data.js +5334 -0
- package/lib/css/syntax.js +9647 -232
- package/lib/debug/ProfilingPlugin.js +14 -9
- package/lib/deno/DenoTargetPlugin.js +1 -1
- package/lib/dependencies/AMDDefineDependency.js +112 -87
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
- package/lib/dependencies/AMDPlugin.js +9 -7
- package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
- package/lib/dependencies/AMDRequireContextDependency.js +2 -2
- package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
- package/lib/dependencies/AMDRequireDependency.js +8 -7
- package/lib/dependencies/AMDRequireItemDependency.js +1 -1
- package/lib/dependencies/AMDRuntimeModules.js +21 -1
- package/lib/dependencies/BuildTimeConstDependency.js +102 -0
- package/lib/dependencies/CachedConstDependency.js +11 -8
- package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
- package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
- package/lib/dependencies/CommonJsExportsDependency.js +53 -49
- package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
- package/lib/dependencies/CommonJsFullRequireDependency.js +119 -34
- package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -50
- package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
- package/lib/dependencies/CommonJsPlugin.js +35 -6
- package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
- package/lib/dependencies/CommonJsRequireDependency.js +170 -27
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
- package/lib/dependencies/ConstDependency.js +8 -9
- package/lib/dependencies/ContextDependency.js +12 -8
- package/lib/dependencies/ContextDependencyHelpers.js +14 -9
- package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +24 -11
- package/lib/dependencies/ContextElementDependency.js +31 -12
- package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
- package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
- package/lib/dependencies/CssIcssExportDependency.js +56 -28
- package/lib/dependencies/CssIcssImportDependency.js +17 -13
- package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
- package/lib/dependencies/CssImportDependency.js +18 -9
- package/lib/dependencies/CssUrlDependency.js +17 -13
- package/lib/dependencies/DllEntryDependency.js +1 -1
- package/lib/dependencies/DynamicExports.js +2 -2
- package/lib/dependencies/ExportBindingInitFragment.js +36 -9
- package/lib/dependencies/ExportsInfoDependency.js +7 -8
- package/lib/dependencies/ExternalModuleDependency.js +9 -5
- package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
- package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
- package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
- package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +23 -14
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +80 -12
- package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
- package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +286 -80
- package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
- package/lib/dependencies/HarmonyExports.js +7 -4
- package/lib/dependencies/HarmonyImportDependency.js +121 -60
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +124 -38
- package/lib/dependencies/HarmonyImportGuard.js +20 -30
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +152 -9
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
- package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
- package/lib/dependencies/HtmlEntryDependency.js +49 -31
- package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
- package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
- package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
- package/lib/dependencies/HtmlSourceDependency.js +22 -14
- package/lib/dependencies/ImportContextDependency.js +45 -5
- package/lib/dependencies/ImportDependency.js +33 -50
- package/lib/dependencies/ImportEagerDependency.js +6 -9
- package/lib/dependencies/ImportMetaContextDependency.js +2 -2
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
- package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
- package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
- package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
- package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
- package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
- package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
- package/lib/dependencies/ImportMetaPlugin.js +154 -71
- package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
- package/lib/dependencies/ImportParserPlugin.js +73 -49
- package/lib/dependencies/ImportPhase.js +12 -5
- package/lib/dependencies/ImportPlugin.js +7 -3
- package/lib/dependencies/ImportWeakDependency.js +6 -9
- package/lib/dependencies/JsonExportsDependency.js +11 -7
- package/lib/dependencies/LoaderDependency.js +2 -2
- package/lib/dependencies/LoaderImportDependency.js +2 -2
- package/lib/dependencies/LoaderPlugin.js +11 -7
- package/lib/dependencies/LocalModuleDependency.js +5 -5
- package/lib/dependencies/LocalModulesHelpers.js +1 -1
- package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
- package/lib/dependencies/ModuleDependency.js +9 -6
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
- package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
- package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
- package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
- package/lib/dependencies/NullDependency.js +3 -3
- package/lib/dependencies/ProvidedDependency.js +14 -10
- package/lib/dependencies/PureExpressionDependency.js +9 -10
- package/lib/dependencies/RequireContextDependency.js +2 -2
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
- package/lib/dependencies/RequireContextPlugin.js +8 -4
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
- package/lib/dependencies/RequireEnsureDependency.js +8 -7
- package/lib/dependencies/RequireEnsurePlugin.js +7 -3
- package/lib/dependencies/RequireHeaderDependency.js +50 -12
- package/lib/dependencies/RequireIncludeDependency.js +6 -6
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
- package/lib/dependencies/RequireIncludePlugin.js +7 -3
- package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
- package/lib/dependencies/RequireResolveContextDependency.js +2 -2
- package/lib/dependencies/RequireResolveDependency.js +4 -4
- package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
- package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
- package/lib/dependencies/StaticExportsDependency.js +2 -2
- package/lib/dependencies/SystemPlugin.js +10 -6
- package/lib/dependencies/SystemRuntimeModule.js +10 -0
- package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
- package/lib/dependencies/URLContextDependency.js +2 -2
- package/lib/dependencies/URLDependency.js +110 -64
- package/lib/dependencies/URLPlugin.js +7 -3
- package/lib/dependencies/UnsupportedDependency.js +4 -4
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
- package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
- package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
- package/lib/dependencies/WorkerAndWorkletPlugin.js +47 -28
- package/lib/dependencies/WorkerDependency.js +22 -22
- package/lib/dependencies/WorkletDependency.js +18 -21
- package/lib/dependencies/getFunctionExpression.js +8 -4
- package/lib/dependencies/importOptionsCheck.js +47 -0
- package/lib/dependencies/processExportInfo.js +5 -5
- package/lib/dll/DelegatedModule.js +34 -22
- package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
- package/lib/dll/DelegatedPlugin.js +2 -2
- package/lib/dll/DllEntryPlugin.js +2 -2
- package/lib/dll/DllModule.js +22 -15
- package/lib/dll/DllModuleFactory.js +7 -3
- package/lib/dll/DllPlugin.js +7 -5
- package/lib/dll/DllReferencePlugin.js +10 -7
- package/lib/dll/LibManifestPlugin.js +5 -5
- package/lib/electron/ElectronTargetPlugin.js +53 -49
- package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
- package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
- package/lib/errors/BroadContextsWarning.js +43 -0
- package/lib/errors/BuildCycleError.js +1 -1
- package/lib/errors/CacheEffectivenessWarning.js +55 -0
- package/lib/errors/ChunkRenderError.js +1 -1
- package/lib/errors/CircularDependenciesWarning.js +38 -0
- package/lib/errors/CodeGenerationError.js +1 -1
- package/lib/errors/CommentCompilationWarning.js +1 -1
- package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
- package/lib/errors/DotenvFileError.js +29 -0
- package/lib/errors/DuplicateModulesWarning.js +45 -0
- package/lib/errors/DynamicExportsWarning.js +30 -0
- package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
- package/lib/errors/EntrypointOverlapWarning.js +45 -0
- package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
- package/lib/errors/EvalUsageWarning.js +28 -0
- package/lib/errors/HookWebpackError.js +5 -5
- package/lib/errors/HotspotsWarning.js +57 -0
- package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
- package/lib/errors/ImportedBindingAssignmentError.js +30 -0
- package/lib/errors/InlinedAssetsWarning.js +36 -0
- package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
- package/lib/errors/LargeModulesWarning.js +45 -0
- package/lib/errors/LegacyJavascriptWarning.js +48 -0
- package/lib/errors/MissingSideEffectsWarning.js +36 -0
- package/lib/errors/MixedExportsWarning.js +41 -0
- package/lib/errors/ModuleDependencyError.js +13 -16
- package/lib/errors/ModuleDependencyWarning.js +5 -15
- package/lib/errors/ModuleHashingError.js +1 -1
- package/lib/errors/ModuleNotFoundError.js +2 -2
- package/lib/errors/ModuleParseError.js +1 -2
- package/lib/errors/ModuleRestoreError.js +1 -1
- package/lib/errors/ModuleStoreError.js +1 -1
- package/lib/errors/NodeStuffInWebError.js +1 -1
- package/lib/errors/OsDependentRuleWarning.js +31 -0
- package/lib/errors/PureAnnotationsWarning.js +36 -0
- package/lib/errors/RedundantDynamicImportWarning.js +31 -0
- package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
- package/lib/errors/SplitChunksCappedWarning.js +41 -0
- package/lib/errors/TinyChunksWarning.js +40 -0
- package/lib/errors/TopLevelThisWarning.js +34 -0
- package/lib/errors/UnsplitVendorsWarning.js +42 -0
- package/lib/errors/UnsupportedFeatureWarning.js +1 -1
- package/lib/errors/UnusedAliasesWarning.js +29 -0
- package/lib/errors/UnusedDefinesWarning.js +29 -0
- package/lib/errors/UnusedExternalsWarning.js +29 -0
- package/lib/errors/UnusedReexportsWarning.js +42 -0
- package/lib/errors/UnusedRuleWarning.js +29 -0
- package/lib/errors/WebpackError.js +9 -5
- package/lib/errors/deriveStackFromNestedError.js +90 -0
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
- package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
- package/lib/esm/ModuleChunkLoadingPlugin.js +86 -51
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +161 -62
- package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
- package/lib/hmr/LazyCompilationPlugin.js +45 -24
- package/lib/hmr/lazyCompilationBackend.js +9 -6
- package/lib/hmr/parserHooks.js +56 -0
- package/lib/html/HtmlGenerator.js +277 -77
- package/lib/html/HtmlModule.js +7 -3
- package/lib/html/HtmlModulesPlugin.js +366 -200
- package/lib/html/HtmlParser.js +31 -86
- package/lib/html/data.js +1928 -0
- package/lib/html/htmlMinify.js +288 -0
- package/lib/html/syntax.js +6034 -1384
- package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
- package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
- package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
- package/lib/ids/HashedModuleIdsPlugin.js +6 -2
- package/lib/ids/IdHelpers.js +7 -8
- package/lib/ids/NamedChunkIdsPlugin.js +1 -1
- package/lib/ids/NamedModuleIdsPlugin.js +1 -1
- package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
- package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
- package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
- package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
- package/lib/ids/SyncModuleIdsPlugin.js +4 -4
- package/lib/index.js +10 -0
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
- package/lib/javascript/BasicEvaluatedExpression.js +18 -14
- package/lib/javascript/ChunkFormatHelpers.js +6 -6
- package/lib/javascript/ChunkHelpers.js +1 -1
- package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
- package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
- package/lib/javascript/JavascriptGenerator.js +65 -165
- package/lib/javascript/JavascriptModule.js +9 -3
- package/lib/javascript/JavascriptModulesPlugin.js +103 -123
- package/lib/javascript/JavascriptParser.js +242 -99
- package/lib/javascript/JavascriptParserHelpers.js +10 -7
- package/lib/javascript/ScopeAnalyzer.js +1094 -0
- package/lib/javascript/StartupHelpers.js +55 -9
- package/lib/javascript/syntax.js +2678 -232
- package/lib/json/JsonData.js +8 -4
- package/lib/json/JsonGenerator.js +38 -16
- package/lib/json/JsonModule.js +7 -3
- package/lib/json/JsonModulesPlugin.js +1 -1
- package/lib/json/JsonParser.js +5 -6
- package/lib/library/AbstractLibraryPlugin.js +20 -14
- package/lib/library/AmdLibraryPlugin.js +11 -7
- package/lib/library/AssignLibraryPlugin.js +19 -13
- package/lib/library/EnableLibraryPlugin.js +2 -2
- package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
- package/lib/library/JsonpLibraryPlugin.js +11 -7
- package/lib/library/ModuleLibraryPlugin.js +256 -64
- package/lib/library/SystemLibraryPlugin.js +12 -8
- package/lib/library/UmdLibraryPlugin.js +62 -25
- package/lib/loaders/LoaderRunner.js +47 -6
- package/lib/loaders/loadLoader.js +8 -4
- package/lib/logging/createConsoleLogger.js +7 -4
- package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
- package/lib/node/NodeEnvironmentPlugin.js +17 -3
- package/lib/node/NodeSourcePlugin.js +1 -1
- package/lib/node/NodeTargetPlugin.js +4 -3
- package/lib/node/NodeTemplatePlugin.js +1 -1
- package/lib/node/NodeWatchFileSystem.js +70 -9
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +65 -19
- package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
- package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
- package/lib/node/nodeConsole.js +7 -3
- package/lib/optimize/AggressiveMergingPlugin.js +2 -2
- package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
- package/lib/optimize/ConcatenatedModule.js +1030 -476
- package/lib/optimize/ConstExportsPlugin.js +16 -7
- package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
- package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
- package/lib/optimize/InlineExports.js +130 -5
- package/lib/optimize/InnerGraph.js +28 -12
- package/lib/optimize/InnerGraphPlugin.js +23 -18
- package/lib/optimize/LimitChunkCountPlugin.js +7 -3
- package/lib/optimize/MangleExportsPlugin.js +7 -8
- package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
- package/lib/optimize/MinChunkSizePlugin.js +7 -3
- package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
- package/lib/optimize/RealContentHashPlugin.js +121 -41
- package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
- package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
- package/lib/optimize/RuntimeChunkPlugin.js +2 -2
- package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
- package/lib/optimize/SplitChunksPlugin.js +86 -24
- package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
- package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
- package/lib/performance/BroadContextsPlugin.js +142 -0
- package/lib/performance/CacheEffectivenessPlugin.js +125 -0
- package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
- package/lib/performance/DuplicateModulesPlugin.js +93 -0
- package/lib/performance/DuplicatePackagesPlugin.js +119 -0
- package/lib/performance/DuplicatePackagesWarning.js +84 -0
- package/lib/performance/DynamicExportsPlugin.js +120 -0
- package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
- package/lib/performance/EntrypointOverlapPlugin.js +122 -0
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
- package/lib/performance/EvalUsagePlugin.js +115 -0
- package/lib/performance/HotspotsPlugin.js +296 -0
- package/lib/performance/InlinedAssetsPlugin.js +99 -0
- package/lib/performance/LargeModulesPlugin.js +126 -0
- package/lib/performance/LegacyJavascriptPlugin.js +139 -0
- package/lib/performance/MissingSideEffectsPlugin.js +138 -0
- package/lib/performance/MixedExportsPlugin.js +136 -0
- package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
- package/lib/performance/PureAnnotationsPlugin.js +219 -0
- package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
- package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
- package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
- package/lib/performance/SizeLimitsPlugin.js +139 -7
- package/lib/performance/SplitChunksCappedPlugin.js +99 -0
- package/lib/performance/TinyChunksPlugin.js +128 -0
- package/lib/performance/TopLevelThisPlugin.js +208 -0
- package/lib/performance/UnsplitVendorsPlugin.js +112 -0
- package/lib/performance/UnusedAliasesPlugin.js +253 -0
- package/lib/performance/UnusedDefinesPlugin.js +87 -0
- package/lib/performance/UnusedExternalsPlugin.js +110 -0
- package/lib/performance/UnusedReexportsPlugin.js +159 -0
- package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
- package/lib/performance/getModuleSize.js +22 -0
- package/lib/performance/getSourceModules.js +22 -0
- package/lib/performance/hasOnlyUnusedExports.js +40 -0
- package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
- package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
- package/lib/prefetch/ResourceHintPlugin.js +295 -79
- package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
- package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
- package/lib/prefetch/parseResourceHintOptions.js +31 -4
- package/lib/rules/BasicEffectRulePlugin.js +2 -2
- package/lib/rules/BasicMatcherRulePlugin.js +8 -4
- package/lib/rules/GlobMatcherRulePlugin.js +68 -0
- package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
- package/lib/rules/RuleSetCompiler.js +146 -12
- package/lib/rules/UseEffectRulePlugin.js +18 -11
- package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
- package/lib/runtime/AsyncModuleRuntimeModule.js +6 -2
- package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
- package/lib/runtime/BaseUriRuntimeModule.js +33 -7
- package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
- package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
- package/lib/runtime/CompatRuntimeModule.js +5 -3
- package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
- package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
- package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
- package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
- package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
- package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
- package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
- package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
- package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
- package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
- package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
- package/lib/runtime/GlobalRuntimeModule.js +18 -0
- package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
- package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +34 -7
- package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
- package/lib/runtime/NonceRuntimeModule.js +10 -0
- package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
- package/lib/runtime/PublicPathRuntimeModule.js +12 -2
- package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
- package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
- package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
- package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
- package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
- package/lib/runtime/SystemContextRuntimeModule.js +10 -0
- package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
- package/lib/runtime/WorkerRuntimeModule.js +11 -1
- package/lib/runtime/baseUri.js +63 -0
- package/lib/schemes/DataUriPlugin.js +1 -1
- package/lib/schemes/FileUriPlugin.js +1 -1
- package/lib/schemes/HttpUriPlugin.js +46 -20
- package/lib/schemes/VirtualUrlPlugin.js +13 -7
- package/lib/serialization/AggregateErrorSerializer.js +1 -1
- package/lib/serialization/BinaryMiddleware.js +4 -4
- package/lib/serialization/ErrorObjectSerializer.js +1 -1
- package/lib/serialization/FileMiddleware.js +22 -9
- package/lib/serialization/ObjectMiddleware.js +139 -114
- package/lib/serialization/PlainObjectSerializer.js +19 -16
- package/lib/sharing/ConsumeSharedModule.js +30 -21
- package/lib/sharing/ConsumeSharedPlugin.js +18 -10
- package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
- package/lib/sharing/ProvideSharedModule.js +25 -16
- package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
- package/lib/sharing/ProvideSharedPlugin.js +8 -4
- package/lib/sharing/SharePlugin.js +17 -5
- package/lib/sharing/ShareRuntimeModule.js +4 -4
- package/lib/sharing/resolveMatchedConfigs.js +9 -6
- package/lib/sharing/utils.js +1 -3
- package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
- package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
- package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
- package/lib/stats/StatsFactory.js +25 -26
- package/lib/stats/StatsPrinter.js +16 -12
- package/lib/typescript/TypeScriptPlugin.js +20 -24
- package/lib/url/URLParserPlugin.js +26 -13
- package/lib/util/ArrayQueue.js +3 -3
- package/lib/util/AsyncQueue.js +4 -3
- package/lib/util/Hash.js +5 -1
- package/lib/util/LazySet.js +35 -22
- package/lib/util/LocConverter.js +36 -13
- package/lib/util/SourceProcessor.js +1066 -24
- package/lib/util/StringXor.js +1 -1
- package/lib/util/URLAbsoluteSpecifier.js +3 -1
- package/lib/util/chainedImports.js +9 -5
- package/lib/util/cleverMerge.js +1 -1
- package/lib/util/comparators.js +45 -14
- package/lib/util/concatenate.js +203 -77
- package/lib/util/conventions.js +10 -2
- package/lib/util/createHash.js +2 -2
- package/lib/util/createHooksRegistry.js +8 -10
- package/lib/util/createMappings.js +25 -3
- package/lib/util/dataURL.js +225 -1
- package/lib/util/extractSourceMap.js +4 -3
- package/lib/util/findCaseMismatch.js +139 -0
- package/lib/util/formatLocation.js +1 -2
- package/lib/util/fs.js +22 -5
- package/lib/util/globUtils.js +298 -24
- package/lib/util/hash/BatchedHash.js +5 -1
- package/lib/util/hash/BulkUpdateHash.js +5 -1
- package/lib/util/hash/DebugHash.js +5 -1
- package/lib/util/hash/hash-digest.js +6 -2
- package/lib/util/identifier.js +4 -0
- package/lib/util/implicitTypeLoaderFallback.js +1 -1
- package/lib/util/internalSerializables.js +8 -0
- package/lib/util/lazyModule.js +56 -0
- package/lib/util/makeSerializable.js +7 -3
- package/lib/util/matchAlias.js +25 -0
- package/lib/util/mimeTypes.js +11 -5
- package/lib/util/nonNumericOnlyHash.js +4 -3
- package/lib/util/parseJson.js +5 -3
- package/lib/util/preloadModuleType.js +32 -0
- package/lib/util/registerExternalSerializer.js +7 -5
- package/lib/util/removeBOM.js +82 -1
- package/lib/util/runtime.js +2 -2
- package/lib/util/semver.js +1 -1
- package/lib/util/serialization.js +28 -28
- package/lib/util/source.js +2 -2
- package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
- package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
- package/lib/wasm/wasmModuleFilename.js +54 -0
- package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +43 -21
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +45 -21
- package/lib/wasm-async/AsyncWasmModule.js +3 -3
- package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
- package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
- package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
- package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +29 -8
- package/lib/wasm-sync/SyncWasmModule.js +2 -2
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
- package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
- package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
- package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
- package/lib/wasm-sync/WebAssemblyParser.js +4 -6
- package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
- package/lib/web/FetchCompileAsyncWasmPlugin.js +105 -19
- package/lib/web/FetchCompileWasmPlugin.js +48 -16
- package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
- package/lib/web/JsonpTemplatePlugin.js +2 -2
- package/lib/webpack.js +22 -11
- package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
- package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
- package/module.d.ts +1 -0
- package/package.json +32 -25
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +667 -34
- package/schemas/plugins/HtmlParserOptions.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.json +10 -0
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssParserOptions.check.js +1 -1
- package/types.d.ts +3223 -465
- package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
|
@@ -14,12 +14,8 @@ const HotUpdateChunk = require("../HotUpdateChunk");
|
|
|
14
14
|
const { HTML_TYPE } = require("../ModuleSourceTypeConstants");
|
|
15
15
|
const { HTML_MODULE_TYPE } = require("../ModuleTypeConstants");
|
|
16
16
|
const NormalModule = require("../NormalModule");
|
|
17
|
+
const { toTemplateSourceFileName } = require("../TemplatedPathPlugin");
|
|
17
18
|
const ConstDependency = require("../dependencies/ConstDependency");
|
|
18
|
-
const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
|
|
19
|
-
const HtmlInlineHtmlDependency = require("../dependencies/HtmlInlineHtmlDependency");
|
|
20
|
-
const HtmlInlineScriptDependency = require("../dependencies/HtmlInlineScriptDependency");
|
|
21
|
-
const HtmlInlineStyleDependency = require("../dependencies/HtmlInlineStyleDependency");
|
|
22
|
-
const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
|
|
23
19
|
const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
|
|
24
20
|
const WebpackError = require("../errors/WebpackError");
|
|
25
21
|
const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
|
|
@@ -28,24 +24,40 @@ const createHash = require("../util/createHash");
|
|
|
28
24
|
const createHooksRegistry = require("../util/createHooksRegistry");
|
|
29
25
|
const { getUndoPath, makePathsRelative } = require("../util/identifier");
|
|
30
26
|
const implicitTypeLoaderFallback = require("../util/implicitTypeLoaderFallback");
|
|
27
|
+
const lazyModule = require("../util/lazyModule");
|
|
31
28
|
const memoize = require("../util/memoize");
|
|
32
29
|
const { digestNonNumericOnly } = require("../util/nonNumericOnlyHash");
|
|
30
|
+
const preloadModuleType = require("../util/preloadModuleType");
|
|
33
31
|
const {
|
|
34
32
|
PUBLIC_PATH_AUTO: autoPlaceholder
|
|
35
33
|
} = require("../util/publicPathPlaceholder");
|
|
36
|
-
const
|
|
37
|
-
const HtmlGenerator = require("./HtmlGenerator");
|
|
34
|
+
const { removeBOMFromResult } = require("../util/removeBOM");
|
|
38
35
|
const HtmlModule = require("./HtmlModule");
|
|
39
|
-
const HtmlParser = require("./HtmlParser");
|
|
40
|
-
const { escapeAttribute } = require("./syntax");
|
|
41
36
|
|
|
42
|
-
|
|
37
|
+
const getMimeTypes = memoize(() => require("../util/mimeTypes"));
|
|
38
|
+
|
|
39
|
+
const getHtmlSyntax = memoize(() => require("./syntax"));
|
|
40
|
+
|
|
41
|
+
// Lazy: this plugin is applied on every build (`experiments.html` defaults on),
|
|
42
|
+
// but the HTML parser and tokenizer are only reached once HTML is in the graph.
|
|
43
|
+
const getHtmlParser = lazyModule(() => require("./HtmlParser"));
|
|
44
|
+
|
|
45
|
+
// html generation only happens once a build actually has an html module
|
|
46
|
+
const getHtmlGenerator = memoize(() => require("./HtmlGenerator"));
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @import {
|
|
50
|
+
* EntryDescriptionNormalized,
|
|
51
|
+
* OutputHtmlOptions,
|
|
52
|
+
* HtmlFaviconIcon
|
|
53
|
+
* } from "../../declarations/WebpackOptions"
|
|
54
|
+
*/
|
|
43
55
|
/** @typedef {import("../../declarations/WebpackOptions").OutputHtmlOptions["favicon"]} FaviconOption */
|
|
44
56
|
/** @typedef {import("../../declarations/WebpackOptions").OutputHtmlOptions["manifest"]} ManifestOption */
|
|
45
|
-
/** @typedef {import("../../declarations/WebpackOptions").HtmlFaviconIcon} HtmlFaviconIcon */
|
|
46
57
|
/** @typedef {Exclude<HtmlFaviconIcon, string>} FaviconIcon */
|
|
47
|
-
/** @
|
|
48
|
-
/** @
|
|
58
|
+
/** @import Compiler from "../Compiler" */
|
|
59
|
+
/** @import { HtmlModuleBuildInfo } from "./HtmlModule" */
|
|
60
|
+
/** @import HtmlParser from "./HtmlParser" */
|
|
49
61
|
/** @typedef {{ request: string, entryName: string, type: "script" | "script-module" | "modulepreload" | "stylesheet" | "html" | "preload" | "prefetch", css?: boolean }} HtmlEntryInfo */
|
|
50
62
|
|
|
51
63
|
/** @typedef {{ outputName: string }} HtmlTransformHtmlContext */
|
|
@@ -114,7 +126,6 @@ const DEFAULT_FAVICON = new URL("./favicon.svg", pathToFileURL(__filename))
|
|
|
114
126
|
.href;
|
|
115
127
|
|
|
116
128
|
// mime-db is heavy — only load it when a favicon actually needs a `type`.
|
|
117
|
-
const getMimeTypes = memoize(() => require("../util/mimeTypes"));
|
|
118
129
|
|
|
119
130
|
/**
|
|
120
131
|
* Resolves `output.html.favicon` for one page to `[rel, icon]` pairs.
|
|
@@ -150,6 +161,7 @@ const resolveFaviconLinks = (favicon, name) => {
|
|
|
150
161
|
* @returns {string} a `<link rel=… [attrs…] href=…>` tag; `type` defaults to the file format
|
|
151
162
|
*/
|
|
152
163
|
const faviconLinkTag = (rel, icon) => {
|
|
164
|
+
const { escapeAttribute } = getHtmlSyntax();
|
|
153
165
|
const type = icon.type || getMimeTypes().lookup(icon.href) || "";
|
|
154
166
|
const attrs = [
|
|
155
167
|
`rel="${escapeAttribute(rel)}"`,
|
|
@@ -186,12 +198,33 @@ const manifestLinkTag = (manifest, name) => {
|
|
|
186
198
|
JSON.stringify(value),
|
|
187
199
|
"utf8"
|
|
188
200
|
).toString("base64")}`;
|
|
189
|
-
return `<link rel="manifest" href="${escapeAttribute(
|
|
201
|
+
return `<link rel="manifest" href="${getHtmlSyntax().escapeAttribute(
|
|
202
|
+
href
|
|
203
|
+
)}">`;
|
|
190
204
|
};
|
|
191
205
|
|
|
206
|
+
// Decided while the page's HTML is generated, which happens once per module —
|
|
207
|
+
// and one synthetic page module can back several entries — so an entry's `html`
|
|
208
|
+
// object can't override it.
|
|
209
|
+
/** @type {"inline"[]} */
|
|
210
|
+
const GLOBAL_ONLY_HTML_OPTIONS = ["inline"];
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* SRI is on when `integrity` names at least one algorithm.
|
|
214
|
+
* @param {OutputHtmlOptions["integrity"]} integrity integrity option
|
|
215
|
+
* @returns {boolean} true when integrity attributes must be emitted
|
|
216
|
+
*/
|
|
217
|
+
const isIntegrityEnabled = (integrity) =>
|
|
218
|
+
integrity === true ||
|
|
219
|
+
typeof integrity === "function" ||
|
|
220
|
+
(Array.isArray(integrity) && integrity.length > 0);
|
|
221
|
+
|
|
192
222
|
// `\.html`/`\.css` request matchers for the synthetic `output.html` wrapper.
|
|
193
223
|
const HTML_REQUEST_RE = /\.html(\?|$)/i;
|
|
194
224
|
const CSS_REQUEST_RE = /\.css(\?|$)/i;
|
|
225
|
+
// The wrapper's own resource — the media type must end here, so that a
|
|
226
|
+
// `data:text/htmlx,` entry (JavaScript to `DataUriPlugin`) is not one.
|
|
227
|
+
const HTML_DATA_URL_RE = /^data:text\/html[,;]/i;
|
|
195
228
|
|
|
196
229
|
/**
|
|
197
230
|
* Requests an `output.html` page must load for an entry: its `dependOn`
|
|
@@ -208,7 +241,12 @@ const collectHtmlEntryRequests = (name, entries) => {
|
|
|
208
241
|
const seenRequests = new Set();
|
|
209
242
|
/** @type {Set<string>} */
|
|
210
243
|
const visited = new Set();
|
|
211
|
-
|
|
244
|
+
/**
|
|
245
|
+
* Collects an entry's non-html requests, `dependOn` entries included.
|
|
246
|
+
* @param {string} entryName entry to walk
|
|
247
|
+
* @returns {void}
|
|
248
|
+
*/
|
|
249
|
+
const walk = (entryName) => {
|
|
212
250
|
if (visited.has(entryName)) return;
|
|
213
251
|
visited.add(entryName);
|
|
214
252
|
const desc = entries[entryName];
|
|
@@ -299,25 +337,59 @@ class HtmlModulesPlugin {
|
|
|
299
337
|
apply(compiler) {
|
|
300
338
|
const { output } = compiler.options;
|
|
301
339
|
const htmlOption = output.html;
|
|
302
|
-
const
|
|
303
|
-
|
|
304
|
-
//
|
|
305
|
-
//
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
new WebpackError(
|
|
313
|
-
`output.html.scriptLoading: "${scriptLoading}" is ignored with output.module — ES module scripts are always deferred.`
|
|
314
|
-
)
|
|
315
|
-
);
|
|
316
|
-
});
|
|
340
|
+
const globalHtmlOptions =
|
|
341
|
+
typeof htmlOption === "object" ? htmlOption : undefined;
|
|
342
|
+
// Collected while entries are resolved (`entryOption`, before the first
|
|
343
|
+
// compilation) and reported on every compilation; a Set dedupes entries
|
|
344
|
+
// that hit the same problem.
|
|
345
|
+
/** @type {Set<string>} */
|
|
346
|
+
const optionWarnings = new Set();
|
|
347
|
+
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
|
|
348
|
+
for (const message of optionWarnings) {
|
|
349
|
+
compilation.warnings.push(new WebpackError(message));
|
|
317
350
|
}
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
// Resolved options per entry that owns a generated page, read back when the
|
|
354
|
+
// page is emitted (`csp`, `integrity`) — one synthetic page module can back
|
|
355
|
+
// several entries, so those can only be applied per emitted asset.
|
|
356
|
+
/** @type {Map<string, OutputHtmlOptions>} */
|
|
357
|
+
const htmlOptionsByEntry = new Map();
|
|
358
|
+
// SRI sentinels are emitted while the page's HTML is generated, before the
|
|
359
|
+
// owning entry is known, so any page asking for integrity turns them on for
|
|
360
|
+
// all of them; pages that don't want SRI drop them again on emit. Authored
|
|
361
|
+
// `.html` pages never reach the entry hook, hence the global seed.
|
|
362
|
+
let anyIntegrity = isIntegrityEnabled(
|
|
363
|
+
globalHtmlOptions && globalHtmlOptions.integrity
|
|
364
|
+
);
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Options for one page: an entry's `html` object overrides `output.html`
|
|
368
|
+
* option by option, `true` inherits it as-is.
|
|
369
|
+
* @param {EntryDescriptionNormalized["html"]} html the entry's `html` value
|
|
370
|
+
* @param {string} name entry name
|
|
371
|
+
* @returns {OutputHtmlOptions} resolved options
|
|
372
|
+
*/
|
|
373
|
+
const resolveHtmlOptions = (html, name) => {
|
|
374
|
+
const options =
|
|
375
|
+
typeof html !== "object"
|
|
376
|
+
? globalHtmlOptions || {}
|
|
377
|
+
: globalHtmlOptions
|
|
378
|
+
? { ...globalHtmlOptions, ...html }
|
|
379
|
+
: html;
|
|
380
|
+
if (typeof html === "object") {
|
|
381
|
+
for (const option of GLOBAL_ONLY_HTML_OPTIONS) {
|
|
382
|
+
if (html[option] !== undefined) {
|
|
383
|
+
optionWarnings.add(
|
|
384
|
+
`entry "${name}" html.${option} is ignored — ${option} is resolved once per generated page and can only be set on output.html.`
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
htmlOptionsByEntry.set(name, options);
|
|
390
|
+
if (isIntegrityEnabled(options.integrity)) anyIntegrity = true;
|
|
391
|
+
return options;
|
|
392
|
+
};
|
|
321
393
|
|
|
322
394
|
// `output.html` (or an entry's `html`) wraps a non-HTML entry in a
|
|
323
395
|
// synthetic HTML module so the existing pipeline injects its JS/CSS
|
|
@@ -329,6 +401,9 @@ class HtmlModulesPlugin {
|
|
|
329
401
|
EntryOptionPlugin.getHooks(compiler).entry.tap(
|
|
330
402
|
PLUGIN_NAME,
|
|
331
403
|
(context, name, desc) => {
|
|
404
|
+
// Resolved for every entry, including the authored `.html` ones that
|
|
405
|
+
// need no wrapper below — their page reads back `csp`/`integrity` too.
|
|
406
|
+
const htmlObj = resolveHtmlOptions(desc.html, name);
|
|
332
407
|
const html = desc.html !== undefined ? desc.html : htmlOption;
|
|
333
408
|
const imports = desc.import;
|
|
334
409
|
if (
|
|
@@ -338,6 +413,26 @@ class HtmlModulesPlugin {
|
|
|
338
413
|
) {
|
|
339
414
|
return;
|
|
340
415
|
}
|
|
416
|
+
const scriptLoading = htmlObj.scriptLoading || "auto";
|
|
417
|
+
// ESM output emits `type="module"` (already deferred), so
|
|
418
|
+
// scriptLoading is ignored under output.module — warn on an
|
|
419
|
+
// explicit defer/blocking.
|
|
420
|
+
let scriptAttr = " defer";
|
|
421
|
+
if (output.module) {
|
|
422
|
+
scriptAttr = "";
|
|
423
|
+
if (scriptLoading === "defer" || scriptLoading === "blocking") {
|
|
424
|
+
const source =
|
|
425
|
+
typeof desc.html === "object" &&
|
|
426
|
+
desc.html.scriptLoading !== undefined
|
|
427
|
+
? `entry "${name}" html`
|
|
428
|
+
: "output.html";
|
|
429
|
+
optionWarnings.add(
|
|
430
|
+
`${source}.scriptLoading: "${scriptLoading}" is ignored with output.module — ES module scripts are always deferred.`
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
} else if (scriptLoading === "blocking") {
|
|
434
|
+
scriptAttr = "";
|
|
435
|
+
}
|
|
341
436
|
const entries = compiler.options.entry;
|
|
342
437
|
const requests =
|
|
343
438
|
typeof entries === "object" && entries[name]
|
|
@@ -352,27 +447,13 @@ class HtmlModulesPlugin {
|
|
|
352
447
|
scripts.push(`<script${scriptAttr} src="${r}"></script>`);
|
|
353
448
|
}
|
|
354
449
|
}
|
|
355
|
-
const
|
|
356
|
-
typeof html === "object"
|
|
357
|
-
? html
|
|
358
|
-
: typeof htmlOption === "object"
|
|
359
|
-
? htmlOption
|
|
360
|
-
: {};
|
|
361
|
-
const headTags = HtmlParser.buildHeadTags(htmlObj);
|
|
450
|
+
const headTags = getHtmlSyntax().buildHeadTags(htmlObj);
|
|
362
451
|
// Injected into webpack-generated pages only; each icon's href is a
|
|
363
452
|
// normal request the parser turns into a hashed asset.
|
|
364
|
-
const favicon
|
|
365
|
-
typeof html === "object" && html.favicon !== undefined
|
|
366
|
-
? html.favicon
|
|
367
|
-
: false;
|
|
368
|
-
const faviconTag = resolveFaviconLinks(favicon, name)
|
|
453
|
+
const faviconTag = resolveFaviconLinks(htmlObj.favicon, name)
|
|
369
454
|
.map(([rel, icon]) => faviconLinkTag(rel, icon))
|
|
370
455
|
.join("");
|
|
371
|
-
const manifest
|
|
372
|
-
typeof html === "object" && html.manifest !== undefined
|
|
373
|
-
? html.manifest
|
|
374
|
-
: false;
|
|
375
|
-
const manifestTag = manifestLinkTag(manifest, name);
|
|
456
|
+
const manifestTag = manifestLinkTag(htmlObj.manifest, name);
|
|
376
457
|
const inject = htmlObj.inject;
|
|
377
458
|
const scriptsInHead =
|
|
378
459
|
inject === "head" || (inject !== "body" && output.module);
|
|
@@ -402,12 +483,13 @@ class HtmlModulesPlugin {
|
|
|
402
483
|
// `<link rel="modulepreload">` intact.
|
|
403
484
|
// Per-compilation state: the HTML modules seen during make (so
|
|
404
485
|
// `finishMake` creates their entries without scanning the whole module
|
|
405
|
-
// graph)
|
|
406
|
-
|
|
486
|
+
// graph), the stylesheet entry names (read in `afterChunks`) and the html
|
|
487
|
+
// options of every emitted page, keyed by its asset name.
|
|
488
|
+
/** @type {WeakMap<import("../Compilation"), { htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetOptions: Map<string, OutputHtmlOptions> }>} */
|
|
407
489
|
const compilationState = new WeakMap();
|
|
408
490
|
/**
|
|
409
491
|
* @param {import("../Compilation")} compilation compilation
|
|
410
|
-
* @returns {{ htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>,
|
|
492
|
+
* @returns {{ htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetOptions: Map<string, OutputHtmlOptions> }} per-compilation state
|
|
411
493
|
*/
|
|
412
494
|
const getState = (compilation) => {
|
|
413
495
|
let state = compilationState.get(compilation);
|
|
@@ -415,7 +497,7 @@ class HtmlModulesPlugin {
|
|
|
415
497
|
state = {
|
|
416
498
|
htmlModules: new Set(),
|
|
417
499
|
stylesheetEntries: new Set(),
|
|
418
|
-
|
|
500
|
+
htmlAssetOptions: new Map()
|
|
419
501
|
};
|
|
420
502
|
compilationState.set(compilation, state);
|
|
421
503
|
}
|
|
@@ -515,15 +597,10 @@ class HtmlModulesPlugin {
|
|
|
515
597
|
);
|
|
516
598
|
});
|
|
517
599
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
typeof integrity === "function" ||
|
|
523
|
-
(Array.isArray(integrity) && integrity.length > 0);
|
|
524
|
-
// `output.html.csp` injects a `<meta http-equiv="Content-Security-Policy">`
|
|
525
|
-
// once the page's inline content is final (in `processAssets` below).
|
|
526
|
-
const csp = typeof htmlOption === "object" ? htmlOption.csp : undefined;
|
|
600
|
+
// `csp` injects a `<meta http-equiv="Content-Security-Policy">` and
|
|
601
|
+
// `integrity` resolves the SRI sentinels — both once the page's inline
|
|
602
|
+
// content is final (in `processAssets` below), per page, so an entry's
|
|
603
|
+
// `html` can override them.
|
|
527
604
|
// `"auto"` marks implicit enablement (no user rule for HTML files) — see
|
|
528
605
|
// `applyExperimentsDefaults`. Only then loaders win over the built-in type
|
|
529
606
|
// (e.g. html-webpack-plugin's template loader in its child compiler).
|
|
@@ -541,13 +618,20 @@ class HtmlModulesPlugin {
|
|
|
541
618
|
);
|
|
542
619
|
}
|
|
543
620
|
const { htmlModules } = getState(compilation);
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
621
|
+
/**
|
|
622
|
+
* Records HTML modules as they are built or restored, so `finishMake`
|
|
623
|
+
* creates their entries without scanning the whole module graph.
|
|
624
|
+
* @param {import("../Module")} module built or restored module
|
|
625
|
+
* @returns {void}
|
|
626
|
+
*/
|
|
627
|
+
const trackHtmlModule = (module) => {
|
|
628
|
+
if (module.type !== HTML_MODULE_TYPE) return;
|
|
629
|
+
// enabled here, not on the compilation hook: an integrity build
|
|
630
|
+
// with no html module must not load the generator
|
|
631
|
+
if (anyIntegrity) {
|
|
632
|
+
getHtmlGenerator().enableIntegritySentinels(compilation);
|
|
633
|
+
}
|
|
634
|
+
htmlModules.add(module);
|
|
551
635
|
};
|
|
552
636
|
compilation.hooks.succeedModule.tap(PLUGIN_NAME, trackHtmlModule);
|
|
553
637
|
compilation.hooks.stillValidModule.tap(PLUGIN_NAME, trackHtmlModule);
|
|
@@ -559,7 +643,7 @@ class HtmlModulesPlugin {
|
|
|
559
643
|
// with CORS; without `output.crossOriginLoading` the browser
|
|
560
644
|
// silently ignores `integrity` on cross-origin loads. Warn once
|
|
561
645
|
// so a CDN deployment doesn't ship no-op integrity attributes.
|
|
562
|
-
if (
|
|
646
|
+
if (anyIntegrity && !compilation.outputOptions.crossOriginLoading) {
|
|
563
647
|
compilation.warnings.push(
|
|
564
648
|
new WebpackError(
|
|
565
649
|
'output.html.integrity is set but output.crossOriginLoading is not. Browsers ignore Subresource Integrity on cross-origin requests made without CORS; set output.crossOriginLoading (e.g. "anonymous") if any asset is served from a different origin.'
|
|
@@ -572,29 +656,32 @@ class HtmlModulesPlugin {
|
|
|
572
656
|
stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_HASH + 1
|
|
573
657
|
},
|
|
574
658
|
async (assets) => {
|
|
575
|
-
const {
|
|
659
|
+
const { htmlAssetOptions } = getState(compilation);
|
|
576
660
|
const hooks = HtmlModulesPlugin.getCompilationHooks(compilation);
|
|
577
661
|
/** @type {Set<string>} */
|
|
578
662
|
const inlinedFiles = new Set();
|
|
579
663
|
for (const name of Object.keys(assets)) {
|
|
580
|
-
|
|
664
|
+
const pageOptions = htmlAssetOptions.get(name);
|
|
665
|
+
if (pageOptions === undefined) continue;
|
|
581
666
|
const content = assets[name].source();
|
|
582
667
|
if (typeof content !== "string") continue;
|
|
668
|
+
const { csp, integrity } = pageOptions;
|
|
583
669
|
let resolved = content;
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
670
|
+
// Sentinels are emitted whenever any page wants SRI, so a page
|
|
671
|
+
// that doesn't drops them again here.
|
|
672
|
+
if (resolved.includes("__WEBPACK_HTML_INTEGRITY__")) {
|
|
673
|
+
resolved = isIntegrityEnabled(integrity)
|
|
674
|
+
? getHtmlGenerator().resolveChunkIntegritySentinels(
|
|
675
|
+
resolved,
|
|
676
|
+
compilation,
|
|
677
|
+
/** @type {import("./HtmlGenerator").HtmlIntegrity} */ (
|
|
678
|
+
integrity
|
|
679
|
+
)
|
|
680
|
+
)
|
|
681
|
+
: getHtmlGenerator().stripChunkIntegritySentinels(resolved);
|
|
595
682
|
}
|
|
596
683
|
if (resolved.includes("__WEBPACK_HTML_INLINE__")) {
|
|
597
|
-
resolved =
|
|
684
|
+
resolved = getHtmlGenerator().resolveChunkInlineSentinels(
|
|
598
685
|
resolved,
|
|
599
686
|
compilation,
|
|
600
687
|
name,
|
|
@@ -613,15 +700,15 @@ class HtmlModulesPlugin {
|
|
|
613
700
|
});
|
|
614
701
|
const transformTags = hooks.transformTags.taps.length > 0;
|
|
615
702
|
if (injected.length > 0 || transformTags || csp) {
|
|
616
|
-
const model =
|
|
617
|
-
|
|
703
|
+
const model = getHtmlGenerator().collectHtml(resolved);
|
|
704
|
+
getHtmlGenerator().addInjectedTags(model, injected);
|
|
618
705
|
if (transformTags) {
|
|
619
706
|
await hooks.transformTags.promise(model.tags, {
|
|
620
707
|
outputName: name,
|
|
621
708
|
html: resolved
|
|
622
709
|
});
|
|
623
710
|
}
|
|
624
|
-
resolved =
|
|
711
|
+
resolved = getHtmlGenerator().renderHtml(resolved, model, csp);
|
|
625
712
|
}
|
|
626
713
|
// Final, fully-resolved HTML — let plugins transform it (minify,
|
|
627
714
|
// inject a CSP meta, rewrite tags) before it is written.
|
|
@@ -636,28 +723,64 @@ class HtmlModulesPlugin {
|
|
|
636
723
|
// An inlined chunk file is dead weight once nothing else references
|
|
637
724
|
// it by URL (another page's tag, or the runtime's async chunk map);
|
|
638
725
|
// a content-hashed filename makes a substring hit a real reference.
|
|
726
|
+
/** @type {Set<string>} */
|
|
727
|
+
const deletionCandidates = new Set(inlinedFiles);
|
|
728
|
+
// A wrapper entry's chunk only rebuilds the page's own markup; the
|
|
729
|
+
// page loads the `<script src>` entries the parser split out of it.
|
|
730
|
+
for (const entrypoint of compilation.entrypoints.values()) {
|
|
731
|
+
const chunk = entrypoint.getEntrypointChunk();
|
|
732
|
+
if (!chunk) continue;
|
|
733
|
+
let wrapperOnly = false;
|
|
734
|
+
for (const entryModule of compilation.chunkGraph.getChunkEntryModulesIterable(
|
|
735
|
+
chunk
|
|
736
|
+
)) {
|
|
737
|
+
const { resource } = /** @type {import("../NormalModule")} */ (
|
|
738
|
+
entryModule
|
|
739
|
+
);
|
|
740
|
+
wrapperOnly =
|
|
741
|
+
typeof resource === "string" &&
|
|
742
|
+
HTML_DATA_URL_RE.test(resource);
|
|
743
|
+
if (!wrapperOnly) break;
|
|
744
|
+
}
|
|
745
|
+
if (!wrapperOnly) continue;
|
|
746
|
+
for (const file of chunk.files) deletionCandidates.add(file);
|
|
747
|
+
}
|
|
639
748
|
// Materialize each other asset's source once (it can be expensive to
|
|
640
|
-
// render) and test all
|
|
641
|
-
// re-materializing every asset per
|
|
642
|
-
if (
|
|
749
|
+
// render) and test all candidates against it, rather than
|
|
750
|
+
// re-materializing every asset per candidate.
|
|
751
|
+
if (deletionCandidates.size > 0) {
|
|
643
752
|
/** @type {Set<string>} */
|
|
644
753
|
const stillReferenced = new Set();
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
}
|
|
754
|
+
/** @type {string[]} */
|
|
755
|
+
const pending = [];
|
|
756
|
+
/**
|
|
757
|
+
* @param {string} name asset whose source may name a candidate
|
|
758
|
+
*/
|
|
759
|
+
const markReferenced = (name) => {
|
|
652
760
|
const source = compilation.assets[name].source();
|
|
653
|
-
if (typeof source !== "string")
|
|
654
|
-
for (const file of
|
|
761
|
+
if (typeof source !== "string") return;
|
|
762
|
+
for (const file of deletionCandidates) {
|
|
655
763
|
if (!stillReferenced.has(file) && source.includes(file)) {
|
|
656
764
|
stillReferenced.add(file);
|
|
765
|
+
pending.push(file);
|
|
657
766
|
}
|
|
658
767
|
}
|
|
768
|
+
};
|
|
769
|
+
for (const name of Object.keys(compilation.assets)) {
|
|
770
|
+
if (
|
|
771
|
+
deletionCandidates.has(name) ||
|
|
772
|
+
stillReferenced.size === deletionCandidates.size
|
|
773
|
+
) {
|
|
774
|
+
continue;
|
|
775
|
+
}
|
|
776
|
+
markReferenced(name);
|
|
777
|
+
}
|
|
778
|
+
// A kept candidate can reference another through its async chunk
|
|
779
|
+
// map, so follow each until nothing new is kept.
|
|
780
|
+
while (pending.length > 0) {
|
|
781
|
+
markReferenced(/** @type {string} */ (pending.pop()));
|
|
659
782
|
}
|
|
660
|
-
for (const file of
|
|
783
|
+
for (const file of deletionCandidates) {
|
|
661
784
|
if (!stillReferenced.has(file)) compilation.deleteAsset(file);
|
|
662
785
|
}
|
|
663
786
|
}
|
|
@@ -695,58 +818,6 @@ class HtmlModulesPlugin {
|
|
|
695
818
|
compilation.outputOptions.cssChunkFilename;
|
|
696
819
|
}
|
|
697
820
|
});
|
|
698
|
-
compilation.dependencyFactories.set(
|
|
699
|
-
HtmlSourceDependency,
|
|
700
|
-
normalModuleFactory
|
|
701
|
-
);
|
|
702
|
-
compilation.dependencyTemplates.set(
|
|
703
|
-
HtmlSourceDependency,
|
|
704
|
-
new HtmlSourceDependency.Template()
|
|
705
|
-
);
|
|
706
|
-
compilation.dependencyFactories.set(
|
|
707
|
-
HtmlEntryDependency,
|
|
708
|
-
normalModuleFactory
|
|
709
|
-
);
|
|
710
|
-
compilation.dependencyTemplates.set(
|
|
711
|
-
HtmlEntryDependency,
|
|
712
|
-
new HtmlEntryDependency.Template()
|
|
713
|
-
);
|
|
714
|
-
// Inline `<script>` content is bundled as its own entry — the
|
|
715
|
-
// same pipeline that handles `<script src>` — via a
|
|
716
|
-
// `data:text/javascript,...` request. The dependency
|
|
717
|
-
// template rewrites the original tag to `<script src=…>`.
|
|
718
|
-
compilation.dependencyFactories.set(
|
|
719
|
-
HtmlInlineScriptDependency,
|
|
720
|
-
normalModuleFactory
|
|
721
|
-
);
|
|
722
|
-
compilation.dependencyTemplates.set(
|
|
723
|
-
HtmlInlineScriptDependency,
|
|
724
|
-
new HtmlInlineScriptDependency.Template()
|
|
725
|
-
);
|
|
726
|
-
// Inline `<style>` content is routed through the CSS pipeline
|
|
727
|
-
// as a `data:text/css` module. The dependency template reads
|
|
728
|
-
// the processed CSS text from the CSS module's code
|
|
729
|
-
// generation data (`css-text` channel set by CssGenerator
|
|
730
|
-
// when `exportType` is `"text"`).
|
|
731
|
-
compilation.dependencyFactories.set(
|
|
732
|
-
HtmlInlineStyleDependency,
|
|
733
|
-
normalModuleFactory
|
|
734
|
-
);
|
|
735
|
-
compilation.dependencyTemplates.set(
|
|
736
|
-
HtmlInlineStyleDependency,
|
|
737
|
-
new HtmlInlineStyleDependency.Template()
|
|
738
|
-
);
|
|
739
|
-
// `<iframe srcdoc>` content is routed back through the HTML
|
|
740
|
-
// pipeline as a `data:text/html` module; the template reads the
|
|
741
|
-
// processed HTML from the nested module's `html` channel.
|
|
742
|
-
compilation.dependencyFactories.set(
|
|
743
|
-
HtmlInlineHtmlDependency,
|
|
744
|
-
normalModuleFactory
|
|
745
|
-
);
|
|
746
|
-
compilation.dependencyTemplates.set(
|
|
747
|
-
HtmlInlineHtmlDependency,
|
|
748
|
-
new HtmlInlineHtmlDependency.Template()
|
|
749
|
-
);
|
|
750
821
|
compilation.dependencyTemplates.set(
|
|
751
822
|
StaticExportsDependency,
|
|
752
823
|
new StaticExportsDependency.Template()
|
|
@@ -759,6 +830,74 @@ class HtmlModulesPlugin {
|
|
|
759
830
|
ConstDependency,
|
|
760
831
|
new ConstDependency.Template()
|
|
761
832
|
);
|
|
833
|
+
// registered when the first html module is prepared, so a build
|
|
834
|
+
// without html never loads these dependency classes
|
|
835
|
+
normalModuleFactory.hooks.prepareModuleType
|
|
836
|
+
.for(HTML_MODULE_TYPE)
|
|
837
|
+
.tap(PLUGIN_NAME, () => {
|
|
838
|
+
const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
|
|
839
|
+
const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
|
|
840
|
+
const HtmlInlineScriptDependency = require("../dependencies/HtmlInlineScriptDependency");
|
|
841
|
+
const HtmlInlineStyleDependency = require("../dependencies/HtmlInlineStyleDependency");
|
|
842
|
+
const HtmlInlineHtmlDependency = require("../dependencies/HtmlInlineHtmlDependency");
|
|
843
|
+
|
|
844
|
+
compilation.dependencyFactories.set(
|
|
845
|
+
HtmlSourceDependency,
|
|
846
|
+
normalModuleFactory
|
|
847
|
+
);
|
|
848
|
+
compilation.dependencyTemplates.set(
|
|
849
|
+
HtmlSourceDependency,
|
|
850
|
+
new HtmlSourceDependency.Template()
|
|
851
|
+
);
|
|
852
|
+
compilation.dependencyFactories.set(
|
|
853
|
+
HtmlEntryDependency,
|
|
854
|
+
normalModuleFactory
|
|
855
|
+
);
|
|
856
|
+
compilation.dependencyTemplates.set(
|
|
857
|
+
HtmlEntryDependency,
|
|
858
|
+
new HtmlEntryDependency.Template()
|
|
859
|
+
);
|
|
860
|
+
// Inline `<script>` content is bundled as its own entry — the
|
|
861
|
+
// same pipeline that handles `<script src>` — via a
|
|
862
|
+
// `data:text/javascript,...` request. The dependency
|
|
863
|
+
// template rewrites the original tag to `<script src=…>`.
|
|
864
|
+
compilation.dependencyFactories.set(
|
|
865
|
+
HtmlInlineScriptDependency,
|
|
866
|
+
normalModuleFactory
|
|
867
|
+
);
|
|
868
|
+
compilation.dependencyTemplates.set(
|
|
869
|
+
HtmlInlineScriptDependency,
|
|
870
|
+
new HtmlInlineScriptDependency.Template()
|
|
871
|
+
);
|
|
872
|
+
// Inline `<style>` content is routed through the CSS pipeline
|
|
873
|
+
// as a `data:text/css` module. The dependency template reads
|
|
874
|
+
// the processed CSS text from the CSS module's code
|
|
875
|
+
// generation data (`css-text` channel set by CssGenerator
|
|
876
|
+
// when `exportType` is `"text"`).
|
|
877
|
+
compilation.dependencyFactories.set(
|
|
878
|
+
HtmlInlineStyleDependency,
|
|
879
|
+
normalModuleFactory
|
|
880
|
+
);
|
|
881
|
+
compilation.dependencyTemplates.set(
|
|
882
|
+
HtmlInlineStyleDependency,
|
|
883
|
+
new HtmlInlineStyleDependency.Template()
|
|
884
|
+
);
|
|
885
|
+
// `<iframe srcdoc>` content is routed back through the HTML
|
|
886
|
+
// pipeline as a `data:text/html` module; the template reads the
|
|
887
|
+
// processed HTML from the nested module's `html` channel.
|
|
888
|
+
compilation.dependencyFactories.set(
|
|
889
|
+
HtmlInlineHtmlDependency,
|
|
890
|
+
normalModuleFactory
|
|
891
|
+
);
|
|
892
|
+
compilation.dependencyTemplates.set(
|
|
893
|
+
HtmlInlineHtmlDependency,
|
|
894
|
+
new HtmlInlineHtmlDependency.Template()
|
|
895
|
+
);
|
|
896
|
+
});
|
|
897
|
+
preloadModuleType(normalModuleFactory, PLUGIN_NAME, [
|
|
898
|
+
[HTML_MODULE_TYPE, [getHtmlParser]]
|
|
899
|
+
]);
|
|
900
|
+
|
|
762
901
|
normalModuleFactory.hooks.createModuleClass
|
|
763
902
|
.for(HTML_MODULE_TYPE)
|
|
764
903
|
.tap(
|
|
@@ -777,7 +916,7 @@ class HtmlModulesPlugin {
|
|
|
777
916
|
options
|
|
778
917
|
)
|
|
779
918
|
);
|
|
780
|
-
return new
|
|
919
|
+
return new (getHtmlParser.loaded())(parserOptions);
|
|
781
920
|
});
|
|
782
921
|
|
|
783
922
|
normalModuleFactory.hooks.createGenerator
|
|
@@ -792,21 +931,24 @@ class HtmlModulesPlugin {
|
|
|
792
931
|
options
|
|
793
932
|
)
|
|
794
933
|
);
|
|
795
|
-
return new
|
|
934
|
+
return new (getHtmlGenerator())(
|
|
935
|
+
generatorOptions,
|
|
936
|
+
compilation.moduleGraph
|
|
937
|
+
);
|
|
796
938
|
});
|
|
797
939
|
|
|
798
940
|
NormalModule.getCompilationHooks(compilation).processResult.tap(
|
|
799
941
|
PLUGIN_NAME,
|
|
800
942
|
(result, module) => {
|
|
801
943
|
if (module.type === HTML_MODULE_TYPE) {
|
|
802
|
-
const [source, ...rest] = result;
|
|
944
|
+
const [source, ...rest] = removeBOMFromResult(result);
|
|
803
945
|
// `applyTemplate` is a no-op unless `module.parser.html.template`
|
|
804
946
|
// is set. Running it here (where the returned source becomes the
|
|
805
947
|
// module's stored source) keeps the parser's dependency offsets
|
|
806
948
|
// and the generator's render base in sync.
|
|
807
949
|
const parser = /** @type {HtmlParser} */ (module.parser);
|
|
808
950
|
|
|
809
|
-
return [parser.applyTemplate(
|
|
951
|
+
return [parser.applyTemplate(source, module), ...rest];
|
|
810
952
|
}
|
|
811
953
|
|
|
812
954
|
return result;
|
|
@@ -845,15 +987,15 @@ class HtmlModulesPlugin {
|
|
|
845
987
|
/** @type {WeakMap<import("webpack-sources").Source, { resolvedContent: string, contentHash: string }>} */
|
|
846
988
|
const resolvedSentinelHashCache = new WeakMap();
|
|
847
989
|
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
) => {
|
|
990
|
+
/**
|
|
991
|
+
* Computes an HTML page's emitted filename, chunk-URL-resolved content and
|
|
992
|
+
* content hash. Links to other pages stay sentinels, so a page's filename
|
|
993
|
+
* never depends on the filenames of the pages it links to.
|
|
994
|
+
* @param {NormalModule} module the page's html module
|
|
995
|
+
* @param {import("../Chunk")} chunk chunk the page is emitted from
|
|
996
|
+
* @returns {{ resolvedContent: string, contentHash: string, filename: string, info: import("../Compilation").AssetInfo } | undefined} the page's emit, or `undefined` when it generates no html
|
|
997
|
+
*/
|
|
998
|
+
const computePageEmit = (module, chunk) => {
|
|
857
999
|
const { chunkGraph, outputOptions } = compilation;
|
|
858
1000
|
const codeGenResult =
|
|
859
1001
|
/** @type {import("../CodeGenerationResults")} */ (
|
|
@@ -872,9 +1014,9 @@ class HtmlModulesPlugin {
|
|
|
872
1014
|
// Asset URL sentinels (from `HtmlEntryDependency` resource-hint
|
|
873
1015
|
// tags) resolve here too — deferred from template.apply so it
|
|
874
1016
|
// doesn't race with asset-module codegen.
|
|
875
|
-
const resolvedContent =
|
|
876
|
-
|
|
877
|
-
|
|
1017
|
+
const resolvedContent = getHtmlGenerator().resolveAssetUrlSentinels(
|
|
1018
|
+
getHtmlGenerator().embedInlineChunkHashes(
|
|
1019
|
+
getHtmlGenerator().resolveChunkUrlSentinels(
|
|
878
1020
|
/** @type {string} */ (placeholderSource.source()),
|
|
879
1021
|
compilation
|
|
880
1022
|
),
|
|
@@ -897,11 +1039,14 @@ class HtmlModulesPlugin {
|
|
|
897
1039
|
const sourceFilename =
|
|
898
1040
|
resource.startsWith("data:text/html") && chunk.name
|
|
899
1041
|
? chunk.name
|
|
900
|
-
:
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
1042
|
+
: toTemplateSourceFileName(
|
|
1043
|
+
makePathsRelative(
|
|
1044
|
+
compiler.context,
|
|
1045
|
+
/** @type {string} */ (resource),
|
|
1046
|
+
compiler.root
|
|
1047
|
+
).replace(/^\.\//, ""),
|
|
1048
|
+
compilation
|
|
1049
|
+
);
|
|
905
1050
|
const filenameTemplate = HtmlModulesPlugin.getChunkFilenameTemplate(
|
|
906
1051
|
chunk,
|
|
907
1052
|
outputOptions
|
|
@@ -927,14 +1072,15 @@ class HtmlModulesPlugin {
|
|
|
927
1072
|
};
|
|
928
1073
|
};
|
|
929
1074
|
|
|
930
|
-
// Emitted filename of a linked `type: "html"` page, keyed by its entry
|
|
931
|
-
// name. Looked up from the page's own entry chunk so it's independent of
|
|
932
|
-
// chunk render order; cached for the compilation.
|
|
933
1075
|
/** @type {Map<string, string>} */
|
|
934
1076
|
const htmlPageFilenameCache = new Map();
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
1077
|
+
/**
|
|
1078
|
+
* Emitted filename of a linked `type: "html"` page, read from the page's
|
|
1079
|
+
* own entry chunk so chunk render order cannot affect it.
|
|
1080
|
+
* @param {string} entryName entry name of the linked page
|
|
1081
|
+
* @returns {string} the page's emitted filename, `"data:,"` when it has none
|
|
1082
|
+
*/
|
|
1083
|
+
const computePageFilenameByEntry = (entryName) => {
|
|
938
1084
|
const cached = htmlPageFilenameCache.get(entryName);
|
|
939
1085
|
if (cached !== undefined) return cached;
|
|
940
1086
|
let filename = "data:,";
|
|
@@ -1012,10 +1158,11 @@ class HtmlModulesPlugin {
|
|
|
1012
1158
|
// Resolve linked-page (`type: "html"`) sentinels to each page's
|
|
1013
1159
|
// emitted filename before the undo path, so the href is relative to
|
|
1014
1160
|
// this page.
|
|
1015
|
-
const finalContent =
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1161
|
+
const finalContent = getHtmlGenerator()
|
|
1162
|
+
.resolveHtmlPageUrlSentinels(
|
|
1163
|
+
resolvedContent,
|
|
1164
|
+
computePageFilenameByEntry
|
|
1165
|
+
)
|
|
1019
1166
|
.split(autoPlaceholder)
|
|
1020
1167
|
.join(undoPath);
|
|
1021
1168
|
const finalSource = new RawSource(finalContent);
|
|
@@ -1033,8 +1180,14 @@ class HtmlModulesPlugin {
|
|
|
1033
1180
|
outputOptions
|
|
1034
1181
|
);
|
|
1035
1182
|
|
|
1036
|
-
// Track HTML pages
|
|
1037
|
-
|
|
1183
|
+
// Track HTML pages (never JS chunks) with the html options of the
|
|
1184
|
+
// entry that owns them, read back by the emit passes below.
|
|
1185
|
+
getState(compilation).htmlAssetOptions.set(
|
|
1186
|
+
filename,
|
|
1187
|
+
(chunk.name && htmlOptionsByEntry.get(chunk.name)) ||
|
|
1188
|
+
globalHtmlOptions ||
|
|
1189
|
+
{}
|
|
1190
|
+
);
|
|
1038
1191
|
|
|
1039
1192
|
result.push({
|
|
1040
1193
|
render: () => finalSource,
|
|
@@ -1060,6 +1213,13 @@ class HtmlModulesPlugin {
|
|
|
1060
1213
|
if (htmlModules.size === 0) return source;
|
|
1061
1214
|
const raw = source.source();
|
|
1062
1215
|
if (typeof raw !== "string") return source;
|
|
1216
|
+
// Every sentinel shares this prefix — one scan answers the common
|
|
1217
|
+
// sentinel-free case instead of five.
|
|
1218
|
+
if (!raw.includes("__WEBPACK_HTML_")) {
|
|
1219
|
+
return source;
|
|
1220
|
+
}
|
|
1221
|
+
// Exact re-check on a prefix hit: the autoPlaceholder strip below is
|
|
1222
|
+
// not sentinel-guarded, so bare-prefix false positives must bail here.
|
|
1063
1223
|
if (
|
|
1064
1224
|
!raw.includes("__WEBPACK_HTML_CHUNK_URL__") &&
|
|
1065
1225
|
!raw.includes("__WEBPACK_HTML_PAGE_URL__") &&
|
|
@@ -1072,20 +1232,26 @@ class HtmlModulesPlugin {
|
|
|
1072
1232
|
// Strip integrity and inline sentinels (not resolve): a JS chunk
|
|
1073
1233
|
// can't hold real SRI hashes for its own not-yet-final bytes, and
|
|
1074
1234
|
// inline content belongs only in the final .html, never in JS bundles.
|
|
1075
|
-
const resolved =
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1235
|
+
const resolved = getHtmlGenerator()
|
|
1236
|
+
.stripChunkIntegritySentinels(
|
|
1237
|
+
getHtmlGenerator()
|
|
1238
|
+
.resolveAssetUrlSentinels(
|
|
1239
|
+
getHtmlGenerator().resolveHtmlPageUrlSentinels(
|
|
1240
|
+
getHtmlGenerator().resolveChunkUrlSentinels(
|
|
1241
|
+
raw,
|
|
1242
|
+
compilation
|
|
1243
|
+
),
|
|
1244
|
+
computePageFilenameByEntry
|
|
1245
|
+
),
|
|
1246
|
+
compilation
|
|
1247
|
+
)
|
|
1248
|
+
.split(autoPlaceholder)
|
|
1249
|
+
.join("")
|
|
1082
1250
|
)
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
""
|
|
1088
|
-
);
|
|
1251
|
+
.replace(
|
|
1252
|
+
/__WEBPACK_HTML_INLINE__[0-9a-f]+__[a-z]+(?:__[0-9a-f]+)?__END__/g,
|
|
1253
|
+
""
|
|
1254
|
+
);
|
|
1089
1255
|
if (resolved === raw) return source;
|
|
1090
1256
|
const chunkId = String(renderContext.chunk.id);
|
|
1091
1257
|
const prior = sentinelResolvedSourceCache.get(chunkId);
|