diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2024-08-30 17:21:18 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2024-08-30 17:21:18 +0800 |
| commit | efbc2ffe6a1ee5ec38a4396305561d6515d0943e (patch) | |
| tree | 2b4c94f18f2c792dfda813050755d5c0273fae22 /node_modules/webpack/lib/stats/StatsPrinter.js | |
| parent | 43acceb75957c880a5ba5a31aae221394a36d5f6 (diff) | |
node fixes, updates
Diffstat (limited to 'node_modules/webpack/lib/stats/StatsPrinter.js')
| -rw-r--r-- | node_modules/webpack/lib/stats/StatsPrinter.js | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/stats/StatsPrinter.js b/node_modules/webpack/lib/stats/StatsPrinter.js new file mode 100644 index 00000000..f1e736de --- /dev/null +++ b/node_modules/webpack/lib/stats/StatsPrinter.js @@ -0,0 +1,280 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { HookMap, SyncWaterfallHook, SyncBailHook } = require("tapable"); + +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsAsset} StatsAsset */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsChunk} StatsChunk */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsChunkGroup} StatsChunkGroup */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsCompilation} StatsCompilation */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsError} StatsError */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsLogging} StatsLogging */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModule} StatsModule */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleIssuer} StatsModuleIssuer */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleReason} StatsModuleReason */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleTraceDependency} StatsModuleTraceDependency */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleTraceItem} StatsModuleTraceItem */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsProfile} StatsProfile */ + +/** + * @typedef {object} PrintedElement + * @property {string} element + * @property {string} content + */ + +/** + * @typedef {object} KnownStatsPrinterContext + * @property {string=} type + * @property {StatsCompilation=} compilation + * @property {StatsChunkGroup=} chunkGroup + * @property {string=} chunkGroupKind + * @property {StatsAsset=} asset + * @property {StatsModule=} module + * @property {StatsChunk=} chunk + * @property {StatsModuleReason=} moduleReason + * @property {StatsModuleIssuer=} moduleIssuer + * @property {StatsError=} error + * @property {StatsProfile=} profile + * @property {StatsLogging=} logging + * @property {StatsModuleTraceItem=} moduleTraceItem + * @property {StatsModuleTraceDependency=} moduleTraceDependency + */ + +/** + * @typedef {object} KnownStatsPrinterColorFn + * @property {(str: string) => string=} bold + * @property {(str: string) => string=} yellow + * @property {(str: string) => string=} red + * @property {(str: string) => string=} green + * @property {(str: string) => string=} magenta + * @property {(str: string) => string=} cyan + */ + +/** + * @typedef {object} KnownStatsPrinterFormaters + * @property {(file: string, oversize?: boolean) => string=} formatFilename + * @property {(id: string) => string=} formatModuleId + * @property {(id: string, direction?: "parent"|"child"|"sibling") => string=} formatChunkId + * @property {(size: number) => string=} formatSize + * @property {(size: string) => string=} formatLayer + * @property {(dateTime: number) => string=} formatDateTime + * @property {(flag: string) => string=} formatFlag + * @property {(time: number, boldQuantity?: boolean) => string=} formatTime + * @property {(message: string) => string=} formatError + */ + +/** @typedef {Record<string, any> & KnownStatsPrinterColorFn & KnownStatsPrinterFormaters & KnownStatsPrinterContext} StatsPrinterContext */ +/** @typedef {any} PrintObject */ + +/** + * @typedef {object} StatsPrintHooks + * @property {HookMap<SyncBailHook<[string[], StatsPrinterContext], void>>} sortElements + * @property {HookMap<SyncBailHook<[PrintedElement[], StatsPrinterContext], string | undefined>>} printElements + * @property {HookMap<SyncBailHook<[PrintObject[], StatsPrinterContext], true>>} sortItems + * @property {HookMap<SyncBailHook<[PrintObject, StatsPrinterContext], string>>} getItemName + * @property {HookMap<SyncBailHook<[string[], StatsPrinterContext], string | undefined>>} printItems + * @property {HookMap<SyncBailHook<[PrintObject, StatsPrinterContext], string | void>>} print + * @property {HookMap<SyncWaterfallHook<[string, StatsPrinterContext]>>} result + */ + +class StatsPrinter { + constructor() { + /** @type {StatsPrintHooks} */ + this.hooks = Object.freeze({ + sortElements: new HookMap( + () => new SyncBailHook(["elements", "context"]) + ), + printElements: new HookMap( + () => new SyncBailHook(["printedElements", "context"]) + ), + sortItems: new HookMap(() => new SyncBailHook(["items", "context"])), + getItemName: new HookMap(() => new SyncBailHook(["item", "context"])), + printItems: new HookMap( + () => new SyncBailHook(["printedItems", "context"]) + ), + print: new HookMap(() => new SyncBailHook(["object", "context"])), + /** @type {HookMap<SyncWaterfallHook<[string, StatsPrinterContext]>>} */ + result: new HookMap(() => new SyncWaterfallHook(["result", "context"])) + }); + /** + * @type {TODO} + */ + this._levelHookCache = new Map(); + this._inPrint = false; + } + + /** + * get all level hooks + * @private + * @template {StatsPrintHooks[keyof StatsPrintHooks]} HM + * @template {HM extends HookMap<infer H> ? H : never} H + * @param {HM} hookMap hook map + * @param {string} type type + * @returns {H[]} hooks + */ + _getAllLevelHooks(hookMap, type) { + let cache = this._levelHookCache.get(hookMap); + if (cache === undefined) { + cache = new Map(); + this._levelHookCache.set(hookMap, cache); + } + const cacheEntry = cache.get(type); + if (cacheEntry !== undefined) { + return cacheEntry; + } + /** @type {H[]} */ + const hooks = []; + const typeParts = type.split("."); + for (let i = 0; i < typeParts.length; i++) { + const hook = /** @type {H} */ (hookMap.get(typeParts.slice(i).join("."))); + if (hook) { + hooks.push(hook); + } + } + cache.set(type, hooks); + return hooks; + } + + /** + * Run `fn` for each level + * @private + * @template {StatsPrintHooks[keyof StatsPrintHooks]} HM + * @template {HM extends HookMap<infer H> ? H : never} H + * @template {H extends import("tapable").Hook<any, infer R> ? R : never} R + * @param {HM} hookMap hook map + * @param {string} type type + * @param {function(H): R | undefined} fn fn + * @returns {R | undefined} hook + */ + _forEachLevel(hookMap, type, fn) { + for (const hook of this._getAllLevelHooks(hookMap, type)) { + const result = fn(/** @type {H} */ (hook)); + if (result !== undefined) return result; + } + } + + /** + * Run `fn` for each level + * @private + * @template {StatsPrintHooks[keyof StatsPrintHooks]} HM + * @template {HM extends HookMap<infer H> ? H : never} H + * @param {HM} hookMap hook map + * @param {string} type type + * @param {string} data data + * @param {function(H, string): string} fn fn + * @returns {string} result of `fn` + */ + _forEachLevelWaterfall(hookMap, type, data, fn) { + for (const hook of this._getAllLevelHooks(hookMap, type)) { + data = fn(/** @type {H} */ (hook), data); + } + return data; + } + + /** + * @param {string} type The type + * @param {PrintObject} object Object to print + * @param {StatsPrinterContext=} baseContext The base context + * @returns {string} printed result + */ + print(type, object, baseContext) { + if (this._inPrint) { + return this._print(type, object, baseContext); + } + try { + this._inPrint = true; + return this._print(type, object, baseContext); + } finally { + this._levelHookCache.clear(); + this._inPrint = false; + } + } + + /** + * @private + * @param {string} type type + * @param {PrintObject} object object + * @param {StatsPrinterContext=} baseContext context + * @returns {string} printed result + */ + _print(type, object, baseContext) { + /** @type {StatsPrinterContext} */ + const context = { + ...baseContext, + type, + [type]: object + }; + + let printResult = this._forEachLevel(this.hooks.print, type, hook => + hook.call(object, context) + ); + if (printResult === undefined) { + if (Array.isArray(object)) { + const sortedItems = object.slice(); + this._forEachLevel(this.hooks.sortItems, type, h => + h.call(sortedItems, context) + ); + const printedItems = sortedItems.map((item, i) => { + /** @type {StatsPrinterContext} */ + const itemContext = { + ...context, + _index: i + }; + const itemName = this._forEachLevel( + this.hooks.getItemName, + `${type}[]`, + h => h.call(item, itemContext) + ); + if (itemName) itemContext[itemName] = item; + return this.print( + itemName ? `${type}[].${itemName}` : `${type}[]`, + item, + itemContext + ); + }); + printResult = this._forEachLevel(this.hooks.printItems, type, h => + h.call(printedItems, context) + ); + if (printResult === undefined) { + const result = printedItems.filter(Boolean); + if (result.length > 0) printResult = result.join("\n"); + } + } else if (object !== null && typeof object === "object") { + const elements = Object.keys(object).filter( + key => object[key] !== undefined + ); + this._forEachLevel(this.hooks.sortElements, type, h => + h.call(elements, context) + ); + const printedElements = elements.map(element => { + const content = this.print(`${type}.${element}`, object[element], { + ...context, + _parent: object, + _element: element, + [element]: object[element] + }); + return { element, content }; + }); + printResult = this._forEachLevel(this.hooks.printElements, type, h => + h.call(printedElements, context) + ); + if (printResult === undefined) { + const result = printedElements.map(e => e.content).filter(Boolean); + if (result.length > 0) printResult = result.join("\n"); + } + } + } + + return this._forEachLevelWaterfall( + this.hooks.result, + type, + /** @type {string} */ (printResult), + (h, r) => h.call(r, context) + ); + } +} +module.exports = StatsPrinter; |
