@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,138 @@
|
|
|
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 NormalModule = require("../NormalModule");
|
|
9
|
+
const MissingSideEffectsWarning = require("../errors/MissingSideEffectsWarning");
|
|
10
|
+
const { compareStrings } = require("../util/comparators");
|
|
11
|
+
const getModuleSize = require("./getModuleSize");
|
|
12
|
+
const hasOnlyUnusedExports = require("./hasOnlyUnusedExports");
|
|
13
|
+
|
|
14
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
15
|
+
/** @import Compiler from "../Compiler" */
|
|
16
|
+
/** @import Module from "../Module" */
|
|
17
|
+
/**
|
|
18
|
+
* @import {
|
|
19
|
+
* MissingSideEffectsDetails
|
|
20
|
+
* } from "../errors/MissingSideEffectsWarning"
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const PLUGIN_NAME = "MissingSideEffectsPlugin";
|
|
24
|
+
|
|
25
|
+
// Enough to name the costliest without listing the whole dependency tree.
|
|
26
|
+
const MAX_REPORTED_PACKAGES = 5;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The package a module belongs to, when its package.json leaves 'sideEffects'
|
|
30
|
+
* unsaid. Nearly every package does, so only the costly ones are worth naming.
|
|
31
|
+
* @param {Module} module the module to look up
|
|
32
|
+
* @returns {string | undefined} the package name, or undefined
|
|
33
|
+
*/
|
|
34
|
+
const getUndeclaredPackage = (module) => {
|
|
35
|
+
if (!(module instanceof NormalModule)) return undefined;
|
|
36
|
+
|
|
37
|
+
const resolveData = module.resourceResolveData;
|
|
38
|
+
const description = resolveData && resolveData.descriptionFileData;
|
|
39
|
+
|
|
40
|
+
if (!description || typeof description.name !== "string") return undefined;
|
|
41
|
+
if ("sideEffects" in description) return undefined;
|
|
42
|
+
|
|
43
|
+
return description.name;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
class MissingSideEffectsPlugin {
|
|
47
|
+
/**
|
|
48
|
+
* Creates an instance of MissingSideEffectsPlugin.
|
|
49
|
+
* @param {PerformanceOptions} options the plugin options
|
|
50
|
+
*/
|
|
51
|
+
constructor(options) {
|
|
52
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
53
|
+
this.hints = options.hints;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
58
|
+
* @param {Compiler} compiler the compiler instance
|
|
59
|
+
* @returns {void}
|
|
60
|
+
*/
|
|
61
|
+
apply(compiler) {
|
|
62
|
+
const hints = this.hints;
|
|
63
|
+
|
|
64
|
+
if (!hints) return;
|
|
65
|
+
|
|
66
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
67
|
+
/** @type {MissingSideEffectsWarning | undefined} */
|
|
68
|
+
let warning;
|
|
69
|
+
|
|
70
|
+
// Usage is final here, and concatenation has not merged the modules
|
|
71
|
+
// away yet, so each one can still be measured and attributed.
|
|
72
|
+
compilation.hooks.optimizeModules.tap(PLUGIN_NAME, (modules) => {
|
|
73
|
+
const { chunkGraph, moduleGraph } = compilation;
|
|
74
|
+
/** @type {Map<string, { modules: number, size: number }>} */
|
|
75
|
+
const byPackage = new Map();
|
|
76
|
+
let wasted = 0;
|
|
77
|
+
|
|
78
|
+
for (const module of modules) {
|
|
79
|
+
// One webpack already left out costs nothing.
|
|
80
|
+
if (chunkGraph.getNumberOfModuleChunks(module) === 0) continue;
|
|
81
|
+
if (!hasOnlyUnusedExports(module, moduleGraph, chunkGraph)) continue;
|
|
82
|
+
|
|
83
|
+
const name = getUndeclaredPackage(module);
|
|
84
|
+
|
|
85
|
+
if (name === undefined) continue;
|
|
86
|
+
|
|
87
|
+
const size = getModuleSize(module);
|
|
88
|
+
const entry = byPackage.get(name);
|
|
89
|
+
|
|
90
|
+
wasted += size;
|
|
91
|
+
|
|
92
|
+
if (entry === undefined) {
|
|
93
|
+
byPackage.set(name, { modules: 1, size });
|
|
94
|
+
} else {
|
|
95
|
+
entry.modules++;
|
|
96
|
+
entry.size += size;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (byPackage.size === 0) return;
|
|
101
|
+
|
|
102
|
+
/** @type {MissingSideEffectsDetails[]} */
|
|
103
|
+
const packages = [];
|
|
104
|
+
|
|
105
|
+
for (const [name, { modules: count, size }] of byPackage) {
|
|
106
|
+
packages.push({ name, modules: count, size });
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Ties break by name: module order is not stable across runtimes.
|
|
110
|
+
packages.sort(
|
|
111
|
+
(a, b) => b.size - a.size || compareStrings(a.name, b.name)
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
warning = new MissingSideEffectsWarning(
|
|
115
|
+
packages.slice(0, MAX_REPORTED_PACKAGES),
|
|
116
|
+
packages.length,
|
|
117
|
+
wasted
|
|
118
|
+
);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Reported past the hash: `createHash` folds every message into it, so
|
|
122
|
+
// a hint pushed earlier would change the build's identity.
|
|
123
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
124
|
+
if (warning === undefined) return;
|
|
125
|
+
|
|
126
|
+
if (hints === "error") {
|
|
127
|
+
compilation.errors.push(warning);
|
|
128
|
+
} else if (hints === "stats") {
|
|
129
|
+
compilation.hints.push(warning);
|
|
130
|
+
} else {
|
|
131
|
+
compilation.warnings.push(warning);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
module.exports = MissingSideEffectsPlugin;
|
|
@@ -0,0 +1,136 @@
|
|
|
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 MixedExportsWarning = require("../errors/MixedExportsWarning");
|
|
9
|
+
const { compareStrings } = require("../util/comparators");
|
|
10
|
+
|
|
11
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
12
|
+
/** @import Compiler from "../Compiler" */
|
|
13
|
+
/** @import { MixedExportsDetails } from "../errors/MixedExportsWarning" */
|
|
14
|
+
|
|
15
|
+
const PLUGIN_NAME = "MixedExportsPlugin";
|
|
16
|
+
|
|
17
|
+
// Enough to name the offenders without listing every entry.
|
|
18
|
+
const MAX_REPORTED_ENTRIES = 5;
|
|
19
|
+
|
|
20
|
+
// Only these hand the namespace object straight to `require()`, so only here
|
|
21
|
+
// does a default sitting beside named exports change what a consumer receives.
|
|
22
|
+
const AMBIGUOUS_LIBRARY_TYPES = new Set([
|
|
23
|
+
"commonjs",
|
|
24
|
+
"commonjs2",
|
|
25
|
+
"commonjs-module",
|
|
26
|
+
"commonjs-static"
|
|
27
|
+
]);
|
|
28
|
+
|
|
29
|
+
class MixedExportsPlugin {
|
|
30
|
+
/**
|
|
31
|
+
* Creates an instance of MixedExportsPlugin.
|
|
32
|
+
* @param {PerformanceOptions} options the plugin options
|
|
33
|
+
*/
|
|
34
|
+
constructor(options) {
|
|
35
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
36
|
+
this.hints = options.hints;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
41
|
+
* @param {Compiler} compiler the compiler instance
|
|
42
|
+
* @returns {void}
|
|
43
|
+
*/
|
|
44
|
+
apply(compiler) {
|
|
45
|
+
const hints = this.hints;
|
|
46
|
+
|
|
47
|
+
if (!hints) return;
|
|
48
|
+
|
|
49
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
50
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
51
|
+
// hint reported earlier would change the build's identity.
|
|
52
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
53
|
+
const { moduleGraph, outputOptions } = compilation;
|
|
54
|
+
|
|
55
|
+
/** @type {Map<string, MixedExportsDetails[]>} */
|
|
56
|
+
const byType = new Map();
|
|
57
|
+
|
|
58
|
+
for (const [name, entry] of compilation.entries) {
|
|
59
|
+
// An entry can carry its own library, which wins over the output one.
|
|
60
|
+
const library = entry.options.library || outputOptions.library;
|
|
61
|
+
const type = library && library.type;
|
|
62
|
+
|
|
63
|
+
if (!type || !AMBIGUOUS_LIBRARY_TYPES.has(type)) continue;
|
|
64
|
+
|
|
65
|
+
// Naming one export already resolves it, whichever it is.
|
|
66
|
+
if (library.export) continue;
|
|
67
|
+
|
|
68
|
+
// Only the last module of an entry reaches the consumer: every chunk
|
|
69
|
+
// format renders the startup with `entries[entries.length - 1]`.
|
|
70
|
+
const { dependencies } = entry;
|
|
71
|
+
const exported = dependencies[dependencies.length - 1];
|
|
72
|
+
|
|
73
|
+
if (!exported) continue;
|
|
74
|
+
|
|
75
|
+
const module = moduleGraph.getModule(exported);
|
|
76
|
+
|
|
77
|
+
if (!module) continue;
|
|
78
|
+
|
|
79
|
+
const provided = moduleGraph
|
|
80
|
+
.getExportsInfo(module)
|
|
81
|
+
.getProvidedExports();
|
|
82
|
+
|
|
83
|
+
// `true` means "everything", which says nothing about a default.
|
|
84
|
+
if (!Array.isArray(provided)) continue;
|
|
85
|
+
|
|
86
|
+
/** @type {string[]} */
|
|
87
|
+
const named = [];
|
|
88
|
+
let hasDefault = false;
|
|
89
|
+
|
|
90
|
+
for (const it of provided) {
|
|
91
|
+
if (it === "default") {
|
|
92
|
+
hasDefault = true;
|
|
93
|
+
} else {
|
|
94
|
+
named.push(it);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (!hasDefault || named.length === 0) continue;
|
|
99
|
+
|
|
100
|
+
const mixed = byType.get(type);
|
|
101
|
+
const details = { name, named: named.sort(compareStrings) };
|
|
102
|
+
|
|
103
|
+
if (mixed) {
|
|
104
|
+
mixed.push(details);
|
|
105
|
+
} else {
|
|
106
|
+
byType.set(type, [details]);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (byType.size === 0) return;
|
|
111
|
+
|
|
112
|
+
// One report per library type, sorted so a rename cannot reorder them.
|
|
113
|
+
for (const type of [...byType.keys()].sort(compareStrings)) {
|
|
114
|
+
const mixed = /** @type {MixedExportsDetails[]} */ (byType.get(type));
|
|
115
|
+
|
|
116
|
+
mixed.sort((a, b) => compareStrings(a.name, b.name));
|
|
117
|
+
|
|
118
|
+
const warning = new MixedExportsWarning(
|
|
119
|
+
mixed.slice(0, MAX_REPORTED_ENTRIES),
|
|
120
|
+
type
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
if (hints === "error") {
|
|
124
|
+
compilation.errors.push(warning);
|
|
125
|
+
} else if (hints === "stats") {
|
|
126
|
+
compilation.hints.push(warning);
|
|
127
|
+
} else {
|
|
128
|
+
compilation.warnings.push(warning);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
module.exports = MixedExportsPlugin;
|
|
@@ -0,0 +1,178 @@
|
|
|
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 OsDependentRuleWarning = require("../errors/OsDependentRuleWarning");
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @import {
|
|
12
|
+
* Falsy,
|
|
13
|
+
* PerformanceOptions,
|
|
14
|
+
* RuleSetCondition,
|
|
15
|
+
* RuleSetRule
|
|
16
|
+
* } from "../../declarations/WebpackOptions"
|
|
17
|
+
*/
|
|
18
|
+
/** @import Compiler from "../Compiler" */
|
|
19
|
+
|
|
20
|
+
const PLUGIN_NAME = "OsDependentRuleWarningPlugin";
|
|
21
|
+
|
|
22
|
+
// Only these carry a path. `resourceQuery`, `resourceFragment`, `mimetype` and
|
|
23
|
+
// `scheme` legitimately contain a `/`.
|
|
24
|
+
const PATH_PROPERTIES = [
|
|
25
|
+
"test",
|
|
26
|
+
"include",
|
|
27
|
+
"exclude",
|
|
28
|
+
"resource",
|
|
29
|
+
"realResource",
|
|
30
|
+
"issuer"
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
/** @typedef {"posix" | "windows" | undefined} Separator */
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Which separator a pattern can match, walking its source so an escape is never
|
|
37
|
+
* mistaken for the separator after it (`\.` is not `\\`); both means portable.
|
|
38
|
+
* @param {RegExp} regExp the condition
|
|
39
|
+
* @returns {Separator} the only separator it matches, or `undefined` when it is portable
|
|
40
|
+
*/
|
|
41
|
+
const onlyMatchedSeparator = (regExp) => {
|
|
42
|
+
const { source } = regExp;
|
|
43
|
+
let posix = false;
|
|
44
|
+
let windows = false;
|
|
45
|
+
|
|
46
|
+
for (let i = 0; i < source.length; i++) {
|
|
47
|
+
const character = source[i];
|
|
48
|
+
|
|
49
|
+
if (character === "\\") {
|
|
50
|
+
const escaped = source[i + 1];
|
|
51
|
+
|
|
52
|
+
if (escaped === "\\") {
|
|
53
|
+
windows = true;
|
|
54
|
+
} else if (escaped === "/") {
|
|
55
|
+
posix = true;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
i++;
|
|
59
|
+
} else if (character === "/") {
|
|
60
|
+
posix = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (posix === windows) return undefined;
|
|
65
|
+
|
|
66
|
+
return posix ? "posix" : "windows";
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @param {RuleSetCondition} condition the condition to walk
|
|
71
|
+
* @param {(regExp: RegExp) => void} callback called for every regexp within
|
|
72
|
+
* @returns {void}
|
|
73
|
+
*/
|
|
74
|
+
const forEachRegExp = (condition, callback) => {
|
|
75
|
+
if (condition instanceof RegExp) {
|
|
76
|
+
callback(condition);
|
|
77
|
+
} else if (Array.isArray(condition)) {
|
|
78
|
+
for (const item of condition) forEachRegExp(item, callback);
|
|
79
|
+
} else if (condition && typeof condition === "object") {
|
|
80
|
+
// `not` is skipped: negated, a separator says which paths are *excluded*,
|
|
81
|
+
// so the condition still matches the other OS.
|
|
82
|
+
for (const key of ["and", "or"]) {
|
|
83
|
+
const nested = condition[/** @type {keyof typeof condition} */ (key)];
|
|
84
|
+
|
|
85
|
+
if (nested !== undefined) {
|
|
86
|
+
forEachRegExp(/** @type {RuleSetCondition} */ (nested), callback);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
class OsDependentRuleWarningPlugin {
|
|
93
|
+
/**
|
|
94
|
+
* Creates an instance of OsDependentRuleWarningPlugin.
|
|
95
|
+
* @param {PerformanceOptions} options the plugin options
|
|
96
|
+
*/
|
|
97
|
+
constructor(options) {
|
|
98
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
99
|
+
this.hints = options.hints;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
104
|
+
* @param {Compiler} compiler the compiler instance
|
|
105
|
+
* @returns {void}
|
|
106
|
+
*/
|
|
107
|
+
apply(compiler) {
|
|
108
|
+
const hints = this.hints;
|
|
109
|
+
const rules =
|
|
110
|
+
compiler.options.module && compiler.options.module.rules
|
|
111
|
+
? compiler.options.module.rules
|
|
112
|
+
: [];
|
|
113
|
+
|
|
114
|
+
/** @type {string[]} */
|
|
115
|
+
const descriptions = [];
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @param {(RuleSetRule | Falsy)[]} ruleSet rules to walk
|
|
119
|
+
* @param {string} path where `ruleSet` sits in the configuration
|
|
120
|
+
* @returns {void}
|
|
121
|
+
*/
|
|
122
|
+
const walk = (ruleSet, path) => {
|
|
123
|
+
for (let i = 0; i < ruleSet.length; i++) {
|
|
124
|
+
const rule = ruleSet[i];
|
|
125
|
+
|
|
126
|
+
if (!rule || typeof rule !== "object") continue;
|
|
127
|
+
|
|
128
|
+
const rulePath = `${path}[${i}]`;
|
|
129
|
+
|
|
130
|
+
for (const property of PATH_PROPERTIES) {
|
|
131
|
+
const condition = rule[/** @type {keyof RuleSetRule} */ (property)];
|
|
132
|
+
|
|
133
|
+
if (condition === undefined) continue;
|
|
134
|
+
|
|
135
|
+
forEachRegExp(
|
|
136
|
+
/** @type {RuleSetCondition} */ (condition),
|
|
137
|
+
(regExp) => {
|
|
138
|
+
const separator = onlyMatchedSeparator(regExp);
|
|
139
|
+
|
|
140
|
+
if (separator === undefined) return;
|
|
141
|
+
|
|
142
|
+
descriptions.push(
|
|
143
|
+
`${rulePath}.${property} (${regExp}) only matches ${
|
|
144
|
+
separator === "posix" ? "'/'" : "'\\'"
|
|
145
|
+
} paths`
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (Array.isArray(rule.oneOf)) walk(rule.oneOf, `${rulePath}.oneOf`);
|
|
152
|
+
if (Array.isArray(rule.rules)) walk(rule.rules, `${rulePath}.rules`);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
walk(/** @type {RuleSetRule[]} */ (rules), "module.rules");
|
|
157
|
+
|
|
158
|
+
if (descriptions.length === 0) return;
|
|
159
|
+
|
|
160
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
161
|
+
// Reported past the hash: `createHash` folds every message into it, so
|
|
162
|
+
// a hint pushed earlier would change the build's identity.
|
|
163
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
164
|
+
const warning = new OsDependentRuleWarning(descriptions);
|
|
165
|
+
|
|
166
|
+
if (hints === "error") {
|
|
167
|
+
compilation.errors.push(warning);
|
|
168
|
+
} else if (hints === "stats") {
|
|
169
|
+
compilation.hints.push(warning);
|
|
170
|
+
} else {
|
|
171
|
+
compilation.warnings.push(warning);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
module.exports = OsDependentRuleWarningPlugin;
|
|
@@ -0,0 +1,219 @@
|
|
|
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 {
|
|
9
|
+
JAVASCRIPT_MODULE_TYPE_AUTO,
|
|
10
|
+
JAVASCRIPT_MODULE_TYPE_DYNAMIC,
|
|
11
|
+
JAVASCRIPT_MODULE_TYPE_ESM
|
|
12
|
+
} = require("../ModuleTypeConstants");
|
|
13
|
+
const PureAnnotationsWarning = require("../errors/PureAnnotationsWarning");
|
|
14
|
+
const { compareStrings } = require("../util/comparators");
|
|
15
|
+
const { CompilerHintNotationRegExp } = require("../util/magicComment");
|
|
16
|
+
|
|
17
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
18
|
+
/** @import Compiler from "../Compiler" */
|
|
19
|
+
/** @import { Program } from "estree" */
|
|
20
|
+
/** @import { BuildInfo } from "../Module" */
|
|
21
|
+
/** @import JavascriptParser from "../javascript/JavascriptParser" */
|
|
22
|
+
/** @import { PureAnnotationDetails } from "../errors/PureAnnotationsWarning" */
|
|
23
|
+
|
|
24
|
+
const PLUGIN_NAME = "PureAnnotationsPlugin";
|
|
25
|
+
|
|
26
|
+
// Enough to name the offenders without listing every module.
|
|
27
|
+
const MAX_REPORTED_MODULES = 5;
|
|
28
|
+
|
|
29
|
+
// The only three the parser reads the annotation for; before anything else it
|
|
30
|
+
// is just a comment. Kept in step with `JavascriptParser.isPure`.
|
|
31
|
+
const ANNOTATED_TYPES = new Set([
|
|
32
|
+
"CallExpression",
|
|
33
|
+
"NewExpression",
|
|
34
|
+
"TaggedTemplateExpression"
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Collects where every node starts, and which of those starts carry a node the
|
|
39
|
+
* annotation is read for.
|
|
40
|
+
* @param {Program} ast the program
|
|
41
|
+
* @returns {{ starts: number[], annotated: Set<number> }} the two of them
|
|
42
|
+
*/
|
|
43
|
+
const collectStarts = (ast) => {
|
|
44
|
+
/** @type {number[]} */
|
|
45
|
+
const starts = [];
|
|
46
|
+
/** @type {Set<number>} */
|
|
47
|
+
const annotated = new Set();
|
|
48
|
+
/** @type {unknown[]} */
|
|
49
|
+
const queue = [ast];
|
|
50
|
+
|
|
51
|
+
while (queue.length > 0) {
|
|
52
|
+
const node = queue.pop();
|
|
53
|
+
|
|
54
|
+
if (!node || typeof node !== "object") continue;
|
|
55
|
+
|
|
56
|
+
if (Array.isArray(node)) {
|
|
57
|
+
for (const item of /** @type {unknown[]} */ (node)) queue.push(item);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Walked structurally rather than per node type, so a node the estree
|
|
62
|
+
// types do not name is still reached.
|
|
63
|
+
const fields = /** @type {Record<string, unknown>} */ (node);
|
|
64
|
+
const { type, range } = fields;
|
|
65
|
+
|
|
66
|
+
const start = Array.isArray(range)
|
|
67
|
+
? /** @type {unknown[]} */ (range)[0]
|
|
68
|
+
: undefined;
|
|
69
|
+
|
|
70
|
+
if (typeof type === "string" && typeof start === "number") {
|
|
71
|
+
starts.push(start);
|
|
72
|
+
|
|
73
|
+
if (ANNOTATED_TYPES.has(type)) annotated.add(start);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
for (const key of Object.keys(fields)) {
|
|
77
|
+
if (key !== "range" && key !== "loc") queue.push(fields[key]);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Sorted so each annotation can binary-search for the node after it rather
|
|
82
|
+
// than walking every start, which is quadratic on a generated file.
|
|
83
|
+
starts.sort((a, b) => a - b);
|
|
84
|
+
|
|
85
|
+
return { starts, annotated };
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
class PureAnnotationsPlugin {
|
|
89
|
+
/**
|
|
90
|
+
* Creates an instance of PureAnnotationsPlugin.
|
|
91
|
+
* @param {PerformanceOptions} options the plugin options
|
|
92
|
+
*/
|
|
93
|
+
constructor(options) {
|
|
94
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
95
|
+
this.hints = options.hints;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
100
|
+
* @param {Compiler} compiler the compiler instance
|
|
101
|
+
* @returns {void}
|
|
102
|
+
*/
|
|
103
|
+
apply(compiler) {
|
|
104
|
+
const hints = this.hints;
|
|
105
|
+
|
|
106
|
+
if (!hints) return;
|
|
107
|
+
|
|
108
|
+
compiler.hooks.compilation.tap(
|
|
109
|
+
PLUGIN_NAME,
|
|
110
|
+
(compilation, { normalModuleFactory }) => {
|
|
111
|
+
/**
|
|
112
|
+
* @param {JavascriptParser} parser the parser
|
|
113
|
+
*/
|
|
114
|
+
const handler = (parser) => {
|
|
115
|
+
parser.hooks.program.tap(PLUGIN_NAME, (ast, comments) => {
|
|
116
|
+
const pure = comments.filter((comment) =>
|
|
117
|
+
CompilerHintNotationRegExp.Pure.test(comment.value)
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
if (pure.length === 0) return;
|
|
121
|
+
|
|
122
|
+
const { starts, annotated } = collectStarts(ast);
|
|
123
|
+
let wasted = 0;
|
|
124
|
+
|
|
125
|
+
for (const comment of pure) {
|
|
126
|
+
const range = /** @type {[number, number]} */ (comment.range);
|
|
127
|
+
const after = range[1];
|
|
128
|
+
|
|
129
|
+
// Comments are outside every node's range, so the node the
|
|
130
|
+
// annotation applies to is whichever starts first after it.
|
|
131
|
+
let low = 0;
|
|
132
|
+
let high = starts.length;
|
|
133
|
+
|
|
134
|
+
while (low < high) {
|
|
135
|
+
const middle = (low + high) >> 1;
|
|
136
|
+
|
|
137
|
+
if (starts[middle] < after) {
|
|
138
|
+
low = middle + 1;
|
|
139
|
+
} else {
|
|
140
|
+
high = middle;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (low === starts.length || !annotated.has(starts[low])) {
|
|
145
|
+
wasted++;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (wasted === 0) return;
|
|
150
|
+
|
|
151
|
+
// Kept on the module rather than in a map here, so a module the
|
|
152
|
+
// filesystem cache restores rather than parses still reports.
|
|
153
|
+
const buildInfo = /** @type {BuildInfo} */ (
|
|
154
|
+
parser.state.module.buildInfo
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
buildInfo.ineffectivePureAnnotations = wasted;
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
normalModuleFactory.hooks.parser
|
|
162
|
+
.for(JAVASCRIPT_MODULE_TYPE_AUTO)
|
|
163
|
+
.tap(PLUGIN_NAME, handler);
|
|
164
|
+
normalModuleFactory.hooks.parser
|
|
165
|
+
.for(JAVASCRIPT_MODULE_TYPE_ESM)
|
|
166
|
+
.tap(PLUGIN_NAME, handler);
|
|
167
|
+
normalModuleFactory.hooks.parser
|
|
168
|
+
.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
|
|
169
|
+
.tap(PLUGIN_NAME, handler);
|
|
170
|
+
|
|
171
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
172
|
+
// hint reported earlier would change the build's identity.
|
|
173
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
174
|
+
const { requestShortener } = compilation;
|
|
175
|
+
/** @type {PureAnnotationDetails[]} */
|
|
176
|
+
const wasteful = [];
|
|
177
|
+
let total = 0;
|
|
178
|
+
|
|
179
|
+
for (const module of compilation.modules) {
|
|
180
|
+
// Every built module carries one, so only the field is in question.
|
|
181
|
+
const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
|
|
182
|
+
|
|
183
|
+
if (!buildInfo.ineffectivePureAnnotations) continue;
|
|
184
|
+
|
|
185
|
+
const count = buildInfo.ineffectivePureAnnotations;
|
|
186
|
+
|
|
187
|
+
total += count;
|
|
188
|
+
wasteful.push({
|
|
189
|
+
name: module.readableIdentifier(requestShortener),
|
|
190
|
+
count
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (wasteful.length === 0) return;
|
|
195
|
+
|
|
196
|
+
// Ties break by name: module order is not stable across runs.
|
|
197
|
+
wasteful.sort(
|
|
198
|
+
(a, b) => b.count - a.count || compareStrings(a.name, b.name)
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
const warning = new PureAnnotationsWarning(
|
|
202
|
+
wasteful.slice(0, MAX_REPORTED_MODULES),
|
|
203
|
+
total
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
if (hints === "error") {
|
|
207
|
+
compilation.errors.push(warning);
|
|
208
|
+
} else if (hints === "stats") {
|
|
209
|
+
compilation.hints.push(warning);
|
|
210
|
+
} else {
|
|
211
|
+
compilation.warnings.push(warning);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
module.exports = PureAnnotationsPlugin;
|