rollup-plugin-webpack-stats 3.1.3 → 4.0.0-beta.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.
@@ -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":"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"}
@@ -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":"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"}
@@ -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;CACR,IAAI,CAAC,SACH,OAAO;CAGT,IAAI,OAAO,YAAY,UACrB,OAAO,OAAO,WAAW,OAAO;CAGlC,OAAO,SAAS,UAAU;AAC5B;;;;AAKA,SAAgB,QAAQ,UAA0B;CAEhD,OADeA,oBAAO,WAAW,QACrB,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,GAAG,WAAW;AACpE;AAEA,SAAgB,WAAW,OAA2B;CACpD,IAAI,QAAQ,MAAM;CAGlB,IAAI,MAAM,WAAW,SAAS,GAAG;EAC/B,MAAM,qBAAqB,MAAM,UAAU,MAAM,UAAU,SAAS;EACpE,QAAQC,kBAAK,SAAS,QAAQ,IAAI,GAAG,kBAAkB;CACzD;CAEA,OAAO,QAAQ,CAAC,OAAO,KAAK,EAAE,KAAK,GAAG,CAAC;AACzC;AAQA,SAAgB,MAAM,OAAe,YAAY,GAAG;CAClD,MAAM,aAAa,KAAK;CACxB,OAAO,KAAK,MAAM,QAAQ,UAAU,IAAI;AAC1C;AAEA,MAAM,YAAY;CAChB,MAAM;EACJ,QAAQ;EACR,YAAY;CACd;CACA,MAAM;EACJ,QAAQ;EACR,YAAY;CACd;CACA,MAAM;EACJ,QAAQ;EACR,YAAY,OAAO;CACrB;AACF;AAEA,SAAgB,eAAe,OAA+B;CAC5D,IAAI,OAAO,UAAU;CAErB,IAAI,OAAO,UAAU,UACnB,OAAO,IAAI,KAAK;CAGlB,IAAI,QAAQ,UAAU,KAAK,YACzB,OAAO,UAAU;MACZ,IAAI,QAAQ,UAAU,KAAK,YAChC,OAAO,UAAU;MAEjB,OAAO,UAAU;CAGnB,OAAO,GAAG,MAAM,QAAQ,KAAK,YAAY,CAAC,IAAI,KAAK;AACrD;AAEA,MAAM,oBAAoB;AAE1B,SAAgB,gBACd,WAAW,mBACX,WACQ;CAER,IAAIA,kBAAK,WAAW,QAAQ,GAC1B,OAAO;CAIT,OAAOA,kBAAK,KAAK,aAAa,QAAQ,IAAI,GAAG,QAAQ;AACvD"}
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;CACR,IAAI,CAAC,SACH,OAAO;CAGT,IAAI,OAAO,YAAY,UACrB,OAAO,OAAO,WAAW,OAAO;CAGlC,OAAO,SAAS,UAAU;AAC5B;;;;AAKA,SAAgB,QAAQ,UAA0B;CAEhD,OADeA,oBAAO,WAAW,QACrB,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,GAAG,WAAW;AACpE;AAEA,SAAgB,WAAW,OAA2B;CACpD,IAAI,QAAQ,MAAM;CAGlB,IAAI,MAAM,WAAW,SAAS,GAAG;EAC/B,MAAM,qBAAqB,MAAM,UAAU,MAAM,UAAU,SAAS;EACpE,QAAQC,kBAAK,SAAS,QAAQ,IAAI,GAAG,kBAAkB;CACzD;CAEA,OAAO,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC;AACzC;AAQA,SAAgB,MAAM,OAAe,YAAY,GAAG;CAClD,MAAM,aAAa,KAAK;CACxB,OAAO,KAAK,MAAM,QAAQ,UAAU,IAAI;AAC1C;AAEA,MAAM,YAAY;CAChB,MAAM;EACJ,QAAQ;EACR,YAAY;CACd;CACA,MAAM;EACJ,QAAQ;EACR,YAAY;CACd;CACA,MAAM;EACJ,QAAQ;EACR,YAAY,OAAO;CACrB;AACF;AAEA,SAAgB,eAAe,OAA+B;CAC5D,IAAI,OAAO,UAAU;CAErB,IAAI,OAAO,UAAU,UACnB,OAAO,IAAI,KAAK;CAGlB,IAAI,QAAQ,UAAU,KAAK,YACzB,OAAO,UAAU;MACZ,IAAI,QAAQ,UAAU,KAAK,YAChC,OAAO,UAAU;MAEjB,OAAO,UAAU;CAGnB,OAAO,GAAG,MAAM,QAAQ,KAAK,YAAY,CAAC,IAAI,KAAK;AACrD;AAEA,MAAM,oBAAoB;AAE1B,SAAgB,gBACd,WAAW,mBACX,WACQ;CAER,IAAIA,kBAAK,WAAW,QAAQ,GAC1B,OAAO;CAIT,OAAOA,kBAAK,KAAK,aAAa,QAAQ,IAAI,GAAG,QAAQ;AACvD"}
@@ -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;CACR,IAAI,CAAC,SACH,OAAO;CAGT,IAAI,OAAO,YAAY,UACrB,OAAO,OAAO,WAAW,OAAO;CAGlC,OAAO,SAAS,UAAU;AAC5B;;;;AAKA,SAAgB,QAAQ,UAA0B;CAEhD,OADe,OAAO,WAAW,QACrB,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,GAAG,WAAW;AACpE;AAEA,SAAgB,WAAW,OAA2B;CACpD,IAAI,QAAQ,MAAM;CAGlB,IAAI,MAAM,WAAW,SAAS,GAAG;EAC/B,MAAM,qBAAqB,MAAM,UAAU,MAAM,UAAU,SAAS;EACpE,QAAQ,KAAK,SAAS,QAAQ,IAAI,GAAG,kBAAkB;CACzD;CAEA,OAAO,QAAQ,CAAC,OAAO,KAAK,EAAE,KAAK,GAAG,CAAC;AACzC;AAQA,SAAgB,MAAM,OAAe,YAAY,GAAG;CAClD,MAAM,aAAa,KAAK;CACxB,OAAO,KAAK,MAAM,QAAQ,UAAU,IAAI;AAC1C;AAEA,MAAM,YAAY;CAChB,MAAM;EACJ,QAAQ;EACR,YAAY;CACd;CACA,MAAM;EACJ,QAAQ;EACR,YAAY;CACd;CACA,MAAM;EACJ,QAAQ;EACR,YAAY,OAAO;CACrB;AACF;AAEA,SAAgB,eAAe,OAA+B;CAC5D,IAAI,OAAO,UAAU;CAErB,IAAI,OAAO,UAAU,UACnB,OAAO,IAAI,KAAK;CAGlB,IAAI,QAAQ,UAAU,KAAK,YACzB,OAAO,UAAU;MACZ,IAAI,QAAQ,UAAU,KAAK,YAChC,OAAO,UAAU;MAEjB,OAAO,UAAU;CAGnB,OAAO,GAAG,MAAM,QAAQ,KAAK,YAAY,CAAC,IAAI,KAAK;AACrD;AAEA,MAAM,oBAAoB;AAE1B,SAAgB,gBACd,WAAW,mBACX,WACQ;CAER,IAAI,KAAK,WAAW,QAAQ,GAC1B,OAAO;CAIT,OAAO,KAAK,KAAK,aAAa,QAAQ,IAAI,GAAG,QAAQ;AACvD"}
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;CACR,IAAI,CAAC,SACH,OAAO;CAGT,IAAI,OAAO,YAAY,UACrB,OAAO,OAAO,WAAW,OAAO;CAGlC,OAAO,SAAS,UAAU;AAC5B;;;;AAKA,SAAgB,QAAQ,UAA0B;CAEhD,OADe,OAAO,WAAW,QACrB,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,GAAG,WAAW;AACpE;AAEA,SAAgB,WAAW,OAA2B;CACpD,IAAI,QAAQ,MAAM;CAGlB,IAAI,MAAM,WAAW,SAAS,GAAG;EAC/B,MAAM,qBAAqB,MAAM,UAAU,MAAM,UAAU,SAAS;EACpE,QAAQ,KAAK,SAAS,QAAQ,IAAI,GAAG,kBAAkB;CACzD;CAEA,OAAO,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC;AACzC;AAQA,SAAgB,MAAM,OAAe,YAAY,GAAG;CAClD,MAAM,aAAa,KAAK;CACxB,OAAO,KAAK,MAAM,QAAQ,UAAU,IAAI;AAC1C;AAEA,MAAM,YAAY;CAChB,MAAM;EACJ,QAAQ;EACR,YAAY;CACd;CACA,MAAM;EACJ,QAAQ;EACR,YAAY;CACd;CACA,MAAM;EACJ,QAAQ;EACR,YAAY,OAAO;CACrB;AACF;AAEA,SAAgB,eAAe,OAA+B;CAC5D,IAAI,OAAO,UAAU;CAErB,IAAI,OAAO,UAAU,UACnB,OAAO,IAAI,KAAK;CAGlB,IAAI,QAAQ,UAAU,KAAK,YACzB,OAAO,UAAU;MACZ,IAAI,QAAQ,UAAU,KAAK,YAChC,OAAO,UAAU;MAEjB,OAAO,UAAU;CAGnB,OAAO,GAAG,MAAM,QAAQ,KAAK,YAAY,CAAC,IAAI,KAAK;AACrD;AAEA,MAAM,oBAAoB;AAE1B,SAAgB,gBACd,WAAW,mBACX,WACQ;CAER,IAAI,KAAK,WAAW,QAAQ,GAC1B,OAAO;CAIT,OAAO,KAAK,KAAK,aAAa,QAAQ,IAAI,GAAG,QAAQ;AACvD"}
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.3",
4
+ "version": "4.0.0-beta.0",
5
5
  "private": false,
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -43,7 +43,7 @@
43
43
  }
44
44
  },
45
45
  "engines": {
46
- "node": ">=18"
46
+ "node": ">=22"
47
47
  },
48
48
  "author": {
49
49
  "name": "Viorel Cojocaru",
@@ -74,25 +74,27 @@
74
74
  "prepare": "husky"
75
75
  },
76
76
  "devDependencies": {
77
- "@release-it/conventional-changelog": "11.0.0",
78
- "@types/node": "25.9.1",
79
- "eslint": "9.39.2",
77
+ "@eslint/js": "10.0.1",
78
+ "@release-it/conventional-changelog": "11.0.1",
79
+ "@types/node": "26.0.0",
80
+ "eslint": "10.5.0",
80
81
  "eslint-config-prettier": "10.1.8",
82
+ "globals": "^17.6.0",
81
83
  "husky": "9.1.7",
82
- "lint-staged": "17.0.5",
84
+ "lint-staged": "17.0.7",
83
85
  "memfs": "4.57.3",
84
- "prettier": "3.8.3",
85
- "release-it": "20.0.1",
86
+ "prettier": "3.8.4",
87
+ "release-it": "20.2.0",
86
88
  "rimraf": "6.1.3",
87
- "tsdown": "0.22.1",
89
+ "tsdown": "0.22.3",
88
90
  "tslib": "2.8.1",
89
91
  "typescript": "6.0.3",
90
- "typescript-eslint": "8.60.0",
91
- "vite": "7.3.2",
92
- "vitest": "4.1.7"
92
+ "typescript-eslint": "8.61.1",
93
+ "vite": "8.0.16",
94
+ "vitest": "4.1.9"
93
95
  },
94
96
  "dependencies": {
95
- "rollup-plugin-stats": "2.1.3"
97
+ "rollup-plugin-stats": "3.0.0-beta.1"
96
98
  },
97
99
  "peerDependencies": {
98
100
  "rolldown": "^1.0.0-beta.0",