@tokens-studio/tokenscript-schemas 0.0.13 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +21 -0
  2. package/bundled/functions/adjust_chroma.json +60 -0
  3. package/bundled/functions/adjust_hue.json +60 -0
  4. package/bundled/functions/adjust_lightness.json +60 -0
  5. package/bundled/functions/adjust_to_contrast.json +67 -0
  6. package/bundled/functions/alpha_blend.json +31 -0
  7. package/bundled/functions/alpha_scale.json +27 -0
  8. package/bundled/functions/analogous.json +32 -0
  9. package/bundled/functions/apca_contrast.json +27 -0
  10. package/bundled/functions/are_similar.json +73 -0
  11. package/bundled/functions/auto_text_color.json +66 -0
  12. package/bundled/functions/best_contrast.json +28 -0
  13. package/bundled/functions/chroma.json +54 -0
  14. package/bundled/functions/clamp_chroma.json +66 -0
  15. package/bundled/functions/clamp_lightness.json +66 -0
  16. package/bundled/functions/clamp_to_gamut.json +23 -0
  17. package/bundled/functions/complement.json +24 -0
  18. package/bundled/functions/contrast_ratio.json +27 -0
  19. package/bundled/functions/cooler.json +52 -0
  20. package/bundled/functions/darken.json +28 -0
  21. package/bundled/functions/delta_e_2000.json +40 -0
  22. package/bundled/functions/delta_e_76.json +27 -0
  23. package/bundled/functions/delta_e_ok.json +27 -0
  24. package/bundled/functions/desaturate.json +28 -0
  25. package/bundled/functions/distributed.json +36 -0
  26. package/bundled/functions/diverging.json +36 -0
  27. package/bundled/functions/grayscale.json +24 -0
  28. package/bundled/functions/harmonize.json +65 -0
  29. package/bundled/functions/hue.json +54 -0
  30. package/bundled/functions/hue_difference.json +27 -0
  31. package/bundled/functions/in_gamut.json +27 -0
  32. package/bundled/functions/interpolate.json +66 -0
  33. package/bundled/functions/invert.json +1 -1
  34. package/bundled/functions/is_cool.json +23 -0
  35. package/bundled/functions/is_dark.json +27 -0
  36. package/bundled/functions/is_light.json +27 -0
  37. package/bundled/functions/is_neutral.json +65 -0
  38. package/bundled/functions/is_warm.json +23 -0
  39. package/bundled/functions/lighten.json +28 -0
  40. package/bundled/functions/lightness.json +61 -0
  41. package/bundled/functions/luminance.json +23 -0
  42. package/bundled/functions/meets_contrast.json +31 -0
  43. package/bundled/functions/mix.json +32 -0
  44. package/bundled/functions/monochromatic.json +28 -0
  45. package/bundled/functions/muted.json +59 -0
  46. package/bundled/functions/neutral_variant.json +59 -0
  47. package/bundled/functions/relative_luminance.json +61 -0
  48. package/bundled/functions/rotate_hue.json +28 -0
  49. package/bundled/functions/saturate.json +28 -0
  50. package/bundled/functions/scale_chroma.json +60 -0
  51. package/bundled/functions/scale_lightness.json +60 -0
  52. package/bundled/functions/sepia.json +59 -0
  53. package/bundled/functions/set_chroma.json +28 -0
  54. package/bundled/functions/set_hue.json +28 -0
  55. package/bundled/functions/set_lightness.json +28 -0
  56. package/bundled/functions/shade_scale.json +28 -0
  57. package/bundled/functions/split_complement.json +28 -0
  58. package/bundled/functions/steps.json +32 -0
  59. package/bundled/functions/tetradic.json +24 -0
  60. package/bundled/functions/tint_scale.json +36 -0
  61. package/bundled/functions/to_gamut.json +59 -0
  62. package/bundled/functions/triadic.json +24 -0
  63. package/bundled/functions/vibrant.json +59 -0
  64. package/bundled/functions/warmer.json +52 -0
  65. package/bundled/functions/wcag_level.json +60 -0
  66. package/bundled/functions.json +2602 -6
  67. package/bundled/registry.json +3705 -84
  68. package/bundled/types/css-color.json +151 -0
  69. package/bundled/types/hsl-color.json +66 -0
  70. package/bundled/types/hsv-color.json +57 -0
  71. package/bundled/types/hwb-color.json +66 -0
  72. package/bundled/types/lab-color.json +57 -0
  73. package/bundled/types/lch-color.json +57 -0
  74. package/bundled/types/okhsl-color.json +57 -0
  75. package/bundled/types/okhsv-color.json +57 -0
  76. package/bundled/types/oklab-color.json +87 -0
  77. package/bundled/types/oklch-color.json +57 -0
  78. package/bundled/types/p3-color.json +57 -0
  79. package/bundled/types/p3-linear-color.json +57 -0
  80. package/bundled/types/rgb-color.json +12 -3
  81. package/bundled/types/srgb-color.json +77 -0
  82. package/bundled/types/srgb-linear-color.json +67 -0
  83. package/bundled/types/xyz-d50-color.json +57 -0
  84. package/bundled/types/xyz-d65-color.json +77 -0
  85. package/bundled/types.json +1067 -43
  86. package/dist/cli/index.cjs +231 -22
  87. package/dist/cli/index.cjs.map +1 -1
  88. package/dist/cli/index.js +231 -22
  89. package/dist/cli/index.js.map +1 -1
  90. package/dist/index.cjs +5 -2
  91. package/dist/index.cjs.map +1 -1
  92. package/dist/index.d.cts +4 -1
  93. package/dist/index.d.ts +4 -1
  94. package/dist/index.js +5 -2
  95. package/dist/index.js.map +1 -1
  96. package/package.json +4 -2
  97. package/src/bundler/index.ts +7 -0
  98. package/src/bundler/presets/css.ts +21 -0
  99. package/src/bundler/presets/index.ts +47 -0
  100. package/src/bundler/presets/types.ts +10 -0
  101. package/src/bundler/selective-bundler.ts +9 -0
  102. package/src/bundler/types.ts +1 -0
  103. package/src/cli/commands/bundle.test.ts +34 -0
  104. package/src/cli/commands/bundle.ts +37 -11
  105. package/src/cli/commands/list.ts +36 -4
  106. package/src/cli/commands/presets.ts +81 -0
  107. package/src/cli/index.ts +12 -1
  108. package/src/cli/output-generator.ts +8 -2
  109. package/src/cli/version-info.ts +93 -0
  110. package/src/schemas/types/css-color/from-hsl-color.tokenscript +17 -4
  111. package/src/schemas/types/css-color/from-hwb-color.tokenscript +17 -4
  112. package/src/schemas/types/css-color/from-lab-color.tokenscript +17 -4
  113. package/src/schemas/types/css-color/from-lch-color.tokenscript +17 -4
  114. package/src/schemas/types/css-color/from-oklab-color.tokenscript +17 -4
  115. package/src/schemas/types/css-color/from-oklch-color.tokenscript +17 -4
  116. package/src/schemas/types/css-color/from-p3-color.tokenscript +17 -4
  117. package/src/schemas/types/css-color/from-rgb-color.tokenscript +17 -4
  118. package/src/schemas/types/css-color/from-srgb-color.tokenscript +17 -4
  119. package/src/schemas/types/css-color/from-xyz-d50-color.tokenscript +17 -4
  120. package/src/schemas/types/css-color/from-xyz-d65-color.tokenscript +17 -4
  121. package/src/schemas/types/css-color/unit.test.ts +216 -0
  122. package/src/schemas/types/hex-color/unit.test.ts +18 -0
  123. package/src/schemas/types/hsl-color/hsla-initializer.tokenscript +17 -0
  124. package/src/schemas/types/hsl-color/initializer.tokenscript +6 -1
  125. package/src/schemas/types/hsl-color/schema.json +9 -0
  126. package/src/schemas/types/hsl-color/unit.test.ts +95 -1
  127. package/src/schemas/types/hsv-color/initializer.tokenscript +6 -1
  128. package/src/schemas/types/hsv-color/unit.test.ts +44 -0
  129. package/src/schemas/types/hwb-color/hwba-initializer.tokenscript +17 -0
  130. package/src/schemas/types/hwb-color/initializer.tokenscript +6 -1
  131. package/src/schemas/types/hwb-color/schema.json +9 -0
  132. package/src/schemas/types/hwb-color/unit.test.ts +70 -0
  133. package/src/schemas/types/lab-color/initializer.tokenscript +6 -1
  134. package/src/schemas/types/lab-color/unit.test.ts +44 -0
  135. package/src/schemas/types/lch-color/initializer.tokenscript +6 -1
  136. package/src/schemas/types/lch-color/unit.test.ts +44 -0
  137. package/src/schemas/types/okhsl-color/initializer.tokenscript +8 -1
  138. package/src/schemas/types/okhsl-color/unit.test.ts +37 -0
  139. package/src/schemas/types/okhsv-color/initializer.tokenscript +8 -1
  140. package/src/schemas/types/okhsv-color/unit.test.ts +37 -0
  141. package/src/schemas/types/oklab-color/initializer.tokenscript +6 -1
  142. package/src/schemas/types/oklab-color/unit.test.ts +58 -0
  143. package/src/schemas/types/oklch-color/initializer.tokenscript +6 -1
  144. package/src/schemas/types/oklch-color/unit.test.ts +58 -0
  145. package/src/schemas/types/p3-color/initializer.tokenscript +6 -1
  146. package/src/schemas/types/p3-color/unit.test.ts +47 -0
  147. package/src/schemas/types/rgb-color/initializer.tokenscript +7 -1
  148. package/src/schemas/types/rgb-color/rgba-initializer.tokenscript +17 -0
  149. package/src/schemas/types/rgb-color/schema.json +9 -0
  150. package/src/schemas/types/rgb-color/unit.test.ts +110 -1
  151. package/src/schemas/types/srgb-color/initializer.tokenscript +6 -1
  152. package/src/schemas/types/srgb-color/unit.test.ts +89 -0
  153. package/bundled/types/rgba-color.json +0 -89
package/dist/index.d.ts CHANGED
@@ -77,6 +77,7 @@ interface BundledRegistry {
77
77
  metadata: {
78
78
  generatedAt: string;
79
79
  totalSchemas: number;
80
+ generatedBy: string;
80
81
  };
81
82
  }
82
83
 
@@ -87,7 +88,9 @@ interface BundledRegistry {
87
88
  /**
88
89
  * Bundle all schemas from the schemas directory
89
90
  */
90
- declare function bundleAllSchemas(schemasDir: string, outputDir: string): Promise<BundledRegistry>;
91
+ declare function bundleAllSchemas(schemasDir: string, outputDir: string, options?: {
92
+ cliArgs?: string[];
93
+ }): Promise<BundledRegistry>;
91
94
 
92
95
  /**
93
96
  * Types for schema downloader
package/dist/index.js CHANGED
@@ -135,7 +135,7 @@ async function bundleFunctionCategory(categoryDir) {
135
135
  }
136
136
  return bundles;
137
137
  }
138
- async function bundleAllSchemas(schemasDir, outputDir) {
138
+ async function bundleAllSchemas(schemasDir, outputDir, options) {
139
139
  console.log("\nBundling type schemas...");
140
140
  const typesDir = join(schemasDir, "types");
141
141
  const types = await bundleTypeCategory(typesDir);
@@ -144,13 +144,16 @@ async function bundleAllSchemas(schemasDir, outputDir) {
144
144
  const functionsDir = join(schemasDir, "functions");
145
145
  const functions = await bundleFunctionCategory(functionsDir);
146
146
  console.log(`\u2713 Bundled ${functions.length} function schemas`);
147
+ const baseCommand = "npx @tokens-studio/tokenscript-schemas bundle";
148
+ const generatedBy = options?.cliArgs?.length ? `${baseCommand} ${options.cliArgs.join(" ")}` : baseCommand;
147
149
  const registry = {
148
150
  version: "0.0.10",
149
151
  types,
150
152
  functions,
151
153
  metadata: {
152
154
  generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
153
- totalSchemas: types.length + functions.length
155
+ totalSchemas: types.length + functions.length,
156
+ generatedBy
154
157
  }
155
158
  };
156
159
  await mkdir(outputDir, { recursive: true });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bundler/bundle-schema.ts","../src/bundler/utils.ts","../src/bundler/index.ts","../src/downloader/index.ts"],"names":["join","mkdir","writeFile"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shared schema bundling logic\n * Used by both the build-time bundler and runtime test helpers\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\n\nexport interface BundleOptions {\n /**\n * Base URL to prepend to relative schema URIs\n * If provided, transforms /api/v1/... to https://domain.com/api/v1/...\n * If not provided, keeps URIs as-is (useful for tests)\n */\n baseUrl?: string;\n}\n\n/**\n * Replace script file references with actual content\n * This is the core bundling logic shared by build and runtime\n */\nexport async function bundleSchemaFromDirectory(\n schemaDir: string,\n options?: BundleOptions,\n): Promise<SchemaSpecification> {\n // Read schema.json which contains the full specification\n const schemaJsonPath = join(schemaDir, \"schema.json\");\n const schemaContent = await readFile(schemaJsonPath, \"utf-8\");\n const schema = JSON.parse(schemaContent) as SchemaSpecification;\n\n if (schema.type === \"function\") {\n return await inlineFunctionScriptReferences(\n schemaDir,\n schema as FunctionSpecification,\n options,\n );\n } else {\n return await inlineColorScriptReferences(schemaDir, schema as ColorSpecification, options);\n }\n}\n\n/**\n * Inline script file references in a color schema specification\n */\nasync function inlineColorScriptReferences(\n schemaDir: string,\n schema: ColorSpecification,\n options?: BundleOptions,\n): Promise<ColorSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as ColorSpecification;\n\n // Inline initializer scripts and transform URIs\n for (const initializer of result.initializers) {\n if (initializer.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, initializer.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n initializer.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n initializer.script.type = addBaseUrl(initializer.script.type, options.baseUrl);\n }\n }\n\n // Inline conversion scripts and transform URIs\n for (const conversion of result.conversions) {\n if (conversion.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, conversion.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n conversion.script.script = scriptContent.trim();\n }\n\n // Transform URIs if baseUrl is provided\n if (options?.baseUrl) {\n conversion.script.type = addBaseUrl(conversion.script.type, options.baseUrl);\n\n // Transform source and target URIs (but not $self)\n if (conversion.source !== \"$self\") {\n conversion.source = addBaseUrl(conversion.source, options.baseUrl);\n }\n if (conversion.target !== \"$self\") {\n conversion.target = addBaseUrl(conversion.target, options.baseUrl);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Inline script file references in a function specification\n */\nasync function inlineFunctionScriptReferences(\n schemaDir: string,\n schema: FunctionSpecification,\n options?: BundleOptions,\n): Promise<FunctionSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as FunctionSpecification;\n\n // Inline the main function script\n if (result.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, result.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n result.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n result.script.type = addBaseUrl(result.script.type, options.baseUrl);\n\n // Transform requirement URIs\n if (result.requirements) {\n const baseUrl = options.baseUrl;\n result.requirements = result.requirements.map((req) => addBaseUrl(req, baseUrl));\n }\n }\n\n return result;\n}\n\n/**\n * Add base URL to relative schema URIs\n * Transforms /api/v1/... to https://domain.com/api/v1/...\n */\nfunction addBaseUrl(uri: string, baseUrl: string): string {\n // If URI already has a protocol, return as-is\n if (uri.includes(\"://\")) {\n return uri;\n }\n\n // If URI is relative (starts with /), prepend base URL\n if (uri.startsWith(\"/\")) {\n // Remove trailing slash from baseUrl if present\n const cleanBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n return `${cleanBaseUrl}${uri}`;\n }\n\n // Otherwise return as-is (e.g., $self)\n return uri;\n}\n","/**\n * Bundler utilities\n */\n\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/**\n * Check if a path is a directory\n */\nexport async function isDirectory(path: string): Promise<boolean> {\n try {\n const stats = await stat(path);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Get all subdirectories in a directory\n */\nexport async function getSubdirectories(dir: string): Promise<string[]> {\n const entries = await readdir(dir);\n const subdirs: string[] = [];\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n if (await isDirectory(fullPath)) {\n subdirs.push(entry);\n }\n }\n\n return subdirs;\n}\n\n/**\n * Read all tokenscript files from a schema directory\n */\nexport async function readTokenScriptFiles(schemaDir: string): Promise<Record<string, string>> {\n const entries = await readdir(schemaDir);\n const scripts: Record<string, string> = {};\n\n for (const entry of entries) {\n if (entry.endsWith(\".tokenscript\")) {\n const filePath = join(schemaDir, entry);\n const content = await readFile(filePath, \"utf-8\");\n const scriptName = entry.replace(\".tokenscript\", \"\");\n scripts[scriptName] = content;\n }\n }\n\n return scripts;\n}\n\n/**\n * Read and parse a JSON file\n */\nexport async function readJsonFile<T = unknown>(filePath: string): Promise<T> {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n}\n\n/**\n * Check if a file exists\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Schema bundler - bundles schemas for distribution\n */\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { bundleSchemaFromDirectory } from \"@/bundler/bundle-schema\";\nimport type {\n BundledRegistry,\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\nimport { getSubdirectories } from \"@/bundler/utils\";\n\n/**\n * Default registry URL for build-time bundling\n */\nconst DEFAULT_REGISTRY_URL = \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\n/**\n * Bundle a single schema from its directory\n */\nasync function bundleSchema(schemaDir: string, schemaSlug: string): Promise<SchemaSpecification> {\n // Use shared bundling logic with baseUrl for build-time\n const bundled = await bundleSchemaFromDirectory(schemaDir, {\n baseUrl: DEFAULT_REGISTRY_URL,\n });\n\n // Add slug from folder name\n bundled.slug = schemaSlug;\n\n return bundled;\n}\n\n/**\n * Bundle all color type schemas from a category directory\n */\nasync function bundleTypeCategory(categoryDir: string): Promise<ColorSpecification[]> {\n const bundles: ColorSpecification[] = [];\n const schemaSlugs = await getSubdirectories(categoryDir);\n\n for (const slug of schemaSlugs) {\n const schemaDir = join(categoryDir, slug);\n console.log(` Bundling ${slug}...`);\n\n try {\n const bundle = await bundleSchema(schemaDir, slug);\n if (bundle.type === \"color\") {\n bundles.push(bundle as ColorSpecification);\n }\n } catch (error) {\n console.error(` ✗ Failed to bundle ${slug}:`, error);\n }\n }\n\n return bundles;\n}\n\n/**\n * Bundle all function schemas from a category directory\n */\nasync function bundleFunctionCategory(categoryDir: string): Promise<FunctionSpecification[]> {\n const bundles: FunctionSpecification[] = [];\n const schemaSlugs = await getSubdirectories(categoryDir);\n\n for (const slug of schemaSlugs) {\n const schemaDir = join(categoryDir, slug);\n console.log(` Bundling ${slug}...`);\n\n try {\n const bundle = await bundleSchema(schemaDir, slug);\n if (bundle.type === \"function\") {\n bundles.push(bundle as FunctionSpecification);\n }\n } catch (error) {\n console.error(` ✗ Failed to bundle ${slug}:`, error);\n }\n }\n\n return bundles;\n}\n\n/**\n * Bundle all schemas from the schemas directory\n */\nexport async function bundleAllSchemas(\n schemasDir: string,\n outputDir: string,\n): Promise<BundledRegistry> {\n // Bundle types\n console.log(\"\\nBundling type schemas...\");\n const typesDir = join(schemasDir, \"types\");\n const types = await bundleTypeCategory(typesDir);\n console.log(`✓ Bundled ${types.length} type schemas`);\n\n // Bundle functions\n console.log(\"\\nBundling function schemas...\");\n const functionsDir = join(schemasDir, \"functions\");\n const functions = await bundleFunctionCategory(functionsDir);\n console.log(`✓ Bundled ${functions.length} function schemas`);\n\n // Create bundled registry\n const registry: BundledRegistry = {\n version: \"0.0.10\",\n types,\n functions,\n metadata: {\n generatedAt: new Date().toISOString(),\n totalSchemas: types.length + functions.length,\n },\n };\n\n // Ensure output directory exists\n await mkdir(outputDir, { recursive: true });\n\n // Write complete registry\n const registryPath = join(outputDir, \"registry.json\");\n await writeFile(registryPath, JSON.stringify(registry, null, 2));\n console.log(`\\n✓ Written complete registry to ${registryPath}`);\n\n // Write individual category bundles\n const typesPath = join(outputDir, \"types.json\");\n await writeFile(typesPath, JSON.stringify({ version: registry.version, types }, null, 2));\n console.log(`✓ Written types bundle to ${typesPath}`);\n\n const functionsPath = join(outputDir, \"functions.json\");\n await writeFile(functionsPath, JSON.stringify({ version: registry.version, functions }, null, 2));\n console.log(`✓ Written functions bundle to ${functionsPath}`);\n\n // Write individual schema bundles\n const typesOutputDir = join(outputDir, \"types\");\n await mkdir(typesOutputDir, { recursive: true });\n for (const type of types) {\n const typePath = join(typesOutputDir, `${type.slug}.json`);\n await writeFile(typePath, JSON.stringify(type, null, 2));\n }\n console.log(`✓ Written ${types.length} individual type schemas`);\n\n const functionsOutputDir = join(outputDir, \"functions\");\n await mkdir(functionsOutputDir, { recursive: true });\n for (const func of functions) {\n const funcPath = join(functionsOutputDir, `${func.slug}.json`);\n await writeFile(funcPath, JSON.stringify(func, null, 2));\n }\n console.log(`✓ Written ${functions.length} individual function schemas`);\n\n return registry;\n}\n\nexport type * from \"@/bundler/types.js\";\n","/**\n * Schema downloader - fetches schemas from the TokenScript API\n */\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n SchemaConfig,\n SchemaDetails,\n SchemaListItem,\n SchemaVersion,\n} from \"@/downloader/types.js\";\n\nconst DEFAULT_CONFIG: SchemaConfig = {\n apiBaseUrl: \"https://schema.tokenscript.dev.gcp.tokens.studio/api/v1\",\n outputDir: \"src/schemas\",\n targetVersion: \"0.0.10\",\n};\n\n/**\n * Fetch all schemas from the API\n */\nexport async function fetchSchemaList(\n config: SchemaConfig = DEFAULT_CONFIG,\n): Promise<SchemaListItem[]> {\n const url = `${config.apiBaseUrl}/schema/?format=json`;\n\n console.log(`Fetching schema list from ${url}...`);\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schemas: ${response.statusText}`);\n }\n\n const data = (await response.json()) as SchemaListItem[];\n console.log(`Found ${data.length} schemas`);\n\n return data;\n}\n\n/**\n * Fetch versions for a schema\n */\nexport async function fetchSchemaVersions(\n schemaSlug: string,\n config: SchemaConfig = DEFAULT_CONFIG,\n): Promise<SchemaVersion[]> {\n const url = `${config.apiBaseUrl}/schema/${schemaSlug}/versions/?format=json`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch versions for ${schemaSlug}: ${response.statusText}`);\n }\n\n return (await response.json()) as SchemaVersion[];\n}\n\n/**\n * Create the folder structure for a schema\n */\nasync function createSchemaFolder(\n schemaSlug: string,\n schemaType: \"type\" | \"function\",\n baseDir: string,\n): Promise<string> {\n const schemaPath = join(baseDir, schemaType === \"type\" ? \"types\" : \"functions\", schemaSlug);\n await mkdir(schemaPath, { recursive: true });\n return schemaPath;\n}\n\n/**\n * Write schema.json file\n */\nasync function writeSchemaJson(\n schemaPath: string,\n schema: SchemaDetails,\n targetVersion: string,\n): Promise<void> {\n const content = schema.content as any;\n\n const schemaJson = {\n id: schema.id,\n slug: schema.slug,\n name: schema.name,\n description: schema.description,\n type: schema.type,\n version: targetVersion,\n originalVersion: schema.version,\n contentType: content.type || null,\n metadata: schema.metadata || {},\n };\n\n await writeFile(join(schemaPath, \"schema.json\"), JSON.stringify(schemaJson, null, 2));\n}\n\n/**\n * Generate a unit test stub\n */\nasync function createUnitTestStub(\n schemaPath: string,\n schemaName: string,\n schemaType: \"type\" | \"function\",\n): Promise<void> {\n const testContent = `import { describe, test, expect } from \"vitest\";\n\ndescribe(\"${schemaName}\", () => {\n test.todo(\"should implement ${schemaType} functionality\");\n});\n`;\n\n await writeFile(join(schemaPath, \"unit.test.ts\"), testContent);\n}\n\n/**\n * Extract conversion script name from source/target\n */\nfunction getConversionFileName(source: string, target: string): string {\n // Extract the type name from URLs like \"https://schema.../core/hex-color/0/\"\n const extractType = (url: string): string => {\n const match = url.match(/\\/([^/]+)\\/\\d+\\/?$/);\n return match ? match[1] : url;\n };\n\n const sourceType = extractType(source);\n const targetType = extractType(target);\n\n if (target === \"$self\") {\n return `to-${sourceType}.tokenscript`;\n }\n if (source === \"$self\") {\n return `from-${targetType}.tokenscript`;\n }\n\n return `${sourceType}-to-${targetType}.tokenscript`;\n}\n\n/**\n * Write TokenScript files from schema content\n */\nasync function writeTokenScriptFiles(schemaPath: string, schema: SchemaDetails): Promise<void> {\n const content = schema.content as any;\n\n // Write the main schema definition as JSON\n if (content.schema) {\n await writeFile(\n join(schemaPath, \"schema-definition.json\"),\n JSON.stringify(content.schema, null, 2),\n );\n }\n\n // Extract and write conversion scripts\n if (content.conversions && Array.isArray(content.conversions)) {\n for (const conversion of content.conversions) {\n if (conversion.script?.script) {\n const fileName = getConversionFileName(conversion.source || \"\", conversion.target || \"\");\n\n // Add description as comment if available\n let scriptContent = \"\";\n if (conversion.description) {\n scriptContent += `# ${conversion.description}\\n`;\n scriptContent += `# Source: ${conversion.source}\\n`;\n scriptContent += `# Target: ${conversion.target}\\n`;\n scriptContent += `# Lossless: ${conversion.lossless || false}\\n\\n`;\n }\n\n scriptContent += conversion.script.script;\n\n await writeFile(join(schemaPath, fileName), scriptContent);\n }\n }\n }\n\n // Create initializer if no conversions found\n if (!content.conversions || content.conversions.length === 0) {\n const initializerContent = `# ${schema.name} Initializer\n# TODO: Implement initialization logic\n\n`;\n await writeFile(join(schemaPath, \"initializer.tokenscript\"), initializerContent);\n }\n}\n\n/**\n * Download and organize a single schema\n */\nexport async function downloadSchema(\n schema: SchemaListItem,\n config: SchemaConfig = DEFAULT_CONFIG,\n): Promise<void> {\n console.log(`Downloading ${schema.slug}...`);\n\n // Fetch all versions\n const versions = await fetchSchemaVersions(schema.slug, config);\n\n if (versions.length === 0) {\n console.warn(`No versions found for ${schema.slug}, skipping`);\n return;\n }\n\n // Get the latest version (first one)\n const latestVersion = versions[0];\n\n // Create folder structure\n const schemaPath = await createSchemaFolder(schema.slug, schema.type, config.outputDir);\n\n // Combine schema info with version info\n const details: SchemaDetails = {\n id: schema.id,\n slug: schema.slug,\n name: schema.name,\n description: schema.description,\n type: schema.type,\n version: latestVersion.version,\n content: latestVersion.content,\n };\n\n // Write files\n await writeSchemaJson(schemaPath, details, config.targetVersion);\n await writeTokenScriptFiles(schemaPath, details);\n await createUnitTestStub(schemaPath, schema.name, schema.type);\n\n console.log(`✓ Downloaded ${schema.slug} to ${schemaPath}`);\n}\n\n/**\n * Download all schemas from the API\n */\nexport async function downloadAllSchemas(config: Partial<SchemaConfig> = {}): Promise<void> {\n const fullConfig = { ...DEFAULT_CONFIG, ...config };\n\n // Fetch schema list\n const schemas = await fetchSchemaList(fullConfig);\n\n // Download each schema\n for (const schema of schemas) {\n try {\n await downloadSchema(schema, fullConfig);\n } catch (error) {\n console.error(`Failed to download ${schema.slug}:`, error);\n }\n }\n\n console.log(\"\\n✓ All schemas downloaded successfully!\");\n}\n\nexport { DEFAULT_CONFIG };\nexport type * from \"@/downloader/types.js\";\n"]}
1
+ {"version":3,"sources":["../src/bundler/bundle-schema.ts","../src/bundler/utils.ts","../src/bundler/index.ts","../src/downloader/index.ts"],"names":["join","mkdir","writeFile"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shared schema bundling logic\n * Used by both the build-time bundler and runtime test helpers\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\n\nexport interface BundleOptions {\n /**\n * Base URL to prepend to relative schema URIs\n * If provided, transforms /api/v1/... to https://domain.com/api/v1/...\n * If not provided, keeps URIs as-is (useful for tests)\n */\n baseUrl?: string;\n}\n\n/**\n * Replace script file references with actual content\n * This is the core bundling logic shared by build and runtime\n */\nexport async function bundleSchemaFromDirectory(\n schemaDir: string,\n options?: BundleOptions,\n): Promise<SchemaSpecification> {\n // Read schema.json which contains the full specification\n const schemaJsonPath = join(schemaDir, \"schema.json\");\n const schemaContent = await readFile(schemaJsonPath, \"utf-8\");\n const schema = JSON.parse(schemaContent) as SchemaSpecification;\n\n if (schema.type === \"function\") {\n return await inlineFunctionScriptReferences(\n schemaDir,\n schema as FunctionSpecification,\n options,\n );\n } else {\n return await inlineColorScriptReferences(schemaDir, schema as ColorSpecification, options);\n }\n}\n\n/**\n * Inline script file references in a color schema specification\n */\nasync function inlineColorScriptReferences(\n schemaDir: string,\n schema: ColorSpecification,\n options?: BundleOptions,\n): Promise<ColorSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as ColorSpecification;\n\n // Inline initializer scripts and transform URIs\n for (const initializer of result.initializers) {\n if (initializer.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, initializer.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n initializer.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n initializer.script.type = addBaseUrl(initializer.script.type, options.baseUrl);\n }\n }\n\n // Inline conversion scripts and transform URIs\n for (const conversion of result.conversions) {\n if (conversion.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, conversion.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n conversion.script.script = scriptContent.trim();\n }\n\n // Transform URIs if baseUrl is provided\n if (options?.baseUrl) {\n conversion.script.type = addBaseUrl(conversion.script.type, options.baseUrl);\n\n // Transform source and target URIs (but not $self)\n if (conversion.source !== \"$self\") {\n conversion.source = addBaseUrl(conversion.source, options.baseUrl);\n }\n if (conversion.target !== \"$self\") {\n conversion.target = addBaseUrl(conversion.target, options.baseUrl);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Inline script file references in a function specification\n */\nasync function inlineFunctionScriptReferences(\n schemaDir: string,\n schema: FunctionSpecification,\n options?: BundleOptions,\n): Promise<FunctionSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as FunctionSpecification;\n\n // Inline the main function script\n if (result.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, result.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n result.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n result.script.type = addBaseUrl(result.script.type, options.baseUrl);\n\n // Transform requirement URIs\n if (result.requirements) {\n const baseUrl = options.baseUrl;\n result.requirements = result.requirements.map((req) => addBaseUrl(req, baseUrl));\n }\n }\n\n return result;\n}\n\n/**\n * Add base URL to relative schema URIs\n * Transforms /api/v1/... to https://domain.com/api/v1/...\n */\nfunction addBaseUrl(uri: string, baseUrl: string): string {\n // If URI already has a protocol, return as-is\n if (uri.includes(\"://\")) {\n return uri;\n }\n\n // If URI is relative (starts with /), prepend base URL\n if (uri.startsWith(\"/\")) {\n // Remove trailing slash from baseUrl if present\n const cleanBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n return `${cleanBaseUrl}${uri}`;\n }\n\n // Otherwise return as-is (e.g., $self)\n return uri;\n}\n","/**\n * Bundler utilities\n */\n\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/**\n * Check if a path is a directory\n */\nexport async function isDirectory(path: string): Promise<boolean> {\n try {\n const stats = await stat(path);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Get all subdirectories in a directory\n */\nexport async function getSubdirectories(dir: string): Promise<string[]> {\n const entries = await readdir(dir);\n const subdirs: string[] = [];\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n if (await isDirectory(fullPath)) {\n subdirs.push(entry);\n }\n }\n\n return subdirs;\n}\n\n/**\n * Read all tokenscript files from a schema directory\n */\nexport async function readTokenScriptFiles(schemaDir: string): Promise<Record<string, string>> {\n const entries = await readdir(schemaDir);\n const scripts: Record<string, string> = {};\n\n for (const entry of entries) {\n if (entry.endsWith(\".tokenscript\")) {\n const filePath = join(schemaDir, entry);\n const content = await readFile(filePath, \"utf-8\");\n const scriptName = entry.replace(\".tokenscript\", \"\");\n scripts[scriptName] = content;\n }\n }\n\n return scripts;\n}\n\n/**\n * Read and parse a JSON file\n */\nexport async function readJsonFile<T = unknown>(filePath: string): Promise<T> {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n}\n\n/**\n * Check if a file exists\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Schema bundler - bundles schemas for distribution\n */\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { bundleSchemaFromDirectory } from \"@/bundler/bundle-schema\";\nimport type {\n BundledRegistry,\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\nimport { getSubdirectories } from \"@/bundler/utils\";\n\n/**\n * Default registry URL for build-time bundling\n */\nconst DEFAULT_REGISTRY_URL = \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\n/**\n * Bundle a single schema from its directory\n */\nasync function bundleSchema(schemaDir: string, schemaSlug: string): Promise<SchemaSpecification> {\n // Use shared bundling logic with baseUrl for build-time\n const bundled = await bundleSchemaFromDirectory(schemaDir, {\n baseUrl: DEFAULT_REGISTRY_URL,\n });\n\n // Add slug from folder name\n bundled.slug = schemaSlug;\n\n return bundled;\n}\n\n/**\n * Bundle all color type schemas from a category directory\n */\nasync function bundleTypeCategory(categoryDir: string): Promise<ColorSpecification[]> {\n const bundles: ColorSpecification[] = [];\n const schemaSlugs = await getSubdirectories(categoryDir);\n\n for (const slug of schemaSlugs) {\n const schemaDir = join(categoryDir, slug);\n console.log(` Bundling ${slug}...`);\n\n try {\n const bundle = await bundleSchema(schemaDir, slug);\n if (bundle.type === \"color\") {\n bundles.push(bundle as ColorSpecification);\n }\n } catch (error) {\n console.error(` ✗ Failed to bundle ${slug}:`, error);\n }\n }\n\n return bundles;\n}\n\n/**\n * Bundle all function schemas from a category directory\n */\nasync function bundleFunctionCategory(categoryDir: string): Promise<FunctionSpecification[]> {\n const bundles: FunctionSpecification[] = [];\n const schemaSlugs = await getSubdirectories(categoryDir);\n\n for (const slug of schemaSlugs) {\n const schemaDir = join(categoryDir, slug);\n console.log(` Bundling ${slug}...`);\n\n try {\n const bundle = await bundleSchema(schemaDir, slug);\n if (bundle.type === \"function\") {\n bundles.push(bundle as FunctionSpecification);\n }\n } catch (error) {\n console.error(` ✗ Failed to bundle ${slug}:`, error);\n }\n }\n\n return bundles;\n}\n\n/**\n * Bundle all schemas from the schemas directory\n */\nexport async function bundleAllSchemas(\n schemasDir: string,\n outputDir: string,\n options?: { cliArgs?: string[] },\n): Promise<BundledRegistry> {\n // Bundle types\n console.log(\"\\nBundling type schemas...\");\n const typesDir = join(schemasDir, \"types\");\n const types = await bundleTypeCategory(typesDir);\n console.log(`✓ Bundled ${types.length} type schemas`);\n\n // Bundle functions\n console.log(\"\\nBundling function schemas...\");\n const functionsDir = join(schemasDir, \"functions\");\n const functions = await bundleFunctionCategory(functionsDir);\n console.log(`✓ Bundled ${functions.length} function schemas`);\n\n // Create bundled registry\n const baseCommand = \"npx @tokens-studio/tokenscript-schemas bundle\";\n const generatedBy = options?.cliArgs?.length\n ? `${baseCommand} ${options.cliArgs.join(\" \")}`\n : baseCommand;\n\n const registry: BundledRegistry = {\n version: \"0.0.10\",\n types,\n functions,\n metadata: {\n generatedAt: new Date().toISOString(),\n totalSchemas: types.length + functions.length,\n generatedBy,\n },\n };\n\n // Ensure output directory exists\n await mkdir(outputDir, { recursive: true });\n\n // Write complete registry\n const registryPath = join(outputDir, \"registry.json\");\n await writeFile(registryPath, JSON.stringify(registry, null, 2));\n console.log(`\\n✓ Written complete registry to ${registryPath}`);\n\n // Write individual category bundles\n const typesPath = join(outputDir, \"types.json\");\n await writeFile(typesPath, JSON.stringify({ version: registry.version, types }, null, 2));\n console.log(`✓ Written types bundle to ${typesPath}`);\n\n const functionsPath = join(outputDir, \"functions.json\");\n await writeFile(functionsPath, JSON.stringify({ version: registry.version, functions }, null, 2));\n console.log(`✓ Written functions bundle to ${functionsPath}`);\n\n // Write individual schema bundles\n const typesOutputDir = join(outputDir, \"types\");\n await mkdir(typesOutputDir, { recursive: true });\n for (const type of types) {\n const typePath = join(typesOutputDir, `${type.slug}.json`);\n await writeFile(typePath, JSON.stringify(type, null, 2));\n }\n console.log(`✓ Written ${types.length} individual type schemas`);\n\n const functionsOutputDir = join(outputDir, \"functions\");\n await mkdir(functionsOutputDir, { recursive: true });\n for (const func of functions) {\n const funcPath = join(functionsOutputDir, `${func.slug}.json`);\n await writeFile(funcPath, JSON.stringify(func, null, 2));\n }\n console.log(`✓ Written ${functions.length} individual function schemas`);\n\n return registry;\n}\n\nexport type * from \"@/bundler/types.js\";\n","/**\n * Schema downloader - fetches schemas from the TokenScript API\n */\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n SchemaConfig,\n SchemaDetails,\n SchemaListItem,\n SchemaVersion,\n} from \"@/downloader/types.js\";\n\nconst DEFAULT_CONFIG: SchemaConfig = {\n apiBaseUrl: \"https://schema.tokenscript.dev.gcp.tokens.studio/api/v1\",\n outputDir: \"src/schemas\",\n targetVersion: \"0.0.10\",\n};\n\n/**\n * Fetch all schemas from the API\n */\nexport async function fetchSchemaList(\n config: SchemaConfig = DEFAULT_CONFIG,\n): Promise<SchemaListItem[]> {\n const url = `${config.apiBaseUrl}/schema/?format=json`;\n\n console.log(`Fetching schema list from ${url}...`);\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch schemas: ${response.statusText}`);\n }\n\n const data = (await response.json()) as SchemaListItem[];\n console.log(`Found ${data.length} schemas`);\n\n return data;\n}\n\n/**\n * Fetch versions for a schema\n */\nexport async function fetchSchemaVersions(\n schemaSlug: string,\n config: SchemaConfig = DEFAULT_CONFIG,\n): Promise<SchemaVersion[]> {\n const url = `${config.apiBaseUrl}/schema/${schemaSlug}/versions/?format=json`;\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch versions for ${schemaSlug}: ${response.statusText}`);\n }\n\n return (await response.json()) as SchemaVersion[];\n}\n\n/**\n * Create the folder structure for a schema\n */\nasync function createSchemaFolder(\n schemaSlug: string,\n schemaType: \"type\" | \"function\",\n baseDir: string,\n): Promise<string> {\n const schemaPath = join(baseDir, schemaType === \"type\" ? \"types\" : \"functions\", schemaSlug);\n await mkdir(schemaPath, { recursive: true });\n return schemaPath;\n}\n\n/**\n * Write schema.json file\n */\nasync function writeSchemaJson(\n schemaPath: string,\n schema: SchemaDetails,\n targetVersion: string,\n): Promise<void> {\n const content = schema.content as any;\n\n const schemaJson = {\n id: schema.id,\n slug: schema.slug,\n name: schema.name,\n description: schema.description,\n type: schema.type,\n version: targetVersion,\n originalVersion: schema.version,\n contentType: content.type || null,\n metadata: schema.metadata || {},\n };\n\n await writeFile(join(schemaPath, \"schema.json\"), JSON.stringify(schemaJson, null, 2));\n}\n\n/**\n * Generate a unit test stub\n */\nasync function createUnitTestStub(\n schemaPath: string,\n schemaName: string,\n schemaType: \"type\" | \"function\",\n): Promise<void> {\n const testContent = `import { describe, test, expect } from \"vitest\";\n\ndescribe(\"${schemaName}\", () => {\n test.todo(\"should implement ${schemaType} functionality\");\n});\n`;\n\n await writeFile(join(schemaPath, \"unit.test.ts\"), testContent);\n}\n\n/**\n * Extract conversion script name from source/target\n */\nfunction getConversionFileName(source: string, target: string): string {\n // Extract the type name from URLs like \"https://schema.../core/hex-color/0/\"\n const extractType = (url: string): string => {\n const match = url.match(/\\/([^/]+)\\/\\d+\\/?$/);\n return match ? match[1] : url;\n };\n\n const sourceType = extractType(source);\n const targetType = extractType(target);\n\n if (target === \"$self\") {\n return `to-${sourceType}.tokenscript`;\n }\n if (source === \"$self\") {\n return `from-${targetType}.tokenscript`;\n }\n\n return `${sourceType}-to-${targetType}.tokenscript`;\n}\n\n/**\n * Write TokenScript files from schema content\n */\nasync function writeTokenScriptFiles(schemaPath: string, schema: SchemaDetails): Promise<void> {\n const content = schema.content as any;\n\n // Write the main schema definition as JSON\n if (content.schema) {\n await writeFile(\n join(schemaPath, \"schema-definition.json\"),\n JSON.stringify(content.schema, null, 2),\n );\n }\n\n // Extract and write conversion scripts\n if (content.conversions && Array.isArray(content.conversions)) {\n for (const conversion of content.conversions) {\n if (conversion.script?.script) {\n const fileName = getConversionFileName(conversion.source || \"\", conversion.target || \"\");\n\n // Add description as comment if available\n let scriptContent = \"\";\n if (conversion.description) {\n scriptContent += `# ${conversion.description}\\n`;\n scriptContent += `# Source: ${conversion.source}\\n`;\n scriptContent += `# Target: ${conversion.target}\\n`;\n scriptContent += `# Lossless: ${conversion.lossless || false}\\n\\n`;\n }\n\n scriptContent += conversion.script.script;\n\n await writeFile(join(schemaPath, fileName), scriptContent);\n }\n }\n }\n\n // Create initializer if no conversions found\n if (!content.conversions || content.conversions.length === 0) {\n const initializerContent = `# ${schema.name} Initializer\n# TODO: Implement initialization logic\n\n`;\n await writeFile(join(schemaPath, \"initializer.tokenscript\"), initializerContent);\n }\n}\n\n/**\n * Download and organize a single schema\n */\nexport async function downloadSchema(\n schema: SchemaListItem,\n config: SchemaConfig = DEFAULT_CONFIG,\n): Promise<void> {\n console.log(`Downloading ${schema.slug}...`);\n\n // Fetch all versions\n const versions = await fetchSchemaVersions(schema.slug, config);\n\n if (versions.length === 0) {\n console.warn(`No versions found for ${schema.slug}, skipping`);\n return;\n }\n\n // Get the latest version (first one)\n const latestVersion = versions[0];\n\n // Create folder structure\n const schemaPath = await createSchemaFolder(schema.slug, schema.type, config.outputDir);\n\n // Combine schema info with version info\n const details: SchemaDetails = {\n id: schema.id,\n slug: schema.slug,\n name: schema.name,\n description: schema.description,\n type: schema.type,\n version: latestVersion.version,\n content: latestVersion.content,\n };\n\n // Write files\n await writeSchemaJson(schemaPath, details, config.targetVersion);\n await writeTokenScriptFiles(schemaPath, details);\n await createUnitTestStub(schemaPath, schema.name, schema.type);\n\n console.log(`✓ Downloaded ${schema.slug} to ${schemaPath}`);\n}\n\n/**\n * Download all schemas from the API\n */\nexport async function downloadAllSchemas(config: Partial<SchemaConfig> = {}): Promise<void> {\n const fullConfig = { ...DEFAULT_CONFIG, ...config };\n\n // Fetch schema list\n const schemas = await fetchSchemaList(fullConfig);\n\n // Download each schema\n for (const schema of schemas) {\n try {\n await downloadSchema(schema, fullConfig);\n } catch (error) {\n console.error(`Failed to download ${schema.slug}:`, error);\n }\n }\n\n console.log(\"\\n✓ All schemas downloaded successfully!\");\n}\n\nexport { DEFAULT_CONFIG };\nexport type * from \"@/downloader/types.js\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tokens-studio/tokenscript-schemas",
3
- "version": "0.0.13",
3
+ "version": "0.1.0",
4
4
  "description": "Schema registry for TokenScript with bundled schemas and validation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -46,6 +46,8 @@
46
46
  "format:check": "biome format .",
47
47
  "fix": "biome check --write .",
48
48
  "ts:typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.tests.json && tsc --noEmit -p tsconfig.scripts.json",
49
+ "cli": "tsx src/cli/index.ts",
50
+ "cli:presets": "tsx src/cli/index.ts",
49
51
  "download": "tsx scripts/download-schemas.ts",
50
52
  "update-versions": "tsx scripts/update-versions.ts",
51
53
  "bundle": "tsx scripts/bundle-schemas.ts",
@@ -67,7 +69,7 @@
67
69
  "author": "Tokens Studio (https://tokens.studio)",
68
70
  "license": "MPL-2.0",
69
71
  "dependencies": {
70
- "@tokens-studio/tokenscript-interpreter": "^0.16.0",
72
+ "@tokens-studio/tokenscript-interpreter": "^0.17.1",
71
73
  "arktype": "^2.1.25",
72
74
  "cac": "^6.7.14",
73
75
  "ulog": "^2.0.0-beta.19"
@@ -87,6 +87,7 @@ async function bundleFunctionCategory(categoryDir: string): Promise<FunctionSpec
87
87
  export async function bundleAllSchemas(
88
88
  schemasDir: string,
89
89
  outputDir: string,
90
+ options?: { cliArgs?: string[] },
90
91
  ): Promise<BundledRegistry> {
91
92
  // Bundle types
92
93
  console.log("\nBundling type schemas...");
@@ -101,6 +102,11 @@ export async function bundleAllSchemas(
101
102
  console.log(`✓ Bundled ${functions.length} function schemas`);
102
103
 
103
104
  // Create bundled registry
105
+ const baseCommand = "npx @tokens-studio/tokenscript-schemas bundle";
106
+ const generatedBy = options?.cliArgs?.length
107
+ ? `${baseCommand} ${options.cliArgs.join(" ")}`
108
+ : baseCommand;
109
+
104
110
  const registry: BundledRegistry = {
105
111
  version: "0.0.10",
106
112
  types,
@@ -108,6 +114,7 @@ export async function bundleAllSchemas(
108
114
  metadata: {
109
115
  generatedAt: new Date().toISOString(),
110
116
  totalSchemas: types.length + functions.length,
117
+ generatedBy,
111
118
  },
112
119
  };
113
120
 
@@ -0,0 +1,21 @@
1
+ /**
2
+ * CSS preset - Modern CSS color types and functions
3
+ */
4
+
5
+ import type { BundlePreset } from "./types";
6
+
7
+ export const css: BundlePreset = {
8
+ name: "CSS",
9
+ description: "CSS color types",
10
+ types: [
11
+ "hex-color",
12
+ "rgb-color",
13
+ "hsl-color",
14
+ "oklch-color",
15
+ "oklab-color",
16
+
17
+ // Converting colors to css strings
18
+ "css-color",
19
+ ],
20
+ functions: ["lighten", "darken", "saturate", "desaturate", "mix", "invert"],
21
+ };
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Bundle presets - predefined sets of schemas for common use cases
3
+ */
4
+
5
+ import { css } from "./css";
6
+ import type { BundlePreset } from "./types";
7
+
8
+ export type { BundlePreset };
9
+
10
+ /**
11
+ * Available bundle presets
12
+ */
13
+ export const BUNDLE_PRESETS: Record<string, BundlePreset> = {
14
+ css,
15
+ };
16
+
17
+ /**
18
+ * Expand schemas, replacing "preset:name" with actual schema list
19
+ */
20
+ export function expandPresetSchemas(schemas: string[]): string[] {
21
+ const expanded: string[] = [];
22
+
23
+ for (const schema of schemas) {
24
+ if (schema.startsWith("preset:")) {
25
+ const presetName = schema.slice(7); // Remove "preset:"
26
+ const preset = BUNDLE_PRESETS[presetName];
27
+
28
+ if (preset) {
29
+ // Add all types from preset
30
+ for (const type of preset.types) {
31
+ expanded.push(type === "*" ? "*" : `type:${type}`);
32
+ }
33
+ // Add all functions from preset
34
+ for (const func of preset.functions) {
35
+ expanded.push(func === "*" ? "*" : `function:${func}`);
36
+ }
37
+ } else {
38
+ console.warn(`⚠ Unknown preset: ${presetName}`);
39
+ }
40
+ } else {
41
+ // Not a preset, keep as-is
42
+ expanded.push(schema);
43
+ }
44
+ }
45
+
46
+ return expanded;
47
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Bundle preset types
3
+ */
4
+
5
+ export interface BundlePreset {
6
+ name: string;
7
+ description: string;
8
+ types: string[];
9
+ functions: string[];
10
+ }
@@ -17,6 +17,7 @@ export interface SelectiveBundleOptions {
17
17
  schemas: string[]; // Schema slugs to bundle
18
18
  schemasDir?: string; // Source directory (default: src/schemas)
19
19
  baseUrl?: string; // Registry URL for URIs
20
+ cliArgs?: string[]; // CLI arguments used
20
21
  }
21
22
 
22
23
  export interface BundledSchemaEntry {
@@ -30,6 +31,7 @@ export interface SelectiveBundleResult {
30
31
  requestedSchemas: string[];
31
32
  resolvedDependencies: string[];
32
33
  generatedAt: string;
34
+ generatedBy?: string;
33
35
  };
34
36
  dependencyTree: Map<string, DependencyNode>;
35
37
  }
@@ -147,12 +149,19 @@ export async function bundleSelectiveSchemas(
147
149
  }
148
150
  }
149
151
 
152
+ // Build generatedBy string if CLI args are provided
153
+ const baseCommand = "npx @tokens-studio/tokenscript-schemas bundle";
154
+ const generatedBy = options.cliArgs?.length
155
+ ? `${baseCommand} ${options.cliArgs.join(" ")}`
156
+ : undefined;
157
+
150
158
  return {
151
159
  schemas: bundledSchemas,
152
160
  metadata: {
153
161
  requestedSchemas: options.schemas,
154
162
  resolvedDependencies: allSchemas,
155
163
  generatedAt: new Date().toISOString(),
164
+ generatedBy,
156
165
  },
157
166
  dependencyTree,
158
167
  };
@@ -89,5 +89,6 @@ export interface BundledRegistry {
89
89
  metadata: {
90
90
  generatedAt: string;
91
91
  totalSchemas: number;
92
+ generatedBy: string;
92
93
  };
93
94
  }
@@ -1,4 +1,5 @@
1
1
  import { describe, expect, it, vi } from "vitest";
2
+ import { expandPresetSchemas } from "@/bundler/presets/index.js";
2
3
  import { bundleSchemas } from "./bundle.js";
3
4
 
4
5
  // Mock ulog to silence logs during tests
@@ -54,4 +55,37 @@ describe("Bundle Command", () => {
54
55
  expect(result.output).toContain("Auto-generated by @tokens-studio/tokenscript-schemas");
55
56
  expect(result.output).toContain("Generated:");
56
57
  });
58
+
59
+ describe("Presets", () => {
60
+ it("should expand preset:css to schema list", () => {
61
+ const result = expandPresetSchemas(["preset:css"]);
62
+
63
+ expect(result).toContain("type:hex-color");
64
+ expect(result).toContain("type:rgb-color");
65
+ expect(result).toContain("type:hsl-color");
66
+ expect(result).toContain("type:oklch-color");
67
+ expect(result).toContain("type:css-color");
68
+ expect(result).toContain("function:lighten");
69
+ expect(result).toContain("function:darken");
70
+ expect(result.length).toBeGreaterThan(5);
71
+ });
72
+
73
+ it("should combine presets with specific schemas", () => {
74
+ const result = expandPresetSchemas(["preset:css", "type:lab-color"]);
75
+
76
+ expect(result).toContain("type:hex-color");
77
+ expect(result).toContain("type:lab-color");
78
+ });
79
+
80
+ it("should handle unknown preset gracefully", () => {
81
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
82
+
83
+ const result = expandPresetSchemas(["preset:unknown"]);
84
+
85
+ expect(result).toEqual([]);
86
+ expect(warnSpy).toHaveBeenCalledWith("⚠ Unknown preset: unknown");
87
+
88
+ warnSpy.mockRestore();
89
+ });
90
+ });
57
91
  });
@@ -8,6 +8,7 @@ import { mkdir, readFile, writeFile } from "node:fs/promises";
8
8
  import { dirname, join } from "node:path";
9
9
  import { fileURLToPath } from "node:url";
10
10
  import anylogger from "ulog";
11
+ import { expandPresetSchemas } from "@/bundler/presets/index.js";
11
12
  import { bundleSelectiveSchemas } from "@/bundler/selective-bundler.js";
12
13
  import { type BundleConfig, validateBundleConfig } from "@/cli/config-schema.js";
13
14
  import { generateOutput } from "@/cli/output-generator.js";
@@ -117,27 +118,27 @@ function findSchemasDir(): string {
117
118
  const __filename = fileURLToPath(import.meta.url);
118
119
  const __dirname = dirname(__filename);
119
120
 
120
- // From compiled dist/cli/index.js (bundled) to src/schemas
121
- const fromDist = join(__dirname, "../../src/schemas");
122
-
123
121
  // From source src/cli/commands/bundle.ts to src/schemas (for tests/dev)
124
122
  const fromSource = join(__dirname, "../../schemas");
125
123
 
126
- // Try to detect which one exists
124
+ // From compiled dist/cli/commands/bundle.js to src/schemas
125
+ const fromDist = join(__dirname, "../../../src/schemas");
126
+
127
+ // Try to detect which one exists (check source first for dev)
127
128
  try {
128
129
  const fs = require("node:fs");
129
- if (fs.existsSync(fromDist)) {
130
- return fromDist;
131
- }
132
130
  if (fs.existsSync(fromSource)) {
133
131
  return fromSource;
134
132
  }
133
+ if (fs.existsSync(fromDist)) {
134
+ return fromDist;
135
+ }
135
136
  } catch {
136
- // If fs checks fail, default to dist structure
137
+ // If fs checks fail, default to source structure
137
138
  }
138
139
 
139
- // Default to dist structure (for installed package)
140
- return fromDist;
140
+ // Default to source structure (for development)
141
+ return fromSource;
141
142
  }
142
143
 
143
144
  /**
@@ -146,6 +147,7 @@ function findSchemasDir(): string {
146
147
  export async function bundleSchemas(
147
148
  schemas: string[],
148
149
  schemasDir?: string,
150
+ cliArgs?: string[],
149
151
  ): Promise<{
150
152
  output: string;
151
153
  metadata: any;
@@ -161,6 +163,7 @@ export async function bundleSchemas(
161
163
  const result = await bundleSelectiveSchemas({
162
164
  schemas,
163
165
  schemasDir: resolvedSchemasDir,
166
+ cliArgs,
164
167
  });
165
168
 
166
169
  log.info(
@@ -171,6 +174,7 @@ export async function bundleSchemas(
171
174
  const output = generateOutput({
172
175
  schemas: result.schemas,
173
176
  includeHelper: true,
177
+ generatedBy: result.metadata.generatedBy,
174
178
  });
175
179
 
176
180
  return {
@@ -206,8 +210,30 @@ export async function handleBundleCommand(
206
210
  throw new Error("No schemas specified. Provide schemas as arguments or via --config");
207
211
  }
208
212
 
213
+ // Expand any presets (preset:name -> list of schemas)
214
+ configSchemas = expandPresetSchemas(configSchemas);
215
+
216
+ // Build CLI args array for generatedBy metadata
217
+ const cliArgs: string[] = [];
218
+ if (schemas.length > 0) {
219
+ cliArgs.push(...schemas);
220
+ }
221
+ if (options.config) {
222
+ cliArgs.push("--config", options.config);
223
+ }
224
+ if (options.output) {
225
+ cliArgs.push("--output", options.output);
226
+ }
227
+ if (options.dryRun) {
228
+ cliArgs.push("--dry-run");
229
+ }
230
+
209
231
  // Bundle schemas
210
- const { output, metadata, dependencyTree } = await bundleSchemas(configSchemas);
232
+ const { output, metadata, dependencyTree } = await bundleSchemas(
233
+ configSchemas,
234
+ undefined,
235
+ cliArgs,
236
+ );
211
237
 
212
238
  // Show dependency tree
213
239
  console.log("");
@@ -5,7 +5,8 @@
5
5
  /// <reference types="../../../types/ulog" />
6
6
 
7
7
  import { readdir } from "node:fs/promises";
8
- import { join } from "node:path";
8
+ import { dirname, join } from "node:path";
9
+ import { fileURLToPath } from "node:url";
9
10
  import anylogger from "ulog";
10
11
 
11
12
  const log = anylogger("list");
@@ -20,13 +21,44 @@ interface ListResult {
20
21
  functions: string[];
21
22
  }
22
23
 
24
+ /**
25
+ * Find the schemas directory - works for both development/tests and installed package
26
+ */
27
+ function findSchemasDir(): string {
28
+ const __filename = fileURLToPath(import.meta.url);
29
+ const __dirname = dirname(__filename);
30
+
31
+ // From compiled dist/cli/index.js (bundled) to src/schemas
32
+ const fromDist = join(__dirname, "../../src/schemas");
33
+
34
+ // From source src/cli/commands/list.ts to src/schemas (for tests/dev)
35
+ const fromSource = join(__dirname, "../../schemas");
36
+
37
+ // Try to detect which one exists
38
+ try {
39
+ const fs = require("node:fs");
40
+ if (fs.existsSync(fromDist)) {
41
+ return fromDist;
42
+ }
43
+ if (fs.existsSync(fromSource)) {
44
+ return fromSource;
45
+ }
46
+ } catch {
47
+ // If fs checks fail, default to dist structure
48
+ }
49
+
50
+ // Default to dist structure (for installed package)
51
+ return fromDist;
52
+ }
53
+
23
54
  /**
24
55
  * List all available schemas
25
56
  */
26
57
  export async function listSchemas(
27
- schemasDir: string = join(process.cwd(), "src/schemas"),
58
+ schemasDir?: string,
28
59
  options: ListOptions = {},
29
60
  ): Promise<ListResult> {
61
+ const resolvedSchemasDir = schemasDir || findSchemasDir();
30
62
  const showTypes = options.types || (!options.types && !options.functions);
31
63
  const showFunctions = options.functions || (!options.types && !options.functions);
32
64
 
@@ -36,7 +68,7 @@ export async function listSchemas(
36
68
  // List type schemas
37
69
  if (showTypes) {
38
70
  try {
39
- const typesDir = join(schemasDir, "types");
71
+ const typesDir = join(resolvedSchemasDir, "types");
40
72
  const typeEntries = await readdir(typesDir, { withFileTypes: true });
41
73
  types.push(
42
74
  ...typeEntries
@@ -52,7 +84,7 @@ export async function listSchemas(
52
84
  // List function schemas
53
85
  if (showFunctions) {
54
86
  try {
55
- const functionsDir = join(schemasDir, "functions");
87
+ const functionsDir = join(resolvedSchemasDir, "functions");
56
88
  const funcEntries = await readdir(functionsDir, { withFileTypes: true });
57
89
  functions.push(
58
90
  ...funcEntries