@zealakit/css-doctor-next 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.cjs +120 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +120 -36
- package/dist/index.js.map +1 -1
- package/package.json +24 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/webpack-plugin.ts","../src/reporter.ts"],"sourcesContent":["import type { NextConfig } from \"next\";\n\nimport { findCssDoctorConfig, loadCssDoctorConfig } from \"./config\";\nimport type {\n CssAssetDiagnostic,\n CssAssetSplitInfo,\n CssAssetWarning,\n CssAssetWarningKind,\n CssDoctorNextDiagnostics,\n CssDoctorNextOptions,\n CssDoctorWebpackPluginOptions,\n EmittedCssChunk,\n EmittedPageChunk,\n PageCoverageOptions,\n SizeBudgetDiagnostics,\n SizeBudgetOptions,\n} from \"./types\";\nimport { CssDoctorWebpackPlugin } from \"./webpack-plugin\";\n\ntype WebpackContextLike = {\n dev?: boolean;\n isServer?: boolean;\n};\n\ntype WebpackConfigLike = {\n plugins?: unknown[];\n [key: string]: unknown;\n};\n\n/**\n * Wraps a Next.js config and adds the css-doctor webpack plugin to the client\n * production compilation.\n *\n * The user's existing `webpack` callback is preserved and may return either a\n * config object or a promise. No plugin is added for dev or server builds.\n */\nexport function withCssDoctor(\n nextConfig: NextConfig = {},\n options: CssDoctorNextOptions = {},\n): NextConfig {\n const pluginOptions = resolvePluginOptions(options);\n const originalWebpack = nextConfig.webpack;\n\n const webpack: NonNullable<NextConfig[\"webpack\"]> = (config, context) => {\n const result = originalWebpack ? originalWebpack(config, context) : config;\n\n if (isPromiseLike(result)) {\n return result.then((resolvedConfig: unknown) =>\n enableCssDoctor(resolvedConfig, context, pluginOptions),\n );\n }\n\n return enableCssDoctor(result, context, pluginOptions);\n };\n\n return {\n ...nextConfig,\n webpack,\n };\n}\n\nfunction enableCssDoctor(\n config: unknown,\n context: WebpackContextLike,\n options: CssDoctorWebpackPluginOptions,\n): unknown {\n if (!isRecord(config)) {\n return config;\n }\n\n if (context.dev === true || context.isServer === true) {\n return config;\n }\n\n const webpackConfig = config as WebpackConfigLike;\n const plugins = Array.isArray(webpackConfig.plugins)\n ? [...webpackConfig.plugins]\n : [];\n\n const alreadyInstalled = plugins.some(\n (plugin) => plugin instanceof CssDoctorWebpackPlugin,\n );\n\n if (!alreadyInstalled) {\n plugins.push(new CssDoctorWebpackPlugin(options));\n }\n\n webpackConfig.plugins = plugins;\n\n if (options.minify === false) {\n disableNextCssMinifier(webpackConfig);\n }\n\n return webpackConfig;\n}\n\nfunction disableNextCssMinifier(config: WebpackConfigLike): void {\n const optimization = config.optimization as\n | { minimizer?: unknown[] }\n | undefined;\n\n if (!optimization || !Array.isArray(optimization.minimizer)) {\n return;\n }\n\n optimization.minimizer = optimization.minimizer.filter((plugin) => {\n const source =\n typeof plugin === \"function\"\n ? Function.prototype.toString.call(plugin)\n : String(plugin);\n\n return (\n !source.includes(\"CssMinimizerPlugin\") &&\n !source.includes(\"css-minimizer-plugin\")\n );\n });\n}\n\nfunction resolvePluginOptions(\n options: CssDoctorNextOptions,\n): CssDoctorWebpackPluginOptions {\n const { configFile, ...inlineOptions } = options;\n const hasInlineOptions = Object.keys(inlineOptions).length > 0;\n\n let loadedOptions: CssDoctorNextOptions = {};\n let configError: string | undefined;\n\n if (configFile) {\n const loaded = loadCssDoctorConfig({ configFile });\n loadedOptions = loaded.options;\n configError = loaded.error;\n } else if (!hasInlineOptions) {\n const loaded = loadCssDoctorConfig();\n loadedOptions = loaded.options;\n configError = loaded.error;\n }\n\n if (configError) {\n console.warn(\n `[css-doctor] ${configError}. Continuing with inline/default options.`,\n );\n }\n\n const merged: CssDoctorNextOptions = {\n ...loadedOptions,\n ...inlineOptions,\n };\n const { configFile: _ignored, ...pluginOptions } = merged;\n\n return pluginOptions;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport { findCssDoctorConfig, loadCssDoctorConfig };\nexport type {\n CssAssetDiagnostic,\n CssAssetSplitInfo,\n CssAssetWarning,\n CssAssetWarningKind,\n CssDoctorNextDiagnostics,\n CssDoctorNextOptions,\n CssDoctorWebpackPluginOptions,\n EmittedCssChunk,\n EmittedPageChunk,\n PageCoverageOptions,\n SizeBudgetDiagnostics,\n SizeBudgetOptions,\n};\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { createJiti } from \"jiti\";\n\nimport type { CssDoctorNextOptions } from \"./types\";\n\nconst CONFIG_FILENAMES = [\n \"cssd.config.ts\",\n \"cssd.config.mts\",\n \"cssd.config.js\",\n \"cssd.config.mjs\",\n];\n\n/** Result of attempting to load the central css-doctor config file. */\nexport type LoadedCssDoctorConfig = {\n options: CssDoctorNextOptions;\n file?: string;\n error?: string;\n};\n\n/**\n * Finds `cssd.config.*` starting at `cwd` and walking up to the filesystem\n * root. Returns the absolute path or `null`.\n */\nexport function findCssDoctorConfig(\n cwd: string = process.cwd(),\n): string | null {\n let directory = resolve(cwd);\n\n while (true) {\n for (const filename of CONFIG_FILENAMES) {\n const candidate = resolve(directory, filename);\n\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n const parent = dirname(directory);\n\n if (parent === directory) {\n return null;\n }\n\n directory = parent;\n }\n}\n\n/**\n * Loads `cssd.config.ts|mts|js|mjs` synchronously using jiti.\n *\n * Missing and empty config files fall back to an empty options object. Invalid\n * config files are reported through `error` instead of throwing, so a broken\n * css-doctor config cannot prevent Next.js from starting.\n */\nexport function loadCssDoctorConfig(\n options: { cwd?: string; configFile?: string } = {},\n): LoadedCssDoctorConfig {\n const cwd = resolve(options.cwd ?? process.cwd());\n const file = options.configFile\n ? resolve(cwd, options.configFile)\n : findCssDoctorConfig(cwd);\n\n if (!file) {\n return { options: {} };\n }\n\n if (!existsSync(file)) {\n return { options: {} };\n }\n\n try {\n if (readFileSync(file, \"utf8\").trim().length === 0) {\n return { options: {}, file };\n }\n\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n fsCache: false,\n moduleCache: false,\n });\n const loaded = jiti(file) as unknown;\n return {\n options: normalizeConfig(loaded),\n file,\n };\n } catch (error) {\n return {\n options: {},\n file,\n error:\n `failed to load ${file}: ` +\n (error instanceof Error ? error.message : String(error)),\n };\n }\n}\n\nfunction normalizeConfig(value: unknown): CssDoctorNextOptions {\n let candidate = value;\n\n if (isRecord(candidate) && \"default\" in candidate) {\n candidate = candidate.default;\n }\n\n if (isRecord(candidate) && \"cssDoctor\" in candidate) {\n candidate = candidate.cssDoctor;\n }\n\n return isRecord(candidate) ? (candidate as CssDoctorNextOptions) : {};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, extname, posix, resolve } from \"node:path\";\nimport { performance } from \"node:perf_hooks\";\n\nimport { analyzeCss, optimizeCss } from \"@zealakit/css-doctor-binding\";\nimport type {\n JsChunkOutput,\n JsCssAnalysisResult,\n JsSelectorStat,\n} from \"@zealakit/css-doctor-binding\";\nimport type { Compilation, Compiler, Entrypoint, Module } from \"webpack\";\n\nimport { printDiagnostics } from \"./reporter\";\nimport type {\n CssAssetDiagnostic,\n CssAssetWarning,\n CssDoctorNextDiagnostics,\n CssDoctorWebpackPluginOptions,\n EmittedCssChunk,\n PageCoverageOptions,\n SizeBudgetOptions,\n} from \"./types\";\n\nconst PLUGIN_NAME = \"CssDoctorWebpackPlugin\";\nconst DEFAULT_MIN_PAGE_RATIO = 0.5;\nconst DEFAULT_MAX_CHUNK_SIZE = 60 * 1_024;\nconst LARGE_CSS_ASSET_BYTES = 500 * 1_024;\n\ntype PageInfo = {\n name: string;\n classes: Set<string>;\n cssFiles: Set<string>;\n jsFiles: Set<string>;\n};\n\ntype PageEntry = {\n entry: Entrypoint;\n name: string;\n sourceName: string;\n};\n\ntype CollectedPages = {\n pages: PageInfo[];\n pagesByCss: Map<string, Set<string>>;\n};\n\n/**\n * Webpack compiler plugin that splits emitted client CSS by page coverage and\n * removes selectors no route uses.\n *\n * All work happens inside `processAssets` at the optimize stage. Failures are\n * logged through the compilation logger and never abort the Next.js build.\n */\nexport class CssDoctorWebpackPlugin {\n private readonly options: CssDoctorWebpackPluginOptions;\n private readonly pageCoverage: Required<PageCoverageOptions> & {\n forceCommon: string[];\n };\n private readonly sizeBudget: Required<SizeBudgetOptions>;\n private readonly minify: boolean;\n private readonly include: Array<string | RegExp>;\n private readonly exclude: Array<string | RegExp>;\n private readonly configurationErrors: string[] = [];\n\n constructor(options: CssDoctorWebpackPluginOptions = {}) {\n this.options = options;\n const ratio =\n options.pageCoverage?.minPageRatio ??\n options.minPageRatio ??\n DEFAULT_MIN_PAGE_RATIO;\n const maxChunkSize =\n options.sizeBudget?.maxChunkSize ?? DEFAULT_MAX_CHUNK_SIZE;\n\n this.pageCoverage = {\n enabled: options.pageCoverage?.enabled ?? true,\n minPageRatio:\n Number.isFinite(ratio) && ratio >= 0 && ratio <= 1\n ? ratio\n : DEFAULT_MIN_PAGE_RATIO,\n forceCommon:\n options.pageCoverage?.forceCommon ?? options.forceCommonSelectors ?? [],\n };\n\n if (!Number.isFinite(ratio) || ratio < 0 || ratio > 1) {\n this.configurationErrors.push(\n \"minPageRatio must be a number between 0 and 1; using 0.5\",\n );\n }\n\n this.sizeBudget = {\n enabled: options.sizeBudget?.enabled ?? true,\n maxChunkSize:\n Number.isInteger(maxChunkSize) && maxChunkSize > 0\n ? maxChunkSize\n : DEFAULT_MAX_CHUNK_SIZE,\n isolateVariables: options.sizeBudget?.isolateVariables ?? true,\n };\n\n if (\n options.sizeBudget?.enabled !== false &&\n (!Number.isInteger(maxChunkSize) || maxChunkSize <= 0)\n ) {\n this.configurationErrors.push(\n \"maxChunkSize must be a positive integer; using 61440\",\n );\n }\n\n this.minify = options.minify ?? true;\n this.include = options.include ?? [];\n this.exclude = options.exclude ?? [];\n }\n\n apply(compiler: Compiler): void {\n compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {\n compilation.hooks.processAssets.tapPromise(\n {\n name: PLUGIN_NAME,\n stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE,\n },\n async () => {\n try {\n await this.process(compiler, compilation);\n } catch (error) {\n compilation\n .getLogger(PLUGIN_NAME)\n .warn(\n `[css-doctor] diagnostics failed without interrupting the build: ${describeError(\n error,\n )}`,\n );\n }\n },\n );\n });\n }\n\n private async process(\n compiler: Compiler,\n compilation: Compilation,\n ): Promise<void> {\n const startedAt = performance.now();\n const logger = compilation.getLogger(PLUGIN_NAME);\n const pagesResult = await collectPages(compilation, this.options.pageUsage);\n const pageNames = pagesResult.pages.map((page) => page.name);\n const pageByName = new Map(\n pagesResult.pages.map((page) => [page.name, page]),\n );\n const allPages = new Set(pageNames);\n const pageUsage: Record<string, string[]> = {};\n const pageUsageCounts: Record<string, number> = {};\n\n for (const page of pagesResult.pages) {\n const classes = [...page.classes].sort();\n pageUsage[page.name] = classes;\n pageUsageCounts[page.name] = classes.length;\n }\n\n const pageCoverageApplied =\n this.pageCoverage.enabled && pageNames.length > 0;\n const diagnostics: CssDoctorNextDiagnostics = {\n plugin: \"css-doctor-next\",\n generatedAt: new Date().toISOString(),\n durationMs: 0,\n minPageRatio: this.pageCoverage.minPageRatio,\n minify: this.minify,\n pageCoverage: {\n enabled: this.pageCoverage.enabled,\n minPageRatio: this.pageCoverage.minPageRatio,\n },\n sizeBudget: {\n enabled: this.sizeBudget.enabled,\n maxChunkSize: this.sizeBudget.maxChunkSize,\n isolateVariables: this.sizeBudget.isolateVariables,\n splitChunks: 0,\n oversizedChunks: 0,\n },\n pages: pageNames,\n pageUsage: pageUsageCounts,\n splitApplied: pageCoverageApplied,\n totalCssAssets: 0,\n analyzedCssAssets: 0,\n failedCssAssets: 0,\n skippedCssAssets: 0,\n totalSizeBeforeBytes: 0,\n totalSizeAfterBytes: 0,\n totalSelectors: 0,\n totalRules: 0,\n commonCssBytes: 0,\n pageSpecificCssBytes: 0,\n emittedPageChunks: [],\n emittedCssChunks: [],\n usageMatrix: [],\n deadCodeCount: 0,\n files: [],\n errors: [],\n };\n\n diagnostics.errors.push(...this.configurationErrors);\n\n const matrix = new Map<string, JsSelectorStat>();\n const pageFiles = new Map<string, string[]>();\n const usedAssetNames = new Set(\n compilation.getAssets().map((asset) => asset.name),\n );\n const RawSource = compiler.webpack.sources.RawSource;\n\n const emitCssChunk = (chunk: JsChunkOutput): string => {\n const hash = createHash(\"sha256\")\n .update(chunk.css)\n .digest(\"hex\")\n .slice(0, 8);\n const safeName =\n chunk.name\n .replace(/[^a-zA-Z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase() || \"chunk\";\n let fileName = `static/css/${safeName}.${hash}.css`;\n let index = 2;\n\n while (usedAssetNames.has(fileName)) {\n fileName = `static/css/${safeName}.${hash}-${index}.css`;\n index += 1;\n }\n\n compilation.emitAsset(fileName, new RawSource(chunk.css));\n usedAssetNames.add(fileName);\n return fileName;\n };\n\n for (const asset of compilation.getAssets()) {\n if (!asset.name.endsWith(\".css\")) {\n continue;\n }\n\n diagnostics.totalCssAssets += 1;\n\n if (\n this.shouldSkipAsset(\n compilation,\n asset.name,\n sourceToString(asset.source.source()),\n )\n ) {\n diagnostics.skippedCssAssets += 1;\n continue;\n }\n\n const associatedPages = [\n ...(pagesResult.pagesByCss.get(asset.name) ?? allPages),\n ].sort();\n const file = analyzeAsset(asset.name, asset.source.source());\n file.associatedPages = associatedPages;\n\n if (file.error) {\n diagnostics.failedCssAssets += 1;\n diagnostics.errors.push(`${asset.name}: ${file.error}`);\n diagnostics.files.push(file);\n logger.warn(`[css-doctor] ${asset.name}: ${file.error}`);\n continue;\n }\n\n const originalCss = sourceToString(asset.source.source());\n\n try {\n const pipeline = optimizeCss({\n cssContent: originalCss,\n pageUsage,\n pageCoverage: {\n enabled: this.pageCoverage.enabled,\n minPageRatio: this.pageCoverage.minPageRatio,\n forceCommon: this.pageCoverage.forceCommon,\n },\n sizeBudget: {\n enabled: this.sizeBudget.enabled,\n maxChunkSize: this.sizeBudget.maxChunkSize,\n isolateVariables: this.sizeBudget.isolateVariables,\n },\n minify: this.minify,\n });\n\n const commonChunks = pipeline.chunks.filter(\n (chunk) => chunk.page === undefined && chunk.sourceChunk === \"common\",\n );\n const pageChunks = pipeline.chunks.filter(\n (chunk) => chunk.page !== undefined,\n );\n const commonWasSplit =\n commonChunks.length > 1 ||\n commonChunks.some((chunk) => chunk.splitDueToSize);\n const embeddedCommon = commonWasSplit ? undefined : commonChunks[0];\n\n const commonFileNames: string[] = [];\n let commonSizeBytes = 0;\n\n for (const chunk of commonChunks) {\n const embedded = chunk === embeddedCommon;\n const fileName = embedded ? asset.name : emitCssChunk(chunk);\n commonSizeBytes += chunk.sizeBytes;\n commonFileNames.push(fileName);\n\n diagnostics.emittedCssChunks.push({\n fileName,\n sourceChunk: chunk.sourceChunk,\n kind: chunk.kind as EmittedCssChunk[\"kind\"],\n page: chunk.page,\n variables: chunk.variables,\n part: chunk.part,\n sizeBytes: chunk.sizeBytes,\n oversized: chunk.oversized,\n splitDueToSize: chunk.splitDueToSize,\n embedded,\n });\n\n if (chunk.splitDueToSize) {\n diagnostics.sizeBudget.splitChunks += 1;\n }\n\n if (chunk.oversized) {\n diagnostics.sizeBudget.oversizedChunks += 1;\n }\n }\n\n if (commonWasSplit) {\n const imports = commonFileNames\n .map((fileName) => {\n const relativePath = posix.relative(\n posix.dirname(asset.name),\n fileName,\n );\n return `@import \"./${relativePath}\";`;\n })\n .join(\"\\n\");\n compilation.updateAsset(asset.name, new RawSource(imports));\n } else {\n compilation.updateAsset(\n asset.name,\n new RawSource(embeddedCommon?.css ?? \"\"),\n );\n }\n\n let pageSpecificSizeBytes = 0;\n\n for (const chunk of pageChunks) {\n const page = chunk.page;\n\n if (!page) {\n continue;\n }\n\n const fileName = emitCssChunk(chunk);\n pageSpecificSizeBytes += chunk.sizeBytes;\n const files = pageFiles.get(page) ?? [];\n files.push(fileName);\n pageFiles.set(page, files);\n\n diagnostics.emittedPageChunks.push({\n page,\n fileName,\n sizeBytes: chunk.sizeBytes,\n });\n diagnostics.emittedCssChunks.push({\n fileName,\n sourceChunk: chunk.sourceChunk,\n kind: chunk.kind as EmittedCssChunk[\"kind\"],\n page,\n variables: chunk.variables,\n part: chunk.part,\n sizeBytes: chunk.sizeBytes,\n oversized: chunk.oversized,\n splitDueToSize: chunk.splitDueToSize,\n embedded: false,\n });\n\n if (chunk.splitDueToSize) {\n diagnostics.sizeBudget.splitChunks += 1;\n }\n\n if (chunk.oversized) {\n diagnostics.sizeBudget.oversizedChunks += 1;\n }\n }\n\n file.sizeAfterBytes = commonWasSplit\n ? commonSizeBytes\n : Buffer.byteLength(embeddedCommon?.css ?? \"\", \"utf8\");\n file.split = {\n associatedPages,\n commonSizeBytes,\n pageSpecificSizeBytes,\n deadCodeCount: pipeline.deadCodeCount,\n };\n\n for (const stat of pipeline.stats) {\n const previous = matrix.get(stat.selector);\n\n if (!previous || stat.totalOccurrences > previous.totalOccurrences) {\n matrix.set(stat.selector, stat);\n }\n }\n\n diagnostics.deadCodeCount += pipeline.deadCodeCount;\n diagnostics.commonCssBytes += commonSizeBytes;\n diagnostics.pageSpecificCssBytes += pageSpecificSizeBytes;\n } catch (error) {\n const message = `failed to optimize CSS: ${describeError(error)}`;\n diagnostics.errors.push(`${asset.name}: ${message}`);\n logger.warn(`[css-doctor] ${asset.name}: ${message}`);\n }\n\n diagnostics.analyzedCssAssets += 1;\n diagnostics.totalSizeBeforeBytes += file.sizeBeforeBytes;\n diagnostics.totalSizeAfterBytes += file.sizeAfterBytes;\n diagnostics.totalSelectors += file.selectorCount;\n diagnostics.totalRules += file.ruleCount;\n diagnostics.files.push(file);\n }\n\n if (pageFiles.size > 0) {\n injectPageJsLoaders(compilation, pageFiles, pageByName, RawSource);\n }\n\n diagnostics.usageMatrix = [...matrix.values()].sort((left, right) =>\n left.selector.localeCompare(right.selector),\n );\n diagnostics.durationMs = roundMs(performance.now() - startedAt);\n\n if (this.options.onDiagnostics) {\n try {\n await this.options.onDiagnostics(diagnostics);\n } catch (error) {\n const message = `onDiagnostics callback failed: ${describeError(\n error,\n )}`;\n diagnostics.errors.push(message);\n logger.warn(`[css-doctor] ${message}`);\n }\n }\n\n if (\n this.options.report !== false &&\n (diagnostics.totalCssAssets > 0 || diagnostics.errors.length > 0)\n ) {\n try {\n printDiagnostics(diagnostics);\n } catch (error) {\n logger.warn(`[css-doctor] reporter failed: ${describeError(error)}`);\n }\n }\n }\n\n private shouldSkipAsset(\n compilation: Compilation,\n assetName: string,\n source: string,\n ): boolean {\n if (isCssModuleAsset(compilation, assetName, source)) {\n return true;\n }\n\n if (this.include.length > 0 && !matchesPatterns(assetName, this.include)) {\n return true;\n }\n\n return this.exclude.length > 0 && matchesPatterns(assetName, this.exclude);\n }\n}\n\nfunction injectPageJsLoaders(\n compilation: Compilation,\n cssByPage: Map<string, string[]>,\n pageByName: Map<string, PageInfo>,\n RawSource: new (source: string) => import(\"webpack\").sources.Source,\n): void {\n const publicPath =\n typeof compilation.options.output.publicPath === \"string\" &&\n compilation.options.output.publicPath.length > 0\n ? compilation.options.output.publicPath\n : \"/_next/\";\n const normalizedBase = publicPath.endsWith(\"/\")\n ? publicPath\n : `${publicPath}/`;\n\n for (const [page, files] of cssByPage) {\n const jsFiles = pageByName.get(page)?.jsFiles;\n\n if (!jsFiles || files.length === 0) {\n continue;\n }\n\n const hrefs = files.map((file) => `${normalizedBase}${file}`);\n const snippet = `(()=>{const __cssDoctorPageStyles=${JSON.stringify(hrefs)};if(typeof document!==\"undefined\"){for(const __cssDoctorPageHref of __cssDoctorPageStyles){if(!Array.from(document.querySelectorAll(\"link[data-css-doctor-page]\")).some((link)=>link.dataset.cssDoctorPage===__cssDoctorPageHref)){const __cssDoctorPageLink=document.createElement(\"link\");__cssDoctorPageLink.rel=\"stylesheet\";__cssDoctorPageLink.href=__cssDoctorPageHref;__cssDoctorPageLink.dataset.cssDoctorPage=__cssDoctorPageHref;document.head.append(__cssDoctorPageLink);}}}})();\\n`;\n\n for (const jsFile of jsFiles) {\n const asset = compilation.getAsset(jsFile);\n\n if (!asset) {\n continue;\n }\n\n const source = sourceToString(asset.source.source());\n compilation.updateAsset(jsFile, new RawSource(snippet + source));\n }\n }\n}\n\nfunction matchesPatterns(\n value: string,\n patterns: Array<string | RegExp>,\n): boolean {\n return patterns.some((pattern) =>\n typeof pattern === \"string\" ? value.includes(pattern) : pattern.test(value),\n );\n}\n\nfunction isCssModuleAsset(\n compilation: Compilation,\n assetName: string,\n source: string,\n): boolean {\n if (/\\.module\\.(css|scss|sass|less|styl|stylus)$/i.test(assetName)) {\n return true;\n }\n\n // Next.js emits CSS Modules as content-hashed `static/css/<hash>.css`\n // assets whose original `.module.css` name is no longer in the asset name.\n // Its default local-identifier format is `<file>_<local>__<hash>`.\n if (/\\.[A-Za-z0-9_-]+_[A-Za-z0-9_-]+__[A-Za-z0-9_-]+/.test(source)) {\n return true;\n }\n\n for (const chunk of compilation.chunks) {\n if (!chunk.files.has(assetName) && !chunk.auxiliaryFiles.has(assetName)) {\n continue;\n }\n\n for (const module of compilation.chunkGraph.getChunkModulesIterable(\n chunk,\n )) {\n if (moduleHasCssModule(module)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction moduleHasCssModule(module: Module): boolean {\n const nested = (module as Module & { modules?: Iterable<Module> }).modules;\n\n if (nested) {\n for (const child of nested) {\n if (moduleHasCssModule(child)) {\n return true;\n }\n }\n }\n\n const resource = (module as Module & { resource?: unknown }).resource;\n return (\n typeof resource === \"string\" &&\n /\\.module\\.(css|scss|sass|less|styl|stylus)(\\?|$)/i.test(resource)\n );\n}\n\nfunction analyzeAsset(\n fileName: string,\n source: string | Buffer,\n): CssAssetDiagnostic {\n try {\n const css = sourceToString(source);\n const sizeBeforeBytes = Buffer.byteLength(css, \"utf8\");\n const analysis = analyzeCss(css);\n const warnings = collectSyntaxWarnings(analysis);\n\n if (sizeBeforeBytes >= LARGE_CSS_ASSET_BYTES) {\n warnings.push({\n kind: \"large-asset\",\n message: `CSS asset is larger than ${formatBytes(\n LARGE_CSS_ASSET_BYTES,\n )}; consider route-level code splitting.`,\n });\n }\n\n return {\n fileName,\n sizeBeforeBytes,\n sizeAfterBytes: sizeBeforeBytes,\n selectorCount: analysis.stats.selectorCount,\n ruleCount: analysis.stats.ruleCount,\n associatedPages: [],\n warnings,\n analysis,\n };\n } catch (error) {\n return {\n fileName,\n sizeBeforeBytes: 0,\n sizeAfterBytes: 0,\n selectorCount: 0,\n ruleCount: 0,\n associatedPages: [],\n warnings: [],\n error: describeError(error),\n };\n }\n}\n\nasync function collectPages(\n compilation: Compilation,\n directPageUsage: Record<string, string[]> | undefined,\n): Promise<CollectedPages> {\n const entries = [...compilation.entrypoints.values()];\n const pageEntries: PageEntry[] = [];\n const sharedEntries: Entrypoint[] = [];\n const fallbackEntries: PageEntry[] = [];\n\n for (const entry of entries) {\n const name = entryName(entry);\n\n if (!name) {\n continue;\n }\n\n if (isPageEntry(name)) {\n const route = routeNameForEntry(name) ?? name;\n pageEntries.push({ entry, name: route, sourceName: name });\n } else if (isSharedEntry(name)) {\n sharedEntries.push(entry);\n } else if (!isInternalEntry(name)) {\n fallbackEntries.push({\n entry,\n name: routeNameForEntry(name) ?? name,\n sourceName: name,\n });\n }\n }\n\n const selectedPages = pageEntries.length > 0 ? pageEntries : fallbackEntries;\n const direct = directPageUsage\n ? Object.keys(directPageUsage).length > 0\n : false;\n const pages = new Map<string, PageInfo>();\n const pagesByCss = new Map<string, Set<string>>();\n\n if (direct && directPageUsage) {\n for (const [rawName, classes] of Object.entries(directPageUsage)) {\n const name = rawName.trim();\n\n if (!name) {\n continue;\n }\n\n pages.set(name, {\n name,\n classes: new Set(classes.map((className) => className.toLowerCase())),\n cssFiles: new Set(),\n jsFiles: new Set(),\n });\n }\n } else {\n const sourceCache = new Map<string, Promise<string | undefined>>();\n const sharedClasses = new Set<string>();\n\n const projectRoot = process.cwd();\n\n for (const entry of sharedEntries) {\n for (const className of await collectEntryClasses(\n compilation,\n entry,\n sourceCache,\n )) {\n sharedClasses.add(className);\n }\n\n const name = entryName(entry);\n\n if (name) {\n for (const className of await collectNameSourceClasses(\n name,\n projectRoot,\n sourceCache,\n )) {\n sharedClasses.add(className);\n }\n }\n }\n\n for (const { entry, name, sourceName } of selectedPages) {\n const page = pages.get(name) ?? {\n name,\n classes: new Set<string>(),\n cssFiles: new Set<string>(),\n jsFiles: collectEntryJsFiles(entry),\n };\n for (const jsFile of collectEntryJsFiles(entry)) {\n page.jsFiles.add(jsFile);\n }\n\n for (const className of sharedClasses) {\n page.classes.add(className);\n }\n\n for (const className of await collectEntryClasses(\n compilation,\n entry,\n sourceCache,\n )) {\n page.classes.add(className);\n }\n\n for (const className of await collectPageSourceClasses(\n sourceName,\n projectRoot,\n sourceCache,\n )) {\n page.classes.add(className);\n }\n\n pages.set(name, page);\n }\n }\n\n const targetPages = [...pages.keys()];\n\n for (const { entry, name } of selectedPages) {\n const cssFiles = collectEntryCssFiles(entry);\n\n if (direct) {\n const directPage = pages.get(name);\n\n if (directPage) {\n for (const cssFile of cssFiles) {\n directPage.cssFiles.add(cssFile);\n }\n }\n } else {\n const page = pages.get(name);\n\n if (page) {\n for (const cssFile of cssFiles) {\n page.cssFiles.add(cssFile);\n }\n }\n }\n }\n\n const sharedCssFiles = new Set<string>();\n\n for (const entry of sharedEntries) {\n for (const cssFile of collectEntryCssFiles(entry)) {\n sharedCssFiles.add(cssFile);\n }\n }\n\n for (const page of pages.values()) {\n for (const cssFile of page.cssFiles) {\n addCssOwner(pagesByCss, cssFile, page.name);\n }\n }\n\n for (const cssFile of sharedCssFiles) {\n for (const page of targetPages) {\n addCssOwner(pagesByCss, cssFile, page);\n }\n }\n\n return {\n pages: [...pages.values()],\n pagesByCss,\n };\n}\n\nasync function collectPageSourceClasses(\n entryName: string,\n projectRoot: string,\n sourceCache: Map<string, Promise<string | undefined>>,\n): Promise<Set<string>> {\n const classes = new Set<string>();\n const visited = new Set<string>();\n const normalized = normalizeSlashes(entryName);\n const candidates: string[] = [];\n\n if (normalized.startsWith(\"app/\")) {\n const path = normalized.slice(4);\n\n if (path === \"page\" || path.endsWith(\"/page\")) {\n const pagePath = path === \"page\" ? \"app/page\" : `app/${path}`;\n candidates.push(resolve(projectRoot, pagePath));\n\n if (path === \"_not-found/page\") {\n candidates.push(resolve(projectRoot, \"app/not-found\"));\n }\n\n const directories = path.split(\"/\").slice(0, -1).filter(Boolean);\n const layoutPaths = [\"app\"];\n\n for (let index = 0; index < directories.length; index += 1) {\n layoutPaths.push(`app/${directories.slice(0, index + 1).join(\"/\")}`);\n }\n\n for (const layoutPath of layoutPaths) {\n candidates.push(resolve(projectRoot, `${layoutPath}/layout`));\n }\n } else {\n candidates.push(resolve(projectRoot, normalized));\n }\n } else if (normalized.startsWith(\"pages/\")) {\n candidates.push(resolve(projectRoot, normalized));\n candidates.push(resolve(projectRoot, \"pages/_app\"));\n } else {\n candidates.push(resolve(projectRoot, normalized));\n }\n\n for (const candidate of candidates) {\n const file = findSourceFile(candidate);\n\n if (file) {\n await scanSourceFile(file, classes, projectRoot, sourceCache, visited);\n }\n }\n\n return classes;\n}\n\nasync function collectNameSourceClasses(\n entryName: string,\n projectRoot: string,\n sourceCache: Map<string, Promise<string | undefined>>,\n): Promise<Set<string>> {\n const classes = new Set<string>();\n const visited = new Set<string>();\n const candidate = resolve(projectRoot, normalizeSlashes(entryName));\n const file = findSourceFile(candidate);\n\n if (file) {\n await scanSourceFile(file, classes, projectRoot, sourceCache, visited);\n }\n\n return classes;\n}\n\nasync function scanSourceFile(\n filePath: string,\n classes: Set<string>,\n projectRoot: string,\n sourceCache: Map<string, Promise<string | undefined>>,\n visited: Set<string>,\n): Promise<void> {\n const absolutePath = resolve(filePath);\n\n if (visited.has(absolutePath)) {\n return;\n }\n\n visited.add(absolutePath);\n\n let pending = sourceCache.get(absolutePath);\n\n if (!pending) {\n pending = readFile(absolutePath, \"utf8\").catch(() => undefined);\n sourceCache.set(absolutePath, pending);\n }\n\n const source = await pending;\n\n if (!source) {\n return;\n }\n\n scanClasses(source, classes);\n\n for (const specifier of extractImportSpecifiers(source)) {\n const resolved = resolveImportSpecifier(\n specifier,\n absolutePath,\n projectRoot,\n );\n\n if (resolved && !visited.has(resolved)) {\n await scanSourceFile(\n resolved,\n classes,\n projectRoot,\n sourceCache,\n visited,\n );\n }\n }\n}\n\nconst SOURCE_EXTENSIONS = [\n \".tsx\",\n \".ts\",\n \".jsx\",\n \".js\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n \".mdx\",\n];\n\nfunction findSourceFile(basePath: string): string | null {\n if (isStyleFile(basePath)) {\n return null;\n }\n\n if (extname(basePath) && existsSync(basePath)) {\n return basePath;\n }\n\n for (const extension of SOURCE_EXTENSIONS) {\n const candidate = `${basePath}${extension}`;\n\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n for (const extension of SOURCE_EXTENSIONS) {\n const candidate = resolve(basePath, `index${extension}`);\n\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction extractImportSpecifiers(source: string): string[] {\n const specifiers = new Set<string>();\n const patterns = [\n /(?:import|export)\\s+(?:type\\s+)?(?:[^'\"]*?\\s+from\\s+)?['\"]([^'\"]+)['\"]/g,\n /import\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n ];\n\n for (const pattern of patterns) {\n for (const match of source.matchAll(pattern)) {\n const specifier = match[1];\n\n if (specifier) {\n specifiers.add(specifier);\n }\n }\n }\n\n return [...specifiers];\n}\n\nfunction resolveImportSpecifier(\n specifier: string,\n fromFile: string,\n projectRoot: string,\n): string | null {\n let basePath: string;\n\n if (specifier.startsWith(\"@/\")) {\n basePath = resolve(projectRoot, specifier.slice(2));\n } else if (specifier.startsWith(\"./\") || specifier.startsWith(\"../\")) {\n basePath = resolve(dirname(fromFile), specifier);\n } else {\n return null;\n }\n\n if (isStyleFile(basePath)) {\n return null;\n }\n\n return findSourceFile(basePath);\n}\n\nasync function collectEntryClasses(\n compilation: Compilation,\n entry: Entrypoint,\n sourceCache: Map<string, Promise<string | undefined>>,\n): Promise<Set<string>> {\n const classes = new Set<string>();\n const visitedModules = new Set<Module>();\n\n for (const chunk of entry.chunks) {\n for (const module of compilation.chunkGraph.getChunkModulesIterable(\n chunk,\n )) {\n await scanModule(module, classes, sourceCache, visitedModules);\n }\n }\n\n return classes;\n}\n\nasync function scanModule(\n module: Module,\n classes: Set<string>,\n sourceCache: Map<string, Promise<string | undefined>>,\n visited: Set<Module>,\n): Promise<void> {\n if (visited.has(module)) {\n return;\n }\n\n visited.add(module);\n\n const nested = (module as Module & { modules?: Iterable<Module> }).modules;\n\n if (nested) {\n for (const child of nested) {\n await scanModule(child, classes, sourceCache, visited);\n }\n }\n\n const resource = (module as Module & { resource?: unknown }).resource;\n\n if (typeof resource !== \"string\" || isStyleFile(resource)) {\n return;\n }\n\n const source = readModuleSource(module);\n\n if (source) {\n scanClasses(source, classes);\n return;\n }\n\n if (!isScannableSource(resource)) {\n return;\n }\n\n const filePath = resource.split(\"?\")[0] ?? resource;\n\n if (!filePath) {\n return;\n }\n\n let pending = sourceCache.get(filePath);\n\n if (!pending) {\n pending = readFile(filePath, \"utf8\").catch(() => undefined);\n sourceCache.set(filePath, pending);\n }\n\n const fresh = await pending;\n\n if (fresh) {\n scanClasses(fresh, classes);\n }\n}\n\nfunction readModuleSource(module: Module): string | undefined {\n try {\n const source = module.originalSource();\n\n if (!source) {\n return undefined;\n }\n\n return sourceToString(source.source());\n } catch {\n return undefined;\n }\n}\n\nfunction collectEntryJsFiles(entry: Entrypoint): Set<string> {\n const files = new Set<string>();\n\n for (const file of entry.getFiles()) {\n if (file.endsWith(\".js\")) {\n files.add(file);\n }\n }\n\n return files;\n}\n\nfunction collectEntryCssFiles(entry: Entrypoint): Set<string> {\n const cssFiles = new Set<string>();\n\n for (const file of entry.getFiles()) {\n if (file.endsWith(\".css\")) {\n cssFiles.add(file);\n }\n }\n\n for (const chunk of entry.chunks) {\n for (const file of chunk.files) {\n if (file.endsWith(\".css\")) {\n cssFiles.add(file);\n }\n }\n\n for (const file of chunk.auxiliaryFiles) {\n if (file.endsWith(\".css\")) {\n cssFiles.add(file);\n }\n }\n }\n\n return cssFiles;\n}\n\nfunction entryName(entry: Entrypoint): string | undefined {\n if (entry.name) {\n return entry.name;\n }\n\n const chunk = entry.getEntrypointChunk();\n return chunk.name ?? undefined;\n}\n\nfunction isPageEntry(name: string): boolean {\n const normalized = normalizeSlashes(name);\n\n if (normalized.startsWith(\"app/\")) {\n const path = normalized.slice(4);\n return path === \"page\" || path.endsWith(\"/page\");\n }\n\n if (normalized.startsWith(\"pages/\")) {\n const path = normalized.slice(6);\n return (\n path.length > 0 &&\n !path.split(\"/\").some((segment) => segment.startsWith(\"_\"))\n );\n }\n\n return false;\n}\n\nfunction isSharedEntry(name: string): boolean {\n const normalized = normalizeSlashes(name);\n\n return (\n (normalized.startsWith(\"app/\") &&\n (normalized === \"app/layout\" || normalized.endsWith(\"/layout\"))) ||\n normalized === \"pages/_app\" ||\n normalized === \"pages/_document\"\n );\n}\n\nfunction isInternalEntry(name: string): boolean {\n const normalized = normalizeSlashes(name);\n const base = normalized.split(\"/\").pop() ?? normalized;\n\n return (\n base === \"main\" ||\n base === \"main-app\" ||\n base === \"polyfills\" ||\n base === \"webpack\" ||\n base === \"app-pages-internals\" ||\n base === \"middleware\" ||\n base === \"instrumentation\"\n );\n}\n\nfunction routeNameForEntry(name: string): string | null {\n const normalized = normalizeSlashes(name).replace(/^\\.\\//, \"\");\n\n if (normalized.startsWith(\"app/\")) {\n let path = normalized.slice(4);\n\n if (path === \"page\") {\n return \"/\";\n }\n\n if (path.endsWith(\"/page\")) {\n path = path.slice(0, -\"/page\".length);\n }\n\n if (!path || path.endsWith(\"layout\")) {\n return null;\n }\n\n return `/${path}`;\n }\n\n if (normalized.startsWith(\"pages/\")) {\n let path = normalized.slice(6);\n\n if (!path || path.startsWith(\"_\")) {\n return null;\n }\n\n path = path.replace(/\\/?index$/, \"\");\n return path.length > 0 ? `/${path}` : \"/\";\n }\n\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeSlashes(value: string): string {\n return value.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nfunction isStyleFile(resource: string): boolean {\n return /\\.(css|scss|sass|less|styl|stylus)(\\?|$)/i.test(resource);\n}\n\nfunction isScannableSource(resource: string): boolean {\n return /\\.(js|jsx|ts|tsx|mjs|cjs|mts|cts|html?|vue|svelte|mdx)(\\?|$)/i.test(\n resource,\n );\n}\n\nfunction scanClasses(source: string, classes: Set<string>): void {\n const patterns = [\n /(?:class|className)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|`([^`]*)`)/g,\n /(?:^|[,{;\\s])(?:class|className)\\s*:\\s*(?:\"([^\"]*)\"|'([^']*)'|`([^`]*)`)/g,\n /classList\\.(?:add|remove|toggle|contains)\\(\\s*(?:\"([^\"]*)\"|'([^']*)'|`([^`]*)`)/g,\n ];\n\n for (const pattern of patterns) {\n for (const match of source.matchAll(pattern)) {\n const value = match[1] ?? match[2] ?? match[3];\n\n if (!value) {\n continue;\n }\n\n for (const token of value.split(/\\s+/)) {\n if (/^-?[_a-zA-Z][\\w-]*$/.test(token)) {\n classes.add(token.toLowerCase());\n }\n }\n }\n }\n}\n\nfunction addCssOwner(\n pagesByCss: Map<string, Set<string>>,\n cssFile: string,\n page: string,\n): void {\n const owners = pagesByCss.get(cssFile) ?? new Set<string>();\n owners.add(page);\n pagesByCss.set(cssFile, owners);\n}\n\nfunction collectSyntaxWarnings(\n analysis: JsCssAnalysisResult,\n): CssAssetWarning[] {\n return analysis.warnings.map((warning) => ({\n kind: \"syntax\",\n message: warning.message,\n ...(warning.location\n ? {\n line: warning.location.line,\n column: warning.location.column,\n }\n : {}),\n }));\n}\n\nfunction sourceToString(source: string | Buffer | Uint8Array): string {\n return typeof source === \"string\"\n ? source\n : Buffer.from(source).toString(\"utf8\");\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1_024) {\n return `${bytes} B`;\n }\n\n if (bytes < 1_024 * 1_024) {\n return `${(bytes / 1_024).toFixed(1)} KB`;\n }\n\n return `${(bytes / (1_024 * 1_024)).toFixed(1)} MB`;\n}\n\nfunction roundMs(value: number): number {\n return Math.round(value * 1_000) / 1_000;\n}\n\nfunction describeError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import picocolors from \"picocolors\";\n\nimport type {\n CssAssetDiagnostic,\n CssAssetWarning,\n CssDoctorNextDiagnostics,\n} from \"./types\";\n\nconst MATRIX_SELECTOR_MAX = 36;\n\n/** Options for terminal rendering. Defaults to picocolors' TTY detection. */\nexport type ReporterOptions = {\n color?: boolean;\n};\n\n/** Formats diagnostics as a human-readable build report. */\nexport function formatDiagnostics(\n diagnostics: CssDoctorNextDiagnostics,\n options: ReporterOptions = {},\n): string {\n const colors = picocolors.createColors(\n options.color ?? picocolors.isColorSupported,\n );\n const badge = colors.bgCyan(colors.black(\"[css-doctor]\"));\n const lines: string[] = [];\n\n lines.push(\n `${badge} Next.js ${diagnostics.pages.length} page${\n diagnostics.pages.length === 1 ? \"\" : \"s\"\n } ${colors.dim(\"·\")} ${diagnostics.analyzedCssAssets}/${\n diagnostics.totalCssAssets\n } CSS assets ${colors.dim(\"·\")} ${formatBytes(\n diagnostics.totalSizeBeforeBytes,\n )} → ${formatBytes(diagnostics.totalSizeAfterBytes)} common ` +\n `${colors.dim(\"·\")} ${formatDuration(diagnostics.durationMs)}` +\n ` ${colors.dim(\"·\")} ${\n diagnostics.minify\n ? colors.green(\"Minified: YES\")\n : colors.yellow(\"Minified: NO\")\n }`,\n );\n\n for (const file of diagnostics.files) {\n lines.push(...formatFile(file, colors));\n }\n\n if (diagnostics.splitApplied) {\n lines.push(\"\");\n lines.push(...formatMatrix(diagnostics, colors));\n }\n\n if (diagnostics.emittedPageChunks.length > 0) {\n lines.push(\"\");\n lines.push(\n ` ${colors.bold(\"Emitted page chunks\")} ${colors.dim(\n `(${diagnostics.emittedPageChunks.length})`,\n )}`,\n );\n\n for (const chunk of diagnostics.emittedPageChunks) {\n lines.push(\n ` ${colors.magenta(chunk.fileName)} ${colors.dim(\n formatBytes(chunk.sizeBytes),\n )}`,\n );\n }\n }\n\n if (diagnostics.sizeBudget.enabled) {\n lines.push(\"\");\n lines.push(...formatSizeBudget(diagnostics, colors));\n }\n\n if (diagnostics.deadCodeCount > 0) {\n lines.push(\"\");\n lines.push(\n ` ${colors.yellow(\"⚠\")} ${colors.bold(\"Dead code eliminated:\")} ` +\n `${diagnostics.deadCodeCount} selector occurrence${\n diagnostics.deadCodeCount === 1 ? \"\" : \"s\"\n }`,\n );\n }\n\n if (diagnostics.errors.length > 0) {\n lines.push(\"\");\n lines.push(` ${colors.red(colors.bold(\"Errors\"))}`);\n\n for (const error of diagnostics.errors) {\n lines.push(` ${colors.red(\"✖\")} ${error}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/** Prints diagnostics to stdout. */\nexport function printDiagnostics(diagnostics: CssDoctorNextDiagnostics): void {\n console.log(formatDiagnostics(diagnostics));\n}\n\nfunction formatFile(\n file: CssAssetDiagnostic,\n colors: ReturnType<typeof picocolors.createColors>,\n): string[] {\n const failed = file.error !== undefined;\n const hasWarnings = file.warnings.length > 0;\n const icon = failed\n ? colors.red(\"✖\")\n : hasWarnings\n ? colors.yellow(\"⚠\")\n : colors.green(\"✓\");\n\n const size = `${formatBytes(file.sizeBeforeBytes)} → ${formatBytes(\n file.sizeAfterBytes,\n )}`;\n const selectors = failed ? \"\" : ` · ${file.selectorCount} selectors`;\n const pages =\n file.associatedPages.length > 0\n ? ` · pages: ${file.associatedPages.join(\", \")}`\n : \"\";\n\n const lines = [\n ` ${icon} ${colors.bold(file.fileName)} ${colors.dim(size)}${selectors}${colors.dim(pages)}`,\n ];\n\n if (file.error) {\n lines.push(` ${colors.red(file.error)}`);\n return lines;\n }\n\n if (file.split) {\n lines.push(\n ` ${colors.dim(\"split\")} common ${formatBytes(\n file.split.commonSizeBytes,\n )} ${colors.dim(\"·\")} page-specific ${formatBytes(\n file.split.pageSpecificSizeBytes,\n )} ${colors.dim(\"·\")} dead ${file.split.deadCodeCount}`,\n );\n }\n\n for (const warning of file.warnings) {\n lines.push(` ${formatWarning(warning, colors)}`);\n }\n\n return lines;\n}\n\nfunction formatMatrix(\n diagnostics: CssDoctorNextDiagnostics,\n colors: ReturnType<typeof picocolors.createColors>,\n): string[] {\n const pageTotal = diagnostics.pages.length;\n const rows = diagnostics.usageMatrix;\n const header = [\n \"Selector\".padEnd(MATRIX_SELECTOR_MAX),\n \"Total Used\".padStart(10),\n \"Page Usage\".padStart(10),\n \"Coverage %\".padStart(10),\n \"Assigned Chunk\",\n ].join(\" \");\n\n const lines = [\n ` ${colors.bold(\"Usage Matrix\")} ${colors.dim(\n `(${rows.length} selectors · ${pageTotal} pages)`,\n )}`,\n ` ${colors.dim(header)}`,\n ];\n\n for (const row of rows) {\n const selector = truncate(row.selector, MATRIX_SELECTOR_MAX).padEnd(\n MATRIX_SELECTOR_MAX,\n );\n const totalUsed = String(row.totalOccurrences).padStart(10);\n const pageUsage = `${row.pageCount}/${pageTotal}`.padStart(10);\n const coverage = `${(row.coverageRatio * 100).toFixed(1)}%`.padStart(10);\n const chunk = formatChunk(row.targetChunk, colors);\n\n lines.push(\n ` ${colors.cyan(selector)} ${totalUsed} ${pageUsage} ${colorCoverage(\n coverage,\n row.coverageRatio,\n diagnostics.minPageRatio,\n colors,\n )} ${chunk}`,\n );\n }\n\n return lines;\n}\n\nfunction formatSizeBudget(\n diagnostics: CssDoctorNextDiagnostics,\n colors: ReturnType<typeof picocolors.createColors>,\n): string[] {\n const budget = diagnostics.sizeBudget;\n const lines = [\n ` ${colors.bold(\"Size budget\")} ${colors.dim(\n `(max ${formatBytes(budget.maxChunkSize)} · variables ${\n budget.isolateVariables ? \"isolated\" : \"inline\"\n })`,\n )}`,\n ];\n const chunks = diagnostics.emittedCssChunks;\n\n if (chunks.length === 0) {\n lines.push(` ${colors.dim(\"No CSS chunks were emitted.\")}`);\n return lines;\n }\n\n for (const chunk of chunks) {\n const markers: string[] = [];\n\n if (chunk.variables) {\n markers.push(\"vars\");\n }\n\n if (chunk.part !== undefined) {\n markers.push(`part ${chunk.part}`);\n }\n\n if (chunk.embedded) {\n markers.push(\"embedded\");\n }\n\n if (chunk.splitDueToSize) {\n markers.push(colors.yellow(\"split\"));\n }\n\n if (chunk.oversized) {\n markers.push(colors.red(\"oversized\"));\n }\n\n lines.push(\n ` ${colors.magenta(chunk.fileName)} ${colors.dim(\n formatBytes(chunk.sizeBytes),\n )}${markers.length > 0 ? ` ${colors.dim(\"·\")} ${markers.join(\" · \")}` : \"\"}`,\n );\n }\n\n if (budget.splitChunks === 0) {\n lines.push(\n ` ${colors.dim(\"No chunk exceeded the configured size budget.\")}`,\n );\n }\n\n return lines;\n}\n\nfunction formatWarning(\n warning: CssAssetWarning,\n colors: ReturnType<typeof picocolors.createColors>,\n): string {\n const location =\n warning.line !== undefined\n ? colors.dim(\n `${warning.line}${\n warning.column !== undefined ? `:${warning.column}` : \"\"\n } `,\n )\n : \"\";\n\n return `${colors.yellow(\"!\")} ${location}${warning.message}`;\n}\n\nfunction colorCoverage(\n coverage: string,\n ratio: number,\n minPageRatio: number,\n colors: ReturnType<typeof picocolors.createColors>,\n): string {\n if (ratio === 0) {\n return colors.red(coverage);\n }\n\n return ratio >= minPageRatio\n ? colors.green(coverage)\n : colors.yellow(coverage);\n}\n\nfunction formatChunk(\n chunk: string,\n colors: ReturnType<typeof picocolors.createColors>,\n): string {\n if (chunk === \"common\") {\n return colors.cyan(chunk);\n }\n\n if (chunk === \"dead\") {\n return colors.red(chunk);\n }\n\n return colors.magenta(chunk);\n}\n\nfunction truncate(value: string, maxLength: number): string {\n return value.length <= maxLength\n ? value\n : `${value.slice(0, maxLength - 1)}…`;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1_024) {\n return `${bytes} B`;\n }\n\n if (bytes < 1_024 * 1_024) {\n return `${(bytes / 1_024).toFixed(1)} KB`;\n }\n\n return `${(bytes / (1_024 * 1_024)).toFixed(1)} MB`;\n}\n\nfunction formatDuration(milliseconds: number): string {\n if (!Number.isFinite(milliseconds)) {\n return \"—\";\n }\n\n return milliseconds < 1\n ? `${milliseconds.toFixed(2)} ms`\n : `${milliseconds.toFixed(1)} ms`;\n}\n"],"mappings":"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","names":["import_node_fs","import_node_path","picocolors","module","formatBytes","entryName","isRecord"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/webpack-plugin.ts","../src/reporter.ts"],"sourcesContent":["import type { NextConfig } from \"next\";\n\nimport { findCssDoctorConfig, loadCssDoctorConfig } from \"./config\";\nimport type {\n CssAssetDiagnostic,\n CssAssetSplitInfo,\n CssAssetWarning,\n CssAssetWarningKind,\n CssDoctorNextDiagnostics,\n CssDoctorNextOptions,\n CssDoctorWebpackPluginOptions,\n EmittedCssChunk,\n EmittedPageChunk,\n PageCoverageOptions,\n SizeBudgetDiagnostics,\n SizeBudgetOptions,\n} from \"./types\";\nimport { CssDoctorWebpackPlugin } from \"./webpack-plugin\";\n\ntype WebpackContextLike = {\n dev?: boolean;\n isServer?: boolean;\n};\n\ntype WebpackConfigLike = {\n plugins?: unknown[];\n [key: string]: unknown;\n};\n\n/**\n * Wraps a Next.js config and adds the css-doctor webpack plugin to the client\n * production compilation.\n *\n * The user's existing `webpack` callback is preserved and may return either a\n * config object or a promise. No plugin is added for dev or server builds.\n */\nexport function withCssDoctor(\n nextConfig: NextConfig = {},\n options: CssDoctorNextOptions = {},\n): NextConfig {\n const pluginOptions = resolvePluginOptions(options);\n const originalWebpack = nextConfig.webpack;\n\n const webpack: NonNullable<NextConfig[\"webpack\"]> = (config, context) => {\n const result = originalWebpack ? originalWebpack(config, context) : config;\n\n if (isPromiseLike(result)) {\n return result.then((resolvedConfig: unknown) =>\n enableCssDoctor(resolvedConfig, context, pluginOptions),\n );\n }\n\n return enableCssDoctor(result, context, pluginOptions);\n };\n\n return {\n ...nextConfig,\n webpack,\n };\n}\n\nfunction enableCssDoctor(\n config: unknown,\n context: WebpackContextLike,\n options: CssDoctorWebpackPluginOptions,\n): unknown {\n if (!isRecord(config)) {\n return config;\n }\n\n if (context.dev === true || context.isServer === true) {\n return config;\n }\n\n const webpackConfig = config as WebpackConfigLike;\n const plugins = Array.isArray(webpackConfig.plugins)\n ? [...webpackConfig.plugins]\n : [];\n\n const alreadyInstalled = plugins.some(\n (plugin) => plugin instanceof CssDoctorWebpackPlugin,\n );\n\n if (!alreadyInstalled) {\n plugins.push(new CssDoctorWebpackPlugin(options));\n }\n\n webpackConfig.plugins = plugins;\n\n if (options.minify === false) {\n disableNextCssMinifier(webpackConfig);\n }\n\n return webpackConfig;\n}\n\nfunction disableNextCssMinifier(config: WebpackConfigLike): void {\n const optimization = config.optimization as\n | { minimizer?: unknown[] }\n | undefined;\n\n if (!optimization || !Array.isArray(optimization.minimizer)) {\n return;\n }\n\n optimization.minimizer = optimization.minimizer.filter((plugin) => {\n const source =\n typeof plugin === \"function\"\n ? Function.prototype.toString.call(plugin)\n : String(plugin);\n\n return (\n !source.includes(\"CssMinimizerPlugin\") &&\n !source.includes(\"css-minimizer-plugin\")\n );\n });\n}\n\nfunction resolvePluginOptions(\n options: CssDoctorNextOptions,\n): CssDoctorWebpackPluginOptions {\n const { configFile, ...inlineOptions } = options;\n const hasInlineOptions = Object.keys(inlineOptions).length > 0;\n\n let loadedOptions: CssDoctorNextOptions = {};\n let configError: string | undefined;\n\n if (configFile) {\n const loaded = loadCssDoctorConfig({ configFile });\n loadedOptions = loaded.options;\n configError = loaded.error;\n } else if (!hasInlineOptions) {\n const loaded = loadCssDoctorConfig();\n loadedOptions = loaded.options;\n configError = loaded.error;\n }\n\n if (configError) {\n console.warn(\n `[css-doctor] ${configError}. Continuing with inline/default options.`,\n );\n }\n\n const merged: CssDoctorNextOptions = {\n ...loadedOptions,\n ...inlineOptions,\n };\n const { configFile: _ignored, ...pluginOptions } = merged;\n\n return pluginOptions;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport { findCssDoctorConfig, loadCssDoctorConfig };\nexport type {\n CssAssetDiagnostic,\n CssAssetSplitInfo,\n CssAssetWarning,\n CssAssetWarningKind,\n CssDoctorNextDiagnostics,\n CssDoctorNextOptions,\n CssDoctorWebpackPluginOptions,\n EmittedCssChunk,\n EmittedPageChunk,\n PageCoverageOptions,\n SizeBudgetDiagnostics,\n SizeBudgetOptions,\n};\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { createJiti } from \"jiti\";\n\nimport type { CssDoctorNextOptions } from \"./types\";\n\nconst CONFIG_FILENAMES = [\n \"cssd.config.ts\",\n \"cssd.config.mts\",\n \"cssd.config.js\",\n \"cssd.config.mjs\",\n];\n\n/** Result of attempting to load the central css-doctor config file. */\nexport type LoadedCssDoctorConfig = {\n options: CssDoctorNextOptions;\n file?: string;\n error?: string;\n};\n\n/**\n * Finds `cssd.config.*` starting at `cwd` and walking up to the filesystem\n * root. Returns the absolute path or `null`.\n */\nexport function findCssDoctorConfig(\n cwd: string = process.cwd(),\n): string | null {\n let directory = resolve(cwd);\n\n while (true) {\n for (const filename of CONFIG_FILENAMES) {\n const candidate = resolve(directory, filename);\n\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n const parent = dirname(directory);\n\n if (parent === directory) {\n return null;\n }\n\n directory = parent;\n }\n}\n\n/**\n * Loads `cssd.config.ts|mts|js|mjs` synchronously using jiti.\n *\n * Missing and empty config files fall back to an empty options object. Invalid\n * config files are reported through `error` instead of throwing, so a broken\n * css-doctor config cannot prevent Next.js from starting.\n */\nexport function loadCssDoctorConfig(\n options: { cwd?: string; configFile?: string } = {},\n): LoadedCssDoctorConfig {\n const cwd = resolve(options.cwd ?? process.cwd());\n const file = options.configFile\n ? resolve(cwd, options.configFile)\n : findCssDoctorConfig(cwd);\n\n if (!file) {\n return { options: {} };\n }\n\n if (!existsSync(file)) {\n return { options: {} };\n }\n\n try {\n if (readFileSync(file, \"utf8\").trim().length === 0) {\n return { options: {}, file };\n }\n\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n fsCache: false,\n moduleCache: false,\n });\n const loaded = jiti(file) as unknown;\n return {\n options: normalizeConfig(loaded),\n file,\n };\n } catch (error) {\n return {\n options: {},\n file,\n error:\n `failed to load ${file}: ` +\n (error instanceof Error ? error.message : String(error)),\n };\n }\n}\n\nfunction normalizeConfig(value: unknown): CssDoctorNextOptions {\n let candidate = value;\n\n if (isRecord(candidate) && \"default\" in candidate) {\n candidate = candidate.default;\n }\n\n if (isRecord(candidate) && \"cssDoctor\" in candidate) {\n candidate = candidate.cssDoctor;\n }\n\n return isRecord(candidate) ? (candidate as CssDoctorNextOptions) : {};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, extname, posix, resolve } from \"node:path\";\nimport { performance } from \"node:perf_hooks\";\n\nimport { analyzeCss, optimizeCss } from \"@zealakit/css-doctor-binding\";\nimport type {\n JsChunkOutput,\n JsCssAnalysisResult,\n JsSelectorStat,\n} from \"@zealakit/css-doctor-binding\";\nimport type { Compilation, Compiler, Entrypoint, Module } from \"webpack\";\n\nimport { printDiagnostics } from \"./reporter\";\nimport type {\n CssAssetDiagnostic,\n CssAssetWarning,\n CssDoctorNextDiagnostics,\n CssDoctorWebpackPluginOptions,\n EmittedCssChunk,\n PageCoverageOptions,\n SizeBudgetOptions,\n} from \"./types\";\n\nconst PLUGIN_NAME = \"CssDoctorWebpackPlugin\";\nconst DEFAULT_MIN_PAGE_RATIO = 0.5;\nconst DEFAULT_MAX_CHUNK_SIZE = 60 * 1_024;\nconst LARGE_CSS_ASSET_BYTES = 500 * 1_024;\n\ntype PageInfo = {\n name: string;\n classes: Set<string>;\n cssFiles: Set<string>;\n jsFiles: Set<string>;\n};\n\ntype PageEntry = {\n entry: Entrypoint;\n name: string;\n sourceName: string;\n};\n\ntype CollectedPages = {\n pages: PageInfo[];\n pagesByCss: Map<string, Set<string>>;\n};\n\n/**\n * Webpack compiler plugin that splits emitted client CSS by page coverage and\n * removes selectors no route uses.\n *\n * All work happens inside `processAssets` at the optimize stage. Failures are\n * logged through the compilation logger and never abort the Next.js build.\n */\nexport class CssDoctorWebpackPlugin {\n private readonly options: CssDoctorWebpackPluginOptions;\n private readonly pageCoverage: Required<PageCoverageOptions> & {\n forceCommon: string[];\n };\n private readonly sizeBudget: Required<SizeBudgetOptions>;\n private readonly minify: boolean;\n private readonly include: Array<string | RegExp>;\n private readonly exclude: Array<string | RegExp>;\n private readonly configurationErrors: string[] = [];\n\n constructor(options: CssDoctorWebpackPluginOptions = {}) {\n this.options = options;\n const ratio =\n options.pageCoverage?.minPageRatio ??\n options.minPageRatio ??\n DEFAULT_MIN_PAGE_RATIO;\n const maxChunkSize =\n options.sizeBudget?.maxChunkSize ?? DEFAULT_MAX_CHUNK_SIZE;\n\n this.pageCoverage = {\n enabled: options.pageCoverage?.enabled ?? true,\n minPageRatio:\n Number.isFinite(ratio) && ratio >= 0 && ratio <= 1\n ? ratio\n : DEFAULT_MIN_PAGE_RATIO,\n forceCommon:\n options.pageCoverage?.forceCommon ?? options.forceCommonSelectors ?? [],\n };\n\n if (!Number.isFinite(ratio) || ratio < 0 || ratio > 1) {\n this.configurationErrors.push(\n \"minPageRatio must be a number between 0 and 1; using 0.5\",\n );\n }\n\n this.sizeBudget = {\n enabled: options.sizeBudget?.enabled ?? true,\n maxChunkSize:\n Number.isInteger(maxChunkSize) && maxChunkSize > 0\n ? maxChunkSize\n : DEFAULT_MAX_CHUNK_SIZE,\n isolateVariables: options.sizeBudget?.isolateVariables ?? true,\n };\n\n if (\n options.sizeBudget?.enabled !== false &&\n (!Number.isInteger(maxChunkSize) || maxChunkSize <= 0)\n ) {\n this.configurationErrors.push(\n \"maxChunkSize must be a positive integer; using 61440\",\n );\n }\n\n this.minify = options.minify ?? true;\n this.include = options.include ?? [];\n this.exclude = options.exclude ?? [];\n }\n\n apply(compiler: Compiler): void {\n compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {\n compilation.hooks.processAssets.tapPromise(\n {\n name: PLUGIN_NAME,\n stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE,\n },\n async () => {\n try {\n await this.process(compiler, compilation);\n } catch (error) {\n compilation\n .getLogger(PLUGIN_NAME)\n .warn(\n `[css-doctor] diagnostics failed without interrupting the build: ${describeError(\n error,\n )}`,\n );\n }\n },\n );\n });\n }\n\n private async process(\n compiler: Compiler,\n compilation: Compilation,\n ): Promise<void> {\n const startedAt = performance.now();\n const logger = compilation.getLogger(PLUGIN_NAME);\n const pagesResult = await collectPages(compilation, this.options.pageUsage);\n const pageNames = pagesResult.pages.map((page) => page.name);\n const pageByName = new Map(\n pagesResult.pages.map((page) => [page.name, page]),\n );\n const allPages = new Set(pageNames);\n const pageUsage: Record<string, string[]> = {};\n const pageUsageCounts: Record<string, number> = {};\n\n for (const page of pagesResult.pages) {\n const classes = [...page.classes].sort();\n pageUsage[page.name] = classes;\n pageUsageCounts[page.name] = classes.length;\n }\n\n const hasPageClasses = pagesResult.pages.some(\n (page) => page.classes.size > 0,\n );\n const pageCoverageApplied = this.pageCoverage.enabled && hasPageClasses;\n const diagnostics: CssDoctorNextDiagnostics = {\n plugin: \"css-doctor-next\",\n generatedAt: new Date().toISOString(),\n durationMs: 0,\n minPageRatio: this.pageCoverage.minPageRatio,\n minify: this.minify,\n pageCoverage: {\n enabled: this.pageCoverage.enabled,\n minPageRatio: this.pageCoverage.minPageRatio,\n },\n sizeBudget: {\n enabled: this.sizeBudget.enabled,\n maxChunkSize: this.sizeBudget.maxChunkSize,\n isolateVariables: this.sizeBudget.isolateVariables,\n splitChunks: 0,\n oversizedChunks: 0,\n },\n pages: pageNames,\n pageUsage: pageUsageCounts,\n splitApplied: pageCoverageApplied,\n totalCssAssets: 0,\n analyzedCssAssets: 0,\n failedCssAssets: 0,\n skippedCssAssets: 0,\n totalSizeBeforeBytes: 0,\n totalSizeAfterBytes: 0,\n totalSelectors: 0,\n totalRules: 0,\n commonCssBytes: 0,\n pageSpecificCssBytes: 0,\n emittedPageChunks: [],\n emittedCssChunks: [],\n usageMatrix: [],\n deadCodeCount: 0,\n files: [],\n errors: [],\n };\n\n diagnostics.errors.push(...this.configurationErrors);\n\n const matrix = new Map<string, JsSelectorStat>();\n const pageFiles = new Map<string, string[]>();\n const usedAssetNames = new Set(\n compilation.getAssets().map((asset) => asset.name),\n );\n const RawSource = compiler.webpack.sources.RawSource;\n\n const emitCssChunk = (chunk: JsChunkOutput): string => {\n const hash = createHash(\"sha256\")\n .update(chunk.css)\n .digest(\"hex\")\n .slice(0, 8);\n const safeName =\n chunk.name\n .replace(/[^a-zA-Z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase() || \"chunk\";\n let fileName = `static/css/${safeName}.${hash}.css`;\n let index = 2;\n\n while (usedAssetNames.has(fileName)) {\n fileName = `static/css/${safeName}.${hash}-${index}.css`;\n index += 1;\n }\n\n compilation.emitAsset(fileName, new RawSource(chunk.css));\n usedAssetNames.add(fileName);\n return fileName;\n };\n\n for (const asset of compilation.getAssets()) {\n if (!asset.name.endsWith(\".css\")) {\n continue;\n }\n\n diagnostics.totalCssAssets += 1;\n\n if (\n this.shouldSkipAsset(\n compilation,\n asset.name,\n sourceToString(asset.source.source()),\n )\n ) {\n diagnostics.skippedCssAssets += 1;\n continue;\n }\n\n const associatedPages = [\n ...(pagesResult.pagesByCss.get(asset.name) ?? allPages),\n ].sort();\n const file = analyzeAsset(asset.name, asset.source.source());\n file.associatedPages = associatedPages;\n\n if (file.error) {\n diagnostics.failedCssAssets += 1;\n diagnostics.errors.push(`${asset.name}: ${file.error}`);\n diagnostics.files.push(file);\n logger.warn(`[css-doctor] ${asset.name}: ${file.error}`);\n continue;\n }\n\n const originalCss = sourceToString(asset.source.source());\n\n try {\n const pipeline = optimizeCss({\n cssContent: originalCss,\n pageUsage,\n pageCoverage: {\n enabled: pageCoverageApplied,\n minPageRatio: this.pageCoverage.minPageRatio,\n forceCommon: this.pageCoverage.forceCommon,\n },\n sizeBudget: {\n enabled: this.sizeBudget.enabled,\n maxChunkSize: this.sizeBudget.maxChunkSize,\n isolateVariables: this.sizeBudget.isolateVariables,\n },\n minify: this.minify,\n });\n\n const commonChunks = pipeline.chunks.filter(\n (chunk) => chunk.page === undefined && chunk.sourceChunk === \"common\",\n );\n const pageChunks = pipeline.chunks.filter(\n (chunk) => chunk.page !== undefined,\n );\n const commonWasSplit =\n commonChunks.length > 1 ||\n commonChunks.some((chunk) => chunk.splitDueToSize);\n const embeddedCommon = commonWasSplit ? undefined : commonChunks[0];\n\n const commonFileNames: string[] = [];\n let commonSizeBytes = 0;\n\n for (const chunk of commonChunks) {\n const embedded = chunk === embeddedCommon;\n const fileName = embedded ? asset.name : emitCssChunk(chunk);\n commonSizeBytes += chunk.sizeBytes;\n commonFileNames.push(fileName);\n\n diagnostics.emittedCssChunks.push({\n fileName,\n sourceChunk: chunk.sourceChunk,\n kind: chunk.kind as EmittedCssChunk[\"kind\"],\n page: chunk.page,\n variables: chunk.variables,\n part: chunk.part,\n sizeBytes: chunk.sizeBytes,\n oversized: chunk.oversized,\n splitDueToSize: chunk.splitDueToSize,\n embedded,\n });\n\n if (chunk.splitDueToSize) {\n diagnostics.sizeBudget.splitChunks += 1;\n }\n\n if (chunk.oversized) {\n diagnostics.sizeBudget.oversizedChunks += 1;\n }\n }\n\n if (commonWasSplit) {\n const imports = commonFileNames\n .map((fileName) => {\n const relativePath = posix.relative(\n posix.dirname(asset.name),\n fileName,\n );\n return `@import \"./${relativePath}\";`;\n })\n .join(\"\\n\");\n compilation.updateAsset(asset.name, new RawSource(imports));\n } else {\n compilation.updateAsset(\n asset.name,\n new RawSource(embeddedCommon?.css ?? \"\"),\n );\n }\n\n let pageSpecificSizeBytes = 0;\n\n for (const chunk of pageChunks) {\n const page = chunk.page;\n\n if (!page) {\n continue;\n }\n\n const fileName = emitCssChunk(chunk);\n pageSpecificSizeBytes += chunk.sizeBytes;\n const files = pageFiles.get(page) ?? [];\n files.push(fileName);\n pageFiles.set(page, files);\n\n diagnostics.emittedPageChunks.push({\n page,\n fileName,\n sizeBytes: chunk.sizeBytes,\n });\n diagnostics.emittedCssChunks.push({\n fileName,\n sourceChunk: chunk.sourceChunk,\n kind: chunk.kind as EmittedCssChunk[\"kind\"],\n page,\n variables: chunk.variables,\n part: chunk.part,\n sizeBytes: chunk.sizeBytes,\n oversized: chunk.oversized,\n splitDueToSize: chunk.splitDueToSize,\n embedded: false,\n });\n\n if (chunk.splitDueToSize) {\n diagnostics.sizeBudget.splitChunks += 1;\n }\n\n if (chunk.oversized) {\n diagnostics.sizeBudget.oversizedChunks += 1;\n }\n }\n\n file.sizeAfterBytes = commonWasSplit\n ? commonSizeBytes\n : Buffer.byteLength(embeddedCommon?.css ?? \"\", \"utf8\");\n file.split = {\n associatedPages,\n commonSizeBytes,\n pageSpecificSizeBytes,\n deadCodeCount: pipeline.deadCodeCount,\n };\n\n for (const stat of pipeline.stats) {\n const previous = matrix.get(stat.selector);\n\n if (!previous || stat.totalOccurrences > previous.totalOccurrences) {\n matrix.set(stat.selector, stat);\n }\n }\n\n diagnostics.deadCodeCount += pipeline.deadCodeCount;\n diagnostics.commonCssBytes += commonSizeBytes;\n diagnostics.pageSpecificCssBytes += pageSpecificSizeBytes;\n } catch (error) {\n const message = `failed to optimize CSS: ${describeError(error)}`;\n diagnostics.errors.push(`${asset.name}: ${message}`);\n logger.warn(`[css-doctor] ${asset.name}: ${message}`);\n }\n\n diagnostics.analyzedCssAssets += 1;\n diagnostics.totalSizeBeforeBytes += file.sizeBeforeBytes;\n diagnostics.totalSizeAfterBytes += file.sizeAfterBytes;\n diagnostics.totalSelectors += file.selectorCount;\n diagnostics.totalRules += file.ruleCount;\n diagnostics.files.push(file);\n }\n\n if (pageFiles.size > 0) {\n injectPageJsLoaders(compilation, pageFiles, pageByName, RawSource);\n }\n\n diagnostics.usageMatrix = [...matrix.values()].sort((left, right) =>\n left.selector.localeCompare(right.selector),\n );\n diagnostics.durationMs = roundMs(performance.now() - startedAt);\n\n if (this.options.onDiagnostics) {\n try {\n await this.options.onDiagnostics(diagnostics);\n } catch (error) {\n const message = `onDiagnostics callback failed: ${describeError(\n error,\n )}`;\n diagnostics.errors.push(message);\n logger.warn(`[css-doctor] ${message}`);\n }\n }\n\n if (\n this.options.report !== false &&\n (diagnostics.totalCssAssets > 0 || diagnostics.errors.length > 0)\n ) {\n try {\n printDiagnostics(diagnostics);\n } catch (error) {\n logger.warn(`[css-doctor] reporter failed: ${describeError(error)}`);\n }\n }\n }\n\n private shouldSkipAsset(\n compilation: Compilation,\n assetName: string,\n source: string,\n ): boolean {\n if (isCssModuleAsset(compilation, assetName, source)) {\n return true;\n }\n\n if (this.include.length > 0 && !matchesPatterns(assetName, this.include)) {\n return true;\n }\n\n return this.exclude.length > 0 && matchesPatterns(assetName, this.exclude);\n }\n}\n\nfunction injectPageJsLoaders(\n compilation: Compilation,\n cssByPage: Map<string, string[]>,\n pageByName: Map<string, PageInfo>,\n RawSource: new (source: string) => import(\"webpack\").sources.Source,\n): void {\n const publicPath =\n typeof compilation.options.output.publicPath === \"string\" &&\n compilation.options.output.publicPath.length > 0\n ? compilation.options.output.publicPath\n : \"/_next/\";\n const normalizedBase = publicPath.endsWith(\"/\")\n ? publicPath\n : `${publicPath}/`;\n\n for (const [page, files] of cssByPage) {\n const jsFiles = pageByName.get(page)?.jsFiles;\n\n if (!jsFiles || files.length === 0) {\n continue;\n }\n\n const hrefs = files.map((file) => `${normalizedBase}${file}`);\n const snippet = `(()=>{const __cssDoctorPageStyles=${JSON.stringify(hrefs)};if(typeof document!==\"undefined\"){for(const __cssDoctorPageHref of __cssDoctorPageStyles){if(!Array.from(document.querySelectorAll(\"link[data-css-doctor-page]\")).some((link)=>link.dataset.cssDoctorPage===__cssDoctorPageHref)){const __cssDoctorPageLink=document.createElement(\"link\");__cssDoctorPageLink.rel=\"stylesheet\";__cssDoctorPageLink.href=__cssDoctorPageHref;__cssDoctorPageLink.dataset.cssDoctorPage=__cssDoctorPageHref;document.head.append(__cssDoctorPageLink);}}}})();\\n`;\n\n for (const jsFile of jsFiles) {\n const asset = compilation.getAsset(jsFile);\n\n if (!asset) {\n continue;\n }\n\n const source = sourceToString(asset.source.source());\n compilation.updateAsset(jsFile, new RawSource(snippet + source));\n }\n }\n}\n\nfunction matchesPatterns(\n value: string,\n patterns: Array<string | RegExp>,\n): boolean {\n return patterns.some((pattern) =>\n typeof pattern === \"string\" ? value.includes(pattern) : pattern.test(value),\n );\n}\n\nfunction isCssModuleAsset(\n compilation: Compilation,\n assetName: string,\n source: string,\n): boolean {\n if (/\\.module\\.(css|scss|sass|less|styl|stylus)$/i.test(assetName)) {\n return true;\n }\n\n // Next.js emits CSS Modules as content-hashed `static/css/<hash>.css`\n // assets whose original `.module.css` name is no longer in the asset name.\n // Its default local-identifier format is `<file>_<local>__<hash>`.\n if (/\\.[A-Za-z0-9_-]+_[A-Za-z0-9_-]+__[A-Za-z0-9_-]+/.test(source)) {\n return true;\n }\n\n for (const chunk of compilation.chunks) {\n if (!chunk.files.has(assetName) && !chunk.auxiliaryFiles.has(assetName)) {\n continue;\n }\n\n for (const module of compilation.chunkGraph.getChunkModulesIterable(\n chunk,\n )) {\n if (moduleHasCssModule(module)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction moduleHasCssModule(module: Module): boolean {\n const nested = (module as Module & { modules?: Iterable<Module> }).modules;\n\n if (nested) {\n for (const child of nested) {\n if (moduleHasCssModule(child)) {\n return true;\n }\n }\n }\n\n const resource = (module as Module & { resource?: unknown }).resource;\n return (\n typeof resource === \"string\" &&\n /\\.module\\.(css|scss|sass|less|styl|stylus)(\\?|$)/i.test(resource)\n );\n}\n\nfunction analyzeAsset(\n fileName: string,\n source: string | Buffer,\n): CssAssetDiagnostic {\n try {\n const css = sourceToString(source);\n const sizeBeforeBytes = Buffer.byteLength(css, \"utf8\");\n const analysis = analyzeCss(css);\n const warnings = collectSyntaxWarnings(analysis);\n\n if (sizeBeforeBytes >= LARGE_CSS_ASSET_BYTES) {\n warnings.push({\n kind: \"large-asset\",\n message: `CSS asset is larger than ${formatBytes(\n LARGE_CSS_ASSET_BYTES,\n )}; consider route-level code splitting.`,\n });\n }\n\n return {\n fileName,\n sizeBeforeBytes,\n sizeAfterBytes: sizeBeforeBytes,\n selectorCount: analysis.stats.selectorCount,\n ruleCount: analysis.stats.ruleCount,\n associatedPages: [],\n warnings,\n analysis,\n };\n } catch (error) {\n return {\n fileName,\n sizeBeforeBytes: 0,\n sizeAfterBytes: 0,\n selectorCount: 0,\n ruleCount: 0,\n associatedPages: [],\n warnings: [],\n error: describeError(error),\n };\n }\n}\n\nasync function collectPages(\n compilation: Compilation,\n directPageUsage: Record<string, string[]> | undefined,\n): Promise<CollectedPages> {\n const entries = [...compilation.entrypoints.values()];\n const pageEntries: PageEntry[] = [];\n const sharedEntries: Entrypoint[] = [];\n const fallbackEntries: PageEntry[] = [];\n const loaderFallbackEntries: PageEntry[] = [];\n\n for (const entry of entries) {\n const name = entryName(entry);\n\n if (!name) {\n continue;\n }\n\n if (isPageEntry(name)) {\n const route = routeNameForEntry(name) ?? name;\n pageEntries.push({ entry, name: route, sourceName: name });\n } else if (isSharedEntry(name)) {\n sharedEntries.push(entry);\n } else if (!isInternalEntry(name)) {\n fallbackEntries.push({\n entry,\n name: routeNameForEntry(name) ?? name,\n sourceName: name,\n });\n } else {\n // Internal entries (e.g. `main`) are not scanned as pages, but remain a\n // last-resort JS injection target for direct `pageUsage` fixtures.\n loaderFallbackEntries.push({\n entry,\n name: routeNameForEntry(name) ?? name,\n sourceName: name,\n });\n }\n }\n\n const selectedPages = pageEntries.length > 0 ? pageEntries : fallbackEntries;\n const direct = directPageUsage\n ? Object.keys(directPageUsage).length > 0\n : false;\n const pages = new Map<string, PageInfo>();\n const pagesByCss = new Map<string, Set<string>>();\n const projectRoot = compilation.compiler?.context ?? process.cwd();\n\n if (direct && directPageUsage) {\n for (const [rawName, classes] of Object.entries(directPageUsage)) {\n const name = rawName.trim();\n\n if (!name) {\n continue;\n }\n\n pages.set(name, {\n name,\n classes: new Set(classes.map((className) => className.toLowerCase())),\n cssFiles: new Set(),\n jsFiles: new Set(),\n });\n }\n\n attachEntryAssetsToPages(pages, selectedPages);\n\n const orphanPages = [...pages.values()].filter(\n (page) => page.jsFiles.size === 0,\n );\n\n if (orphanPages.length > 0) {\n const loaderEntries =\n selectedPages.length > 0 ? selectedPages : loaderFallbackEntries;\n const fallbackJs = new Set<string>();\n\n for (const { entry } of loaderEntries) {\n for (const jsFile of collectEntryJsFiles(entry)) {\n fallbackJs.add(jsFile);\n }\n }\n\n for (const page of orphanPages) {\n for (const jsFile of fallbackJs) {\n page.jsFiles.add(jsFile);\n }\n }\n }\n } else {\n const sourceCache = new Map<string, Promise<string | undefined>>();\n const sharedClasses = new Set<string>();\n\n for (const entry of sharedEntries) {\n for (const className of await collectEntryClasses(\n compilation,\n entry,\n sourceCache,\n )) {\n sharedClasses.add(className);\n }\n\n const name = entryName(entry);\n\n if (name) {\n for (const className of await collectNameSourceClasses(\n name,\n projectRoot,\n sourceCache,\n )) {\n sharedClasses.add(className);\n }\n }\n }\n\n for (const { entry, name, sourceName } of selectedPages) {\n const page = pages.get(name) ?? {\n name,\n classes: new Set<string>(),\n cssFiles: new Set<string>(),\n jsFiles: collectEntryJsFiles(entry),\n };\n for (const jsFile of collectEntryJsFiles(entry)) {\n page.jsFiles.add(jsFile);\n }\n\n for (const className of sharedClasses) {\n page.classes.add(className);\n }\n\n for (const className of await collectEntryClasses(\n compilation,\n entry,\n sourceCache,\n )) {\n page.classes.add(className);\n }\n\n for (const className of await collectPageSourceClasses(\n sourceName,\n projectRoot,\n sourceCache,\n )) {\n page.classes.add(className);\n }\n\n pages.set(name, page);\n }\n }\n\n const targetPages = [...pages.keys()];\n\n for (const { entry, name } of selectedPages) {\n const cssFiles = collectEntryCssFiles(entry);\n const page = findPageForEntry(pages, name);\n\n if (page) {\n for (const cssFile of cssFiles) {\n page.cssFiles.add(cssFile);\n }\n }\n }\n\n const sharedCssFiles = new Set<string>();\n\n for (const entry of sharedEntries) {\n for (const cssFile of collectEntryCssFiles(entry)) {\n sharedCssFiles.add(cssFile);\n }\n }\n\n for (const page of pages.values()) {\n for (const cssFile of page.cssFiles) {\n addCssOwner(pagesByCss, cssFile, page.name);\n }\n }\n\n for (const cssFile of sharedCssFiles) {\n for (const page of targetPages) {\n addCssOwner(pagesByCss, cssFile, page);\n }\n }\n\n return {\n pages: [...pages.values()],\n pagesByCss,\n };\n}\n\nfunction attachEntryAssetsToPages(\n pages: Map<string, PageInfo>,\n selectedPages: PageEntry[],\n): void {\n for (const { entry, name } of selectedPages) {\n const page = findPageForEntry(pages, name);\n\n if (!page) {\n continue;\n }\n\n for (const jsFile of collectEntryJsFiles(entry)) {\n page.jsFiles.add(jsFile);\n }\n\n for (const cssFile of collectEntryCssFiles(entry)) {\n page.cssFiles.add(cssFile);\n }\n }\n}\n\nfunction findPageForEntry(\n pages: Map<string, PageInfo>,\n entryNameValue: string,\n): PageInfo | undefined {\n const direct = pages.get(entryNameValue);\n\n if (direct) {\n return direct;\n }\n\n const normalized = normalizeSlashes(entryNameValue).replace(/^\\/+/, \"\");\n const bare = normalized.replace(/^\\//, \"\");\n\n return (\n pages.get(normalized) ??\n pages.get(`/${bare}`) ??\n pages.get(bare) ??\n pages.get(bare.replace(/\\//g, \"-\"))\n );\n}\n\nasync function collectPageSourceClasses(\n entryName: string,\n projectRoot: string,\n sourceCache: Map<string, Promise<string | undefined>>,\n): Promise<Set<string>> {\n const classes = new Set<string>();\n const visited = new Set<string>();\n const normalized = normalizeSlashes(entryName);\n const roots = projectSourceRoots(projectRoot);\n const candidates: string[] = [];\n\n if (normalized.startsWith(\"app/\")) {\n const path = normalized.slice(4);\n\n if (path === \"page\" || path.endsWith(\"/page\")) {\n const pagePath = path === \"page\" ? \"app/page\" : `app/${path}`;\n\n for (const root of roots) {\n candidates.push(resolve(root, pagePath));\n }\n\n if (path === \"_not-found/page\") {\n for (const root of roots) {\n candidates.push(resolve(root, \"app/not-found\"));\n }\n }\n\n const directories = path.split(\"/\").slice(0, -1).filter(Boolean);\n const layoutPaths = [\"app\"];\n\n for (let index = 0; index < directories.length; index += 1) {\n layoutPaths.push(`app/${directories.slice(0, index + 1).join(\"/\")}`);\n }\n\n for (const layoutPath of layoutPaths) {\n for (const root of roots) {\n candidates.push(resolve(root, `${layoutPath}/layout`));\n }\n }\n } else {\n for (const root of roots) {\n candidates.push(resolve(root, normalized));\n }\n }\n } else if (normalized.startsWith(\"pages/\")) {\n for (const root of roots) {\n candidates.push(resolve(root, normalized));\n candidates.push(resolve(root, \"pages/_app\"));\n }\n } else {\n for (const root of roots) {\n candidates.push(resolve(root, normalized));\n }\n }\n\n for (const candidate of candidates) {\n const file = findSourceFile(candidate);\n\n if (file) {\n await scanSourceFile(file, classes, projectRoot, sourceCache, visited);\n }\n }\n\n return classes;\n}\n\nasync function collectNameSourceClasses(\n entryName: string,\n projectRoot: string,\n sourceCache: Map<string, Promise<string | undefined>>,\n): Promise<Set<string>> {\n const classes = new Set<string>();\n const visited = new Set<string>();\n const relative = normalizeSlashes(entryName);\n\n for (const root of projectSourceRoots(projectRoot)) {\n const file = findSourceFile(resolve(root, relative));\n\n if (file) {\n await scanSourceFile(file, classes, projectRoot, sourceCache, visited);\n }\n }\n\n return classes;\n}\n\nfunction projectSourceRoots(projectRoot: string): string[] {\n const roots = [projectRoot];\n const srcRoot = resolve(projectRoot, \"src\");\n\n if (srcRoot !== projectRoot && existsSync(srcRoot)) {\n roots.push(srcRoot);\n }\n\n return roots;\n}\n\nasync function scanSourceFile(\n filePath: string,\n classes: Set<string>,\n projectRoot: string,\n sourceCache: Map<string, Promise<string | undefined>>,\n visited: Set<string>,\n): Promise<void> {\n const absolutePath = resolve(filePath);\n\n if (visited.has(absolutePath)) {\n return;\n }\n\n visited.add(absolutePath);\n\n let pending = sourceCache.get(absolutePath);\n\n if (!pending) {\n pending = readFile(absolutePath, \"utf8\").catch(() => undefined);\n sourceCache.set(absolutePath, pending);\n }\n\n const source = await pending;\n\n if (!source) {\n return;\n }\n\n scanClasses(source, classes);\n\n for (const specifier of extractImportSpecifiers(source)) {\n const resolved = resolveImportSpecifier(\n specifier,\n absolutePath,\n projectRoot,\n );\n\n if (resolved && !visited.has(resolved)) {\n await scanSourceFile(\n resolved,\n classes,\n projectRoot,\n sourceCache,\n visited,\n );\n }\n }\n}\n\nconst SOURCE_EXTENSIONS = [\n \".tsx\",\n \".ts\",\n \".jsx\",\n \".js\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n \".mdx\",\n];\n\nfunction findSourceFile(basePath: string): string | null {\n if (isStyleFile(basePath)) {\n return null;\n }\n\n if (extname(basePath) && existsSync(basePath)) {\n return basePath;\n }\n\n for (const extension of SOURCE_EXTENSIONS) {\n const candidate = `${basePath}${extension}`;\n\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n for (const extension of SOURCE_EXTENSIONS) {\n const candidate = resolve(basePath, `index${extension}`);\n\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction extractImportSpecifiers(source: string): string[] {\n const specifiers = new Set<string>();\n const patterns = [\n /(?:import|export)\\s+(?:type\\s+)?(?:[^'\"]*?\\s+from\\s+)?['\"]([^'\"]+)['\"]/g,\n /import\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n ];\n\n for (const pattern of patterns) {\n for (const match of source.matchAll(pattern)) {\n const specifier = match[1];\n\n if (specifier) {\n specifiers.add(specifier);\n }\n }\n }\n\n return [...specifiers];\n}\n\nfunction resolveImportSpecifier(\n specifier: string,\n fromFile: string,\n projectRoot: string,\n): string | null {\n if (specifier.startsWith(\"@/\")) {\n const relative = specifier.slice(2);\n\n for (const root of projectSourceRoots(projectRoot)) {\n const basePath = resolve(root, relative);\n\n if (isStyleFile(basePath)) {\n return null;\n }\n\n const found = findSourceFile(basePath);\n\n if (found) {\n return found;\n }\n }\n\n return null;\n }\n\n if (specifier.startsWith(\"./\") || specifier.startsWith(\"../\")) {\n const basePath = resolve(dirname(fromFile), specifier);\n\n if (isStyleFile(basePath)) {\n return null;\n }\n\n return findSourceFile(basePath);\n }\n\n return null;\n}\n\nasync function collectEntryClasses(\n compilation: Compilation,\n entry: Entrypoint,\n sourceCache: Map<string, Promise<string | undefined>>,\n): Promise<Set<string>> {\n const classes = new Set<string>();\n const visitedModules = new Set<Module>();\n\n for (const chunk of entry.chunks) {\n for (const module of compilation.chunkGraph.getChunkModulesIterable(\n chunk,\n )) {\n await scanModule(module, classes, sourceCache, visitedModules);\n }\n }\n\n return classes;\n}\n\nasync function scanModule(\n module: Module,\n classes: Set<string>,\n sourceCache: Map<string, Promise<string | undefined>>,\n visited: Set<Module>,\n): Promise<void> {\n if (visited.has(module)) {\n return;\n }\n\n visited.add(module);\n\n const nested = (module as Module & { modules?: Iterable<Module> }).modules;\n\n if (nested) {\n for (const child of nested) {\n await scanModule(child, classes, sourceCache, visited);\n }\n }\n\n const resource = (module as Module & { resource?: unknown }).resource;\n\n if (typeof resource !== \"string\" || isStyleFile(resource)) {\n return;\n }\n\n const source = readModuleSource(module);\n\n if (source) {\n scanClasses(source, classes);\n return;\n }\n\n if (!isScannableSource(resource)) {\n return;\n }\n\n const filePath = resource.split(\"?\")[0] ?? resource;\n\n if (!filePath) {\n return;\n }\n\n let pending = sourceCache.get(filePath);\n\n if (!pending) {\n pending = readFile(filePath, \"utf8\").catch(() => undefined);\n sourceCache.set(filePath, pending);\n }\n\n const fresh = await pending;\n\n if (fresh) {\n scanClasses(fresh, classes);\n }\n}\n\nfunction readModuleSource(module: Module): string | undefined {\n try {\n const source = module.originalSource();\n\n if (!source) {\n return undefined;\n }\n\n return sourceToString(source.source());\n } catch {\n return undefined;\n }\n}\n\nfunction collectEntryJsFiles(entry: Entrypoint): Set<string> {\n const files = new Set<string>();\n\n for (const file of entry.getFiles()) {\n if (file.endsWith(\".js\")) {\n files.add(file);\n }\n }\n\n return files;\n}\n\nfunction collectEntryCssFiles(entry: Entrypoint): Set<string> {\n const cssFiles = new Set<string>();\n\n for (const file of entry.getFiles()) {\n if (file.endsWith(\".css\")) {\n cssFiles.add(file);\n }\n }\n\n for (const chunk of entry.chunks) {\n for (const file of chunk.files) {\n if (file.endsWith(\".css\")) {\n cssFiles.add(file);\n }\n }\n\n for (const file of chunk.auxiliaryFiles) {\n if (file.endsWith(\".css\")) {\n cssFiles.add(file);\n }\n }\n }\n\n return cssFiles;\n}\n\nfunction entryName(entry: Entrypoint): string | undefined {\n if (entry.name) {\n return entry.name;\n }\n\n const chunk = entry.getEntrypointChunk();\n return chunk.name ?? undefined;\n}\n\nfunction isPageEntry(name: string): boolean {\n const normalized = normalizeSlashes(name);\n\n if (normalized.startsWith(\"app/\")) {\n const path = normalized.slice(4);\n return path === \"page\" || path.endsWith(\"/page\");\n }\n\n if (normalized.startsWith(\"pages/\")) {\n const path = normalized.slice(6);\n return (\n path.length > 0 &&\n !path.split(\"/\").some((segment) => segment.startsWith(\"_\"))\n );\n }\n\n return false;\n}\n\nfunction isSharedEntry(name: string): boolean {\n const normalized = normalizeSlashes(name);\n\n return (\n (normalized.startsWith(\"app/\") &&\n (normalized === \"app/layout\" || normalized.endsWith(\"/layout\"))) ||\n normalized === \"pages/_app\" ||\n normalized === \"pages/_document\"\n );\n}\n\nfunction isInternalEntry(name: string): boolean {\n const normalized = normalizeSlashes(name);\n const base = normalized.split(\"/\").pop() ?? normalized;\n\n return (\n base === \"main\" ||\n base === \"main-app\" ||\n base === \"polyfills\" ||\n base === \"webpack\" ||\n base === \"app-pages-internals\" ||\n base === \"middleware\" ||\n base === \"instrumentation\"\n );\n}\n\nfunction routeNameForEntry(name: string): string | null {\n const normalized = normalizeSlashes(name).replace(/^\\.\\//, \"\");\n\n if (normalized.startsWith(\"app/\")) {\n let path = normalized.slice(4);\n\n if (path === \"page\") {\n return \"/\";\n }\n\n if (path.endsWith(\"/page\")) {\n path = path.slice(0, -\"/page\".length);\n }\n\n if (!path || path.endsWith(\"layout\")) {\n return null;\n }\n\n return `/${path}`;\n }\n\n if (normalized.startsWith(\"pages/\")) {\n let path = normalized.slice(6);\n\n if (!path || path.startsWith(\"_\")) {\n return null;\n }\n\n path = path.replace(/\\/?index$/, \"\");\n return path.length > 0 ? `/${path}` : \"/\";\n }\n\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeSlashes(value: string): string {\n return value.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nfunction isStyleFile(resource: string): boolean {\n return /\\.(css|scss|sass|less|styl|stylus)(\\?|$)/i.test(resource);\n}\n\nfunction isScannableSource(resource: string): boolean {\n return /\\.(js|jsx|ts|tsx|mjs|cjs|mts|cts|html?|vue|svelte|mdx)(\\?|$)/i.test(\n resource,\n );\n}\n\nfunction scanClasses(source: string, classes: Set<string>): void {\n const patterns = [\n /(?:class|className)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|`([^`]*)`)/g,\n /(?:^|[,{;\\s])(?:class|className)\\s*:\\s*(?:\"([^\"]*)\"|'([^']*)'|`([^`]*)`)/g,\n /classList\\.(?:add|remove|toggle|contains)\\(\\s*(?:\"([^\"]*)\"|'([^']*)'|`([^`]*)`)/g,\n ];\n\n for (const pattern of patterns) {\n for (const match of source.matchAll(pattern)) {\n const value = match[1] ?? match[2] ?? match[3];\n\n if (!value) {\n continue;\n }\n\n for (const token of value.split(/\\s+/)) {\n if (isClassToken(token)) {\n classes.add(token.toLowerCase());\n }\n }\n }\n }\n}\n\n/** Accept Tailwind-style tokens (`md:flex`, `w-1/2`, `w-[10px]`, `!p-2`). */\nfunction isClassToken(token: string): boolean {\n if (!token || token.length > 256) {\n return false;\n }\n\n if (/[`${}]/.test(token)) {\n return false;\n }\n\n return /[A-Za-z_]/.test(token);\n}\n\nfunction addCssOwner(\n pagesByCss: Map<string, Set<string>>,\n cssFile: string,\n page: string,\n): void {\n const owners = pagesByCss.get(cssFile) ?? new Set<string>();\n owners.add(page);\n pagesByCss.set(cssFile, owners);\n}\n\nfunction collectSyntaxWarnings(\n analysis: JsCssAnalysisResult,\n): CssAssetWarning[] {\n return analysis.warnings.map((warning) => ({\n kind: \"syntax\",\n message: warning.message,\n ...(warning.location\n ? {\n line: warning.location.line,\n column: warning.location.column,\n }\n : {}),\n }));\n}\n\nfunction sourceToString(source: string | Buffer | Uint8Array): string {\n return typeof source === \"string\"\n ? source\n : Buffer.from(source).toString(\"utf8\");\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1_024) {\n return `${bytes} B`;\n }\n\n if (bytes < 1_024 * 1_024) {\n return `${(bytes / 1_024).toFixed(1)} KB`;\n }\n\n return `${(bytes / (1_024 * 1_024)).toFixed(1)} MB`;\n}\n\nfunction roundMs(value: number): number {\n return Math.round(value * 1_000) / 1_000;\n}\n\nfunction describeError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import picocolors from \"picocolors\";\n\nimport type {\n CssAssetDiagnostic,\n CssAssetWarning,\n CssDoctorNextDiagnostics,\n} from \"./types\";\n\nconst MATRIX_SELECTOR_MAX = 36;\n\n/** Options for terminal rendering. Defaults to picocolors' TTY detection. */\nexport type ReporterOptions = {\n color?: boolean;\n};\n\n/** Formats diagnostics as a human-readable build report. */\nexport function formatDiagnostics(\n diagnostics: CssDoctorNextDiagnostics,\n options: ReporterOptions = {},\n): string {\n const colors = picocolors.createColors(\n options.color ?? picocolors.isColorSupported,\n );\n const badge = colors.bgCyan(colors.black(\"[css-doctor]\"));\n const lines: string[] = [];\n\n lines.push(\n `${badge} Next.js ${diagnostics.pages.length} page${\n diagnostics.pages.length === 1 ? \"\" : \"s\"\n } ${colors.dim(\"·\")} ${diagnostics.analyzedCssAssets}/${\n diagnostics.totalCssAssets\n } CSS assets ${colors.dim(\"·\")} ${formatBytes(\n diagnostics.totalSizeBeforeBytes,\n )} → ${formatBytes(diagnostics.totalSizeAfterBytes)} common ` +\n `${colors.dim(\"·\")} ${formatDuration(diagnostics.durationMs)}` +\n ` ${colors.dim(\"·\")} ${\n diagnostics.minify\n ? colors.green(\"Minified: YES\")\n : colors.yellow(\"Minified: NO\")\n }`,\n );\n\n for (const file of diagnostics.files) {\n lines.push(...formatFile(file, colors));\n }\n\n if (diagnostics.splitApplied) {\n lines.push(\"\");\n lines.push(...formatMatrix(diagnostics, colors));\n }\n\n if (diagnostics.emittedPageChunks.length > 0) {\n lines.push(\"\");\n lines.push(\n ` ${colors.bold(\"Emitted page chunks\")} ${colors.dim(\n `(${diagnostics.emittedPageChunks.length})`,\n )}`,\n );\n\n for (const chunk of diagnostics.emittedPageChunks) {\n lines.push(\n ` ${colors.magenta(chunk.fileName)} ${colors.dim(\n formatBytes(chunk.sizeBytes),\n )}`,\n );\n }\n }\n\n if (diagnostics.sizeBudget.enabled) {\n lines.push(\"\");\n lines.push(...formatSizeBudget(diagnostics, colors));\n }\n\n if (diagnostics.deadCodeCount > 0) {\n lines.push(\"\");\n lines.push(\n ` ${colors.yellow(\"⚠\")} ${colors.bold(\"Dead code eliminated:\")} ` +\n `${diagnostics.deadCodeCount} selector occurrence${\n diagnostics.deadCodeCount === 1 ? \"\" : \"s\"\n }`,\n );\n }\n\n if (diagnostics.errors.length > 0) {\n lines.push(\"\");\n lines.push(` ${colors.red(colors.bold(\"Errors\"))}`);\n\n for (const error of diagnostics.errors) {\n lines.push(` ${colors.red(\"✖\")} ${error}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/** Prints diagnostics to stdout. */\nexport function printDiagnostics(diagnostics: CssDoctorNextDiagnostics): void {\n console.log(formatDiagnostics(diagnostics));\n}\n\nfunction formatFile(\n file: CssAssetDiagnostic,\n colors: ReturnType<typeof picocolors.createColors>,\n): string[] {\n const failed = file.error !== undefined;\n const hasWarnings = file.warnings.length > 0;\n const icon = failed\n ? colors.red(\"✖\")\n : hasWarnings\n ? colors.yellow(\"⚠\")\n : colors.green(\"✓\");\n\n const size = `${formatBytes(file.sizeBeforeBytes)} → ${formatBytes(\n file.sizeAfterBytes,\n )}`;\n const selectors = failed ? \"\" : ` · ${file.selectorCount} selectors`;\n const pages =\n file.associatedPages.length > 0\n ? ` · pages: ${file.associatedPages.join(\", \")}`\n : \"\";\n\n const lines = [\n ` ${icon} ${colors.bold(file.fileName)} ${colors.dim(size)}${selectors}${colors.dim(pages)}`,\n ];\n\n if (file.error) {\n lines.push(` ${colors.red(file.error)}`);\n return lines;\n }\n\n if (file.split) {\n lines.push(\n ` ${colors.dim(\"split\")} common ${formatBytes(\n file.split.commonSizeBytes,\n )} ${colors.dim(\"·\")} page-specific ${formatBytes(\n file.split.pageSpecificSizeBytes,\n )} ${colors.dim(\"·\")} dead ${file.split.deadCodeCount}`,\n );\n }\n\n for (const warning of file.warnings) {\n lines.push(` ${formatWarning(warning, colors)}`);\n }\n\n return lines;\n}\n\nfunction formatMatrix(\n diagnostics: CssDoctorNextDiagnostics,\n colors: ReturnType<typeof picocolors.createColors>,\n): string[] {\n const pageTotal = diagnostics.pages.length;\n const rows = diagnostics.usageMatrix;\n const header = [\n \"Selector\".padEnd(MATRIX_SELECTOR_MAX),\n \"Total Used\".padStart(10),\n \"Page Usage\".padStart(10),\n \"Coverage %\".padStart(10),\n \"Assigned Chunk\",\n ].join(\" \");\n\n const lines = [\n ` ${colors.bold(\"Usage Matrix\")} ${colors.dim(\n `(${rows.length} selectors · ${pageTotal} pages)`,\n )}`,\n ` ${colors.dim(header)}`,\n ];\n\n for (const row of rows) {\n const selector = truncate(row.selector, MATRIX_SELECTOR_MAX).padEnd(\n MATRIX_SELECTOR_MAX,\n );\n const totalUsed = String(row.totalOccurrences).padStart(10);\n const pageUsage = `${row.pageCount}/${pageTotal}`.padStart(10);\n const coverage = `${(row.coverageRatio * 100).toFixed(1)}%`.padStart(10);\n const chunk = formatChunk(row.targetChunk, colors);\n\n lines.push(\n ` ${colors.cyan(selector)} ${totalUsed} ${pageUsage} ${colorCoverage(\n coverage,\n row.coverageRatio,\n diagnostics.minPageRatio,\n colors,\n )} ${chunk}`,\n );\n }\n\n return lines;\n}\n\nfunction formatSizeBudget(\n diagnostics: CssDoctorNextDiagnostics,\n colors: ReturnType<typeof picocolors.createColors>,\n): string[] {\n const budget = diagnostics.sizeBudget;\n const lines = [\n ` ${colors.bold(\"Size budget\")} ${colors.dim(\n `(max ${formatBytes(budget.maxChunkSize)} · variables ${\n budget.isolateVariables ? \"isolated\" : \"inline\"\n })`,\n )}`,\n ];\n const chunks = diagnostics.emittedCssChunks;\n\n if (chunks.length === 0) {\n lines.push(` ${colors.dim(\"No CSS chunks were emitted.\")}`);\n return lines;\n }\n\n for (const chunk of chunks) {\n const markers: string[] = [];\n\n if (chunk.variables) {\n markers.push(\"vars\");\n }\n\n if (chunk.part !== undefined) {\n markers.push(`part ${chunk.part}`);\n }\n\n if (chunk.embedded) {\n markers.push(\"embedded\");\n }\n\n if (chunk.splitDueToSize) {\n markers.push(colors.yellow(\"split\"));\n }\n\n if (chunk.oversized) {\n markers.push(colors.red(\"oversized\"));\n }\n\n lines.push(\n ` ${colors.magenta(chunk.fileName)} ${colors.dim(\n formatBytes(chunk.sizeBytes),\n )}${markers.length > 0 ? ` ${colors.dim(\"·\")} ${markers.join(\" · \")}` : \"\"}`,\n );\n }\n\n if (budget.splitChunks === 0) {\n lines.push(\n ` ${colors.dim(\"No chunk exceeded the configured size budget.\")}`,\n );\n }\n\n return lines;\n}\n\nfunction formatWarning(\n warning: CssAssetWarning,\n colors: ReturnType<typeof picocolors.createColors>,\n): string {\n const location =\n warning.line !== undefined\n ? colors.dim(\n `${warning.line}${\n warning.column !== undefined ? `:${warning.column}` : \"\"\n } `,\n )\n : \"\";\n\n return `${colors.yellow(\"!\")} ${location}${warning.message}`;\n}\n\nfunction colorCoverage(\n coverage: string,\n ratio: number,\n minPageRatio: number,\n colors: ReturnType<typeof picocolors.createColors>,\n): string {\n if (ratio === 0) {\n return colors.red(coverage);\n }\n\n return ratio >= minPageRatio\n ? colors.green(coverage)\n : colors.yellow(coverage);\n}\n\nfunction formatChunk(\n chunk: string,\n colors: ReturnType<typeof picocolors.createColors>,\n): string {\n if (chunk === \"common\") {\n return colors.cyan(chunk);\n }\n\n if (chunk === \"dead\") {\n return colors.red(chunk);\n }\n\n return colors.magenta(chunk);\n}\n\nfunction truncate(value: string, maxLength: number): string {\n return value.length <= maxLength\n ? value\n : `${value.slice(0, maxLength - 1)}…`;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1_024) {\n return `${bytes} B`;\n }\n\n if (bytes < 1_024 * 1_024) {\n return `${(bytes / 1_024).toFixed(1)} KB`;\n }\n\n return `${(bytes / (1_024 * 1_024)).toFixed(1)} MB`;\n}\n\nfunction formatDuration(milliseconds: number): string {\n if (!Number.isFinite(milliseconds)) {\n return \"—\";\n }\n\n return milliseconds < 1\n ? `${milliseconds.toFixed(2)} ms`\n : `${milliseconds.toFixed(1)} ms`;\n}\n"],"mappings":"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","names":["import_node_fs","import_node_path","picocolors","module","formatBytes","entryName","isRecord"]}
|