@purgeon/rolldown-plugin 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;KAOK,sBAAsB;EAAmB;;iBAE9B,QAAQ,UAAS,gBAAqB;UAmIrC;EACf,UAAU;EACV;IAAoB"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;KAeK,sBAAsB;EAAmB;;iBAE9B,QAAQ,UAAS,gBAAqB;UAyIrC;EACf,UAAU;EACV;IAAoB"}
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { writeFileSync } from "node:fs";
2
2
  import { toCssPurgeIR } from "@purgeon/analyzer-css";
3
3
  import { toJsxPurgeIR } from "@purgeon/analyzer-jsx";
4
- import { extractUsedClasses, extractUsedVars, isAnalyzer, purgeUnusedCss } from "@purgeon/core";
4
+ import { extractUsedClasses, extractUsedDataAttrs, extractUsedVars, isAnalyzer, purgeUnusedCss } from "@purgeon/core";
5
5
  //#region src/index.ts
6
6
  function purgeon(options = {}) {
7
7
  const wrappers = (options.plugins ?? []).filter((p) => isAnalyzer(p)).map((p) => ({
@@ -28,7 +28,7 @@ function purgeon(options = {}) {
28
28
  generateBundle(options, bundle) {
29
29
  for (const wrapper of wrappers) wrapper.plugin.generateBundle.call(this, options, bundle);
30
30
  usage = reportUsage(wrappers, this);
31
- if (usage) purgeBundle(bundle, usage.usedClasses, usage.usedVars);
31
+ if (usage) purgeBundle(bundle, usage.usedSelectorKeys, usage.usedVars);
32
32
  },
33
33
  writeBundle() {
34
34
  if (!outFile) return;
@@ -36,6 +36,7 @@ function purgeon(options = {}) {
36
36
  for (const wrapper of wrappers) graphs[wrapper.plugin.name] = wrapper.getGraph().toObject();
37
37
  if (usage) {
38
38
  graphs.usedClasses = usage.classes;
39
+ graphs.usedDataAttrs = usage.dataAttrs;
39
40
  graphs.usedVars = usage.vars;
40
41
  }
41
42
  try {
@@ -67,19 +68,23 @@ function reportUsage(wrappers, ctx) {
67
68
  for (const rule of cssRules) for (const className of rule.classes) cssClasses.add(className);
68
69
  const usedClasses = extractUsedClasses(jsxNodes, cssClasses);
69
70
  const classes = summarize(usedClasses, cssClasses);
71
+ const usedDataAttrs = extractUsedDataAttrs(jsxNodes);
72
+ const dataAttrs = summarize(usedDataAttrs, usedDataAttrs);
73
+ const usedSelectorKeys = /* @__PURE__ */ new Set([...usedClasses, ...usedDataAttrs]);
70
74
  const allVars = /* @__PURE__ */ new Set();
71
75
  for (const rule of cssRules) {
72
76
  for (const varName of rule.declaredVars) allVars.add(varName);
73
77
  for (const varName of rule.referencedVars) allVars.add(varName);
74
78
  }
75
- const usedVars = extractUsedVars(cssRules, usedClasses);
79
+ const usedVars = extractUsedVars(cssRules, usedSelectorKeys);
76
80
  const vars = summarize(usedVars, allVars);
77
81
  ctx.info(`[purgeon] CSS classes: ${classes.usedCount} used, ${classes.unusedCount} unused (of ${classes.total} total)`);
78
82
  ctx.info(`[purgeon] CSS vars: ${vars.usedCount} used, ${vars.unusedCount} unused (of ${vars.total} total)`);
79
83
  return {
80
84
  classes,
81
85
  vars,
82
- usedClasses,
86
+ dataAttrs,
87
+ usedSelectorKeys,
83
88
  usedVars
84
89
  };
85
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { writeFileSync } from \"node:fs\";\n\nimport { toCssPurgeIR, type CssGraphNode } from \"@purgeon/analyzer-css\";\nimport { toJsxPurgeIR, type JsxGraphNode } from \"@purgeon/analyzer-jsx\";\nimport { extractUsedClasses, extractUsedVars, isAnalyzer, purgeUnusedCss, type AnalyzerPlugin, type OutputBundle } from \"@purgeon/core\";\nimport type { Plugin as RolldownPlugin } from \"rolldown\";\n\ntype PurgeonPluginResult = RolldownPlugin & { enforce?: \"pre\" | \"post\" };\n\nexport function purgeon(options: PluginOptions = {}): PurgeonPluginResult {\n const wrappers = (options.plugins ?? [])\n .filter((p) => isAnalyzer(p))\n .map((p) => ({ plugin: p.toRolldownPlugin(), getGraph: () => p.getGraph() }));\n const outFile = resolveDebugOutFile(options.debug);\n let usage: UsageReport | null = null;\n\n return {\n name: \"purgeon\",\n enforce: \"pre\",\n\n transform(code, id) {\n for (const wrapper of wrappers) {\n try {\n wrapper.plugin.transform.call(this as any, code, id);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.warn(`[${wrapper.plugin.name}] failed to analyze ${id}: ${message}`);\n }\n }\n return null;\n },\n\n moduleParsed(moduleInfo) {\n for (const wrapper of wrappers) {\n wrapper.plugin.moduleParsed.call(this, moduleInfo);\n }\n },\n\n generateBundle(options, bundle) {\n for (const wrapper of wrappers) {\n wrapper.plugin.generateBundle.call(this as any, options, bundle as any);\n }\n\n usage = reportUsage(wrappers, this);\n if (usage) purgeBundle(bundle as unknown as OutputBundle, usage.usedClasses, usage.usedVars);\n },\n\n writeBundle() {\n if (!outFile) return;\n\n const graphs: Record<string, unknown> = {};\n for (const wrapper of wrappers) {\n graphs[wrapper.plugin.name] = wrapper.getGraph().toObject();\n }\n if (usage) {\n graphs.usedClasses = usage.classes;\n graphs.usedVars = usage.vars;\n }\n\n try {\n writeFileSync(outFile, JSON.stringify(graphs, null, 2), \"utf-8\");\n this.info(`Wrote debug output to ${outFile}`);\n } catch (error) {\n this.warn(`Failed to write debug output to ${outFile}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n };\n}\n\ninterface UsageSummary {\n used: string[];\n unused: string[];\n total: number;\n usedCount: number;\n unusedCount: number;\n}\n\nfunction summarize(used: Set<string>, total: Set<string>): UsageSummary {\n const unused = [...total].filter((name) => !used.has(name));\n return { used: [...used], unused, total: total.size, usedCount: used.size, unusedCount: unused.length };\n}\n\ninterface UsageReport {\n classes: UsageSummary;\n vars: UsageSummary;\n usedClasses: Set<string>;\n usedVars: Set<string>;\n}\n\ninterface AnalyzerWrapper {\n plugin: ReturnType<AnalyzerPlugin[\"toRolldownPlugin\"]>;\n getGraph: () => ReturnType<AnalyzerPlugin[\"getGraph\"]>;\n}\n\nfunction reportUsage(wrappers: AnalyzerWrapper[], ctx: { info(msg: string): void }): UsageReport | null {\n const jsxWrapper = wrappers.find((w) => w.plugin.name === \"jsx-graph\");\n const cssWrapper = wrappers.find((w) => w.plugin.name === \"css-graph\");\n if (!jsxWrapper || !cssWrapper) return null;\n\n const jsxNodes = [...jsxWrapper.getGraph().values()].map((n) => toJsxPurgeIR(n as JsxGraphNode));\n const cssRules = [...cssWrapper.getGraph().values()].flatMap((node) => toCssPurgeIR((node as CssGraphNode).rules));\n\n const cssClasses = new Set<string>();\n for (const rule of cssRules) {\n for (const className of rule.classes) cssClasses.add(className);\n }\n\n const usedClasses = extractUsedClasses(jsxNodes, cssClasses);\n const classes = summarize(usedClasses, cssClasses);\n\n const allVars = new Set<string>();\n for (const rule of cssRules) {\n for (const varName of rule.declaredVars) allVars.add(varName);\n for (const varName of rule.referencedVars) allVars.add(varName);\n }\n const usedVars = extractUsedVars(cssRules, usedClasses);\n const vars = summarize(usedVars, allVars);\n\n ctx.info(`[purgeon] CSS classes: ${classes.usedCount} used, ${classes.unusedCount} unused (of ${classes.total} total)`);\n ctx.info(`[purgeon] CSS vars: ${vars.usedCount} used, ${vars.unusedCount} unused (of ${vars.total} total)`);\n\n return { classes, vars, usedClasses, usedVars };\n}\n\nfunction purgeBundle(bundle: OutputBundle, usedClasses: Set<string>, usedVars: Set<string>): void {\n for (const fileName in bundle) {\n const output = bundle[fileName]!;\n if (output.type !== \"asset\" || !fileName.endsWith(\".css\")) continue;\n\n const source = typeof output.source === \"string\" ? output.source : Buffer.from(output.source).toString(\"utf-8\");\n output.source = purgeUnusedCss(source, fileName, usedClasses, usedVars);\n }\n}\n\nfunction resolveDebugOutFile(debug?: boolean | { outFile: string }): string | null {\n if (!debug) return null;\n if (typeof debug === \"object\") return debug.outFile;\n return \"graph.json\";\n}\n\nexport interface PluginOptions {\n plugins?: AnalyzerPlugin[];\n debug?: boolean | { outFile: string };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { writeFileSync } from \"node:fs\";\n\nimport { toCssPurgeIR, type CssGraphNode } from \"@purgeon/analyzer-css\";\nimport { toJsxPurgeIR, type JsxGraphNode } from \"@purgeon/analyzer-jsx\";\nimport {\n extractUsedClasses,\n extractUsedDataAttrs,\n extractUsedVars,\n isAnalyzer,\n purgeUnusedCss,\n type AnalyzerPlugin,\n type OutputBundle,\n} from \"@purgeon/core\";\nimport type { Plugin as RolldownPlugin } from \"rolldown\";\n\ntype PurgeonPluginResult = RolldownPlugin & { enforce?: \"pre\" | \"post\" };\n\nexport function purgeon(options: PluginOptions = {}): PurgeonPluginResult {\n const wrappers = (options.plugins ?? [])\n .filter((p) => isAnalyzer(p))\n .map((p) => ({ plugin: p.toRolldownPlugin(), getGraph: () => p.getGraph() }));\n const outFile = resolveDebugOutFile(options.debug);\n let usage: UsageReport | null = null;\n\n return {\n name: \"purgeon\",\n enforce: \"pre\",\n\n transform(code, id) {\n for (const wrapper of wrappers) {\n try {\n wrapper.plugin.transform.call(this as any, code, id);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.warn(`[${wrapper.plugin.name}] failed to analyze ${id}: ${message}`);\n }\n }\n return null;\n },\n\n moduleParsed(moduleInfo) {\n for (const wrapper of wrappers) {\n wrapper.plugin.moduleParsed.call(this, moduleInfo);\n }\n },\n\n generateBundle(options, bundle) {\n for (const wrapper of wrappers) {\n wrapper.plugin.generateBundle.call(this as any, options, bundle as any);\n }\n\n usage = reportUsage(wrappers, this);\n if (usage) purgeBundle(bundle as unknown as OutputBundle, usage.usedSelectorKeys, usage.usedVars);\n },\n\n writeBundle() {\n if (!outFile) return;\n\n const graphs: Record<string, unknown> = {};\n for (const wrapper of wrappers) {\n graphs[wrapper.plugin.name] = wrapper.getGraph().toObject();\n }\n if (usage) {\n graphs.usedClasses = usage.classes;\n graphs.usedDataAttrs = usage.dataAttrs;\n graphs.usedVars = usage.vars;\n }\n\n try {\n writeFileSync(outFile, JSON.stringify(graphs, null, 2), \"utf-8\");\n this.info(`Wrote debug output to ${outFile}`);\n } catch (error) {\n this.warn(`Failed to write debug output to ${outFile}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n };\n}\n\ninterface UsageSummary {\n used: string[];\n unused: string[];\n total: number;\n usedCount: number;\n unusedCount: number;\n}\n\nfunction summarize(used: Set<string>, total: Set<string>): UsageSummary {\n const unused = [...total].filter((name) => !used.has(name));\n return { used: [...used], unused, total: total.size, usedCount: used.size, unusedCount: unused.length };\n}\n\ninterface UsageReport {\n classes: UsageSummary;\n vars: UsageSummary;\n dataAttrs: UsageSummary;\n usedSelectorKeys: Set<string>;\n usedVars: Set<string>;\n}\n\ninterface AnalyzerWrapper {\n plugin: ReturnType<AnalyzerPlugin[\"toRolldownPlugin\"]>;\n getGraph: () => ReturnType<AnalyzerPlugin[\"getGraph\"]>;\n}\n\nfunction reportUsage(wrappers: AnalyzerWrapper[], ctx: { info(msg: string): void }): UsageReport | null {\n const jsxWrapper = wrappers.find((w) => w.plugin.name === \"jsx-graph\");\n const cssWrapper = wrappers.find((w) => w.plugin.name === \"css-graph\");\n if (!jsxWrapper || !cssWrapper) return null;\n\n const jsxNodes = [...jsxWrapper.getGraph().values()].map((n) => toJsxPurgeIR(n as JsxGraphNode));\n const cssRules = [...cssWrapper.getGraph().values()].flatMap((node) => toCssPurgeIR((node as CssGraphNode).rules));\n\n const cssClasses = new Set<string>();\n for (const rule of cssRules) {\n for (const className of rule.classes) cssClasses.add(className);\n }\n\n const usedClasses = extractUsedClasses(jsxNodes, cssClasses);\n const classes = summarize(usedClasses, cssClasses);\n\n const usedDataAttrs = extractUsedDataAttrs(jsxNodes);\n const dataAttrs = summarize(usedDataAttrs, usedDataAttrs);\n const usedSelectorKeys = new Set([...usedClasses, ...usedDataAttrs]);\n\n const allVars = new Set<string>();\n for (const rule of cssRules) {\n for (const varName of rule.declaredVars) allVars.add(varName);\n for (const varName of rule.referencedVars) allVars.add(varName);\n }\n const usedVars = extractUsedVars(cssRules, usedSelectorKeys);\n const vars = summarize(usedVars, allVars);\n\n ctx.info(`[purgeon] CSS classes: ${classes.usedCount} used, ${classes.unusedCount} unused (of ${classes.total} total)`);\n ctx.info(`[purgeon] CSS vars: ${vars.usedCount} used, ${vars.unusedCount} unused (of ${vars.total} total)`);\n\n return { classes, vars, dataAttrs, usedSelectorKeys, usedVars };\n}\n\nfunction purgeBundle(bundle: OutputBundle, usedClasses: Set<string>, usedVars: Set<string>): void {\n for (const fileName in bundle) {\n const output = bundle[fileName]!;\n if (output.type !== \"asset\" || !fileName.endsWith(\".css\")) continue;\n\n const source = typeof output.source === \"string\" ? output.source : Buffer.from(output.source).toString(\"utf-8\");\n output.source = purgeUnusedCss(source, fileName, usedClasses, usedVars);\n }\n}\n\nfunction resolveDebugOutFile(debug?: boolean | { outFile: string }): string | null {\n if (!debug) return null;\n if (typeof debug === \"object\") return debug.outFile;\n return \"graph.json\";\n}\n\nexport interface PluginOptions {\n plugins?: AnalyzerPlugin[];\n debug?: boolean | { outFile: string };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@purgeon/rolldown-plugin",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Rolldown/Vite plugin that cross-references JSX usage against CSS graphs and purges unused rules from emitted CSS",
5
5
  "keywords": [
6
6
  "css",
@@ -30,9 +30,9 @@
30
30
  "access": "public"
31
31
  },
32
32
  "dependencies": {
33
- "@purgeon/analyzer-css": "0.1.0",
34
- "@purgeon/core": "0.1.0",
35
- "@purgeon/analyzer-jsx": "0.1.0"
33
+ "@purgeon/analyzer-css": "0.2.0",
34
+ "@purgeon/analyzer-jsx": "0.2.0",
35
+ "@purgeon/core": "0.2.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "rolldown": "^1.1.4"