webpack 5.93.0 → 5.94.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 +8 -5
- package/bin/webpack.js +6 -7
- package/hot/log.js +1 -2
- package/hot/only-dev-server.js +1 -1
- package/hot/poll.js +1 -1
- package/hot/signal.js +1 -1
- package/lib/APIPlugin.js +4 -3
- package/lib/AbstractMethodError.js +10 -5
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/BannerPlugin.js +12 -6
- package/lib/Cache.js +8 -10
- package/lib/CacheFacade.js +3 -3
- package/lib/CaseSensitiveModulesWarning.js +5 -7
- package/lib/Chunk.js +14 -11
- package/lib/ChunkGraph.js +58 -36
- package/lib/ChunkGroup.js +2 -3
- package/lib/ChunkTemplate.js +43 -0
- package/lib/CleanPlugin.js +10 -11
- package/lib/CodeGenerationResults.js +6 -5
- package/lib/CommentCompilationWarning.js +0 -1
- package/lib/Compilation.js +223 -191
- package/lib/Compiler.js +81 -82
- package/lib/ConcatenationScope.js +3 -6
- package/lib/ConditionalInitFragment.js +6 -7
- package/lib/ConstPlugin.js +7 -15
- package/lib/ContextExclusionPlugin.js +3 -3
- package/lib/ContextModule.js +33 -20
- package/lib/ContextModuleFactory.js +89 -44
- package/lib/ContextReplacementPlugin.js +10 -9
- package/lib/DefinePlugin.js +75 -68
- package/lib/DelegatedModule.js +7 -3
- package/lib/DelegatedModuleFactoryPlugin.js +36 -22
- package/lib/DelegatedPlugin.js +4 -0
- package/lib/DependenciesBlock.js +0 -1
- package/lib/Dependency.js +10 -14
- package/lib/DllEntryPlugin.js +4 -2
- package/lib/DllModuleFactory.js +1 -0
- package/lib/DllPlugin.js +9 -7
- package/lib/DllReferencePlugin.js +30 -15
- package/lib/EntryPlugin.js +1 -3
- package/lib/EnvironmentPlugin.js +5 -2
- package/lib/ErrorHelpers.js +11 -12
- package/lib/EvalDevToolModulePlugin.js +10 -12
- package/lib/EvalSourceMapDevToolPlugin.js +15 -13
- package/lib/ExportsInfo.js +185 -120
- package/lib/ExternalModule.js +104 -64
- package/lib/ExternalModuleFactoryPlugin.js +23 -10
- package/lib/FileSystemInfo.js +791 -422
- package/lib/FlagAllModulesAsUsedPlugin.js +1 -1
- package/lib/FlagDependencyExportsPlugin.js +12 -11
- package/lib/FlagDependencyUsagePlugin.js +1 -1
- package/lib/Generator.js +2 -5
- package/lib/GraphHelpers.js +3 -2
- package/lib/HookWebpackError.js +8 -10
- package/lib/HotModuleReplacementPlugin.js +78 -64
- package/lib/IgnoreErrorModuleFactory.js +3 -3
- package/lib/IgnorePlugin.js +1 -3
- package/lib/IgnoreWarningsPlugin.js +6 -9
- package/lib/InitFragment.js +2 -3
- package/lib/LibManifestPlugin.js +4 -3
- package/lib/MainTemplate.js +72 -19
- package/lib/Module.js +25 -9
- package/lib/ModuleBuildError.js +4 -11
- package/lib/ModuleDependencyError.js +5 -5
- package/lib/ModuleDependencyWarning.js +5 -5
- package/lib/ModuleError.js +1 -5
- package/lib/ModuleFilenameHelpers.js +29 -46
- package/lib/ModuleGraph.js +7 -6
- package/lib/ModuleGraphConnection.js +6 -6
- package/lib/ModuleInfoHeaderPlugin.js +82 -30
- package/lib/ModuleParseError.js +8 -9
- package/lib/ModuleRestoreError.js +1 -1
- package/lib/ModuleStoreError.js +1 -1
- package/lib/ModuleTemplate.js +33 -1
- package/lib/ModuleTypeConstants.js +21 -22
- package/lib/ModuleWarning.js +1 -5
- package/lib/MultiCompiler.js +24 -26
- package/lib/MultiStats.js +73 -31
- package/lib/MultiWatching.js +1 -1
- package/lib/NormalModule.js +126 -69
- package/lib/NormalModuleFactory.js +53 -49
- package/lib/OptimizationStages.js +3 -3
- package/lib/ProgressPlugin.js +9 -9
- package/lib/ProvidePlugin.js +4 -4
- package/lib/RuntimeGlobals.js +71 -70
- package/lib/RuntimeModule.js +1 -1
- package/lib/RuntimePlugin.js +24 -12
- package/lib/RuntimeTemplate.js +40 -44
- package/lib/SizeFormatHelpers.js +2 -4
- package/lib/SourceMapDevToolPlugin.js +42 -34
- package/lib/Stats.js +5 -11
- package/lib/Template.js +18 -24
- package/lib/TemplatedPathPlugin.js +12 -10
- package/lib/WarnDeprecatedOptionPlugin.js +0 -1
- package/lib/WatchIgnorePlugin.js +26 -9
- package/lib/Watching.js +10 -5
- package/lib/WebpackOptionsApply.js +84 -62
- package/lib/asset/AssetGenerator.js +107 -42
- package/lib/asset/AssetModulesPlugin.js +29 -23
- package/lib/asset/AssetSourceGenerator.js +2 -7
- package/lib/async-modules/AwaitDependenciesInitFragment.js +6 -7
- package/lib/buildChunkGraph.js +14 -19
- package/lib/cache/IdleFileCachePlugin.js +4 -4
- package/lib/cache/MemoryWithGcCachePlugin.js +5 -5
- package/lib/cache/PackFileCacheStrategy.js +51 -50
- package/lib/cache/ResolverCachePlugin.js +6 -6
- package/lib/cache/mergeEtags.js +16 -21
- package/lib/cli.js +148 -104
- package/lib/config/browserslistTargetHandler.js +16 -13
- package/lib/config/defaults.js +31 -28
- package/lib/config/normalization.js +335 -344
- package/lib/config/target.js +42 -52
- package/lib/container/ContainerEntryModule.js +2 -2
- package/lib/container/ContainerPlugin.js +1 -1
- package/lib/container/RemoteRuntimeModule.js +11 -8
- package/lib/container/options.js +18 -4
- package/lib/css/CssExportsGenerator.js +26 -24
- package/lib/css/CssGenerator.js +9 -4
- package/lib/css/CssLoadingRuntimeModule.js +10 -10
- package/lib/css/CssModulesPlugin.js +127 -47
- package/lib/css/CssParser.js +20 -18
- package/lib/css/walkCssTokens.js +80 -95
- package/lib/debug/ProfilingPlugin.js +19 -20
- package/lib/dependencies/AMDDefineDependency.js +1 -1
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +83 -47
- package/lib/dependencies/AMDRequireArrayDependency.js +9 -10
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +22 -16
- package/lib/dependencies/AMDRuntimeModules.js +2 -2
- package/lib/dependencies/CommonJsDependencyHelpers.js +6 -2
- package/lib/dependencies/CommonJsExportRequireDependency.js +37 -41
- package/lib/dependencies/CommonJsExportsDependency.js +0 -1
- package/lib/dependencies/CommonJsExportsParserPlugin.js +19 -23
- package/lib/dependencies/CommonJsFullRequireDependency.js +1 -1
- package/lib/dependencies/CommonJsImportsParserPlugin.js +52 -61
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +6 -8
- package/lib/dependencies/ConstDependency.js +1 -1
- package/lib/dependencies/ContextDependency.js +1 -1
- package/lib/dependencies/ContextDependencyHelpers.js +31 -34
- package/lib/dependencies/ContextElementDependency.js +2 -2
- package/lib/dependencies/CriticalDependencyWarning.js +1 -1
- package/lib/dependencies/CssExportDependency.js +7 -7
- package/lib/dependencies/CssImportDependency.js +0 -2
- package/lib/dependencies/CssLocalIdentifierDependency.js +3 -3
- package/lib/dependencies/CssSelfLocalIdentifierDependency.js +2 -1
- package/lib/dependencies/CssUrlDependency.js +4 -5
- package/lib/dependencies/DynamicExports.js +5 -5
- package/lib/dependencies/ExportsInfoDependency.js +1 -2
- package/lib/dependencies/HarmonyAcceptImportDependency.js +1 -1
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +4 -5
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +27 -16
- package/lib/dependencies/HarmonyExportExpressionDependency.js +1 -1
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +107 -64
- package/lib/dependencies/HarmonyExports.js +2 -2
- package/lib/dependencies/HarmonyImportDependency.js +2 -4
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +19 -4
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +40 -15
- package/lib/dependencies/ImportDependency.js +1 -1
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +5 -5
- package/lib/dependencies/ImportMetaPlugin.js +11 -13
- package/lib/dependencies/ImportParserPlugin.js +39 -44
- package/lib/dependencies/JsonExportsDependency.js +22 -18
- package/lib/dependencies/LoaderPlugin.js +47 -36
- package/lib/dependencies/LocalModule.js +1 -1
- package/lib/dependencies/LocalModulesHelpers.js +4 -4
- package/lib/dependencies/ModuleDecoratorDependency.js +1 -1
- package/lib/dependencies/ProvidedDependency.js +1 -1
- package/lib/dependencies/PureExpressionDependency.js +6 -6
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
- package/lib/dependencies/RuntimeRequirementsDependency.js +1 -1
- package/lib/dependencies/SystemPlugin.js +1 -1
- package/lib/dependencies/URLDependency.js +3 -3
- package/lib/dependencies/URLPlugin.js +66 -12
- package/lib/dependencies/WorkerPlugin.js +25 -24
- package/lib/dependencies/processExportInfo.js +3 -1
- package/lib/electron/ElectronTargetPlugin.js +1 -0
- package/lib/esm/ModuleChunkFormatPlugin.js +3 -3
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +7 -3
- package/lib/formatLocation.js +1 -2
- package/lib/hmr/HotModuleReplacement.runtime.js +4 -5
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -0
- package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +9 -12
- package/lib/hmr/LazyCompilationPlugin.js +27 -12
- package/lib/hmr/lazyCompilationBackend.js +64 -40
- package/lib/ids/ChunkModuleIdRangePlugin.js +1 -3
- package/lib/ids/DeterministicChunkIdsPlugin.js +2 -4
- package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
- package/lib/ids/HashedModuleIdsPlugin.js +5 -1
- package/lib/ids/IdHelpers.js +29 -39
- package/lib/ids/SyncModuleIdsPlugin.js +7 -2
- package/lib/index.js +1 -5
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +5 -4
- package/lib/javascript/BasicEvaluatedExpression.js +4 -19
- package/lib/javascript/ChunkHelpers.js +1 -1
- package/lib/javascript/CommonJsChunkFormatPlugin.js +3 -2
- package/lib/javascript/EnableChunkLoadingPlugin.js +7 -6
- package/lib/javascript/JavascriptGenerator.js +23 -7
- package/lib/javascript/JavascriptModulesPlugin.js +91 -69
- package/lib/javascript/JavascriptParser.js +179 -200
- package/lib/javascript/JavascriptParserHelpers.js +20 -21
- package/lib/javascript/StartupHelpers.js +41 -13
- package/lib/json/JsonGenerator.js +7 -13
- package/lib/json/JsonModulesPlugin.js +1 -4
- package/lib/json/JsonParser.js +5 -3
- package/lib/library/AmdLibraryPlugin.js +12 -16
- package/lib/library/AssignLibraryPlugin.js +8 -10
- package/lib/library/EnableLibraryPlugin.js +15 -14
- package/lib/library/JsonpLibraryPlugin.js +2 -1
- package/lib/library/ModernModuleLibraryPlugin.js +8 -6
- package/lib/library/ModuleLibraryPlugin.js +2 -1
- package/lib/library/SystemLibraryPlugin.js +2 -1
- package/lib/library/UmdLibraryPlugin.js +66 -92
- package/lib/logging/Logger.js +32 -4
- package/lib/logging/createConsoleLogger.js +12 -13
- package/lib/logging/runtime.js +7 -8
- package/lib/logging/truncateArgs.js +5 -8
- package/lib/node/NodeWatchFileSystem.js +3 -18
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +2 -2
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +1 -0
- package/lib/node/RequireChunkLoadingRuntimeModule.js +2 -2
- package/lib/node/nodeConsole.js +22 -22
- package/lib/optimize/AggressiveMergingPlugin.js +2 -4
- package/lib/optimize/AggressiveSplittingPlugin.js +16 -19
- package/lib/optimize/ConcatenatedModule.js +80 -48
- package/lib/optimize/EnsureChunkConditionsPlugin.js +1 -1
- package/lib/optimize/FlagIncludedChunksPlugin.js +3 -3
- package/lib/optimize/InnerGraph.js +17 -17
- package/lib/optimize/InnerGraphPlugin.js +8 -7
- package/lib/optimize/LimitChunkCountPlugin.js +2 -3
- package/lib/optimize/MangleExportsPlugin.js +1 -0
- package/lib/optimize/MinMaxSizeWarning.js +1 -1
- package/lib/optimize/ModuleConcatenationPlugin.js +54 -78
- package/lib/optimize/RealContentHashPlugin.js +7 -10
- package/lib/optimize/RemoveParentModulesPlugin.js +3 -3
- package/lib/optimize/SideEffectsFlagPlugin.js +6 -2
- package/lib/optimize/SplitChunksPlugin.js +34 -30
- package/lib/performance/SizeLimitsPlugin.js +2 -2
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +1 -1
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +1 -1
- package/lib/rules/BasicEffectRulePlugin.js +3 -1
- package/lib/rules/BasicMatcherRulePlugin.js +3 -1
- package/lib/rules/ObjectMatcherRulePlugin.js +4 -1
- package/lib/rules/RuleSetCompiler.js +41 -22
- package/lib/rules/UseEffectRulePlugin.js +36 -32
- package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
- package/lib/runtime/AutoPublicPathRuntimeModule.js +8 -3
- package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +2 -2
- package/lib/runtime/DefinePropertyGettersRuntimeModule.js +1 -1
- package/lib/runtime/EnsureChunkRuntimeModule.js +10 -11
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +11 -17
- package/lib/runtime/LoadScriptRuntimeModule.js +17 -18
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +1 -3
- package/lib/schemes/DataUriPlugin.js +1 -1
- package/lib/schemes/HttpUriPlugin.js +241 -126
- package/lib/serialization/BinaryMiddleware.js +44 -28
- package/lib/serialization/DateObjectSerializer.js +1 -0
- package/lib/serialization/ErrorObjectSerializer.js +2 -0
- package/lib/serialization/FileMiddleware.js +154 -106
- package/lib/serialization/MapObjectSerializer.js +2 -1
- package/lib/serialization/NullPrototypeObjectSerializer.js +3 -2
- package/lib/serialization/ObjectMiddleware.js +52 -56
- package/lib/serialization/PlainObjectSerializer.js +32 -6
- package/lib/serialization/RegExpObjectSerializer.js +1 -0
- package/lib/serialization/Serializer.js +4 -5
- package/lib/serialization/SerializerMiddleware.js +6 -6
- package/lib/serialization/SetObjectSerializer.js +2 -1
- package/lib/sharing/ConsumeSharedPlugin.js +116 -97
- package/lib/sharing/ConsumeSharedRuntimeModule.js +4 -4
- package/lib/sharing/ProvideForSharedDependency.js +0 -1
- package/lib/sharing/ProvideSharedPlugin.js +2 -2
- package/lib/sharing/resolveMatchedConfigs.js +2 -1
- package/lib/sharing/utils.js +15 -27
- package/lib/stats/DefaultStatsFactoryPlugin.js +424 -281
- package/lib/stats/DefaultStatsPresetPlugin.js +73 -18
- package/lib/stats/DefaultStatsPrinterPlugin.js +370 -101
- package/lib/stats/StatsFactory.js +127 -56
- package/lib/stats/StatsPrinter.js +75 -44
- package/lib/util/ArrayHelpers.js +8 -4
- package/lib/util/ArrayQueue.js +1 -1
- package/lib/util/AsyncQueue.js +31 -12
- package/lib/util/IterableHelpers.js +3 -4
- package/lib/util/LazyBucketSortedSet.js +60 -44
- package/lib/util/LazySet.js +1 -0
- package/lib/util/MapHelpers.js +1 -3
- package/lib/util/ParallelismFactorCalculator.js +1 -1
- package/lib/util/Queue.js +1 -1
- package/lib/util/Semaphore.js +4 -7
- package/lib/util/SetHelpers.js +5 -5
- package/lib/util/SortableSet.js +4 -3
- package/lib/util/StackedCacheMap.js +4 -6
- package/lib/util/StackedMap.js +1 -3
- package/lib/util/StringXor.js +0 -5
- package/lib/util/TupleQueue.js +1 -1
- package/lib/util/TupleSet.js +15 -5
- package/lib/util/URLAbsoluteSpecifier.js +7 -7
- package/lib/util/WeakTupleMap.js +19 -21
- package/lib/util/binarySearchBounds.js +5 -12
- package/lib/util/chainedImports.js +1 -1
- package/lib/util/cleverMerge.js +21 -19
- package/lib/util/comparators.js +57 -52
- package/lib/util/compileBooleanMatcher.js +3 -6
- package/lib/util/conventions.js +8 -11
- package/lib/util/createHash.js +9 -6
- package/lib/util/deprecation.js +22 -12
- package/lib/util/deterministicGrouping.js +19 -26
- package/lib/util/findGraphRoots.js +2 -2
- package/lib/util/fs.js +31 -31
- package/lib/util/hash/md4.js +2 -2
- package/lib/util/hash/wasm-hash.js +7 -7
- package/lib/util/hash/xxhash64.js +2 -2
- package/lib/util/identifier.js +81 -59
- package/lib/util/memoize.js +8 -10
- package/lib/util/mergeScope.js +6 -9
- package/lib/util/nonNumericOnlyHash.js +2 -2
- package/lib/util/numberHash.js +1 -6
- package/lib/util/objectToMap.js +0 -1
- package/lib/util/propertyAccess.js +2 -5
- package/lib/util/propertyName.js +1 -3
- package/lib/util/registerExternalSerializer.js +1 -1
- package/lib/util/runtime.js +103 -113
- package/lib/util/semver.js +29 -27
- package/lib/util/serialization.js +16 -1
- package/lib/util/smartGrouping.js +5 -5
- package/lib/util/source.js +1 -1
- package/lib/wasm/EnableWasmLoadingPlugin.js +5 -4
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +3 -3
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -6
- package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +3 -3
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +20 -19
- package/lib/wasm-sync/WebAssemblyGenerator.js +14 -29
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +1 -1
- package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +2 -3
- package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -1
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +1 -1
- package/package.json +15 -14
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +1 -0
- package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
- package/schemas/plugins/container/ExternalsType.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +1 -0
- package/types.d.ts +667 -347
@@ -11,83 +11,108 @@ const smartGrouping = require("../util/smartGrouping");
|
|
11
11
|
|
12
12
|
/** @typedef {import("../Chunk")} Chunk */
|
13
13
|
/** @typedef {import("../Compilation")} Compilation */
|
14
|
+
/** @typedef {import("../Compilation").NormalizedStatsOptions} NormalizedStatsOptions */
|
14
15
|
/** @typedef {import("../Module")} Module */
|
15
16
|
/** @typedef {import("../WebpackError")} WebpackError */
|
17
|
+
/** @typedef {import("../util/comparators").Comparator<any>} Comparator */
|
16
18
|
/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
|
17
|
-
|
18
19
|
/** @typedef {import("../util/smartGrouping").GroupConfig<any, object>} GroupConfig */
|
19
20
|
|
20
21
|
/**
|
21
22
|
* @typedef {object} KnownStatsFactoryContext
|
22
23
|
* @property {string} type
|
23
|
-
* @property {function(string): string
|
24
|
-
* @property {Compilation
|
25
|
-
* @property {Set<Module
|
26
|
-
* @property {Map<string,Chunk[]
|
27
|
-
* @property {Map<string,Chunk[]
|
28
|
-
* @property {RuntimeSpec
|
29
|
-
* @property {function(Compilation): WebpackError[]
|
30
|
-
* @property {function(Compilation): WebpackError[]
|
24
|
+
* @property {function(string): string} makePathsRelative
|
25
|
+
* @property {Compilation} compilation
|
26
|
+
* @property {Set<Module>} rootModules
|
27
|
+
* @property {Map<string,Chunk[]>} compilationFileToChunks
|
28
|
+
* @property {Map<string,Chunk[]>} compilationAuxiliaryFileToChunks
|
29
|
+
* @property {RuntimeSpec} runtime
|
30
|
+
* @property {function(Compilation): WebpackError[]} cachedGetErrors
|
31
|
+
* @property {function(Compilation): WebpackError[]} cachedGetWarnings
|
32
|
+
*/
|
33
|
+
|
34
|
+
/** @typedef {Record<string, any> & KnownStatsFactoryContext} StatsFactoryContext */
|
35
|
+
|
36
|
+
/** @typedef {any} CreatedObject */
|
37
|
+
/** @typedef {any} FactoryData */
|
38
|
+
/** @typedef {any} FactoryDataItem */
|
39
|
+
/** @typedef {any} Result */
|
40
|
+
/** @typedef {Record<string, any>} ObjectForExtract */
|
41
|
+
|
42
|
+
/**
|
43
|
+
* @typedef {object} StatsFactoryHooks
|
44
|
+
* @property {HookMap<SyncBailHook<[ObjectForExtract, FactoryData, StatsFactoryContext], undefined>>} extract
|
45
|
+
* @property {HookMap<SyncBailHook<[FactoryDataItem, StatsFactoryContext, number, number], boolean | undefined>>} filter
|
46
|
+
* @property {HookMap<SyncBailHook<[Comparator[], StatsFactoryContext], undefined>>} sort
|
47
|
+
* @property {HookMap<SyncBailHook<[FactoryDataItem, StatsFactoryContext, number, number], boolean | undefined>>} filterSorted
|
48
|
+
* @property {HookMap<SyncBailHook<[GroupConfig[], StatsFactoryContext], undefined>>} groupResults
|
49
|
+
* @property {HookMap<SyncBailHook<[Comparator[], StatsFactoryContext], undefined>>} sortResults
|
50
|
+
* @property {HookMap<SyncBailHook<[FactoryDataItem, StatsFactoryContext, number, number], boolean | undefined>>} filterResults
|
51
|
+
* @property {HookMap<SyncBailHook<[FactoryDataItem[], StatsFactoryContext], Result>>} merge
|
52
|
+
* @property {HookMap<SyncBailHook<[Result, StatsFactoryContext], Result>>} result
|
53
|
+
* @property {HookMap<SyncBailHook<[FactoryDataItem, StatsFactoryContext], string>>} getItemName
|
54
|
+
* @property {HookMap<SyncBailHook<[FactoryDataItem, StatsFactoryContext], StatsFactory | undefined>>} getItemFactory
|
31
55
|
*/
|
32
56
|
|
33
|
-
/**
|
57
|
+
/**
|
58
|
+
* @template T
|
59
|
+
* @typedef {Map<string, T[]>} Caches
|
60
|
+
*/
|
34
61
|
|
35
62
|
class StatsFactory {
|
36
63
|
constructor() {
|
64
|
+
/** @type {StatsFactoryHooks} */
|
37
65
|
this.hooks = Object.freeze({
|
38
|
-
/** @type {HookMap<SyncBailHook<[object, any, StatsFactoryContext]>>} */
|
39
66
|
extract: new HookMap(
|
40
67
|
() => new SyncBailHook(["object", "data", "context"])
|
41
68
|
),
|
42
|
-
/** @type {HookMap<SyncBailHook<[any, StatsFactoryContext, number, number]>>} */
|
43
69
|
filter: new HookMap(
|
44
70
|
() => new SyncBailHook(["item", "context", "index", "unfilteredIndex"])
|
45
71
|
),
|
46
|
-
/** @type {HookMap<SyncBailHook<[(function(any, any): number)[], StatsFactoryContext]>>} */
|
47
72
|
sort: new HookMap(() => new SyncBailHook(["comparators", "context"])),
|
48
|
-
/** @type {HookMap<SyncBailHook<[any, StatsFactoryContext, number, number]>>} */
|
49
73
|
filterSorted: new HookMap(
|
50
74
|
() => new SyncBailHook(["item", "context", "index", "unfilteredIndex"])
|
51
75
|
),
|
52
|
-
/** @type {HookMap<SyncBailHook<[GroupConfig[], StatsFactoryContext]>>} */
|
53
76
|
groupResults: new HookMap(
|
54
77
|
() => new SyncBailHook(["groupConfigs", "context"])
|
55
78
|
),
|
56
|
-
/** @type {HookMap<SyncBailHook<[(function(any, any): number)[], StatsFactoryContext]>>} */
|
57
79
|
sortResults: new HookMap(
|
58
80
|
() => new SyncBailHook(["comparators", "context"])
|
59
81
|
),
|
60
|
-
/** @type {HookMap<SyncBailHook<[any, StatsFactoryContext, number, number]>>} */
|
61
82
|
filterResults: new HookMap(
|
62
83
|
() => new SyncBailHook(["item", "context", "index", "unfilteredIndex"])
|
63
84
|
),
|
64
|
-
/** @type {HookMap<SyncBailHook<[any[], StatsFactoryContext]>>} */
|
65
85
|
merge: new HookMap(() => new SyncBailHook(["items", "context"])),
|
66
|
-
/** @type {HookMap<SyncBailHook<[any[], StatsFactoryContext]>>} */
|
67
86
|
result: new HookMap(() => new SyncWaterfallHook(["result", "context"])),
|
68
|
-
/** @type {HookMap<SyncBailHook<[any, StatsFactoryContext]>>} */
|
69
87
|
getItemName: new HookMap(() => new SyncBailHook(["item", "context"])),
|
70
|
-
/** @type {HookMap<SyncBailHook<[any, StatsFactoryContext]>>} */
|
71
88
|
getItemFactory: new HookMap(() => new SyncBailHook(["item", "context"]))
|
72
89
|
});
|
73
90
|
const hooks = this.hooks;
|
74
|
-
this._caches =
|
75
|
-
/** @type {Record<keyof typeof hooks, Map<string, SyncBailHook<[any[], StatsFactoryContext]>[]>>} */ ({});
|
91
|
+
this._caches = /** @type {TODO} */ ({});
|
76
92
|
for (const key of Object.keys(hooks)) {
|
77
|
-
this._caches[key] = new Map();
|
93
|
+
this._caches[/** @type {keyof StatsFactoryHooks} */ (key)] = new Map();
|
78
94
|
}
|
79
95
|
this._inCreate = false;
|
80
96
|
}
|
81
97
|
|
98
|
+
/**
|
99
|
+
* @template {StatsFactoryHooks[keyof StatsFactoryHooks]} HM
|
100
|
+
* @template {HM extends HookMap<infer H> ? H : never} H
|
101
|
+
* @param {HM} hookMap hook map
|
102
|
+
* @param {Caches<H>} cache cache
|
103
|
+
* @param {string} type type
|
104
|
+
* @returns {H[]} hooks
|
105
|
+
* @private
|
106
|
+
*/
|
82
107
|
_getAllLevelHooks(hookMap, cache, type) {
|
83
108
|
const cacheEntry = cache.get(type);
|
84
109
|
if (cacheEntry !== undefined) {
|
85
110
|
return cacheEntry;
|
86
111
|
}
|
87
|
-
const hooks = [];
|
112
|
+
const hooks = /** @type {H[]} */ ([]);
|
88
113
|
const typeParts = type.split(".");
|
89
114
|
for (let i = 0; i < typeParts.length; i++) {
|
90
|
-
const hook = hookMap.get(typeParts.slice(i).join("."));
|
115
|
+
const hook = /** @type {H} */ (hookMap.get(typeParts.slice(i).join(".")));
|
91
116
|
if (hook) {
|
92
117
|
hooks.push(hook);
|
93
118
|
}
|
@@ -96,27 +121,62 @@ class StatsFactory {
|
|
96
121
|
return hooks;
|
97
122
|
}
|
98
123
|
|
124
|
+
/**
|
125
|
+
* @template {StatsFactoryHooks[keyof StatsFactoryHooks]} HM
|
126
|
+
* @template {HM extends HookMap<infer H> ? H : never} H
|
127
|
+
* @template {H extends import("tapable").Hook<any, infer R> ? R : never} R
|
128
|
+
* @param {HM} hookMap hook map
|
129
|
+
* @param {Caches<H>} cache cache
|
130
|
+
* @param {string} type type
|
131
|
+
* @param {function(H): R | undefined} fn fn
|
132
|
+
* @returns {R | undefined} hook
|
133
|
+
* @private
|
134
|
+
*/
|
99
135
|
_forEachLevel(hookMap, cache, type, fn) {
|
100
136
|
for (const hook of this._getAllLevelHooks(hookMap, cache, type)) {
|
101
|
-
const result = fn(hook);
|
137
|
+
const result = fn(/** @type {H} */ (hook));
|
102
138
|
if (result !== undefined) return result;
|
103
139
|
}
|
104
140
|
}
|
105
141
|
|
142
|
+
/**
|
143
|
+
* @template {StatsFactoryHooks[keyof StatsFactoryHooks]} HM
|
144
|
+
* @template {HM extends HookMap<infer H> ? H : never} H
|
145
|
+
* @param {HM} hookMap hook map
|
146
|
+
* @param {Caches<H>} cache cache
|
147
|
+
* @param {string} type type
|
148
|
+
* @param {FactoryData} data data
|
149
|
+
* @param {function(H, FactoryData): FactoryData} fn fn
|
150
|
+
* @returns {FactoryData} data
|
151
|
+
* @private
|
152
|
+
*/
|
106
153
|
_forEachLevelWaterfall(hookMap, cache, type, data, fn) {
|
107
154
|
for (const hook of this._getAllLevelHooks(hookMap, cache, type)) {
|
108
|
-
data = fn(hook, data);
|
155
|
+
data = fn(/** @type {H} */ (hook), data);
|
109
156
|
}
|
110
157
|
return data;
|
111
158
|
}
|
112
159
|
|
160
|
+
/**
|
161
|
+
* @template {StatsFactoryHooks[keyof StatsFactoryHooks]} T
|
162
|
+
* @template {T extends HookMap<infer H> ? H : never} H
|
163
|
+
* @template {H extends import("tapable").Hook<any, infer R> ? R : never} R
|
164
|
+
* @param {T} hookMap hook map
|
165
|
+
* @param {Caches<H>} cache cache
|
166
|
+
* @param {string} type type
|
167
|
+
* @param {Array<FactoryData>} items items
|
168
|
+
* @param {function(H, R, number, number): R | undefined} fn fn
|
169
|
+
* @param {boolean} forceClone force clone
|
170
|
+
* @returns {R[]} result for each level
|
171
|
+
* @private
|
172
|
+
*/
|
113
173
|
_forEachLevelFilter(hookMap, cache, type, items, fn, forceClone) {
|
114
174
|
const hooks = this._getAllLevelHooks(hookMap, cache, type);
|
115
175
|
if (hooks.length === 0) return forceClone ? items.slice() : items;
|
116
176
|
let i = 0;
|
117
177
|
return items.filter((item, idx) => {
|
118
178
|
for (const hook of hooks) {
|
119
|
-
const r = fn(hook, item, idx, i);
|
179
|
+
const r = fn(/** @type {H} */ (hook), item, idx, i);
|
120
180
|
if (r !== undefined) {
|
121
181
|
if (r) i++;
|
122
182
|
return r;
|
@@ -129,30 +189,37 @@ class StatsFactory {
|
|
129
189
|
|
130
190
|
/**
|
131
191
|
* @param {string} type type
|
132
|
-
* @param {
|
192
|
+
* @param {FactoryData} data factory data
|
133
193
|
* @param {Omit<StatsFactoryContext, "type">} baseContext context used as base
|
134
|
-
* @returns {
|
194
|
+
* @returns {CreatedObject} created object
|
135
195
|
*/
|
136
196
|
create(type, data, baseContext) {
|
137
197
|
if (this._inCreate) {
|
138
198
|
return this._create(type, data, baseContext);
|
139
|
-
}
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
this.
|
146
|
-
|
199
|
+
}
|
200
|
+
try {
|
201
|
+
this._inCreate = true;
|
202
|
+
return this._create(type, data, baseContext);
|
203
|
+
} finally {
|
204
|
+
for (const key of Object.keys(this._caches))
|
205
|
+
this._caches[/** @type {keyof StatsFactoryHooks} */ (key)].clear();
|
206
|
+
this._inCreate = false;
|
147
207
|
}
|
148
208
|
}
|
149
209
|
|
210
|
+
/**
|
211
|
+
* @param {string} type type
|
212
|
+
* @param {FactoryData} data factory data
|
213
|
+
* @param {Omit<StatsFactoryContext, "type">} baseContext context used as base
|
214
|
+
* @returns {CreatedObject} created object
|
215
|
+
* @private
|
216
|
+
*/
|
150
217
|
_create(type, data, baseContext) {
|
151
|
-
const context = {
|
218
|
+
const context = /** @type {StatsFactoryContext} */ ({
|
152
219
|
...baseContext,
|
153
220
|
type,
|
154
221
|
[type]: data
|
155
|
-
};
|
222
|
+
});
|
156
223
|
if (Array.isArray(data)) {
|
157
224
|
// run filter on unsorted items
|
158
225
|
const items = this._forEachLevelFilter(
|
@@ -165,6 +232,7 @@ class StatsFactory {
|
|
165
232
|
);
|
166
233
|
|
167
234
|
// sort items
|
235
|
+
/** @type {Comparator[]} */
|
168
236
|
const comparators = [];
|
169
237
|
this._forEachLevel(this.hooks.sort, this._caches.sort, type, h =>
|
170
238
|
h.call(comparators, context)
|
@@ -188,6 +256,7 @@ class StatsFactory {
|
|
188
256
|
|
189
257
|
// for each item
|
190
258
|
let resultItems = items2.map((item, i) => {
|
259
|
+
/** @type {StatsFactoryContext} */
|
191
260
|
const itemContext = {
|
192
261
|
...context,
|
193
262
|
_index: i
|
@@ -217,6 +286,7 @@ class StatsFactory {
|
|
217
286
|
});
|
218
287
|
|
219
288
|
// sort result items
|
289
|
+
/** @type {Comparator[]} */
|
220
290
|
const comparators2 = [];
|
221
291
|
this._forEachLevel(
|
222
292
|
this.hooks.sortResults,
|
@@ -232,6 +302,7 @@ class StatsFactory {
|
|
232
302
|
}
|
233
303
|
|
234
304
|
// group result items
|
305
|
+
/** @type {GroupConfig[]} */
|
235
306
|
const groupConfigs = [];
|
236
307
|
this._forEachLevel(
|
237
308
|
this.hooks.groupResults,
|
@@ -270,23 +341,23 @@ class StatsFactory {
|
|
270
341
|
result,
|
271
342
|
(h, r) => h.call(r, context)
|
272
343
|
);
|
273
|
-
}
|
274
|
-
|
344
|
+
}
|
345
|
+
/** @type {ObjectForExtract} */
|
346
|
+
const object = {};
|
275
347
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
348
|
+
// run extract on value
|
349
|
+
this._forEachLevel(this.hooks.extract, this._caches.extract, type, h =>
|
350
|
+
h.call(object, data, context)
|
351
|
+
);
|
280
352
|
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
}
|
353
|
+
// run result on extracted object
|
354
|
+
return this._forEachLevelWaterfall(
|
355
|
+
this.hooks.result,
|
356
|
+
this._caches.result,
|
357
|
+
type,
|
358
|
+
object,
|
359
|
+
(h, r) => h.call(r, context)
|
360
|
+
);
|
290
361
|
}
|
291
362
|
}
|
292
363
|
module.exports = StatsFactory;
|
@@ -7,14 +7,18 @@
|
|
7
7
|
|
8
8
|
const { HookMap, SyncWaterfallHook, SyncBailHook } = require("tapable");
|
9
9
|
|
10
|
-
/** @template T @typedef {import("tapable").AsArray<T>} AsArray<T> */
|
11
|
-
/** @typedef {import("tapable").Hook} Hook */
|
12
10
|
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsAsset} StatsAsset */
|
13
11
|
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsChunk} StatsChunk */
|
14
12
|
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsChunkGroup} StatsChunkGroup */
|
15
13
|
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsCompilation} StatsCompilation */
|
14
|
+
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsError} StatsError */
|
15
|
+
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsLogging} StatsLogging */
|
16
16
|
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModule} StatsModule */
|
17
|
+
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleIssuer} StatsModuleIssuer */
|
17
18
|
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleReason} StatsModuleReason */
|
19
|
+
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleTraceDependency} StatsModuleTraceDependency */
|
20
|
+
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleTraceItem} StatsModuleTraceItem */
|
21
|
+
/** @typedef {import("./DefaultStatsFactoryPlugin").StatsProfile} StatsProfile */
|
18
22
|
|
19
23
|
/**
|
20
24
|
* @typedef {object} PrintedElement
|
@@ -27,53 +31,78 @@ const { HookMap, SyncWaterfallHook, SyncBailHook } = require("tapable");
|
|
27
31
|
* @property {string=} type
|
28
32
|
* @property {StatsCompilation=} compilation
|
29
33
|
* @property {StatsChunkGroup=} chunkGroup
|
34
|
+
* @property {string=} chunkGroupKind
|
30
35
|
* @property {StatsAsset=} asset
|
31
36
|
* @property {StatsModule=} module
|
32
37
|
* @property {StatsChunk=} chunk
|
33
38
|
* @property {StatsModuleReason=} moduleReason
|
39
|
+
* @property {StatsModuleIssuer=} moduleIssuer
|
40
|
+
* @property {StatsError=} error
|
41
|
+
* @property {StatsProfile=} profile
|
42
|
+
* @property {StatsLogging=} logging
|
43
|
+
* @property {StatsModuleTraceItem=} moduleTraceItem
|
44
|
+
* @property {StatsModuleTraceDependency=} moduleTraceDependency
|
45
|
+
*/
|
46
|
+
|
47
|
+
/**
|
48
|
+
* @typedef {object} KnownStatsPrinterColorFn
|
34
49
|
* @property {(str: string) => string=} bold
|
35
50
|
* @property {(str: string) => string=} yellow
|
36
51
|
* @property {(str: string) => string=} red
|
37
52
|
* @property {(str: string) => string=} green
|
38
53
|
* @property {(str: string) => string=} magenta
|
39
54
|
* @property {(str: string) => string=} cyan
|
55
|
+
*/
|
56
|
+
|
57
|
+
/**
|
58
|
+
* @typedef {object} KnownStatsPrinterFormaters
|
40
59
|
* @property {(file: string, oversize?: boolean) => string=} formatFilename
|
41
60
|
* @property {(id: string) => string=} formatModuleId
|
42
61
|
* @property {(id: string, direction?: "parent"|"child"|"sibling") => string=} formatChunkId
|
43
62
|
* @property {(size: number) => string=} formatSize
|
63
|
+
* @property {(size: string) => string=} formatLayer
|
44
64
|
* @property {(dateTime: number) => string=} formatDateTime
|
45
65
|
* @property {(flag: string) => string=} formatFlag
|
46
66
|
* @property {(time: number, boldQuantity?: boolean) => string=} formatTime
|
47
|
-
* @property {string=}
|
67
|
+
* @property {(message: string) => string=} formatError
|
48
68
|
*/
|
49
69
|
|
50
|
-
/** @typedef {
|
70
|
+
/** @typedef {Record<string, any> & KnownStatsPrinterColorFn & KnownStatsPrinterFormaters & KnownStatsPrinterContext} StatsPrinterContext */
|
71
|
+
/** @typedef {any} PrintObject */
|
72
|
+
|
73
|
+
/**
|
74
|
+
* @typedef {object} StatsPrintHooks
|
75
|
+
* @property {HookMap<SyncBailHook<[string[], StatsPrinterContext], void>>} sortElements
|
76
|
+
* @property {HookMap<SyncBailHook<[PrintedElement[], StatsPrinterContext], string | undefined>>} printElements
|
77
|
+
* @property {HookMap<SyncBailHook<[PrintObject[], StatsPrinterContext], true>>} sortItems
|
78
|
+
* @property {HookMap<SyncBailHook<[PrintObject, StatsPrinterContext], string>>} getItemName
|
79
|
+
* @property {HookMap<SyncBailHook<[string[], StatsPrinterContext], string | undefined>>} printItems
|
80
|
+
* @property {HookMap<SyncBailHook<[PrintObject, StatsPrinterContext], string | void>>} print
|
81
|
+
* @property {HookMap<SyncWaterfallHook<[string, StatsPrinterContext]>>} result
|
82
|
+
*/
|
51
83
|
|
52
84
|
class StatsPrinter {
|
53
85
|
constructor() {
|
86
|
+
/** @type {StatsPrintHooks} */
|
54
87
|
this.hooks = Object.freeze({
|
55
|
-
/** @type {HookMap<SyncBailHook<[string[], StatsPrinterContext], true>>} */
|
56
88
|
sortElements: new HookMap(
|
57
89
|
() => new SyncBailHook(["elements", "context"])
|
58
90
|
),
|
59
|
-
/** @type {HookMap<SyncBailHook<[PrintedElement[], StatsPrinterContext], string>>} */
|
60
91
|
printElements: new HookMap(
|
61
92
|
() => new SyncBailHook(["printedElements", "context"])
|
62
93
|
),
|
63
|
-
/** @type {HookMap<SyncBailHook<[any[], StatsPrinterContext], true>>} */
|
64
94
|
sortItems: new HookMap(() => new SyncBailHook(["items", "context"])),
|
65
|
-
/** @type {HookMap<SyncBailHook<[any, StatsPrinterContext], string>>} */
|
66
95
|
getItemName: new HookMap(() => new SyncBailHook(["item", "context"])),
|
67
|
-
/** @type {HookMap<SyncBailHook<[string[], StatsPrinterContext], string>>} */
|
68
96
|
printItems: new HookMap(
|
69
97
|
() => new SyncBailHook(["printedItems", "context"])
|
70
98
|
),
|
71
|
-
/** @type {HookMap<SyncBailHook<[{}, StatsPrinterContext], string>>} */
|
72
99
|
print: new HookMap(() => new SyncBailHook(["object", "context"])),
|
73
100
|
/** @type {HookMap<SyncWaterfallHook<[string, StatsPrinterContext]>>} */
|
74
101
|
result: new HookMap(() => new SyncWaterfallHook(["result", "context"]))
|
75
102
|
});
|
76
|
-
/**
|
103
|
+
/**
|
104
|
+
* @type {TODO}
|
105
|
+
*/
|
77
106
|
this._levelHookCache = new Map();
|
78
107
|
this._inPrint = false;
|
79
108
|
}
|
@@ -81,15 +110,14 @@ class StatsPrinter {
|
|
81
110
|
/**
|
82
111
|
* get all level hooks
|
83
112
|
* @private
|
84
|
-
* @template {
|
85
|
-
* @
|
113
|
+
* @template {StatsPrintHooks[keyof StatsPrintHooks]} HM
|
114
|
+
* @template {HM extends HookMap<infer H> ? H : never} H
|
115
|
+
* @param {HM} hookMap hook map
|
86
116
|
* @param {string} type type
|
87
|
-
* @returns {
|
117
|
+
* @returns {H[]} hooks
|
88
118
|
*/
|
89
119
|
_getAllLevelHooks(hookMap, type) {
|
90
|
-
let cache =
|
91
|
-
this._levelHookCache.get(hookMap)
|
92
|
-
);
|
120
|
+
let cache = this._levelHookCache.get(hookMap);
|
93
121
|
if (cache === undefined) {
|
94
122
|
cache = new Map();
|
95
123
|
this._levelHookCache.set(hookMap, cache);
|
@@ -98,11 +126,11 @@ class StatsPrinter {
|
|
98
126
|
if (cacheEntry !== undefined) {
|
99
127
|
return cacheEntry;
|
100
128
|
}
|
101
|
-
/** @type {
|
129
|
+
/** @type {H[]} */
|
102
130
|
const hooks = [];
|
103
131
|
const typeParts = type.split(".");
|
104
132
|
for (let i = 0; i < typeParts.length; i++) {
|
105
|
-
const hook = hookMap.get(typeParts.slice(i).join("."));
|
133
|
+
const hook = /** @type {H} */ (hookMap.get(typeParts.slice(i).join(".")));
|
106
134
|
if (hook) {
|
107
135
|
hooks.push(hook);
|
108
136
|
}
|
@@ -114,16 +142,17 @@ class StatsPrinter {
|
|
114
142
|
/**
|
115
143
|
* Run `fn` for each level
|
116
144
|
* @private
|
117
|
-
* @template
|
118
|
-
* @template
|
119
|
-
* @
|
145
|
+
* @template {StatsPrintHooks[keyof StatsPrintHooks]} HM
|
146
|
+
* @template {HM extends HookMap<infer H> ? H : never} H
|
147
|
+
* @template {H extends import("tapable").Hook<any, infer R> ? R : never} R
|
148
|
+
* @param {HM} hookMap hook map
|
120
149
|
* @param {string} type type
|
121
|
-
* @param {(
|
122
|
-
* @returns {R
|
150
|
+
* @param {function(H): R | undefined} fn fn
|
151
|
+
* @returns {R | undefined} hook
|
123
152
|
*/
|
124
153
|
_forEachLevel(hookMap, type, fn) {
|
125
154
|
for (const hook of this._getAllLevelHooks(hookMap, type)) {
|
126
|
-
const result = fn(hook);
|
155
|
+
const result = fn(/** @type {H} */ (hook));
|
127
156
|
if (result !== undefined) return result;
|
128
157
|
}
|
129
158
|
}
|
@@ -131,48 +160,49 @@ class StatsPrinter {
|
|
131
160
|
/**
|
132
161
|
* Run `fn` for each level
|
133
162
|
* @private
|
134
|
-
* @template
|
135
|
-
* @
|
163
|
+
* @template {StatsPrintHooks[keyof StatsPrintHooks]} HM
|
164
|
+
* @template {HM extends HookMap<infer H> ? H : never} H
|
165
|
+
* @param {HM} hookMap hook map
|
136
166
|
* @param {string} type type
|
137
|
-
* @param {
|
138
|
-
* @param {(
|
139
|
-
* @returns {
|
167
|
+
* @param {string} data data
|
168
|
+
* @param {function(H, string): string} fn fn
|
169
|
+
* @returns {string} result of `fn`
|
140
170
|
*/
|
141
171
|
_forEachLevelWaterfall(hookMap, type, data, fn) {
|
142
172
|
for (const hook of this._getAllLevelHooks(hookMap, type)) {
|
143
|
-
data = fn(hook, data);
|
173
|
+
data = fn(/** @type {H} */ (hook), data);
|
144
174
|
}
|
145
175
|
return data;
|
146
176
|
}
|
147
177
|
|
148
178
|
/**
|
149
179
|
* @param {string} type The type
|
150
|
-
* @param {
|
151
|
-
* @param {
|
180
|
+
* @param {PrintObject} object Object to print
|
181
|
+
* @param {StatsPrinterContext=} baseContext The base context
|
152
182
|
* @returns {string} printed result
|
153
183
|
*/
|
154
184
|
print(type, object, baseContext) {
|
155
185
|
if (this._inPrint) {
|
156
186
|
return this._print(type, object, baseContext);
|
157
|
-
}
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
}
|
187
|
+
}
|
188
|
+
try {
|
189
|
+
this._inPrint = true;
|
190
|
+
return this._print(type, object, baseContext);
|
191
|
+
} finally {
|
192
|
+
this._levelHookCache.clear();
|
193
|
+
this._inPrint = false;
|
165
194
|
}
|
166
195
|
}
|
167
196
|
|
168
197
|
/**
|
169
198
|
* @private
|
170
199
|
* @param {string} type type
|
171
|
-
* @param {
|
172
|
-
* @param {
|
200
|
+
* @param {PrintObject} object object
|
201
|
+
* @param {StatsPrinterContext=} baseContext context
|
173
202
|
* @returns {string} printed result
|
174
203
|
*/
|
175
204
|
_print(type, object, baseContext) {
|
205
|
+
/** @type {StatsPrinterContext} */
|
176
206
|
const context = {
|
177
207
|
...baseContext,
|
178
208
|
type,
|
@@ -189,6 +219,7 @@ class StatsPrinter {
|
|
189
219
|
h.call(sortedItems, context)
|
190
220
|
);
|
191
221
|
const printedItems = sortedItems.map((item, i) => {
|
222
|
+
/** @type {StatsPrinterContext} */
|
192
223
|
const itemContext = {
|
193
224
|
...context,
|
194
225
|
_index: i
|
@@ -241,7 +272,7 @@ class StatsPrinter {
|
|
241
272
|
return this._forEachLevelWaterfall(
|
242
273
|
this.hooks.result,
|
243
274
|
type,
|
244
|
-
printResult,
|
275
|
+
/** @type {string} */ (printResult),
|
245
276
|
(h, r) => h.call(r, context)
|
246
277
|
);
|
247
278
|
}
|
package/lib/util/ArrayHelpers.js
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
* @returns {boolean} returns true if all the elements of passed arrays are strictly equal.
|
14
14
|
*/
|
15
15
|
|
16
|
-
exports.equals = (a, b) => {
|
16
|
+
module.exports.equals = (a, b) => {
|
17
17
|
if (a.length !== b.length) return false;
|
18
18
|
for (let i = 0; i < a.length; i++) {
|
19
19
|
if (a[i] !== b[i]) return false;
|
@@ -28,8 +28,13 @@ exports.equals = (a, b) => {
|
|
28
28
|
* @param {(value: T) => boolean} fn Partition function which partitions based on truthiness of result.
|
29
29
|
* @returns {[Array<T>, Array<T>]} returns the values of `arr` partitioned into two new arrays based on fn predicate.
|
30
30
|
*/
|
31
|
-
|
32
|
-
|
31
|
+
|
32
|
+
module.exports.groupBy = (
|
33
|
+
// eslint-disable-next-line default-param-last
|
34
|
+
arr = [],
|
35
|
+
fn
|
36
|
+
) =>
|
37
|
+
arr.reduce(
|
33
38
|
/**
|
34
39
|
* @param {[Array<T>, Array<T>]} groups An accumulator storing already partitioned values returned from previous call.
|
35
40
|
* @param {T} value The value of the current element
|
@@ -41,4 +46,3 @@ exports.groupBy = (arr = [], fn) => {
|
|
41
46
|
},
|
42
47
|
[[], []]
|
43
48
|
);
|
44
|
-
};
|
package/lib/util/ArrayQueue.js
CHANGED
@@ -56,7 +56,7 @@ class ArrayQueue {
|
|
56
56
|
*/
|
57
57
|
dequeue() {
|
58
58
|
if (this._listReversed.length === 0) {
|
59
|
-
if (this._list.length === 0) return
|
59
|
+
if (this._list.length === 0) return;
|
60
60
|
if (this._list.length === 1) return this._list.pop();
|
61
61
|
if (this._list.length < 16) return this._list.shift();
|
62
62
|
const temp = this._listReversed;
|