@kithinji/arcane 1.0.19 → 1.0.20

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.
@@ -716,31 +716,38 @@ function env$(key, context) {
716
716
  const keyNode = key;
717
717
  const resolvedKey = context.resolveNodeValue(keyNode);
718
718
  if (typeof resolvedKey !== "string") {
719
- context.error("env$ key must be a string literal");
719
+ throw new Error("env$ key must be a string literal");
720
720
  }
721
721
  const sourceDir = path3.dirname(context.sourceFile.fileName);
722
722
  let envPath = envFileCache.get(sourceDir);
723
723
  if (!envPath) {
724
724
  envPath = findEnvFile(sourceDir) ?? void 0;
725
- if (!envPath) {
726
- throw new Error(
727
- `.env file not found (searched from ${context.sourceFile.fileName})`
728
- );
725
+ if (envPath) {
726
+ envFileCache.set(sourceDir, envPath);
729
727
  }
730
- envFileCache.set(sourceDir, envPath);
731
728
  }
732
- let envVars = envVarsCache.get(envPath);
733
- if (!envVars) {
734
- const envContent = fs3.readFileSync(envPath, "utf-8");
735
- envVars = parseEnvFile(envContent);
736
- envVarsCache.set(envPath, envVars);
729
+ let envVars = {};
730
+ if (envPath) {
731
+ let cached = envVarsCache.get(envPath);
732
+ if (!cached) {
733
+ const envContent = fs3.readFileSync(envPath, "utf-8");
734
+ cached = parseEnvFile(envContent);
735
+ envVarsCache.set(envPath, cached);
736
+ }
737
+ envVars = cached;
737
738
  }
738
- if (!(resolvedKey in envVars)) {
739
- context.error(
740
- `Environment variable "${resolvedKey}" not found in ${envPath}`
739
+ let value;
740
+ if (resolvedKey in envVars) {
741
+ value = envVars[resolvedKey];
742
+ } else if (resolvedKey in process.env) {
743
+ value = process.env[resolvedKey];
744
+ }
745
+ if (value === void 0) {
746
+ throw new Error(
747
+ `Environment variable "${resolvedKey}" not found in ${envPath ? `${envPath} or ` : ""}process.env`
741
748
  );
742
749
  }
743
- return context.factory.createStringLiteral(envVars[resolvedKey]);
750
+ return context.factory.createStringLiteral(value);
744
751
  }
745
752
  function findEnvFile(startDir) {
746
753
  let currentDir = startDir;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.node.ts", "../../src/style/style.ts", "../../src/inline/inline.ts", "../../src/assert/index.ts", "../../src/env/index.ts", "../../src/version/index.ts"],
4
- "sourcesContent": ["export * from \"./style\";\nexport * from \"./inline\";\nexport * from \"./assert\";\nexport * from \"./env\";\nexport * from \"./version\";\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\nconst MIME_TYPES: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".webp\": \"image/webp\",\n \".ico\": \"image/x-icon\",\n \".bmp\": \"image/bmp\",\n\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".otf\": \"font/otf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".ogg\": \"audio/ogg\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n\n \".pdf\": \"application/pdf\",\n \".zip\": \"application/zip\",\n\n \".txt\": \"text/plain\",\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"text/javascript\",\n \".json\": \"application/json\",\n \".xml\": \"application/xml\",\n};\n\nfunction getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n return MIME_TYPES[ext] || \"application/octet-stream\";\n}\n\nfunction validateContext(\n context?: MacroContext,\n macroName?: string,\n): asserts context is MacroContext {\n if (!context) {\n throw new Error(\n `${macroName || \"Macro\"} requires MacroContext. Ensure you're using this as a build-time macro.`,\n );\n }\n}\n\nfunction resolveFilePath(\n filePath: string,\n context: MacroContext,\n macroName: string,\n): string {\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 `${macroName} 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 return absolutePath;\n}\n\nexport interface InlineFileOptions {\n maxSize?: number;\n}\n\nexport interface InlineDataURLOptions {\n maxSize?: number;\n mimeType?: string;\n}\n\nexport interface InlineBase64Options {\n maxSize?: number;\n}\n\n/**\n * Inline a text file as a UTF-8 string literal at build time\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing file contents\n */\nexport function inlineFile$(filePath: string, context?: MacroContext): string {\n validateContext(context, \"inlineFile$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineFile$\");\n\n let content: string;\n try {\n content = fs.readFileSync(absolutePath, \"utf-8\");\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline multiple text files as an array of UTF-8 string literals at build time\n * @param filePaths - Array of relative paths to files\n * @param options - Optional configuration\n * @returns Array literal containing file contents\n */\nexport function inlineFiles$(\n filePaths: string[],\n context?: MacroContext,\n): string[] {\n validateContext(context, \"inlineFiles$\");\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$ 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$ 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 if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline a binary file as a base64 string literal at build time\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing base64-encoded file contents\n */\nexport function inlineFileBase64$(\n filePath: string,\n context?: MacroContext,\n): string {\n validateContext(context, \"inlineFileBase64$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineFileBase64$\");\n\n let content: string;\n try {\n const buffer = fs.readFileSync(absolutePath);\n content = buffer.toString(\"base64\");\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline a file as a Data URL (data:mime/type;base64,...) at build time\n * Useful for embedding images, fonts, and other assets directly in code\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing Data URL\n */\nexport function inlineDataURL$(\n filePath: string,\n context?: MacroContext,\n): string {\n validateContext(context, \"inlineDataURL$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineDataURL$\");\n\n let dataURL: string;\n try {\n const mimeType = getMimeType(absolutePath);\n const buffer = fs.readFileSync(absolutePath);\n const base64 = buffer.toString(\"base64\");\n\n dataURL = `data:${mimeType};base64,${base64}`;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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(dataURL) as any;\n}\n\n/**\n * Inline multiple files as Data URLs at build time\n * @param filePaths - Array of relative paths to files\n * @param options - Optional configuration\n * @returns Array literal containing Data URLs\n */\nexport function inlineDataURLs$(\n filePaths: string[],\n context?: MacroContext,\n): string[] {\n validateContext(context, \"inlineDataURLs$\");\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 `inlineDataURLs$ 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 dataURLs: string[] = [];\n\n for (const filePath of resolvedPaths) {\n if (typeof filePath !== \"string\") {\n throw new Error(\n `inlineDataURLs$ 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 mimeType = getMimeType(absolutePath);\n const buffer = fs.readFileSync(absolutePath);\n const base64 = buffer.toString(\"base64\");\n\n const dataURL = `data:${mimeType};base64,${base64}`;\n dataURLs.push(dataURL);\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${sourceFile.fileName})`,\n );\n }\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 = dataURLs.map((dataURL) =>\n context.factory.createStringLiteral(dataURL),\n );\n\n return context.factory.createArrayLiteralExpression(elements, true) as any;\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as ts from \"typescript\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nconst projectRootCache = new Map<string, string | null>();\n\nexport function assert$<T>(\n condition: T,\n message: string = \"\",\n context?: MacroContext,\n): asserts condition is NonNullable<T> {\n if (!context) {\n throw new Error(\"assert$ must be called within a macro context\");\n }\n\n const conditionNode = condition as unknown as ts.Node;\n const messageNode = message as unknown as ts.Node;\n\n if (!context.ts.isExpression(conditionNode)) {\n context.error(\"assert$ condition must be an expression\");\n }\n\n const conditionText = conditionNode.getText(context.sourceFile);\n\n const { line, character } = context.sourceFile.getLineAndCharacterOfPosition(\n context.node.getStart(),\n );\n const fileName = context.sourceFile.fileName;\n\n const projectRoot = findProjectRoot(fileName);\n const relativePath = projectRoot\n ? path.relative(projectRoot, fileName)\n : path.basename(fileName);\n const location = `${relativePath}:${line + 1}:${character + 1}`;\n\n let resolvedMessage = \"\";\n try {\n const messageValue = context.resolveNodeValue(messageNode);\n if (typeof messageValue === \"string\") {\n resolvedMessage = messageValue.trim();\n }\n } catch {\n // If we can't resolve it, treat it as no message\n }\n\n let errorMessage = `Assertion failed: ${conditionText}`;\n if (resolvedMessage !== \"\") {\n errorMessage += `\\n ${resolvedMessage}`;\n }\n errorMessage += `\\n at ${location}`;\n\n // Create the runtime assertion code wrapped in an IIFE:\n // (() => {\n // if (!(condition)) {\n // throw new Error(\"...\");\n // }\n // })()\n\n const throwStatement = context.factory.createThrowStatement(\n context.factory.createNewExpression(\n context.factory.createIdentifier(\"Error\"),\n undefined,\n [context.factory.createStringLiteral(errorMessage)],\n ),\n );\n\n const ifStatement = context.factory.createIfStatement(\n context.factory.createPrefixUnaryExpression(\n context.ts.SyntaxKind.ExclamationToken,\n context.factory.createParenthesizedExpression(\n conditionNode as ts.Expression,\n ),\n ),\n context.factory.createBlock([throwStatement], true),\n );\n\n const iife = context.factory.createCallExpression(\n context.factory.createParenthesizedExpression(\n context.factory.createArrowFunction(\n undefined,\n undefined,\n [],\n undefined,\n context.factory.createToken(\n context.ts.SyntaxKind.EqualsGreaterThanToken,\n ),\n context.factory.createBlock([ifStatement], true),\n ),\n ),\n undefined,\n [],\n );\n\n return iife as any;\n}\n\nfunction findProjectRoot(startPath: string): string | null {\n const dir = path.dirname(startPath);\n\n if (projectRootCache.has(dir)) {\n return projectRootCache.get(dir)!;\n }\n\n let currentDir = dir;\n\n while (true) {\n if (fs.existsSync(path.join(currentDir, \"package.json\"))) {\n projectRootCache.set(dir, currentDir);\n return currentDir;\n }\n\n const parent = path.dirname(currentDir);\n\n if (parent === currentDir) {\n projectRootCache.set(dir, null);\n return null;\n }\n\n currentDir = parent;\n }\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as ts from \"typescript\";\n\nconst envFileCache = new Map<string, string>();\nconst envVarsCache = new Map<string, Record<string, string>>();\n\nexport function env$(key: string, context?: MacroContext): string {\n if (!context) {\n throw new Error(\"env$ must be called within a macro context\");\n }\n\n const keyNode = key as unknown as ts.Node;\n const resolvedKey = context.resolveNodeValue(keyNode);\n\n if (typeof resolvedKey !== \"string\") {\n context.error(\"env$ key must be a string literal\");\n }\n\n const sourceDir = path.dirname(context.sourceFile.fileName);\n\n let envPath = envFileCache.get(sourceDir);\n\n if (!envPath) {\n envPath = findEnvFile(sourceDir) ?? undefined;\n\n if (!envPath) {\n throw new Error(\n `.env file not found (searched from ${context.sourceFile.fileName})`,\n );\n }\n\n envFileCache.set(sourceDir, envPath);\n }\n\n let envVars = envVarsCache.get(envPath);\n\n if (!envVars) {\n const envContent = fs.readFileSync(envPath, \"utf-8\");\n envVars = parseEnvFile(envContent);\n envVarsCache.set(envPath, envVars);\n }\n\n if (!(resolvedKey in envVars)) {\n context.error(\n `Environment variable \"${resolvedKey}\" not found in ${envPath}`,\n );\n }\n\n return context.factory.createStringLiteral(envVars[resolvedKey]) as any;\n}\n\nfunction findEnvFile(startDir: string): string | null {\n let currentDir = startDir;\n\n while (true) {\n const envPath = path.join(currentDir, \".env\");\n\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n\n const parentDir = path.dirname(currentDir);\n\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n\nfunction parseEnvFile(content: string): Record<string, string> {\n const envVars: Record<string, string> = {};\n\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue;\n }\n\n const match = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*)$/);\n\n if (match) {\n const [, key, value] = match;\n\n let parsedValue = value.trim();\n if (\n (parsedValue.startsWith('\"') && parsedValue.endsWith('\"')) ||\n (parsedValue.startsWith(\"'\") && parsedValue.endsWith(\"'\"))\n ) {\n parsedValue = parsedValue.slice(1, -1);\n }\n\n envVars[key] = parsedValue;\n }\n }\n\n return envVars;\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nconst packageJsonCache = new Map<string, string>();\nconst versionCache = new Map<string, string>();\n\nexport function version$(context?: MacroContext): string {\n if (!context) {\n throw new Error(\"version$ must be called within a macro context\");\n }\n\n const sourceDir = path.dirname(context.sourceFile.fileName);\n\n let packageJsonPath = packageJsonCache.get(sourceDir);\n\n if (!packageJsonPath) {\n packageJsonPath = findPackageJson(sourceDir) ?? undefined;\n\n if (!packageJsonPath) {\n throw new Error(\n `package.json not found (searched from ${context.sourceFile.fileName})`,\n );\n }\n\n packageJsonCache.set(sourceDir, packageJsonPath);\n }\n\n let version = versionCache.get(packageJsonPath);\n\n if (!version) {\n try {\n const content = fs.readFileSync(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n\n if (!packageJson.version || typeof packageJson.version !== \"string\") {\n throw new Error(`No \"version\" field found in ${packageJsonPath}`);\n }\n\n version = packageJson.version;\n versionCache.set(packageJsonPath, version!);\n } catch (error) {\n throw new Error(\n `Failed to read or parse ${packageJsonPath}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n return context.factory.createStringLiteral(version!) as any;\n}\n\nfunction findPackageJson(startDir: string): string | null {\n let currentDir = startDir;\n\n while (true) {\n const packageJsonPath = path.join(currentDir, \"package.json\");\n\n if (fs.existsSync(packageJsonPath)) {\n return packageJsonPath;\n }\n\n const parentDir = path.dirname(currentDir);\n\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export * from \"./style\";\nexport * from \"./inline\";\nexport * from \"./assert\";\nexport * from \"./env\";\nexport * from \"./version\";\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\nconst MIME_TYPES: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".webp\": \"image/webp\",\n \".ico\": \"image/x-icon\",\n \".bmp\": \"image/bmp\",\n\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".otf\": \"font/otf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".ogg\": \"audio/ogg\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n\n \".pdf\": \"application/pdf\",\n \".zip\": \"application/zip\",\n\n \".txt\": \"text/plain\",\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"text/javascript\",\n \".json\": \"application/json\",\n \".xml\": \"application/xml\",\n};\n\nfunction getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n return MIME_TYPES[ext] || \"application/octet-stream\";\n}\n\nfunction validateContext(\n context?: MacroContext,\n macroName?: string,\n): asserts context is MacroContext {\n if (!context) {\n throw new Error(\n `${macroName || \"Macro\"} requires MacroContext. Ensure you're using this as a build-time macro.`,\n );\n }\n}\n\nfunction resolveFilePath(\n filePath: string,\n context: MacroContext,\n macroName: string,\n): string {\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 `${macroName} 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 return absolutePath;\n}\n\nexport interface InlineFileOptions {\n maxSize?: number;\n}\n\nexport interface InlineDataURLOptions {\n maxSize?: number;\n mimeType?: string;\n}\n\nexport interface InlineBase64Options {\n maxSize?: number;\n}\n\n/**\n * Inline a text file as a UTF-8 string literal at build time\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing file contents\n */\nexport function inlineFile$(filePath: string, context?: MacroContext): string {\n validateContext(context, \"inlineFile$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineFile$\");\n\n let content: string;\n try {\n content = fs.readFileSync(absolutePath, \"utf-8\");\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline multiple text files as an array of UTF-8 string literals at build time\n * @param filePaths - Array of relative paths to files\n * @param options - Optional configuration\n * @returns Array literal containing file contents\n */\nexport function inlineFiles$(\n filePaths: string[],\n context?: MacroContext,\n): string[] {\n validateContext(context, \"inlineFiles$\");\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$ 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$ 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 if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline a binary file as a base64 string literal at build time\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing base64-encoded file contents\n */\nexport function inlineFileBase64$(\n filePath: string,\n context?: MacroContext,\n): string {\n validateContext(context, \"inlineFileBase64$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineFileBase64$\");\n\n let content: string;\n try {\n const buffer = fs.readFileSync(absolutePath);\n content = buffer.toString(\"base64\");\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline a file as a Data URL (data:mime/type;base64,...) at build time\n * Useful for embedding images, fonts, and other assets directly in code\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing Data URL\n */\nexport function inlineDataURL$(\n filePath: string,\n context?: MacroContext,\n): string {\n validateContext(context, \"inlineDataURL$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineDataURL$\");\n\n let dataURL: string;\n try {\n const mimeType = getMimeType(absolutePath);\n const buffer = fs.readFileSync(absolutePath);\n const base64 = buffer.toString(\"base64\");\n\n dataURL = `data:${mimeType};base64,${base64}`;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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(dataURL) as any;\n}\n\n/**\n * Inline multiple files as Data URLs at build time\n * @param filePaths - Array of relative paths to files\n * @param options - Optional configuration\n * @returns Array literal containing Data URLs\n */\nexport function inlineDataURLs$(\n filePaths: string[],\n context?: MacroContext,\n): string[] {\n validateContext(context, \"inlineDataURLs$\");\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 `inlineDataURLs$ 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 dataURLs: string[] = [];\n\n for (const filePath of resolvedPaths) {\n if (typeof filePath !== \"string\") {\n throw new Error(\n `inlineDataURLs$ 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 mimeType = getMimeType(absolutePath);\n const buffer = fs.readFileSync(absolutePath);\n const base64 = buffer.toString(\"base64\");\n\n const dataURL = `data:${mimeType};base64,${base64}`;\n dataURLs.push(dataURL);\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${sourceFile.fileName})`,\n );\n }\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 = dataURLs.map((dataURL) =>\n context.factory.createStringLiteral(dataURL),\n );\n\n return context.factory.createArrayLiteralExpression(elements, true) as any;\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as ts from \"typescript\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nconst projectRootCache = new Map<string, string | null>();\n\nexport function assert$<T>(\n condition: T,\n message: string = \"\",\n context?: MacroContext,\n): asserts condition is NonNullable<T> {\n if (!context) {\n throw new Error(\"assert$ must be called within a macro context\");\n }\n\n const conditionNode = condition as unknown as ts.Node;\n const messageNode = message as unknown as ts.Node;\n\n if (!context.ts.isExpression(conditionNode)) {\n context.error(\"assert$ condition must be an expression\");\n }\n\n const conditionText = conditionNode.getText(context.sourceFile);\n\n const { line, character } = context.sourceFile.getLineAndCharacterOfPosition(\n context.node.getStart(),\n );\n const fileName = context.sourceFile.fileName;\n\n const projectRoot = findProjectRoot(fileName);\n const relativePath = projectRoot\n ? path.relative(projectRoot, fileName)\n : path.basename(fileName);\n const location = `${relativePath}:${line + 1}:${character + 1}`;\n\n let resolvedMessage = \"\";\n try {\n const messageValue = context.resolveNodeValue(messageNode);\n if (typeof messageValue === \"string\") {\n resolvedMessage = messageValue.trim();\n }\n } catch {\n // If we can't resolve it, treat it as no message\n }\n\n let errorMessage = `Assertion failed: ${conditionText}`;\n if (resolvedMessage !== \"\") {\n errorMessage += `\\n ${resolvedMessage}`;\n }\n errorMessage += `\\n at ${location}`;\n\n // Create the runtime assertion code wrapped in an IIFE:\n // (() => {\n // if (!(condition)) {\n // throw new Error(\"...\");\n // }\n // })()\n\n const throwStatement = context.factory.createThrowStatement(\n context.factory.createNewExpression(\n context.factory.createIdentifier(\"Error\"),\n undefined,\n [context.factory.createStringLiteral(errorMessage)],\n ),\n );\n\n const ifStatement = context.factory.createIfStatement(\n context.factory.createPrefixUnaryExpression(\n context.ts.SyntaxKind.ExclamationToken,\n context.factory.createParenthesizedExpression(\n conditionNode as ts.Expression,\n ),\n ),\n context.factory.createBlock([throwStatement], true),\n );\n\n const iife = context.factory.createCallExpression(\n context.factory.createParenthesizedExpression(\n context.factory.createArrowFunction(\n undefined,\n undefined,\n [],\n undefined,\n context.factory.createToken(\n context.ts.SyntaxKind.EqualsGreaterThanToken,\n ),\n context.factory.createBlock([ifStatement], true),\n ),\n ),\n undefined,\n [],\n );\n\n return iife as any;\n}\n\nfunction findProjectRoot(startPath: string): string | null {\n const dir = path.dirname(startPath);\n\n if (projectRootCache.has(dir)) {\n return projectRootCache.get(dir)!;\n }\n\n let currentDir = dir;\n\n while (true) {\n if (fs.existsSync(path.join(currentDir, \"package.json\"))) {\n projectRootCache.set(dir, currentDir);\n return currentDir;\n }\n\n const parent = path.dirname(currentDir);\n\n if (parent === currentDir) {\n projectRootCache.set(dir, null);\n return null;\n }\n\n currentDir = parent;\n }\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as ts from \"typescript\";\n\nconst envFileCache = new Map<string, string>();\nconst envVarsCache = new Map<string, Record<string, string>>();\n\nexport function env$(key: string, context?: MacroContext): string {\n if (!context) {\n throw new Error(\"env$ must be called within a macro context\");\n }\n\n const keyNode = key as unknown as ts.Node;\n const resolvedKey = context.resolveNodeValue(keyNode);\n\n if (typeof resolvedKey !== \"string\") {\n throw new Error(\"env$ key must be a string literal\");\n }\n\n const sourceDir = path.dirname(context.sourceFile.fileName);\n let envPath = envFileCache.get(sourceDir);\n\n if (!envPath) {\n envPath = findEnvFile(sourceDir) ?? undefined;\n if (envPath) {\n envFileCache.set(sourceDir, envPath);\n }\n }\n\n let envVars: Record<string, string> = {};\n\n if (envPath) {\n let cached = envVarsCache.get(envPath);\n if (!cached) {\n const envContent = fs.readFileSync(envPath, \"utf-8\");\n cached = parseEnvFile(envContent);\n envVarsCache.set(envPath, cached);\n }\n envVars = cached;\n }\n\n let value: string | undefined;\n\n if (resolvedKey in envVars) {\n value = envVars[resolvedKey];\n } else if (resolvedKey in process.env) {\n value = process.env[resolvedKey];\n }\n\n if (value === undefined) {\n throw new Error(\n `Environment variable \"${resolvedKey}\" not found in ${\n envPath ? `${envPath} or ` : \"\"\n }process.env`,\n );\n }\n\n return context.factory.createStringLiteral(value) as any;\n}\n\nfunction findEnvFile(startDir: string): string | null {\n let currentDir = startDir;\n\n while (true) {\n const envPath = path.join(currentDir, \".env\");\n\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n\n const parentDir = path.dirname(currentDir);\n\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n\nfunction parseEnvFile(content: string): Record<string, string> {\n const envVars: Record<string, string> = {};\n\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue;\n }\n\n const match = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*)$/);\n\n if (match) {\n const [, key, value] = match;\n\n let parsedValue = value.trim();\n if (\n (parsedValue.startsWith('\"') && parsedValue.endsWith('\"')) ||\n (parsedValue.startsWith(\"'\") && parsedValue.endsWith(\"'\"))\n ) {\n parsedValue = parsedValue.slice(1, -1);\n }\n\n envVars[key] = parsedValue;\n }\n }\n\n return envVars;\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nconst packageJsonCache = new Map<string, string>();\nconst versionCache = new Map<string, string>();\n\nexport function version$(context?: MacroContext): string {\n if (!context) {\n throw new Error(\"version$ must be called within a macro context\");\n }\n\n const sourceDir = path.dirname(context.sourceFile.fileName);\n\n let packageJsonPath = packageJsonCache.get(sourceDir);\n\n if (!packageJsonPath) {\n packageJsonPath = findPackageJson(sourceDir) ?? undefined;\n\n if (!packageJsonPath) {\n throw new Error(\n `package.json not found (searched from ${context.sourceFile.fileName})`,\n );\n }\n\n packageJsonCache.set(sourceDir, packageJsonPath);\n }\n\n let version = versionCache.get(packageJsonPath);\n\n if (!version) {\n try {\n const content = fs.readFileSync(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n\n if (!packageJson.version || typeof packageJson.version !== \"string\") {\n throw new Error(`No \"version\" field found in ${packageJsonPath}`);\n }\n\n version = packageJson.version;\n versionCache.set(packageJsonPath, version!);\n } catch (error) {\n throw new Error(\n `Failed to read or parse ${packageJsonPath}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n return context.factory.createStringLiteral(version!) as any;\n}\n\nfunction findPackageJson(startDir: string): string | null {\n let currentDir = startDir;\n\n while (true) {\n const packageJsonPath = path.join(currentDir, \"package.json\");\n\n if (fs.existsSync(packageJsonPath)) {\n return packageJsonPath;\n }\n\n const parentDir = path.dirname(currentDir);\n\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["path", "className", "normalizedValue", "ts", "f", "path", "fs", "fs", "path", "fs", "path", "fs", "path"]
7
7
  }
@@ -671,31 +671,38 @@ function env$(key, context) {
671
671
  const keyNode = key;
672
672
  const resolvedKey = context.resolveNodeValue(keyNode);
673
673
  if (typeof resolvedKey !== "string") {
674
- context.error("env$ key must be a string literal");
674
+ throw new Error("env$ key must be a string literal");
675
675
  }
676
676
  const sourceDir = path3.dirname(context.sourceFile.fileName);
677
677
  let envPath = envFileCache.get(sourceDir);
678
678
  if (!envPath) {
679
679
  envPath = findEnvFile(sourceDir) ?? void 0;
680
- if (!envPath) {
681
- throw new Error(
682
- `.env file not found (searched from ${context.sourceFile.fileName})`
683
- );
680
+ if (envPath) {
681
+ envFileCache.set(sourceDir, envPath);
684
682
  }
685
- envFileCache.set(sourceDir, envPath);
686
683
  }
687
- let envVars = envVarsCache.get(envPath);
688
- if (!envVars) {
689
- const envContent = fs3.readFileSync(envPath, "utf-8");
690
- envVars = parseEnvFile(envContent);
691
- envVarsCache.set(envPath, envVars);
684
+ let envVars = {};
685
+ if (envPath) {
686
+ let cached = envVarsCache.get(envPath);
687
+ if (!cached) {
688
+ const envContent = fs3.readFileSync(envPath, "utf-8");
689
+ cached = parseEnvFile(envContent);
690
+ envVarsCache.set(envPath, cached);
691
+ }
692
+ envVars = cached;
692
693
  }
693
- if (!(resolvedKey in envVars)) {
694
- context.error(
695
- `Environment variable "${resolvedKey}" not found in ${envPath}`
694
+ let value;
695
+ if (resolvedKey in envVars) {
696
+ value = envVars[resolvedKey];
697
+ } else if (resolvedKey in process.env) {
698
+ value = process.env[resolvedKey];
699
+ }
700
+ if (value === void 0) {
701
+ throw new Error(
702
+ `Environment variable "${resolvedKey}" not found in ${envPath ? `${envPath} or ` : ""}process.env`
696
703
  );
697
704
  }
698
- return context.factory.createStringLiteral(envVars[resolvedKey]);
705
+ return context.factory.createStringLiteral(value);
699
706
  }
700
707
  function findEnvFile(startDir) {
701
708
  let currentDir = startDir;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/style/style.ts", "../../src/inline/inline.ts", "../../src/assert/index.ts", "../../src/env/index.ts", "../../src/version/index.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\";\nimport fs from \"fs\";\nimport path from \"path\";\n\nconst MIME_TYPES: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".webp\": \"image/webp\",\n \".ico\": \"image/x-icon\",\n \".bmp\": \"image/bmp\",\n\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".otf\": \"font/otf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".ogg\": \"audio/ogg\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n\n \".pdf\": \"application/pdf\",\n \".zip\": \"application/zip\",\n\n \".txt\": \"text/plain\",\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"text/javascript\",\n \".json\": \"application/json\",\n \".xml\": \"application/xml\",\n};\n\nfunction getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n return MIME_TYPES[ext] || \"application/octet-stream\";\n}\n\nfunction validateContext(\n context?: MacroContext,\n macroName?: string,\n): asserts context is MacroContext {\n if (!context) {\n throw new Error(\n `${macroName || \"Macro\"} requires MacroContext. Ensure you're using this as a build-time macro.`,\n );\n }\n}\n\nfunction resolveFilePath(\n filePath: string,\n context: MacroContext,\n macroName: string,\n): string {\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 `${macroName} 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 return absolutePath;\n}\n\nexport interface InlineFileOptions {\n maxSize?: number;\n}\n\nexport interface InlineDataURLOptions {\n maxSize?: number;\n mimeType?: string;\n}\n\nexport interface InlineBase64Options {\n maxSize?: number;\n}\n\n/**\n * Inline a text file as a UTF-8 string literal at build time\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing file contents\n */\nexport function inlineFile$(filePath: string, context?: MacroContext): string {\n validateContext(context, \"inlineFile$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineFile$\");\n\n let content: string;\n try {\n content = fs.readFileSync(absolutePath, \"utf-8\");\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline multiple text files as an array of UTF-8 string literals at build time\n * @param filePaths - Array of relative paths to files\n * @param options - Optional configuration\n * @returns Array literal containing file contents\n */\nexport function inlineFiles$(\n filePaths: string[],\n context?: MacroContext,\n): string[] {\n validateContext(context, \"inlineFiles$\");\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$ 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$ 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 if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline a binary file as a base64 string literal at build time\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing base64-encoded file contents\n */\nexport function inlineFileBase64$(\n filePath: string,\n context?: MacroContext,\n): string {\n validateContext(context, \"inlineFileBase64$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineFileBase64$\");\n\n let content: string;\n try {\n const buffer = fs.readFileSync(absolutePath);\n content = buffer.toString(\"base64\");\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline a file as a Data URL (data:mime/type;base64,...) at build time\n * Useful for embedding images, fonts, and other assets directly in code\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing Data URL\n */\nexport function inlineDataURL$(\n filePath: string,\n context?: MacroContext,\n): string {\n validateContext(context, \"inlineDataURL$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineDataURL$\");\n\n let dataURL: string;\n try {\n const mimeType = getMimeType(absolutePath);\n const buffer = fs.readFileSync(absolutePath);\n const base64 = buffer.toString(\"base64\");\n\n dataURL = `data:${mimeType};base64,${base64}`;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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(dataURL) as any;\n}\n\n/**\n * Inline multiple files as Data URLs at build time\n * @param filePaths - Array of relative paths to files\n * @param options - Optional configuration\n * @returns Array literal containing Data URLs\n */\nexport function inlineDataURLs$(\n filePaths: string[],\n context?: MacroContext,\n): string[] {\n validateContext(context, \"inlineDataURLs$\");\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 `inlineDataURLs$ 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 dataURLs: string[] = [];\n\n for (const filePath of resolvedPaths) {\n if (typeof filePath !== \"string\") {\n throw new Error(\n `inlineDataURLs$ 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 mimeType = getMimeType(absolutePath);\n const buffer = fs.readFileSync(absolutePath);\n const base64 = buffer.toString(\"base64\");\n\n const dataURL = `data:${mimeType};base64,${base64}`;\n dataURLs.push(dataURL);\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${sourceFile.fileName})`,\n );\n }\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 = dataURLs.map((dataURL) =>\n context.factory.createStringLiteral(dataURL),\n );\n\n return context.factory.createArrayLiteralExpression(elements, true) as any;\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as ts from \"typescript\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nconst projectRootCache = new Map<string, string | null>();\n\nexport function assert$<T>(\n condition: T,\n message: string = \"\",\n context?: MacroContext,\n): asserts condition is NonNullable<T> {\n if (!context) {\n throw new Error(\"assert$ must be called within a macro context\");\n }\n\n const conditionNode = condition as unknown as ts.Node;\n const messageNode = message as unknown as ts.Node;\n\n if (!context.ts.isExpression(conditionNode)) {\n context.error(\"assert$ condition must be an expression\");\n }\n\n const conditionText = conditionNode.getText(context.sourceFile);\n\n const { line, character } = context.sourceFile.getLineAndCharacterOfPosition(\n context.node.getStart(),\n );\n const fileName = context.sourceFile.fileName;\n\n const projectRoot = findProjectRoot(fileName);\n const relativePath = projectRoot\n ? path.relative(projectRoot, fileName)\n : path.basename(fileName);\n const location = `${relativePath}:${line + 1}:${character + 1}`;\n\n let resolvedMessage = \"\";\n try {\n const messageValue = context.resolveNodeValue(messageNode);\n if (typeof messageValue === \"string\") {\n resolvedMessage = messageValue.trim();\n }\n } catch {\n // If we can't resolve it, treat it as no message\n }\n\n let errorMessage = `Assertion failed: ${conditionText}`;\n if (resolvedMessage !== \"\") {\n errorMessage += `\\n ${resolvedMessage}`;\n }\n errorMessage += `\\n at ${location}`;\n\n // Create the runtime assertion code wrapped in an IIFE:\n // (() => {\n // if (!(condition)) {\n // throw new Error(\"...\");\n // }\n // })()\n\n const throwStatement = context.factory.createThrowStatement(\n context.factory.createNewExpression(\n context.factory.createIdentifier(\"Error\"),\n undefined,\n [context.factory.createStringLiteral(errorMessage)],\n ),\n );\n\n const ifStatement = context.factory.createIfStatement(\n context.factory.createPrefixUnaryExpression(\n context.ts.SyntaxKind.ExclamationToken,\n context.factory.createParenthesizedExpression(\n conditionNode as ts.Expression,\n ),\n ),\n context.factory.createBlock([throwStatement], true),\n );\n\n const iife = context.factory.createCallExpression(\n context.factory.createParenthesizedExpression(\n context.factory.createArrowFunction(\n undefined,\n undefined,\n [],\n undefined,\n context.factory.createToken(\n context.ts.SyntaxKind.EqualsGreaterThanToken,\n ),\n context.factory.createBlock([ifStatement], true),\n ),\n ),\n undefined,\n [],\n );\n\n return iife as any;\n}\n\nfunction findProjectRoot(startPath: string): string | null {\n const dir = path.dirname(startPath);\n\n if (projectRootCache.has(dir)) {\n return projectRootCache.get(dir)!;\n }\n\n let currentDir = dir;\n\n while (true) {\n if (fs.existsSync(path.join(currentDir, \"package.json\"))) {\n projectRootCache.set(dir, currentDir);\n return currentDir;\n }\n\n const parent = path.dirname(currentDir);\n\n if (parent === currentDir) {\n projectRootCache.set(dir, null);\n return null;\n }\n\n currentDir = parent;\n }\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as ts from \"typescript\";\n\nconst envFileCache = new Map<string, string>();\nconst envVarsCache = new Map<string, Record<string, string>>();\n\nexport function env$(key: string, context?: MacroContext): string {\n if (!context) {\n throw new Error(\"env$ must be called within a macro context\");\n }\n\n const keyNode = key as unknown as ts.Node;\n const resolvedKey = context.resolveNodeValue(keyNode);\n\n if (typeof resolvedKey !== \"string\") {\n context.error(\"env$ key must be a string literal\");\n }\n\n const sourceDir = path.dirname(context.sourceFile.fileName);\n\n let envPath = envFileCache.get(sourceDir);\n\n if (!envPath) {\n envPath = findEnvFile(sourceDir) ?? undefined;\n\n if (!envPath) {\n throw new Error(\n `.env file not found (searched from ${context.sourceFile.fileName})`,\n );\n }\n\n envFileCache.set(sourceDir, envPath);\n }\n\n let envVars = envVarsCache.get(envPath);\n\n if (!envVars) {\n const envContent = fs.readFileSync(envPath, \"utf-8\");\n envVars = parseEnvFile(envContent);\n envVarsCache.set(envPath, envVars);\n }\n\n if (!(resolvedKey in envVars)) {\n context.error(\n `Environment variable \"${resolvedKey}\" not found in ${envPath}`,\n );\n }\n\n return context.factory.createStringLiteral(envVars[resolvedKey]) as any;\n}\n\nfunction findEnvFile(startDir: string): string | null {\n let currentDir = startDir;\n\n while (true) {\n const envPath = path.join(currentDir, \".env\");\n\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n\n const parentDir = path.dirname(currentDir);\n\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n\nfunction parseEnvFile(content: string): Record<string, string> {\n const envVars: Record<string, string> = {};\n\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue;\n }\n\n const match = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*)$/);\n\n if (match) {\n const [, key, value] = match;\n\n let parsedValue = value.trim();\n if (\n (parsedValue.startsWith('\"') && parsedValue.endsWith('\"')) ||\n (parsedValue.startsWith(\"'\") && parsedValue.endsWith(\"'\"))\n ) {\n parsedValue = parsedValue.slice(1, -1);\n }\n\n envVars[key] = parsedValue;\n }\n }\n\n return envVars;\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nconst packageJsonCache = new Map<string, string>();\nconst versionCache = new Map<string, string>();\n\nexport function version$(context?: MacroContext): string {\n if (!context) {\n throw new Error(\"version$ must be called within a macro context\");\n }\n\n const sourceDir = path.dirname(context.sourceFile.fileName);\n\n let packageJsonPath = packageJsonCache.get(sourceDir);\n\n if (!packageJsonPath) {\n packageJsonPath = findPackageJson(sourceDir) ?? undefined;\n\n if (!packageJsonPath) {\n throw new Error(\n `package.json not found (searched from ${context.sourceFile.fileName})`,\n );\n }\n\n packageJsonCache.set(sourceDir, packageJsonPath);\n }\n\n let version = versionCache.get(packageJsonPath);\n\n if (!version) {\n try {\n const content = fs.readFileSync(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n\n if (!packageJson.version || typeof packageJson.version !== \"string\") {\n throw new Error(`No \"version\" field found in ${packageJsonPath}`);\n }\n\n version = packageJson.version;\n versionCache.set(packageJsonPath, version!);\n } catch (error) {\n throw new Error(\n `Failed to read or parse ${packageJsonPath}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n return context.factory.createStringLiteral(version!) as any;\n}\n\nfunction findPackageJson(startDir: string): string | null {\n let currentDir = startDir;\n\n while (true) {\n const packageJsonPath = path.join(currentDir, \"package.json\");\n\n if (fs.existsSync(packageJsonPath)) {\n return packageJsonPath;\n }\n\n const parentDir = path.dirname(currentDir);\n\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n"],
5
- "mappings": "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",
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\nconst MIME_TYPES: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".webp\": \"image/webp\",\n \".ico\": \"image/x-icon\",\n \".bmp\": \"image/bmp\",\n\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".otf\": \"font/otf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".ogg\": \"audio/ogg\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n\n \".pdf\": \"application/pdf\",\n \".zip\": \"application/zip\",\n\n \".txt\": \"text/plain\",\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"text/javascript\",\n \".json\": \"application/json\",\n \".xml\": \"application/xml\",\n};\n\nfunction getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n return MIME_TYPES[ext] || \"application/octet-stream\";\n}\n\nfunction validateContext(\n context?: MacroContext,\n macroName?: string,\n): asserts context is MacroContext {\n if (!context) {\n throw new Error(\n `${macroName || \"Macro\"} requires MacroContext. Ensure you're using this as a build-time macro.`,\n );\n }\n}\n\nfunction resolveFilePath(\n filePath: string,\n context: MacroContext,\n macroName: string,\n): string {\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 `${macroName} 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 return absolutePath;\n}\n\nexport interface InlineFileOptions {\n maxSize?: number;\n}\n\nexport interface InlineDataURLOptions {\n maxSize?: number;\n mimeType?: string;\n}\n\nexport interface InlineBase64Options {\n maxSize?: number;\n}\n\n/**\n * Inline a text file as a UTF-8 string literal at build time\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing file contents\n */\nexport function inlineFile$(filePath: string, context?: MacroContext): string {\n validateContext(context, \"inlineFile$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineFile$\");\n\n let content: string;\n try {\n content = fs.readFileSync(absolutePath, \"utf-8\");\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline multiple text files as an array of UTF-8 string literals at build time\n * @param filePaths - Array of relative paths to files\n * @param options - Optional configuration\n * @returns Array literal containing file contents\n */\nexport function inlineFiles$(\n filePaths: string[],\n context?: MacroContext,\n): string[] {\n validateContext(context, \"inlineFiles$\");\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$ 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$ 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 if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline a binary file as a base64 string literal at build time\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing base64-encoded file contents\n */\nexport function inlineFileBase64$(\n filePath: string,\n context?: MacroContext,\n): string {\n validateContext(context, \"inlineFileBase64$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineFileBase64$\");\n\n let content: string;\n try {\n const buffer = fs.readFileSync(absolutePath);\n content = buffer.toString(\"base64\");\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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\n/**\n * Inline a file as a Data URL (data:mime/type;base64,...) at build time\n * Useful for embedding images, fonts, and other assets directly in code\n * @param filePath - Relative path to the file\n * @param options - Optional configuration\n * @returns String literal containing Data URL\n */\nexport function inlineDataURL$(\n filePath: string,\n context?: MacroContext,\n): string {\n validateContext(context, \"inlineDataURL$\");\n\n const absolutePath = resolveFilePath(filePath, context, \"inlineDataURL$\");\n\n let dataURL: string;\n try {\n const mimeType = getMimeType(absolutePath);\n const buffer = fs.readFileSync(absolutePath);\n const base64 = buffer.toString(\"base64\");\n\n dataURL = `data:${mimeType};base64,${base64}`;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${context.sourceFile.fileName})`,\n );\n }\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(dataURL) as any;\n}\n\n/**\n * Inline multiple files as Data URLs at build time\n * @param filePaths - Array of relative paths to files\n * @param options - Optional configuration\n * @returns Array literal containing Data URLs\n */\nexport function inlineDataURLs$(\n filePaths: string[],\n context?: MacroContext,\n): string[] {\n validateContext(context, \"inlineDataURLs$\");\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 `inlineDataURLs$ 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 dataURLs: string[] = [];\n\n for (const filePath of resolvedPaths) {\n if (typeof filePath !== \"string\") {\n throw new Error(\n `inlineDataURLs$ 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 mimeType = getMimeType(absolutePath);\n const buffer = fs.readFileSync(absolutePath);\n const base64 = buffer.toString(\"base64\");\n\n const dataURL = `data:${mimeType};base64,${base64}`;\n dataURLs.push(dataURL);\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new Error(\n `File not found: \"${absolutePath}\" (referenced in ${sourceFile.fileName})`,\n );\n }\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 = dataURLs.map((dataURL) =>\n context.factory.createStringLiteral(dataURL),\n );\n\n return context.factory.createArrayLiteralExpression(elements, true) as any;\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as ts from \"typescript\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nconst projectRootCache = new Map<string, string | null>();\n\nexport function assert$<T>(\n condition: T,\n message: string = \"\",\n context?: MacroContext,\n): asserts condition is NonNullable<T> {\n if (!context) {\n throw new Error(\"assert$ must be called within a macro context\");\n }\n\n const conditionNode = condition as unknown as ts.Node;\n const messageNode = message as unknown as ts.Node;\n\n if (!context.ts.isExpression(conditionNode)) {\n context.error(\"assert$ condition must be an expression\");\n }\n\n const conditionText = conditionNode.getText(context.sourceFile);\n\n const { line, character } = context.sourceFile.getLineAndCharacterOfPosition(\n context.node.getStart(),\n );\n const fileName = context.sourceFile.fileName;\n\n const projectRoot = findProjectRoot(fileName);\n const relativePath = projectRoot\n ? path.relative(projectRoot, fileName)\n : path.basename(fileName);\n const location = `${relativePath}:${line + 1}:${character + 1}`;\n\n let resolvedMessage = \"\";\n try {\n const messageValue = context.resolveNodeValue(messageNode);\n if (typeof messageValue === \"string\") {\n resolvedMessage = messageValue.trim();\n }\n } catch {\n // If we can't resolve it, treat it as no message\n }\n\n let errorMessage = `Assertion failed: ${conditionText}`;\n if (resolvedMessage !== \"\") {\n errorMessage += `\\n ${resolvedMessage}`;\n }\n errorMessage += `\\n at ${location}`;\n\n // Create the runtime assertion code wrapped in an IIFE:\n // (() => {\n // if (!(condition)) {\n // throw new Error(\"...\");\n // }\n // })()\n\n const throwStatement = context.factory.createThrowStatement(\n context.factory.createNewExpression(\n context.factory.createIdentifier(\"Error\"),\n undefined,\n [context.factory.createStringLiteral(errorMessage)],\n ),\n );\n\n const ifStatement = context.factory.createIfStatement(\n context.factory.createPrefixUnaryExpression(\n context.ts.SyntaxKind.ExclamationToken,\n context.factory.createParenthesizedExpression(\n conditionNode as ts.Expression,\n ),\n ),\n context.factory.createBlock([throwStatement], true),\n );\n\n const iife = context.factory.createCallExpression(\n context.factory.createParenthesizedExpression(\n context.factory.createArrowFunction(\n undefined,\n undefined,\n [],\n undefined,\n context.factory.createToken(\n context.ts.SyntaxKind.EqualsGreaterThanToken,\n ),\n context.factory.createBlock([ifStatement], true),\n ),\n ),\n undefined,\n [],\n );\n\n return iife as any;\n}\n\nfunction findProjectRoot(startPath: string): string | null {\n const dir = path.dirname(startPath);\n\n if (projectRootCache.has(dir)) {\n return projectRootCache.get(dir)!;\n }\n\n let currentDir = dir;\n\n while (true) {\n if (fs.existsSync(path.join(currentDir, \"package.json\"))) {\n projectRootCache.set(dir, currentDir);\n return currentDir;\n }\n\n const parent = path.dirname(currentDir);\n\n if (parent === currentDir) {\n projectRootCache.set(dir, null);\n return null;\n }\n\n currentDir = parent;\n }\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as ts from \"typescript\";\n\nconst envFileCache = new Map<string, string>();\nconst envVarsCache = new Map<string, Record<string, string>>();\n\nexport function env$(key: string, context?: MacroContext): string {\n if (!context) {\n throw new Error(\"env$ must be called within a macro context\");\n }\n\n const keyNode = key as unknown as ts.Node;\n const resolvedKey = context.resolveNodeValue(keyNode);\n\n if (typeof resolvedKey !== \"string\") {\n throw new Error(\"env$ key must be a string literal\");\n }\n\n const sourceDir = path.dirname(context.sourceFile.fileName);\n let envPath = envFileCache.get(sourceDir);\n\n if (!envPath) {\n envPath = findEnvFile(sourceDir) ?? undefined;\n if (envPath) {\n envFileCache.set(sourceDir, envPath);\n }\n }\n\n let envVars: Record<string, string> = {};\n\n if (envPath) {\n let cached = envVarsCache.get(envPath);\n if (!cached) {\n const envContent = fs.readFileSync(envPath, \"utf-8\");\n cached = parseEnvFile(envContent);\n envVarsCache.set(envPath, cached);\n }\n envVars = cached;\n }\n\n let value: string | undefined;\n\n if (resolvedKey in envVars) {\n value = envVars[resolvedKey];\n } else if (resolvedKey in process.env) {\n value = process.env[resolvedKey];\n }\n\n if (value === undefined) {\n throw new Error(\n `Environment variable \"${resolvedKey}\" not found in ${\n envPath ? `${envPath} or ` : \"\"\n }process.env`,\n );\n }\n\n return context.factory.createStringLiteral(value) as any;\n}\n\nfunction findEnvFile(startDir: string): string | null {\n let currentDir = startDir;\n\n while (true) {\n const envPath = path.join(currentDir, \".env\");\n\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n\n const parentDir = path.dirname(currentDir);\n\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n\nfunction parseEnvFile(content: string): Record<string, string> {\n const envVars: Record<string, string> = {};\n\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue;\n }\n\n const match = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*)$/);\n\n if (match) {\n const [, key, value] = match;\n\n let parsedValue = value.trim();\n if (\n (parsedValue.startsWith('\"') && parsedValue.endsWith('\"')) ||\n (parsedValue.startsWith(\"'\") && parsedValue.endsWith(\"'\"))\n ) {\n parsedValue = parsedValue.slice(1, -1);\n }\n\n envVars[key] = parsedValue;\n }\n }\n\n return envVars;\n}\n", "import { MacroContext } from \"@kithinji/pod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nconst packageJsonCache = new Map<string, string>();\nconst versionCache = new Map<string, string>();\n\nexport function version$(context?: MacroContext): string {\n if (!context) {\n throw new Error(\"version$ must be called within a macro context\");\n }\n\n const sourceDir = path.dirname(context.sourceFile.fileName);\n\n let packageJsonPath = packageJsonCache.get(sourceDir);\n\n if (!packageJsonPath) {\n packageJsonPath = findPackageJson(sourceDir) ?? undefined;\n\n if (!packageJsonPath) {\n throw new Error(\n `package.json not found (searched from ${context.sourceFile.fileName})`,\n );\n }\n\n packageJsonCache.set(sourceDir, packageJsonPath);\n }\n\n let version = versionCache.get(packageJsonPath);\n\n if (!version) {\n try {\n const content = fs.readFileSync(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n\n if (!packageJson.version || typeof packageJson.version !== \"string\") {\n throw new Error(`No \"version\" field found in ${packageJsonPath}`);\n }\n\n version = packageJson.version;\n versionCache.set(packageJsonPath, version!);\n } catch (error) {\n throw new Error(\n `Failed to read or parse ${packageJsonPath}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n return context.factory.createStringLiteral(version!) as any;\n}\n\nfunction findPackageJson(startDir: string): string | null {\n let currentDir = startDir;\n\n while (true) {\n const packageJsonPath = path.join(currentDir, \"package.json\");\n\n if (fs.existsSync(packageJsonPath)) {\n return packageJsonPath;\n }\n\n const parentDir = path.dirname(currentDir);\n\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["path", "className", "normalizedValue", "f", "fs", "path", "fs", "path", "fs", "path"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/env/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQ7C,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CA2ChE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/env/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQ7C,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAmDhE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kithinji/arcane",
3
- "version": "1.0.19",
3
+ "version": "1.0.20",
4
4
  "description": "",
5
5
  "main": "./dist/node/index.mjs",
6
6
  "types": "./dist/types/index.d.ts",
package/src/env/index.ts CHANGED
@@ -15,40 +15,48 @@ export function env$(key: string, context?: MacroContext): string {
15
15
  const resolvedKey = context.resolveNodeValue(keyNode);
16
16
 
17
17
  if (typeof resolvedKey !== "string") {
18
- context.error("env$ key must be a string literal");
18
+ throw new Error("env$ key must be a string literal");
19
19
  }
20
20
 
21
21
  const sourceDir = path.dirname(context.sourceFile.fileName);
22
-
23
22
  let envPath = envFileCache.get(sourceDir);
24
23
 
25
24
  if (!envPath) {
26
25
  envPath = findEnvFile(sourceDir) ?? undefined;
27
-
28
- if (!envPath) {
29
- throw new Error(
30
- `.env file not found (searched from ${context.sourceFile.fileName})`,
31
- );
26
+ if (envPath) {
27
+ envFileCache.set(sourceDir, envPath);
32
28
  }
29
+ }
33
30
 
34
- envFileCache.set(sourceDir, envPath);
31
+ let envVars: Record<string, string> = {};
32
+
33
+ if (envPath) {
34
+ let cached = envVarsCache.get(envPath);
35
+ if (!cached) {
36
+ const envContent = fs.readFileSync(envPath, "utf-8");
37
+ cached = parseEnvFile(envContent);
38
+ envVarsCache.set(envPath, cached);
39
+ }
40
+ envVars = cached;
35
41
  }
36
42
 
37
- let envVars = envVarsCache.get(envPath);
43
+ let value: string | undefined;
38
44
 
39
- if (!envVars) {
40
- const envContent = fs.readFileSync(envPath, "utf-8");
41
- envVars = parseEnvFile(envContent);
42
- envVarsCache.set(envPath, envVars);
45
+ if (resolvedKey in envVars) {
46
+ value = envVars[resolvedKey];
47
+ } else if (resolvedKey in process.env) {
48
+ value = process.env[resolvedKey];
43
49
  }
44
50
 
45
- if (!(resolvedKey in envVars)) {
46
- context.error(
47
- `Environment variable "${resolvedKey}" not found in ${envPath}`,
51
+ if (value === undefined) {
52
+ throw new Error(
53
+ `Environment variable "${resolvedKey}" not found in ${
54
+ envPath ? `${envPath} or ` : ""
55
+ }process.env`,
48
56
  );
49
57
  }
50
58
 
51
- return context.factory.createStringLiteral(envVars[resolvedKey]) as any;
59
+ return context.factory.createStringLiteral(value) as any;
52
60
  }
53
61
 
54
62
  function findEnvFile(startDir: string): string | null {