@depup/webpack 5.109.2-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 +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 +26 -17
- 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 +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 +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 +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 +101 -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 +32 -47
- 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 +141 -85
- 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 +332 -169
- 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 +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 +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 +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 +261 -79
- 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 +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 +57 -24
- package/lib/css/CssModule.js +10 -7
- package/lib/css/CssModulesPlugin.js +168 -88
- 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 +5324 -0
- package/lib/css/syntax.js +9579 -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 +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 +13 -10
- 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 +143 -63
- 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 +27 -19
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
- package/lib/dependencies/HarmonyImportGuard.js +20 -30
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -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 +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 +155 -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 +282 -162
- 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 +5557 -1155
- 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 +98 -113
- 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 +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 +72 -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 +985 -470
- 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 +51 -35
- package/lib/optimize/RealContentHashPlugin.js +10 -6
- 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 -78
- 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 +4 -4
- package/lib/serialization/ErrorObjectSerializer.js +1 -1
- package/lib/serialization/FileMiddleware.js +7 -7
- 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 +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 +4 -0
- 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 +32 -25
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +670 -36
- 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 +3144 -454
- package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Alexander Akait @alexander-akait
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const ContextModule = require("../ContextModule");
|
|
9
|
+
const BroadContextsWarning = require("../errors/BroadContextsWarning");
|
|
10
|
+
const { compareStrings } = require("../util/comparators");
|
|
11
|
+
const getModuleSize = require("./getModuleSize");
|
|
12
|
+
|
|
13
|
+
/** @typedef {import("../../declarations/WebpackOptions").PerformanceOptions} PerformanceOptions */
|
|
14
|
+
/** @typedef {import("../Compiler")} Compiler */
|
|
15
|
+
/** @typedef {import("../Dependency")} Dependency */
|
|
16
|
+
/** @typedef {import("../Module")} Module */
|
|
17
|
+
/** @typedef {import("../errors/BroadContextsWarning").BroadContextDetails} BroadContextDetails */
|
|
18
|
+
|
|
19
|
+
const PLUGIN_NAME = "BroadContextsPlugin";
|
|
20
|
+
|
|
21
|
+
// Enough to name the offenders without printing every context in the build.
|
|
22
|
+
const MAX_REPORTED_CONTEXTS = 5;
|
|
23
|
+
|
|
24
|
+
// A directory holding a handful of files costs little however it is matched,
|
|
25
|
+
// and warning about it would bury the contexts that do carry weight.
|
|
26
|
+
const MIN_REPORTED_MODULES = 20;
|
|
27
|
+
|
|
28
|
+
// A bare leading wildcard takes every name in the directory, whether it is
|
|
29
|
+
// `require.context`'s default or one webpack derived from an expression.
|
|
30
|
+
const WILDCARD_PREFIX = "^\\.\\/.*";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Whether a context takes whatever the directory holds. A pattern that narrows
|
|
34
|
+
* by anything other than a leading wildcard is left alone, as is one webpack
|
|
35
|
+
* cannot read — an unrecognized filter is never guessed at.
|
|
36
|
+
* @param {ContextModule} module a context module
|
|
37
|
+
* @returns {boolean} true when nothing narrows it
|
|
38
|
+
*/
|
|
39
|
+
const isBroad = (module) => {
|
|
40
|
+
const { regExp, include, exclude } = module.options;
|
|
41
|
+
|
|
42
|
+
if (include || exclude) return false;
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
Boolean(regExp) &&
|
|
46
|
+
/** @type {RegExp} */ (regExp).source.startsWith(WILDCARD_PREFIX)
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
class BroadContextsPlugin {
|
|
51
|
+
/**
|
|
52
|
+
* Creates an instance of BroadContextsPlugin.
|
|
53
|
+
* @param {PerformanceOptions} options the plugin options
|
|
54
|
+
*/
|
|
55
|
+
constructor(options) {
|
|
56
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
57
|
+
this.hints = options.hints;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
62
|
+
* @param {Compiler} compiler the compiler instance
|
|
63
|
+
* @returns {void}
|
|
64
|
+
*/
|
|
65
|
+
apply(compiler) {
|
|
66
|
+
const hints = this.hints;
|
|
67
|
+
|
|
68
|
+
if (!hints) return;
|
|
69
|
+
|
|
70
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
71
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
72
|
+
// hint reported earlier would change the build's identity.
|
|
73
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
74
|
+
const { moduleGraph, requestShortener } = compilation;
|
|
75
|
+
/** @type {BroadContextDetails[]} */
|
|
76
|
+
const broad = [];
|
|
77
|
+
|
|
78
|
+
for (const module of compilation.modules) {
|
|
79
|
+
if (!(module instanceof ContextModule)) continue;
|
|
80
|
+
if (!isBroad(module)) continue;
|
|
81
|
+
|
|
82
|
+
// One file is reached under several requests — with and without its
|
|
83
|
+
// extension — so the dependencies outnumber what is really matched.
|
|
84
|
+
/** @type {Set<Module>} */
|
|
85
|
+
const matched = new Set();
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @param {Dependency[]} dependencies the dependencies to walk
|
|
89
|
+
* @returns {void}
|
|
90
|
+
*/
|
|
91
|
+
const collect = (dependencies) => {
|
|
92
|
+
for (const dependency of dependencies) {
|
|
93
|
+
const matchedModule = moduleGraph.getModule(dependency);
|
|
94
|
+
|
|
95
|
+
if (matchedModule) matched.add(matchedModule);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
collect(module.dependencies);
|
|
100
|
+
|
|
101
|
+
// A lazy context keeps each match in a block of its own, so reading
|
|
102
|
+
// only `dependencies` would report it as matching nothing.
|
|
103
|
+
for (const block of module.blocks) collect(block.dependencies);
|
|
104
|
+
|
|
105
|
+
if (matched.size < MIN_REPORTED_MODULES) continue;
|
|
106
|
+
|
|
107
|
+
let size = 0;
|
|
108
|
+
|
|
109
|
+
for (const matchedModule of matched) {
|
|
110
|
+
size += getModuleSize(matchedModule);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
broad.push({
|
|
114
|
+
name: module.readableIdentifier(requestShortener),
|
|
115
|
+
modules: matched.size,
|
|
116
|
+
size
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (broad.length === 0) return;
|
|
121
|
+
|
|
122
|
+
// Ties break by name: module order is not stable across runs.
|
|
123
|
+
broad.sort((a, b) => b.size - a.size || compareStrings(a.name, b.name));
|
|
124
|
+
|
|
125
|
+
const warning = new BroadContextsWarning(
|
|
126
|
+
broad.slice(0, MAX_REPORTED_CONTEXTS),
|
|
127
|
+
broad.length
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
if (hints === "error") {
|
|
131
|
+
compilation.errors.push(warning);
|
|
132
|
+
} else if (hints === "stats") {
|
|
133
|
+
compilation.hints.push(warning);
|
|
134
|
+
} else {
|
|
135
|
+
compilation.warnings.push(warning);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
module.exports = BroadContextsPlugin;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Alexander Akait @alexander-akait
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const RuntimeModule = require("../RuntimeModule");
|
|
9
|
+
const CacheEffectivenessWarning = require("../errors/CacheEffectivenessWarning");
|
|
10
|
+
|
|
11
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
12
|
+
/** @import Compiler from "../Compiler" */
|
|
13
|
+
/** @import { BuildInfo } from "../Module" */
|
|
14
|
+
|
|
15
|
+
const PLUGIN_NAME = "CacheEffectivenessPlugin";
|
|
16
|
+
|
|
17
|
+
// A reason shared by many modules is the one worth fixing, so report the
|
|
18
|
+
// frequent ones and count the rest.
|
|
19
|
+
const MAX_REPORTED_REASONS = 3;
|
|
20
|
+
|
|
21
|
+
const UNSPECIFIED_REASON = "reason not stated";
|
|
22
|
+
|
|
23
|
+
class CacheEffectivenessPlugin {
|
|
24
|
+
/**
|
|
25
|
+
* Creates an instance of CacheEffectivenessPlugin.
|
|
26
|
+
* @param {PerformanceOptions} options the plugin options
|
|
27
|
+
*/
|
|
28
|
+
constructor(options) {
|
|
29
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
30
|
+
this.hints = options.hints;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
35
|
+
* @param {Compiler} compiler the compiler instance
|
|
36
|
+
* @returns {void}
|
|
37
|
+
*/
|
|
38
|
+
apply(compiler) {
|
|
39
|
+
const hints = this.hints;
|
|
40
|
+
|
|
41
|
+
if (!hints) return;
|
|
42
|
+
|
|
43
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
44
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
45
|
+
let total = 0;
|
|
46
|
+
let rebuilt = 0;
|
|
47
|
+
let uncacheable = 0;
|
|
48
|
+
/** @type {Map<string, number>} */
|
|
49
|
+
const modulesByReason = new Map();
|
|
50
|
+
|
|
51
|
+
for (const module of compilation.modules) {
|
|
52
|
+
// Runtime modules are generated per compilation, never built and
|
|
53
|
+
// never cached, so counting them makes a cold build look warm.
|
|
54
|
+
if (module instanceof RuntimeModule) continue;
|
|
55
|
+
|
|
56
|
+
total++;
|
|
57
|
+
|
|
58
|
+
if (compilation.builtModules.has(module)) rebuilt++;
|
|
59
|
+
|
|
60
|
+
// Every built module carries one; `cacheable` being `undefined` is
|
|
61
|
+
// the module never reporting either way, not it opting out.
|
|
62
|
+
const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
|
|
63
|
+
|
|
64
|
+
if (buildInfo.cacheable !== false) continue;
|
|
65
|
+
|
|
66
|
+
uncacheable++;
|
|
67
|
+
|
|
68
|
+
const reasons =
|
|
69
|
+
buildInfo.notCacheableReasons &&
|
|
70
|
+
buildInfo.notCacheableReasons.length > 0
|
|
71
|
+
? buildInfo.notCacheableReasons
|
|
72
|
+
: [UNSPECIFIED_REASON];
|
|
73
|
+
|
|
74
|
+
for (const reason of reasons) {
|
|
75
|
+
modulesByReason.set(reason, (modulesByReason.get(reason) || 0) + 1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Work redone despite a warm cache needs both ends: everything rebuilt
|
|
80
|
+
// is a cold build, nothing rebuilt is the cache working.
|
|
81
|
+
const warmRebuild = rebuilt > 0 && rebuilt < total;
|
|
82
|
+
|
|
83
|
+
if (!warmRebuild && uncacheable === 0) return;
|
|
84
|
+
|
|
85
|
+
// Most frequent first, and by reason where two are as frequent: the
|
|
86
|
+
// map is keyed in the order the modules were walked, which is not the
|
|
87
|
+
// same twice, and only three reasons are reported — so an unbroken tie
|
|
88
|
+
// would vary which of them a build names at all.
|
|
89
|
+
const sorted = [...modulesByReason].sort(
|
|
90
|
+
(a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)
|
|
91
|
+
);
|
|
92
|
+
const reasons = sorted
|
|
93
|
+
.slice(0, MAX_REPORTED_REASONS)
|
|
94
|
+
.map(
|
|
95
|
+
([reason, modules]) =>
|
|
96
|
+
`${reason} (${modules} ${modules === 1 ? "module" : "modules"})`
|
|
97
|
+
);
|
|
98
|
+
const remaining = sorted.length - reasons.length;
|
|
99
|
+
|
|
100
|
+
if (remaining > 0) {
|
|
101
|
+
reasons.push(
|
|
102
|
+
`and ${remaining} other ${remaining === 1 ? "reason" : "reasons"}`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const warning = new CacheEffectivenessWarning({
|
|
107
|
+
total,
|
|
108
|
+
rebuilt,
|
|
109
|
+
uncacheable,
|
|
110
|
+
reasons
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
if (hints === "error") {
|
|
114
|
+
compilation.errors.push(warning);
|
|
115
|
+
} else if (hints === "stats") {
|
|
116
|
+
compilation.hints.push(warning);
|
|
117
|
+
} else {
|
|
118
|
+
compilation.warnings.push(warning);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
module.exports = CacheEffectivenessPlugin;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Alexander Akait @alexander-akait
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const ConflictingResourceHintsWarning = require("../errors/ConflictingResourceHintsWarning");
|
|
9
|
+
const { compareStrings } = require("../util/comparators");
|
|
10
|
+
|
|
11
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
12
|
+
/** @import ChunkGroup from "../ChunkGroup" */
|
|
13
|
+
/** @import Compiler from "../Compiler" */
|
|
14
|
+
/**
|
|
15
|
+
* @import {
|
|
16
|
+
* ConflictingResourceHintDetails
|
|
17
|
+
* } from "../errors/ConflictingResourceHintsWarning"
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const PLUGIN_NAME = "ConflictingResourceHintsPlugin";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Names a chunk group for a message, falling back to its chunks: an `import()`
|
|
24
|
+
* without `webpackChunkName` produces a group with no name of its own.
|
|
25
|
+
* @param {ChunkGroup} chunkGroup a chunk group
|
|
26
|
+
* @returns {string} a name for it
|
|
27
|
+
*/
|
|
28
|
+
const getChunkGroupName = (chunkGroup) =>
|
|
29
|
+
chunkGroup.name ||
|
|
30
|
+
chunkGroup.chunks.map((chunk) => chunk.name || `${chunk.id}`).join(", ");
|
|
31
|
+
|
|
32
|
+
class ConflictingResourceHintsPlugin {
|
|
33
|
+
/**
|
|
34
|
+
* Creates an instance of ConflictingResourceHintsPlugin.
|
|
35
|
+
* @param {PerformanceOptions} options the plugin options
|
|
36
|
+
*/
|
|
37
|
+
constructor(options) {
|
|
38
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
39
|
+
this.hints = options.hints;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
44
|
+
* @param {Compiler} compiler the compiler instance
|
|
45
|
+
* @returns {void}
|
|
46
|
+
*/
|
|
47
|
+
apply(compiler) {
|
|
48
|
+
const hints = this.hints;
|
|
49
|
+
|
|
50
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
51
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
52
|
+
const { chunkGraph, moduleGraph } = compilation;
|
|
53
|
+
/** @type {ConflictingResourceHintDetails[]} */
|
|
54
|
+
const links = [];
|
|
55
|
+
|
|
56
|
+
for (const chunkGroup of compilation.chunkGroups) {
|
|
57
|
+
const children = chunkGroup.getChildrenByOrders(
|
|
58
|
+
moduleGraph,
|
|
59
|
+
chunkGraph
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
if (!children.prefetch || !children.preload) continue;
|
|
63
|
+
|
|
64
|
+
const preloaded = new Set(children.preload);
|
|
65
|
+
|
|
66
|
+
for (const child of children.prefetch) {
|
|
67
|
+
if (!preloaded.has(child)) continue;
|
|
68
|
+
|
|
69
|
+
links.push({
|
|
70
|
+
parent: getChunkGroupName(chunkGroup),
|
|
71
|
+
child: getChunkGroupName(child)
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (links.length === 0) return;
|
|
77
|
+
|
|
78
|
+
// Chunk group iteration order is not stable across runs.
|
|
79
|
+
links.sort(
|
|
80
|
+
(a, b) =>
|
|
81
|
+
compareStrings(a.parent, b.parent) ||
|
|
82
|
+
compareStrings(a.child, b.child)
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const warning = new ConflictingResourceHintsWarning(links);
|
|
86
|
+
|
|
87
|
+
if (hints === "error") {
|
|
88
|
+
compilation.errors.push(warning);
|
|
89
|
+
} else if (hints === "stats") {
|
|
90
|
+
compilation.hints.push(warning);
|
|
91
|
+
} else {
|
|
92
|
+
compilation.warnings.push(warning);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
module.exports = ConflictingResourceHintsPlugin;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Alexander Akait @alexander-akait
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const DuplicateModulesWarning = require("../errors/DuplicateModulesWarning");
|
|
9
|
+
const { compareStrings } = require("../util/comparators");
|
|
10
|
+
const getModuleSize = require("./getModuleSize");
|
|
11
|
+
|
|
12
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
13
|
+
/** @import Compiler from "../Compiler" */
|
|
14
|
+
/**
|
|
15
|
+
* @import {
|
|
16
|
+
* DuplicateModuleDetails
|
|
17
|
+
* } from "../errors/DuplicateModulesWarning"
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const PLUGIN_NAME = "DuplicateModulesPlugin";
|
|
21
|
+
|
|
22
|
+
// Enough to name the offenders without printing the module graph.
|
|
23
|
+
const MAX_REPORTED_MODULES = 5;
|
|
24
|
+
|
|
25
|
+
class DuplicateModulesPlugin {
|
|
26
|
+
/**
|
|
27
|
+
* Creates an instance of DuplicateModulesPlugin.
|
|
28
|
+
* @param {PerformanceOptions} options the plugin options
|
|
29
|
+
*/
|
|
30
|
+
constructor(options) {
|
|
31
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
32
|
+
this.hints = options.hints;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
37
|
+
* @param {Compiler} compiler the compiler instance
|
|
38
|
+
* @returns {void}
|
|
39
|
+
*/
|
|
40
|
+
apply(compiler) {
|
|
41
|
+
const hints = this.hints;
|
|
42
|
+
|
|
43
|
+
if (!hints) return;
|
|
44
|
+
|
|
45
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
46
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
47
|
+
const { chunkGraph, requestShortener } = compilation;
|
|
48
|
+
/** @type {DuplicateModuleDetails[]} */
|
|
49
|
+
const duplicated = [];
|
|
50
|
+
let wasted = 0;
|
|
51
|
+
|
|
52
|
+
for (const module of compilation.modules) {
|
|
53
|
+
const chunks = chunkGraph.getNumberOfModuleChunks(module);
|
|
54
|
+
|
|
55
|
+
if (chunks < 2) continue;
|
|
56
|
+
|
|
57
|
+
// The first copy is the one that had to be emitted; the rest are
|
|
58
|
+
// what a shared chunk would save.
|
|
59
|
+
const extra = getModuleSize(module) * (chunks - 1);
|
|
60
|
+
|
|
61
|
+
wasted += extra;
|
|
62
|
+
duplicated.push({
|
|
63
|
+
name: module.readableIdentifier(requestShortener),
|
|
64
|
+
chunks,
|
|
65
|
+
wasted: extra
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (duplicated.length === 0) return;
|
|
70
|
+
|
|
71
|
+
// Ties break by name: which modules finish first is not stable.
|
|
72
|
+
duplicated.sort(
|
|
73
|
+
(a, b) => b.wasted - a.wasted || compareStrings(a.name, b.name)
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const warning = new DuplicateModulesWarning(
|
|
77
|
+
duplicated.slice(0, MAX_REPORTED_MODULES),
|
|
78
|
+
wasted
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
if (hints === "error") {
|
|
82
|
+
compilation.errors.push(warning);
|
|
83
|
+
} else if (hints === "stats") {
|
|
84
|
+
compilation.hints.push(warning);
|
|
85
|
+
} else {
|
|
86
|
+
compilation.warnings.push(warning);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
module.exports = DuplicateModulesPlugin;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Alexander Akait @alexander-akait
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const DuplicatePackagesWarning = require("./DuplicatePackagesWarning");
|
|
9
|
+
|
|
10
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
11
|
+
/** @import Compiler from "../Compiler" */
|
|
12
|
+
/** @import Module from "../Module" */
|
|
13
|
+
/** @import NormalModule from "../NormalModule" */
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* One copy of a package, identified by the directory its description file
|
|
17
|
+
* (usually `package.json`) lives in.
|
|
18
|
+
* @typedef {object} PackageCopy
|
|
19
|
+
* @property {string} version version of this copy
|
|
20
|
+
* @property {string} path directory of this copy
|
|
21
|
+
* @property {Module[]} modules modules included from this copy
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const PLUGIN_NAME = "DuplicatePackagesPlugin";
|
|
25
|
+
|
|
26
|
+
class DuplicatePackagesPlugin {
|
|
27
|
+
/**
|
|
28
|
+
* Creates an instance of DuplicatePackagesPlugin.
|
|
29
|
+
* @param {PerformanceOptions} options the plugin options
|
|
30
|
+
*/
|
|
31
|
+
constructor(options) {
|
|
32
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
33
|
+
this.hints = options.hints;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
38
|
+
* @param {Compiler} compiler the compiler instance
|
|
39
|
+
* @returns {void}
|
|
40
|
+
*/
|
|
41
|
+
apply(compiler) {
|
|
42
|
+
const hints = this.hints;
|
|
43
|
+
|
|
44
|
+
if (!hints) return;
|
|
45
|
+
|
|
46
|
+
// `thisCompilation` keeps the hint to the root build, as child
|
|
47
|
+
// compilations report the copies of their parent a second time
|
|
48
|
+
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
|
|
49
|
+
/** @type {DuplicatePackagesWarning[]} */
|
|
50
|
+
const warnings = [];
|
|
51
|
+
|
|
52
|
+
compilation.hooks.seal.tap(PLUGIN_NAME, () => {
|
|
53
|
+
/** @type {Map<string, Map<string, PackageCopy>>} */
|
|
54
|
+
const packages = new Map();
|
|
55
|
+
for (const module of compilation.modules) {
|
|
56
|
+
const resolveData =
|
|
57
|
+
/** @type {NormalModule} */
|
|
58
|
+
(module).resourceResolveData;
|
|
59
|
+
if (resolveData === undefined) continue;
|
|
60
|
+
const { descriptionFileData, descriptionFileRoot } = resolveData;
|
|
61
|
+
if (descriptionFileData === undefined) continue;
|
|
62
|
+
const { name, version } = descriptionFileData;
|
|
63
|
+
// Only a named and versioned package can be compared with another copy
|
|
64
|
+
if (
|
|
65
|
+
typeof name !== "string" ||
|
|
66
|
+
typeof version !== "string" ||
|
|
67
|
+
descriptionFileRoot === undefined
|
|
68
|
+
) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
let copies = packages.get(name);
|
|
72
|
+
if (copies === undefined) {
|
|
73
|
+
copies = new Map();
|
|
74
|
+
packages.set(name, copies);
|
|
75
|
+
}
|
|
76
|
+
const copy = copies.get(descriptionFileRoot);
|
|
77
|
+
if (copy === undefined) {
|
|
78
|
+
copies.set(descriptionFileRoot, {
|
|
79
|
+
version,
|
|
80
|
+
path: descriptionFileRoot,
|
|
81
|
+
modules: [module]
|
|
82
|
+
});
|
|
83
|
+
} else {
|
|
84
|
+
copy.modules.push(module);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
for (const name of [...packages.keys()].sort()) {
|
|
88
|
+
const copies = /** @type {Map<string, PackageCopy>} */ (
|
|
89
|
+
packages.get(name)
|
|
90
|
+
);
|
|
91
|
+
if (copies.size < 2) continue;
|
|
92
|
+
const warning = new DuplicatePackagesWarning(
|
|
93
|
+
name,
|
|
94
|
+
[...copies.values()].sort((a, b) => (a.path < b.path ? -1 : 1)),
|
|
95
|
+
compilation.moduleGraph,
|
|
96
|
+
compilation.requestShortener
|
|
97
|
+
);
|
|
98
|
+
warnings.push(warning);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Reported past the hash: `createHash` folds every message into it, so
|
|
103
|
+
// a hint pushed earlier would change the build's identity.
|
|
104
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
105
|
+
for (const warning of warnings) {
|
|
106
|
+
if (hints === "error") {
|
|
107
|
+
compilation.errors.push(warning);
|
|
108
|
+
} else if (hints === "stats") {
|
|
109
|
+
compilation.hints.push(warning);
|
|
110
|
+
} else {
|
|
111
|
+
compilation.warnings.push(warning);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
module.exports = DuplicatePackagesPlugin;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Alexander Akait @alexander-akait
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const WebpackError = require("../errors/WebpackError");
|
|
9
|
+
|
|
10
|
+
/** @import Module from "../Module" */
|
|
11
|
+
/** @import ModuleGraph from "../ModuleGraph" */
|
|
12
|
+
/** @import NormalModule from "../NormalModule" */
|
|
13
|
+
/** @import RequestShortener from "../RequestShortener" */
|
|
14
|
+
/** @import { PackageCopy } from "./DuplicatePackagesPlugin" */
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {Module} module the module
|
|
18
|
+
* @returns {string | undefined} directory of the package the module belongs to
|
|
19
|
+
*/
|
|
20
|
+
const getPackagePath = (module) => {
|
|
21
|
+
const resolveData =
|
|
22
|
+
/** @type {NormalModule} */
|
|
23
|
+
(module).resourceResolveData;
|
|
24
|
+
return resolveData && resolveData.descriptionFileRoot;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Finds a module outside of the copy that pulled it into the build, so the
|
|
29
|
+
* warning can name the dependency responsible for this copy.
|
|
30
|
+
* @param {PackageCopy} copy the copy
|
|
31
|
+
* @param {ModuleGraph} moduleGraph the module graph
|
|
32
|
+
* @returns {Module | undefined} a module importing this copy, when there is one
|
|
33
|
+
*/
|
|
34
|
+
const findImporter = (copy, moduleGraph) => {
|
|
35
|
+
for (const module of copy.modules) {
|
|
36
|
+
for (const origin of moduleGraph
|
|
37
|
+
.getIncomingConnectionsByOriginModule(module)
|
|
38
|
+
.keys()) {
|
|
39
|
+
if (origin && getPackagePath(origin) !== copy.path) return origin;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Warning emitted when one package is included more than once in a build,
|
|
46
|
+
* either in different versions or as several copies of the same version.
|
|
47
|
+
*/
|
|
48
|
+
class DuplicatePackagesWarning extends WebpackError {
|
|
49
|
+
/**
|
|
50
|
+
* @param {string} name name of the package
|
|
51
|
+
* @param {PackageCopy[]} copies copies of the package, sorted by path
|
|
52
|
+
* @param {ModuleGraph} moduleGraph the module graph
|
|
53
|
+
* @param {RequestShortener} requestShortener the request shortener
|
|
54
|
+
*/
|
|
55
|
+
constructor(name, copies, moduleGraph, requestShortener) {
|
|
56
|
+
const versions = new Set(copies.map((copy) => copy.version));
|
|
57
|
+
const headline =
|
|
58
|
+
versions.size > 1
|
|
59
|
+
? `Multiple versions of the package "${name}" (${[...versions].join(", ")}) are included in this build:`
|
|
60
|
+
: `The package "${name}" (${copies[0].version}) is included ${copies.length} times in this build:`;
|
|
61
|
+
const copiesList = copies
|
|
62
|
+
.map((copy) => {
|
|
63
|
+
const importer = findImporter(copy, moduleGraph);
|
|
64
|
+
let message = `* ${copy.version} from ${requestShortener.shorten(copy.path)}, ${copy.modules.length} module(s)`;
|
|
65
|
+
if (importer !== undefined) {
|
|
66
|
+
message += `\n Included by ${importer.readableIdentifier(requestShortener)}`;
|
|
67
|
+
}
|
|
68
|
+
return message;
|
|
69
|
+
})
|
|
70
|
+
.join("\n");
|
|
71
|
+
super(`webpack performance recommendations:
|
|
72
|
+
${headline}
|
|
73
|
+
${copiesList}
|
|
74
|
+
Every copy is bundled separately and has its own module state, which increases the output size and can break \`instanceof\` checks and configuration shared through the package.
|
|
75
|
+
Align the version ranges requiring this package, or force a single version with "resolutions"/"overrides" in your package.json.`);
|
|
76
|
+
|
|
77
|
+
/** @type {string} */
|
|
78
|
+
this.name = "DuplicatePackagesWarning";
|
|
79
|
+
/** @type {Module} */
|
|
80
|
+
this.module = copies[0].modules[0];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
module.exports = DuplicatePackagesWarning;
|