@depup/webpack 5.109.0-depup.0 → 5.110.1-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 +7 -7
- package/bin/webpack.js +12 -0
- package/changes.json +10 -10
- 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 +43 -32
- package/lib/ChunkGroup.js +7 -7
- package/lib/ChunkTemplate.js +35 -44
- package/lib/CircularModulesPlugin.js +205 -28
- package/lib/CleanPlugin.js +15 -16
- package/lib/CodeGenerationResults.js +11 -8
- package/lib/CompatibilityPlugin.js +38 -7
- package/lib/Compilation.js +709 -414
- package/lib/Compiler.js +69 -42
- package/lib/ConcatenationScope.js +117 -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 +168 -57
- 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 +50 -13
- 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 +123 -19
- package/lib/ExportsInfoApiPlugin.js +2 -4
- package/lib/ExternalModule.js +242 -84
- package/lib/ExternalModuleFactoryPlugin.js +97 -38
- package/lib/ExternalsPlugin.js +10 -6
- package/lib/FileSystemInfo.js +116 -42
- package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
- package/lib/FlagDependencyExportsPlugin.js +76 -19
- package/lib/FlagDependencyUsagePlugin.js +63 -57
- 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 +28 -36
- 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 +22 -6
- 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 +221 -156
- package/lib/NormalModuleFactory.js +563 -112
- 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 +346 -256
- package/lib/RuntimeTemplate.js +2792 -352
- 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 +55 -25
- 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 +2 -2
- 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 +289 -28
- 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 +282 -81
- package/lib/config/defineConfig.js +10 -2
- package/lib/config/getClaimedAssetTypes.js +65 -0
- package/lib/config/normalization.js +36 -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 +53 -66
- package/lib/container/ModuleFederationPlugin.js +7 -18
- 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 +178 -44
- package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
- package/lib/css/CssLoadingRuntimeModule.js +82 -36
- package/lib/css/CssModule.js +10 -7
- package/lib/css/CssModulesPlugin.js +197 -106
- package/lib/css/CssParser.js +1248 -618
- package/lib/css/CssServerStylesRuntimeModule.js +54 -0
- package/lib/css/cssMinify.js +168 -0
- package/lib/css/data.js +5324 -0
- package/lib/css/syntax.js +10396 -952
- 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 +140 -45
- package/lib/dependencies/CommonJsExportsDependency.js +53 -49
- package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
- package/lib/dependencies/CommonJsFullRequireDependency.js +140 -26
- package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -48
- 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 +156 -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 +4 -4
- 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 +15 -11
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +78 -12
- package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
- package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +159 -71
- 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 +28 -20
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
- package/lib/dependencies/HarmonyImportGuard.js +21 -30
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -9
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +106 -55
- package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
- package/lib/dependencies/HtmlEntryDependency.js +37 -29
- 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 +2 -2
- package/lib/dependencies/ImportDependency.js +24 -20
- 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 +49 -35
- 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 +51 -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 +46 -28
- package/lib/dependencies/WorkerDependency.js +28 -22
- package/lib/dependencies/WorkletDependency.js +15 -14
- package/lib/dependencies/getFunctionExpression.js +8 -4
- 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/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/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 +89 -51
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +170 -71
- 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 +28 -10
- package/lib/hmr/parserHooks.js +56 -0
- package/lib/html/HtmlGenerator.js +299 -79
- package/lib/html/HtmlModule.js +7 -3
- package/lib/html/HtmlModulesPlugin.js +312 -174
- 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 +7819 -3331
- 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 +31 -18
- 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 +181 -162
- package/lib/javascript/JavascriptParser.js +291 -112
- 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 +3403 -300
- 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 +14 -1
- 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 +81 -20
- package/lib/node/ReadFileCompileWasmPlugin.js +37 -17
- package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
- package/lib/node/nodeConsole.js +7 -3
- package/lib/optimize/AggressiveMergingPlugin.js +21 -17
- package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
- package/lib/optimize/ConcatenatedModule.js +996 -477
- package/lib/optimize/ConstExportsPlugin.js +11 -7
- package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
- package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
- package/lib/optimize/InlineExports.js +9 -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 +124 -59
- package/lib/optimize/RealContentHashPlugin.js +20 -13
- 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 +232 -68
- 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 +377 -136
- 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 +1 -1
- 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 +23 -6
- 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 +24 -15
- package/lib/schemes/VirtualUrlPlugin.js +13 -7
- package/lib/serialization/AggregateErrorSerializer.js +1 -1
- package/lib/serialization/BinaryMiddleware.js +274 -942
- package/lib/serialization/ErrorObjectSerializer.js +1 -1
- package/lib/serialization/FileMiddleware.js +305 -66
- 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 +253 -226
- package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
- package/lib/stats/DefaultStatsPrinterPlugin.js +60 -192
- package/lib/stats/StatsFactory.js +56 -35
- package/lib/stats/StatsPrinter.js +16 -12
- package/lib/typescript/TypeScriptPlugin.js +12 -14
- package/lib/url/URLParserPlugin.js +26 -13
- 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 +1050 -24
- package/lib/util/StringXor.js +1 -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 +5 -1
- package/lib/util/createHash.js +2 -2
- package/lib/util/createHooksRegistry.js +8 -10
- 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 +25 -1
- package/lib/util/implicitTypeLoaderFallback.js +1 -1
- package/lib/util/internalSerializables.js +6 -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/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 +41 -21
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +43 -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 +34 -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 +101 -19
- package/lib/web/FetchCompileWasmPlugin.js +46 -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 +37 -30
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +780 -91
- 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 +4013 -738
- 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
34
|
const removeBOM = require("../util/removeBOM");
|
|
37
|
-
const HtmlGenerator = require("./HtmlGenerator");
|
|
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 */
|
|
@@ -72,12 +84,36 @@ const { escapeAttribute } = require("./syntax");
|
|
|
72
84
|
* @property {boolean=} remove set true to delete the whole element
|
|
73
85
|
*/
|
|
74
86
|
/** @typedef {{ outputName: string, html: string }} HtmlTransformTagsContext */
|
|
87
|
+
|
|
88
|
+
const createCompilationHooks = () => ({
|
|
89
|
+
/**
|
|
90
|
+
* Called with the list of extra tags to inject into each page (initially empty) plus the current HTML; push `HtmlTagDescriptor`s and return the list — webpack serializes and places them by `injectTo`. A structured alternative to the string-level `transformHtml` for adding tags; runs before CSP so injected inline tags are hashed.
|
|
91
|
+
* @type {AsyncSeriesWaterfallHook<[HtmlTagDescriptor[], HtmlInjectTagsContext]>}
|
|
92
|
+
* @since 5.109.0
|
|
93
|
+
*/
|
|
94
|
+
injectTags: new AsyncSeriesWaterfallHook(["tags", "context"]),
|
|
95
|
+
/**
|
|
96
|
+
* Called with the page's `<script>`/`<link>`/`<style>`/`<meta>` tags (webpack's own and any injected) as mutable descriptors; mutate `attrs` (add a `nonce`/`data-*`, switch `defer`↔`async`, …), set `remove: true`, or change `injectTo` to move a tag between `<head>` and `<body>`, and webpack rewrites the changed tags. Add new tags with `injectTags` instead.
|
|
97
|
+
* @type {AsyncSeriesHook<[HtmlMutableTag[], HtmlTransformTagsContext]>}
|
|
98
|
+
* @since 5.109.0
|
|
99
|
+
*/
|
|
100
|
+
transformTags: new AsyncSeriesHook(["tags", "context"]),
|
|
101
|
+
/**
|
|
102
|
+
* Called with each emitted page's final HTML (all sentinels resolved) just before it is written; return the (possibly transformed) HTML — e.g. to minify, inject a CSP meta, or rewrite tags.
|
|
103
|
+
* @type {AsyncSeriesWaterfallHook<[string, HtmlTransformHtmlContext]>}
|
|
104
|
+
* @since 5.109.0
|
|
105
|
+
*/
|
|
106
|
+
transformHtml: new AsyncSeriesWaterfallHook(["html", "context"]),
|
|
107
|
+
/**
|
|
108
|
+
* Called once each page's HTML asset has been finalized — a post-emit notification (nothing to return).
|
|
109
|
+
* @type {AsyncSeriesHook<[HtmlEmittedContext]>}
|
|
110
|
+
* @since 5.109.0
|
|
111
|
+
*/
|
|
112
|
+
htmlEmitted: new AsyncSeriesHook(["context"])
|
|
113
|
+
});
|
|
114
|
+
|
|
75
115
|
/**
|
|
76
|
-
* @typedef {
|
|
77
|
-
* @property {AsyncSeriesWaterfallHook<[HtmlTagDescriptor[], HtmlInjectTagsContext]>} injectTags called with the list of extra tags to inject into each page (initially empty) plus the current HTML; push `HtmlTagDescriptor`s and return the list — webpack serializes and places them by `injectTo`. A structured alternative to the string-level `transformHtml` for adding tags; runs before CSP so injected inline tags are hashed
|
|
78
|
-
* @property {AsyncSeriesHook<[HtmlMutableTag[], HtmlTransformTagsContext]>} transformTags called with the page's `<script>`/`<link>`/`<style>`/`<meta>` tags (webpack's own and any injected) as mutable descriptors; mutate `attrs` (add a `nonce`/`data-*`, switch `defer`↔`async`, …), set `remove: true`, or change `injectTo` to move a tag between `<head>` and `<body>`, and webpack rewrites the changed tags. Add new tags with `injectTags` instead
|
|
79
|
-
* @property {AsyncSeriesWaterfallHook<[string, HtmlTransformHtmlContext]>} transformHtml called with each emitted page's final HTML (all sentinels resolved) just before it is written; return the (possibly transformed) HTML — e.g. to minify, inject a CSP meta, or rewrite tags
|
|
80
|
-
* @property {AsyncSeriesHook<[HtmlEmittedContext]>} htmlEmitted called once each page's HTML asset has been finalized — a post-emit notification (nothing to return)
|
|
116
|
+
* @typedef {ReturnType<typeof createCompilationHooks>} HtmlCompilationHooks
|
|
81
117
|
*/
|
|
82
118
|
|
|
83
119
|
const PLUGIN_NAME = "HtmlModulesPlugin";
|
|
@@ -90,7 +126,6 @@ const DEFAULT_FAVICON = new URL("./favicon.svg", pathToFileURL(__filename))
|
|
|
90
126
|
.href;
|
|
91
127
|
|
|
92
128
|
// mime-db is heavy — only load it when a favicon actually needs a `type`.
|
|
93
|
-
const getMimeTypes = memoize(() => require("../util/mimeTypes"));
|
|
94
129
|
|
|
95
130
|
/**
|
|
96
131
|
* Resolves `output.html.favicon` for one page to `[rel, icon]` pairs.
|
|
@@ -126,6 +161,7 @@ const resolveFaviconLinks = (favicon, name) => {
|
|
|
126
161
|
* @returns {string} a `<link rel=… [attrs…] href=…>` tag; `type` defaults to the file format
|
|
127
162
|
*/
|
|
128
163
|
const faviconLinkTag = (rel, icon) => {
|
|
164
|
+
const { escapeAttribute } = getHtmlSyntax();
|
|
129
165
|
const type = icon.type || getMimeTypes().lookup(icon.href) || "";
|
|
130
166
|
const attrs = [
|
|
131
167
|
`rel="${escapeAttribute(rel)}"`,
|
|
@@ -162,9 +198,27 @@ const manifestLinkTag = (manifest, name) => {
|
|
|
162
198
|
JSON.stringify(value),
|
|
163
199
|
"utf8"
|
|
164
200
|
).toString("base64")}`;
|
|
165
|
-
return `<link rel="manifest" href="${escapeAttribute(
|
|
201
|
+
return `<link rel="manifest" href="${getHtmlSyntax().escapeAttribute(
|
|
202
|
+
href
|
|
203
|
+
)}">`;
|
|
166
204
|
};
|
|
167
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
|
+
|
|
168
222
|
// `\.html`/`\.css` request matchers for the synthetic `output.html` wrapper.
|
|
169
223
|
const HTML_REQUEST_RE = /\.html(\?|$)/i;
|
|
170
224
|
const CSS_REQUEST_RE = /\.css(\?|$)/i;
|
|
@@ -275,25 +329,59 @@ class HtmlModulesPlugin {
|
|
|
275
329
|
apply(compiler) {
|
|
276
330
|
const { output } = compiler.options;
|
|
277
331
|
const htmlOption = output.html;
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
//
|
|
281
|
-
//
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
new WebpackError(
|
|
289
|
-
`output.html.scriptLoading: "${scriptLoading}" is ignored with output.module — ES module scripts are always deferred.`
|
|
290
|
-
)
|
|
291
|
-
);
|
|
292
|
-
});
|
|
332
|
+
const globalHtmlOptions =
|
|
333
|
+
typeof htmlOption === "object" ? htmlOption : undefined;
|
|
334
|
+
// Collected while entries are resolved (`entryOption`, before the first
|
|
335
|
+
// compilation) and reported on every compilation; a Set dedupes entries
|
|
336
|
+
// that hit the same problem.
|
|
337
|
+
/** @type {Set<string>} */
|
|
338
|
+
const optionWarnings = new Set();
|
|
339
|
+
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
|
|
340
|
+
for (const message of optionWarnings) {
|
|
341
|
+
compilation.warnings.push(new WebpackError(message));
|
|
293
342
|
}
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
// Resolved options per entry that owns a generated page, read back when the
|
|
346
|
+
// page is emitted (`csp`, `integrity`) — one synthetic page module can back
|
|
347
|
+
// several entries, so those can only be applied per emitted asset.
|
|
348
|
+
/** @type {Map<string, OutputHtmlOptions>} */
|
|
349
|
+
const htmlOptionsByEntry = new Map();
|
|
350
|
+
// SRI sentinels are emitted while the page's HTML is generated, before the
|
|
351
|
+
// owning entry is known, so any page asking for integrity turns them on for
|
|
352
|
+
// all of them; pages that don't want SRI drop them again on emit. Authored
|
|
353
|
+
// `.html` pages never reach the entry hook, hence the global seed.
|
|
354
|
+
let anyIntegrity = isIntegrityEnabled(
|
|
355
|
+
globalHtmlOptions && globalHtmlOptions.integrity
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Options for one page: an entry's `html` object overrides `output.html`
|
|
360
|
+
* option by option, `true` inherits it as-is.
|
|
361
|
+
* @param {EntryDescriptionNormalized["html"]} html the entry's `html` value
|
|
362
|
+
* @param {string} name entry name
|
|
363
|
+
* @returns {OutputHtmlOptions} resolved options
|
|
364
|
+
*/
|
|
365
|
+
const resolveHtmlOptions = (html, name) => {
|
|
366
|
+
const options =
|
|
367
|
+
typeof html !== "object"
|
|
368
|
+
? globalHtmlOptions || {}
|
|
369
|
+
: globalHtmlOptions
|
|
370
|
+
? { ...globalHtmlOptions, ...html }
|
|
371
|
+
: html;
|
|
372
|
+
if (typeof html === "object") {
|
|
373
|
+
for (const option of GLOBAL_ONLY_HTML_OPTIONS) {
|
|
374
|
+
if (html[option] !== undefined) {
|
|
375
|
+
optionWarnings.add(
|
|
376
|
+
`entry "${name}" html.${option} is ignored — ${option} is resolved once per generated page and can only be set on output.html.`
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
htmlOptionsByEntry.set(name, options);
|
|
382
|
+
if (isIntegrityEnabled(options.integrity)) anyIntegrity = true;
|
|
383
|
+
return options;
|
|
384
|
+
};
|
|
297
385
|
|
|
298
386
|
// `output.html` (or an entry's `html`) wraps a non-HTML entry in a
|
|
299
387
|
// synthetic HTML module so the existing pipeline injects its JS/CSS
|
|
@@ -305,6 +393,9 @@ class HtmlModulesPlugin {
|
|
|
305
393
|
EntryOptionPlugin.getHooks(compiler).entry.tap(
|
|
306
394
|
PLUGIN_NAME,
|
|
307
395
|
(context, name, desc) => {
|
|
396
|
+
// Resolved for every entry, including the authored `.html` ones that
|
|
397
|
+
// need no wrapper below — their page reads back `csp`/`integrity` too.
|
|
398
|
+
const htmlObj = resolveHtmlOptions(desc.html, name);
|
|
308
399
|
const html = desc.html !== undefined ? desc.html : htmlOption;
|
|
309
400
|
const imports = desc.import;
|
|
310
401
|
if (
|
|
@@ -314,6 +405,26 @@ class HtmlModulesPlugin {
|
|
|
314
405
|
) {
|
|
315
406
|
return;
|
|
316
407
|
}
|
|
408
|
+
const scriptLoading = htmlObj.scriptLoading || "auto";
|
|
409
|
+
// ESM output emits `type="module"` (already deferred), so
|
|
410
|
+
// scriptLoading is ignored under output.module — warn on an
|
|
411
|
+
// explicit defer/blocking.
|
|
412
|
+
let scriptAttr = " defer";
|
|
413
|
+
if (output.module) {
|
|
414
|
+
scriptAttr = "";
|
|
415
|
+
if (scriptLoading === "defer" || scriptLoading === "blocking") {
|
|
416
|
+
const source =
|
|
417
|
+
typeof desc.html === "object" &&
|
|
418
|
+
desc.html.scriptLoading !== undefined
|
|
419
|
+
? `entry "${name}" html`
|
|
420
|
+
: "output.html";
|
|
421
|
+
optionWarnings.add(
|
|
422
|
+
`${source}.scriptLoading: "${scriptLoading}" is ignored with output.module — ES module scripts are always deferred.`
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
} else if (scriptLoading === "blocking") {
|
|
426
|
+
scriptAttr = "";
|
|
427
|
+
}
|
|
317
428
|
const entries = compiler.options.entry;
|
|
318
429
|
const requests =
|
|
319
430
|
typeof entries === "object" && entries[name]
|
|
@@ -328,27 +439,13 @@ class HtmlModulesPlugin {
|
|
|
328
439
|
scripts.push(`<script${scriptAttr} src="${r}"></script>`);
|
|
329
440
|
}
|
|
330
441
|
}
|
|
331
|
-
const
|
|
332
|
-
typeof html === "object"
|
|
333
|
-
? html
|
|
334
|
-
: typeof htmlOption === "object"
|
|
335
|
-
? htmlOption
|
|
336
|
-
: {};
|
|
337
|
-
const headTags = HtmlParser.buildHeadTags(htmlObj);
|
|
442
|
+
const headTags = getHtmlSyntax().buildHeadTags(htmlObj);
|
|
338
443
|
// Injected into webpack-generated pages only; each icon's href is a
|
|
339
444
|
// normal request the parser turns into a hashed asset.
|
|
340
|
-
const favicon
|
|
341
|
-
typeof html === "object" && html.favicon !== undefined
|
|
342
|
-
? html.favicon
|
|
343
|
-
: false;
|
|
344
|
-
const faviconTag = resolveFaviconLinks(favicon, name)
|
|
445
|
+
const faviconTag = resolveFaviconLinks(htmlObj.favicon, name)
|
|
345
446
|
.map(([rel, icon]) => faviconLinkTag(rel, icon))
|
|
346
447
|
.join("");
|
|
347
|
-
const manifest
|
|
348
|
-
typeof html === "object" && html.manifest !== undefined
|
|
349
|
-
? html.manifest
|
|
350
|
-
: false;
|
|
351
|
-
const manifestTag = manifestLinkTag(manifest, name);
|
|
448
|
+
const manifestTag = manifestLinkTag(htmlObj.manifest, name);
|
|
352
449
|
const inject = htmlObj.inject;
|
|
353
450
|
const scriptsInHead =
|
|
354
451
|
inject === "head" || (inject !== "body" && output.module);
|
|
@@ -378,12 +475,13 @@ class HtmlModulesPlugin {
|
|
|
378
475
|
// `<link rel="modulepreload">` intact.
|
|
379
476
|
// Per-compilation state: the HTML modules seen during make (so
|
|
380
477
|
// `finishMake` creates their entries without scanning the whole module
|
|
381
|
-
// graph)
|
|
382
|
-
|
|
478
|
+
// graph), the stylesheet entry names (read in `afterChunks`) and the html
|
|
479
|
+
// options of every emitted page, keyed by its asset name.
|
|
480
|
+
/** @type {WeakMap<import("../Compilation"), { htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetOptions: Map<string, OutputHtmlOptions> }>} */
|
|
383
481
|
const compilationState = new WeakMap();
|
|
384
482
|
/**
|
|
385
483
|
* @param {import("../Compilation")} compilation compilation
|
|
386
|
-
* @returns {{ htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>,
|
|
484
|
+
* @returns {{ htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetOptions: Map<string, OutputHtmlOptions> }} per-compilation state
|
|
387
485
|
*/
|
|
388
486
|
const getState = (compilation) => {
|
|
389
487
|
let state = compilationState.get(compilation);
|
|
@@ -391,7 +489,7 @@ class HtmlModulesPlugin {
|
|
|
391
489
|
state = {
|
|
392
490
|
htmlModules: new Set(),
|
|
393
491
|
stylesheetEntries: new Set(),
|
|
394
|
-
|
|
492
|
+
htmlAssetOptions: new Map()
|
|
395
493
|
};
|
|
396
494
|
compilationState.set(compilation, state);
|
|
397
495
|
}
|
|
@@ -491,15 +589,10 @@ class HtmlModulesPlugin {
|
|
|
491
589
|
);
|
|
492
590
|
});
|
|
493
591
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
typeof integrity === "function" ||
|
|
499
|
-
(Array.isArray(integrity) && integrity.length > 0);
|
|
500
|
-
// `output.html.csp` injects a `<meta http-equiv="Content-Security-Policy">`
|
|
501
|
-
// once the page's inline content is final (in `processAssets` below).
|
|
502
|
-
const csp = typeof htmlOption === "object" ? htmlOption.csp : undefined;
|
|
592
|
+
// `csp` injects a `<meta http-equiv="Content-Security-Policy">` and
|
|
593
|
+
// `integrity` resolves the SRI sentinels — both once the page's inline
|
|
594
|
+
// content is final (in `processAssets` below), per page, so an entry's
|
|
595
|
+
// `html` can override them.
|
|
503
596
|
// `"auto"` marks implicit enablement (no user rule for HTML files) — see
|
|
504
597
|
// `applyExperimentsDefaults`. Only then loaders win over the built-in type
|
|
505
598
|
// (e.g. html-webpack-plugin's template loader in its child compiler).
|
|
@@ -523,7 +616,13 @@ class HtmlModulesPlugin {
|
|
|
523
616
|
// module in the graph. Tracking only records; entries are still
|
|
524
617
|
// added (and awaited) in `finishMake`.
|
|
525
618
|
const trackHtmlModule = (/** @type {import("../Module")} */ module) => {
|
|
526
|
-
if (module.type
|
|
619
|
+
if (module.type !== HTML_MODULE_TYPE) return;
|
|
620
|
+
// enabled here, not on the compilation hook: an integrity build
|
|
621
|
+
// with no html module must not load the generator
|
|
622
|
+
if (anyIntegrity) {
|
|
623
|
+
getHtmlGenerator().enableIntegritySentinels(compilation);
|
|
624
|
+
}
|
|
625
|
+
htmlModules.add(module);
|
|
527
626
|
};
|
|
528
627
|
compilation.hooks.succeedModule.tap(PLUGIN_NAME, trackHtmlModule);
|
|
529
628
|
compilation.hooks.stillValidModule.tap(PLUGIN_NAME, trackHtmlModule);
|
|
@@ -535,7 +634,7 @@ class HtmlModulesPlugin {
|
|
|
535
634
|
// with CORS; without `output.crossOriginLoading` the browser
|
|
536
635
|
// silently ignores `integrity` on cross-origin loads. Warn once
|
|
537
636
|
// so a CDN deployment doesn't ship no-op integrity attributes.
|
|
538
|
-
if (
|
|
637
|
+
if (anyIntegrity && !compilation.outputOptions.crossOriginLoading) {
|
|
539
638
|
compilation.warnings.push(
|
|
540
639
|
new WebpackError(
|
|
541
640
|
'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.'
|
|
@@ -548,29 +647,32 @@ class HtmlModulesPlugin {
|
|
|
548
647
|
stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_HASH + 1
|
|
549
648
|
},
|
|
550
649
|
async (assets) => {
|
|
551
|
-
const {
|
|
650
|
+
const { htmlAssetOptions } = getState(compilation);
|
|
552
651
|
const hooks = HtmlModulesPlugin.getCompilationHooks(compilation);
|
|
553
652
|
/** @type {Set<string>} */
|
|
554
653
|
const inlinedFiles = new Set();
|
|
555
654
|
for (const name of Object.keys(assets)) {
|
|
556
|
-
|
|
655
|
+
const pageOptions = htmlAssetOptions.get(name);
|
|
656
|
+
if (pageOptions === undefined) continue;
|
|
557
657
|
const content = assets[name].source();
|
|
558
658
|
if (typeof content !== "string") continue;
|
|
659
|
+
const { csp, integrity } = pageOptions;
|
|
559
660
|
let resolved = content;
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
661
|
+
// Sentinels are emitted whenever any page wants SRI, so a page
|
|
662
|
+
// that doesn't drops them again here.
|
|
663
|
+
if (resolved.includes("__WEBPACK_HTML_INTEGRITY__")) {
|
|
664
|
+
resolved = isIntegrityEnabled(integrity)
|
|
665
|
+
? getHtmlGenerator().resolveChunkIntegritySentinels(
|
|
666
|
+
resolved,
|
|
667
|
+
compilation,
|
|
668
|
+
/** @type {import("./HtmlGenerator").HtmlIntegrity} */ (
|
|
669
|
+
integrity
|
|
670
|
+
)
|
|
671
|
+
)
|
|
672
|
+
: getHtmlGenerator().stripChunkIntegritySentinels(resolved);
|
|
571
673
|
}
|
|
572
674
|
if (resolved.includes("__WEBPACK_HTML_INLINE__")) {
|
|
573
|
-
resolved =
|
|
675
|
+
resolved = getHtmlGenerator().resolveChunkInlineSentinels(
|
|
574
676
|
resolved,
|
|
575
677
|
compilation,
|
|
576
678
|
name,
|
|
@@ -589,15 +691,15 @@ class HtmlModulesPlugin {
|
|
|
589
691
|
});
|
|
590
692
|
const transformTags = hooks.transformTags.taps.length > 0;
|
|
591
693
|
if (injected.length > 0 || transformTags || csp) {
|
|
592
|
-
const model =
|
|
593
|
-
|
|
694
|
+
const model = getHtmlGenerator().collectHtml(resolved);
|
|
695
|
+
getHtmlGenerator().addInjectedTags(model, injected);
|
|
594
696
|
if (transformTags) {
|
|
595
697
|
await hooks.transformTags.promise(model.tags, {
|
|
596
698
|
outputName: name,
|
|
597
699
|
html: resolved
|
|
598
700
|
});
|
|
599
701
|
}
|
|
600
|
-
resolved =
|
|
702
|
+
resolved = getHtmlGenerator().renderHtml(resolved, model, csp);
|
|
601
703
|
}
|
|
602
704
|
// Final, fully-resolved HTML — let plugins transform it (minify,
|
|
603
705
|
// inject a CSP meta, rewrite tags) before it is written.
|
|
@@ -671,58 +773,6 @@ class HtmlModulesPlugin {
|
|
|
671
773
|
compilation.outputOptions.cssChunkFilename;
|
|
672
774
|
}
|
|
673
775
|
});
|
|
674
|
-
compilation.dependencyFactories.set(
|
|
675
|
-
HtmlSourceDependency,
|
|
676
|
-
normalModuleFactory
|
|
677
|
-
);
|
|
678
|
-
compilation.dependencyTemplates.set(
|
|
679
|
-
HtmlSourceDependency,
|
|
680
|
-
new HtmlSourceDependency.Template()
|
|
681
|
-
);
|
|
682
|
-
compilation.dependencyFactories.set(
|
|
683
|
-
HtmlEntryDependency,
|
|
684
|
-
normalModuleFactory
|
|
685
|
-
);
|
|
686
|
-
compilation.dependencyTemplates.set(
|
|
687
|
-
HtmlEntryDependency,
|
|
688
|
-
new HtmlEntryDependency.Template()
|
|
689
|
-
);
|
|
690
|
-
// Inline `<script>` content is bundled as its own entry — the
|
|
691
|
-
// same pipeline that handles `<script src>` — via a
|
|
692
|
-
// `data:text/javascript,...` request. The dependency
|
|
693
|
-
// template rewrites the original tag to `<script src=…>`.
|
|
694
|
-
compilation.dependencyFactories.set(
|
|
695
|
-
HtmlInlineScriptDependency,
|
|
696
|
-
normalModuleFactory
|
|
697
|
-
);
|
|
698
|
-
compilation.dependencyTemplates.set(
|
|
699
|
-
HtmlInlineScriptDependency,
|
|
700
|
-
new HtmlInlineScriptDependency.Template()
|
|
701
|
-
);
|
|
702
|
-
// Inline `<style>` content is routed through the CSS pipeline
|
|
703
|
-
// as a `data:text/css` module. The dependency template reads
|
|
704
|
-
// the processed CSS text from the CSS module's code
|
|
705
|
-
// generation data (`css-text` channel set by CssGenerator
|
|
706
|
-
// when `exportType` is `"text"`).
|
|
707
|
-
compilation.dependencyFactories.set(
|
|
708
|
-
HtmlInlineStyleDependency,
|
|
709
|
-
normalModuleFactory
|
|
710
|
-
);
|
|
711
|
-
compilation.dependencyTemplates.set(
|
|
712
|
-
HtmlInlineStyleDependency,
|
|
713
|
-
new HtmlInlineStyleDependency.Template()
|
|
714
|
-
);
|
|
715
|
-
// `<iframe srcdoc>` content is routed back through the HTML
|
|
716
|
-
// pipeline as a `data:text/html` module; the template reads the
|
|
717
|
-
// processed HTML from the nested module's `html` channel.
|
|
718
|
-
compilation.dependencyFactories.set(
|
|
719
|
-
HtmlInlineHtmlDependency,
|
|
720
|
-
normalModuleFactory
|
|
721
|
-
);
|
|
722
|
-
compilation.dependencyTemplates.set(
|
|
723
|
-
HtmlInlineHtmlDependency,
|
|
724
|
-
new HtmlInlineHtmlDependency.Template()
|
|
725
|
-
);
|
|
726
776
|
compilation.dependencyTemplates.set(
|
|
727
777
|
StaticExportsDependency,
|
|
728
778
|
new StaticExportsDependency.Template()
|
|
@@ -735,6 +785,74 @@ class HtmlModulesPlugin {
|
|
|
735
785
|
ConstDependency,
|
|
736
786
|
new ConstDependency.Template()
|
|
737
787
|
);
|
|
788
|
+
// registered when the first html module is prepared, so a build
|
|
789
|
+
// without html never loads these dependency classes
|
|
790
|
+
normalModuleFactory.hooks.prepareModuleType
|
|
791
|
+
.for(HTML_MODULE_TYPE)
|
|
792
|
+
.tap(PLUGIN_NAME, () => {
|
|
793
|
+
const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
|
|
794
|
+
const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
|
|
795
|
+
const HtmlInlineScriptDependency = require("../dependencies/HtmlInlineScriptDependency");
|
|
796
|
+
const HtmlInlineStyleDependency = require("../dependencies/HtmlInlineStyleDependency");
|
|
797
|
+
const HtmlInlineHtmlDependency = require("../dependencies/HtmlInlineHtmlDependency");
|
|
798
|
+
|
|
799
|
+
compilation.dependencyFactories.set(
|
|
800
|
+
HtmlSourceDependency,
|
|
801
|
+
normalModuleFactory
|
|
802
|
+
);
|
|
803
|
+
compilation.dependencyTemplates.set(
|
|
804
|
+
HtmlSourceDependency,
|
|
805
|
+
new HtmlSourceDependency.Template()
|
|
806
|
+
);
|
|
807
|
+
compilation.dependencyFactories.set(
|
|
808
|
+
HtmlEntryDependency,
|
|
809
|
+
normalModuleFactory
|
|
810
|
+
);
|
|
811
|
+
compilation.dependencyTemplates.set(
|
|
812
|
+
HtmlEntryDependency,
|
|
813
|
+
new HtmlEntryDependency.Template()
|
|
814
|
+
);
|
|
815
|
+
// Inline `<script>` content is bundled as its own entry — the
|
|
816
|
+
// same pipeline that handles `<script src>` — via a
|
|
817
|
+
// `data:text/javascript,...` request. The dependency
|
|
818
|
+
// template rewrites the original tag to `<script src=…>`.
|
|
819
|
+
compilation.dependencyFactories.set(
|
|
820
|
+
HtmlInlineScriptDependency,
|
|
821
|
+
normalModuleFactory
|
|
822
|
+
);
|
|
823
|
+
compilation.dependencyTemplates.set(
|
|
824
|
+
HtmlInlineScriptDependency,
|
|
825
|
+
new HtmlInlineScriptDependency.Template()
|
|
826
|
+
);
|
|
827
|
+
// Inline `<style>` content is routed through the CSS pipeline
|
|
828
|
+
// as a `data:text/css` module. The dependency template reads
|
|
829
|
+
// the processed CSS text from the CSS module's code
|
|
830
|
+
// generation data (`css-text` channel set by CssGenerator
|
|
831
|
+
// when `exportType` is `"text"`).
|
|
832
|
+
compilation.dependencyFactories.set(
|
|
833
|
+
HtmlInlineStyleDependency,
|
|
834
|
+
normalModuleFactory
|
|
835
|
+
);
|
|
836
|
+
compilation.dependencyTemplates.set(
|
|
837
|
+
HtmlInlineStyleDependency,
|
|
838
|
+
new HtmlInlineStyleDependency.Template()
|
|
839
|
+
);
|
|
840
|
+
// `<iframe srcdoc>` content is routed back through the HTML
|
|
841
|
+
// pipeline as a `data:text/html` module; the template reads the
|
|
842
|
+
// processed HTML from the nested module's `html` channel.
|
|
843
|
+
compilation.dependencyFactories.set(
|
|
844
|
+
HtmlInlineHtmlDependency,
|
|
845
|
+
normalModuleFactory
|
|
846
|
+
);
|
|
847
|
+
compilation.dependencyTemplates.set(
|
|
848
|
+
HtmlInlineHtmlDependency,
|
|
849
|
+
new HtmlInlineHtmlDependency.Template()
|
|
850
|
+
);
|
|
851
|
+
});
|
|
852
|
+
preloadModuleType(normalModuleFactory, PLUGIN_NAME, [
|
|
853
|
+
[HTML_MODULE_TYPE, [getHtmlParser]]
|
|
854
|
+
]);
|
|
855
|
+
|
|
738
856
|
normalModuleFactory.hooks.createModuleClass
|
|
739
857
|
.for(HTML_MODULE_TYPE)
|
|
740
858
|
.tap(
|
|
@@ -753,7 +871,7 @@ class HtmlModulesPlugin {
|
|
|
753
871
|
options
|
|
754
872
|
)
|
|
755
873
|
);
|
|
756
|
-
return new
|
|
874
|
+
return new (getHtmlParser.loaded())(parserOptions);
|
|
757
875
|
});
|
|
758
876
|
|
|
759
877
|
normalModuleFactory.hooks.createGenerator
|
|
@@ -768,7 +886,10 @@ class HtmlModulesPlugin {
|
|
|
768
886
|
options
|
|
769
887
|
)
|
|
770
888
|
);
|
|
771
|
-
return new
|
|
889
|
+
return new (getHtmlGenerator())(
|
|
890
|
+
generatorOptions,
|
|
891
|
+
compilation.moduleGraph
|
|
892
|
+
);
|
|
772
893
|
});
|
|
773
894
|
|
|
774
895
|
NormalModule.getCompilationHooks(compilation).processResult.tap(
|
|
@@ -848,9 +969,9 @@ class HtmlModulesPlugin {
|
|
|
848
969
|
// Asset URL sentinels (from `HtmlEntryDependency` resource-hint
|
|
849
970
|
// tags) resolve here too — deferred from template.apply so it
|
|
850
971
|
// doesn't race with asset-module codegen.
|
|
851
|
-
const resolvedContent =
|
|
852
|
-
|
|
853
|
-
|
|
972
|
+
const resolvedContent = getHtmlGenerator().resolveAssetUrlSentinels(
|
|
973
|
+
getHtmlGenerator().embedInlineChunkHashes(
|
|
974
|
+
getHtmlGenerator().resolveChunkUrlSentinels(
|
|
854
975
|
/** @type {string} */ (placeholderSource.source()),
|
|
855
976
|
compilation
|
|
856
977
|
),
|
|
@@ -873,11 +994,14 @@ class HtmlModulesPlugin {
|
|
|
873
994
|
const sourceFilename =
|
|
874
995
|
resource.startsWith("data:text/html") && chunk.name
|
|
875
996
|
? chunk.name
|
|
876
|
-
:
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
997
|
+
: toTemplateSourceFileName(
|
|
998
|
+
makePathsRelative(
|
|
999
|
+
compiler.context,
|
|
1000
|
+
/** @type {string} */ (resource),
|
|
1001
|
+
compiler.root
|
|
1002
|
+
).replace(/^\.\//, ""),
|
|
1003
|
+
compilation
|
|
1004
|
+
);
|
|
881
1005
|
const filenameTemplate = HtmlModulesPlugin.getChunkFilenameTemplate(
|
|
882
1006
|
chunk,
|
|
883
1007
|
outputOptions
|
|
@@ -988,10 +1112,11 @@ class HtmlModulesPlugin {
|
|
|
988
1112
|
// Resolve linked-page (`type: "html"`) sentinels to each page's
|
|
989
1113
|
// emitted filename before the undo path, so the href is relative to
|
|
990
1114
|
// this page.
|
|
991
|
-
const finalContent =
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
1115
|
+
const finalContent = getHtmlGenerator()
|
|
1116
|
+
.resolveHtmlPageUrlSentinels(
|
|
1117
|
+
resolvedContent,
|
|
1118
|
+
computePageFilenameByEntry
|
|
1119
|
+
)
|
|
995
1120
|
.split(autoPlaceholder)
|
|
996
1121
|
.join(undoPath);
|
|
997
1122
|
const finalSource = new RawSource(finalContent);
|
|
@@ -1009,8 +1134,14 @@ class HtmlModulesPlugin {
|
|
|
1009
1134
|
outputOptions
|
|
1010
1135
|
);
|
|
1011
1136
|
|
|
1012
|
-
// Track HTML pages
|
|
1013
|
-
|
|
1137
|
+
// Track HTML pages (never JS chunks) with the html options of the
|
|
1138
|
+
// entry that owns them, read back by the emit passes below.
|
|
1139
|
+
getState(compilation).htmlAssetOptions.set(
|
|
1140
|
+
filename,
|
|
1141
|
+
(chunk.name && htmlOptionsByEntry.get(chunk.name)) ||
|
|
1142
|
+
globalHtmlOptions ||
|
|
1143
|
+
{}
|
|
1144
|
+
);
|
|
1014
1145
|
|
|
1015
1146
|
result.push({
|
|
1016
1147
|
render: () => finalSource,
|
|
@@ -1036,6 +1167,13 @@ class HtmlModulesPlugin {
|
|
|
1036
1167
|
if (htmlModules.size === 0) return source;
|
|
1037
1168
|
const raw = source.source();
|
|
1038
1169
|
if (typeof raw !== "string") return source;
|
|
1170
|
+
// Every sentinel shares this prefix — one scan answers the common
|
|
1171
|
+
// sentinel-free case instead of five.
|
|
1172
|
+
if (!raw.includes("__WEBPACK_HTML_")) {
|
|
1173
|
+
return source;
|
|
1174
|
+
}
|
|
1175
|
+
// Exact re-check on a prefix hit: the autoPlaceholder strip below is
|
|
1176
|
+
// not sentinel-guarded, so bare-prefix false positives must bail here.
|
|
1039
1177
|
if (
|
|
1040
1178
|
!raw.includes("__WEBPACK_HTML_CHUNK_URL__") &&
|
|
1041
1179
|
!raw.includes("__WEBPACK_HTML_PAGE_URL__") &&
|
|
@@ -1048,20 +1186,26 @@ class HtmlModulesPlugin {
|
|
|
1048
1186
|
// Strip integrity and inline sentinels (not resolve): a JS chunk
|
|
1049
1187
|
// can't hold real SRI hashes for its own not-yet-final bytes, and
|
|
1050
1188
|
// inline content belongs only in the final .html, never in JS bundles.
|
|
1051
|
-
const resolved =
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1189
|
+
const resolved = getHtmlGenerator()
|
|
1190
|
+
.stripChunkIntegritySentinels(
|
|
1191
|
+
getHtmlGenerator()
|
|
1192
|
+
.resolveAssetUrlSentinels(
|
|
1193
|
+
getHtmlGenerator().resolveHtmlPageUrlSentinels(
|
|
1194
|
+
getHtmlGenerator().resolveChunkUrlSentinels(
|
|
1195
|
+
raw,
|
|
1196
|
+
compilation
|
|
1197
|
+
),
|
|
1198
|
+
computePageFilenameByEntry
|
|
1199
|
+
),
|
|
1200
|
+
compilation
|
|
1201
|
+
)
|
|
1202
|
+
.split(autoPlaceholder)
|
|
1203
|
+
.join("")
|
|
1058
1204
|
)
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
""
|
|
1064
|
-
);
|
|
1205
|
+
.replace(
|
|
1206
|
+
/__WEBPACK_HTML_INLINE__[0-9a-f]+__[a-z]+(?:__[0-9a-f]+)?__END__/g,
|
|
1207
|
+
""
|
|
1208
|
+
);
|
|
1065
1209
|
if (resolved === raw) return source;
|
|
1066
1210
|
const chunkId = String(renderContext.chunk.id);
|
|
1067
1211
|
const prior = sentinelResolvedSourceCache.get(chunkId);
|
|
@@ -1099,13 +1243,7 @@ class HtmlModulesPlugin {
|
|
|
1099
1243
|
* @returns {HtmlCompilationHooks} the hooks
|
|
1100
1244
|
*/
|
|
1101
1245
|
HtmlModulesPlugin.getCompilationHooks = createHooksRegistry(
|
|
1102
|
-
|
|
1103
|
-
/** @type {HtmlCompilationHooks} */ ({
|
|
1104
|
-
injectTags: new AsyncSeriesWaterfallHook(["tags", "context"]),
|
|
1105
|
-
transformTags: new AsyncSeriesHook(["tags", "context"]),
|
|
1106
|
-
transformHtml: new AsyncSeriesWaterfallHook(["html", "context"]),
|
|
1107
|
-
htmlEmitted: new AsyncSeriesHook(["context"])
|
|
1108
|
-
})
|
|
1246
|
+
createCompilationHooks
|
|
1109
1247
|
);
|
|
1110
1248
|
|
|
1111
1249
|
module.exports = HtmlModulesPlugin;
|