rollup-plugin-webpack-stats 3.1.1 → 3.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs","names":["statsWrite","bundleToWebpackStats","resolveFilepath","getByteSize","formatFileSize"],"sources":["../src/plugin.ts"],"sourcesContent":["import type { OutputBundle } from 'rollup-plugin-stats';\nimport extractStats, { type StatsOptions } from 'rollup-plugin-stats/extract';\n\nimport { type BundleTransformOptions, bundleToWebpackStats } from './transform';\nimport { type StatsWrite, statsWrite } from './write';\nimport { formatFileSize, getByteSize, resolveFilepath } from './utils';\n\nconst PLUGIN_NAME = 'webpackStats';\n\n/**\n * A subset of resolved output options provided to the `generateBundle` hook by Vite/Rolldown/Rollup,\n * containing only the fields this plugin uses to generate a stats file for a specific output.\n */\nexport type OutputOptions = {\n /** Output directory for the generated files. */\n dir?: string | undefined;\n\n /** Output format */\n format?:\n | 'es'\n | 'esm'\n | 'module'\n | 'cjs'\n | 'commonjs'\n | 'iife'\n | 'umd'\n | 'amd'\n | 'system'\n | 'systemjs'\n | undefined;\n};\n\n/**\n * Subset of the Vite/Rolldown/Rollup plugin hook context (`this`) used by this plugin.\n */\ntype PluginContext = {\n /** Log an informational message through Vite/Rolldown/Rollup's logging pipeline. */\n info: (message: string) => void;\n\n /** Log a warning through Vite/Rolldown/Rollup's logging pipeline without stopping the build. */\n warn: (message: string) => void;\n};\n\n/**\n * Minimum plugin interface compatible with Vite/Rolldown/Rollup.\n */\nexport type Plugin = {\n /** Unique identifier for the plugin, used in error messages and logs. */\n name: string;\n\n /**\n * Hook called after the bundle has been fully generated but before it is\n * written to disk. Receives the resolved output options and the complete\n * output bundle map.\n */\n generateBundle?: (\n this: PluginContext,\n outputOptions: OutputOptions,\n bundle: OutputBundle,\n isWrite: boolean\n ) => void | Promise<void>;\n};\n\ntype WebpackStatsOptions = {\n /**\n * JSON file output fileName\n * default: webpack-stats.json\n */\n fileName?: string;\n /**\n * Custom file writer\n * @default - fs.write(FILENAME, JSON.stringify(STATS, null, 2));\n */\n write?: StatsWrite;\n} & Omit<StatsOptions, 'source' | 'map'> &\n BundleTransformOptions;\n\ntype WebpackStatsOptionsOrBuilder =\n | WebpackStatsOptions\n | ((outputOptions: OutputOptions) => WebpackStatsOptions);\n\nexport const webpackStats = (\n options: WebpackStatsOptionsOrBuilder = {}\n): Plugin => ({\n name: PLUGIN_NAME,\n async generateBundle(outputOptions, bundle) {\n const resolvedOptions =\n typeof options === 'function' ? options(outputOptions) : options;\n const {\n fileName,\n excludeAssets,\n excludeModules,\n write = statsWrite,\n ...transformOptions\n } = resolvedOptions;\n\n const rollupStats = extractStats(bundle, {\n excludeAssets,\n excludeModules,\n // Extract stats source to compute size\n source: true,\n });\n const stats = bundleToWebpackStats(rollupStats, transformOptions);\n const filepath = resolveFilepath(fileName, outputOptions.dir);\n\n try {\n const res = await write(\n filepath,\n stats as unknown as Record<string, unknown>\n );\n const outputSize = getByteSize(res.content);\n\n this.info(\n `Stats saved to ${res.filepath} (${formatFileSize(outputSize)})`\n );\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : JSON.stringify(error);\n\n // Log error, but do not throw to allow the compilation to continue\n this.warn(message);\n }\n },\n});\n"],"mappings":";;;;;;;;AAOA,MAAM,cAAc;AA0EpB,MAAa,gBACX,UAAwC,EAAE,MAC9B;CACZ,MAAM;CACN,MAAM,eAAe,eAAe,QAAQ;EAG1C,MAAM,EACJ,UACA,eACA,gBACA,QAAQA,0BACR,GAAG,qBANH,OAAO,YAAY,aAAa,QAAQ,cAAc,GAAG;EAe3D,MAAM,QAAQC,gFANmB,QAAQ;GACvC;GACA;GAEA,QAAQ;GACT,CAAC,EAC8C,iBAAiB;EACjE,MAAM,WAAWC,8BAAgB,UAAU,cAAc,IAAI;AAE7D,MAAI;GACF,MAAM,MAAM,MAAM,MAChB,UACA,MACD;GACD,MAAM,aAAaC,0BAAY,IAAI,QAAQ;AAE3C,QAAK,KACH,kBAAkB,IAAI,SAAS,IAAIC,6BAAe,WAAW,CAAC,GAC/D;WACM,OAAgB;GACvB,MAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM;AAGhE,QAAK,KAAK,QAAQ;;;CAGvB"}
1
+ {"version":3,"file":"plugin.cjs","names":["statsWrite","bundleToWebpackStats","resolveFilepath","getByteSize","formatFileSize"],"sources":["../src/plugin.ts"],"sourcesContent":["import type { OutputBundle } from 'rollup-plugin-stats';\nimport extractStats, { type StatsOptions } from 'rollup-plugin-stats/extract';\n\nimport { type BundleTransformOptions, bundleToWebpackStats } from './transform';\nimport { type StatsWrite, statsWrite } from './write';\nimport { formatFileSize, getByteSize, resolveFilepath } from './utils';\n\nconst PLUGIN_NAME = 'webpackStats';\n\n/**\n * A subset of resolved output options provided to the `generateBundle` hook by Vite/Rolldown/Rollup,\n * containing only the fields this plugin uses to generate a stats file for a specific output.\n */\nexport type OutputOptions = {\n /** Output directory for the generated files. */\n dir?: string | undefined;\n\n /** Output format */\n format?:\n | 'es'\n | 'esm'\n | 'module'\n | 'cjs'\n | 'commonjs'\n | 'iife'\n | 'umd'\n | 'amd'\n | 'system'\n | 'systemjs'\n | undefined;\n};\n\n/**\n * Subset of the Vite/Rolldown/Rollup plugin hook context (`this`) used by this plugin.\n */\ntype PluginContext = {\n /** Log an informational message through Vite/Rolldown/Rollup's logging pipeline. */\n info: (message: string) => void;\n\n /** Log a warning through Vite/Rolldown/Rollup's logging pipeline without stopping the build. */\n warn: (message: string) => void;\n};\n\n/**\n * Minimum plugin interface compatible with Vite/Rolldown/Rollup.\n */\nexport type Plugin = {\n /** Unique identifier for the plugin, used in error messages and logs. */\n name: string;\n\n /**\n * Hook called after the bundle has been fully generated but before it is\n * written to disk. Receives the resolved output options and the complete\n * output bundle map.\n */\n generateBundle?: (\n this: PluginContext,\n outputOptions: OutputOptions,\n bundle: OutputBundle,\n isWrite: boolean\n ) => void | Promise<void>;\n};\n\ntype WebpackStatsOptions = {\n /**\n * JSON file output fileName\n * default: webpack-stats.json\n */\n fileName?: string;\n /**\n * Custom file writer\n * @default - fs.write(FILENAME, JSON.stringify(STATS, null, 2));\n */\n write?: StatsWrite;\n} & Omit<StatsOptions, 'source' | 'map'> &\n BundleTransformOptions;\n\ntype WebpackStatsOptionsOrBuilder =\n | WebpackStatsOptions\n | ((outputOptions: OutputOptions) => WebpackStatsOptions);\n\nexport const webpackStats = (\n options: WebpackStatsOptionsOrBuilder = {}\n): Plugin => ({\n name: PLUGIN_NAME,\n async generateBundle(outputOptions, bundle) {\n const resolvedOptions =\n typeof options === 'function' ? options(outputOptions) : options;\n const {\n fileName,\n excludeAssets,\n excludeModules,\n write = statsWrite,\n ...transformOptions\n } = resolvedOptions;\n\n const rollupStats = extractStats(bundle, {\n excludeAssets,\n excludeModules,\n // Extract stats source to compute size\n source: true,\n });\n const stats = bundleToWebpackStats(rollupStats, transformOptions);\n const filepath = resolveFilepath(fileName, outputOptions.dir);\n\n try {\n const res = await write(\n filepath,\n stats as unknown as Record<string, unknown>\n );\n const outputSize = getByteSize(res.content);\n\n this.info(\n `Stats saved to ${res.filepath} (${formatFileSize(outputSize)})`\n );\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : JSON.stringify(error);\n\n // Log error, but do not throw to allow the compilation to continue\n this.warn(message);\n }\n },\n});\n"],"mappings":";;;;;;;;AAOA,MAAM,cAAc;AA0EpB,MAAa,gBACX,UAAwC,EAAE,MAC9B;CACZ,MAAM;CACN,MAAM,eAAe,eAAe,QAAQ;EAG1C,MAAM,EACJ,UACA,eACA,gBACA,QAAQA,0BACR,GAAG,qBANH,OAAO,YAAY,aAAa,QAAQ,cAAc,GAAG;EAe3D,MAAM,QAAQC,gFANmB,QAAQ;GACvC;GACA;GAEA,QAAQ;GACT,CAC6C,EAAE,iBAAiB;EACjE,MAAM,WAAWC,8BAAgB,UAAU,cAAc,IAAI;AAE7D,MAAI;GACF,MAAM,MAAM,MAAM,MAChB,UACA,MACD;GACD,MAAM,aAAaC,0BAAY,IAAI,QAAQ;AAE3C,QAAK,KACH,kBAAkB,IAAI,SAAS,IAAIC,6BAAe,WAAW,CAAC,GAC/D;WACM,OAAgB;GACvB,MAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM;AAGhE,QAAK,KAAK,QAAQ;;;CAGvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.mjs","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import type { OutputBundle } from 'rollup-plugin-stats';\nimport extractStats, { type StatsOptions } from 'rollup-plugin-stats/extract';\n\nimport { type BundleTransformOptions, bundleToWebpackStats } from './transform';\nimport { type StatsWrite, statsWrite } from './write';\nimport { formatFileSize, getByteSize, resolveFilepath } from './utils';\n\nconst PLUGIN_NAME = 'webpackStats';\n\n/**\n * A subset of resolved output options provided to the `generateBundle` hook by Vite/Rolldown/Rollup,\n * containing only the fields this plugin uses to generate a stats file for a specific output.\n */\nexport type OutputOptions = {\n /** Output directory for the generated files. */\n dir?: string | undefined;\n\n /** Output format */\n format?:\n | 'es'\n | 'esm'\n | 'module'\n | 'cjs'\n | 'commonjs'\n | 'iife'\n | 'umd'\n | 'amd'\n | 'system'\n | 'systemjs'\n | undefined;\n};\n\n/**\n * Subset of the Vite/Rolldown/Rollup plugin hook context (`this`) used by this plugin.\n */\ntype PluginContext = {\n /** Log an informational message through Vite/Rolldown/Rollup's logging pipeline. */\n info: (message: string) => void;\n\n /** Log a warning through Vite/Rolldown/Rollup's logging pipeline without stopping the build. */\n warn: (message: string) => void;\n};\n\n/**\n * Minimum plugin interface compatible with Vite/Rolldown/Rollup.\n */\nexport type Plugin = {\n /** Unique identifier for the plugin, used in error messages and logs. */\n name: string;\n\n /**\n * Hook called after the bundle has been fully generated but before it is\n * written to disk. Receives the resolved output options and the complete\n * output bundle map.\n */\n generateBundle?: (\n this: PluginContext,\n outputOptions: OutputOptions,\n bundle: OutputBundle,\n isWrite: boolean\n ) => void | Promise<void>;\n};\n\ntype WebpackStatsOptions = {\n /**\n * JSON file output fileName\n * default: webpack-stats.json\n */\n fileName?: string;\n /**\n * Custom file writer\n * @default - fs.write(FILENAME, JSON.stringify(STATS, null, 2));\n */\n write?: StatsWrite;\n} & Omit<StatsOptions, 'source' | 'map'> &\n BundleTransformOptions;\n\ntype WebpackStatsOptionsOrBuilder =\n | WebpackStatsOptions\n | ((outputOptions: OutputOptions) => WebpackStatsOptions);\n\nexport const webpackStats = (\n options: WebpackStatsOptionsOrBuilder = {}\n): Plugin => ({\n name: PLUGIN_NAME,\n async generateBundle(outputOptions, bundle) {\n const resolvedOptions =\n typeof options === 'function' ? options(outputOptions) : options;\n const {\n fileName,\n excludeAssets,\n excludeModules,\n write = statsWrite,\n ...transformOptions\n } = resolvedOptions;\n\n const rollupStats = extractStats(bundle, {\n excludeAssets,\n excludeModules,\n // Extract stats source to compute size\n source: true,\n });\n const stats = bundleToWebpackStats(rollupStats, transformOptions);\n const filepath = resolveFilepath(fileName, outputOptions.dir);\n\n try {\n const res = await write(\n filepath,\n stats as unknown as Record<string, unknown>\n );\n const outputSize = getByteSize(res.content);\n\n this.info(\n `Stats saved to ${res.filepath} (${formatFileSize(outputSize)})`\n );\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : JSON.stringify(error);\n\n // Log error, but do not throw to allow the compilation to continue\n this.warn(message);\n }\n },\n});\n"],"mappings":";;;;;;AAOA,MAAM,cAAc;AA0EpB,MAAa,gBACX,UAAwC,EAAE,MAC9B;CACZ,MAAM;CACN,MAAM,eAAe,eAAe,QAAQ;EAG1C,MAAM,EACJ,UACA,eACA,gBACA,QAAQ,YACR,GAAG,qBANH,OAAO,YAAY,aAAa,QAAQ,cAAc,GAAG;EAe3D,MAAM,QAAQ,qBANM,aAAa,QAAQ;GACvC;GACA;GAEA,QAAQ;GACT,CAAC,EAC8C,iBAAiB;EACjE,MAAM,WAAW,gBAAgB,UAAU,cAAc,IAAI;AAE7D,MAAI;GACF,MAAM,MAAM,MAAM,MAChB,UACA,MACD;GACD,MAAM,aAAa,YAAY,IAAI,QAAQ;AAE3C,QAAK,KACH,kBAAkB,IAAI,SAAS,IAAI,eAAe,WAAW,CAAC,GAC/D;WACM,OAAgB;GACvB,MAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM;AAGhE,QAAK,KAAK,QAAQ;;;CAGvB"}
1
+ {"version":3,"file":"plugin.mjs","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import type { OutputBundle } from 'rollup-plugin-stats';\nimport extractStats, { type StatsOptions } from 'rollup-plugin-stats/extract';\n\nimport { type BundleTransformOptions, bundleToWebpackStats } from './transform';\nimport { type StatsWrite, statsWrite } from './write';\nimport { formatFileSize, getByteSize, resolveFilepath } from './utils';\n\nconst PLUGIN_NAME = 'webpackStats';\n\n/**\n * A subset of resolved output options provided to the `generateBundle` hook by Vite/Rolldown/Rollup,\n * containing only the fields this plugin uses to generate a stats file for a specific output.\n */\nexport type OutputOptions = {\n /** Output directory for the generated files. */\n dir?: string | undefined;\n\n /** Output format */\n format?:\n | 'es'\n | 'esm'\n | 'module'\n | 'cjs'\n | 'commonjs'\n | 'iife'\n | 'umd'\n | 'amd'\n | 'system'\n | 'systemjs'\n | undefined;\n};\n\n/**\n * Subset of the Vite/Rolldown/Rollup plugin hook context (`this`) used by this plugin.\n */\ntype PluginContext = {\n /** Log an informational message through Vite/Rolldown/Rollup's logging pipeline. */\n info: (message: string) => void;\n\n /** Log a warning through Vite/Rolldown/Rollup's logging pipeline without stopping the build. */\n warn: (message: string) => void;\n};\n\n/**\n * Minimum plugin interface compatible with Vite/Rolldown/Rollup.\n */\nexport type Plugin = {\n /** Unique identifier for the plugin, used in error messages and logs. */\n name: string;\n\n /**\n * Hook called after the bundle has been fully generated but before it is\n * written to disk. Receives the resolved output options and the complete\n * output bundle map.\n */\n generateBundle?: (\n this: PluginContext,\n outputOptions: OutputOptions,\n bundle: OutputBundle,\n isWrite: boolean\n ) => void | Promise<void>;\n};\n\ntype WebpackStatsOptions = {\n /**\n * JSON file output fileName\n * default: webpack-stats.json\n */\n fileName?: string;\n /**\n * Custom file writer\n * @default - fs.write(FILENAME, JSON.stringify(STATS, null, 2));\n */\n write?: StatsWrite;\n} & Omit<StatsOptions, 'source' | 'map'> &\n BundleTransformOptions;\n\ntype WebpackStatsOptionsOrBuilder =\n | WebpackStatsOptions\n | ((outputOptions: OutputOptions) => WebpackStatsOptions);\n\nexport const webpackStats = (\n options: WebpackStatsOptionsOrBuilder = {}\n): Plugin => ({\n name: PLUGIN_NAME,\n async generateBundle(outputOptions, bundle) {\n const resolvedOptions =\n typeof options === 'function' ? options(outputOptions) : options;\n const {\n fileName,\n excludeAssets,\n excludeModules,\n write = statsWrite,\n ...transformOptions\n } = resolvedOptions;\n\n const rollupStats = extractStats(bundle, {\n excludeAssets,\n excludeModules,\n // Extract stats source to compute size\n source: true,\n });\n const stats = bundleToWebpackStats(rollupStats, transformOptions);\n const filepath = resolveFilepath(fileName, outputOptions.dir);\n\n try {\n const res = await write(\n filepath,\n stats as unknown as Record<string, unknown>\n );\n const outputSize = getByteSize(res.content);\n\n this.info(\n `Stats saved to ${res.filepath} (${formatFileSize(outputSize)})`\n );\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : JSON.stringify(error);\n\n // Log error, but do not throw to allow the compilation to continue\n this.warn(message);\n }\n },\n});\n"],"mappings":";;;;;;AAOA,MAAM,cAAc;AA0EpB,MAAa,gBACX,UAAwC,EAAE,MAC9B;CACZ,MAAM;CACN,MAAM,eAAe,eAAe,QAAQ;EAG1C,MAAM,EACJ,UACA,eACA,gBACA,QAAQ,YACR,GAAG,qBANH,OAAO,YAAY,aAAa,QAAQ,cAAc,GAAG;EAe3D,MAAM,QAAQ,qBANM,aAAa,QAAQ;GACvC;GACA;GAEA,QAAQ;GACT,CAC6C,EAAE,iBAAiB;EACjE,MAAM,WAAW,gBAAgB,UAAU,cAAc,IAAI;AAE7D,MAAI;GACF,MAAM,MAAM,MAAM,MAChB,UACA,MACD;GACD,MAAM,aAAa,YAAY,IAAI,QAAQ;AAE3C,QAAK,KACH,kBAAkB,IAAI,SAAS,IAAI,eAAe,WAAW,CAAC,GAC/D;WACM,OAAgB;GACvB,MAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM;AAGhE,QAAK,KAAK,QAAQ;;;CAGvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"transform.cjs","names":["getByteSize","getChunkId"],"sources":["../src/transform.ts"],"sourcesContent":["import path from 'path';\nimport type {\n Stats,\n AssetStats,\n ChunkStats,\n ModuleStats,\n} from 'rollup-plugin-stats/extract';\n\nimport { getByteSize, getChunkId } from './utils';\n\n// https://github.com/relative-ci/bundle-stats/blob/master/packages/plugin-webpack-filter/src/index.ts\nexport type WebpackStatsFilteredAsset = {\n name: string;\n size?: number;\n};\n\nexport interface WebpackStatsFilteredChunk {\n id: number | string;\n entry: boolean;\n initial: boolean;\n files?: Array<string>;\n names?: Array<string>;\n}\n\nexport interface WebpackStatsFilteredModule {\n name: string;\n size?: number;\n chunks: Array<string | number>;\n}\n\nexport interface WebpackStatsFilteredConcatenatedModule {\n name: string;\n size?: number;\n}\n\nexport interface WebpackStatsFilteredRootModule extends WebpackStatsFilteredModule {\n modules?: Array<WebpackStatsFilteredConcatenatedModule>;\n}\n\nexport interface WebpackStatsFiltered {\n builtAt: number;\n hash?: string;\n assets: Array<WebpackStatsFilteredAsset>;\n chunks: Array<WebpackStatsFilteredChunk>;\n modules: Array<WebpackStatsFilteredRootModule>;\n}\n\nexport type ChunksIssuers = Record<string, Array<ChunkStats>>;\n\n/**\n * Recursivily check if a chunk is async based on the chunks issuers\n */\nexport const lookupChunkAsync = (\n chunksIssuers: ChunksIssuers,\n chunk: ChunkStats,\n processedChunks: Array<string> = [],\n cache: Map<string, boolean> = new Map()\n): boolean => {\n const cached = cache.get(chunk.fileName);\n if (cached !== undefined) {\n return cached;\n }\n\n const result = lookupChunkAsyncUncached(\n chunksIssuers,\n chunk,\n processedChunks,\n cache\n );\n\n cache.set(chunk.fileName, result);\n return result;\n};\n\nconst lookupChunkAsyncUncached = (\n chunksIssuers: ChunksIssuers,\n chunk: ChunkStats,\n processedChunks: Array<string>,\n cache: Map<string, boolean>\n): boolean => {\n // When the chunks are having a circular dependency, return true to continue the recursive check\n if (processedChunks.includes(chunk.fileName)) {\n return true;\n }\n\n if (chunk.isEntry) {\n return false;\n }\n\n if (chunk.isDynamicEntry) {\n return true;\n }\n\n const chunkIssuers = chunksIssuers[chunk.fileName];\n\n /**\n * A sync chunk without issuer chunks, is sync\n */\n if (!chunkIssuers) {\n return false;\n }\n\n const syncChunksIssuers = chunkIssuers.filter((chunkIssuer) => {\n return chunkIssuer.isDynamicEntry === false;\n });\n\n /**\n * A sync chunk with all the chunk issuer async, is async\n */\n if (syncChunksIssuers.length === 0) {\n return true;\n }\n\n /**\n * Recursively lookup for sync loads on the 2nd level issuers\n * - if at least one issuer is sync, the chunk is sync\n * - if none of the issuers are sync, the chunk is async\n */\n const nextProcessed = [...processedChunks, chunk.fileName];\n\n return syncChunksIssuers.every((issuer) =>\n lookupChunkAsync(chunksIssuers, issuer, nextProcessed, cache)\n );\n};\n\ntype AssetSource = ChunkStats | AssetStats;\ntype ChunkSource = ChunkStats;\ntype ModuleSource = { fileName: string } & ModuleStats;\n\n/**\n * Store transformed sources\n */\nclass TransformSources {\n constructor() {\n this.entries = {};\n }\n\n entries: Record<string, unknown> = {};\n\n push(id: string, source: AssetSource | ChunkSource | ModuleSource) {\n this.entries[id] = source;\n }\n\n /**\n * Get asset source\n */\n getByAsset = (asset: WebpackStatsFilteredAsset): AssetSource => {\n return this.entries[asset.name] as AssetSource;\n };\n\n /**\n * Get chunk source\n */\n getByChunk = (chunk: WebpackStatsFilteredChunk): ChunkSource => {\n return this.entries[chunk.id] as ChunkSource;\n };\n\n /**\n * Get module source\n */\n getByModule = (module: WebpackStatsFilteredModule): ModuleSource => {\n return this.entries[module.name] as ModuleSource;\n };\n}\n\nexport type TransformCallback = (\n stats: WebpackStatsFiltered,\n sources: TransformSources,\n bundle: Stats\n) => WebpackStatsFiltered;\n\nconst defaultTransform: TransformCallback = (stats) => stats;\n\nexport type BundleTransformOptions = {\n /**\n * Extract module original size or rendered size\n * default: false\n */\n moduleOriginalSize?: boolean;\n /**\n * Callback function to access and mutate the resulting stats after the transformation\n */\n transform?: TransformCallback;\n};\n\nexport const bundleToWebpackStats = (\n bundle: Stats,\n pluginOptions?: BundleTransformOptions\n): WebpackStatsFiltered => {\n const options = {\n moduleOriginalSize: false,\n ...pluginOptions,\n } satisfies BundleTransformOptions;\n const { moduleOriginalSize, transform = defaultTransform } = options;\n\n const assets: Array<WebpackStatsFilteredAsset> = [];\n const chunks: Array<WebpackStatsFilteredChunk> = [];\n const moduleByFileName: Record<string, WebpackStatsFilteredModule> = {};\n const sources = new TransformSources();\n const chunksIssuers: ChunksIssuers = {};\n\n const entries = Object.values(bundle);\n\n // Collect metadata\n entries.forEach((entry) => {\n if (entry.type === 'chunk') {\n entry.imports?.forEach((chunkImportFileName) => {\n // Skip circular references\n if (\n chunksIssuers[entry.fileName]?.find(\n (chunkIssuer) => chunkIssuer.fileName === chunkImportFileName\n )\n ) {\n return;\n }\n\n if (!chunksIssuers[chunkImportFileName]) {\n chunksIssuers[chunkImportFileName] = [];\n }\n\n chunksIssuers[chunkImportFileName].push(entry);\n });\n }\n });\n\n // Process data\n entries.forEach((entry) => {\n if (entry.type === 'chunk') {\n assets.push({\n name: entry.fileName,\n size: getByteSize(entry.code),\n });\n sources.push(entry.fileName, entry);\n\n const chunkId = getChunkId(entry);\n const chunkAsync = lookupChunkAsync(chunksIssuers, entry);\n\n chunks.push({\n id: chunkId,\n entry: entry.isEntry,\n initial: !chunkAsync,\n files: [entry.fileName],\n names: [entry.name],\n });\n sources.push(chunkId, entry);\n\n Object.entries(entry.modules).forEach(([modulePath, moduleInfo]) => {\n // Remove unexpected rollup null prefix\n const normalizedModulePath = modulePath.replace('\\u0000', '');\n\n const relativeModulePath = path.relative(\n process.cwd(),\n normalizedModulePath\n );\n\n // Match webpack output - add current directory prefix for child modules\n const relativeModulePathWithPrefix = relativeModulePath.match(/^\\.\\./)\n ? relativeModulePath\n : `.${path.sep}${relativeModulePath}`;\n\n const moduleEntry = moduleByFileName[relativeModulePathWithPrefix];\n\n if (moduleEntry) {\n moduleEntry.chunks.push(chunkId);\n } else {\n moduleByFileName[relativeModulePathWithPrefix] = {\n name: relativeModulePathWithPrefix,\n size: moduleOriginalSize\n ? moduleInfo.originalLength\n : moduleInfo.renderedLength,\n chunks: [chunkId],\n };\n sources.push(relativeModulePathWithPrefix, {\n fileName: modulePath,\n ...moduleInfo,\n });\n }\n });\n } else if (entry.type === 'asset') {\n assets.push({\n name: entry.fileName,\n size: getByteSize(entry.source),\n });\n sources.push(entry.fileName, entry);\n } else {\n // noop for unknown types\n }\n });\n\n const stats: WebpackStatsFiltered = {\n builtAt: Date.now(),\n assets,\n chunks,\n modules: Object.values(moduleByFileName),\n };\n\n let result: WebpackStatsFiltered;\n\n try {\n result = transform(stats, sources, bundle);\n } catch (error) {\n console.error(\n 'Custom transform failed! Returning stats without any transforms.',\n error\n );\n result = stats;\n }\n\n return result;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"transform.cjs","names":["getByteSize","getChunkId"],"sources":["../src/transform.ts"],"sourcesContent":["import path from 'path';\nimport type {\n Stats,\n AssetStats,\n ChunkStats,\n ModuleStats,\n} from 'rollup-plugin-stats/extract';\n\nimport { getByteSize, getChunkId } from './utils';\n\n// https://github.com/relative-ci/bundle-stats/blob/master/packages/plugin-webpack-filter/src/index.ts\nexport type WebpackStatsFilteredAsset = {\n name: string;\n size?: number;\n};\n\nexport interface WebpackStatsFilteredChunk {\n id: number | string;\n entry: boolean;\n initial: boolean;\n files?: Array<string>;\n names?: Array<string>;\n}\n\nexport interface WebpackStatsFilteredModule {\n name: string;\n size?: number;\n chunks: Array<string | number>;\n}\n\nexport interface WebpackStatsFilteredConcatenatedModule {\n name: string;\n size?: number;\n}\n\nexport interface WebpackStatsFilteredRootModule extends WebpackStatsFilteredModule {\n modules?: Array<WebpackStatsFilteredConcatenatedModule>;\n}\n\nexport interface WebpackStatsFiltered {\n builtAt: number;\n hash?: string;\n assets: Array<WebpackStatsFilteredAsset>;\n chunks: Array<WebpackStatsFilteredChunk>;\n modules: Array<WebpackStatsFilteredRootModule>;\n}\n\nexport type ChunksIssuers = Record<string, Array<ChunkStats>>;\n\n/**\n * Recursivily check if a chunk is async based on the chunks issuers\n */\nexport const lookupChunkAsync = (\n chunksIssuers: ChunksIssuers,\n chunk: ChunkStats,\n processedChunks: Array<string> = [],\n cache: Map<string, boolean> = new Map()\n): boolean => {\n const cached = cache.get(chunk.fileName);\n if (cached !== undefined) {\n return cached;\n }\n\n const result = lookupChunkAsyncUncached(\n chunksIssuers,\n chunk,\n processedChunks,\n cache\n );\n\n cache.set(chunk.fileName, result);\n return result;\n};\n\nconst lookupChunkAsyncUncached = (\n chunksIssuers: ChunksIssuers,\n chunk: ChunkStats,\n processedChunks: Array<string>,\n cache: Map<string, boolean>\n): boolean => {\n // When the chunks are having a circular dependency, return true to continue the recursive check\n if (processedChunks.includes(chunk.fileName)) {\n return true;\n }\n\n if (chunk.isEntry) {\n return false;\n }\n\n if (chunk.isDynamicEntry) {\n return true;\n }\n\n const chunkIssuers = chunksIssuers[chunk.fileName];\n\n /**\n * A sync chunk without issuer chunks, is sync\n */\n if (!chunkIssuers) {\n return false;\n }\n\n const syncChunksIssuers = chunkIssuers.filter((chunkIssuer) => {\n return chunkIssuer.isDynamicEntry === false;\n });\n\n /**\n * A sync chunk with all the chunk issuer async, is async\n */\n if (syncChunksIssuers.length === 0) {\n return true;\n }\n\n /**\n * Recursively lookup for sync loads on the 2nd level issuers\n * - if at least one issuer is sync, the chunk is sync\n * - if none of the issuers are sync, the chunk is async\n */\n const nextProcessed = [...processedChunks, chunk.fileName];\n\n return syncChunksIssuers.every((issuer) =>\n lookupChunkAsync(chunksIssuers, issuer, nextProcessed, cache)\n );\n};\n\ntype AssetSource = ChunkStats | AssetStats;\ntype ChunkSource = ChunkStats;\ntype ModuleSource = { fileName: string } & ModuleStats;\n\n/**\n * Store transformed sources\n */\nclass TransformSources {\n constructor() {\n this.entries = {};\n }\n\n entries: Record<string, unknown> = {};\n\n push(id: string, source: AssetSource | ChunkSource | ModuleSource) {\n this.entries[id] = source;\n }\n\n /**\n * Get asset source\n */\n getByAsset = (asset: WebpackStatsFilteredAsset): AssetSource => {\n return this.entries[asset.name] as AssetSource;\n };\n\n /**\n * Get chunk source\n */\n getByChunk = (chunk: WebpackStatsFilteredChunk): ChunkSource => {\n return this.entries[chunk.id] as ChunkSource;\n };\n\n /**\n * Get module source\n */\n getByModule = (module: WebpackStatsFilteredModule): ModuleSource => {\n return this.entries[module.name] as ModuleSource;\n };\n}\n\nexport type TransformCallback = (\n stats: WebpackStatsFiltered,\n sources: TransformSources,\n bundle: Stats\n) => WebpackStatsFiltered;\n\nconst defaultTransform: TransformCallback = (stats) => stats;\n\nexport type BundleTransformOptions = {\n /**\n * Extract module original size or rendered size\n * default: false\n */\n moduleOriginalSize?: boolean;\n /**\n * Callback function to access and mutate the resulting stats after the transformation\n */\n transform?: TransformCallback;\n};\n\nexport const bundleToWebpackStats = (\n bundle: Stats,\n pluginOptions?: BundleTransformOptions\n): WebpackStatsFiltered => {\n const options = {\n moduleOriginalSize: false,\n ...pluginOptions,\n } satisfies BundleTransformOptions;\n const { moduleOriginalSize, transform = defaultTransform } = options;\n\n const assets: Array<WebpackStatsFilteredAsset> = [];\n const chunks: Array<WebpackStatsFilteredChunk> = [];\n const moduleByFileName: Record<string, WebpackStatsFilteredModule> = {};\n const sources = new TransformSources();\n const chunksIssuers: ChunksIssuers = {};\n\n const entries = Object.values(bundle);\n\n // Collect metadata\n entries.forEach((entry) => {\n if (entry.type === 'chunk') {\n entry.imports?.forEach((chunkImportFileName) => {\n // Skip circular references\n if (\n chunksIssuers[entry.fileName]?.find(\n (chunkIssuer) => chunkIssuer.fileName === chunkImportFileName\n )\n ) {\n return;\n }\n\n if (!chunksIssuers[chunkImportFileName]) {\n chunksIssuers[chunkImportFileName] = [];\n }\n\n chunksIssuers[chunkImportFileName].push(entry);\n });\n }\n });\n\n // Process data\n entries.forEach((entry) => {\n if (entry.type === 'chunk') {\n assets.push({\n name: entry.fileName,\n size: getByteSize(entry.code),\n });\n sources.push(entry.fileName, entry);\n\n const chunkId = getChunkId(entry);\n const chunkAsync = lookupChunkAsync(chunksIssuers, entry);\n\n chunks.push({\n id: chunkId,\n entry: entry.isEntry,\n initial: !chunkAsync,\n files: [entry.fileName],\n names: [entry.name],\n });\n sources.push(chunkId, entry);\n\n Object.entries(entry.modules).forEach(([modulePath, moduleInfo]) => {\n // Remove unexpected rollup null prefix\n const normalizedModulePath = modulePath.replace('\\u0000', '');\n\n const relativeModulePath = path.relative(\n process.cwd(),\n normalizedModulePath\n );\n\n // Match webpack output - add current directory prefix for child modules\n const relativeModulePathWithPrefix = relativeModulePath.match(/^\\.\\./)\n ? relativeModulePath\n : `.${path.sep}${relativeModulePath}`;\n\n const moduleEntry = moduleByFileName[relativeModulePathWithPrefix];\n\n if (moduleEntry) {\n moduleEntry.chunks.push(chunkId);\n } else {\n moduleByFileName[relativeModulePathWithPrefix] = {\n name: relativeModulePathWithPrefix,\n size: moduleOriginalSize\n ? moduleInfo.originalLength\n : moduleInfo.renderedLength,\n chunks: [chunkId],\n };\n sources.push(relativeModulePathWithPrefix, {\n fileName: modulePath,\n ...moduleInfo,\n });\n }\n });\n } else if (entry.type === 'asset') {\n assets.push({\n name: entry.fileName,\n size: getByteSize(entry.source),\n });\n sources.push(entry.fileName, entry);\n } else {\n // noop for unknown types\n }\n });\n\n const stats: WebpackStatsFiltered = {\n builtAt: Date.now(),\n assets,\n chunks,\n modules: Object.values(moduleByFileName),\n };\n\n let result: WebpackStatsFiltered;\n\n try {\n result = transform(stats, sources, bundle);\n } catch (error) {\n console.error(\n 'Custom transform failed! Returning stats without any transforms.',\n error\n );\n result = stats;\n }\n\n return result;\n};\n"],"mappings":";;;;;;;;;;AAoDA,MAAa,oBACX,eACA,OACA,kBAAiC,EAAE,EACnC,wBAA8B,IAAI,KAAK,KAC3B;CACZ,MAAM,SAAS,MAAM,IAAI,MAAM,SAAS;AACxC,KAAI,WAAW,OACb,QAAO;CAGT,MAAM,SAAS,yBACb,eACA,OACA,iBACA,MACD;AAED,OAAM,IAAI,MAAM,UAAU,OAAO;AACjC,QAAO;;AAGT,MAAM,4BACJ,eACA,OACA,iBACA,UACY;AAEZ,KAAI,gBAAgB,SAAS,MAAM,SAAS,CAC1C,QAAO;AAGT,KAAI,MAAM,QACR,QAAO;AAGT,KAAI,MAAM,eACR,QAAO;CAGT,MAAM,eAAe,cAAc,MAAM;;;;AAKzC,KAAI,CAAC,aACH,QAAO;CAGT,MAAM,oBAAoB,aAAa,QAAQ,gBAAgB;AAC7D,SAAO,YAAY,mBAAmB;GACtC;;;;AAKF,KAAI,kBAAkB,WAAW,EAC/B,QAAO;;;;;;CAQT,MAAM,gBAAgB,CAAC,GAAG,iBAAiB,MAAM,SAAS;AAE1D,QAAO,kBAAkB,OAAO,WAC9B,iBAAiB,eAAe,QAAQ,eAAe,MAAM,CAC9D;;;;;AAUH,IAAM,mBAAN,MAAuB;CACrB,cAAc;AACZ,OAAK,UAAU,EAAE;;CAGnB,UAAmC,EAAE;CAErC,KAAK,IAAY,QAAkD;AACjE,OAAK,QAAQ,MAAM;;;;;CAMrB,cAAc,UAAkD;AAC9D,SAAO,KAAK,QAAQ,MAAM;;;;;CAM5B,cAAc,UAAkD;AAC9D,SAAO,KAAK,QAAQ,MAAM;;;;;CAM5B,eAAe,WAAqD;AAClE,SAAO,KAAK,QAAQ,OAAO;;;AAU/B,MAAM,oBAAuC,UAAU;AAcvD,MAAa,wBACX,QACA,kBACyB;CAKzB,MAAM,EAAE,oBAAoB,YAAY,qBAAqB;EAH3D,oBAAoB;EACpB,GAAG;EAE+D;CAEpE,MAAM,SAA2C,EAAE;CACnD,MAAM,SAA2C,EAAE;CACnD,MAAM,mBAA+D,EAAE;CACvE,MAAM,UAAU,IAAI,kBAAkB;CACtC,MAAM,gBAA+B,EAAE;CAEvC,MAAM,UAAU,OAAO,OAAO,OAAO;AAGrC,SAAQ,SAAS,UAAU;AACzB,MAAI,MAAM,SAAS,QACjB,OAAM,SAAS,SAAS,wBAAwB;AAE9C,OACE,cAAc,MAAM,WAAW,MAC5B,gBAAgB,YAAY,aAAa,oBAC3C,CAED;AAGF,OAAI,CAAC,cAAc,qBACjB,eAAc,uBAAuB,EAAE;AAGzC,iBAAc,qBAAqB,KAAK,MAAM;IAC9C;GAEJ;AAGF,SAAQ,SAAS,UAAU;AACzB,MAAI,MAAM,SAAS,SAAS;AAC1B,UAAO,KAAK;IACV,MAAM,MAAM;IACZ,MAAMA,0BAAY,MAAM,KAAK;IAC9B,CAAC;AACF,WAAQ,KAAK,MAAM,UAAU,MAAM;GAEnC,MAAM,UAAUC,yBAAW,MAAM;GACjC,MAAM,aAAa,iBAAiB,eAAe,MAAM;AAEzD,UAAO,KAAK;IACV,IAAI;IACJ,OAAO,MAAM;IACb,SAAS,CAAC;IACV,OAAO,CAAC,MAAM,SAAS;IACvB,OAAO,CAAC,MAAM,KAAK;IACpB,CAAC;AACF,WAAQ,KAAK,SAAS,MAAM;AAE5B,UAAO,QAAQ,MAAM,QAAQ,CAAC,SAAS,CAAC,YAAY,gBAAgB;IAElE,MAAM,uBAAuB,WAAW,QAAQ,MAAU,GAAG;IAE7D,MAAM,qBAAqB,aAAK,SAC9B,QAAQ,KAAK,EACb,qBACD;IAGD,MAAM,+BAA+B,mBAAmB,MAAM,QAAQ,GAClE,qBACA,IAAI,aAAK,MAAM;IAEnB,MAAM,cAAc,iBAAiB;AAErC,QAAI,YACF,aAAY,OAAO,KAAK,QAAQ;SAC3B;AACL,sBAAiB,gCAAgC;MAC/C,MAAM;MACN,MAAM,qBACF,WAAW,iBACX,WAAW;MACf,QAAQ,CAAC,QAAQ;MAClB;AACD,aAAQ,KAAK,8BAA8B;MACzC,UAAU;MACV,GAAG;MACJ,CAAC;;KAEJ;aACO,MAAM,SAAS,SAAS;AACjC,UAAO,KAAK;IACV,MAAM,MAAM;IACZ,MAAMD,0BAAY,MAAM,OAAO;IAChC,CAAC;AACF,WAAQ,KAAK,MAAM,UAAU,MAAM;;GAIrC;CAEF,MAAM,QAA8B;EAClC,SAAS,KAAK,KAAK;EACnB;EACA;EACA,SAAS,OAAO,OAAO,iBAAiB;EACzC;CAED,IAAI;AAEJ,KAAI;AACF,WAAS,UAAU,OAAO,SAAS,OAAO;UACnC,OAAO;AACd,UAAQ,MACN,oEACA,MACD;AACD,WAAS;;AAGX,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"transform.mjs","names":[],"sources":["../src/transform.ts"],"sourcesContent":["import path from 'path';\nimport type {\n Stats,\n AssetStats,\n ChunkStats,\n ModuleStats,\n} from 'rollup-plugin-stats/extract';\n\nimport { getByteSize, getChunkId } from './utils';\n\n// https://github.com/relative-ci/bundle-stats/blob/master/packages/plugin-webpack-filter/src/index.ts\nexport type WebpackStatsFilteredAsset = {\n name: string;\n size?: number;\n};\n\nexport interface WebpackStatsFilteredChunk {\n id: number | string;\n entry: boolean;\n initial: boolean;\n files?: Array<string>;\n names?: Array<string>;\n}\n\nexport interface WebpackStatsFilteredModule {\n name: string;\n size?: number;\n chunks: Array<string | number>;\n}\n\nexport interface WebpackStatsFilteredConcatenatedModule {\n name: string;\n size?: number;\n}\n\nexport interface WebpackStatsFilteredRootModule extends WebpackStatsFilteredModule {\n modules?: Array<WebpackStatsFilteredConcatenatedModule>;\n}\n\nexport interface WebpackStatsFiltered {\n builtAt: number;\n hash?: string;\n assets: Array<WebpackStatsFilteredAsset>;\n chunks: Array<WebpackStatsFilteredChunk>;\n modules: Array<WebpackStatsFilteredRootModule>;\n}\n\nexport type ChunksIssuers = Record<string, Array<ChunkStats>>;\n\n/**\n * Recursivily check if a chunk is async based on the chunks issuers\n */\nexport const lookupChunkAsync = (\n chunksIssuers: ChunksIssuers,\n chunk: ChunkStats,\n processedChunks: Array<string> = [],\n cache: Map<string, boolean> = new Map()\n): boolean => {\n const cached = cache.get(chunk.fileName);\n if (cached !== undefined) {\n return cached;\n }\n\n const result = lookupChunkAsyncUncached(\n chunksIssuers,\n chunk,\n processedChunks,\n cache\n );\n\n cache.set(chunk.fileName, result);\n return result;\n};\n\nconst lookupChunkAsyncUncached = (\n chunksIssuers: ChunksIssuers,\n chunk: ChunkStats,\n processedChunks: Array<string>,\n cache: Map<string, boolean>\n): boolean => {\n // When the chunks are having a circular dependency, return true to continue the recursive check\n if (processedChunks.includes(chunk.fileName)) {\n return true;\n }\n\n if (chunk.isEntry) {\n return false;\n }\n\n if (chunk.isDynamicEntry) {\n return true;\n }\n\n const chunkIssuers = chunksIssuers[chunk.fileName];\n\n /**\n * A sync chunk without issuer chunks, is sync\n */\n if (!chunkIssuers) {\n return false;\n }\n\n const syncChunksIssuers = chunkIssuers.filter((chunkIssuer) => {\n return chunkIssuer.isDynamicEntry === false;\n });\n\n /**\n * A sync chunk with all the chunk issuer async, is async\n */\n if (syncChunksIssuers.length === 0) {\n return true;\n }\n\n /**\n * Recursively lookup for sync loads on the 2nd level issuers\n * - if at least one issuer is sync, the chunk is sync\n * - if none of the issuers are sync, the chunk is async\n */\n const nextProcessed = [...processedChunks, chunk.fileName];\n\n return syncChunksIssuers.every((issuer) =>\n lookupChunkAsync(chunksIssuers, issuer, nextProcessed, cache)\n );\n};\n\ntype AssetSource = ChunkStats | AssetStats;\ntype ChunkSource = ChunkStats;\ntype ModuleSource = { fileName: string } & ModuleStats;\n\n/**\n * Store transformed sources\n */\nclass TransformSources {\n constructor() {\n this.entries = {};\n }\n\n entries: Record<string, unknown> = {};\n\n push(id: string, source: AssetSource | ChunkSource | ModuleSource) {\n this.entries[id] = source;\n }\n\n /**\n * Get asset source\n */\n getByAsset = (asset: WebpackStatsFilteredAsset): AssetSource => {\n return this.entries[asset.name] as AssetSource;\n };\n\n /**\n * Get chunk source\n */\n getByChunk = (chunk: WebpackStatsFilteredChunk): ChunkSource => {\n return this.entries[chunk.id] as ChunkSource;\n };\n\n /**\n * Get module source\n */\n getByModule = (module: WebpackStatsFilteredModule): ModuleSource => {\n return this.entries[module.name] as ModuleSource;\n };\n}\n\nexport type TransformCallback = (\n stats: WebpackStatsFiltered,\n sources: TransformSources,\n bundle: Stats\n) => WebpackStatsFiltered;\n\nconst defaultTransform: TransformCallback = (stats) => stats;\n\nexport type BundleTransformOptions = {\n /**\n * Extract module original size or rendered size\n * default: false\n */\n moduleOriginalSize?: boolean;\n /**\n * Callback function to access and mutate the resulting stats after the transformation\n */\n transform?: TransformCallback;\n};\n\nexport const bundleToWebpackStats = (\n bundle: Stats,\n pluginOptions?: BundleTransformOptions\n): WebpackStatsFiltered => {\n const options = {\n moduleOriginalSize: false,\n ...pluginOptions,\n } satisfies BundleTransformOptions;\n const { moduleOriginalSize, transform = defaultTransform } = options;\n\n const assets: Array<WebpackStatsFilteredAsset> = [];\n const chunks: Array<WebpackStatsFilteredChunk> = [];\n const moduleByFileName: Record<string, WebpackStatsFilteredModule> = {};\n const sources = new TransformSources();\n const chunksIssuers: ChunksIssuers = {};\n\n const entries = Object.values(bundle);\n\n // Collect metadata\n entries.forEach((entry) => {\n if (entry.type === 'chunk') {\n entry.imports?.forEach((chunkImportFileName) => {\n // Skip circular references\n if (\n chunksIssuers[entry.fileName]?.find(\n (chunkIssuer) => chunkIssuer.fileName === chunkImportFileName\n )\n ) {\n return;\n }\n\n if (!chunksIssuers[chunkImportFileName]) {\n chunksIssuers[chunkImportFileName] = [];\n }\n\n chunksIssuers[chunkImportFileName].push(entry);\n });\n }\n });\n\n // Process data\n entries.forEach((entry) => {\n if (entry.type === 'chunk') {\n assets.push({\n name: entry.fileName,\n size: getByteSize(entry.code),\n });\n sources.push(entry.fileName, entry);\n\n const chunkId = getChunkId(entry);\n const chunkAsync = lookupChunkAsync(chunksIssuers, entry);\n\n chunks.push({\n id: chunkId,\n entry: entry.isEntry,\n initial: !chunkAsync,\n files: [entry.fileName],\n names: [entry.name],\n });\n sources.push(chunkId, entry);\n\n Object.entries(entry.modules).forEach(([modulePath, moduleInfo]) => {\n // Remove unexpected rollup null prefix\n const normalizedModulePath = modulePath.replace('\\u0000', '');\n\n const relativeModulePath = path.relative(\n process.cwd(),\n normalizedModulePath\n );\n\n // Match webpack output - add current directory prefix for child modules\n const relativeModulePathWithPrefix = relativeModulePath.match(/^\\.\\./)\n ? relativeModulePath\n : `.${path.sep}${relativeModulePath}`;\n\n const moduleEntry = moduleByFileName[relativeModulePathWithPrefix];\n\n if (moduleEntry) {\n moduleEntry.chunks.push(chunkId);\n } else {\n moduleByFileName[relativeModulePathWithPrefix] = {\n name: relativeModulePathWithPrefix,\n size: moduleOriginalSize\n ? moduleInfo.originalLength\n : moduleInfo.renderedLength,\n chunks: [chunkId],\n };\n sources.push(relativeModulePathWithPrefix, {\n fileName: modulePath,\n ...moduleInfo,\n });\n }\n });\n } else if (entry.type === 'asset') {\n assets.push({\n name: entry.fileName,\n size: getByteSize(entry.source),\n });\n sources.push(entry.fileName, entry);\n } else {\n // noop for unknown types\n }\n });\n\n const stats: WebpackStatsFiltered = {\n builtAt: Date.now(),\n assets,\n chunks,\n modules: Object.values(moduleByFileName),\n };\n\n let result: WebpackStatsFiltered;\n\n try {\n result = transform(stats, sources, bundle);\n } catch (error) {\n console.error(\n 'Custom transform failed! Returning stats without any transforms.',\n error\n );\n result = stats;\n }\n\n return result;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"transform.mjs","names":[],"sources":["../src/transform.ts"],"sourcesContent":["import path from 'path';\nimport type {\n Stats,\n AssetStats,\n ChunkStats,\n ModuleStats,\n} from 'rollup-plugin-stats/extract';\n\nimport { getByteSize, getChunkId } from './utils';\n\n// https://github.com/relative-ci/bundle-stats/blob/master/packages/plugin-webpack-filter/src/index.ts\nexport type WebpackStatsFilteredAsset = {\n name: string;\n size?: number;\n};\n\nexport interface WebpackStatsFilteredChunk {\n id: number | string;\n entry: boolean;\n initial: boolean;\n files?: Array<string>;\n names?: Array<string>;\n}\n\nexport interface WebpackStatsFilteredModule {\n name: string;\n size?: number;\n chunks: Array<string | number>;\n}\n\nexport interface WebpackStatsFilteredConcatenatedModule {\n name: string;\n size?: number;\n}\n\nexport interface WebpackStatsFilteredRootModule extends WebpackStatsFilteredModule {\n modules?: Array<WebpackStatsFilteredConcatenatedModule>;\n}\n\nexport interface WebpackStatsFiltered {\n builtAt: number;\n hash?: string;\n assets: Array<WebpackStatsFilteredAsset>;\n chunks: Array<WebpackStatsFilteredChunk>;\n modules: Array<WebpackStatsFilteredRootModule>;\n}\n\nexport type ChunksIssuers = Record<string, Array<ChunkStats>>;\n\n/**\n * Recursivily check if a chunk is async based on the chunks issuers\n */\nexport const lookupChunkAsync = (\n chunksIssuers: ChunksIssuers,\n chunk: ChunkStats,\n processedChunks: Array<string> = [],\n cache: Map<string, boolean> = new Map()\n): boolean => {\n const cached = cache.get(chunk.fileName);\n if (cached !== undefined) {\n return cached;\n }\n\n const result = lookupChunkAsyncUncached(\n chunksIssuers,\n chunk,\n processedChunks,\n cache\n );\n\n cache.set(chunk.fileName, result);\n return result;\n};\n\nconst lookupChunkAsyncUncached = (\n chunksIssuers: ChunksIssuers,\n chunk: ChunkStats,\n processedChunks: Array<string>,\n cache: Map<string, boolean>\n): boolean => {\n // When the chunks are having a circular dependency, return true to continue the recursive check\n if (processedChunks.includes(chunk.fileName)) {\n return true;\n }\n\n if (chunk.isEntry) {\n return false;\n }\n\n if (chunk.isDynamicEntry) {\n return true;\n }\n\n const chunkIssuers = chunksIssuers[chunk.fileName];\n\n /**\n * A sync chunk without issuer chunks, is sync\n */\n if (!chunkIssuers) {\n return false;\n }\n\n const syncChunksIssuers = chunkIssuers.filter((chunkIssuer) => {\n return chunkIssuer.isDynamicEntry === false;\n });\n\n /**\n * A sync chunk with all the chunk issuer async, is async\n */\n if (syncChunksIssuers.length === 0) {\n return true;\n }\n\n /**\n * Recursively lookup for sync loads on the 2nd level issuers\n * - if at least one issuer is sync, the chunk is sync\n * - if none of the issuers are sync, the chunk is async\n */\n const nextProcessed = [...processedChunks, chunk.fileName];\n\n return syncChunksIssuers.every((issuer) =>\n lookupChunkAsync(chunksIssuers, issuer, nextProcessed, cache)\n );\n};\n\ntype AssetSource = ChunkStats | AssetStats;\ntype ChunkSource = ChunkStats;\ntype ModuleSource = { fileName: string } & ModuleStats;\n\n/**\n * Store transformed sources\n */\nclass TransformSources {\n constructor() {\n this.entries = {};\n }\n\n entries: Record<string, unknown> = {};\n\n push(id: string, source: AssetSource | ChunkSource | ModuleSource) {\n this.entries[id] = source;\n }\n\n /**\n * Get asset source\n */\n getByAsset = (asset: WebpackStatsFilteredAsset): AssetSource => {\n return this.entries[asset.name] as AssetSource;\n };\n\n /**\n * Get chunk source\n */\n getByChunk = (chunk: WebpackStatsFilteredChunk): ChunkSource => {\n return this.entries[chunk.id] as ChunkSource;\n };\n\n /**\n * Get module source\n */\n getByModule = (module: WebpackStatsFilteredModule): ModuleSource => {\n return this.entries[module.name] as ModuleSource;\n };\n}\n\nexport type TransformCallback = (\n stats: WebpackStatsFiltered,\n sources: TransformSources,\n bundle: Stats\n) => WebpackStatsFiltered;\n\nconst defaultTransform: TransformCallback = (stats) => stats;\n\nexport type BundleTransformOptions = {\n /**\n * Extract module original size or rendered size\n * default: false\n */\n moduleOriginalSize?: boolean;\n /**\n * Callback function to access and mutate the resulting stats after the transformation\n */\n transform?: TransformCallback;\n};\n\nexport const bundleToWebpackStats = (\n bundle: Stats,\n pluginOptions?: BundleTransformOptions\n): WebpackStatsFiltered => {\n const options = {\n moduleOriginalSize: false,\n ...pluginOptions,\n } satisfies BundleTransformOptions;\n const { moduleOriginalSize, transform = defaultTransform } = options;\n\n const assets: Array<WebpackStatsFilteredAsset> = [];\n const chunks: Array<WebpackStatsFilteredChunk> = [];\n const moduleByFileName: Record<string, WebpackStatsFilteredModule> = {};\n const sources = new TransformSources();\n const chunksIssuers: ChunksIssuers = {};\n\n const entries = Object.values(bundle);\n\n // Collect metadata\n entries.forEach((entry) => {\n if (entry.type === 'chunk') {\n entry.imports?.forEach((chunkImportFileName) => {\n // Skip circular references\n if (\n chunksIssuers[entry.fileName]?.find(\n (chunkIssuer) => chunkIssuer.fileName === chunkImportFileName\n )\n ) {\n return;\n }\n\n if (!chunksIssuers[chunkImportFileName]) {\n chunksIssuers[chunkImportFileName] = [];\n }\n\n chunksIssuers[chunkImportFileName].push(entry);\n });\n }\n });\n\n // Process data\n entries.forEach((entry) => {\n if (entry.type === 'chunk') {\n assets.push({\n name: entry.fileName,\n size: getByteSize(entry.code),\n });\n sources.push(entry.fileName, entry);\n\n const chunkId = getChunkId(entry);\n const chunkAsync = lookupChunkAsync(chunksIssuers, entry);\n\n chunks.push({\n id: chunkId,\n entry: entry.isEntry,\n initial: !chunkAsync,\n files: [entry.fileName],\n names: [entry.name],\n });\n sources.push(chunkId, entry);\n\n Object.entries(entry.modules).forEach(([modulePath, moduleInfo]) => {\n // Remove unexpected rollup null prefix\n const normalizedModulePath = modulePath.replace('\\u0000', '');\n\n const relativeModulePath = path.relative(\n process.cwd(),\n normalizedModulePath\n );\n\n // Match webpack output - add current directory prefix for child modules\n const relativeModulePathWithPrefix = relativeModulePath.match(/^\\.\\./)\n ? relativeModulePath\n : `.${path.sep}${relativeModulePath}`;\n\n const moduleEntry = moduleByFileName[relativeModulePathWithPrefix];\n\n if (moduleEntry) {\n moduleEntry.chunks.push(chunkId);\n } else {\n moduleByFileName[relativeModulePathWithPrefix] = {\n name: relativeModulePathWithPrefix,\n size: moduleOriginalSize\n ? moduleInfo.originalLength\n : moduleInfo.renderedLength,\n chunks: [chunkId],\n };\n sources.push(relativeModulePathWithPrefix, {\n fileName: modulePath,\n ...moduleInfo,\n });\n }\n });\n } else if (entry.type === 'asset') {\n assets.push({\n name: entry.fileName,\n size: getByteSize(entry.source),\n });\n sources.push(entry.fileName, entry);\n } else {\n // noop for unknown types\n }\n });\n\n const stats: WebpackStatsFiltered = {\n builtAt: Date.now(),\n assets,\n chunks,\n modules: Object.values(moduleByFileName),\n };\n\n let result: WebpackStatsFiltered;\n\n try {\n result = transform(stats, sources, bundle);\n } catch (error) {\n console.error(\n 'Custom transform failed! Returning stats without any transforms.',\n error\n );\n result = stats;\n }\n\n return result;\n};\n"],"mappings":";;;;;;;AAoDA,MAAa,oBACX,eACA,OACA,kBAAiC,EAAE,EACnC,wBAA8B,IAAI,KAAK,KAC3B;CACZ,MAAM,SAAS,MAAM,IAAI,MAAM,SAAS;AACxC,KAAI,WAAW,OACb,QAAO;CAGT,MAAM,SAAS,yBACb,eACA,OACA,iBACA,MACD;AAED,OAAM,IAAI,MAAM,UAAU,OAAO;AACjC,QAAO;;AAGT,MAAM,4BACJ,eACA,OACA,iBACA,UACY;AAEZ,KAAI,gBAAgB,SAAS,MAAM,SAAS,CAC1C,QAAO;AAGT,KAAI,MAAM,QACR,QAAO;AAGT,KAAI,MAAM,eACR,QAAO;CAGT,MAAM,eAAe,cAAc,MAAM;;;;AAKzC,KAAI,CAAC,aACH,QAAO;CAGT,MAAM,oBAAoB,aAAa,QAAQ,gBAAgB;AAC7D,SAAO,YAAY,mBAAmB;GACtC;;;;AAKF,KAAI,kBAAkB,WAAW,EAC/B,QAAO;;;;;;CAQT,MAAM,gBAAgB,CAAC,GAAG,iBAAiB,MAAM,SAAS;AAE1D,QAAO,kBAAkB,OAAO,WAC9B,iBAAiB,eAAe,QAAQ,eAAe,MAAM,CAC9D;;;;;AAUH,IAAM,mBAAN,MAAuB;CACrB,cAAc;AACZ,OAAK,UAAU,EAAE;;CAGnB,UAAmC,EAAE;CAErC,KAAK,IAAY,QAAkD;AACjE,OAAK,QAAQ,MAAM;;;;;CAMrB,cAAc,UAAkD;AAC9D,SAAO,KAAK,QAAQ,MAAM;;;;;CAM5B,cAAc,UAAkD;AAC9D,SAAO,KAAK,QAAQ,MAAM;;;;;CAM5B,eAAe,WAAqD;AAClE,SAAO,KAAK,QAAQ,OAAO;;;AAU/B,MAAM,oBAAuC,UAAU;AAcvD,MAAa,wBACX,QACA,kBACyB;CAKzB,MAAM,EAAE,oBAAoB,YAAY,qBAAqB;EAH3D,oBAAoB;EACpB,GAAG;EAE+D;CAEpE,MAAM,SAA2C,EAAE;CACnD,MAAM,SAA2C,EAAE;CACnD,MAAM,mBAA+D,EAAE;CACvE,MAAM,UAAU,IAAI,kBAAkB;CACtC,MAAM,gBAA+B,EAAE;CAEvC,MAAM,UAAU,OAAO,OAAO,OAAO;AAGrC,SAAQ,SAAS,UAAU;AACzB,MAAI,MAAM,SAAS,QACjB,OAAM,SAAS,SAAS,wBAAwB;AAE9C,OACE,cAAc,MAAM,WAAW,MAC5B,gBAAgB,YAAY,aAAa,oBAC3C,CAED;AAGF,OAAI,CAAC,cAAc,qBACjB,eAAc,uBAAuB,EAAE;AAGzC,iBAAc,qBAAqB,KAAK,MAAM;IAC9C;GAEJ;AAGF,SAAQ,SAAS,UAAU;AACzB,MAAI,MAAM,SAAS,SAAS;AAC1B,UAAO,KAAK;IACV,MAAM,MAAM;IACZ,MAAM,YAAY,MAAM,KAAK;IAC9B,CAAC;AACF,WAAQ,KAAK,MAAM,UAAU,MAAM;GAEnC,MAAM,UAAU,WAAW,MAAM;GACjC,MAAM,aAAa,iBAAiB,eAAe,MAAM;AAEzD,UAAO,KAAK;IACV,IAAI;IACJ,OAAO,MAAM;IACb,SAAS,CAAC;IACV,OAAO,CAAC,MAAM,SAAS;IACvB,OAAO,CAAC,MAAM,KAAK;IACpB,CAAC;AACF,WAAQ,KAAK,SAAS,MAAM;AAE5B,UAAO,QAAQ,MAAM,QAAQ,CAAC,SAAS,CAAC,YAAY,gBAAgB;IAElE,MAAM,uBAAuB,WAAW,QAAQ,MAAU,GAAG;IAE7D,MAAM,qBAAqB,KAAK,SAC9B,QAAQ,KAAK,EACb,qBACD;IAGD,MAAM,+BAA+B,mBAAmB,MAAM,QAAQ,GAClE,qBACA,IAAI,KAAK,MAAM;IAEnB,MAAM,cAAc,iBAAiB;AAErC,QAAI,YACF,aAAY,OAAO,KAAK,QAAQ;SAC3B;AACL,sBAAiB,gCAAgC;MAC/C,MAAM;MACN,MAAM,qBACF,WAAW,iBACX,WAAW;MACf,QAAQ,CAAC,QAAQ;MAClB;AACD,aAAQ,KAAK,8BAA8B;MACzC,UAAU;MACV,GAAG;MACJ,CAAC;;KAEJ;aACO,MAAM,SAAS,SAAS;AACjC,UAAO,KAAK;IACV,MAAM,MAAM;IACZ,MAAM,YAAY,MAAM,OAAO;IAChC,CAAC;AACF,WAAQ,KAAK,MAAM,UAAU,MAAM;;GAIrC;CAEF,MAAM,QAA8B;EAClC,SAAS,KAAK,KAAK;EACnB;EACA;EACA,SAAS,OAAO,OAAO,iBAAiB;EACzC;CAED,IAAI;AAEJ,KAAI;AACF,WAAS,UAAU,OAAO,SAAS,OAAO;UACnC,OAAO;AACd,UAAQ,MACN,oEACA,MACD;AACD,WAAS;;AAGX,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["crypto","path"],"sources":["../src/utils.ts"],"sourcesContent":["import path from 'node:path';\nimport crypto from 'node:crypto';\nimport type { ChunkStats } from 'rollup-plugin-stats/extract';\n\nconst HASH_LENGTH = 7;\n\n/**\n * Get content byte size\n */\nexport function getByteSize(\n content?: string | Uint8Array<ArrayBufferLike>\n): number {\n if (!content) {\n return 0;\n }\n\n if (typeof content === 'string') {\n return Buffer.byteLength(content);\n }\n\n return content?.length || 0;\n}\n\n/**\n * Generate a 7 chars hash from a filepath\n */\nexport function getHash(filepath: string): string {\n const digest = crypto.createHash('sha256');\n return digest.update(filepath).digest('hex').substr(0, HASH_LENGTH);\n}\n\nexport function getChunkId(chunk: ChunkStats): string {\n let value = chunk.name;\n\n // Use entry module relative path\n if (chunk.moduleIds?.length > 0) {\n const absoluteModulePath = chunk.moduleIds[chunk.moduleIds.length - 1];\n value = path.relative(process.cwd(), absoluteModulePath);\n }\n\n return getHash([chunk, value].join('-'));\n}\n\ntype ExcludeFilepathParam = string | RegExp | ((filepath: string) => boolean);\n\nexport type ExcludeFilepathOption =\n | ExcludeFilepathParam\n | Array<ExcludeFilepathParam>;\n\nexport function round(value: number, precision = 2) {\n const multiplier = 10 ^ precision;\n return Math.round(value * multiplier) / multiplier;\n}\n\nconst FILE_SIZE = {\n BYTE: {\n symbol: 'B',\n multiplier: 1,\n },\n KILO: {\n symbol: 'KiB',\n multiplier: 1024,\n },\n MEGA: {\n symbol: 'MiB',\n multiplier: 1024 * 1024,\n },\n};\n\nexport function formatFileSize(value?: number | null): string {\n let unit = FILE_SIZE.BYTE;\n\n if (typeof value !== 'number') {\n return `0${unit.symbol}`;\n }\n\n if (value < FILE_SIZE.KILO.multiplier) {\n unit = FILE_SIZE.BYTE;\n } else if (value < FILE_SIZE.MEGA.multiplier) {\n unit = FILE_SIZE.KILO;\n } else {\n unit = FILE_SIZE.MEGA;\n }\n\n return `${round(value / unit.multiplier, 2)}${unit.symbol}`;\n}\n\nconst DEFAULT_FILE_NAME = 'webpack-stats.json';\n\nexport function resolveFilepath(\n fileName = DEFAULT_FILE_NAME,\n outputDir?: string\n): string {\n // Check if the fileName is an absolute path\n if (path.isAbsolute(fileName)) {\n return fileName;\n }\n\n // If the fileName is not an absolute path, join it with the output directory or the current working directory\n return path.join(outputDir || process.cwd(), fileName);\n}\n"],"mappings":";;;;;;;AAIA,MAAM,cAAc;;;;AAKpB,SAAgB,YACd,SACQ;AACR,KAAI,CAAC,QACH,QAAO;AAGT,KAAI,OAAO,YAAY,SACrB,QAAO,OAAO,WAAW,QAAQ;AAGnC,QAAO,SAAS,UAAU;;;;;AAM5B,SAAgB,QAAQ,UAA0B;AAEhD,QADeA,oBAAO,WAAW,SAAS,CAC5B,OAAO,SAAS,CAAC,OAAO,MAAM,CAAC,OAAO,GAAG,YAAY;;AAGrE,SAAgB,WAAW,OAA2B;CACpD,IAAI,QAAQ,MAAM;AAGlB,KAAI,MAAM,WAAW,SAAS,GAAG;EAC/B,MAAM,qBAAqB,MAAM,UAAU,MAAM,UAAU,SAAS;AACpE,UAAQC,kBAAK,SAAS,QAAQ,KAAK,EAAE,mBAAmB;;AAG1D,QAAO,QAAQ,CAAC,OAAO,MAAM,CAAC,KAAK,IAAI,CAAC;;AAS1C,SAAgB,MAAM,OAAe,YAAY,GAAG;CAClD,MAAM,aAAa,KAAK;AACxB,QAAO,KAAK,MAAM,QAAQ,WAAW,GAAG;;AAG1C,MAAM,YAAY;CAChB,MAAM;EACJ,QAAQ;EACR,YAAY;EACb;CACD,MAAM;EACJ,QAAQ;EACR,YAAY;EACb;CACD,MAAM;EACJ,QAAQ;EACR,YAAY,OAAO;EACpB;CACF;AAED,SAAgB,eAAe,OAA+B;CAC5D,IAAI,OAAO,UAAU;AAErB,KAAI,OAAO,UAAU,SACnB,QAAO,IAAI,KAAK;AAGlB,KAAI,QAAQ,UAAU,KAAK,WACzB,QAAO,UAAU;UACR,QAAQ,UAAU,KAAK,WAChC,QAAO,UAAU;KAEjB,QAAO,UAAU;AAGnB,QAAO,GAAG,MAAM,QAAQ,KAAK,YAAY,EAAE,GAAG,KAAK;;AAGrD,MAAM,oBAAoB;AAE1B,SAAgB,gBACd,WAAW,mBACX,WACQ;AAER,KAAIA,kBAAK,WAAW,SAAS,CAC3B,QAAO;AAIT,QAAOA,kBAAK,KAAK,aAAa,QAAQ,KAAK,EAAE,SAAS"}
1
+ {"version":3,"file":"utils.cjs","names":["crypto","path"],"sources":["../src/utils.ts"],"sourcesContent":["import path from 'node:path';\nimport crypto from 'node:crypto';\nimport type { ChunkStats } from 'rollup-plugin-stats/extract';\n\nconst HASH_LENGTH = 7;\n\n/**\n * Get content byte size\n */\nexport function getByteSize(\n content?: string | Uint8Array<ArrayBufferLike>\n): number {\n if (!content) {\n return 0;\n }\n\n if (typeof content === 'string') {\n return Buffer.byteLength(content);\n }\n\n return content?.length || 0;\n}\n\n/**\n * Generate a 7 chars hash from a filepath\n */\nexport function getHash(filepath: string): string {\n const digest = crypto.createHash('sha256');\n return digest.update(filepath).digest('hex').substr(0, HASH_LENGTH);\n}\n\nexport function getChunkId(chunk: ChunkStats): string {\n let value = chunk.name;\n\n // Use entry module relative path\n if (chunk.moduleIds?.length > 0) {\n const absoluteModulePath = chunk.moduleIds[chunk.moduleIds.length - 1];\n value = path.relative(process.cwd(), absoluteModulePath);\n }\n\n return getHash([chunk, value].join('-'));\n}\n\ntype ExcludeFilepathParam = string | RegExp | ((filepath: string) => boolean);\n\nexport type ExcludeFilepathOption =\n | ExcludeFilepathParam\n | Array<ExcludeFilepathParam>;\n\nexport function round(value: number, precision = 2) {\n const multiplier = 10 ^ precision;\n return Math.round(value * multiplier) / multiplier;\n}\n\nconst FILE_SIZE = {\n BYTE: {\n symbol: 'B',\n multiplier: 1,\n },\n KILO: {\n symbol: 'KiB',\n multiplier: 1024,\n },\n MEGA: {\n symbol: 'MiB',\n multiplier: 1024 * 1024,\n },\n};\n\nexport function formatFileSize(value?: number | null): string {\n let unit = FILE_SIZE.BYTE;\n\n if (typeof value !== 'number') {\n return `0${unit.symbol}`;\n }\n\n if (value < FILE_SIZE.KILO.multiplier) {\n unit = FILE_SIZE.BYTE;\n } else if (value < FILE_SIZE.MEGA.multiplier) {\n unit = FILE_SIZE.KILO;\n } else {\n unit = FILE_SIZE.MEGA;\n }\n\n return `${round(value / unit.multiplier, 2)}${unit.symbol}`;\n}\n\nconst DEFAULT_FILE_NAME = 'webpack-stats.json';\n\nexport function resolveFilepath(\n fileName = DEFAULT_FILE_NAME,\n outputDir?: string\n): string {\n // Check if the fileName is an absolute path\n if (path.isAbsolute(fileName)) {\n return fileName;\n }\n\n // If the fileName is not an absolute path, join it with the output directory or the current working directory\n return path.join(outputDir || process.cwd(), fileName);\n}\n"],"mappings":";;;;;;;AAIA,MAAM,cAAc;;;;AAKpB,SAAgB,YACd,SACQ;AACR,KAAI,CAAC,QACH,QAAO;AAGT,KAAI,OAAO,YAAY,SACrB,QAAO,OAAO,WAAW,QAAQ;AAGnC,QAAO,SAAS,UAAU;;;;;AAM5B,SAAgB,QAAQ,UAA0B;AAEhD,QADeA,oBAAO,WAAW,SACpB,CAAC,OAAO,SAAS,CAAC,OAAO,MAAM,CAAC,OAAO,GAAG,YAAY;;AAGrE,SAAgB,WAAW,OAA2B;CACpD,IAAI,QAAQ,MAAM;AAGlB,KAAI,MAAM,WAAW,SAAS,GAAG;EAC/B,MAAM,qBAAqB,MAAM,UAAU,MAAM,UAAU,SAAS;AACpE,UAAQC,kBAAK,SAAS,QAAQ,KAAK,EAAE,mBAAmB;;AAG1D,QAAO,QAAQ,CAAC,OAAO,MAAM,CAAC,KAAK,IAAI,CAAC;;AAS1C,SAAgB,MAAM,OAAe,YAAY,GAAG;CAClD,MAAM,aAAa,KAAK;AACxB,QAAO,KAAK,MAAM,QAAQ,WAAW,GAAG;;AAG1C,MAAM,YAAY;CAChB,MAAM;EACJ,QAAQ;EACR,YAAY;EACb;CACD,MAAM;EACJ,QAAQ;EACR,YAAY;EACb;CACD,MAAM;EACJ,QAAQ;EACR,YAAY,OAAO;EACpB;CACF;AAED,SAAgB,eAAe,OAA+B;CAC5D,IAAI,OAAO,UAAU;AAErB,KAAI,OAAO,UAAU,SACnB,QAAO,IAAI,KAAK;AAGlB,KAAI,QAAQ,UAAU,KAAK,WACzB,QAAO,UAAU;UACR,QAAQ,UAAU,KAAK,WAChC,QAAO,UAAU;KAEjB,QAAO,UAAU;AAGnB,QAAO,GAAG,MAAM,QAAQ,KAAK,YAAY,EAAE,GAAG,KAAK;;AAGrD,MAAM,oBAAoB;AAE1B,SAAgB,gBACd,WAAW,mBACX,WACQ;AAER,KAAIA,kBAAK,WAAW,SAAS,CAC3B,QAAO;AAIT,QAAOA,kBAAK,KAAK,aAAa,QAAQ,KAAK,EAAE,SAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import path from 'node:path';\nimport crypto from 'node:crypto';\nimport type { ChunkStats } from 'rollup-plugin-stats/extract';\n\nconst HASH_LENGTH = 7;\n\n/**\n * Get content byte size\n */\nexport function getByteSize(\n content?: string | Uint8Array<ArrayBufferLike>\n): number {\n if (!content) {\n return 0;\n }\n\n if (typeof content === 'string') {\n return Buffer.byteLength(content);\n }\n\n return content?.length || 0;\n}\n\n/**\n * Generate a 7 chars hash from a filepath\n */\nexport function getHash(filepath: string): string {\n const digest = crypto.createHash('sha256');\n return digest.update(filepath).digest('hex').substr(0, HASH_LENGTH);\n}\n\nexport function getChunkId(chunk: ChunkStats): string {\n let value = chunk.name;\n\n // Use entry module relative path\n if (chunk.moduleIds?.length > 0) {\n const absoluteModulePath = chunk.moduleIds[chunk.moduleIds.length - 1];\n value = path.relative(process.cwd(), absoluteModulePath);\n }\n\n return getHash([chunk, value].join('-'));\n}\n\ntype ExcludeFilepathParam = string | RegExp | ((filepath: string) => boolean);\n\nexport type ExcludeFilepathOption =\n | ExcludeFilepathParam\n | Array<ExcludeFilepathParam>;\n\nexport function round(value: number, precision = 2) {\n const multiplier = 10 ^ precision;\n return Math.round(value * multiplier) / multiplier;\n}\n\nconst FILE_SIZE = {\n BYTE: {\n symbol: 'B',\n multiplier: 1,\n },\n KILO: {\n symbol: 'KiB',\n multiplier: 1024,\n },\n MEGA: {\n symbol: 'MiB',\n multiplier: 1024 * 1024,\n },\n};\n\nexport function formatFileSize(value?: number | null): string {\n let unit = FILE_SIZE.BYTE;\n\n if (typeof value !== 'number') {\n return `0${unit.symbol}`;\n }\n\n if (value < FILE_SIZE.KILO.multiplier) {\n unit = FILE_SIZE.BYTE;\n } else if (value < FILE_SIZE.MEGA.multiplier) {\n unit = FILE_SIZE.KILO;\n } else {\n unit = FILE_SIZE.MEGA;\n }\n\n return `${round(value / unit.multiplier, 2)}${unit.symbol}`;\n}\n\nconst DEFAULT_FILE_NAME = 'webpack-stats.json';\n\nexport function resolveFilepath(\n fileName = DEFAULT_FILE_NAME,\n outputDir?: string\n): string {\n // Check if the fileName is an absolute path\n if (path.isAbsolute(fileName)) {\n return fileName;\n }\n\n // If the fileName is not an absolute path, join it with the output directory or the current working directory\n return path.join(outputDir || process.cwd(), fileName);\n}\n"],"mappings":";;;;AAIA,MAAM,cAAc;;;;AAKpB,SAAgB,YACd,SACQ;AACR,KAAI,CAAC,QACH,QAAO;AAGT,KAAI,OAAO,YAAY,SACrB,QAAO,OAAO,WAAW,QAAQ;AAGnC,QAAO,SAAS,UAAU;;;;;AAM5B,SAAgB,QAAQ,UAA0B;AAEhD,QADe,OAAO,WAAW,SAAS,CAC5B,OAAO,SAAS,CAAC,OAAO,MAAM,CAAC,OAAO,GAAG,YAAY;;AAGrE,SAAgB,WAAW,OAA2B;CACpD,IAAI,QAAQ,MAAM;AAGlB,KAAI,MAAM,WAAW,SAAS,GAAG;EAC/B,MAAM,qBAAqB,MAAM,UAAU,MAAM,UAAU,SAAS;AACpE,UAAQ,KAAK,SAAS,QAAQ,KAAK,EAAE,mBAAmB;;AAG1D,QAAO,QAAQ,CAAC,OAAO,MAAM,CAAC,KAAK,IAAI,CAAC;;AAS1C,SAAgB,MAAM,OAAe,YAAY,GAAG;CAClD,MAAM,aAAa,KAAK;AACxB,QAAO,KAAK,MAAM,QAAQ,WAAW,GAAG;;AAG1C,MAAM,YAAY;CAChB,MAAM;EACJ,QAAQ;EACR,YAAY;EACb;CACD,MAAM;EACJ,QAAQ;EACR,YAAY;EACb;CACD,MAAM;EACJ,QAAQ;EACR,YAAY,OAAO;EACpB;CACF;AAED,SAAgB,eAAe,OAA+B;CAC5D,IAAI,OAAO,UAAU;AAErB,KAAI,OAAO,UAAU,SACnB,QAAO,IAAI,KAAK;AAGlB,KAAI,QAAQ,UAAU,KAAK,WACzB,QAAO,UAAU;UACR,QAAQ,UAAU,KAAK,WAChC,QAAO,UAAU;KAEjB,QAAO,UAAU;AAGnB,QAAO,GAAG,MAAM,QAAQ,KAAK,YAAY,EAAE,GAAG,KAAK;;AAGrD,MAAM,oBAAoB;AAE1B,SAAgB,gBACd,WAAW,mBACX,WACQ;AAER,KAAI,KAAK,WAAW,SAAS,CAC3B,QAAO;AAIT,QAAO,KAAK,KAAK,aAAa,QAAQ,KAAK,EAAE,SAAS"}
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import path from 'node:path';\nimport crypto from 'node:crypto';\nimport type { ChunkStats } from 'rollup-plugin-stats/extract';\n\nconst HASH_LENGTH = 7;\n\n/**\n * Get content byte size\n */\nexport function getByteSize(\n content?: string | Uint8Array<ArrayBufferLike>\n): number {\n if (!content) {\n return 0;\n }\n\n if (typeof content === 'string') {\n return Buffer.byteLength(content);\n }\n\n return content?.length || 0;\n}\n\n/**\n * Generate a 7 chars hash from a filepath\n */\nexport function getHash(filepath: string): string {\n const digest = crypto.createHash('sha256');\n return digest.update(filepath).digest('hex').substr(0, HASH_LENGTH);\n}\n\nexport function getChunkId(chunk: ChunkStats): string {\n let value = chunk.name;\n\n // Use entry module relative path\n if (chunk.moduleIds?.length > 0) {\n const absoluteModulePath = chunk.moduleIds[chunk.moduleIds.length - 1];\n value = path.relative(process.cwd(), absoluteModulePath);\n }\n\n return getHash([chunk, value].join('-'));\n}\n\ntype ExcludeFilepathParam = string | RegExp | ((filepath: string) => boolean);\n\nexport type ExcludeFilepathOption =\n | ExcludeFilepathParam\n | Array<ExcludeFilepathParam>;\n\nexport function round(value: number, precision = 2) {\n const multiplier = 10 ^ precision;\n return Math.round(value * multiplier) / multiplier;\n}\n\nconst FILE_SIZE = {\n BYTE: {\n symbol: 'B',\n multiplier: 1,\n },\n KILO: {\n symbol: 'KiB',\n multiplier: 1024,\n },\n MEGA: {\n symbol: 'MiB',\n multiplier: 1024 * 1024,\n },\n};\n\nexport function formatFileSize(value?: number | null): string {\n let unit = FILE_SIZE.BYTE;\n\n if (typeof value !== 'number') {\n return `0${unit.symbol}`;\n }\n\n if (value < FILE_SIZE.KILO.multiplier) {\n unit = FILE_SIZE.BYTE;\n } else if (value < FILE_SIZE.MEGA.multiplier) {\n unit = FILE_SIZE.KILO;\n } else {\n unit = FILE_SIZE.MEGA;\n }\n\n return `${round(value / unit.multiplier, 2)}${unit.symbol}`;\n}\n\nconst DEFAULT_FILE_NAME = 'webpack-stats.json';\n\nexport function resolveFilepath(\n fileName = DEFAULT_FILE_NAME,\n outputDir?: string\n): string {\n // Check if the fileName is an absolute path\n if (path.isAbsolute(fileName)) {\n return fileName;\n }\n\n // If the fileName is not an absolute path, join it with the output directory or the current working directory\n return path.join(outputDir || process.cwd(), fileName);\n}\n"],"mappings":";;;;AAIA,MAAM,cAAc;;;;AAKpB,SAAgB,YACd,SACQ;AACR,KAAI,CAAC,QACH,QAAO;AAGT,KAAI,OAAO,YAAY,SACrB,QAAO,OAAO,WAAW,QAAQ;AAGnC,QAAO,SAAS,UAAU;;;;;AAM5B,SAAgB,QAAQ,UAA0B;AAEhD,QADe,OAAO,WAAW,SACpB,CAAC,OAAO,SAAS,CAAC,OAAO,MAAM,CAAC,OAAO,GAAG,YAAY;;AAGrE,SAAgB,WAAW,OAA2B;CACpD,IAAI,QAAQ,MAAM;AAGlB,KAAI,MAAM,WAAW,SAAS,GAAG;EAC/B,MAAM,qBAAqB,MAAM,UAAU,MAAM,UAAU,SAAS;AACpE,UAAQ,KAAK,SAAS,QAAQ,KAAK,EAAE,mBAAmB;;AAG1D,QAAO,QAAQ,CAAC,OAAO,MAAM,CAAC,KAAK,IAAI,CAAC;;AAS1C,SAAgB,MAAM,OAAe,YAAY,GAAG;CAClD,MAAM,aAAa,KAAK;AACxB,QAAO,KAAK,MAAM,QAAQ,WAAW,GAAG;;AAG1C,MAAM,YAAY;CAChB,MAAM;EACJ,QAAQ;EACR,YAAY;EACb;CACD,MAAM;EACJ,QAAQ;EACR,YAAY;EACb;CACD,MAAM;EACJ,QAAQ;EACR,YAAY,OAAO;EACpB;CACF;AAED,SAAgB,eAAe,OAA+B;CAC5D,IAAI,OAAO,UAAU;AAErB,KAAI,OAAO,UAAU,SACnB,QAAO,IAAI,KAAK;AAGlB,KAAI,QAAQ,UAAU,KAAK,WACzB,QAAO,UAAU;UACR,QAAQ,UAAU,KAAK,WAChC,QAAO,UAAU;KAEjB,QAAO,UAAU;AAGnB,QAAO,GAAG,MAAM,QAAQ,KAAK,YAAY,EAAE,GAAG,KAAK;;AAGrD,MAAM,oBAAoB;AAE1B,SAAgB,gBACd,WAAW,mBACX,WACQ;AAER,KAAI,KAAK,WAAW,SAAS,CAC3B,QAAO;AAIT,QAAO,KAAK,KAAK,aAAa,QAAQ,KAAK,EAAE,SAAS"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rollup-plugin-webpack-stats",
3
3
  "description": "Rollup/Vite/Rolldown plugin to generate a stats JSON file with a bundle-stats webpack-compatible structure",
4
- "version": "3.1.1",
4
+ "version": "3.1.2",
5
5
  "private": false,
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -74,25 +74,25 @@
74
74
  "prepare": "husky"
75
75
  },
76
76
  "devDependencies": {
77
- "@release-it/conventional-changelog": "10.0.6",
77
+ "@release-it/conventional-changelog": "11.0.0",
78
78
  "@types/node": "25.6.0",
79
79
  "eslint": "9.39.2",
80
80
  "eslint-config-prettier": "10.1.8",
81
81
  "husky": "9.1.7",
82
82
  "lint-staged": "16.4.0",
83
- "memfs": "4.57.1",
84
- "prettier": "3.8.1",
85
- "release-it": "19.2.4",
83
+ "memfs": "4.57.2",
84
+ "prettier": "3.8.3",
85
+ "release-it": "20.0.1",
86
86
  "rimraf": "6.1.3",
87
- "tsdown": "0.21.7",
87
+ "tsdown": "0.21.10",
88
88
  "tslib": "2.8.1",
89
- "typescript": "6.0.2",
90
- "typescript-eslint": "8.58.1",
89
+ "typescript": "6.0.3",
90
+ "typescript-eslint": "8.59.1",
91
91
  "vite": "7.3.2",
92
- "vitest": "4.1.4"
92
+ "vitest": "4.1.5"
93
93
  },
94
94
  "dependencies": {
95
- "rollup-plugin-stats": "2.1.1"
95
+ "rollup-plugin-stats": "2.1.2"
96
96
  },
97
97
  "peerDependencies": {
98
98
  "rolldown": "^1.0.0-beta.0",