catom 2.5.0 → 3.5.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/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # catom
2
+
3
+ Zero-runtime CSS-in-JS with atomic CSS generation for Vite.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install catom
9
+ ```
10
+
11
+ ## Setup
12
+
13
+ ```ts
14
+ // vite.config.ts
15
+ import { defineConfig } from 'vite'
16
+ import catom from 'catom/vite'
17
+
18
+ export default defineConfig({
19
+ plugins: [catom()]
20
+ })
21
+ ```
22
+
23
+ Add the virtual module type to your tsconfig:
24
+
25
+ ```json
26
+ {
27
+ "compilerOptions": {
28
+ "types": ["catom/virtual"]
29
+ }
30
+ }
31
+ ```
32
+
33
+ ## Usage
34
+
35
+ ```tsx
36
+ import { css } from 'catom'
37
+ import 'virtual:catom.css'
38
+
39
+ const button = css({
40
+ backgroundColor: 'blue',
41
+ color: 'white',
42
+ padding: '8px 16px',
43
+ pseudo: {
44
+ ':hover': { backgroundColor: 'darkblue' }
45
+ },
46
+ media: {
47
+ '(max-width: 768px)': { padding: '4px 8px' }
48
+ }
49
+ })
50
+
51
+ export function Button() {
52
+ return <button className={button}>Click me</button>
53
+ }
54
+ ```
55
+
56
+ The `css()` calls are transformed at build time into class name strings. No runtime overhead.
57
+
58
+ ## Options
59
+
60
+ ```ts
61
+ catom({
62
+ include: /\.[jt]sx?$/, // files to transform
63
+ exclude: /node_modules/, // files to skip
64
+ functionName: 'css' // function name to transform
65
+ })
66
+ ```
67
+
68
+ ## License
69
+
70
+ MIT
@@ -1,90 +1,19 @@
1
1
  import { Properties } from 'csstype';
2
2
  export { Properties as CSSProperties } from 'csstype';
3
3
 
4
- /**
5
- * CSS properties with optional pseudo selectors
6
- */
7
4
  interface CSSPropertiesWithPseudo extends Properties {
8
- /**
9
- * Pseudo selector styles
10
- * @example
11
- * ```ts
12
- * { ':hover': { color: 'blue' } }
13
- * ```
14
- */
15
5
  pseudo?: {
16
6
  [selector: string]: Properties;
17
7
  };
18
8
  }
19
- /**
20
- * Input type for the css() function
21
- * Supports standard CSS properties plus media and pseudo selectors
22
- */
23
9
  interface CSSInput extends Properties {
24
- /**
25
- * Media query styles - can also contain pseudo selectors
26
- * @example
27
- * ```ts
28
- * css({
29
- * color: 'red',
30
- * media: {
31
- * '(max-width: 768px)': {
32
- * color: 'blue',
33
- * pseudo: { ':hover': { color: 'darkblue' } }
34
- * }
35
- * }
36
- * })
37
- * ```
38
- */
39
10
  media?: {
40
11
  [query: string]: CSSPropertiesWithPseudo;
41
12
  };
42
- /**
43
- * Pseudo selector styles
44
- * @example
45
- * ```ts
46
- * css({
47
- * color: 'red',
48
- * pseudo: {
49
- * ':hover': { color: 'blue' },
50
- * ':focus': { outline: '2px solid blue' }
51
- * }
52
- * })
53
- * ```
54
- */
55
13
  pseudo?: {
56
14
  [selector: string]: Properties;
57
15
  };
58
16
  }
59
- /**
60
- * Define atomic CSS styles that are extracted at compile time.
61
- *
62
- * This function is transformed by catom/vite plugin during build.
63
- * At runtime, it only serves as a type-safe placeholder.
64
- *
65
- * @param styles - CSS properties object with optional media and pseudo selectors
66
- * @returns A string of space-separated atomic class names (at build time)
67
- *
68
- * @example
69
- * ```tsx
70
- * import { css } from 'catom'
71
- *
72
- * const button = css({
73
- * backgroundColor: 'blue',
74
- * color: 'white',
75
- * padding: '8px 16px',
76
- * borderRadius: '4px',
77
- * pseudo: {
78
- * ':hover': { backgroundColor: 'darkblue' }
79
- * }
80
- * })
81
- *
82
- * // In your component:
83
- * <button className={button}>Click me</button>
84
- * ```
85
- *
86
- * @throws Error if called at runtime (indicates plugin misconfiguration)
87
- */
88
17
  declare function css(_styles: CSSInput): string;
89
18
 
90
19
  export { type CSSInput, type CSSPropertiesWithPseudo, css };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";AAmFO,SAAS,IAAI,OAAA,EAA2B;AAC7C,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GAGF;AACF","file":"index.js","sourcesContent":["import type { Properties } from 'csstype'\n\n/**\n * CSS properties with optional pseudo selectors\n */\nexport interface CSSPropertiesWithPseudo extends Properties {\n /**\n * Pseudo selector styles\n * @example\n * ```ts\n * { ':hover': { color: 'blue' } }\n * ```\n */\n pseudo?: { [selector: string]: Properties }\n}\n\n/**\n * Input type for the css() function\n * Supports standard CSS properties plus media and pseudo selectors\n */\nexport interface CSSInput extends Properties {\n /**\n * Media query styles - can also contain pseudo selectors\n * @example\n * ```ts\n * css({\n * color: 'red',\n * media: {\n * '(max-width: 768px)': { \n * color: 'blue',\n * pseudo: { ':hover': { color: 'darkblue' } }\n * }\n * }\n * })\n * ```\n */\n media?: { [query: string]: CSSPropertiesWithPseudo }\n\n /**\n * Pseudo selector styles\n * @example\n * ```ts\n * css({\n * color: 'red',\n * pseudo: {\n * ':hover': { color: 'blue' },\n * ':focus': { outline: '2px solid blue' }\n * }\n * })\n * ```\n */\n pseudo?: { [selector: string]: Properties }\n}\n\n/**\n * Define atomic CSS styles that are extracted at compile time.\n *\n * This function is transformed by catom/vite plugin during build.\n * At runtime, it only serves as a type-safe placeholder.\n *\n * @param styles - CSS properties object with optional media and pseudo selectors\n * @returns A string of space-separated atomic class names (at build time)\n *\n * @example\n * ```tsx\n * import { css } from 'catom'\n *\n * const button = css({\n * backgroundColor: 'blue',\n * color: 'white',\n * padding: '8px 16px',\n * borderRadius: '4px',\n * pseudo: {\n * ':hover': { backgroundColor: 'darkblue' }\n * }\n * })\n *\n * // In your component:\n * <button className={button}>Click me</button>\n * ```\n *\n * @throws Error if called at runtime (indicates plugin misconfiguration)\n */\nexport function css(_styles: CSSInput): string {\n throw new Error(\n '[catom] css() was called at runtime. ' +\n 'This usually means the catom vite plugin is not configured correctly. ' +\n 'Make sure to add the plugin to your vite.config.ts: import catom from \"catom/vite\"'\n )\n}\n\n// Re-export the type for convenience\nexport type { Properties as CSSProperties } from 'csstype'\n"]}
1
+ {"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";AAWO,SAAS,IAAI,OAAA,EAA2B;AAC7C,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GAGF;AACF","file":"index.js","sourcesContent":["import type { Properties } from 'csstype'\n\nexport interface CSSPropertiesWithPseudo extends Properties {\n pseudo?: { [selector: string]: Properties }\n}\n\nexport interface CSSInput extends Properties {\n media?: { [query: string]: CSSPropertiesWithPseudo }\n pseudo?: { [selector: string]: Properties }\n}\n\nexport function css(_styles: CSSInput): string {\n throw new Error(\n '[catom] css() was called at runtime. ' +\n 'This usually means the catom vite plugin is not configured correctly. ' +\n 'Make sure to add the plugin to your vite.config.ts: import catom from \"catom/vite\"'\n )\n}\n\nexport type { Properties as CSSProperties } from 'csstype'\n"]}
@@ -1,3 +1,4 @@
1
+ import { PluginOption } from 'vite';
1
2
  import { Properties } from 'csstype';
2
3
 
3
4
  /**
@@ -47,48 +48,6 @@ interface CatomPluginOptions {
47
48
  functionName?: string;
48
49
  }
49
50
 
50
- /**
51
- * Vite plugin for zero-runtime CSS-in-JS with atomic CSS generation
52
- *
53
- * @example
54
- * ```ts
55
- * // vite.config.ts
56
- * import { defineConfig } from 'vite'
57
- * import catom from 'catom/vite'
58
- *
59
- * export default defineConfig({
60
- * plugins: [catom()]
61
- * })
62
- * ```
63
- *
64
- * @example
65
- * ```ts
66
- * // In your app code
67
- * import { css } from 'catom'
68
- * import 'virtual:catom.css'
69
- *
70
- * const button = css({
71
- * color: 'red',
72
- * padding: '8px',
73
- * pseudo: { ':hover': { color: 'blue' } }
74
- * })
75
- * // After transform: const button = "_a1b2c3 _d4e5f6 _g7h8i9"
76
- * ```
77
- */
78
- declare function catomPlugin(options?: CatomPluginOptions): {
79
- name: string;
80
- enforce: "pre";
81
- configResolved(): void;
82
- buildStart(): void;
83
- resolveId(id: string): string | null;
84
- load(id: string): string | null;
85
- transform(this: {
86
- error: (message: string) => never;
87
- }, code: string, id: string): {
88
- code: string;
89
- map: null;
90
- } | null;
91
- watchChange(id: string): void;
92
- };
51
+ declare function catomPlugin(options?: CatomPluginOptions): PluginOption;
93
52
 
94
53
  export { type CSSInput, type CSSRule, type CatomPluginOptions, catomPlugin, catomPlugin as default };
@@ -19,21 +19,14 @@ function murmur2(str) {
19
19
  (k & 65535) * 1540483477 + ((k >>> 16) * 59797 << 16) ^ /* Math.imul(h, m): */
20
20
  (h & 65535) * 1540483477 + ((h >>> 16) * 59797 << 16);
21
21
  }
22
- switch (len) {
23
- case 3:
24
- h ^= (str.charCodeAt(i + 2) & 255) << 16;
25
- // falls through
26
- case 2:
27
- h ^= (str.charCodeAt(i + 1) & 255) << 8;
28
- // falls through
29
- case 1:
30
- h ^= str.charCodeAt(i) & 255;
31
- h = /* Math.imul(h, m): */
32
- (h & 65535) * 1540483477 + ((h >>> 16) * 59797 << 16);
22
+ if (len >= 3) h ^= (str.charCodeAt(i + 2) & 255) << 16;
23
+ if (len >= 2) h ^= (str.charCodeAt(i + 1) & 255) << 8;
24
+ if (len >= 1) {
25
+ h ^= str.charCodeAt(i) & 255;
26
+ h = (h & 65535) * 1540483477 + ((h >>> 16) * 59797 << 16);
33
27
  }
34
28
  h ^= h >>> 13;
35
- h = /* Math.imul(h, m): */
36
- (h & 65535) * 1540483477 + ((h >>> 16) * 59797 << 16);
29
+ h = (h & 65535) * 1540483477 + ((h >>> 16) * 59797 << 16);
37
30
  return ((h ^ h >>> 15) >>> 0).toString(36);
38
31
  }
39
32
  var PREFIX_CHARS = new Set("0123456789-".split(""));
@@ -163,8 +156,8 @@ function getPropertyKey(prop) {
163
156
  function processPropertiesObject(obj, rules, media, pseudo) {
164
157
  for (const prop of obj.properties) {
165
158
  if (prop.type === "SpreadElement") {
166
- if (prop.argument.type === "ObjectExpression") {
167
- processPropertiesObject(prop.argument, rules, media, pseudo);
159
+ if (prop.arguments.type === "ObjectExpression") {
160
+ processPropertiesObject(prop.arguments, rules, media, pseudo);
168
161
  } else {
169
162
  throw new Error(
170
163
  `[catom] Spread elements must be object literals. Dynamic spreads are not supported at compile time.`
@@ -291,7 +284,7 @@ function isTargetImport(spec, functionName) {
291
284
  }
292
285
  return false;
293
286
  }
294
- function findCatomImports(ast, functionName) {
287
+ function findCatomImports(ast, functionName, baseOffset) {
295
288
  const importsToRemove = [];
296
289
  for (const node of ast.body) {
297
290
  if (node.type !== "ImportDeclaration") continue;
@@ -302,9 +295,8 @@ function findCatomImports(ast, functionName) {
302
295
  if (!hasCssImport) continue;
303
296
  if (specifiers.length === 1) {
304
297
  importsToRemove.push({
305
- start: node.span.start - 1,
306
- // SWC is 1-indexed
307
- end: node.span.end - 1,
298
+ start: node.span.start - 1 - baseOffset,
299
+ end: node.span.end - 1 - baseOffset,
308
300
  isFullImport: true
309
301
  });
310
302
  } else {
@@ -312,8 +304,8 @@ function findCatomImports(ast, functionName) {
312
304
  if (isTargetImport(spec, functionName)) {
313
305
  const s = spec;
314
306
  importsToRemove.push({
315
- start: s.span.start - 1,
316
- end: s.span.end - 1,
307
+ start: s.span.start - 1 - baseOffset,
308
+ end: s.span.end - 1 - baseOffset,
317
309
  isFullImport: false
318
310
  });
319
311
  }
@@ -362,12 +354,13 @@ function transformCode(code, id, functionName = "css") {
362
354
  if (replacements.size === 0) {
363
355
  return { code, cssRules: [], transformed: false };
364
356
  }
365
- const importsToRemove = findCatomImports(ast, functionName);
357
+ const baseOffset = ast.span.start - 1;
358
+ const importsToRemove = findCatomImports(ast, functionName, baseOffset);
366
359
  let result = code;
367
360
  const modifications = [];
368
361
  for (const [start, classNames] of replacements) {
369
- const searchStart = start - 1;
370
- const cssCallMatch = findCSSCallBounds(result, searchStart, functionName);
362
+ const adjustedStart = start - 1 - baseOffset;
363
+ const cssCallMatch = findCSSCallBounds(result, adjustedStart, functionName);
371
364
  if (cssCallMatch) {
372
365
  modifications.push({
373
366
  start: cssCallMatch.start,
@@ -434,10 +427,13 @@ function catomPlugin(options = {}) {
434
427
  } = options;
435
428
  const moduleCSS = /* @__PURE__ */ new Map();
436
429
  let filter;
430
+ let server = null;
437
431
  return {
438
432
  name: "vite-plugin-catom",
439
- // Ensure we run before other transforms
440
433
  enforce: "pre",
434
+ configureServer(devServer) {
435
+ server = devServer;
436
+ },
441
437
  configResolved() {
442
438
  filter = createFilter(include, exclude);
443
439
  },
@@ -456,41 +452,38 @@ function catomPlugin(options = {}) {
456
452
  for (const state of moduleCSS.values()) {
457
453
  allRules.push(...state.rules);
458
454
  }
459
- const css = generateCSS(allRules);
460
- return css;
455
+ return generateCSS(allRules);
461
456
  }
462
457
  return null;
463
458
  },
464
459
  transform(code, id) {
465
- if (!filter(id)) {
466
- return null;
467
- }
468
- if (!code.includes(functionName + "(")) {
469
- return null;
470
- }
471
- try {
472
- const result = transformCode(code, id, functionName);
473
- if (!result.transformed) {
474
- return null;
475
- }
476
- moduleCSS.set(id, {
477
- rules: result.cssRules,
478
- timestamp: Date.now()
479
- });
480
- return {
481
- code: result.code,
482
- map: null
483
- // TODO: Add source map support
484
- };
485
- } catch (error) {
486
- const message = error instanceof Error ? error.message : String(error);
487
- this.error(`[catom] Error transforming ${id}: ${message}`);
488
- }
460
+ if (!filter(id)) return null;
461
+ if (!code.includes(functionName + "(")) return null;
462
+ const result = transformCode(code, id, functionName);
463
+ if (!result.transformed) return null;
464
+ moduleCSS.set(id, {
465
+ rules: result.cssRules,
466
+ timestamp: Date.now()
467
+ });
468
+ return {
469
+ code: result.code,
470
+ map: null
471
+ };
489
472
  },
490
- // Handle module removal (for dev server)
491
- watchChange(id) {
492
- if (moduleCSS.has(id)) {
493
- moduleCSS.delete(id);
473
+ handleHotUpdate(ctx) {
474
+ if (!filter(ctx.file)) return;
475
+ const hasOrHadCSS = moduleCSS.has(ctx.file) || ctx.modules.some((m) => moduleCSS.has(m.id || ""));
476
+ if (hasOrHadCSS) {
477
+ ctx.modules.forEach((mod) => {
478
+ server?.moduleGraph.invalidateModule(mod);
479
+ });
480
+ const virtualMod = server?.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID);
481
+ if (virtualMod) {
482
+ server?.moduleGraph.invalidateModule(virtualMod);
483
+ }
484
+ moduleCSS.delete(ctx.file);
485
+ server?.ws.send({ type: "full-reload" });
486
+ return [];
494
487
  }
495
488
  }
496
489
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/hash.ts","../../src/core/css-generator.ts","../../src/vite/transform.ts","../../src/vite/index.ts"],"names":["rules"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Murmur2 hash implementation (from emotion-js)\n * Fast, non-cryptographic hash function for generating unique class names\n * https://github.com/emotion-js/emotion/blob/master/packages/hash/src/index.js\n */\nexport function murmur2(str: string): string {\n // 'm' and 'r' are mixing constants generated offline.\n // They're not really 'magic', they just happen to work well.\n // const m = 0x5bd1e995;\n // const r = 24;\n\n // Initialize the hash\n let h = 0\n\n // Mix 4 bytes at a time into the hash\n let k: number\n let i = 0\n let len = str.length\n\n for (; len >= 4; ++i, len -= 4) {\n k =\n (str.charCodeAt(i) & 0xff) |\n ((str.charCodeAt(++i) & 0xff) << 8) |\n ((str.charCodeAt(++i) & 0xff) << 16) |\n ((str.charCodeAt(++i) & 0xff) << 24)\n\n k =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + (((k >>> 16) * 0xe995) << 16)\n k ^= /* k >>> r: */ k >>> 24\n\n h =\n /* Math.imul(k, m): */\n ((k & 0xffff) * 0x5bd1e995 + (((k >>> 16) * 0xe995) << 16)) ^\n /* Math.imul(h, m): */\n ((h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0xe995) << 16))\n }\n\n // Handle the last few bytes of the input array\n switch (len) {\n case 3:\n h ^= (str.charCodeAt(i + 2) & 0xff) << 16\n // falls through\n case 2:\n h ^= (str.charCodeAt(i + 1) & 0xff) << 8\n // falls through\n case 1:\n h ^= str.charCodeAt(i) & 0xff\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0xe995) << 16)\n }\n\n // Do a few final mixes of the hash to ensure the last few\n // bytes are well-incorporated.\n h ^= h >>> 13\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0xe995) << 16)\n\n return ((h ^ (h >>> 15)) >>> 0).toString(36)\n}\n\n/**\n * Characters that require underscore prefix for valid CSS class names\n */\nconst PREFIX_CHARS = new Set('0123456789-'.split(''))\n\n/**\n * Make a hash safe for use as a CSS class name\n * Prefixes with underscore if starts with digit or dash\n */\nexport function makeCSSCompatible(hash: string): string {\n if (PREFIX_CHARS.has(hash[0])) {\n return `_${hash}`\n }\n return hash\n}\n\n/**\n * Generate a CSS-safe hash from an identity string\n */\nexport function generateHash(identity: string): string {\n return makeCSSCompatible(murmur2(identity))\n}\n","import { generateHash } from './hash.js'\nimport type { CSSRule } from './types.js'\n\n/**\n * Regex to convert camelCase to kebab-case\n */\nconst KEBAB_CASE_REGEX = /([a-z0-9]|(?=[A-Z]))([A-Z])/g\n\n/**\n * Convert camelCase CSS property to kebab-case\n * e.g., \"backgroundColor\" -> \"background-color\"\n */\nexport function toKebabCase(property: string): string {\n return property.replace(KEBAB_CASE_REGEX, '$1-$2').toLowerCase()\n}\n\n/**\n * Create a unique identity string for a CSS rule\n * Used for hashing and deduplication\n * Includes both media and pseudo in identity for proper deduplication\n */\nexport function createRuleIdentity(\n property: string,\n value: string,\n media?: string,\n pseudo?: string\n): string {\n const mediaPrefix = media ? `@${media.trim()}` : ''\n const pseudoPrefix = pseudo ? pseudo.trim() : ''\n const kebabProp = toKebabCase(property)\n return `${mediaPrefix}${pseudoPrefix}${kebabProp}:${value};`\n}\n\n/**\n * Create a CSS rule from property and value\n */\nexport function createCSSRule(\n property: string,\n value: string | number,\n media?: string,\n pseudo?: string\n): CSSRule {\n const stringValue = String(value).trim()\n const kebabProperty = toKebabCase(property.trim())\n const identity = createRuleIdentity(property, stringValue, media, pseudo)\n const hash = generateHash(identity)\n\n return {\n hash,\n property: kebabProperty,\n value: stringValue,\n media: media?.trim(),\n pseudo: pseudo?.trim(),\n }\n}\n\n/**\n * Deduplicate CSS rules by their identity\n * Rules with identical property:value (and media/pseudo) share the same hash\n */\nexport function deduplicateRules(rules: CSSRule[]): CSSRule[] {\n const seen = new Map<string, CSSRule>()\n\n for (const rule of rules) {\n const identity = createRuleIdentity(rule.property, rule.value, rule.media, rule.pseudo)\n if (!seen.has(identity)) {\n seen.set(identity, rule)\n }\n }\n\n return Array.from(seen.values())\n}\n\n/**\n * Group rules by their CSS declaration for merging selectors\n * e.g., multiple classes with same \"color: red\" get merged\n */\ninterface GroupedRule {\n declaration: string // e.g., \"color: red;\"\n hashes: Set<string>\n media?: string\n pseudo?: string\n}\n\nfunction groupRulesByDeclaration(rules: CSSRule[]): GroupedRule[] {\n const groups = new Map<string, GroupedRule>()\n\n for (const rule of rules) {\n const declaration = `${rule.property}:${rule.value};`\n const groupKey = `${rule.media || ''}|${rule.pseudo || ''}|${declaration}`\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, {\n declaration,\n hashes: new Set(),\n media: rule.media,\n pseudo: rule.pseudo,\n })\n }\n groups.get(groupKey)!.hashes.add(rule.hash)\n }\n\n return Array.from(groups.values())\n}\n\n/**\n * Generate final CSS string from rules\n * Handles deduplication and groups media queries\n */\nexport function generateCSS(rules: CSSRule[]): string {\n const dedupedRules = deduplicateRules(rules)\n\n // Separate rules by type\n const regularRules: CSSRule[] = []\n const pseudoRules: CSSRule[] = []\n const mediaRules = new Map<string, CSSRule[]>()\n\n for (const rule of dedupedRules) {\n if (rule.media) {\n const existing = mediaRules.get(rule.media) || []\n existing.push(rule)\n mediaRules.set(rule.media, existing)\n } else if (rule.pseudo) {\n pseudoRules.push(rule)\n } else {\n regularRules.push(rule)\n }\n }\n\n const cssLines: string[] = []\n\n // Generate regular rules (grouped by declaration)\n const regularGroups = groupRulesByDeclaration(regularRules)\n for (const group of regularGroups.sort((a, b) => a.declaration.localeCompare(b.declaration))) {\n const selectors = Array.from(group.hashes)\n .sort()\n .map((h) => `.${h}`)\n .join(',\\n')\n cssLines.push(`${selectors} { ${group.declaration} }`)\n }\n\n // Generate pseudo rules\n const pseudoGroups = groupRulesByDeclaration(pseudoRules)\n for (const group of pseudoGroups.sort((a, b) => a.declaration.localeCompare(b.declaration))) {\n const selectors = Array.from(group.hashes)\n .sort()\n .map((h) => `.${h}${group.pseudo}`)\n .join(',\\n')\n cssLines.push(`${selectors} { ${group.declaration} }`)\n }\n\n // Generate media queries\n const sortedMediaQueries = Array.from(mediaRules.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n )\n\n for (const [query, rules] of sortedMediaQueries) {\n const mediaGroups = groupRulesByDeclaration(rules)\n const mediaLines: string[] = []\n\n for (const group of mediaGroups.sort((a, b) => a.declaration.localeCompare(b.declaration))) {\n const suffix = group.pseudo || ''\n const selectors = Array.from(group.hashes)\n .sort()\n .map((h) => `.${h}${suffix}`)\n .join(',\\n')\n mediaLines.push(` ${selectors} { ${group.declaration} }`)\n }\n\n cssLines.push(`@media ${query} {\\n${mediaLines.join('\\n')}\\n}`)\n }\n\n return cssLines.join('\\n')\n}\n","import { parseSync } from '@swc/core'\nimport type {\n CallExpression,\n Expression,\n KeyValueProperty,\n ObjectExpression,\n Program,\n StringLiteral,\n NumericLiteral,\n SpreadElement,\n Property,\n} from '@swc/core'\nimport { createCSSRule } from '../core/css-generator.js'\nimport type { CSSRule, TransformResult } from '../core/types.js'\n\n/**\n * Check if an expression is a string or numeric literal\n */\nfunction isLiteral(expr: Expression): expr is StringLiteral | NumericLiteral {\n return expr.type === 'StringLiteral' || expr.type === 'NumericLiteral'\n}\n\n/**\n * Get the value from a literal expression\n */\nfunction getLiteralValue(expr: StringLiteral | NumericLiteral): string | number {\n if (expr.type === 'StringLiteral') {\n return expr.value\n }\n return expr.value\n}\n\n/**\n * Extract the key name from a property\n */\nfunction getPropertyKey(prop: KeyValueProperty): string | null {\n if (prop.key.type === 'Identifier') {\n return prop.key.value\n }\n if (prop.key.type === 'StringLiteral') {\n return prop.key.value\n }\n return null\n}\n\n/**\n * Process a CSS properties object and extract rules\n */\nfunction processPropertiesObject(\n obj: ObjectExpression,\n rules: CSSRule[],\n media?: string,\n pseudo?: string\n): void {\n for (const prop of obj.properties) {\n if (prop.type === 'SpreadElement') {\n // Handle spread - try to process if it's an object literal\n if (prop.argument.type === 'ObjectExpression') {\n processPropertiesObject(prop.argument, rules, media, pseudo)\n } else {\n throw new Error(\n `[catom] Spread elements must be object literals. ` +\n `Dynamic spreads are not supported at compile time.`\n )\n }\n continue\n }\n\n if (prop.type !== 'KeyValueProperty') {\n continue\n }\n\n const keyName = getPropertyKey(prop)\n if (!keyName) {\n throw new Error(`[catom] Could not determine property key. Only identifiers and string literals are supported.`)\n }\n\n const value = prop.value\n\n // Handle media queries\n if (keyName === 'media') {\n if (value.type !== 'ObjectExpression') {\n throw new Error(`[catom] 'media' property must be an object literal.`)\n }\n for (const mediaProp of value.properties) {\n if (mediaProp.type !== 'KeyValueProperty') continue\n const mediaQuery = getPropertyKey(mediaProp)\n if (!mediaQuery) continue\n if (mediaProp.value.type !== 'ObjectExpression') {\n throw new Error(`[catom] Media query '${mediaQuery}' must contain an object literal.`)\n }\n processPropertiesObject(mediaProp.value, rules, mediaQuery, pseudo)\n }\n continue\n }\n\n // Handle pseudo selectors\n if (keyName === 'pseudo') {\n if (value.type !== 'ObjectExpression') {\n throw new Error(`[catom] 'pseudo' property must be an object literal.`)\n }\n for (const pseudoProp of value.properties) {\n if (pseudoProp.type !== 'KeyValueProperty') continue\n const pseudoSelector = getPropertyKey(pseudoProp)\n if (!pseudoSelector) continue\n if (pseudoProp.value.type !== 'ObjectExpression') {\n throw new Error(`[catom] Pseudo selector '${pseudoSelector}' must contain an object literal.`)\n }\n processPropertiesObject(pseudoProp.value, rules, media, pseudoSelector)\n }\n continue\n }\n\n // Handle regular CSS properties\n // Unwrap TSAsExpression if present (e.g., `value as const`)\n let actualValue = value\n if (actualValue.type === 'TsAsExpression') {\n actualValue = actualValue.expression\n }\n\n if (!isLiteral(actualValue)) {\n throw new Error(\n `[catom] Property '${keyName}' has a non-literal value. ` +\n `Only string and number literals are supported at compile time. ` +\n `Got: ${actualValue.type}`\n )\n }\n\n const rule = createCSSRule(keyName, getLiteralValue(actualValue), media, pseudo)\n rules.push(rule)\n }\n}\n\n/**\n * Process a css() call expression and return the extracted rules and replacement hashes\n */\nfunction processCSSCall(callExpr: CallExpression): { rules: CSSRule[]; classNames: string } {\n const rules: CSSRule[] = []\n\n if (callExpr.arguments.length === 0) {\n return { rules: [], classNames: '' }\n }\n\n const arg = callExpr.arguments[0]\n if (arg.expression.type !== 'ObjectExpression') {\n throw new Error(\n `[catom] css() must be called with an object literal. ` +\n `Got: ${arg.expression.type}`\n )\n }\n\n processPropertiesObject(arg.expression, rules)\n\n const classNames = rules.map((r) => r.hash).join(' ')\n return { rules, classNames }\n}\n\n// Keys that contain metadata, not child AST nodes\n// We still traverse into these if they happen to be objects with a 'type' property\nconst METADATA_KEYS = new Set(['span', 'ctxt'])\n\n/**\n * Check if a value is an AST node (has a type property that is a string)\n */\nfunction isASTNode(value: unknown): value is { type: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as Record<string, unknown>).type === 'string'\n )\n}\n\n/**\n * Recursively walk the AST and find/transform css() calls\n */\nfunction walkAndTransform(\n node: unknown,\n functionName: string,\n allRules: CSSRule[],\n replacements: Map<number, string>,\n visited = new WeakSet<object>()\n): void {\n if (!node || typeof node !== 'object') return\n \n // Prevent cycles\n if (visited.has(node as object)) return\n visited.add(node as object)\n\n // Check if this is a css() call\n if (isCallExpression(node)) {\n const callee = node.callee\n if (\n callee.type === 'Identifier' &&\n callee.value === functionName\n ) {\n try {\n const { rules, classNames } = processCSSCall(node)\n allRules.push(...rules)\n // Store replacement: we'll replace by position\n replacements.set(node.span.start, classNames)\n } catch (error) {\n // Re-throw with location info if available\n const loc = node.span\n const prefix = loc ? `[${loc.start}:${loc.end}]` : ''\n throw new Error(`${prefix} ${(error as Error).message}`)\n }\n }\n }\n\n // Recurse into AST node properties\n for (const key of Object.keys(node as Record<string, unknown>)) {\n // Skip metadata keys that don't contain child nodes\n if (METADATA_KEYS.has(key)) continue\n \n const value = (node as Record<string, unknown>)[key]\n if (Array.isArray(value)) {\n for (const item of value) {\n if (isASTNode(item)) {\n walkAndTransform(item, functionName, allRules, replacements, visited)\n }\n }\n } else if (isASTNode(value)) {\n walkAndTransform(value, functionName, allRules, replacements, visited)\n }\n }\n}\n\nfunction isCallExpression(node: unknown): node is CallExpression {\n return (\n typeof node === 'object' &&\n node !== null &&\n (node as { type?: string }).type === 'CallExpression'\n )\n}\n\n/**\n * Check if an import specifier imports the given function name\n */\nfunction isTargetImport(spec: unknown, functionName: string): boolean {\n if (typeof spec !== 'object' || spec === null) return false\n const s = spec as Record<string, unknown>\n if (s.type !== 'ImportSpecifier') return false\n\n // Check imported name (for `import { css as c }` -> imported.value = 'css')\n const imported = s.imported as Record<string, unknown> | null\n if (imported?.type === 'Identifier' && imported.value === functionName) {\n return true\n }\n\n // Check local name (for `import { css }` -> local.value = 'css', imported = null)\n const local = s.local as Record<string, unknown> | null\n if (!imported && local?.type === 'Identifier' && local.value === functionName) {\n return true\n }\n\n return false\n}\n\n/**\n * Find imports of the css function from catom and collect their positions for removal\n */\nfunction findCatomImports(\n ast: Program,\n functionName: string\n): Array<{ start: number; end: number; isFullImport: boolean }> {\n const importsToRemove: Array<{ start: number; end: number; isFullImport: boolean }> = []\n\n for (const node of ast.body) {\n if (node.type !== 'ImportDeclaration') continue\n\n // Check if importing from 'catom'\n const source = node.source.value\n if (source !== 'catom') continue\n\n // Check if this import includes the css function\n const specifiers = node.specifiers || []\n const hasCssImport = specifiers.some((spec) => isTargetImport(spec, functionName))\n\n if (!hasCssImport) continue\n\n // If this is the only import specifier, remove the whole import\n if (specifiers.length === 1) {\n importsToRemove.push({\n start: node.span.start - 1, // SWC is 1-indexed\n end: node.span.end - 1,\n isFullImport: true,\n })\n } else {\n // Multiple specifiers - find and remove just the css one\n for (const spec of specifiers) {\n if (isTargetImport(spec, functionName)) {\n const s = spec as { span: { start: number; end: number } }\n importsToRemove.push({\n start: s.span.start - 1,\n end: s.span.end - 1,\n isFullImport: false,\n })\n }\n }\n }\n }\n\n return importsToRemove\n}\n\n/**\n * Remove a range from code and clean up (remove trailing comma, extra whitespace)\n */\nfunction removeImportFromCode(\n code: string,\n start: number,\n end: number,\n isFullImport: boolean\n): string {\n if (isFullImport) {\n // Remove the whole line including newline\n let lineStart = start\n while (lineStart > 0 && code[lineStart - 1] !== '\\n') {\n lineStart--\n }\n let lineEnd = end\n while (lineEnd < code.length && code[lineEnd] !== '\\n') {\n lineEnd++\n }\n if (code[lineEnd] === '\\n') lineEnd++\n return code.slice(0, lineStart) + code.slice(lineEnd)\n } else {\n // Remove just the specifier and any trailing comma/whitespace\n let removeEnd = end\n // Skip whitespace and comma after\n while (removeEnd < code.length && /[\\s,]/.test(code[removeEnd])) {\n removeEnd++\n }\n return code.slice(0, start) + code.slice(removeEnd)\n }\n}\n\n/**\n * Transform source code by replacing css() calls with class name strings\n * and removing catom imports\n */\nexport function transformCode(\n code: string,\n id: string,\n functionName: string = 'css'\n): TransformResult {\n // Determine syntax from file extension\n const isTypeScript = /\\.tsx?$/.test(id)\n const isJSX = /\\.[jt]sx$/.test(id)\n\n let ast: Program\n try {\n ast = parseSync(code, {\n syntax: isTypeScript ? 'typescript' : 'ecmascript',\n tsx: isJSX && isTypeScript,\n jsx: isJSX && !isTypeScript,\n comments: true,\n })\n } catch {\n // If parsing fails, return unchanged\n return { code, cssRules: [], transformed: false }\n }\n\n const allRules: CSSRule[] = []\n const replacements = new Map<number, string>()\n\n // Walk the AST\n walkAndTransform(ast, functionName, allRules, replacements)\n\n if (replacements.size === 0) {\n return { code, cssRules: [], transformed: false }\n }\n\n // Find catom imports to remove\n const importsToRemove = findCatomImports(ast, functionName)\n\n // Apply replacements to the source code\n // We need to do this carefully to handle position shifts\n let result = code\n\n // First, collect all modifications sorted by position (descending)\n // so we can apply them from end to start without position shifts\n interface Modification {\n start: number\n end: number\n replacement: string\n type: 'css-call' | 'full-import' | 'import-specifier'\n }\n\n const modifications: Modification[] = []\n\n // Add css() call replacements\n for (const [start, classNames] of replacements) {\n const searchStart = start - 1 // SWC positions seem to be 1-indexed\n const cssCallMatch = findCSSCallBounds(result, searchStart, functionName)\n if (cssCallMatch) {\n modifications.push({\n start: cssCallMatch.start,\n end: cssCallMatch.end,\n replacement: JSON.stringify(classNames),\n type: 'css-call',\n })\n }\n }\n\n // Add import removals\n for (const imp of importsToRemove) {\n modifications.push({\n start: imp.start,\n end: imp.end,\n replacement: '',\n type: imp.isFullImport ? 'full-import' : 'import-specifier',\n })\n }\n\n // Sort by position descending\n modifications.sort((a, b) => b.start - a.start)\n\n // Apply modifications\n for (const mod of modifications) {\n if (mod.type === 'full-import') {\n result = removeImportFromCode(result, mod.start, mod.end, true)\n } else if (mod.type === 'import-specifier') {\n result = removeImportFromCode(result, mod.start, mod.end, false)\n } else {\n result = result.slice(0, mod.start) + mod.replacement + result.slice(mod.end)\n }\n }\n\n return {\n code: result,\n cssRules: allRules,\n transformed: true,\n }\n}\n\n/**\n * Find the bounds of a css() call in source code\n */\nfunction findCSSCallBounds(\n code: string,\n startPos: number,\n functionName: string\n): { start: number; end: number } | null {\n // Look for the function name near this position\n const searchWindow = 50\n const searchStart = Math.max(0, startPos - searchWindow)\n const searchEnd = Math.min(code.length, startPos + searchWindow)\n const searchRegion = code.slice(searchStart, searchEnd)\n\n // Find the function call\n const funcPattern = new RegExp(`\\\\b${functionName}\\\\s*\\\\(`)\n const match = funcPattern.exec(searchRegion)\n if (!match) return null\n\n const callStart = searchStart + match.index\n const parenStart = callStart + match[0].length - 1\n\n // Find matching closing paren\n let depth = 1\n let i = parenStart + 1\n while (i < code.length && depth > 0) {\n const char = code[i]\n if (char === '(') depth++\n else if (char === ')') depth--\n i++\n }\n\n if (depth !== 0) return null\n\n return { start: callStart, end: i }\n}\n","import { createFilter } from 'vite'\n\nimport { generateCSS } from '../core/css-generator.js'\nimport { transformCode } from './transform.js'\nimport type { CSSRule, CatomPluginOptions, ModuleCSSState } from '../core/types.js'\n\nexport type { CatomPluginOptions, CSSRule, CSSInput } from '../core/types.js'\n\nconst VIRTUAL_MODULE_ID = 'virtual:catom.css'\nconst RESOLVED_VIRTUAL_MODULE_ID = '\\0' + VIRTUAL_MODULE_ID\n\n/**\n * Vite plugin for zero-runtime CSS-in-JS with atomic CSS generation\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { defineConfig } from 'vite'\n * import catom from 'catom/vite'\n *\n * export default defineConfig({\n * plugins: [catom()]\n * })\n * ```\n *\n * @example\n * ```ts\n * // In your app code\n * import { css } from 'catom'\n * import 'virtual:catom.css'\n *\n * const button = css({\n * color: 'red',\n * padding: '8px',\n * pseudo: { ':hover': { color: 'blue' } }\n * })\n * // After transform: const button = \"_a1b2c3 _d4e5f6 _g7h8i9\"\n * ```\n */\nexport default function catomPlugin(options: CatomPluginOptions = {}) {\n const {\n include = /\\.[jt]sx?$/,\n exclude = /node_modules/,\n functionName = 'css',\n } = options\n\n // Per-build state: Map<moduleId, ModuleCSSState>\n // This gets reset on each build but persists during dev for the same module\n const moduleCSS = new Map<string, ModuleCSSState>()\n\n // Create filter for file matching\n let filter: (id: string) => boolean\n\n return {\n name: 'vite-plugin-catom',\n\n // Ensure we run before other transforms\n enforce: 'pre' as const,\n\n configResolved() {\n filter = createFilter(include, exclude)\n },\n\n buildStart() {\n // Clear CSS state at the start of each build\n // This ensures clean builds and prevents stale CSS\n moduleCSS.clear()\n },\n\n resolveId(id: string) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID\n }\n return null\n },\n\n load(id: string) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n // Aggregate all CSS rules from all modules\n const allRules: CSSRule[] = []\n for (const state of moduleCSS.values()) {\n allRules.push(...state.rules)\n }\n\n // Generate deduplicated CSS\n const css = generateCSS(allRules)\n return css\n }\n return null\n },\n\n transform(this: { error: (message: string) => never }, code: string, id: string) {\n // Skip non-matching files\n if (!filter(id)) {\n return null\n }\n\n // Skip if no css() calls (quick check before parsing)\n if (!code.includes(functionName + '(')) {\n return null\n }\n\n try {\n const result = transformCode(code, id, functionName)\n\n if (!result.transformed) {\n return null\n }\n\n // Store CSS rules for this module\n moduleCSS.set(id, {\n rules: result.cssRules,\n timestamp: Date.now(),\n })\n\n return {\n code: result.code,\n map: null, // TODO: Add source map support\n }\n } catch (error) {\n // Include file path in error message\n const message = error instanceof Error ? error.message : String(error)\n this.error(`[catom] Error transforming ${id}: ${message}`)\n }\n },\n\n // Handle module removal (for dev server)\n watchChange(id: string) {\n if (moduleCSS.has(id)) {\n moduleCSS.delete(id)\n }\n },\n }\n}\n\n// Also export as named export for flexibility\nexport { catomPlugin }\n"]}
1
+ {"version":3,"sources":["../../src/core/hash.ts","../../src/core/css-generator.ts","../../src/vite/transform.ts","../../src/vite/index.ts"],"names":["rules"],"mappings":"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","file":"index.js","sourcesContent":["// Murmur2 hash (from emotion-js)\n// https://github.com/emotion-js/emotion/blob/master/packages/hash/src/index.js\nexport function murmur2(str: string): string {\n let h = 0\n let k: number\n let i = 0\n let len = str.length\n\n for (; len >= 4; ++i, len -= 4) {\n k =\n (str.charCodeAt(i) & 0xff) |\n ((str.charCodeAt(++i) & 0xff) << 8) |\n ((str.charCodeAt(++i) & 0xff) << 16) |\n ((str.charCodeAt(++i) & 0xff) << 24)\n\n k =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + (((k >>> 16) * 0xe995) << 16)\n k ^= /* k >>> r: */ k >>> 24\n\n h =\n /* Math.imul(k, m): */\n ((k & 0xffff) * 0x5bd1e995 + (((k >>> 16) * 0xe995) << 16)) ^\n /* Math.imul(h, m): */\n ((h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0xe995) << 16))\n }\n\n if (len >= 3) h ^= (str.charCodeAt(i + 2) & 0xff) << 16\n if (len >= 2) h ^= (str.charCodeAt(i + 1) & 0xff) << 8\n if (len >= 1) {\n h ^= str.charCodeAt(i) & 0xff\n h = (h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0xe995) << 16)\n }\n\n h ^= h >>> 13\n h = (h & 0xffff) * 0x5bd1e995 + (((h >>> 16) * 0xe995) << 16)\n\n return ((h ^ (h >>> 15)) >>> 0).toString(36)\n}\n\nconst PREFIX_CHARS = new Set('0123456789-'.split(''))\n\nexport function makeCSSCompatible(hash: string): string {\n if (PREFIX_CHARS.has(hash[0])) {\n return `_${hash}`\n }\n return hash\n}\n\nexport function generateHash(identity: string): string {\n return makeCSSCompatible(murmur2(identity))\n}\n","import { generateHash } from './hash.js'\nimport type { CSSRule } from './types.js'\n\nconst KEBAB_CASE_REGEX = /([a-z0-9]|(?=[A-Z]))([A-Z])/g\n\nexport function toKebabCase(property: string): string {\n return property.replace(KEBAB_CASE_REGEX, '$1-$2').toLowerCase()\n}\n\nexport function createRuleIdentity(\n property: string,\n value: string,\n media?: string,\n pseudo?: string\n): string {\n const mediaPrefix = media ? `@${media.trim()}` : ''\n const pseudoPrefix = pseudo ? pseudo.trim() : ''\n const kebabProp = toKebabCase(property)\n return `${mediaPrefix}${pseudoPrefix}${kebabProp}:${value};`\n}\n\nexport function createCSSRule(\n property: string,\n value: string | number,\n media?: string,\n pseudo?: string\n): CSSRule {\n const stringValue = String(value).trim()\n const kebabProperty = toKebabCase(property.trim())\n const identity = createRuleIdentity(property, stringValue, media, pseudo)\n const hash = generateHash(identity)\n\n return {\n hash,\n property: kebabProperty,\n value: stringValue,\n media: media?.trim(),\n pseudo: pseudo?.trim(),\n }\n}\n\nexport function deduplicateRules(rules: CSSRule[]): CSSRule[] {\n const seen = new Map<string, CSSRule>()\n\n for (const rule of rules) {\n const identity = createRuleIdentity(rule.property, rule.value, rule.media, rule.pseudo)\n if (!seen.has(identity)) {\n seen.set(identity, rule)\n }\n }\n\n return Array.from(seen.values())\n}\n\ninterface GroupedRule {\n declaration: string\n hashes: Set<string>\n media?: string\n pseudo?: string\n}\n\nfunction groupRulesByDeclaration(rules: CSSRule[]): GroupedRule[] {\n const groups = new Map<string, GroupedRule>()\n\n for (const rule of rules) {\n const declaration = `${rule.property}:${rule.value};`\n const groupKey = `${rule.media || ''}|${rule.pseudo || ''}|${declaration}`\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, {\n declaration,\n hashes: new Set(),\n media: rule.media,\n pseudo: rule.pseudo,\n })\n }\n groups.get(groupKey)!.hashes.add(rule.hash)\n }\n\n return Array.from(groups.values())\n}\n\nexport function generateCSS(rules: CSSRule[]): string {\n const dedupedRules = deduplicateRules(rules)\n\n const regularRules: CSSRule[] = []\n const pseudoRules: CSSRule[] = []\n const mediaRules = new Map<string, CSSRule[]>()\n\n for (const rule of dedupedRules) {\n if (rule.media) {\n const existing = mediaRules.get(rule.media) || []\n existing.push(rule)\n mediaRules.set(rule.media, existing)\n } else if (rule.pseudo) {\n pseudoRules.push(rule)\n } else {\n regularRules.push(rule)\n }\n }\n\n const cssLines: string[] = []\n\n const regularGroups = groupRulesByDeclaration(regularRules)\n for (const group of regularGroups.sort((a, b) => a.declaration.localeCompare(b.declaration))) {\n const selectors = Array.from(group.hashes)\n .sort()\n .map((h) => `.${h}`)\n .join(',\\n')\n cssLines.push(`${selectors} { ${group.declaration} }`)\n }\n\n const pseudoGroups = groupRulesByDeclaration(pseudoRules)\n for (const group of pseudoGroups.sort((a, b) => a.declaration.localeCompare(b.declaration))) {\n const selectors = Array.from(group.hashes)\n .sort()\n .map((h) => `.${h}${group.pseudo}`)\n .join(',\\n')\n cssLines.push(`${selectors} { ${group.declaration} }`)\n }\n\n const sortedMediaQueries = Array.from(mediaRules.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n )\n\n for (const [query, rules] of sortedMediaQueries) {\n const mediaGroups = groupRulesByDeclaration(rules)\n const mediaLines: string[] = []\n\n for (const group of mediaGroups.sort((a, b) => a.declaration.localeCompare(b.declaration))) {\n const suffix = group.pseudo || ''\n const selectors = Array.from(group.hashes)\n .sort()\n .map((h) => `.${h}${suffix}`)\n .join(',\\n')\n mediaLines.push(` ${selectors} { ${group.declaration} }`)\n }\n\n cssLines.push(`@media ${query} {\\n${mediaLines.join('\\n')}\\n}`)\n }\n\n return cssLines.join('\\n')\n}\n","import { parseSync } from '@swc/core'\nimport type {\n CallExpression,\n Expression,\n KeyValueProperty,\n ObjectExpression,\n Program,\n StringLiteral,\n NumericLiteral,\n} from '@swc/core'\nimport { createCSSRule } from '../core/css-generator.js'\nimport type { CSSRule, TransformResult } from '../core/types.js'\n\nfunction isLiteral(expr: Expression): expr is StringLiteral | NumericLiteral {\n return expr.type === 'StringLiteral' || expr.type === 'NumericLiteral'\n}\n\nfunction getLiteralValue(expr: StringLiteral | NumericLiteral): string | number {\n if (expr.type === 'StringLiteral') {\n return expr.value\n }\n return expr.value\n}\n\nfunction getPropertyKey(prop: KeyValueProperty): string | null {\n if (prop.key.type === 'Identifier') {\n return prop.key.value\n }\n if (prop.key.type === 'StringLiteral') {\n return prop.key.value\n }\n return null\n}\n\nfunction processPropertiesObject(\n obj: ObjectExpression,\n rules: CSSRule[],\n media?: string,\n pseudo?: string\n): void {\n for (const prop of obj.properties) {\n if (prop.type === 'SpreadElement') {\n if (prop.arguments.type === 'ObjectExpression') {\n processPropertiesObject(prop.arguments, rules, media, pseudo)\n } else {\n throw new Error(\n `[catom] Spread elements must be object literals. ` +\n `Dynamic spreads are not supported at compile time.`\n )\n }\n continue\n }\n\n if (prop.type !== 'KeyValueProperty') {\n continue\n }\n\n const keyName = getPropertyKey(prop)\n if (!keyName) {\n throw new Error(`[catom] Could not determine property key. Only identifiers and string literals are supported.`)\n }\n\n const value = prop.value\n\n if (keyName === 'media') {\n if (value.type !== 'ObjectExpression') {\n throw new Error(`[catom] 'media' property must be an object literal.`)\n }\n for (const mediaProp of value.properties) {\n if (mediaProp.type !== 'KeyValueProperty') continue\n const mediaQuery = getPropertyKey(mediaProp)\n if (!mediaQuery) continue\n if (mediaProp.value.type !== 'ObjectExpression') {\n throw new Error(`[catom] Media query '${mediaQuery}' must contain an object literal.`)\n }\n processPropertiesObject(mediaProp.value, rules, mediaQuery, pseudo)\n }\n continue\n }\n\n if (keyName === 'pseudo') {\n if (value.type !== 'ObjectExpression') {\n throw new Error(`[catom] 'pseudo' property must be an object literal.`)\n }\n for (const pseudoProp of value.properties) {\n if (pseudoProp.type !== 'KeyValueProperty') continue\n const pseudoSelector = getPropertyKey(pseudoProp)\n if (!pseudoSelector) continue\n if (pseudoProp.value.type !== 'ObjectExpression') {\n throw new Error(`[catom] Pseudo selector '${pseudoSelector}' must contain an object literal.`)\n }\n processPropertiesObject(pseudoProp.value, rules, media, pseudoSelector)\n }\n continue\n }\n\n let actualValue = value\n if (actualValue.type === 'TsAsExpression') {\n actualValue = actualValue.expression\n }\n\n if (!isLiteral(actualValue)) {\n throw new Error(\n `[catom] Property '${keyName}' has a non-literal value. ` +\n `Only string and number literals are supported at compile time. ` +\n `Got: ${actualValue.type}`\n )\n }\n\n const rule = createCSSRule(keyName, getLiteralValue(actualValue), media, pseudo)\n rules.push(rule)\n }\n}\n\nfunction processCSSCall(callExpr: CallExpression): { rules: CSSRule[]; classNames: string } {\n const rules: CSSRule[] = []\n\n if (callExpr.arguments.length === 0) {\n return { rules: [], classNames: '' }\n }\n\n const arg = callExpr.arguments[0]\n if (arg.expression.type !== 'ObjectExpression') {\n throw new Error(\n `[catom] css() must be called with an object literal. ` +\n `Got: ${arg.expression.type}`\n )\n }\n\n processPropertiesObject(arg.expression, rules)\n\n const classNames = rules.map((r) => r.hash).join(' ')\n return { rules, classNames }\n}\n\nconst METADATA_KEYS = new Set(['span', 'ctxt'])\n\nfunction isASTNode(value: unknown): value is { type: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as Record<string, unknown>).type === 'string'\n )\n}\n\nfunction walkAndTransform(\n node: unknown,\n functionName: string,\n allRules: CSSRule[],\n replacements: Map<number, string>,\n visited = new WeakSet<object>()\n): void {\n if (!node || typeof node !== 'object') return\n \n // Prevent cycles\n if (visited.has(node as object)) return\n visited.add(node as object)\n\n if (isCallExpression(node)) {\n const callee = node.callee\n if (\n callee.type === 'Identifier' &&\n callee.value === functionName\n ) {\n try {\n const { rules, classNames } = processCSSCall(node)\n allRules.push(...rules)\n replacements.set(node.span.start, classNames)\n } catch (error) {\n const loc = node.span\n const prefix = loc ? `[${loc.start}:${loc.end}]` : ''\n throw new Error(`${prefix} ${(error as Error).message}`)\n }\n }\n }\n\n for (const key of Object.keys(node as Record<string, unknown>)) {\n if (METADATA_KEYS.has(key)) continue\n \n const value = (node as Record<string, unknown>)[key]\n if (Array.isArray(value)) {\n for (const item of value) {\n if (isASTNode(item)) {\n walkAndTransform(item, functionName, allRules, replacements, visited)\n }\n }\n } else if (isASTNode(value)) {\n walkAndTransform(value, functionName, allRules, replacements, visited)\n }\n }\n}\n\nfunction isCallExpression(node: unknown): node is CallExpression {\n return (\n typeof node === 'object' &&\n node !== null &&\n (node as { type?: string }).type === 'CallExpression'\n )\n}\n\nfunction isTargetImport(spec: unknown, functionName: string): boolean {\n if (typeof spec !== 'object' || spec === null) return false\n const s = spec as Record<string, unknown>\n if (s.type !== 'ImportSpecifier') return false\n\n const imported = s.imported as Record<string, unknown> | null\n if (imported?.type === 'Identifier' && imported.value === functionName) {\n return true\n }\n\n const local = s.local as Record<string, unknown> | null\n if (!imported && local?.type === 'Identifier' && local.value === functionName) {\n return true\n }\n\n return false\n}\n\nfunction findCatomImports(\n ast: Program,\n functionName: string,\n baseOffset: number\n): Array<{ start: number; end: number; isFullImport: boolean }> {\n const importsToRemove: Array<{ start: number; end: number; isFullImport: boolean }> = []\n\n for (const node of ast.body) {\n if (node.type !== 'ImportDeclaration') continue\n\n const source = node.source.value\n if (source !== 'catom') continue\n\n const specifiers = node.specifiers || []\n const hasCssImport = specifiers.some((spec) => isTargetImport(spec, functionName))\n\n if (!hasCssImport) continue\n\n if (specifiers.length === 1) {\n importsToRemove.push({\n start: node.span.start - 1 - baseOffset,\n end: node.span.end - 1 - baseOffset,\n isFullImport: true,\n })\n } else {\n for (const spec of specifiers) {\n if (isTargetImport(spec, functionName)) {\n const s = spec as { span: { start: number; end: number } }\n importsToRemove.push({\n start: s.span.start - 1 - baseOffset,\n end: s.span.end - 1 - baseOffset,\n isFullImport: false,\n })\n }\n }\n }\n }\n\n return importsToRemove\n}\n\nfunction removeImportFromCode(\n code: string,\n start: number,\n end: number,\n isFullImport: boolean\n): string {\n if (isFullImport) {\n let lineStart = start\n while (lineStart > 0 && code[lineStart - 1] !== '\\n') {\n lineStart--\n }\n let lineEnd = end\n while (lineEnd < code.length && code[lineEnd] !== '\\n') {\n lineEnd++\n }\n if (code[lineEnd] === '\\n') lineEnd++\n return code.slice(0, lineStart) + code.slice(lineEnd)\n } else {\n let removeEnd = end\n while (removeEnd < code.length && /[\\s,]/.test(code[removeEnd])) {\n removeEnd++\n }\n return code.slice(0, start) + code.slice(removeEnd)\n }\n}\n\nexport function transformCode(\n code: string,\n id: string,\n functionName: string = 'css'\n): TransformResult {\n const isTypeScript = /\\.tsx?$/.test(id)\n const isJSX = /\\.[jt]sx$/.test(id)\n\n let ast: Program\n try {\n ast = parseSync(code, {\n syntax: isTypeScript ? 'typescript' : 'ecmascript',\n tsx: isJSX && isTypeScript,\n jsx: isJSX && !isTypeScript,\n comments: true,\n })\n } catch {\n return { code, cssRules: [], transformed: false }\n }\n\n const allRules: CSSRule[] = []\n const replacements = new Map<number, string>()\n\n walkAndTransform(ast, functionName, allRules, replacements)\n\n if (replacements.size === 0) {\n return { code, cssRules: [], transformed: false }\n }\n\n // SWC accumulates byte offsets across parseSync calls\n // ast.span.start gives us the base offset we need to subtract\n const baseOffset = ast.span.start - 1 // -1 because spans are 1-indexed\n\n const importsToRemove = findCatomImports(ast, functionName, baseOffset)\n let result = code\n\n interface Modification {\n start: number\n end: number\n replacement: string\n type: 'css-call' | 'full-import' | 'import-specifier'\n }\n\n const modifications: Modification[] = []\n\n for (const [start, classNames] of replacements) {\n // Adjust span by subtracting base offset (spans are 1-indexed, so -1 then subtract base)\n const adjustedStart = start - 1 - baseOffset\n const cssCallMatch = findCSSCallBounds(result, adjustedStart, functionName)\n if (cssCallMatch) {\n modifications.push({\n start: cssCallMatch.start,\n end: cssCallMatch.end,\n replacement: JSON.stringify(classNames),\n type: 'css-call',\n })\n }\n }\n\n for (const imp of importsToRemove) {\n modifications.push({\n start: imp.start,\n end: imp.end,\n replacement: '',\n type: imp.isFullImport ? 'full-import' : 'import-specifier',\n })\n }\n\n modifications.sort((a, b) => b.start - a.start)\n for (const mod of modifications) {\n if (mod.type === 'full-import') {\n result = removeImportFromCode(result, mod.start, mod.end, true)\n } else if (mod.type === 'import-specifier') {\n result = removeImportFromCode(result, mod.start, mod.end, false)\n } else {\n result = result.slice(0, mod.start) + mod.replacement + result.slice(mod.end)\n }\n }\n\n return {\n code: result,\n cssRules: allRules,\n transformed: true,\n }\n}\n\nfunction findCSSCallBounds(\n code: string,\n startPos: number,\n functionName: string\n): { start: number; end: number } | null {\n const searchWindow = 50\n const searchStart = Math.max(0, startPos - searchWindow)\n const searchEnd = Math.min(code.length, startPos + searchWindow)\n const searchRegion = code.slice(searchStart, searchEnd)\n\n const funcPattern = new RegExp(`\\\\b${functionName}\\\\s*\\\\(`)\n const match = funcPattern.exec(searchRegion)\n if (!match) return null\n\n const callStart = searchStart + match.index\n const parenStart = callStart + match[0].length - 1\n\n let depth = 1\n let i = parenStart + 1\n while (i < code.length && depth > 0) {\n const char = code[i]\n if (char === '(') depth++\n else if (char === ')') depth--\n i++\n }\n\n if (depth !== 0) return null\n\n return { start: callStart, end: i }\n}\n","import {createFilter, PluginOption, type ViteDevServer} from \"vite\";\n\nimport {generateCSS} from \"../core/css-generator.js\";\nimport {transformCode} from \"./transform.js\";\nimport type {\n CSSRule,\n CatomPluginOptions,\n ModuleCSSState,\n} from \"../core/types.js\";\n\nexport type {CatomPluginOptions, CSSRule, CSSInput} from \"../core/types.js\";\n\nconst VIRTUAL_MODULE_ID = \"virtual:catom.css\";\nconst RESOLVED_VIRTUAL_MODULE_ID = \"\\0\" + VIRTUAL_MODULE_ID;\n\nexport default function catomPlugin(options: CatomPluginOptions = {}): PluginOption {\n const {\n include = /\\.[jt]sx?$/,\n exclude = /node_modules/,\n functionName = \"css\",\n } = options;\n\n const moduleCSS = new Map<string, ModuleCSSState>();\n let filter: (id: string) => boolean;\n let server: ViteDevServer | null = null;\n\n return {\n name: \"vite-plugin-catom\",\n\n enforce: \"pre\" as const,\n\n configureServer(devServer) {\n server = devServer;\n },\n\n configResolved() {\n filter = createFilter(include, exclude);\n },\n\n buildStart() {\n moduleCSS.clear();\n },\n\n resolveId(id: string) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID;\n }\n return null;\n },\n\n load(id: string) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n const allRules: CSSRule[] = [];\n for (const state of moduleCSS.values()) {\n allRules.push(...state.rules);\n }\n return generateCSS(allRules);\n }\n return null;\n },\n\n transform(code: string, id: string) {\n if (!filter(id)) return null;\n if (!code.includes(functionName + \"(\")) return null;\n\n const result = transformCode(code, id, functionName);\n if (!result.transformed) return null;\n\n moduleCSS.set(id, {\n rules: result.cssRules,\n timestamp: Date.now(),\n });\n\n return {\n code: result.code,\n map: null,\n };\n },\n\n handleHotUpdate(ctx) {\n if (!filter(ctx.file)) return;\n\n const hasOrHadCSS =\n moduleCSS.has(ctx.file) || ctx.modules.some((m) => moduleCSS.has(m.id || \"\"));\n\n if (hasOrHadCSS) {\n // Invalidate modules so they get re-transformed\n ctx.modules.forEach((mod) => {\n server?.moduleGraph.invalidateModule(mod);\n });\n\n // Invalidate the virtual CSS module so it gets regenerated\n const virtualMod = server?.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID);\n if (virtualMod) {\n server?.moduleGraph.invalidateModule(virtualMod);\n }\n \n moduleCSS.delete(ctx.file);\n \n server?.ws.send({type: \"full-reload\"});\n return [];\n }\n },\n };\n}\n\n// Also export as named export for flexibility\nexport {catomPlugin};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "catom",
3
- "version": "2.5.0",
3
+ "version": "3.5.0",
4
4
  "description": "Zero-runtime CSS-in-JS with atomic CSS generation",
5
5
  "type": "module",
6
6
  "main": "dist/runtime/index.js",
package/src/virtual.d.ts CHANGED
@@ -1,9 +1,4 @@
1
- /**
2
- * Virtual module type declaration for catom CSS
3
- * Add this to your tsconfig.json "include" or reference it in a .d.ts file
4
- */
5
1
  declare module 'virtual:catom.css' {
6
- // This is a CSS module with no exports
7
2
  const content: string
8
3
  export default content
9
4
  }