@kithinji/arcane 1.0.6 → 1.0.8

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.
@@ -32,6 +32,7 @@ var index_node_exports = {};
32
32
  __export(index_node_exports, {
33
33
  apply$: () => apply$,
34
34
  inlineFile$: () => inlineFile$,
35
+ inlineFiles$: () => inlineFiles$,
35
36
  style$: () => style$
36
37
  });
37
38
  module.exports = __toCommonJS(index_node_exports);
@@ -123,20 +124,20 @@ function normalizeValue(prop, value) {
123
124
  function isPseudoOrMediaKey(key) {
124
125
  return key.startsWith(":") || key.startsWith("@") || key.startsWith("&");
125
126
  }
126
- function validateStyleValue(value, path) {
127
+ function validateStyleValue(value, path2) {
127
128
  if (value === null) {
128
129
  throw new Error(
129
- `Invalid style value at ${path}: null is not allowed. Use undefined or omit the property.`
130
+ `Invalid style value at ${path2}: null is not allowed. Use undefined or omit the property.`
130
131
  );
131
132
  }
132
133
  if (typeof value === "function") {
133
134
  throw new Error(
134
- `Invalid style value at ${path}: functions must be resolved at build time.`
135
+ `Invalid style value at ${path2}: functions must be resolved at build time.`
135
136
  );
136
137
  }
137
138
  }
138
- function processStyleValue(prop, value, cssRules, path = prop) {
139
- validateStyleValue(value, path);
139
+ function processStyleValue(prop, value, cssRules, path2 = prop) {
140
+ validateStyleValue(value, path2);
140
141
  if (prop.startsWith("--")) {
141
142
  const className2 = hashProperty(prop, value, cssRules);
142
143
  if (!cssRules.has(className2)) {
@@ -149,7 +150,7 @@ function processStyleValue(prop, value, cssRules, path = prop) {
149
150
  if (typeof value === "object" && !Array.isArray(value)) {
150
151
  const classes = [];
151
152
  for (const [nestedKey, nestedValue] of Object.entries(value)) {
152
- validateStyleValue(nestedValue, `${path}.${nestedKey}`);
153
+ validateStyleValue(nestedValue, `${path2}.${nestedKey}`);
153
154
  if (nestedKey === "default") {
154
155
  const normalizedValue2 = normalizeValue(
155
156
  prop,
@@ -186,7 +187,7 @@ function processStyleValue(prop, value, cssRules, path = prop) {
186
187
  classes.push(className2);
187
188
  } else {
188
189
  throw new Error(
189
- `Invalid nested key "${nestedKey}" at ${path}. Expected "default", a pseudo-class (":hover"), media query ("@media"), or nesting selector ("&").`
190
+ `Invalid nested key "${nestedKey}" at ${path2}. Expected "default", a pseudo-class (":hover"), media query ("@media"), or nesting selector ("&").`
190
191
  );
191
192
  }
192
193
  }
@@ -415,21 +416,76 @@ function apply$(...c) {
415
416
  }
416
417
 
417
418
  // src/inline-file/inline.ts
418
- function inlineFile$(path, context) {
419
+ var import_fs = __toESM(require("fs"), 1);
420
+ var import_path = __toESM(require("path"), 1);
421
+ function inlineFile$(filePath, context) {
419
422
  if (!context) {
420
423
  throw new Error(
421
- "style$ macro requires MacroContext. Ensure you're using this as a build-time macro."
424
+ "inlineFile$ macro requires MacroContext. Ensure you're using this as a build-time macro."
425
+ );
426
+ }
427
+ const pathNode = filePath;
428
+ const resolvedPath = context.resolveNodeValue(pathNode);
429
+ if (typeof resolvedPath !== "string") {
430
+ throw new Error(
431
+ `inlineFile$ macro requires a string literal path, got: ${typeof resolvedPath}`
432
+ );
433
+ }
434
+ const sourceFile = context.sourceFile;
435
+ const sourceDir = import_path.default.dirname(sourceFile.fileName);
436
+ const absolutePath = import_path.default.resolve(sourceDir, resolvedPath);
437
+ let content;
438
+ try {
439
+ content = import_fs.default.readFileSync(absolutePath, "utf-8");
440
+ } catch (error) {
441
+ throw new Error(
442
+ `Failed to read file "${absolutePath}": ${error instanceof Error ? error.message : String(error)}`
443
+ );
444
+ }
445
+ return context.factory.createStringLiteral(content);
446
+ }
447
+ function inlineFiles$(filePaths, context) {
448
+ if (!context) {
449
+ throw new Error(
450
+ "inlineFiles$ macro requires MacroContext. Ensure you're using this as a build-time macro."
422
451
  );
423
452
  }
424
- const rPath = path;
425
- const value = context.resolveNodeValue(rPath);
426
- console.log(value);
427
- return context.factory.createStringLiteral("file.txt");
453
+ const pathsNode = filePaths;
454
+ const resolvedPaths = context.resolveNodeValue(pathsNode);
455
+ if (!Array.isArray(resolvedPaths)) {
456
+ throw new Error(
457
+ `inlineFiles$ macro requires an array of string literals, got: ${typeof resolvedPaths}`
458
+ );
459
+ }
460
+ const sourceFile = context.sourceFile;
461
+ const sourceDir = import_path.default.dirname(sourceFile.fileName);
462
+ const fileContents = [];
463
+ for (const filePath of resolvedPaths) {
464
+ if (typeof filePath !== "string") {
465
+ throw new Error(
466
+ `inlineFiles$ macro requires all paths to be string literals, got: ${typeof filePath}`
467
+ );
468
+ }
469
+ const absolutePath = import_path.default.resolve(sourceDir, filePath);
470
+ try {
471
+ const content = import_fs.default.readFileSync(absolutePath, "utf-8");
472
+ fileContents.push(content);
473
+ } catch (error) {
474
+ throw new Error(
475
+ `Failed to read file "${absolutePath}": ${error instanceof Error ? error.message : String(error)}`
476
+ );
477
+ }
478
+ }
479
+ const elements = fileContents.map(
480
+ (content) => context.factory.createStringLiteral(content)
481
+ );
482
+ return context.factory.createArrayLiteralExpression(elements, true);
428
483
  }
429
484
  // Annotate the CommonJS export names for ESM import in node:
430
485
  0 && (module.exports = {
431
486
  apply$,
432
487
  inlineFile$,
488
+ inlineFiles$,
433
489
  style$
434
490
  });
435
491
  //# sourceMappingURL=index.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.node.ts", "../../src/style/style.ts", "../../src/inline-file/inline.ts"],
4
- "sourcesContent": ["export * from \"./style\";\nexport * from \"./inline-file\";\n", "import { MacroContext } from \"@kithinji/pod\";\nimport ts from \"typescript\";\nimport { MapNamespaces } from \"./style_types\";\n\nconst UNITLESS_PROPS = new Set([\n \"z-index\",\n \"opacity\",\n \"flex-grow\",\n \"flex-shrink\",\n \"flex\",\n \"order\",\n \"font-weight\",\n \"line-height\",\n \"zoom\",\n \"column-count\",\n \"animation-iteration-count\",\n \"grid-column\",\n \"grid-row\",\n \"grid-column-start\",\n \"grid-column-end\",\n \"grid-row-start\",\n \"grid-row-end\",\n \"tab-size\",\n \"counter-increment\",\n \"counter-reset\",\n \"orphans\",\n \"widows\",\n]);\n\nconst DEV_MODE = process.env.NODE_ENV === \"development\";\n\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n return Math.abs(hash).toString(36).padStart(8, \"0\").slice(0, 8);\n}\n\nfunction hashProperty(\n prop: string,\n value: string | number,\n cssRules: Map<string, string>\n): string {\n const input = `${prop}:${value}`;\n let hash = simpleHash(input);\n let className: string;\n\n if (DEV_MODE) {\n // Add readable hint in development\n const hint = prop\n .replace(/[^a-z]/gi, \"\")\n .slice(0, 3)\n .toLowerCase();\n className = `a-${hint}-${hash}`;\n } else {\n className = `a-${hash}`;\n }\n\n let attempt = 0;\n\n // Handle hash collisions\n while (cssRules.has(className)) {\n const existing = cssRules.get(className)!;\n const kebabProp = toKebabCase(prop);\n const normalizedValue = normalizeValue(prop, value);\n const expectedRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n\n // If the existing rule matches, it's the same style (deduplication)\n if (existing.includes(`${kebabProp}: ${normalizedValue}`)) {\n break;\n }\n\n // Collision detected, rehash\n hash = simpleHash(`${input}-${++attempt}`);\n className = DEV_MODE ? `a-${prop.slice(0, 3)}-${hash}` : `a-${hash}`;\n\n if (attempt > 100) {\n throw new Error(\n `Hash collision limit exceeded for property ${prop}:${value}`\n );\n }\n }\n\n return className;\n}\n\nfunction toKebabCase(str: string): string {\n // Handle vendor prefixes (webkit, moz, ms)\n if (str.match(/^(webkit|moz|ms)[A-Z]/)) {\n return \"-\" + str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n }\n\n // Handle CSS custom properties\n if (str.startsWith(\"--\")) {\n return str;\n }\n\n return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\nfunction normalizeValue(prop: string, value: string | number): string {\n if (typeof value === \"number\") {\n const kebabProp = toKebabCase(prop);\n\n if (UNITLESS_PROPS.has(kebabProp)) {\n return String(value);\n }\n\n return `${value}px`;\n }\n\n return String(value);\n}\n\nfunction isPseudoOrMediaKey(key: string): boolean {\n return key.startsWith(\":\") || key.startsWith(\"@\") || key.startsWith(\"&\");\n}\n\nfunction validateStyleValue(value: any, path: string): void {\n if (value === null) {\n throw new Error(\n `Invalid style value at ${path}: null is not allowed. Use undefined or omit the property.`\n );\n }\n\n if (typeof value === \"function\") {\n throw new Error(\n `Invalid style value at ${path}: functions must be resolved at build time.`\n );\n }\n}\n\nfunction processStyleValue(\n prop: string,\n value: any,\n cssRules: Map<string, string>,\n path: string = prop\n): string {\n validateStyleValue(value, path);\n\n if (prop.startsWith(\"--\")) {\n const className = hashProperty(prop, value, cssRules);\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${prop}: ${value}; }`;\n cssRules.set(className, cssRule);\n }\n return className;\n }\n\n const kebabProp = toKebabCase(prop);\n\n // Handle nested objects for pseudo-classes, media queries, etc.\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const classes: string[] = [];\n\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n validateStyleValue(nestedValue, `${path}.${nestedKey}`);\n\n if (nestedKey === \"default\") {\n const normalizedValue = normalizeValue(\n prop,\n nestedValue as string | number\n );\n const className = hashProperty(prop, normalizedValue, cssRules);\n\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n cssRules.set(className, cssRule);\n }\n\n classes.push(className);\n } else if (isPseudoOrMediaKey(nestedKey)) {\n const normalizedValue = normalizeValue(\n prop,\n nestedValue as string | number\n );\n const className = hashProperty(\n `${prop}${nestedKey}`,\n normalizedValue,\n cssRules\n );\n\n if (!cssRules.has(className)) {\n let cssRule: string;\n\n if (nestedKey.startsWith(\"@\")) {\n // Media query\n cssRule = `${nestedKey} { .${className} { ${kebabProp}: ${normalizedValue}; } }`;\n } else if (nestedKey.startsWith(\"&\")) {\n // Nesting selector (e.g., &:hover, & > div)\n const selector = nestedKey.slice(1);\n cssRule = `.${className}${selector} { ${kebabProp}: ${normalizedValue}; }`;\n } else {\n // Pseudo-class/element (e.g., :hover, ::before)\n cssRule = `.${className}${nestedKey} { ${kebabProp}: ${normalizedValue}; }`;\n }\n\n cssRules.set(className, cssRule);\n }\n\n classes.push(className);\n } else {\n throw new Error(\n `Invalid nested key \"${nestedKey}\" at ${path}. Expected \"default\", a pseudo-class (\":hover\"), media query (\"@media\"), or nesting selector (\"&\").`\n );\n }\n }\n\n return classes.join(\" \");\n }\n\n const normalizedValue = normalizeValue(prop, value);\n const className = hashProperty(prop, normalizedValue, cssRules);\n\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n cssRules.set(className, cssRule);\n }\n\n return className;\n}\n\nfunction processStyleObject(\n styleObj: Record<string, any>,\n cssRules: Map<string, string>\n): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const [namespace, styles] of Object.entries(styleObj)) {\n if (typeof styles !== \"object\" || Array.isArray(styles)) {\n throw new Error(\n `Invalid style namespace \"${namespace}\": expected an object, got ${typeof styles}`\n );\n }\n\n const classes: string[] = [];\n\n for (const [prop, value] of Object.entries(styles)) {\n if (value === undefined) continue;\n\n const className = processStyleValue(\n prop,\n value,\n cssRules,\n `${namespace}.${prop}`\n );\n\n if (className) {\n classes.push(className);\n }\n }\n\n result[namespace] = classes.filter(Boolean).join(\" \");\n }\n\n return result;\n}\n\nexport function style$<const T extends Record<string, any>>(\n style: T,\n context?: MacroContext\n): MapNamespaces<T> {\n if (!context) {\n throw new Error(\n \"style$ macro requires MacroContext. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const rStyle = style as unknown as ts.Node;\n const value = context.resolveNodeValue(rStyle);\n\n if (value == undefined) {\n throw new Error(\n `Could not resolve style object at build time. ` +\n `Ensure all values are statically analyzable (no runtime expressions, dynamic imports should be inlined).`\n );\n }\n\n if (typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\n `style$ expects an object with style namespaces, got ${typeof value}`\n );\n }\n\n const cssRules = new Map<string, string>();\n const classNameMap = processStyleObject(value, cssRules);\n\n context.store.set(\"style_rules\", Array.from(cssRules.values()));\n\n const properties = Object.entries(classNameMap).map(([key, className]) =>\n context.factory.createPropertyAssignment(\n context.factory.createStringLiteral(key),\n context.factory.createStringLiteral(className)\n )\n );\n\n return context.factory.createObjectLiteralExpression(properties, true) as any;\n}\n\ntype Fragment =\n | { kind: \"static\"; value: string }\n | { kind: \"dynamic\"; expr: ts.Expression; stringSafe: boolean };\n\nexport function apply$(...c: any[]) {\n if (c.length < 1) {\n throw new Error(\"apply$ requires at least one argument plus MacroContext\");\n }\n\n const context = c.pop() as MacroContext;\n\n if (!context || !context.factory) {\n throw new Error(\n \"apply$ macro requires MacroContext as the last argument. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const args = c as ts.Expression[];\n\n if (args.length === 0) {\n return context.factory.createObjectLiteralExpression(\n [\n context.factory.createPropertyAssignment(\n context.factory.createIdentifier(\"className\"),\n context.factory.createStringLiteral(\"\")\n ),\n ],\n false\n );\n }\n\n const f = context.factory;\n\n function isTrue(e: ts.Expression): boolean {\n return e.kind === ts.SyntaxKind.TrueKeyword;\n }\n\n function isFalse(e: ts.Expression): boolean {\n return e.kind === ts.SyntaxKind.FalseKeyword;\n }\n\n function isEmptyString(e: ts.Expression): boolean {\n return ts.isStringLiteral(e) && e.text === \"\";\n }\n\n function tryResolveStatic(expr: ts.Expression): string | null {\n // Try to resolve string literals directly\n if (ts.isStringLiteral(expr)) {\n return expr.text;\n }\n\n // Try to resolve property access chains (e.g., classes.button)\n if (!ts.isPropertyAccessExpression(expr)) return null;\n\n const chain: string[] = [];\n let cur: ts.Expression = expr;\n\n while (ts.isPropertyAccessExpression(cur)) {\n chain.unshift(cur.name.text);\n cur = cur.expression;\n }\n\n if (!ts.isIdentifier(cur)) return null;\n chain.unshift(cur.text);\n\n const root = context.resolveIdentifier(f.createIdentifier(chain[0]));\n let value = context.resolveNodeValue(root);\n\n if (value == null) return null;\n\n for (let i = 1; i < chain.length; i++) {\n if (typeof value !== \"object\" || !(chain[i] in value)) {\n return null;\n }\n value = value[chain[i]];\n }\n\n return typeof value === \"string\" ? value : null;\n }\n\n function build(expr: ts.Expression): Fragment {\n // Handle empty strings\n if (isEmptyString(expr)) {\n return { kind: \"static\", value: \"\" };\n }\n\n // Try static resolution first\n const s = tryResolveStatic(expr);\n if (s != null) {\n return { kind: \"static\", value: s };\n }\n\n // Handle: condition && \"class\"\n if (\n ts.isBinaryExpression(expr) &&\n expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken\n ) {\n if (isTrue(expr.left)) return build(expr.right);\n if (isFalse(expr.left)) return { kind: \"static\", value: \"\" };\n\n const rs = tryResolveStatic(expr.right);\n if (rs != null) {\n // Optimize to: [\"\", \"class\"][+condition]\n return {\n kind: \"dynamic\",\n stringSafe: true,\n expr: f.createElementAccessExpression(\n f.createArrayLiteralExpression([\n f.createStringLiteral(\"\"),\n f.createStringLiteral(rs),\n ]),\n f.createPrefixUnaryExpression(ts.SyntaxKind.PlusToken, expr.left)\n ),\n };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n // Handle: condition ? \"a\" : \"b\"\n if (ts.isConditionalExpression(expr)) {\n if (isTrue(expr.condition)) return build(expr.whenTrue);\n if (isFalse(expr.condition)) return build(expr.whenFalse);\n\n const t = tryResolveStatic(expr.whenTrue);\n const fv = tryResolveStatic(expr.whenFalse);\n\n if (t != null && fv != null) {\n // Optimize to: [\"b\", \"a\"][+condition]\n return {\n kind: \"dynamic\",\n stringSafe: true,\n expr: f.createElementAccessExpression(\n f.createArrayLiteralExpression([\n f.createStringLiteral(fv),\n f.createStringLiteral(t),\n ]),\n f.createPrefixUnaryExpression(\n ts.SyntaxKind.PlusToken,\n expr.condition\n )\n ),\n };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n // Build and merge fragments\n const frags: Fragment[] = [];\n\n for (const arg of args) {\n const frag = build(arg);\n\n // Skip empty static values\n if (frag.kind === \"static\" && frag.value === \"\") {\n continue;\n }\n\n const last = frags[frags.length - 1];\n\n // Merge consecutive static fragments\n if (frag.kind === \"static\" && last?.kind === \"static\") {\n last.value += \" \" + frag.value;\n } else {\n frags.push(frag);\n }\n }\n\n // Generate final className expression\n let classExpr: ts.Expression;\n\n if (frags.length === 0) {\n // All classes were empty\n classExpr = f.createStringLiteral(\"\");\n } else if (frags.every((f) => f.kind === \"static\")) {\n // All static - compile to single string\n classExpr = f.createStringLiteral(\n frags\n .map((f) => f.value)\n .join(\" \")\n .trim()\n );\n } else {\n // Mixed static/dynamic - generate array.join(\" \")\n classExpr = f.createCallExpression(\n f.createPropertyAccessExpression(\n f.createArrayLiteralExpression(\n frags.map((frag) => {\n if (frag.kind === \"static\") {\n return f.createStringLiteral(frag.value);\n }\n if (frag.stringSafe) {\n return frag.expr;\n }\n // Wrap unsafe expressions in conditional: expr ? expr : \"\"\n return f.createConditionalExpression(\n frag.expr,\n undefined,\n frag.expr,\n undefined,\n f.createStringLiteral(\"\")\n );\n })\n ),\n \"join\"\n ),\n undefined,\n [f.createStringLiteral(\" \")]\n );\n }\n\n return f.createObjectLiteralExpression(\n [f.createPropertyAssignment(f.createIdentifier(\"className\"), classExpr)],\n false\n );\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport ts from \"typescript\";\n\nexport function inlineFile$(path: string, context?: MacroContext): string {\n if (!context) {\n throw new Error(\n \"style$ macro requires MacroContext. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const rPath = path as unknown as ts.Node;\n const value = context.resolveNodeValue(rPath);\n\n console.log(value);\n\n // read file\n // escape problematic characters\n\n // return file content as a string\n return context.factory.createStringLiteral(\"file.txt\") as any;\n}\n"],
5
- "mappings": "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",
6
- "names": ["className", "normalizedValue", "ts", "f"]
4
+ "sourcesContent": ["export * from \"./style\";\nexport * from \"./inline-file\";\n", "import { MacroContext } from \"@kithinji/pod\";\nimport ts from \"typescript\";\nimport { MapNamespaces } from \"./style_types\";\n\nconst UNITLESS_PROPS = new Set([\n \"z-index\",\n \"opacity\",\n \"flex-grow\",\n \"flex-shrink\",\n \"flex\",\n \"order\",\n \"font-weight\",\n \"line-height\",\n \"zoom\",\n \"column-count\",\n \"animation-iteration-count\",\n \"grid-column\",\n \"grid-row\",\n \"grid-column-start\",\n \"grid-column-end\",\n \"grid-row-start\",\n \"grid-row-end\",\n \"tab-size\",\n \"counter-increment\",\n \"counter-reset\",\n \"orphans\",\n \"widows\",\n]);\n\nconst DEV_MODE = process.env.NODE_ENV === \"development\";\n\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n return Math.abs(hash).toString(36).padStart(8, \"0\").slice(0, 8);\n}\n\nfunction hashProperty(\n prop: string,\n value: string | number,\n cssRules: Map<string, string>\n): string {\n const input = `${prop}:${value}`;\n let hash = simpleHash(input);\n let className: string;\n\n if (DEV_MODE) {\n // Add readable hint in development\n const hint = prop\n .replace(/[^a-z]/gi, \"\")\n .slice(0, 3)\n .toLowerCase();\n className = `a-${hint}-${hash}`;\n } else {\n className = `a-${hash}`;\n }\n\n let attempt = 0;\n\n // Handle hash collisions\n while (cssRules.has(className)) {\n const existing = cssRules.get(className)!;\n const kebabProp = toKebabCase(prop);\n const normalizedValue = normalizeValue(prop, value);\n const expectedRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n\n // If the existing rule matches, it's the same style (deduplication)\n if (existing.includes(`${kebabProp}: ${normalizedValue}`)) {\n break;\n }\n\n // Collision detected, rehash\n hash = simpleHash(`${input}-${++attempt}`);\n className = DEV_MODE ? `a-${prop.slice(0, 3)}-${hash}` : `a-${hash}`;\n\n if (attempt > 100) {\n throw new Error(\n `Hash collision limit exceeded for property ${prop}:${value}`\n );\n }\n }\n\n return className;\n}\n\nfunction toKebabCase(str: string): string {\n // Handle vendor prefixes (webkit, moz, ms)\n if (str.match(/^(webkit|moz|ms)[A-Z]/)) {\n return \"-\" + str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n }\n\n // Handle CSS custom properties\n if (str.startsWith(\"--\")) {\n return str;\n }\n\n return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\nfunction normalizeValue(prop: string, value: string | number): string {\n if (typeof value === \"number\") {\n const kebabProp = toKebabCase(prop);\n\n if (UNITLESS_PROPS.has(kebabProp)) {\n return String(value);\n }\n\n return `${value}px`;\n }\n\n return String(value);\n}\n\nfunction isPseudoOrMediaKey(key: string): boolean {\n return key.startsWith(\":\") || key.startsWith(\"@\") || key.startsWith(\"&\");\n}\n\nfunction validateStyleValue(value: any, path: string): void {\n if (value === null) {\n throw new Error(\n `Invalid style value at ${path}: null is not allowed. Use undefined or omit the property.`\n );\n }\n\n if (typeof value === \"function\") {\n throw new Error(\n `Invalid style value at ${path}: functions must be resolved at build time.`\n );\n }\n}\n\nfunction processStyleValue(\n prop: string,\n value: any,\n cssRules: Map<string, string>,\n path: string = prop\n): string {\n validateStyleValue(value, path);\n\n if (prop.startsWith(\"--\")) {\n const className = hashProperty(prop, value, cssRules);\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${prop}: ${value}; }`;\n cssRules.set(className, cssRule);\n }\n return className;\n }\n\n const kebabProp = toKebabCase(prop);\n\n // Handle nested objects for pseudo-classes, media queries, etc.\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const classes: string[] = [];\n\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n validateStyleValue(nestedValue, `${path}.${nestedKey}`);\n\n if (nestedKey === \"default\") {\n const normalizedValue = normalizeValue(\n prop,\n nestedValue as string | number\n );\n const className = hashProperty(prop, normalizedValue, cssRules);\n\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n cssRules.set(className, cssRule);\n }\n\n classes.push(className);\n } else if (isPseudoOrMediaKey(nestedKey)) {\n const normalizedValue = normalizeValue(\n prop,\n nestedValue as string | number\n );\n const className = hashProperty(\n `${prop}${nestedKey}`,\n normalizedValue,\n cssRules\n );\n\n if (!cssRules.has(className)) {\n let cssRule: string;\n\n if (nestedKey.startsWith(\"@\")) {\n // Media query\n cssRule = `${nestedKey} { .${className} { ${kebabProp}: ${normalizedValue}; } }`;\n } else if (nestedKey.startsWith(\"&\")) {\n // Nesting selector (e.g., &:hover, & > div)\n const selector = nestedKey.slice(1);\n cssRule = `.${className}${selector} { ${kebabProp}: ${normalizedValue}; }`;\n } else {\n // Pseudo-class/element (e.g., :hover, ::before)\n cssRule = `.${className}${nestedKey} { ${kebabProp}: ${normalizedValue}; }`;\n }\n\n cssRules.set(className, cssRule);\n }\n\n classes.push(className);\n } else {\n throw new Error(\n `Invalid nested key \"${nestedKey}\" at ${path}. Expected \"default\", a pseudo-class (\":hover\"), media query (\"@media\"), or nesting selector (\"&\").`\n );\n }\n }\n\n return classes.join(\" \");\n }\n\n const normalizedValue = normalizeValue(prop, value);\n const className = hashProperty(prop, normalizedValue, cssRules);\n\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n cssRules.set(className, cssRule);\n }\n\n return className;\n}\n\nfunction processStyleObject(\n styleObj: Record<string, any>,\n cssRules: Map<string, string>\n): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const [namespace, styles] of Object.entries(styleObj)) {\n if (typeof styles !== \"object\" || Array.isArray(styles)) {\n throw new Error(\n `Invalid style namespace \"${namespace}\": expected an object, got ${typeof styles}`\n );\n }\n\n const classes: string[] = [];\n\n for (const [prop, value] of Object.entries(styles)) {\n if (value === undefined) continue;\n\n const className = processStyleValue(\n prop,\n value,\n cssRules,\n `${namespace}.${prop}`\n );\n\n if (className) {\n classes.push(className);\n }\n }\n\n result[namespace] = classes.filter(Boolean).join(\" \");\n }\n\n return result;\n}\n\nexport function style$<const T extends Record<string, any>>(\n style: T,\n context?: MacroContext\n): MapNamespaces<T> {\n if (!context) {\n throw new Error(\n \"style$ macro requires MacroContext. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const rStyle = style as unknown as ts.Node;\n const value = context.resolveNodeValue(rStyle);\n\n if (value == undefined) {\n throw new Error(\n `Could not resolve style object at build time. ` +\n `Ensure all values are statically analyzable (no runtime expressions, dynamic imports should be inlined).`\n );\n }\n\n if (typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\n `style$ expects an object with style namespaces, got ${typeof value}`\n );\n }\n\n const cssRules = new Map<string, string>();\n const classNameMap = processStyleObject(value, cssRules);\n\n context.store.set(\"style_rules\", Array.from(cssRules.values()));\n\n const properties = Object.entries(classNameMap).map(([key, className]) =>\n context.factory.createPropertyAssignment(\n context.factory.createStringLiteral(key),\n context.factory.createStringLiteral(className)\n )\n );\n\n return context.factory.createObjectLiteralExpression(properties, true) as any;\n}\n\ntype Fragment =\n | { kind: \"static\"; value: string }\n | { kind: \"dynamic\"; expr: ts.Expression; stringSafe: boolean };\n\nexport function apply$(...c: any[]) {\n if (c.length < 1) {\n throw new Error(\"apply$ requires at least one argument plus MacroContext\");\n }\n\n const context = c.pop() as MacroContext;\n\n if (!context || !context.factory) {\n throw new Error(\n \"apply$ macro requires MacroContext as the last argument. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const args = c as ts.Expression[];\n\n if (args.length === 0) {\n return context.factory.createObjectLiteralExpression(\n [\n context.factory.createPropertyAssignment(\n context.factory.createIdentifier(\"className\"),\n context.factory.createStringLiteral(\"\")\n ),\n ],\n false\n );\n }\n\n const f = context.factory;\n\n function isTrue(e: ts.Expression): boolean {\n return e.kind === ts.SyntaxKind.TrueKeyword;\n }\n\n function isFalse(e: ts.Expression): boolean {\n return e.kind === ts.SyntaxKind.FalseKeyword;\n }\n\n function isEmptyString(e: ts.Expression): boolean {\n return ts.isStringLiteral(e) && e.text === \"\";\n }\n\n function tryResolveStatic(expr: ts.Expression): string | null {\n // Try to resolve string literals directly\n if (ts.isStringLiteral(expr)) {\n return expr.text;\n }\n\n // Try to resolve property access chains (e.g., classes.button)\n if (!ts.isPropertyAccessExpression(expr)) return null;\n\n const chain: string[] = [];\n let cur: ts.Expression = expr;\n\n while (ts.isPropertyAccessExpression(cur)) {\n chain.unshift(cur.name.text);\n cur = cur.expression;\n }\n\n if (!ts.isIdentifier(cur)) return null;\n chain.unshift(cur.text);\n\n const root = context.resolveIdentifier(f.createIdentifier(chain[0]));\n let value = context.resolveNodeValue(root);\n\n if (value == null) return null;\n\n for (let i = 1; i < chain.length; i++) {\n if (typeof value !== \"object\" || !(chain[i] in value)) {\n return null;\n }\n value = value[chain[i]];\n }\n\n return typeof value === \"string\" ? value : null;\n }\n\n function build(expr: ts.Expression): Fragment {\n // Handle empty strings\n if (isEmptyString(expr)) {\n return { kind: \"static\", value: \"\" };\n }\n\n // Try static resolution first\n const s = tryResolveStatic(expr);\n if (s != null) {\n return { kind: \"static\", value: s };\n }\n\n // Handle: condition && \"class\"\n if (\n ts.isBinaryExpression(expr) &&\n expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken\n ) {\n if (isTrue(expr.left)) return build(expr.right);\n if (isFalse(expr.left)) return { kind: \"static\", value: \"\" };\n\n const rs = tryResolveStatic(expr.right);\n if (rs != null) {\n // Optimize to: [\"\", \"class\"][+condition]\n return {\n kind: \"dynamic\",\n stringSafe: true,\n expr: f.createElementAccessExpression(\n f.createArrayLiteralExpression([\n f.createStringLiteral(\"\"),\n f.createStringLiteral(rs),\n ]),\n f.createPrefixUnaryExpression(ts.SyntaxKind.PlusToken, expr.left)\n ),\n };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n // Handle: condition ? \"a\" : \"b\"\n if (ts.isConditionalExpression(expr)) {\n if (isTrue(expr.condition)) return build(expr.whenTrue);\n if (isFalse(expr.condition)) return build(expr.whenFalse);\n\n const t = tryResolveStatic(expr.whenTrue);\n const fv = tryResolveStatic(expr.whenFalse);\n\n if (t != null && fv != null) {\n // Optimize to: [\"b\", \"a\"][+condition]\n return {\n kind: \"dynamic\",\n stringSafe: true,\n expr: f.createElementAccessExpression(\n f.createArrayLiteralExpression([\n f.createStringLiteral(fv),\n f.createStringLiteral(t),\n ]),\n f.createPrefixUnaryExpression(\n ts.SyntaxKind.PlusToken,\n expr.condition\n )\n ),\n };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n // Build and merge fragments\n const frags: Fragment[] = [];\n\n for (const arg of args) {\n const frag = build(arg);\n\n // Skip empty static values\n if (frag.kind === \"static\" && frag.value === \"\") {\n continue;\n }\n\n const last = frags[frags.length - 1];\n\n // Merge consecutive static fragments\n if (frag.kind === \"static\" && last?.kind === \"static\") {\n last.value += \" \" + frag.value;\n } else {\n frags.push(frag);\n }\n }\n\n // Generate final className expression\n let classExpr: ts.Expression;\n\n if (frags.length === 0) {\n // All classes were empty\n classExpr = f.createStringLiteral(\"\");\n } else if (frags.every((f) => f.kind === \"static\")) {\n // All static - compile to single string\n classExpr = f.createStringLiteral(\n frags\n .map((f) => f.value)\n .join(\" \")\n .trim()\n );\n } else {\n // Mixed static/dynamic - generate array.join(\" \")\n classExpr = f.createCallExpression(\n f.createPropertyAccessExpression(\n f.createArrayLiteralExpression(\n frags.map((frag) => {\n if (frag.kind === \"static\") {\n return f.createStringLiteral(frag.value);\n }\n if (frag.stringSafe) {\n return frag.expr;\n }\n // Wrap unsafe expressions in conditional: expr ? expr : \"\"\n return f.createConditionalExpression(\n frag.expr,\n undefined,\n frag.expr,\n undefined,\n f.createStringLiteral(\"\")\n );\n })\n ),\n \"join\"\n ),\n undefined,\n [f.createStringLiteral(\" \")]\n );\n }\n\n return f.createObjectLiteralExpression(\n [f.createPropertyAssignment(f.createIdentifier(\"className\"), classExpr)],\n false\n );\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport ts from \"typescript\";\nimport fs from \"fs\";\nimport path from \"path\";\n\nexport function inlineFile$(filePath: string, context?: MacroContext): string {\n if (!context) {\n throw new Error(\n \"inlineFile$ macro requires MacroContext. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const pathNode = filePath as unknown as ts.Node;\n const resolvedPath = context.resolveNodeValue(pathNode);\n\n if (typeof resolvedPath !== \"string\") {\n throw new Error(\n `inlineFile$ macro requires a string literal path, got: ${typeof resolvedPath}`\n );\n }\n\n const sourceFile = context.sourceFile;\n const sourceDir = path.dirname(sourceFile.fileName);\n const absolutePath = path.resolve(sourceDir, resolvedPath);\n\n let content: string;\n try {\n content = fs.readFileSync(absolutePath, \"utf-8\");\n } catch (error) {\n throw new Error(\n `Failed to read file \"${absolutePath}\": ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n\n return context.factory.createStringLiteral(content) as any;\n}\n\nexport function inlineFiles$(\n filePaths: string[],\n context?: MacroContext\n): string[] {\n if (!context) {\n throw new Error(\n \"inlineFiles$ macro requires MacroContext. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const pathsNode = filePaths as unknown as ts.Node;\n const resolvedPaths = context.resolveNodeValue(pathsNode);\n\n if (!Array.isArray(resolvedPaths)) {\n throw new Error(\n `inlineFiles$ macro requires an array of string literals, got: ${typeof resolvedPaths}`\n );\n }\n\n const sourceFile = context.sourceFile;\n const sourceDir = path.dirname(sourceFile.fileName);\n\n const fileContents: string[] = [];\n\n for (const filePath of resolvedPaths) {\n if (typeof filePath !== \"string\") {\n throw new Error(\n `inlineFiles$ macro requires all paths to be string literals, got: ${typeof filePath}`\n );\n }\n\n const absolutePath = path.resolve(sourceDir, filePath);\n\n try {\n const content = fs.readFileSync(absolutePath, \"utf-8\");\n fileContents.push(content);\n } catch (error) {\n throw new Error(\n `Failed to read file \"${absolutePath}\": ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n const elements = fileContents.map((content) =>\n context.factory.createStringLiteral(content)\n );\n\n return context.factory.createArrayLiteralExpression(elements, true) as any;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "className", "normalizedValue", "ts", "f", "path", "fs"]
7
7
  }
@@ -85,20 +85,20 @@ function normalizeValue(prop, value) {
85
85
  function isPseudoOrMediaKey(key) {
86
86
  return key.startsWith(":") || key.startsWith("@") || key.startsWith("&");
87
87
  }
88
- function validateStyleValue(value, path) {
88
+ function validateStyleValue(value, path2) {
89
89
  if (value === null) {
90
90
  throw new Error(
91
- `Invalid style value at ${path}: null is not allowed. Use undefined or omit the property.`
91
+ `Invalid style value at ${path2}: null is not allowed. Use undefined or omit the property.`
92
92
  );
93
93
  }
94
94
  if (typeof value === "function") {
95
95
  throw new Error(
96
- `Invalid style value at ${path}: functions must be resolved at build time.`
96
+ `Invalid style value at ${path2}: functions must be resolved at build time.`
97
97
  );
98
98
  }
99
99
  }
100
- function processStyleValue(prop, value, cssRules, path = prop) {
101
- validateStyleValue(value, path);
100
+ function processStyleValue(prop, value, cssRules, path2 = prop) {
101
+ validateStyleValue(value, path2);
102
102
  if (prop.startsWith("--")) {
103
103
  const className2 = hashProperty(prop, value, cssRules);
104
104
  if (!cssRules.has(className2)) {
@@ -111,7 +111,7 @@ function processStyleValue(prop, value, cssRules, path = prop) {
111
111
  if (typeof value === "object" && !Array.isArray(value)) {
112
112
  const classes = [];
113
113
  for (const [nestedKey, nestedValue] of Object.entries(value)) {
114
- validateStyleValue(nestedValue, `${path}.${nestedKey}`);
114
+ validateStyleValue(nestedValue, `${path2}.${nestedKey}`);
115
115
  if (nestedKey === "default") {
116
116
  const normalizedValue2 = normalizeValue(
117
117
  prop,
@@ -148,7 +148,7 @@ function processStyleValue(prop, value, cssRules, path = prop) {
148
148
  classes.push(className2);
149
149
  } else {
150
150
  throw new Error(
151
- `Invalid nested key "${nestedKey}" at ${path}. Expected "default", a pseudo-class (":hover"), media query ("@media"), or nesting selector ("&").`
151
+ `Invalid nested key "${nestedKey}" at ${path2}. Expected "default", a pseudo-class (":hover"), media query ("@media"), or nesting selector ("&").`
152
152
  );
153
153
  }
154
154
  }
@@ -377,20 +377,75 @@ function apply$(...c) {
377
377
  }
378
378
 
379
379
  // src/inline-file/inline.ts
380
- function inlineFile$(path, context) {
380
+ import fs from "fs";
381
+ import path from "path";
382
+ function inlineFile$(filePath, context) {
381
383
  if (!context) {
382
384
  throw new Error(
383
- "style$ macro requires MacroContext. Ensure you're using this as a build-time macro."
385
+ "inlineFile$ macro requires MacroContext. Ensure you're using this as a build-time macro."
386
+ );
387
+ }
388
+ const pathNode = filePath;
389
+ const resolvedPath = context.resolveNodeValue(pathNode);
390
+ if (typeof resolvedPath !== "string") {
391
+ throw new Error(
392
+ `inlineFile$ macro requires a string literal path, got: ${typeof resolvedPath}`
393
+ );
394
+ }
395
+ const sourceFile = context.sourceFile;
396
+ const sourceDir = path.dirname(sourceFile.fileName);
397
+ const absolutePath = path.resolve(sourceDir, resolvedPath);
398
+ let content;
399
+ try {
400
+ content = fs.readFileSync(absolutePath, "utf-8");
401
+ } catch (error) {
402
+ throw new Error(
403
+ `Failed to read file "${absolutePath}": ${error instanceof Error ? error.message : String(error)}`
404
+ );
405
+ }
406
+ return context.factory.createStringLiteral(content);
407
+ }
408
+ function inlineFiles$(filePaths, context) {
409
+ if (!context) {
410
+ throw new Error(
411
+ "inlineFiles$ macro requires MacroContext. Ensure you're using this as a build-time macro."
384
412
  );
385
413
  }
386
- const rPath = path;
387
- const value = context.resolveNodeValue(rPath);
388
- console.log(value);
389
- return context.factory.createStringLiteral("file.txt");
414
+ const pathsNode = filePaths;
415
+ const resolvedPaths = context.resolveNodeValue(pathsNode);
416
+ if (!Array.isArray(resolvedPaths)) {
417
+ throw new Error(
418
+ `inlineFiles$ macro requires an array of string literals, got: ${typeof resolvedPaths}`
419
+ );
420
+ }
421
+ const sourceFile = context.sourceFile;
422
+ const sourceDir = path.dirname(sourceFile.fileName);
423
+ const fileContents = [];
424
+ for (const filePath of resolvedPaths) {
425
+ if (typeof filePath !== "string") {
426
+ throw new Error(
427
+ `inlineFiles$ macro requires all paths to be string literals, got: ${typeof filePath}`
428
+ );
429
+ }
430
+ const absolutePath = path.resolve(sourceDir, filePath);
431
+ try {
432
+ const content = fs.readFileSync(absolutePath, "utf-8");
433
+ fileContents.push(content);
434
+ } catch (error) {
435
+ throw new Error(
436
+ `Failed to read file "${absolutePath}": ${error instanceof Error ? error.message : String(error)}`
437
+ );
438
+ }
439
+ }
440
+ const elements = fileContents.map(
441
+ (content) => context.factory.createStringLiteral(content)
442
+ );
443
+ return context.factory.createArrayLiteralExpression(elements, true);
390
444
  }
391
445
  export {
392
446
  apply$,
393
447
  inlineFile$,
448
+ inlineFiles$,
394
449
  style$
395
450
  };
396
451
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/style/style.ts", "../../src/inline-file/inline.ts"],
4
- "sourcesContent": ["import { MacroContext } from \"@kithinji/pod\";\nimport ts from \"typescript\";\nimport { MapNamespaces } from \"./style_types\";\n\nconst UNITLESS_PROPS = new Set([\n \"z-index\",\n \"opacity\",\n \"flex-grow\",\n \"flex-shrink\",\n \"flex\",\n \"order\",\n \"font-weight\",\n \"line-height\",\n \"zoom\",\n \"column-count\",\n \"animation-iteration-count\",\n \"grid-column\",\n \"grid-row\",\n \"grid-column-start\",\n \"grid-column-end\",\n \"grid-row-start\",\n \"grid-row-end\",\n \"tab-size\",\n \"counter-increment\",\n \"counter-reset\",\n \"orphans\",\n \"widows\",\n]);\n\nconst DEV_MODE = process.env.NODE_ENV === \"development\";\n\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n return Math.abs(hash).toString(36).padStart(8, \"0\").slice(0, 8);\n}\n\nfunction hashProperty(\n prop: string,\n value: string | number,\n cssRules: Map<string, string>\n): string {\n const input = `${prop}:${value}`;\n let hash = simpleHash(input);\n let className: string;\n\n if (DEV_MODE) {\n // Add readable hint in development\n const hint = prop\n .replace(/[^a-z]/gi, \"\")\n .slice(0, 3)\n .toLowerCase();\n className = `a-${hint}-${hash}`;\n } else {\n className = `a-${hash}`;\n }\n\n let attempt = 0;\n\n // Handle hash collisions\n while (cssRules.has(className)) {\n const existing = cssRules.get(className)!;\n const kebabProp = toKebabCase(prop);\n const normalizedValue = normalizeValue(prop, value);\n const expectedRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n\n // If the existing rule matches, it's the same style (deduplication)\n if (existing.includes(`${kebabProp}: ${normalizedValue}`)) {\n break;\n }\n\n // Collision detected, rehash\n hash = simpleHash(`${input}-${++attempt}`);\n className = DEV_MODE ? `a-${prop.slice(0, 3)}-${hash}` : `a-${hash}`;\n\n if (attempt > 100) {\n throw new Error(\n `Hash collision limit exceeded for property ${prop}:${value}`\n );\n }\n }\n\n return className;\n}\n\nfunction toKebabCase(str: string): string {\n // Handle vendor prefixes (webkit, moz, ms)\n if (str.match(/^(webkit|moz|ms)[A-Z]/)) {\n return \"-\" + str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n }\n\n // Handle CSS custom properties\n if (str.startsWith(\"--\")) {\n return str;\n }\n\n return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\nfunction normalizeValue(prop: string, value: string | number): string {\n if (typeof value === \"number\") {\n const kebabProp = toKebabCase(prop);\n\n if (UNITLESS_PROPS.has(kebabProp)) {\n return String(value);\n }\n\n return `${value}px`;\n }\n\n return String(value);\n}\n\nfunction isPseudoOrMediaKey(key: string): boolean {\n return key.startsWith(\":\") || key.startsWith(\"@\") || key.startsWith(\"&\");\n}\n\nfunction validateStyleValue(value: any, path: string): void {\n if (value === null) {\n throw new Error(\n `Invalid style value at ${path}: null is not allowed. Use undefined or omit the property.`\n );\n }\n\n if (typeof value === \"function\") {\n throw new Error(\n `Invalid style value at ${path}: functions must be resolved at build time.`\n );\n }\n}\n\nfunction processStyleValue(\n prop: string,\n value: any,\n cssRules: Map<string, string>,\n path: string = prop\n): string {\n validateStyleValue(value, path);\n\n if (prop.startsWith(\"--\")) {\n const className = hashProperty(prop, value, cssRules);\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${prop}: ${value}; }`;\n cssRules.set(className, cssRule);\n }\n return className;\n }\n\n const kebabProp = toKebabCase(prop);\n\n // Handle nested objects for pseudo-classes, media queries, etc.\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const classes: string[] = [];\n\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n validateStyleValue(nestedValue, `${path}.${nestedKey}`);\n\n if (nestedKey === \"default\") {\n const normalizedValue = normalizeValue(\n prop,\n nestedValue as string | number\n );\n const className = hashProperty(prop, normalizedValue, cssRules);\n\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n cssRules.set(className, cssRule);\n }\n\n classes.push(className);\n } else if (isPseudoOrMediaKey(nestedKey)) {\n const normalizedValue = normalizeValue(\n prop,\n nestedValue as string | number\n );\n const className = hashProperty(\n `${prop}${nestedKey}`,\n normalizedValue,\n cssRules\n );\n\n if (!cssRules.has(className)) {\n let cssRule: string;\n\n if (nestedKey.startsWith(\"@\")) {\n // Media query\n cssRule = `${nestedKey} { .${className} { ${kebabProp}: ${normalizedValue}; } }`;\n } else if (nestedKey.startsWith(\"&\")) {\n // Nesting selector (e.g., &:hover, & > div)\n const selector = nestedKey.slice(1);\n cssRule = `.${className}${selector} { ${kebabProp}: ${normalizedValue}; }`;\n } else {\n // Pseudo-class/element (e.g., :hover, ::before)\n cssRule = `.${className}${nestedKey} { ${kebabProp}: ${normalizedValue}; }`;\n }\n\n cssRules.set(className, cssRule);\n }\n\n classes.push(className);\n } else {\n throw new Error(\n `Invalid nested key \"${nestedKey}\" at ${path}. Expected \"default\", a pseudo-class (\":hover\"), media query (\"@media\"), or nesting selector (\"&\").`\n );\n }\n }\n\n return classes.join(\" \");\n }\n\n const normalizedValue = normalizeValue(prop, value);\n const className = hashProperty(prop, normalizedValue, cssRules);\n\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n cssRules.set(className, cssRule);\n }\n\n return className;\n}\n\nfunction processStyleObject(\n styleObj: Record<string, any>,\n cssRules: Map<string, string>\n): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const [namespace, styles] of Object.entries(styleObj)) {\n if (typeof styles !== \"object\" || Array.isArray(styles)) {\n throw new Error(\n `Invalid style namespace \"${namespace}\": expected an object, got ${typeof styles}`\n );\n }\n\n const classes: string[] = [];\n\n for (const [prop, value] of Object.entries(styles)) {\n if (value === undefined) continue;\n\n const className = processStyleValue(\n prop,\n value,\n cssRules,\n `${namespace}.${prop}`\n );\n\n if (className) {\n classes.push(className);\n }\n }\n\n result[namespace] = classes.filter(Boolean).join(\" \");\n }\n\n return result;\n}\n\nexport function style$<const T extends Record<string, any>>(\n style: T,\n context?: MacroContext\n): MapNamespaces<T> {\n if (!context) {\n throw new Error(\n \"style$ macro requires MacroContext. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const rStyle = style as unknown as ts.Node;\n const value = context.resolveNodeValue(rStyle);\n\n if (value == undefined) {\n throw new Error(\n `Could not resolve style object at build time. ` +\n `Ensure all values are statically analyzable (no runtime expressions, dynamic imports should be inlined).`\n );\n }\n\n if (typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\n `style$ expects an object with style namespaces, got ${typeof value}`\n );\n }\n\n const cssRules = new Map<string, string>();\n const classNameMap = processStyleObject(value, cssRules);\n\n context.store.set(\"style_rules\", Array.from(cssRules.values()));\n\n const properties = Object.entries(classNameMap).map(([key, className]) =>\n context.factory.createPropertyAssignment(\n context.factory.createStringLiteral(key),\n context.factory.createStringLiteral(className)\n )\n );\n\n return context.factory.createObjectLiteralExpression(properties, true) as any;\n}\n\ntype Fragment =\n | { kind: \"static\"; value: string }\n | { kind: \"dynamic\"; expr: ts.Expression; stringSafe: boolean };\n\nexport function apply$(...c: any[]) {\n if (c.length < 1) {\n throw new Error(\"apply$ requires at least one argument plus MacroContext\");\n }\n\n const context = c.pop() as MacroContext;\n\n if (!context || !context.factory) {\n throw new Error(\n \"apply$ macro requires MacroContext as the last argument. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const args = c as ts.Expression[];\n\n if (args.length === 0) {\n return context.factory.createObjectLiteralExpression(\n [\n context.factory.createPropertyAssignment(\n context.factory.createIdentifier(\"className\"),\n context.factory.createStringLiteral(\"\")\n ),\n ],\n false\n );\n }\n\n const f = context.factory;\n\n function isTrue(e: ts.Expression): boolean {\n return e.kind === ts.SyntaxKind.TrueKeyword;\n }\n\n function isFalse(e: ts.Expression): boolean {\n return e.kind === ts.SyntaxKind.FalseKeyword;\n }\n\n function isEmptyString(e: ts.Expression): boolean {\n return ts.isStringLiteral(e) && e.text === \"\";\n }\n\n function tryResolveStatic(expr: ts.Expression): string | null {\n // Try to resolve string literals directly\n if (ts.isStringLiteral(expr)) {\n return expr.text;\n }\n\n // Try to resolve property access chains (e.g., classes.button)\n if (!ts.isPropertyAccessExpression(expr)) return null;\n\n const chain: string[] = [];\n let cur: ts.Expression = expr;\n\n while (ts.isPropertyAccessExpression(cur)) {\n chain.unshift(cur.name.text);\n cur = cur.expression;\n }\n\n if (!ts.isIdentifier(cur)) return null;\n chain.unshift(cur.text);\n\n const root = context.resolveIdentifier(f.createIdentifier(chain[0]));\n let value = context.resolveNodeValue(root);\n\n if (value == null) return null;\n\n for (let i = 1; i < chain.length; i++) {\n if (typeof value !== \"object\" || !(chain[i] in value)) {\n return null;\n }\n value = value[chain[i]];\n }\n\n return typeof value === \"string\" ? value : null;\n }\n\n function build(expr: ts.Expression): Fragment {\n // Handle empty strings\n if (isEmptyString(expr)) {\n return { kind: \"static\", value: \"\" };\n }\n\n // Try static resolution first\n const s = tryResolveStatic(expr);\n if (s != null) {\n return { kind: \"static\", value: s };\n }\n\n // Handle: condition && \"class\"\n if (\n ts.isBinaryExpression(expr) &&\n expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken\n ) {\n if (isTrue(expr.left)) return build(expr.right);\n if (isFalse(expr.left)) return { kind: \"static\", value: \"\" };\n\n const rs = tryResolveStatic(expr.right);\n if (rs != null) {\n // Optimize to: [\"\", \"class\"][+condition]\n return {\n kind: \"dynamic\",\n stringSafe: true,\n expr: f.createElementAccessExpression(\n f.createArrayLiteralExpression([\n f.createStringLiteral(\"\"),\n f.createStringLiteral(rs),\n ]),\n f.createPrefixUnaryExpression(ts.SyntaxKind.PlusToken, expr.left)\n ),\n };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n // Handle: condition ? \"a\" : \"b\"\n if (ts.isConditionalExpression(expr)) {\n if (isTrue(expr.condition)) return build(expr.whenTrue);\n if (isFalse(expr.condition)) return build(expr.whenFalse);\n\n const t = tryResolveStatic(expr.whenTrue);\n const fv = tryResolveStatic(expr.whenFalse);\n\n if (t != null && fv != null) {\n // Optimize to: [\"b\", \"a\"][+condition]\n return {\n kind: \"dynamic\",\n stringSafe: true,\n expr: f.createElementAccessExpression(\n f.createArrayLiteralExpression([\n f.createStringLiteral(fv),\n f.createStringLiteral(t),\n ]),\n f.createPrefixUnaryExpression(\n ts.SyntaxKind.PlusToken,\n expr.condition\n )\n ),\n };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n // Build and merge fragments\n const frags: Fragment[] = [];\n\n for (const arg of args) {\n const frag = build(arg);\n\n // Skip empty static values\n if (frag.kind === \"static\" && frag.value === \"\") {\n continue;\n }\n\n const last = frags[frags.length - 1];\n\n // Merge consecutive static fragments\n if (frag.kind === \"static\" && last?.kind === \"static\") {\n last.value += \" \" + frag.value;\n } else {\n frags.push(frag);\n }\n }\n\n // Generate final className expression\n let classExpr: ts.Expression;\n\n if (frags.length === 0) {\n // All classes were empty\n classExpr = f.createStringLiteral(\"\");\n } else if (frags.every((f) => f.kind === \"static\")) {\n // All static - compile to single string\n classExpr = f.createStringLiteral(\n frags\n .map((f) => f.value)\n .join(\" \")\n .trim()\n );\n } else {\n // Mixed static/dynamic - generate array.join(\" \")\n classExpr = f.createCallExpression(\n f.createPropertyAccessExpression(\n f.createArrayLiteralExpression(\n frags.map((frag) => {\n if (frag.kind === \"static\") {\n return f.createStringLiteral(frag.value);\n }\n if (frag.stringSafe) {\n return frag.expr;\n }\n // Wrap unsafe expressions in conditional: expr ? expr : \"\"\n return f.createConditionalExpression(\n frag.expr,\n undefined,\n frag.expr,\n undefined,\n f.createStringLiteral(\"\")\n );\n })\n ),\n \"join\"\n ),\n undefined,\n [f.createStringLiteral(\" \")]\n );\n }\n\n return f.createObjectLiteralExpression(\n [f.createPropertyAssignment(f.createIdentifier(\"className\"), classExpr)],\n false\n );\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport ts from \"typescript\";\n\nexport function inlineFile$(path: string, context?: MacroContext): string {\n if (!context) {\n throw new Error(\n \"style$ macro requires MacroContext. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const rPath = path as unknown as ts.Node;\n const value = context.resolveNodeValue(rPath);\n\n console.log(value);\n\n // read file\n // escape problematic characters\n\n // return file content as a string\n return context.factory.createStringLiteral(\"file.txt\") as any;\n}\n"],
5
- "mappings": "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",
6
- "names": ["className", "normalizedValue", "f"]
4
+ "sourcesContent": ["import { MacroContext } from \"@kithinji/pod\";\nimport ts from \"typescript\";\nimport { MapNamespaces } from \"./style_types\";\n\nconst UNITLESS_PROPS = new Set([\n \"z-index\",\n \"opacity\",\n \"flex-grow\",\n \"flex-shrink\",\n \"flex\",\n \"order\",\n \"font-weight\",\n \"line-height\",\n \"zoom\",\n \"column-count\",\n \"animation-iteration-count\",\n \"grid-column\",\n \"grid-row\",\n \"grid-column-start\",\n \"grid-column-end\",\n \"grid-row-start\",\n \"grid-row-end\",\n \"tab-size\",\n \"counter-increment\",\n \"counter-reset\",\n \"orphans\",\n \"widows\",\n]);\n\nconst DEV_MODE = process.env.NODE_ENV === \"development\";\n\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n return Math.abs(hash).toString(36).padStart(8, \"0\").slice(0, 8);\n}\n\nfunction hashProperty(\n prop: string,\n value: string | number,\n cssRules: Map<string, string>\n): string {\n const input = `${prop}:${value}`;\n let hash = simpleHash(input);\n let className: string;\n\n if (DEV_MODE) {\n // Add readable hint in development\n const hint = prop\n .replace(/[^a-z]/gi, \"\")\n .slice(0, 3)\n .toLowerCase();\n className = `a-${hint}-${hash}`;\n } else {\n className = `a-${hash}`;\n }\n\n let attempt = 0;\n\n // Handle hash collisions\n while (cssRules.has(className)) {\n const existing = cssRules.get(className)!;\n const kebabProp = toKebabCase(prop);\n const normalizedValue = normalizeValue(prop, value);\n const expectedRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n\n // If the existing rule matches, it's the same style (deduplication)\n if (existing.includes(`${kebabProp}: ${normalizedValue}`)) {\n break;\n }\n\n // Collision detected, rehash\n hash = simpleHash(`${input}-${++attempt}`);\n className = DEV_MODE ? `a-${prop.slice(0, 3)}-${hash}` : `a-${hash}`;\n\n if (attempt > 100) {\n throw new Error(\n `Hash collision limit exceeded for property ${prop}:${value}`\n );\n }\n }\n\n return className;\n}\n\nfunction toKebabCase(str: string): string {\n // Handle vendor prefixes (webkit, moz, ms)\n if (str.match(/^(webkit|moz|ms)[A-Z]/)) {\n return \"-\" + str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n }\n\n // Handle CSS custom properties\n if (str.startsWith(\"--\")) {\n return str;\n }\n\n return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n}\n\nfunction normalizeValue(prop: string, value: string | number): string {\n if (typeof value === \"number\") {\n const kebabProp = toKebabCase(prop);\n\n if (UNITLESS_PROPS.has(kebabProp)) {\n return String(value);\n }\n\n return `${value}px`;\n }\n\n return String(value);\n}\n\nfunction isPseudoOrMediaKey(key: string): boolean {\n return key.startsWith(\":\") || key.startsWith(\"@\") || key.startsWith(\"&\");\n}\n\nfunction validateStyleValue(value: any, path: string): void {\n if (value === null) {\n throw new Error(\n `Invalid style value at ${path}: null is not allowed. Use undefined or omit the property.`\n );\n }\n\n if (typeof value === \"function\") {\n throw new Error(\n `Invalid style value at ${path}: functions must be resolved at build time.`\n );\n }\n}\n\nfunction processStyleValue(\n prop: string,\n value: any,\n cssRules: Map<string, string>,\n path: string = prop\n): string {\n validateStyleValue(value, path);\n\n if (prop.startsWith(\"--\")) {\n const className = hashProperty(prop, value, cssRules);\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${prop}: ${value}; }`;\n cssRules.set(className, cssRule);\n }\n return className;\n }\n\n const kebabProp = toKebabCase(prop);\n\n // Handle nested objects for pseudo-classes, media queries, etc.\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const classes: string[] = [];\n\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n validateStyleValue(nestedValue, `${path}.${nestedKey}`);\n\n if (nestedKey === \"default\") {\n const normalizedValue = normalizeValue(\n prop,\n nestedValue as string | number\n );\n const className = hashProperty(prop, normalizedValue, cssRules);\n\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n cssRules.set(className, cssRule);\n }\n\n classes.push(className);\n } else if (isPseudoOrMediaKey(nestedKey)) {\n const normalizedValue = normalizeValue(\n prop,\n nestedValue as string | number\n );\n const className = hashProperty(\n `${prop}${nestedKey}`,\n normalizedValue,\n cssRules\n );\n\n if (!cssRules.has(className)) {\n let cssRule: string;\n\n if (nestedKey.startsWith(\"@\")) {\n // Media query\n cssRule = `${nestedKey} { .${className} { ${kebabProp}: ${normalizedValue}; } }`;\n } else if (nestedKey.startsWith(\"&\")) {\n // Nesting selector (e.g., &:hover, & > div)\n const selector = nestedKey.slice(1);\n cssRule = `.${className}${selector} { ${kebabProp}: ${normalizedValue}; }`;\n } else {\n // Pseudo-class/element (e.g., :hover, ::before)\n cssRule = `.${className}${nestedKey} { ${kebabProp}: ${normalizedValue}; }`;\n }\n\n cssRules.set(className, cssRule);\n }\n\n classes.push(className);\n } else {\n throw new Error(\n `Invalid nested key \"${nestedKey}\" at ${path}. Expected \"default\", a pseudo-class (\":hover\"), media query (\"@media\"), or nesting selector (\"&\").`\n );\n }\n }\n\n return classes.join(\" \");\n }\n\n const normalizedValue = normalizeValue(prop, value);\n const className = hashProperty(prop, normalizedValue, cssRules);\n\n if (!cssRules.has(className)) {\n const cssRule = `.${className} { ${kebabProp}: ${normalizedValue}; }`;\n cssRules.set(className, cssRule);\n }\n\n return className;\n}\n\nfunction processStyleObject(\n styleObj: Record<string, any>,\n cssRules: Map<string, string>\n): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const [namespace, styles] of Object.entries(styleObj)) {\n if (typeof styles !== \"object\" || Array.isArray(styles)) {\n throw new Error(\n `Invalid style namespace \"${namespace}\": expected an object, got ${typeof styles}`\n );\n }\n\n const classes: string[] = [];\n\n for (const [prop, value] of Object.entries(styles)) {\n if (value === undefined) continue;\n\n const className = processStyleValue(\n prop,\n value,\n cssRules,\n `${namespace}.${prop}`\n );\n\n if (className) {\n classes.push(className);\n }\n }\n\n result[namespace] = classes.filter(Boolean).join(\" \");\n }\n\n return result;\n}\n\nexport function style$<const T extends Record<string, any>>(\n style: T,\n context?: MacroContext\n): MapNamespaces<T> {\n if (!context) {\n throw new Error(\n \"style$ macro requires MacroContext. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const rStyle = style as unknown as ts.Node;\n const value = context.resolveNodeValue(rStyle);\n\n if (value == undefined) {\n throw new Error(\n `Could not resolve style object at build time. ` +\n `Ensure all values are statically analyzable (no runtime expressions, dynamic imports should be inlined).`\n );\n }\n\n if (typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\n `style$ expects an object with style namespaces, got ${typeof value}`\n );\n }\n\n const cssRules = new Map<string, string>();\n const classNameMap = processStyleObject(value, cssRules);\n\n context.store.set(\"style_rules\", Array.from(cssRules.values()));\n\n const properties = Object.entries(classNameMap).map(([key, className]) =>\n context.factory.createPropertyAssignment(\n context.factory.createStringLiteral(key),\n context.factory.createStringLiteral(className)\n )\n );\n\n return context.factory.createObjectLiteralExpression(properties, true) as any;\n}\n\ntype Fragment =\n | { kind: \"static\"; value: string }\n | { kind: \"dynamic\"; expr: ts.Expression; stringSafe: boolean };\n\nexport function apply$(...c: any[]) {\n if (c.length < 1) {\n throw new Error(\"apply$ requires at least one argument plus MacroContext\");\n }\n\n const context = c.pop() as MacroContext;\n\n if (!context || !context.factory) {\n throw new Error(\n \"apply$ macro requires MacroContext as the last argument. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const args = c as ts.Expression[];\n\n if (args.length === 0) {\n return context.factory.createObjectLiteralExpression(\n [\n context.factory.createPropertyAssignment(\n context.factory.createIdentifier(\"className\"),\n context.factory.createStringLiteral(\"\")\n ),\n ],\n false\n );\n }\n\n const f = context.factory;\n\n function isTrue(e: ts.Expression): boolean {\n return e.kind === ts.SyntaxKind.TrueKeyword;\n }\n\n function isFalse(e: ts.Expression): boolean {\n return e.kind === ts.SyntaxKind.FalseKeyword;\n }\n\n function isEmptyString(e: ts.Expression): boolean {\n return ts.isStringLiteral(e) && e.text === \"\";\n }\n\n function tryResolveStatic(expr: ts.Expression): string | null {\n // Try to resolve string literals directly\n if (ts.isStringLiteral(expr)) {\n return expr.text;\n }\n\n // Try to resolve property access chains (e.g., classes.button)\n if (!ts.isPropertyAccessExpression(expr)) return null;\n\n const chain: string[] = [];\n let cur: ts.Expression = expr;\n\n while (ts.isPropertyAccessExpression(cur)) {\n chain.unshift(cur.name.text);\n cur = cur.expression;\n }\n\n if (!ts.isIdentifier(cur)) return null;\n chain.unshift(cur.text);\n\n const root = context.resolveIdentifier(f.createIdentifier(chain[0]));\n let value = context.resolveNodeValue(root);\n\n if (value == null) return null;\n\n for (let i = 1; i < chain.length; i++) {\n if (typeof value !== \"object\" || !(chain[i] in value)) {\n return null;\n }\n value = value[chain[i]];\n }\n\n return typeof value === \"string\" ? value : null;\n }\n\n function build(expr: ts.Expression): Fragment {\n // Handle empty strings\n if (isEmptyString(expr)) {\n return { kind: \"static\", value: \"\" };\n }\n\n // Try static resolution first\n const s = tryResolveStatic(expr);\n if (s != null) {\n return { kind: \"static\", value: s };\n }\n\n // Handle: condition && \"class\"\n if (\n ts.isBinaryExpression(expr) &&\n expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken\n ) {\n if (isTrue(expr.left)) return build(expr.right);\n if (isFalse(expr.left)) return { kind: \"static\", value: \"\" };\n\n const rs = tryResolveStatic(expr.right);\n if (rs != null) {\n // Optimize to: [\"\", \"class\"][+condition]\n return {\n kind: \"dynamic\",\n stringSafe: true,\n expr: f.createElementAccessExpression(\n f.createArrayLiteralExpression([\n f.createStringLiteral(\"\"),\n f.createStringLiteral(rs),\n ]),\n f.createPrefixUnaryExpression(ts.SyntaxKind.PlusToken, expr.left)\n ),\n };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n // Handle: condition ? \"a\" : \"b\"\n if (ts.isConditionalExpression(expr)) {\n if (isTrue(expr.condition)) return build(expr.whenTrue);\n if (isFalse(expr.condition)) return build(expr.whenFalse);\n\n const t = tryResolveStatic(expr.whenTrue);\n const fv = tryResolveStatic(expr.whenFalse);\n\n if (t != null && fv != null) {\n // Optimize to: [\"b\", \"a\"][+condition]\n return {\n kind: \"dynamic\",\n stringSafe: true,\n expr: f.createElementAccessExpression(\n f.createArrayLiteralExpression([\n f.createStringLiteral(fv),\n f.createStringLiteral(t),\n ]),\n f.createPrefixUnaryExpression(\n ts.SyntaxKind.PlusToken,\n expr.condition\n )\n ),\n };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n return { kind: \"dynamic\", expr, stringSafe: false };\n }\n\n // Build and merge fragments\n const frags: Fragment[] = [];\n\n for (const arg of args) {\n const frag = build(arg);\n\n // Skip empty static values\n if (frag.kind === \"static\" && frag.value === \"\") {\n continue;\n }\n\n const last = frags[frags.length - 1];\n\n // Merge consecutive static fragments\n if (frag.kind === \"static\" && last?.kind === \"static\") {\n last.value += \" \" + frag.value;\n } else {\n frags.push(frag);\n }\n }\n\n // Generate final className expression\n let classExpr: ts.Expression;\n\n if (frags.length === 0) {\n // All classes were empty\n classExpr = f.createStringLiteral(\"\");\n } else if (frags.every((f) => f.kind === \"static\")) {\n // All static - compile to single string\n classExpr = f.createStringLiteral(\n frags\n .map((f) => f.value)\n .join(\" \")\n .trim()\n );\n } else {\n // Mixed static/dynamic - generate array.join(\" \")\n classExpr = f.createCallExpression(\n f.createPropertyAccessExpression(\n f.createArrayLiteralExpression(\n frags.map((frag) => {\n if (frag.kind === \"static\") {\n return f.createStringLiteral(frag.value);\n }\n if (frag.stringSafe) {\n return frag.expr;\n }\n // Wrap unsafe expressions in conditional: expr ? expr : \"\"\n return f.createConditionalExpression(\n frag.expr,\n undefined,\n frag.expr,\n undefined,\n f.createStringLiteral(\"\")\n );\n })\n ),\n \"join\"\n ),\n undefined,\n [f.createStringLiteral(\" \")]\n );\n }\n\n return f.createObjectLiteralExpression(\n [f.createPropertyAssignment(f.createIdentifier(\"className\"), classExpr)],\n false\n );\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport ts from \"typescript\";\nimport fs from \"fs\";\nimport path from \"path\";\n\nexport function inlineFile$(filePath: string, context?: MacroContext): string {\n if (!context) {\n throw new Error(\n \"inlineFile$ macro requires MacroContext. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const pathNode = filePath as unknown as ts.Node;\n const resolvedPath = context.resolveNodeValue(pathNode);\n\n if (typeof resolvedPath !== \"string\") {\n throw new Error(\n `inlineFile$ macro requires a string literal path, got: ${typeof resolvedPath}`\n );\n }\n\n const sourceFile = context.sourceFile;\n const sourceDir = path.dirname(sourceFile.fileName);\n const absolutePath = path.resolve(sourceDir, resolvedPath);\n\n let content: string;\n try {\n content = fs.readFileSync(absolutePath, \"utf-8\");\n } catch (error) {\n throw new Error(\n `Failed to read file \"${absolutePath}\": ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n\n return context.factory.createStringLiteral(content) as any;\n}\n\nexport function inlineFiles$(\n filePaths: string[],\n context?: MacroContext\n): string[] {\n if (!context) {\n throw new Error(\n \"inlineFiles$ macro requires MacroContext. Ensure you're using this as a build-time macro.\"\n );\n }\n\n const pathsNode = filePaths as unknown as ts.Node;\n const resolvedPaths = context.resolveNodeValue(pathsNode);\n\n if (!Array.isArray(resolvedPaths)) {\n throw new Error(\n `inlineFiles$ macro requires an array of string literals, got: ${typeof resolvedPaths}`\n );\n }\n\n const sourceFile = context.sourceFile;\n const sourceDir = path.dirname(sourceFile.fileName);\n\n const fileContents: string[] = [];\n\n for (const filePath of resolvedPaths) {\n if (typeof filePath !== \"string\") {\n throw new Error(\n `inlineFiles$ macro requires all paths to be string literals, got: ${typeof filePath}`\n );\n }\n\n const absolutePath = path.resolve(sourceDir, filePath);\n\n try {\n const content = fs.readFileSync(absolutePath, \"utf-8\");\n fileContents.push(content);\n } catch (error) {\n throw new Error(\n `Failed to read file \"${absolutePath}\": ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n const elements = fileContents.map((content) =>\n context.factory.createStringLiteral(content)\n );\n\n return context.factory.createArrayLiteralExpression(elements, true) as any;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "className", "normalizedValue", "f"]
7
7
  }
@@ -1,3 +1,4 @@
1
1
  import { MacroContext } from "@kithinji/pod";
2
- export declare function inlineFile$(path: string, context?: MacroContext): string;
2
+ export declare function inlineFile$(filePath: string, context?: MacroContext): string;
3
+ export declare function inlineFiles$(filePaths: string[], context?: MacroContext): string[];
3
4
  //# sourceMappingURL=inline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"inline.d.ts","sourceRoot":"","sources":["../../../src/inline-file/inline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAiBxE"}
1
+ {"version":3,"file":"inline.d.ts","sourceRoot":"","sources":["../../../src/inline-file/inline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAK7C,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAgC5E;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,MAAM,EAAE,CA+CV"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kithinji/arcane",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -1,21 +1,90 @@
1
1
  import { MacroContext } from "@kithinji/pod";
2
2
  import ts from "typescript";
3
+ import fs from "fs";
4
+ import path from "path";
3
5
 
4
- export function inlineFile$(path: string, context?: MacroContext): string {
6
+ export function inlineFile$(filePath: string, context?: MacroContext): string {
5
7
  if (!context) {
6
8
  throw new Error(
7
- "style$ macro requires MacroContext. Ensure you're using this as a build-time macro."
9
+ "inlineFile$ macro requires MacroContext. Ensure you're using this as a build-time macro."
8
10
  );
9
11
  }
10
12
 
11
- const rPath = path as unknown as ts.Node;
12
- const value = context.resolveNodeValue(rPath);
13
+ const pathNode = filePath as unknown as ts.Node;
14
+ const resolvedPath = context.resolveNodeValue(pathNode);
13
15
 
14
- console.log(value);
16
+ if (typeof resolvedPath !== "string") {
17
+ throw new Error(
18
+ `inlineFile$ macro requires a string literal path, got: ${typeof resolvedPath}`
19
+ );
20
+ }
21
+
22
+ const sourceFile = context.sourceFile;
23
+ const sourceDir = path.dirname(sourceFile.fileName);
24
+ const absolutePath = path.resolve(sourceDir, resolvedPath);
25
+
26
+ let content: string;
27
+ try {
28
+ content = fs.readFileSync(absolutePath, "utf-8");
29
+ } catch (error) {
30
+ throw new Error(
31
+ `Failed to read file "${absolutePath}": ${
32
+ error instanceof Error ? error.message : String(error)
33
+ }`
34
+ );
35
+ }
36
+
37
+ return context.factory.createStringLiteral(content) as any;
38
+ }
39
+
40
+ export function inlineFiles$(
41
+ filePaths: string[],
42
+ context?: MacroContext
43
+ ): string[] {
44
+ if (!context) {
45
+ throw new Error(
46
+ "inlineFiles$ macro requires MacroContext. Ensure you're using this as a build-time macro."
47
+ );
48
+ }
49
+
50
+ const pathsNode = filePaths as unknown as ts.Node;
51
+ const resolvedPaths = context.resolveNodeValue(pathsNode);
52
+
53
+ if (!Array.isArray(resolvedPaths)) {
54
+ throw new Error(
55
+ `inlineFiles$ macro requires an array of string literals, got: ${typeof resolvedPaths}`
56
+ );
57
+ }
58
+
59
+ const sourceFile = context.sourceFile;
60
+ const sourceDir = path.dirname(sourceFile.fileName);
61
+
62
+ const fileContents: string[] = [];
63
+
64
+ for (const filePath of resolvedPaths) {
65
+ if (typeof filePath !== "string") {
66
+ throw new Error(
67
+ `inlineFiles$ macro requires all paths to be string literals, got: ${typeof filePath}`
68
+ );
69
+ }
70
+
71
+ const absolutePath = path.resolve(sourceDir, filePath);
72
+
73
+ try {
74
+ const content = fs.readFileSync(absolutePath, "utf-8");
75
+ fileContents.push(content);
76
+ } catch (error) {
77
+ throw new Error(
78
+ `Failed to read file "${absolutePath}": ${
79
+ error instanceof Error ? error.message : String(error)
80
+ }`
81
+ );
82
+ }
83
+ }
15
84
 
16
- // read file
17
- // escape problematic characters
85
+ const elements = fileContents.map((content) =>
86
+ context.factory.createStringLiteral(content)
87
+ );
18
88
 
19
- // return file content as a string
20
- return context.factory.createStringLiteral("file.txt") as any;
89
+ return context.factory.createArrayLiteralExpression(elements, true) as any;
21
90
  }