@tokens-studio/tokenscript-schemas 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled/registry.json +1 -1
- package/dist/cli/index.cjs +6 -27
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +6 -27
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version-info.ts +16 -18
package/bundled/registry.json
CHANGED
package/dist/cli/index.cjs
CHANGED
|
@@ -6,7 +6,7 @@ var ulog = require('ulog');
|
|
|
6
6
|
var promises = require('fs/promises');
|
|
7
7
|
var path = require('path');
|
|
8
8
|
var url = require('url');
|
|
9
|
-
|
|
9
|
+
require('child_process');
|
|
10
10
|
var fs = require('fs');
|
|
11
11
|
|
|
12
12
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
@@ -474,26 +474,6 @@ function validateBundleConfig(data) {
|
|
|
474
474
|
}
|
|
475
475
|
var __filename$1 = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));
|
|
476
476
|
var __dirname$1 = path.dirname(__filename$1);
|
|
477
|
-
function getGitSha() {
|
|
478
|
-
try {
|
|
479
|
-
return child_process.execSync("git rev-parse --short HEAD", {
|
|
480
|
-
encoding: "utf-8",
|
|
481
|
-
stdio: ["pipe", "pipe", "ignore"]
|
|
482
|
-
}).trim();
|
|
483
|
-
} catch {
|
|
484
|
-
return null;
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
function isGitRepo() {
|
|
488
|
-
try {
|
|
489
|
-
child_process.execSync("git rev-parse --git-dir", {
|
|
490
|
-
stdio: ["pipe", "pipe", "ignore"]
|
|
491
|
-
});
|
|
492
|
-
return true;
|
|
493
|
-
} catch {
|
|
494
|
-
return false;
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
477
|
function getPackageVersion() {
|
|
498
478
|
try {
|
|
499
479
|
const paths = [
|
|
@@ -516,13 +496,12 @@ function getPackageVersion() {
|
|
|
516
496
|
}
|
|
517
497
|
function getVersionInfo() {
|
|
518
498
|
const githubUrl = "https://github.com/tokens-studio/tokenscript-schemas";
|
|
519
|
-
const
|
|
499
|
+
const packageVersion = getPackageVersion();
|
|
520
500
|
let version;
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
version =
|
|
524
|
-
|
|
525
|
-
version = getPackageVersion();
|
|
501
|
+
let isLocal;
|
|
502
|
+
{
|
|
503
|
+
version = `@tokens-studio/tokenscript-schemas@v${packageVersion}`;
|
|
504
|
+
isLocal = false;
|
|
526
505
|
}
|
|
527
506
|
return {
|
|
528
507
|
version,
|
package/dist/cli/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bundler/presets/css.ts","../../src/bundler/presets/index.ts","../../src/bundler/bundle-schema.ts","../../tests/helpers/logger.ts","../../src/utils/type.ts","../../src/utils/schema-uri.ts","../../src/bundler/schema-dependency-resolver.ts","../../src/bundler/selective-bundler.ts","../../src/cli/config-schema.ts","../../src/cli/version-info.ts","../../src/cli/output-generator.ts","../../src/cli/commands/bundle.ts","../../src/cli/commands/list.ts","../../src/cli/commands/presets.ts","../../src/cli/index.ts"],"names":["join","readFile","ulog","access","__filename","fileURLToPath","__dirname","dirname","execSync","readFileSync","log","anylogger","mkdir","writeFile","findSchemasDir","readdir","cac"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * CSS preset - Modern CSS color types and functions\n */\n\nimport type { BundlePreset } from \"./types\";\n\nexport const css: BundlePreset = {\n name: \"CSS\",\n description: \"CSS color types\",\n types: [\n \"hex-color\",\n \"rgb-color\",\n \"hsl-color\",\n \"oklch-color\",\n \"oklab-color\",\n\n // Converting colors to css strings\n \"css-color\",\n ],\n functions: [\"lighten\", \"darken\", \"saturate\", \"desaturate\", \"mix\", \"invert\"],\n};\n","/**\n * Bundle presets - predefined sets of schemas for common use cases\n */\n\nimport { css } from \"./css\";\nimport type { BundlePreset } from \"./types\";\n\nexport type { BundlePreset };\n\n/**\n * Available bundle presets\n */\nexport const BUNDLE_PRESETS: Record<string, BundlePreset> = {\n css,\n};\n\n/**\n * Expand schemas, replacing \"preset:name\" with actual schema list\n */\nexport function expandPresetSchemas(schemas: string[]): string[] {\n const expanded: string[] = [];\n\n for (const schema of schemas) {\n if (schema.startsWith(\"preset:\")) {\n const presetName = schema.slice(7); // Remove \"preset:\"\n const preset = BUNDLE_PRESETS[presetName];\n\n if (preset) {\n // Add all types from preset\n for (const type of preset.types) {\n expanded.push(type === \"*\" ? \"*\" : `type:${type}`);\n }\n // Add all functions from preset\n for (const func of preset.functions) {\n expanded.push(func === \"*\" ? \"*\" : `function:${func}`);\n }\n } else {\n console.warn(`⚠ Unknown preset: ${presetName}`);\n }\n } else {\n // Not a preset, keep as-is\n expanded.push(schema);\n }\n }\n\n return expanded;\n}\n","/**\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 * Centralized logging for tests using ulog\n * Logs are disabled by default and only shown on errors or when explicitly enabled\n */\n\n/// <reference path=\"../../types/ulog.d.ts\" />\nimport ulog from \"ulog\";\n\n// ulog levels: { error: 1, warn: 2, info: 3, log: 4, debug: 5, trace: 6 }\n// Using hardcoded values to avoid runtime initialization issues\nconst LOG_LEVELS = {\n error: 1,\n warn: 2,\n info: 3,\n log: 4,\n debug: 5,\n} as const;\n\n// Define Logger type locally to avoid TypeScript declaration errors\ninterface Logger {\n (...args: any[]): void;\n error(...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n log(...args: any[]): void;\n debug(...args: any[]): void;\n trace(...args: any[]): void;\n level: number;\n}\n\n/**\n * Default logger for all test operations\n * Use: log.debug(), log.info(), log.warn(), log.error()\n */\nexport const log: Logger = ulog(\"schema-registry\");\n\n// Set default log level from environment or disable by default (error = 1)\nconst logLevel = (process.env.LOG_LEVEL || \"error\") as keyof typeof LOG_LEVELS;\nlog.level = LOG_LEVELS[logLevel] || LOG_LEVELS.error;\n\n/**\n * Enable verbose logging for debugging\n * Useful for troubleshooting test failures\n */\nexport function enableVerboseLogging() {\n log.level = LOG_LEVELS.debug;\n}\n\n/**\n * Disable all logging (except errors)\n */\nexport function disableLogging() {\n log.level = LOG_LEVELS.error;\n}\n\n/**\n * Set custom log level\n * @param level - \"debug\" | \"log\" | \"info\" | \"warn\" | \"error\"\n */\nexport function setLogLevel(level: keyof typeof LOG_LEVELS) {\n log.level = LOG_LEVELS[level];\n}\n","// Optional --------------------------------------------------------------------\n\nexport const isSome = <T>(v: T | null | undefined): v is T => {\n return v != null;\n};\n\nexport const isNone = (v: unknown): v is null | undefined => {\n return v == null;\n};\n\n// Primitive type guards -------------------------------------------------------\n\nexport const isNull = (v: unknown): v is null => {\n return v === null;\n};\n\nexport const isUndefined = (v: unknown): v is undefined => {\n return v === undefined;\n};\n\nexport const isObject = (v: unknown): v is Record<string, unknown> => {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n};\n\nexport const isString = (v: unknown): v is string => {\n return typeof v === \"string\";\n};\n\nexport const isNumber = (v: unknown): v is number => {\n return typeof v === \"number\" && !Number.isNaN(v);\n};\n\nexport const isBoolean = (v: unknown): v is boolean => {\n return typeof v === \"boolean\";\n};\n\nexport const isArray = <T = unknown>(v: unknown): v is T[] => {\n return Array.isArray(v);\n};\n\nexport const isFunction = (v: unknown): v is (...args: unknown[]) => unknown => {\n return typeof v === \"function\";\n};\n\nexport const isDate = (v: unknown): v is Date => {\n return v instanceof Date && !Number.isNaN(v.getTime());\n};\n\n// Object ----------------------------------------------------------------------\n\nexport const isMap = (v: unknown): v is Map<unknown, unknown> => v instanceof Map;\n\nexport const isPlainObject = (v: unknown): v is Record<string, unknown> => {\n if (!isObject(v)) return false;\n\n // Objects created by the Object constructor or with null prototype\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n};\n\nexport const hasProperty = <K extends string>(obj: unknown, key: K): obj is Record<K, unknown> => {\n return isObject(obj) && key in obj;\n};\n\nexport const getKeyAlt = <K extends string, T>(\n keys: readonly K[],\n record: Partial<Record<K, T>>,\n): T | undefined => {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n return undefined;\n};\n\nexport const isObjectWithKey = <K extends string>(\n value: unknown,\n key: K,\n): value is Record<K, unknown> => {\n return isObject(value) && key in value;\n};\n\nexport const isNonEmptyObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length > 0;\n};\n\nexport const isSingleEntryObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length === 1;\n};\n\n// Array -----------------------------------------------------------------------\n\nexport const isNonEmptyArray = <T>(v: unknown): v is [T, ...T[]] => {\n return isArray(v) && v.length > 0;\n};\n\nexport const ensureArray = <T>(v: T | T[] | null | undefined): T[] => {\n if (isNone(v)) return [];\n if (isArray<T>(v)) return v;\n return [v];\n};\n\nexport const isOutOfBounds = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index >= value.length;\n};\n\nexport const isOutOfBoundsInclusive = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index > value.length;\n};\n\nexport const isEmpty = (v: unknown): boolean => {\n if (isNone(v)) return true;\n if (isString(v) || isArray(v)) return v.length === 0;\n if (isObject(v)) return Object.keys(v).length === 0;\n return false;\n};\n\n// Number parsing --------------------------------------------------------------\n\nexport const safeParseInt = (v: unknown): number | null => {\n if (isNumber(v)) return Math.floor(v);\n if (isString(v)) {\n const parsed = parseInt(v, 10);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\nexport const safeParseFloat = (v: unknown): number | null => {\n if (isNumber(v)) return v;\n if (isString(v)) {\n const parsed = parseFloat(v);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\n// Type Assertion Helpers ------------------------------------------------------\n\nexport const assertIsSome = <T>(v: T | null | undefined, message?: string): T => {\n if (isNone(v)) {\n throw new Error(message || \"Expected value to be defined\");\n }\n return v;\n};\n\nexport const assertIsType = <T>(v: unknown, guard: (v: unknown) => v is T, message?: string): T => {\n if (!guard(v)) {\n throw new Error(message || \"Type assertion failed\");\n }\n return v;\n};\n\nexport const optional = <T, R>(value: T | null | undefined, fn: (v: T) => R): R | undefined => {\n return isSome(value) ? fn(value) : undefined;\n};\n\nexport const when = <A, B>(a: A, b: B): B | undefined => {\n return a !== undefined && a !== null && a !== false ? b : undefined;\n};\n\nexport const withDefault = <T>(v: T | null | undefined, defaultValue: T): T => {\n return isSome(v) ? v : defaultValue;\n};\n\nexport const isEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (isNone(a) || isNone(b)) return a === b;\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => isEqual(item, b[index]));\n }\n\n if (isObject(a) && isObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) => keysB.includes(key) && isEqual(a[key], b[key]));\n }\n\n return false;\n};\n\n// Conversion ------------------------------------------------------------------\n\nexport const nullToUndefined = <T>(v: T | null | undefined): T | undefined =>\n isNull(v) ? undefined : v;\n","/**\n * Utilities for working with TokenScript schema URIs\n *\n * Handles URI construction, parsing, and manipulation for the TokenScript schema registry.\n */\n\nimport { isObject } from \"./type\";\n\nexport type SemanticVersion =\n | { major: number }\n | { major: number; minor: number }\n | { major: number; minor: number; patch: number };\n\ntype SchemaVersion = \"latest\" | SemanticVersion | null;\n\nexport interface SchemaUriComponents {\n baseUrl: string;\n category: \"schema\" | \"core\" | \"function\";\n name: string;\n version: SchemaVersion;\n}\n\nexport const DEFAULT_REGISTRY_URL = \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\nexport const DEFAULT_API_PATH = \"/api/v1\";\n\nfunction safeParseInt(value: string): number | null {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? null : parsed;\n}\n\nexport function parseSemverFromString(versionString: string): SemanticVersion | null {\n const parts = versionString.split(\".\");\n const numbers: number[] = [];\n\n for (const part of parts) {\n const num = safeParseInt(part);\n if (num === null) return null;\n numbers.push(num);\n }\n\n if (numbers.length !== parts.length) return null;\n\n if (numbers.length === 3) {\n return { major: numbers[0], minor: numbers[1], patch: numbers[2] };\n }\n\n if (numbers.length === 2) {\n return { major: numbers[0], minor: numbers[1] };\n }\n\n if (numbers.length === 1) {\n return { major: numbers[0] };\n }\n\n return null;\n}\n\nexport function parseVersionString(versionString: string): SchemaVersion {\n return versionString === \"latest\" ? \"latest\" : parseSemverFromString(versionString);\n}\n\nexport function semverToString(version: SchemaVersion | undefined): string {\n if (version === undefined) {\n return \"latest\";\n }\n if (isObject(version)) {\n if (\"patch\" in version) return `${version.major}.${version.minor}.${version.patch}`;\n if (\"minor\" in version) return `${version.major}.${version.minor}`;\n return `${version.major}`;\n }\n return \"latest\";\n}\n\nexport function buildSchemaUri(\n params: Partial<SchemaUriComponents> & { category: string; name: string },\n): string {\n const { baseUrl, category, name, version } = params;\n\n const versionString = semverToString(version);\n\n const effectiveBaseUrl = baseUrl === undefined ? DEFAULT_REGISTRY_URL : baseUrl;\n\n if (effectiveBaseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n }\n\n return `${effectiveBaseUrl}${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n}\n\n/**\n * Parse a schema URI into its components\n *\n * @example\n * parseSchemaUri(\"https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"...\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n *\n * parseSchemaUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n */\nexport function parseSchemaUri(uri: string): SchemaUriComponents | null {\n let baseUrl = \"\";\n let pathname = uri;\n\n // Try parsing as full URL first\n try {\n const url = new URL(uri);\n baseUrl = `${url.protocol}//${url.host}`;\n pathname = url.pathname;\n } catch {\n // If URL parsing fails, treat as relative path\n // Check if it starts with a protocol (incomplete URL)\n if (uri.includes(\"://\")) {\n return null;\n }\n // It's a relative path, use as-is\n pathname = uri;\n }\n\n // Parse pathname: /api/v1/schema/rgb-color/0.0.1/\n const pathParts = pathname.split(\"/\").filter((part) => part !== \"\");\n\n // Expected format: [api, v1, category, name, version]\n if (pathParts.length < 5) {\n return null;\n }\n\n // Check if it starts with api/vN\n if (pathParts[0] !== \"api\" || !pathParts[1].startsWith(\"v\")) {\n return null;\n }\n\n const category = pathParts[2];\n if (category !== \"schema\" && category !== \"core\" && category !== \"function\") {\n return null;\n }\n\n const name = pathParts[3];\n const version = parseVersionString(pathParts[4]);\n\n return {\n baseUrl,\n category: category as \"schema\" | \"core\" | \"function\",\n name,\n version,\n };\n}\n\n/**\n * Extract the base URI without version\n *\n * @example\n * getBaseUri(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"https://.../api/v1/schema/rgb-color/\"\n *\n * getBaseUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => \"/api/v1/schema/rgb-color/\"\n */\nexport function getBaseUri(uri: string): string {\n const components = parseSchemaUri(uri);\n\n if (!components) {\n return uri;\n }\n\n const { baseUrl, category, name } = components;\n\n if (baseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/`;\n }\n\n return `${baseUrl}${DEFAULT_API_PATH}/${category}/${name}/`;\n}\n\n/**\n * Extract schema name from URI\n *\n * @example\n * extractSchemaName(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"rgb-color\"\n */\nexport function extractSchemaName(uri: string): string | null {\n const components = parseSchemaUri(uri);\n return components?.name || null;\n}\n\n/**\n * Normalize URI to ensure it ends with trailing slash\n */\nexport function normalizeUri(uri: string): string {\n return uri.endsWith(\"/\") ? uri : `${uri}/`;\n}\n","/**\n * Utilities for resolving schema dependencies automatically\n */\n\nimport { join } from \"node:path\";\nimport { log } from \"@tests/helpers/logger.js\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\nimport { extractSchemaName, parseSchemaUri } from \"@/utils/schema-uri\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\n\nexport interface SchemaReference {\n slug: string;\n type: \"type\" | \"function\";\n uri: string;\n}\n\nexport interface ExtractRequirementsOptions {\n /**\n * Whether to include type dependencies from color conversions\n * Useful for testing to ensure all conversion types are loaded\n * @default false\n */\n includeColorTypeDependencies?: boolean;\n}\n\n/**\n * Extract all required schema URIs from a schema specification\n * Only extracts explicit requirements - not conversions (which are capabilities, not dependencies)\n * However, for testing purposes, can optionally include color type dependencies from conversions\n */\nfunction extractRequirements(\n spec: SchemaSpecification,\n options: ExtractRequirementsOptions = {},\n): string[] {\n const requirements: string[] = [];\n\n if (spec.type === \"function\") {\n // Functions can have explicit requirements\n const funcSpec = spec as FunctionSpecification;\n if (funcSpec.requirements) {\n requirements.push(...funcSpec.requirements);\n }\n } else if (spec.type === \"color\" && options.includeColorTypeDependencies) {\n // Color types have requirements through conversions (when flag is enabled)\n // This is useful for testing to ensure all conversion types are loaded\n const colorSpec = spec as ColorSpecification;\n for (const conversion of colorSpec.conversions || []) {\n // Add source if it's not $self\n if (conversion.source !== \"$self\") {\n requirements.push(conversion.source);\n }\n // Add target if it's not $self\n if (conversion.target !== \"$self\") {\n requirements.push(conversion.target);\n }\n }\n }\n // Note: By default, color types don't have dependencies via conversions\n // Conversions are capabilities, not requirements\n\n return requirements;\n}\n\n/**\n * Resolve a URI to a schema slug and type\n * Works with both full URIs and just schema names\n *\n * @example\n * resolveSchemaReference(\"/api/v1/core/rgb-color/0/\") => { slug: \"rgb-color\", type: \"type\" }\n * resolveSchemaReference(\"rgb-color\") => { slug: \"rgb-color\", type: \"type\" }\n */\nexport function resolveSchemaReference(uriOrName: string): SchemaReference | null {\n // Try parsing as URI first\n const components = parseSchemaUri(uriOrName);\n\n if (components) {\n // Successfully parsed as URI\n const type = components.category === \"function\" ? \"function\" : \"type\";\n return {\n slug: components.name,\n type,\n uri: uriOrName,\n };\n }\n\n // Try extracting name (handles partial URIs)\n const extractedName = extractSchemaName(uriOrName);\n if (extractedName) {\n return {\n slug: extractedName,\n type: \"type\", // Default to type if we can't determine\n uri: uriOrName,\n };\n }\n\n // Treat as plain slug\n if (uriOrName && !uriOrName.includes(\"/\")) {\n return {\n slug: uriOrName,\n type: \"type\", // Default to type\n uri: \"\", // No URI, just a slug\n };\n }\n\n return null;\n}\n\nexport interface ResolvedDependencies {\n types: string[];\n functions: string[];\n}\n\nexport interface DependencyNode {\n slug: string;\n type: \"type\" | \"function\";\n dependencies: string[];\n}\n\nexport interface CollectRequiredSchemasOptions extends ExtractRequirementsOptions {\n baseUrl?: string;\n schemasDir?: string;\n}\n\n/**\n * Recursively collect all required schemas for a given schema\n * Returns a flat list of all dependencies (including transitive ones)\n *\n * @param slugOrUri - Schema slug (e.g., \"rgb-color\") or full URI\n * @param type - Schema type (\"type\" or \"function\"), optional if URI is provided\n * @param options - Options for dependency collection\n * @returns Object with separated type and function dependencies\n *\n * @example\n * // Using slug\n * await collectRequiredSchemas(\"invert\", \"function\")\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [] }\n *\n * // Using URI\n * await collectRequiredSchemas(\"/api/v1/core/rgb-color/0/\")\n * // => { types: [\"hex-color\"], functions: [] }\n */\nexport async function collectRequiredSchemas(\n slugOrUri: string,\n type?: \"type\" | \"function\",\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const visited = new Set<string>();\n const typeSchemas = new Set<string>();\n const functionSchemas = new Set<string>();\n\n async function traverse(currentSlugOrUri: string, currentType?: \"type\" | \"function\") {\n // Resolve to a proper schema reference\n const ref = resolveSchemaReference(currentSlugOrUri);\n if (!ref) {\n log.warn(`Could not resolve schema reference: ${currentSlugOrUri}`);\n return;\n }\n\n // Use provided type if available, otherwise use resolved type\n const effectiveType = currentType || ref.type;\n const slug = ref.slug;\n\n // Create a unique key for visited tracking\n const key = `${effectiveType}:${slug}`;\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n // Try to load the schema\n let spec: SchemaSpecification;\n try {\n // Dynamically determine schema directory\n const categoryDir = effectiveType === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, slug);\n\n spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n } catch (error) {\n log.warn(`Failed to load schema ${slug} (${effectiveType}):`, error);\n return;\n }\n\n // Extract requirements from this schema\n const requirements = extractRequirements(spec, extractOptions);\n\n // Recursively traverse requirements\n for (const reqUri of requirements) {\n const reqRef = resolveSchemaReference(reqUri);\n if (reqRef) {\n // Add to appropriate set\n if (reqRef.type === \"function\") {\n functionSchemas.add(reqRef.slug);\n } else {\n typeSchemas.add(reqRef.slug);\n }\n\n // Recursively collect dependencies\n await traverse(reqUri, reqRef.type);\n }\n }\n }\n\n // Start traversal\n await traverse(slugOrUri, type);\n\n return {\n types: Array.from(typeSchemas),\n functions: Array.from(functionSchemas),\n };\n}\n\n/**\n * Collect all schemas needed for a list of schemas (including their dependencies)\n *\n * @example\n * await collectRequiredSchemasForList([\n * { slug: \"invert\", type: \"function\" },\n * { slug: \"rgb-color\", type: \"type\" }\n * ])\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [\"invert\"] }\n */\nexport async function collectRequiredSchemasForList(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const allTypes = new Set<string>();\n const allFunctions = new Set<string>();\n\n for (const schema of schemas) {\n const deps = await collectRequiredSchemas(schema.slug, schema.type, options);\n\n // Add the schema itself\n if (schema.type === \"function\") {\n allFunctions.add(schema.slug);\n } else {\n allTypes.add(schema.slug);\n }\n\n // Add dependencies\n for (const t of deps.types) {\n allTypes.add(t);\n }\n for (const f of deps.functions) {\n allFunctions.add(f);\n }\n }\n\n return {\n types: Array.from(allTypes),\n functions: Array.from(allFunctions),\n };\n}\n\n/**\n * Collect dependency tree for schemas (non-recursive, shows direct dependencies only)\n */\nexport async function collectDependencyTree(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<Map<string, DependencyNode>> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const tree = new Map<string, DependencyNode>();\n\n for (const schema of schemas) {\n const categoryDir = schema.type === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, schema.slug);\n\n try {\n const spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n const requirements = extractRequirements(spec, extractOptions);\n\n // Extract just the slugs from URIs\n const dependencySlugs = requirements.map((uri) => {\n const ref = resolveSchemaReference(uri);\n return ref ? `${ref.type}:${ref.slug}` : uri;\n });\n\n const key = `${schema.type}:${schema.slug}`;\n tree.set(key, {\n slug: schema.slug,\n type: schema.type,\n dependencies: dependencySlugs,\n });\n } catch (error) {\n log.warn(`Failed to load schema ${schema.slug} (${schema.type}):`, error);\n }\n }\n\n return tree;\n}\n","/**\n * Selective schema bundler for CLI\n * Bundles specific schemas with automatic dependency resolution\n */\n\nimport { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\nimport {\n collectDependencyTree,\n collectRequiredSchemasForList,\n type DependencyNode,\n} from \"./schema-dependency-resolver.js\";\nimport type { ColorSpecification, FunctionSpecification } from \"./types.js\";\n\nexport interface SelectiveBundleOptions {\n schemas: string[]; // Schema slugs to bundle\n schemasDir?: string; // Source directory (default: src/schemas)\n baseUrl?: string; // Registry URL for URIs\n cliArgs?: string[]; // CLI arguments used\n}\n\nexport interface BundledSchemaEntry {\n uri: string;\n schema: ColorSpecification | FunctionSpecification;\n}\n\nexport interface SelectiveBundleResult {\n schemas: BundledSchemaEntry[];\n metadata: {\n requestedSchemas: string[];\n resolvedDependencies: string[];\n generatedAt: string;\n generatedBy?: string;\n };\n dependencyTree: Map<string, DependencyNode>;\n}\n\n/**\n * Detect whether a schema is a type or function by checking which directory exists\n */\nasync function detectSchemaType(\n slug: string,\n schemasDir: string,\n): Promise<\"type\" | \"function\" | null> {\n const typeDir = join(schemasDir, \"types\", slug);\n const functionDir = join(schemasDir, \"functions\", slug);\n\n try {\n await access(typeDir);\n return \"type\";\n } catch {\n // Not a type, try function\n }\n\n try {\n await access(functionDir);\n return \"function\";\n } catch {\n // Not found in either\n }\n\n return null;\n}\n\n/**\n * Bundle specific schemas with automatic dependency resolution\n */\nexport async function bundleSelectiveSchemas(\n options: SelectiveBundleOptions,\n): Promise<SelectiveBundleResult> {\n const schemasDir = options.schemasDir || join(process.cwd(), \"src/schemas\");\n const baseUrl = options.baseUrl || \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\n // Parse schema slugs - they might have type prefixes like \"function:invert\"\n const parsedSchemas = await Promise.all(\n options.schemas.map(async (slug) => {\n if (slug.includes(\":\")) {\n const [type, name] = slug.split(\":\");\n return {\n slug: name,\n type: (type === \"function\" ? \"function\" : \"type\") as \"type\" | \"function\",\n };\n }\n\n // Auto-detect type by checking which directory exists\n const detectedType = await detectSchemaType(slug, schemasDir);\n if (detectedType === null) {\n throw new Error(\n `Schema '${slug}' not found in types or functions directories. ` +\n `Use 'function:${slug}' or 'type:${slug}' prefix to be explicit.`,\n );\n }\n\n return { slug, type: detectedType };\n }),\n );\n\n // Collect all required schemas (including dependencies)\n // For CLI bundling, we include color type dependencies so conversions work\n const deps = await collectRequiredSchemasForList(parsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Collect dependency tree for all schemas (including resolved dependencies)\n const allParsedSchemas = [\n ...deps.types.map((slug) => ({ slug, type: \"type\" as const })),\n ...deps.functions.map((slug) => ({ slug, type: \"function\" as const })),\n ];\n const dependencyTree = await collectDependencyTree(allParsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Track all schema slugs for metadata\n const allSchemas = [...new Set([...deps.types, ...deps.functions])];\n\n // Bundle all schemas\n const bundledSchemas: BundledSchemaEntry[] = [];\n\n // Bundle type schemas\n for (const typeSlug of deps.types) {\n const schemaDir = join(schemasDir, \"types\", typeSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"color\") {\n const uri = `${baseUrl}/api/v1/core/${typeSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as ColorSpecification,\n });\n }\n }\n\n // Bundle function schemas\n for (const funcSlug of deps.functions) {\n const schemaDir = join(schemasDir, \"functions\", funcSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"function\") {\n const uri = `${baseUrl}/api/v1/function/${funcSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as FunctionSpecification,\n });\n }\n }\n\n // Build generatedBy string if CLI args are provided\n const baseCommand = \"npx @tokens-studio/tokenscript-schemas bundle\";\n const generatedBy = options.cliArgs?.length\n ? `${baseCommand} ${options.cliArgs.join(\" \")}`\n : undefined;\n\n return {\n schemas: bundledSchemas,\n metadata: {\n requestedSchemas: options.schemas,\n resolvedDependencies: allSchemas,\n generatedAt: new Date().toISOString(),\n generatedBy,\n },\n dependencyTree,\n };\n}\n","/**\n * Config file schema validation\n */\n\nexport interface BundleConfig {\n schemas: string[];\n output?: string;\n}\n\n/**\n * Validate bundle config\n */\nexport function validateBundleConfig(data: unknown): BundleConfig {\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"Config must be an object\");\n }\n\n const config = data as Record<string, unknown>;\n\n if (!Array.isArray(config.schemas)) {\n throw new Error(\"Config must have a 'schemas' array\");\n }\n\n if (!config.schemas.every((s) => typeof s === \"string\")) {\n throw new Error(\"All schemas must be strings\");\n }\n\n if (config.output !== undefined && typeof config.output !== \"string\") {\n throw new Error(\"Config 'output' must be a string if provided\");\n }\n\n return {\n schemas: config.schemas,\n output: config.output as string | undefined,\n };\n}\n","/**\n * Get version information for the bundled output\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport interface VersionInfo {\n version: string; // Package version or git SHA\n githubUrl: string;\n isLocal: boolean; // true if running from local repo (not published package)\n}\n\n/**\n * Get the current git SHA\n */\nfunction getGitSha(): string | null {\n try {\n return execSync(\"git rev-parse --short HEAD\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Check if we're running from a local git repo\n */\nfunction isGitRepo(): boolean {\n try {\n execSync(\"git rev-parse --git-dir\", {\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get version from package.json\n */\nfunction getPackageVersion(): string {\n try {\n // Try multiple paths for package.json\n const paths = [\n join(__dirname, \"../../package.json\"), // From src/cli\n join(__dirname, \"../../../package.json\"), // From dist/cli\n ];\n\n for (const path of paths) {\n try {\n const pkg = JSON.parse(readFileSync(path, \"utf-8\"));\n return pkg.version || \"unknown\";\n } catch {\n // Try next path\n }\n }\n\n return \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\n/**\n * Get version information for the bundle\n */\nexport function getVersionInfo(): VersionInfo {\n const githubUrl = \"https://github.com/tokens-studio/tokenscript-schemas\";\n const isLocal = isGitRepo();\n\n let version: string;\n if (isLocal) {\n const sha = getGitSha();\n version = sha ? `local-${sha}` : \"local\";\n } else {\n version = getPackageVersion();\n }\n\n return {\n version,\n githubUrl,\n isLocal,\n };\n}\n","/**\n * Generate JavaScript output for bundled schemas\n */\n\nimport type { BundledSchemaEntry } from \"@/bundler/selective-bundler.js\";\nimport { getVersionInfo } from \"./version-info.js\";\n\nexport interface OutputGeneratorOptions {\n schemas: BundledSchemaEntry[];\n includeHelper?: boolean; // Include makeConfig() helper\n generatedBy?: string; // CLI command used to generate\n}\n\n/**\n * Generate JavaScript code for bundled schemas\n */\nexport function generateOutput(options: OutputGeneratorOptions): string {\n const { schemas, includeHelper = true } = options;\n\n const timestamp = new Date().toISOString();\n const versionInfo = getVersionInfo();\n\n const lines: string[] = [];\n\n // Header comment\n lines.push(\"// Auto-generated by @tokens-studio/tokenscript-schemas\");\n lines.push(`// Version: ${versionInfo.version}`);\n lines.push(`// GitHub: ${versionInfo.githubUrl}`);\n if (options.generatedBy) {\n lines.push(`// Command: ${options.generatedBy}`);\n }\n lines.push(`// Generated: ${timestamp}`);\n lines.push(\"\");\n\n // Import statement\n lines.push('import { Config } from \"@tokens-studio/tokenscript-interpreter\";');\n lines.push(\"\");\n\n // SCHEMAS export\n lines.push(\"export const SCHEMAS = [\");\n for (const entry of schemas) {\n // Format each schema entry - we need to serialize both uri and schema\n const schemaJson = JSON.stringify(entry.schema, null, 2);\n const uriJson = JSON.stringify(entry.uri);\n\n // Indent the schema JSON\n const indentedSchema = schemaJson\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n\n lines.push(` {`);\n lines.push(` uri: ${uriJson},`);\n lines.push(` schema: ${indentedSchema.trim()}`);\n lines.push(` },`);\n }\n lines.push(\"];\");\n lines.push(\"\");\n\n // Helper function\n if (includeHelper) {\n lines.push(\"export function makeConfig() {\");\n lines.push(\" return new Config().registerSchemas(SCHEMAS);\");\n lines.push(\"}\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Bundle command - Bundle schemas into a JS file\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport anylogger from \"ulog\";\nimport { expandPresetSchemas } from \"@/bundler/presets/index.js\";\nimport { bundleSelectiveSchemas } from \"@/bundler/selective-bundler.js\";\nimport { type BundleConfig, validateBundleConfig } from \"@/cli/config-schema.js\";\nimport { generateOutput } from \"@/cli/output-generator.js\";\nimport { isSome } from \"@/utils/type.js\";\n\nconst log = anylogger(\"bundle\");\n\nexport interface BundleOptions {\n config?: string;\n output?: string;\n dryRun?: boolean;\n}\n\n/**\n * Load config from file\n */\nasync function loadConfig(configPath: string): Promise<BundleConfig> {\n try {\n const content = await readFile(configPath, \"utf-8\");\n const parsed = JSON.parse(content);\n return validateBundleConfig(parsed);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`Config file not found: ${configPath}`);\n }\n throw error;\n }\n}\n\n/**\n * Format dependency tree for display\n */\nfunction formatDependencyTree(\n tree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>,\n requestedSchemas: string[],\n): string {\n const lines: string[] = [];\n const visited = new Set<string>();\n\n lines.push(\"Dependency tree:\");\n lines.push(\"\");\n\n // Helper to format a node\n const formatNode = (key: string, indent: string = \"\", isLast: boolean = true) => {\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n const node = tree.get(key);\n if (!node) return;\n\n const prefix = indent + (isLast ? \"└── \" : \"├── \");\n const label = `${node.type}:${node.slug}`;\n lines.push(prefix + label);\n\n if (node.dependencies.length > 0) {\n const childIndent = indent + (isLast ? \" \" : \"│ \");\n node.dependencies.forEach((dep, idx) => {\n const isLastChild = idx === node.dependencies.length - 1;\n const childKey = dep;\n\n if (!visited.has(childKey)) {\n formatNode(childKey, childIndent, isLastChild);\n }\n });\n }\n };\n\n // Format requested schemas\n requestedSchemas.forEach((schema, idx) => {\n // Try to find the schema with different type prefixes\n const typeKey = `type:${schema}`;\n const funcKey = `function:${schema}`;\n const key = tree.has(typeKey) ? typeKey : tree.has(funcKey) ? funcKey : schema;\n\n formatNode(key, \"\", idx === requestedSchemas.length - 1);\n });\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format bundle result for dry-run display\n */\nfunction formatDryRunOutput(schemas: string[], resolvedDependencies: string[]): string {\n const lines: string[] = [];\n\n lines.push(\"Bundle preview:\");\n lines.push(\"\");\n lines.push(`Requested schemas: ${schemas.join(\", \")}`);\n lines.push(`Total schemas (with dependencies): ${resolvedDependencies.length}`);\n lines.push(\"\");\n lines.push(\"Schemas to be bundled:\");\n\n for (const schema of resolvedDependencies.sort()) {\n lines.push(` - ${schema}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Find the schemas directory - works for both development/tests and installed package\n */\nfunction findSchemasDir(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // From compiled dist/cli/index.js (bundled) to src/schemas\n const fromDist = join(__dirname, \"../../src/schemas\");\n\n // From source src/cli/commands/bundle.ts to src/schemas (for tests/dev)\n const fromSource = join(__dirname, \"../../schemas\");\n\n // Try to detect which one exists (check dist first for installed package)\n try {\n const fs = require(\"node:fs\");\n if (fs.existsSync(fromDist)) {\n return fromDist;\n }\n if (fs.existsSync(fromSource)) {\n return fromSource;\n }\n } catch {\n // If fs checks fail, default to dist structure\n }\n\n // Default to dist structure (for installed package)\n return fromDist;\n}\n\n/**\n * Core bundle logic (testable)\n */\nexport async function bundleSchemas(\n schemas: string[],\n schemasDir?: string,\n cliArgs?: string[],\n): Promise<{\n output: string;\n metadata: any;\n dependencyTree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>;\n}> {\n // Use provided schemasDir or auto-detect\n const resolvedSchemasDir = schemasDir || findSchemasDir();\n\n log.info(\"Bundling schemas:\", schemas);\n log.debug(\"Schemas directory:\", resolvedSchemasDir);\n\n // Bundle schemas with dependencies\n const result = await bundleSelectiveSchemas({\n schemas,\n schemasDir: resolvedSchemasDir,\n cliArgs,\n });\n\n log.info(\n `Resolved ${result.metadata.resolvedDependencies.length} schemas (including dependencies)`,\n );\n\n // Generate output\n const output = generateOutput({\n schemas: result.schemas,\n includeHelper: true,\n generatedBy: result.metadata.generatedBy,\n });\n\n return {\n output,\n metadata: result.metadata,\n dependencyTree: result.dependencyTree,\n };\n}\n\n/**\n * CLI action handler for bundle command\n */\nexport async function handleBundleCommand(\n schemas: string[],\n options: BundleOptions = {},\n): Promise<void> {\n try {\n // Load config if provided\n let configSchemas: string[] = schemas;\n let outputPath = options.output || \"./tokenscript-schemas.js\";\n\n if (isSome(options.config)) {\n log.info(`Loading config from ${options.config}`);\n const config = await loadConfig(options.config);\n configSchemas = config.schemas;\n if (config.output) {\n outputPath = config.output;\n }\n }\n\n // Validate we have schemas\n if (!configSchemas || configSchemas.length === 0) {\n throw new Error(\"No schemas specified. Provide schemas as arguments or via --config\");\n }\n\n // Expand any presets (preset:name -> list of schemas)\n configSchemas = expandPresetSchemas(configSchemas);\n\n // Build CLI args array for generatedBy metadata\n const cliArgs: string[] = [];\n if (schemas.length > 0) {\n cliArgs.push(...schemas);\n }\n if (options.config) {\n cliArgs.push(\"--config\", options.config);\n }\n if (options.output) {\n cliArgs.push(\"--output\", options.output);\n }\n if (options.dryRun) {\n cliArgs.push(\"--dry-run\");\n }\n\n // Bundle schemas\n const { output, metadata, dependencyTree } = await bundleSchemas(\n configSchemas,\n undefined,\n cliArgs,\n );\n\n // Show dependency tree\n console.log(\"\");\n console.log(formatDependencyTree(dependencyTree, metadata.requestedSchemas));\n console.log(\"\");\n\n // Dry run - just show what would be bundled\n if (options.dryRun) {\n const preview = formatDryRunOutput(metadata.requestedSchemas, metadata.resolvedDependencies);\n console.log(preview);\n return;\n }\n\n // Write output file\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, output, \"utf-8\");\n\n log.info(`Successfully bundled ${metadata.resolvedDependencies.length} schemas`);\n log.info(`Output written to: ${outputPath}`);\n\n // Summary\n console.log(`✓ Bundled ${metadata.resolvedDependencies.length} schemas → ${outputPath}`);\n } catch (error) {\n log.error(\"Bundle failed:\", error);\n throw error;\n }\n}\n","/**\n * List command - Display available schemas\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { readdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport anylogger from \"ulog\";\n\nconst log = anylogger(\"list\");\n\nexport interface ListOptions {\n types?: boolean;\n functions?: boolean;\n}\n\ninterface ListResult {\n types: string[];\n functions: string[];\n}\n\n/**\n * Find the schemas directory - works for both development/tests and installed package\n */\nfunction findSchemasDir(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // From compiled dist/cli/index.js (bundled) to src/schemas\n const fromDist = join(__dirname, \"../../src/schemas\");\n\n // From source src/cli/commands/list.ts to src/schemas (for tests/dev)\n const fromSource = join(__dirname, \"../../schemas\");\n\n // Try to detect which one exists\n try {\n const fs = require(\"node:fs\");\n if (fs.existsSync(fromDist)) {\n return fromDist;\n }\n if (fs.existsSync(fromSource)) {\n return fromSource;\n }\n } catch {\n // If fs checks fail, default to dist structure\n }\n\n // Default to dist structure (for installed package)\n return fromDist;\n}\n\n/**\n * List all available schemas\n */\nexport async function listSchemas(\n schemasDir?: string,\n options: ListOptions = {},\n): Promise<ListResult> {\n const resolvedSchemasDir = schemasDir || findSchemasDir();\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n const types: string[] = [];\n const functions: string[] = [];\n\n // List type schemas\n if (showTypes) {\n try {\n const typesDir = join(resolvedSchemasDir, \"types\");\n const typeEntries = await readdir(typesDir, { withFileTypes: true });\n types.push(\n ...typeEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read types directory:\", error);\n }\n }\n\n // List function schemas\n if (showFunctions) {\n try {\n const functionsDir = join(resolvedSchemasDir, \"functions\");\n const funcEntries = await readdir(functionsDir, { withFileTypes: true });\n functions.push(\n ...funcEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read functions directory:\", error);\n }\n }\n\n return { types, functions };\n}\n\n/**\n * Format list output for display\n */\nexport function formatListOutput(result: ListResult, options: ListOptions = {}): string {\n const lines: string[] = [];\n\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n if (showTypes && result.types.length > 0) {\n lines.push(\"Types:\");\n for (const type of result.types) {\n lines.push(` ${type}`);\n }\n }\n\n if (showFunctions && result.functions.length > 0) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(\"Functions:\");\n for (const func of result.functions) {\n lines.push(` function:${func}`);\n }\n }\n\n if (lines.length === 0) {\n lines.push(\"No schemas found.\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * CLI action handler for list command\n */\nexport async function handleListCommand(options: ListOptions = {}): Promise<void> {\n const result = await listSchemas(undefined, options);\n const output = formatListOutput(result, options);\n console.log(output);\n}\n","/**\n * Presets command - list available bundle presets\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport anylogger from \"ulog\";\nimport { BUNDLE_PRESETS } from \"@/bundler/presets/index\";\n\nconst log = anylogger(\"presets\");\n\n/**\n * Format preset information for display\n */\nfunction formatPresetInfo(): string {\n const lines: string[] = [];\n\n lines.push(\"=\".repeat(60));\n lines.push(\"Available Bundle Presets\");\n lines.push(\"=\".repeat(60));\n\n for (const [key, preset] of Object.entries(BUNDLE_PRESETS)) {\n lines.push(\"\");\n lines.push(`preset:${key}`);\n lines.push(` ${preset.description}`);\n\n // Types section\n const typesCount =\n preset.types.length === 1 && preset.types[0] === \"*\" ? \"all\" : preset.types.length;\n lines.push(\"\");\n lines.push(` Types (${typesCount}):`);\n if (preset.types.length > 0 && preset.types[0] !== \"*\") {\n for (const type of preset.types) {\n lines.push(` - ${type}`);\n }\n } else {\n lines.push(` - all`);\n }\n\n // Functions section\n const functionsCount =\n preset.functions.length === 1 && preset.functions[0] === \"*\"\n ? \"all\"\n : preset.functions.length;\n lines.push(\"\");\n lines.push(` Functions (${functionsCount}):`);\n if (preset.functions.length > 0 && preset.functions[0] !== \"*\") {\n for (const func of preset.functions) {\n lines.push(` - ${func}`);\n }\n } else {\n lines.push(` - all`);\n }\n }\n\n lines.push(\"\");\n lines.push(\"=\".repeat(60));\n lines.push(\"Usage Examples:\");\n lines.push(\"=\".repeat(60));\n lines.push(\"npx tokenscript-schemas bundle preset:css\");\n lines.push(\"npx tokenscript-schemas bundle preset:css type:oklab-color\");\n lines.push(\"npx tokenscript-schemas bundle type:hex-color function:lighten\");\n lines.push(\"\");\n lines.push(\"Note: You can combine multiple presets and specific schemas!\");\n\n return lines.join(\"\\n\");\n}\n\nexport async function handlePresetsCommand(): Promise<void> {\n try {\n log.info(\"Listing available presets\");\n\n const output = formatPresetInfo();\n console.log(output);\n\n log.info(`Listed ${Object.keys(BUNDLE_PRESETS).length} presets`);\n } catch (error) {\n log.error(\"Failed to list presets:\", error);\n throw error;\n }\n}\n","#!/usr/bin/env node\n\n/**\n * CLI entry point for @tokens-studio/tokenscript-schemas\n */\n\n/// <reference types=\"../../types/ulog\" />\n\nimport cac from \"cac\";\nimport anylogger from \"ulog\";\nimport { type BundleOptions, handleBundleCommand } from \"./commands/bundle.js\";\nimport { handleListCommand, type ListOptions } from \"./commands/list.js\";\nimport { handlePresetsCommand } from \"./commands/presets.js\";\n\nconst log = anylogger(\"cli\");\n\nconst cli = cac(\"tokenscript-schemas\");\n\n// Bundle command\ncli\n .command(\"bundle [...schemas]\", \"Bundle schemas into a JS file\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-o, --output <path>\", \"Output file path\", { default: \"./tokenscript-schemas.js\" })\n .option(\"-d, --dry-run\", \"Preview what would be bundled without writing\")\n .action(async (schemas: string[], options: BundleOptions) => {\n try {\n await handleBundleCommand(schemas, options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// List command\ncli\n .command(\"list\", \"List available schemas\")\n .option(\"--types\", \"List only type schemas\")\n .option(\"--functions\", \"List only function schemas\")\n .action(async (options: ListOptions) => {\n try {\n await handleListCommand(options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Presets command\ncli.command(\"presets\", \"List available bundle presets\").action(async () => {\n try {\n await handlePresetsCommand();\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n});\n\ncli.help();\ncli.version(\"0.0.14\");\n\ncli.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/bundler/presets/css.ts","../../src/bundler/presets/index.ts","../../src/bundler/bundle-schema.ts","../../tests/helpers/logger.ts","../../src/utils/type.ts","../../src/utils/schema-uri.ts","../../src/bundler/schema-dependency-resolver.ts","../../src/bundler/selective-bundler.ts","../../src/cli/config-schema.ts","../../src/cli/version-info.ts","../../src/cli/output-generator.ts","../../src/cli/commands/bundle.ts","../../src/cli/commands/list.ts","../../src/cli/commands/presets.ts","../../src/cli/index.ts"],"names":["join","readFile","ulog","access","__filename","fileURLToPath","__dirname","dirname","readFileSync","log","anylogger","mkdir","writeFile","findSchemasDir","readdir","cac"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * CSS preset - Modern CSS color types and functions\n */\n\nimport type { BundlePreset } from \"./types\";\n\nexport const css: BundlePreset = {\n name: \"CSS\",\n description: \"CSS color types\",\n types: [\n \"hex-color\",\n \"rgb-color\",\n \"hsl-color\",\n \"oklch-color\",\n \"oklab-color\",\n\n // Converting colors to css strings\n \"css-color\",\n ],\n functions: [\"lighten\", \"darken\", \"saturate\", \"desaturate\", \"mix\", \"invert\"],\n};\n","/**\n * Bundle presets - predefined sets of schemas for common use cases\n */\n\nimport { css } from \"./css\";\nimport type { BundlePreset } from \"./types\";\n\nexport type { BundlePreset };\n\n/**\n * Available bundle presets\n */\nexport const BUNDLE_PRESETS: Record<string, BundlePreset> = {\n css,\n};\n\n/**\n * Expand schemas, replacing \"preset:name\" with actual schema list\n */\nexport function expandPresetSchemas(schemas: string[]): string[] {\n const expanded: string[] = [];\n\n for (const schema of schemas) {\n if (schema.startsWith(\"preset:\")) {\n const presetName = schema.slice(7); // Remove \"preset:\"\n const preset = BUNDLE_PRESETS[presetName];\n\n if (preset) {\n // Add all types from preset\n for (const type of preset.types) {\n expanded.push(type === \"*\" ? \"*\" : `type:${type}`);\n }\n // Add all functions from preset\n for (const func of preset.functions) {\n expanded.push(func === \"*\" ? \"*\" : `function:${func}`);\n }\n } else {\n console.warn(`⚠ Unknown preset: ${presetName}`);\n }\n } else {\n // Not a preset, keep as-is\n expanded.push(schema);\n }\n }\n\n return expanded;\n}\n","/**\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 * Centralized logging for tests using ulog\n * Logs are disabled by default and only shown on errors or when explicitly enabled\n */\n\n/// <reference path=\"../../types/ulog.d.ts\" />\nimport ulog from \"ulog\";\n\n// ulog levels: { error: 1, warn: 2, info: 3, log: 4, debug: 5, trace: 6 }\n// Using hardcoded values to avoid runtime initialization issues\nconst LOG_LEVELS = {\n error: 1,\n warn: 2,\n info: 3,\n log: 4,\n debug: 5,\n} as const;\n\n// Define Logger type locally to avoid TypeScript declaration errors\ninterface Logger {\n (...args: any[]): void;\n error(...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n log(...args: any[]): void;\n debug(...args: any[]): void;\n trace(...args: any[]): void;\n level: number;\n}\n\n/**\n * Default logger for all test operations\n * Use: log.debug(), log.info(), log.warn(), log.error()\n */\nexport const log: Logger = ulog(\"schema-registry\");\n\n// Set default log level from environment or disable by default (error = 1)\nconst logLevel = (process.env.LOG_LEVEL || \"error\") as keyof typeof LOG_LEVELS;\nlog.level = LOG_LEVELS[logLevel] || LOG_LEVELS.error;\n\n/**\n * Enable verbose logging for debugging\n * Useful for troubleshooting test failures\n */\nexport function enableVerboseLogging() {\n log.level = LOG_LEVELS.debug;\n}\n\n/**\n * Disable all logging (except errors)\n */\nexport function disableLogging() {\n log.level = LOG_LEVELS.error;\n}\n\n/**\n * Set custom log level\n * @param level - \"debug\" | \"log\" | \"info\" | \"warn\" | \"error\"\n */\nexport function setLogLevel(level: keyof typeof LOG_LEVELS) {\n log.level = LOG_LEVELS[level];\n}\n","// Optional --------------------------------------------------------------------\n\nexport const isSome = <T>(v: T | null | undefined): v is T => {\n return v != null;\n};\n\nexport const isNone = (v: unknown): v is null | undefined => {\n return v == null;\n};\n\n// Primitive type guards -------------------------------------------------------\n\nexport const isNull = (v: unknown): v is null => {\n return v === null;\n};\n\nexport const isUndefined = (v: unknown): v is undefined => {\n return v === undefined;\n};\n\nexport const isObject = (v: unknown): v is Record<string, unknown> => {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n};\n\nexport const isString = (v: unknown): v is string => {\n return typeof v === \"string\";\n};\n\nexport const isNumber = (v: unknown): v is number => {\n return typeof v === \"number\" && !Number.isNaN(v);\n};\n\nexport const isBoolean = (v: unknown): v is boolean => {\n return typeof v === \"boolean\";\n};\n\nexport const isArray = <T = unknown>(v: unknown): v is T[] => {\n return Array.isArray(v);\n};\n\nexport const isFunction = (v: unknown): v is (...args: unknown[]) => unknown => {\n return typeof v === \"function\";\n};\n\nexport const isDate = (v: unknown): v is Date => {\n return v instanceof Date && !Number.isNaN(v.getTime());\n};\n\n// Object ----------------------------------------------------------------------\n\nexport const isMap = (v: unknown): v is Map<unknown, unknown> => v instanceof Map;\n\nexport const isPlainObject = (v: unknown): v is Record<string, unknown> => {\n if (!isObject(v)) return false;\n\n // Objects created by the Object constructor or with null prototype\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n};\n\nexport const hasProperty = <K extends string>(obj: unknown, key: K): obj is Record<K, unknown> => {\n return isObject(obj) && key in obj;\n};\n\nexport const getKeyAlt = <K extends string, T>(\n keys: readonly K[],\n record: Partial<Record<K, T>>,\n): T | undefined => {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n return undefined;\n};\n\nexport const isObjectWithKey = <K extends string>(\n value: unknown,\n key: K,\n): value is Record<K, unknown> => {\n return isObject(value) && key in value;\n};\n\nexport const isNonEmptyObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length > 0;\n};\n\nexport const isSingleEntryObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length === 1;\n};\n\n// Array -----------------------------------------------------------------------\n\nexport const isNonEmptyArray = <T>(v: unknown): v is [T, ...T[]] => {\n return isArray(v) && v.length > 0;\n};\n\nexport const ensureArray = <T>(v: T | T[] | null | undefined): T[] => {\n if (isNone(v)) return [];\n if (isArray<T>(v)) return v;\n return [v];\n};\n\nexport const isOutOfBounds = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index >= value.length;\n};\n\nexport const isOutOfBoundsInclusive = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index > value.length;\n};\n\nexport const isEmpty = (v: unknown): boolean => {\n if (isNone(v)) return true;\n if (isString(v) || isArray(v)) return v.length === 0;\n if (isObject(v)) return Object.keys(v).length === 0;\n return false;\n};\n\n// Number parsing --------------------------------------------------------------\n\nexport const safeParseInt = (v: unknown): number | null => {\n if (isNumber(v)) return Math.floor(v);\n if (isString(v)) {\n const parsed = parseInt(v, 10);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\nexport const safeParseFloat = (v: unknown): number | null => {\n if (isNumber(v)) return v;\n if (isString(v)) {\n const parsed = parseFloat(v);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\n// Type Assertion Helpers ------------------------------------------------------\n\nexport const assertIsSome = <T>(v: T | null | undefined, message?: string): T => {\n if (isNone(v)) {\n throw new Error(message || \"Expected value to be defined\");\n }\n return v;\n};\n\nexport const assertIsType = <T>(v: unknown, guard: (v: unknown) => v is T, message?: string): T => {\n if (!guard(v)) {\n throw new Error(message || \"Type assertion failed\");\n }\n return v;\n};\n\nexport const optional = <T, R>(value: T | null | undefined, fn: (v: T) => R): R | undefined => {\n return isSome(value) ? fn(value) : undefined;\n};\n\nexport const when = <A, B>(a: A, b: B): B | undefined => {\n return a !== undefined && a !== null && a !== false ? b : undefined;\n};\n\nexport const withDefault = <T>(v: T | null | undefined, defaultValue: T): T => {\n return isSome(v) ? v : defaultValue;\n};\n\nexport const isEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (isNone(a) || isNone(b)) return a === b;\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => isEqual(item, b[index]));\n }\n\n if (isObject(a) && isObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) => keysB.includes(key) && isEqual(a[key], b[key]));\n }\n\n return false;\n};\n\n// Conversion ------------------------------------------------------------------\n\nexport const nullToUndefined = <T>(v: T | null | undefined): T | undefined =>\n isNull(v) ? undefined : v;\n","/**\n * Utilities for working with TokenScript schema URIs\n *\n * Handles URI construction, parsing, and manipulation for the TokenScript schema registry.\n */\n\nimport { isObject } from \"./type\";\n\nexport type SemanticVersion =\n | { major: number }\n | { major: number; minor: number }\n | { major: number; minor: number; patch: number };\n\ntype SchemaVersion = \"latest\" | SemanticVersion | null;\n\nexport interface SchemaUriComponents {\n baseUrl: string;\n category: \"schema\" | \"core\" | \"function\";\n name: string;\n version: SchemaVersion;\n}\n\nexport const DEFAULT_REGISTRY_URL = \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\nexport const DEFAULT_API_PATH = \"/api/v1\";\n\nfunction safeParseInt(value: string): number | null {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? null : parsed;\n}\n\nexport function parseSemverFromString(versionString: string): SemanticVersion | null {\n const parts = versionString.split(\".\");\n const numbers: number[] = [];\n\n for (const part of parts) {\n const num = safeParseInt(part);\n if (num === null) return null;\n numbers.push(num);\n }\n\n if (numbers.length !== parts.length) return null;\n\n if (numbers.length === 3) {\n return { major: numbers[0], minor: numbers[1], patch: numbers[2] };\n }\n\n if (numbers.length === 2) {\n return { major: numbers[0], minor: numbers[1] };\n }\n\n if (numbers.length === 1) {\n return { major: numbers[0] };\n }\n\n return null;\n}\n\nexport function parseVersionString(versionString: string): SchemaVersion {\n return versionString === \"latest\" ? \"latest\" : parseSemverFromString(versionString);\n}\n\nexport function semverToString(version: SchemaVersion | undefined): string {\n if (version === undefined) {\n return \"latest\";\n }\n if (isObject(version)) {\n if (\"patch\" in version) return `${version.major}.${version.minor}.${version.patch}`;\n if (\"minor\" in version) return `${version.major}.${version.minor}`;\n return `${version.major}`;\n }\n return \"latest\";\n}\n\nexport function buildSchemaUri(\n params: Partial<SchemaUriComponents> & { category: string; name: string },\n): string {\n const { baseUrl, category, name, version } = params;\n\n const versionString = semverToString(version);\n\n const effectiveBaseUrl = baseUrl === undefined ? DEFAULT_REGISTRY_URL : baseUrl;\n\n if (effectiveBaseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n }\n\n return `${effectiveBaseUrl}${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n}\n\n/**\n * Parse a schema URI into its components\n *\n * @example\n * parseSchemaUri(\"https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"...\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n *\n * parseSchemaUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n */\nexport function parseSchemaUri(uri: string): SchemaUriComponents | null {\n let baseUrl = \"\";\n let pathname = uri;\n\n // Try parsing as full URL first\n try {\n const url = new URL(uri);\n baseUrl = `${url.protocol}//${url.host}`;\n pathname = url.pathname;\n } catch {\n // If URL parsing fails, treat as relative path\n // Check if it starts with a protocol (incomplete URL)\n if (uri.includes(\"://\")) {\n return null;\n }\n // It's a relative path, use as-is\n pathname = uri;\n }\n\n // Parse pathname: /api/v1/schema/rgb-color/0.0.1/\n const pathParts = pathname.split(\"/\").filter((part) => part !== \"\");\n\n // Expected format: [api, v1, category, name, version]\n if (pathParts.length < 5) {\n return null;\n }\n\n // Check if it starts with api/vN\n if (pathParts[0] !== \"api\" || !pathParts[1].startsWith(\"v\")) {\n return null;\n }\n\n const category = pathParts[2];\n if (category !== \"schema\" && category !== \"core\" && category !== \"function\") {\n return null;\n }\n\n const name = pathParts[3];\n const version = parseVersionString(pathParts[4]);\n\n return {\n baseUrl,\n category: category as \"schema\" | \"core\" | \"function\",\n name,\n version,\n };\n}\n\n/**\n * Extract the base URI without version\n *\n * @example\n * getBaseUri(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"https://.../api/v1/schema/rgb-color/\"\n *\n * getBaseUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => \"/api/v1/schema/rgb-color/\"\n */\nexport function getBaseUri(uri: string): string {\n const components = parseSchemaUri(uri);\n\n if (!components) {\n return uri;\n }\n\n const { baseUrl, category, name } = components;\n\n if (baseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/`;\n }\n\n return `${baseUrl}${DEFAULT_API_PATH}/${category}/${name}/`;\n}\n\n/**\n * Extract schema name from URI\n *\n * @example\n * extractSchemaName(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"rgb-color\"\n */\nexport function extractSchemaName(uri: string): string | null {\n const components = parseSchemaUri(uri);\n return components?.name || null;\n}\n\n/**\n * Normalize URI to ensure it ends with trailing slash\n */\nexport function normalizeUri(uri: string): string {\n return uri.endsWith(\"/\") ? uri : `${uri}/`;\n}\n","/**\n * Utilities for resolving schema dependencies automatically\n */\n\nimport { join } from \"node:path\";\nimport { log } from \"@tests/helpers/logger.js\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\nimport { extractSchemaName, parseSchemaUri } from \"@/utils/schema-uri\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\n\nexport interface SchemaReference {\n slug: string;\n type: \"type\" | \"function\";\n uri: string;\n}\n\nexport interface ExtractRequirementsOptions {\n /**\n * Whether to include type dependencies from color conversions\n * Useful for testing to ensure all conversion types are loaded\n * @default false\n */\n includeColorTypeDependencies?: boolean;\n}\n\n/**\n * Extract all required schema URIs from a schema specification\n * Only extracts explicit requirements - not conversions (which are capabilities, not dependencies)\n * However, for testing purposes, can optionally include color type dependencies from conversions\n */\nfunction extractRequirements(\n spec: SchemaSpecification,\n options: ExtractRequirementsOptions = {},\n): string[] {\n const requirements: string[] = [];\n\n if (spec.type === \"function\") {\n // Functions can have explicit requirements\n const funcSpec = spec as FunctionSpecification;\n if (funcSpec.requirements) {\n requirements.push(...funcSpec.requirements);\n }\n } else if (spec.type === \"color\" && options.includeColorTypeDependencies) {\n // Color types have requirements through conversions (when flag is enabled)\n // This is useful for testing to ensure all conversion types are loaded\n const colorSpec = spec as ColorSpecification;\n for (const conversion of colorSpec.conversions || []) {\n // Add source if it's not $self\n if (conversion.source !== \"$self\") {\n requirements.push(conversion.source);\n }\n // Add target if it's not $self\n if (conversion.target !== \"$self\") {\n requirements.push(conversion.target);\n }\n }\n }\n // Note: By default, color types don't have dependencies via conversions\n // Conversions are capabilities, not requirements\n\n return requirements;\n}\n\n/**\n * Resolve a URI to a schema slug and type\n * Works with both full URIs and just schema names\n *\n * @example\n * resolveSchemaReference(\"/api/v1/core/rgb-color/0/\") => { slug: \"rgb-color\", type: \"type\" }\n * resolveSchemaReference(\"rgb-color\") => { slug: \"rgb-color\", type: \"type\" }\n */\nexport function resolveSchemaReference(uriOrName: string): SchemaReference | null {\n // Try parsing as URI first\n const components = parseSchemaUri(uriOrName);\n\n if (components) {\n // Successfully parsed as URI\n const type = components.category === \"function\" ? \"function\" : \"type\";\n return {\n slug: components.name,\n type,\n uri: uriOrName,\n };\n }\n\n // Try extracting name (handles partial URIs)\n const extractedName = extractSchemaName(uriOrName);\n if (extractedName) {\n return {\n slug: extractedName,\n type: \"type\", // Default to type if we can't determine\n uri: uriOrName,\n };\n }\n\n // Treat as plain slug\n if (uriOrName && !uriOrName.includes(\"/\")) {\n return {\n slug: uriOrName,\n type: \"type\", // Default to type\n uri: \"\", // No URI, just a slug\n };\n }\n\n return null;\n}\n\nexport interface ResolvedDependencies {\n types: string[];\n functions: string[];\n}\n\nexport interface DependencyNode {\n slug: string;\n type: \"type\" | \"function\";\n dependencies: string[];\n}\n\nexport interface CollectRequiredSchemasOptions extends ExtractRequirementsOptions {\n baseUrl?: string;\n schemasDir?: string;\n}\n\n/**\n * Recursively collect all required schemas for a given schema\n * Returns a flat list of all dependencies (including transitive ones)\n *\n * @param slugOrUri - Schema slug (e.g., \"rgb-color\") or full URI\n * @param type - Schema type (\"type\" or \"function\"), optional if URI is provided\n * @param options - Options for dependency collection\n * @returns Object with separated type and function dependencies\n *\n * @example\n * // Using slug\n * await collectRequiredSchemas(\"invert\", \"function\")\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [] }\n *\n * // Using URI\n * await collectRequiredSchemas(\"/api/v1/core/rgb-color/0/\")\n * // => { types: [\"hex-color\"], functions: [] }\n */\nexport async function collectRequiredSchemas(\n slugOrUri: string,\n type?: \"type\" | \"function\",\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const visited = new Set<string>();\n const typeSchemas = new Set<string>();\n const functionSchemas = new Set<string>();\n\n async function traverse(currentSlugOrUri: string, currentType?: \"type\" | \"function\") {\n // Resolve to a proper schema reference\n const ref = resolveSchemaReference(currentSlugOrUri);\n if (!ref) {\n log.warn(`Could not resolve schema reference: ${currentSlugOrUri}`);\n return;\n }\n\n // Use provided type if available, otherwise use resolved type\n const effectiveType = currentType || ref.type;\n const slug = ref.slug;\n\n // Create a unique key for visited tracking\n const key = `${effectiveType}:${slug}`;\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n // Try to load the schema\n let spec: SchemaSpecification;\n try {\n // Dynamically determine schema directory\n const categoryDir = effectiveType === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, slug);\n\n spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n } catch (error) {\n log.warn(`Failed to load schema ${slug} (${effectiveType}):`, error);\n return;\n }\n\n // Extract requirements from this schema\n const requirements = extractRequirements(spec, extractOptions);\n\n // Recursively traverse requirements\n for (const reqUri of requirements) {\n const reqRef = resolveSchemaReference(reqUri);\n if (reqRef) {\n // Add to appropriate set\n if (reqRef.type === \"function\") {\n functionSchemas.add(reqRef.slug);\n } else {\n typeSchemas.add(reqRef.slug);\n }\n\n // Recursively collect dependencies\n await traverse(reqUri, reqRef.type);\n }\n }\n }\n\n // Start traversal\n await traverse(slugOrUri, type);\n\n return {\n types: Array.from(typeSchemas),\n functions: Array.from(functionSchemas),\n };\n}\n\n/**\n * Collect all schemas needed for a list of schemas (including their dependencies)\n *\n * @example\n * await collectRequiredSchemasForList([\n * { slug: \"invert\", type: \"function\" },\n * { slug: \"rgb-color\", type: \"type\" }\n * ])\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [\"invert\"] }\n */\nexport async function collectRequiredSchemasForList(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const allTypes = new Set<string>();\n const allFunctions = new Set<string>();\n\n for (const schema of schemas) {\n const deps = await collectRequiredSchemas(schema.slug, schema.type, options);\n\n // Add the schema itself\n if (schema.type === \"function\") {\n allFunctions.add(schema.slug);\n } else {\n allTypes.add(schema.slug);\n }\n\n // Add dependencies\n for (const t of deps.types) {\n allTypes.add(t);\n }\n for (const f of deps.functions) {\n allFunctions.add(f);\n }\n }\n\n return {\n types: Array.from(allTypes),\n functions: Array.from(allFunctions),\n };\n}\n\n/**\n * Collect dependency tree for schemas (non-recursive, shows direct dependencies only)\n */\nexport async function collectDependencyTree(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<Map<string, DependencyNode>> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const tree = new Map<string, DependencyNode>();\n\n for (const schema of schemas) {\n const categoryDir = schema.type === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, schema.slug);\n\n try {\n const spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n const requirements = extractRequirements(spec, extractOptions);\n\n // Extract just the slugs from URIs\n const dependencySlugs = requirements.map((uri) => {\n const ref = resolveSchemaReference(uri);\n return ref ? `${ref.type}:${ref.slug}` : uri;\n });\n\n const key = `${schema.type}:${schema.slug}`;\n tree.set(key, {\n slug: schema.slug,\n type: schema.type,\n dependencies: dependencySlugs,\n });\n } catch (error) {\n log.warn(`Failed to load schema ${schema.slug} (${schema.type}):`, error);\n }\n }\n\n return tree;\n}\n","/**\n * Selective schema bundler for CLI\n * Bundles specific schemas with automatic dependency resolution\n */\n\nimport { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\nimport {\n collectDependencyTree,\n collectRequiredSchemasForList,\n type DependencyNode,\n} from \"./schema-dependency-resolver.js\";\nimport type { ColorSpecification, FunctionSpecification } from \"./types.js\";\n\nexport interface SelectiveBundleOptions {\n schemas: string[]; // Schema slugs to bundle\n schemasDir?: string; // Source directory (default: src/schemas)\n baseUrl?: string; // Registry URL for URIs\n cliArgs?: string[]; // CLI arguments used\n}\n\nexport interface BundledSchemaEntry {\n uri: string;\n schema: ColorSpecification | FunctionSpecification;\n}\n\nexport interface SelectiveBundleResult {\n schemas: BundledSchemaEntry[];\n metadata: {\n requestedSchemas: string[];\n resolvedDependencies: string[];\n generatedAt: string;\n generatedBy?: string;\n };\n dependencyTree: Map<string, DependencyNode>;\n}\n\n/**\n * Detect whether a schema is a type or function by checking which directory exists\n */\nasync function detectSchemaType(\n slug: string,\n schemasDir: string,\n): Promise<\"type\" | \"function\" | null> {\n const typeDir = join(schemasDir, \"types\", slug);\n const functionDir = join(schemasDir, \"functions\", slug);\n\n try {\n await access(typeDir);\n return \"type\";\n } catch {\n // Not a type, try function\n }\n\n try {\n await access(functionDir);\n return \"function\";\n } catch {\n // Not found in either\n }\n\n return null;\n}\n\n/**\n * Bundle specific schemas with automatic dependency resolution\n */\nexport async function bundleSelectiveSchemas(\n options: SelectiveBundleOptions,\n): Promise<SelectiveBundleResult> {\n const schemasDir = options.schemasDir || join(process.cwd(), \"src/schemas\");\n const baseUrl = options.baseUrl || \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\n // Parse schema slugs - they might have type prefixes like \"function:invert\"\n const parsedSchemas = await Promise.all(\n options.schemas.map(async (slug) => {\n if (slug.includes(\":\")) {\n const [type, name] = slug.split(\":\");\n return {\n slug: name,\n type: (type === \"function\" ? \"function\" : \"type\") as \"type\" | \"function\",\n };\n }\n\n // Auto-detect type by checking which directory exists\n const detectedType = await detectSchemaType(slug, schemasDir);\n if (detectedType === null) {\n throw new Error(\n `Schema '${slug}' not found in types or functions directories. ` +\n `Use 'function:${slug}' or 'type:${slug}' prefix to be explicit.`,\n );\n }\n\n return { slug, type: detectedType };\n }),\n );\n\n // Collect all required schemas (including dependencies)\n // For CLI bundling, we include color type dependencies so conversions work\n const deps = await collectRequiredSchemasForList(parsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Collect dependency tree for all schemas (including resolved dependencies)\n const allParsedSchemas = [\n ...deps.types.map((slug) => ({ slug, type: \"type\" as const })),\n ...deps.functions.map((slug) => ({ slug, type: \"function\" as const })),\n ];\n const dependencyTree = await collectDependencyTree(allParsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Track all schema slugs for metadata\n const allSchemas = [...new Set([...deps.types, ...deps.functions])];\n\n // Bundle all schemas\n const bundledSchemas: BundledSchemaEntry[] = [];\n\n // Bundle type schemas\n for (const typeSlug of deps.types) {\n const schemaDir = join(schemasDir, \"types\", typeSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"color\") {\n const uri = `${baseUrl}/api/v1/core/${typeSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as ColorSpecification,\n });\n }\n }\n\n // Bundle function schemas\n for (const funcSlug of deps.functions) {\n const schemaDir = join(schemasDir, \"functions\", funcSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"function\") {\n const uri = `${baseUrl}/api/v1/function/${funcSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as FunctionSpecification,\n });\n }\n }\n\n // Build generatedBy string if CLI args are provided\n const baseCommand = \"npx @tokens-studio/tokenscript-schemas bundle\";\n const generatedBy = options.cliArgs?.length\n ? `${baseCommand} ${options.cliArgs.join(\" \")}`\n : undefined;\n\n return {\n schemas: bundledSchemas,\n metadata: {\n requestedSchemas: options.schemas,\n resolvedDependencies: allSchemas,\n generatedAt: new Date().toISOString(),\n generatedBy,\n },\n dependencyTree,\n };\n}\n","/**\n * Config file schema validation\n */\n\nexport interface BundleConfig {\n schemas: string[];\n output?: string;\n}\n\n/**\n * Validate bundle config\n */\nexport function validateBundleConfig(data: unknown): BundleConfig {\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"Config must be an object\");\n }\n\n const config = data as Record<string, unknown>;\n\n if (!Array.isArray(config.schemas)) {\n throw new Error(\"Config must have a 'schemas' array\");\n }\n\n if (!config.schemas.every((s) => typeof s === \"string\")) {\n throw new Error(\"All schemas must be strings\");\n }\n\n if (config.output !== undefined && typeof config.output !== \"string\") {\n throw new Error(\"Config 'output' must be a string if provided\");\n }\n\n return {\n schemas: config.schemas,\n output: config.output as string | undefined,\n };\n}\n","/**\n * Get version information for the bundled output\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Build-time constant injected by tsup\ndeclare const __IS_BUILT_PACKAGE__: boolean;\n\n// Check if we're running from built package (will be true in dist, undefined when running via tsx)\nconst IS_BUILT = typeof __IS_BUILT_PACKAGE__ !== \"undefined\" && __IS_BUILT_PACKAGE__;\n\nexport interface VersionInfo {\n version: string; // Package version or git SHA\n githubUrl: string;\n isLocal: boolean; // true if running from local repo (not published package)\n}\n\n/**\n * Get the current git SHA\n */\nfunction getGitSha(): string | null {\n try {\n return execSync(\"git rev-parse --short HEAD\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Get version from package.json\n */\nfunction getPackageVersion(): string {\n try {\n // Try multiple paths for package.json\n const paths = [\n join(__dirname, \"../../package.json\"), // From src/cli\n join(__dirname, \"../../../package.json\"), // From dist/cli\n ];\n\n for (const path of paths) {\n try {\n const pkg = JSON.parse(readFileSync(path, \"utf-8\"));\n return pkg.version || \"unknown\";\n } catch {\n // Try next path\n }\n }\n\n return \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\n/**\n * Get version information for the bundle\n */\nexport function getVersionInfo(): VersionInfo {\n const githubUrl = \"https://github.com/tokens-studio/tokenscript-schemas\";\n const packageVersion = getPackageVersion();\n\n let version: string;\n let isLocal: boolean;\n\n if (IS_BUILT) {\n // Running from built package - use package version\n version = `@tokens-studio/tokenscript-schemas@v${packageVersion}`;\n isLocal = false;\n } else {\n // Running locally (via tsx) - use git SHA\n const sha = getGitSha();\n version = sha ? `local-${sha}` : \"local\";\n isLocal = true;\n }\n\n return {\n version,\n githubUrl,\n isLocal,\n };\n}\n","/**\n * Generate JavaScript output for bundled schemas\n */\n\nimport type { BundledSchemaEntry } from \"@/bundler/selective-bundler.js\";\nimport { getVersionInfo } from \"./version-info.js\";\n\nexport interface OutputGeneratorOptions {\n schemas: BundledSchemaEntry[];\n includeHelper?: boolean; // Include makeConfig() helper\n generatedBy?: string; // CLI command used to generate\n}\n\n/**\n * Generate JavaScript code for bundled schemas\n */\nexport function generateOutput(options: OutputGeneratorOptions): string {\n const { schemas, includeHelper = true } = options;\n\n const timestamp = new Date().toISOString();\n const versionInfo = getVersionInfo();\n\n const lines: string[] = [];\n\n // Header comment\n lines.push(\"// Auto-generated by @tokens-studio/tokenscript-schemas\");\n lines.push(`// Version: ${versionInfo.version}`);\n lines.push(`// GitHub: ${versionInfo.githubUrl}`);\n if (options.generatedBy) {\n lines.push(`// Command: ${options.generatedBy}`);\n }\n lines.push(`// Generated: ${timestamp}`);\n lines.push(\"\");\n\n // Import statement\n lines.push('import { Config } from \"@tokens-studio/tokenscript-interpreter\";');\n lines.push(\"\");\n\n // SCHEMAS export\n lines.push(\"export const SCHEMAS = [\");\n for (const entry of schemas) {\n // Format each schema entry - we need to serialize both uri and schema\n const schemaJson = JSON.stringify(entry.schema, null, 2);\n const uriJson = JSON.stringify(entry.uri);\n\n // Indent the schema JSON\n const indentedSchema = schemaJson\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n\n lines.push(` {`);\n lines.push(` uri: ${uriJson},`);\n lines.push(` schema: ${indentedSchema.trim()}`);\n lines.push(` },`);\n }\n lines.push(\"];\");\n lines.push(\"\");\n\n // Helper function\n if (includeHelper) {\n lines.push(\"export function makeConfig() {\");\n lines.push(\" return new Config().registerSchemas(SCHEMAS);\");\n lines.push(\"}\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Bundle command - Bundle schemas into a JS file\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport anylogger from \"ulog\";\nimport { expandPresetSchemas } from \"@/bundler/presets/index.js\";\nimport { bundleSelectiveSchemas } from \"@/bundler/selective-bundler.js\";\nimport { type BundleConfig, validateBundleConfig } from \"@/cli/config-schema.js\";\nimport { generateOutput } from \"@/cli/output-generator.js\";\nimport { isSome } from \"@/utils/type.js\";\n\nconst log = anylogger(\"bundle\");\n\nexport interface BundleOptions {\n config?: string;\n output?: string;\n dryRun?: boolean;\n}\n\n/**\n * Load config from file\n */\nasync function loadConfig(configPath: string): Promise<BundleConfig> {\n try {\n const content = await readFile(configPath, \"utf-8\");\n const parsed = JSON.parse(content);\n return validateBundleConfig(parsed);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`Config file not found: ${configPath}`);\n }\n throw error;\n }\n}\n\n/**\n * Format dependency tree for display\n */\nfunction formatDependencyTree(\n tree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>,\n requestedSchemas: string[],\n): string {\n const lines: string[] = [];\n const visited = new Set<string>();\n\n lines.push(\"Dependency tree:\");\n lines.push(\"\");\n\n // Helper to format a node\n const formatNode = (key: string, indent: string = \"\", isLast: boolean = true) => {\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n const node = tree.get(key);\n if (!node) return;\n\n const prefix = indent + (isLast ? \"└── \" : \"├── \");\n const label = `${node.type}:${node.slug}`;\n lines.push(prefix + label);\n\n if (node.dependencies.length > 0) {\n const childIndent = indent + (isLast ? \" \" : \"│ \");\n node.dependencies.forEach((dep, idx) => {\n const isLastChild = idx === node.dependencies.length - 1;\n const childKey = dep;\n\n if (!visited.has(childKey)) {\n formatNode(childKey, childIndent, isLastChild);\n }\n });\n }\n };\n\n // Format requested schemas\n requestedSchemas.forEach((schema, idx) => {\n // Try to find the schema with different type prefixes\n const typeKey = `type:${schema}`;\n const funcKey = `function:${schema}`;\n const key = tree.has(typeKey) ? typeKey : tree.has(funcKey) ? funcKey : schema;\n\n formatNode(key, \"\", idx === requestedSchemas.length - 1);\n });\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format bundle result for dry-run display\n */\nfunction formatDryRunOutput(schemas: string[], resolvedDependencies: string[]): string {\n const lines: string[] = [];\n\n lines.push(\"Bundle preview:\");\n lines.push(\"\");\n lines.push(`Requested schemas: ${schemas.join(\", \")}`);\n lines.push(`Total schemas (with dependencies): ${resolvedDependencies.length}`);\n lines.push(\"\");\n lines.push(\"Schemas to be bundled:\");\n\n for (const schema of resolvedDependencies.sort()) {\n lines.push(` - ${schema}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Find the schemas directory - works for both development/tests and installed package\n */\nfunction findSchemasDir(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // From compiled dist/cli/index.js (bundled) to src/schemas\n const fromDist = join(__dirname, \"../../src/schemas\");\n\n // From source src/cli/commands/bundle.ts to src/schemas (for tests/dev)\n const fromSource = join(__dirname, \"../../schemas\");\n\n // Try to detect which one exists (check dist first for installed package)\n try {\n const fs = require(\"node:fs\");\n if (fs.existsSync(fromDist)) {\n return fromDist;\n }\n if (fs.existsSync(fromSource)) {\n return fromSource;\n }\n } catch {\n // If fs checks fail, default to dist structure\n }\n\n // Default to dist structure (for installed package)\n return fromDist;\n}\n\n/**\n * Core bundle logic (testable)\n */\nexport async function bundleSchemas(\n schemas: string[],\n schemasDir?: string,\n cliArgs?: string[],\n): Promise<{\n output: string;\n metadata: any;\n dependencyTree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>;\n}> {\n // Use provided schemasDir or auto-detect\n const resolvedSchemasDir = schemasDir || findSchemasDir();\n\n log.info(\"Bundling schemas:\", schemas);\n log.debug(\"Schemas directory:\", resolvedSchemasDir);\n\n // Bundle schemas with dependencies\n const result = await bundleSelectiveSchemas({\n schemas,\n schemasDir: resolvedSchemasDir,\n cliArgs,\n });\n\n log.info(\n `Resolved ${result.metadata.resolvedDependencies.length} schemas (including dependencies)`,\n );\n\n // Generate output\n const output = generateOutput({\n schemas: result.schemas,\n includeHelper: true,\n generatedBy: result.metadata.generatedBy,\n });\n\n return {\n output,\n metadata: result.metadata,\n dependencyTree: result.dependencyTree,\n };\n}\n\n/**\n * CLI action handler for bundle command\n */\nexport async function handleBundleCommand(\n schemas: string[],\n options: BundleOptions = {},\n): Promise<void> {\n try {\n // Load config if provided\n let configSchemas: string[] = schemas;\n let outputPath = options.output || \"./tokenscript-schemas.js\";\n\n if (isSome(options.config)) {\n log.info(`Loading config from ${options.config}`);\n const config = await loadConfig(options.config);\n configSchemas = config.schemas;\n if (config.output) {\n outputPath = config.output;\n }\n }\n\n // Validate we have schemas\n if (!configSchemas || configSchemas.length === 0) {\n throw new Error(\"No schemas specified. Provide schemas as arguments or via --config\");\n }\n\n // Expand any presets (preset:name -> list of schemas)\n configSchemas = expandPresetSchemas(configSchemas);\n\n // Build CLI args array for generatedBy metadata\n const cliArgs: string[] = [];\n if (schemas.length > 0) {\n cliArgs.push(...schemas);\n }\n if (options.config) {\n cliArgs.push(\"--config\", options.config);\n }\n if (options.output) {\n cliArgs.push(\"--output\", options.output);\n }\n if (options.dryRun) {\n cliArgs.push(\"--dry-run\");\n }\n\n // Bundle schemas\n const { output, metadata, dependencyTree } = await bundleSchemas(\n configSchemas,\n undefined,\n cliArgs,\n );\n\n // Show dependency tree\n console.log(\"\");\n console.log(formatDependencyTree(dependencyTree, metadata.requestedSchemas));\n console.log(\"\");\n\n // Dry run - just show what would be bundled\n if (options.dryRun) {\n const preview = formatDryRunOutput(metadata.requestedSchemas, metadata.resolvedDependencies);\n console.log(preview);\n return;\n }\n\n // Write output file\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, output, \"utf-8\");\n\n log.info(`Successfully bundled ${metadata.resolvedDependencies.length} schemas`);\n log.info(`Output written to: ${outputPath}`);\n\n // Summary\n console.log(`✓ Bundled ${metadata.resolvedDependencies.length} schemas → ${outputPath}`);\n } catch (error) {\n log.error(\"Bundle failed:\", error);\n throw error;\n }\n}\n","/**\n * List command - Display available schemas\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { readdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport anylogger from \"ulog\";\n\nconst log = anylogger(\"list\");\n\nexport interface ListOptions {\n types?: boolean;\n functions?: boolean;\n}\n\ninterface ListResult {\n types: string[];\n functions: string[];\n}\n\n/**\n * Find the schemas directory - works for both development/tests and installed package\n */\nfunction findSchemasDir(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // From compiled dist/cli/index.js (bundled) to src/schemas\n const fromDist = join(__dirname, \"../../src/schemas\");\n\n // From source src/cli/commands/list.ts to src/schemas (for tests/dev)\n const fromSource = join(__dirname, \"../../schemas\");\n\n // Try to detect which one exists\n try {\n const fs = require(\"node:fs\");\n if (fs.existsSync(fromDist)) {\n return fromDist;\n }\n if (fs.existsSync(fromSource)) {\n return fromSource;\n }\n } catch {\n // If fs checks fail, default to dist structure\n }\n\n // Default to dist structure (for installed package)\n return fromDist;\n}\n\n/**\n * List all available schemas\n */\nexport async function listSchemas(\n schemasDir?: string,\n options: ListOptions = {},\n): Promise<ListResult> {\n const resolvedSchemasDir = schemasDir || findSchemasDir();\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n const types: string[] = [];\n const functions: string[] = [];\n\n // List type schemas\n if (showTypes) {\n try {\n const typesDir = join(resolvedSchemasDir, \"types\");\n const typeEntries = await readdir(typesDir, { withFileTypes: true });\n types.push(\n ...typeEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read types directory:\", error);\n }\n }\n\n // List function schemas\n if (showFunctions) {\n try {\n const functionsDir = join(resolvedSchemasDir, \"functions\");\n const funcEntries = await readdir(functionsDir, { withFileTypes: true });\n functions.push(\n ...funcEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read functions directory:\", error);\n }\n }\n\n return { types, functions };\n}\n\n/**\n * Format list output for display\n */\nexport function formatListOutput(result: ListResult, options: ListOptions = {}): string {\n const lines: string[] = [];\n\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n if (showTypes && result.types.length > 0) {\n lines.push(\"Types:\");\n for (const type of result.types) {\n lines.push(` ${type}`);\n }\n }\n\n if (showFunctions && result.functions.length > 0) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(\"Functions:\");\n for (const func of result.functions) {\n lines.push(` function:${func}`);\n }\n }\n\n if (lines.length === 0) {\n lines.push(\"No schemas found.\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * CLI action handler for list command\n */\nexport async function handleListCommand(options: ListOptions = {}): Promise<void> {\n const result = await listSchemas(undefined, options);\n const output = formatListOutput(result, options);\n console.log(output);\n}\n","/**\n * Presets command - list available bundle presets\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport anylogger from \"ulog\";\nimport { BUNDLE_PRESETS } from \"@/bundler/presets/index\";\n\nconst log = anylogger(\"presets\");\n\n/**\n * Format preset information for display\n */\nfunction formatPresetInfo(): string {\n const lines: string[] = [];\n\n lines.push(\"=\".repeat(60));\n lines.push(\"Available Bundle Presets\");\n lines.push(\"=\".repeat(60));\n\n for (const [key, preset] of Object.entries(BUNDLE_PRESETS)) {\n lines.push(\"\");\n lines.push(`preset:${key}`);\n lines.push(` ${preset.description}`);\n\n // Types section\n const typesCount =\n preset.types.length === 1 && preset.types[0] === \"*\" ? \"all\" : preset.types.length;\n lines.push(\"\");\n lines.push(` Types (${typesCount}):`);\n if (preset.types.length > 0 && preset.types[0] !== \"*\") {\n for (const type of preset.types) {\n lines.push(` - ${type}`);\n }\n } else {\n lines.push(` - all`);\n }\n\n // Functions section\n const functionsCount =\n preset.functions.length === 1 && preset.functions[0] === \"*\"\n ? \"all\"\n : preset.functions.length;\n lines.push(\"\");\n lines.push(` Functions (${functionsCount}):`);\n if (preset.functions.length > 0 && preset.functions[0] !== \"*\") {\n for (const func of preset.functions) {\n lines.push(` - ${func}`);\n }\n } else {\n lines.push(` - all`);\n }\n }\n\n lines.push(\"\");\n lines.push(\"=\".repeat(60));\n lines.push(\"Usage Examples:\");\n lines.push(\"=\".repeat(60));\n lines.push(\"npx tokenscript-schemas bundle preset:css\");\n lines.push(\"npx tokenscript-schemas bundle preset:css type:oklab-color\");\n lines.push(\"npx tokenscript-schemas bundle type:hex-color function:lighten\");\n lines.push(\"\");\n lines.push(\"Note: You can combine multiple presets and specific schemas!\");\n\n return lines.join(\"\\n\");\n}\n\nexport async function handlePresetsCommand(): Promise<void> {\n try {\n log.info(\"Listing available presets\");\n\n const output = formatPresetInfo();\n console.log(output);\n\n log.info(`Listed ${Object.keys(BUNDLE_PRESETS).length} presets`);\n } catch (error) {\n log.error(\"Failed to list presets:\", error);\n throw error;\n }\n}\n","#!/usr/bin/env node\n\n/**\n * CLI entry point for @tokens-studio/tokenscript-schemas\n */\n\n/// <reference types=\"../../types/ulog\" />\n\nimport cac from \"cac\";\nimport anylogger from \"ulog\";\nimport { type BundleOptions, handleBundleCommand } from \"./commands/bundle.js\";\nimport { handleListCommand, type ListOptions } from \"./commands/list.js\";\nimport { handlePresetsCommand } from \"./commands/presets.js\";\n\nconst log = anylogger(\"cli\");\n\nconst cli = cac(\"tokenscript-schemas\");\n\n// Bundle command\ncli\n .command(\"bundle [...schemas]\", \"Bundle schemas into a JS file\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-o, --output <path>\", \"Output file path\", { default: \"./tokenscript-schemas.js\" })\n .option(\"-d, --dry-run\", \"Preview what would be bundled without writing\")\n .action(async (schemas: string[], options: BundleOptions) => {\n try {\n await handleBundleCommand(schemas, options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// List command\ncli\n .command(\"list\", \"List available schemas\")\n .option(\"--types\", \"List only type schemas\")\n .option(\"--functions\", \"List only function schemas\")\n .action(async (options: ListOptions) => {\n try {\n await handleListCommand(options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Presets command\ncli.command(\"presets\", \"List available bundle presets\").action(async () => {\n try {\n await handlePresetsCommand();\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n});\n\ncli.help();\ncli.version(\"0.0.14\");\n\ncli.parse();\n"]}
|
package/dist/cli/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import ulog from 'ulog';
|
|
|
4
4
|
import { mkdir, writeFile, readFile, readdir, access } from 'fs/promises';
|
|
5
5
|
import { dirname, join } from 'path';
|
|
6
6
|
import { fileURLToPath } from 'url';
|
|
7
|
-
import
|
|
7
|
+
import 'child_process';
|
|
8
8
|
import { readFileSync } from 'fs';
|
|
9
9
|
|
|
10
10
|
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
@@ -466,26 +466,6 @@ function validateBundleConfig(data) {
|
|
|
466
466
|
}
|
|
467
467
|
var __filename$1 = fileURLToPath(import.meta.url);
|
|
468
468
|
var __dirname$1 = dirname(__filename$1);
|
|
469
|
-
function getGitSha() {
|
|
470
|
-
try {
|
|
471
|
-
return execSync("git rev-parse --short HEAD", {
|
|
472
|
-
encoding: "utf-8",
|
|
473
|
-
stdio: ["pipe", "pipe", "ignore"]
|
|
474
|
-
}).trim();
|
|
475
|
-
} catch {
|
|
476
|
-
return null;
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
function isGitRepo() {
|
|
480
|
-
try {
|
|
481
|
-
execSync("git rev-parse --git-dir", {
|
|
482
|
-
stdio: ["pipe", "pipe", "ignore"]
|
|
483
|
-
});
|
|
484
|
-
return true;
|
|
485
|
-
} catch {
|
|
486
|
-
return false;
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
469
|
function getPackageVersion() {
|
|
490
470
|
try {
|
|
491
471
|
const paths = [
|
|
@@ -508,13 +488,12 @@ function getPackageVersion() {
|
|
|
508
488
|
}
|
|
509
489
|
function getVersionInfo() {
|
|
510
490
|
const githubUrl = "https://github.com/tokens-studio/tokenscript-schemas";
|
|
511
|
-
const
|
|
491
|
+
const packageVersion = getPackageVersion();
|
|
512
492
|
let version;
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
version =
|
|
516
|
-
|
|
517
|
-
version = getPackageVersion();
|
|
493
|
+
let isLocal;
|
|
494
|
+
{
|
|
495
|
+
version = `@tokens-studio/tokenscript-schemas@v${packageVersion}`;
|
|
496
|
+
isLocal = false;
|
|
518
497
|
}
|
|
519
498
|
return {
|
|
520
499
|
version,
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bundler/presets/css.ts","../../src/bundler/presets/index.ts","../../src/bundler/bundle-schema.ts","../../tests/helpers/logger.ts","../../src/utils/type.ts","../../src/utils/schema-uri.ts","../../src/bundler/schema-dependency-resolver.ts","../../src/bundler/selective-bundler.ts","../../src/cli/config-schema.ts","../../src/cli/version-info.ts","../../src/cli/output-generator.ts","../../src/cli/commands/bundle.ts","../../src/cli/commands/list.ts","../../src/cli/commands/presets.ts","../../src/cli/index.ts"],"names":["join","__filename","__dirname","log","anylogger","readFile","fileURLToPath","dirname","findSchemasDir"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * CSS preset - Modern CSS color types and functions\n */\n\nimport type { BundlePreset } from \"./types\";\n\nexport const css: BundlePreset = {\n name: \"CSS\",\n description: \"CSS color types\",\n types: [\n \"hex-color\",\n \"rgb-color\",\n \"hsl-color\",\n \"oklch-color\",\n \"oklab-color\",\n\n // Converting colors to css strings\n \"css-color\",\n ],\n functions: [\"lighten\", \"darken\", \"saturate\", \"desaturate\", \"mix\", \"invert\"],\n};\n","/**\n * Bundle presets - predefined sets of schemas for common use cases\n */\n\nimport { css } from \"./css\";\nimport type { BundlePreset } from \"./types\";\n\nexport type { BundlePreset };\n\n/**\n * Available bundle presets\n */\nexport const BUNDLE_PRESETS: Record<string, BundlePreset> = {\n css,\n};\n\n/**\n * Expand schemas, replacing \"preset:name\" with actual schema list\n */\nexport function expandPresetSchemas(schemas: string[]): string[] {\n const expanded: string[] = [];\n\n for (const schema of schemas) {\n if (schema.startsWith(\"preset:\")) {\n const presetName = schema.slice(7); // Remove \"preset:\"\n const preset = BUNDLE_PRESETS[presetName];\n\n if (preset) {\n // Add all types from preset\n for (const type of preset.types) {\n expanded.push(type === \"*\" ? \"*\" : `type:${type}`);\n }\n // Add all functions from preset\n for (const func of preset.functions) {\n expanded.push(func === \"*\" ? \"*\" : `function:${func}`);\n }\n } else {\n console.warn(`⚠ Unknown preset: ${presetName}`);\n }\n } else {\n // Not a preset, keep as-is\n expanded.push(schema);\n }\n }\n\n return expanded;\n}\n","/**\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 * Centralized logging for tests using ulog\n * Logs are disabled by default and only shown on errors or when explicitly enabled\n */\n\n/// <reference path=\"../../types/ulog.d.ts\" />\nimport ulog from \"ulog\";\n\n// ulog levels: { error: 1, warn: 2, info: 3, log: 4, debug: 5, trace: 6 }\n// Using hardcoded values to avoid runtime initialization issues\nconst LOG_LEVELS = {\n error: 1,\n warn: 2,\n info: 3,\n log: 4,\n debug: 5,\n} as const;\n\n// Define Logger type locally to avoid TypeScript declaration errors\ninterface Logger {\n (...args: any[]): void;\n error(...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n log(...args: any[]): void;\n debug(...args: any[]): void;\n trace(...args: any[]): void;\n level: number;\n}\n\n/**\n * Default logger for all test operations\n * Use: log.debug(), log.info(), log.warn(), log.error()\n */\nexport const log: Logger = ulog(\"schema-registry\");\n\n// Set default log level from environment or disable by default (error = 1)\nconst logLevel = (process.env.LOG_LEVEL || \"error\") as keyof typeof LOG_LEVELS;\nlog.level = LOG_LEVELS[logLevel] || LOG_LEVELS.error;\n\n/**\n * Enable verbose logging for debugging\n * Useful for troubleshooting test failures\n */\nexport function enableVerboseLogging() {\n log.level = LOG_LEVELS.debug;\n}\n\n/**\n * Disable all logging (except errors)\n */\nexport function disableLogging() {\n log.level = LOG_LEVELS.error;\n}\n\n/**\n * Set custom log level\n * @param level - \"debug\" | \"log\" | \"info\" | \"warn\" | \"error\"\n */\nexport function setLogLevel(level: keyof typeof LOG_LEVELS) {\n log.level = LOG_LEVELS[level];\n}\n","// Optional --------------------------------------------------------------------\n\nexport const isSome = <T>(v: T | null | undefined): v is T => {\n return v != null;\n};\n\nexport const isNone = (v: unknown): v is null | undefined => {\n return v == null;\n};\n\n// Primitive type guards -------------------------------------------------------\n\nexport const isNull = (v: unknown): v is null => {\n return v === null;\n};\n\nexport const isUndefined = (v: unknown): v is undefined => {\n return v === undefined;\n};\n\nexport const isObject = (v: unknown): v is Record<string, unknown> => {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n};\n\nexport const isString = (v: unknown): v is string => {\n return typeof v === \"string\";\n};\n\nexport const isNumber = (v: unknown): v is number => {\n return typeof v === \"number\" && !Number.isNaN(v);\n};\n\nexport const isBoolean = (v: unknown): v is boolean => {\n return typeof v === \"boolean\";\n};\n\nexport const isArray = <T = unknown>(v: unknown): v is T[] => {\n return Array.isArray(v);\n};\n\nexport const isFunction = (v: unknown): v is (...args: unknown[]) => unknown => {\n return typeof v === \"function\";\n};\n\nexport const isDate = (v: unknown): v is Date => {\n return v instanceof Date && !Number.isNaN(v.getTime());\n};\n\n// Object ----------------------------------------------------------------------\n\nexport const isMap = (v: unknown): v is Map<unknown, unknown> => v instanceof Map;\n\nexport const isPlainObject = (v: unknown): v is Record<string, unknown> => {\n if (!isObject(v)) return false;\n\n // Objects created by the Object constructor or with null prototype\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n};\n\nexport const hasProperty = <K extends string>(obj: unknown, key: K): obj is Record<K, unknown> => {\n return isObject(obj) && key in obj;\n};\n\nexport const getKeyAlt = <K extends string, T>(\n keys: readonly K[],\n record: Partial<Record<K, T>>,\n): T | undefined => {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n return undefined;\n};\n\nexport const isObjectWithKey = <K extends string>(\n value: unknown,\n key: K,\n): value is Record<K, unknown> => {\n return isObject(value) && key in value;\n};\n\nexport const isNonEmptyObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length > 0;\n};\n\nexport const isSingleEntryObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length === 1;\n};\n\n// Array -----------------------------------------------------------------------\n\nexport const isNonEmptyArray = <T>(v: unknown): v is [T, ...T[]] => {\n return isArray(v) && v.length > 0;\n};\n\nexport const ensureArray = <T>(v: T | T[] | null | undefined): T[] => {\n if (isNone(v)) return [];\n if (isArray<T>(v)) return v;\n return [v];\n};\n\nexport const isOutOfBounds = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index >= value.length;\n};\n\nexport const isOutOfBoundsInclusive = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index > value.length;\n};\n\nexport const isEmpty = (v: unknown): boolean => {\n if (isNone(v)) return true;\n if (isString(v) || isArray(v)) return v.length === 0;\n if (isObject(v)) return Object.keys(v).length === 0;\n return false;\n};\n\n// Number parsing --------------------------------------------------------------\n\nexport const safeParseInt = (v: unknown): number | null => {\n if (isNumber(v)) return Math.floor(v);\n if (isString(v)) {\n const parsed = parseInt(v, 10);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\nexport const safeParseFloat = (v: unknown): number | null => {\n if (isNumber(v)) return v;\n if (isString(v)) {\n const parsed = parseFloat(v);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\n// Type Assertion Helpers ------------------------------------------------------\n\nexport const assertIsSome = <T>(v: T | null | undefined, message?: string): T => {\n if (isNone(v)) {\n throw new Error(message || \"Expected value to be defined\");\n }\n return v;\n};\n\nexport const assertIsType = <T>(v: unknown, guard: (v: unknown) => v is T, message?: string): T => {\n if (!guard(v)) {\n throw new Error(message || \"Type assertion failed\");\n }\n return v;\n};\n\nexport const optional = <T, R>(value: T | null | undefined, fn: (v: T) => R): R | undefined => {\n return isSome(value) ? fn(value) : undefined;\n};\n\nexport const when = <A, B>(a: A, b: B): B | undefined => {\n return a !== undefined && a !== null && a !== false ? b : undefined;\n};\n\nexport const withDefault = <T>(v: T | null | undefined, defaultValue: T): T => {\n return isSome(v) ? v : defaultValue;\n};\n\nexport const isEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (isNone(a) || isNone(b)) return a === b;\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => isEqual(item, b[index]));\n }\n\n if (isObject(a) && isObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) => keysB.includes(key) && isEqual(a[key], b[key]));\n }\n\n return false;\n};\n\n// Conversion ------------------------------------------------------------------\n\nexport const nullToUndefined = <T>(v: T | null | undefined): T | undefined =>\n isNull(v) ? undefined : v;\n","/**\n * Utilities for working with TokenScript schema URIs\n *\n * Handles URI construction, parsing, and manipulation for the TokenScript schema registry.\n */\n\nimport { isObject } from \"./type\";\n\nexport type SemanticVersion =\n | { major: number }\n | { major: number; minor: number }\n | { major: number; minor: number; patch: number };\n\ntype SchemaVersion = \"latest\" | SemanticVersion | null;\n\nexport interface SchemaUriComponents {\n baseUrl: string;\n category: \"schema\" | \"core\" | \"function\";\n name: string;\n version: SchemaVersion;\n}\n\nexport const DEFAULT_REGISTRY_URL = \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\nexport const DEFAULT_API_PATH = \"/api/v1\";\n\nfunction safeParseInt(value: string): number | null {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? null : parsed;\n}\n\nexport function parseSemverFromString(versionString: string): SemanticVersion | null {\n const parts = versionString.split(\".\");\n const numbers: number[] = [];\n\n for (const part of parts) {\n const num = safeParseInt(part);\n if (num === null) return null;\n numbers.push(num);\n }\n\n if (numbers.length !== parts.length) return null;\n\n if (numbers.length === 3) {\n return { major: numbers[0], minor: numbers[1], patch: numbers[2] };\n }\n\n if (numbers.length === 2) {\n return { major: numbers[0], minor: numbers[1] };\n }\n\n if (numbers.length === 1) {\n return { major: numbers[0] };\n }\n\n return null;\n}\n\nexport function parseVersionString(versionString: string): SchemaVersion {\n return versionString === \"latest\" ? \"latest\" : parseSemverFromString(versionString);\n}\n\nexport function semverToString(version: SchemaVersion | undefined): string {\n if (version === undefined) {\n return \"latest\";\n }\n if (isObject(version)) {\n if (\"patch\" in version) return `${version.major}.${version.minor}.${version.patch}`;\n if (\"minor\" in version) return `${version.major}.${version.minor}`;\n return `${version.major}`;\n }\n return \"latest\";\n}\n\nexport function buildSchemaUri(\n params: Partial<SchemaUriComponents> & { category: string; name: string },\n): string {\n const { baseUrl, category, name, version } = params;\n\n const versionString = semverToString(version);\n\n const effectiveBaseUrl = baseUrl === undefined ? DEFAULT_REGISTRY_URL : baseUrl;\n\n if (effectiveBaseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n }\n\n return `${effectiveBaseUrl}${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n}\n\n/**\n * Parse a schema URI into its components\n *\n * @example\n * parseSchemaUri(\"https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"...\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n *\n * parseSchemaUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n */\nexport function parseSchemaUri(uri: string): SchemaUriComponents | null {\n let baseUrl = \"\";\n let pathname = uri;\n\n // Try parsing as full URL first\n try {\n const url = new URL(uri);\n baseUrl = `${url.protocol}//${url.host}`;\n pathname = url.pathname;\n } catch {\n // If URL parsing fails, treat as relative path\n // Check if it starts with a protocol (incomplete URL)\n if (uri.includes(\"://\")) {\n return null;\n }\n // It's a relative path, use as-is\n pathname = uri;\n }\n\n // Parse pathname: /api/v1/schema/rgb-color/0.0.1/\n const pathParts = pathname.split(\"/\").filter((part) => part !== \"\");\n\n // Expected format: [api, v1, category, name, version]\n if (pathParts.length < 5) {\n return null;\n }\n\n // Check if it starts with api/vN\n if (pathParts[0] !== \"api\" || !pathParts[1].startsWith(\"v\")) {\n return null;\n }\n\n const category = pathParts[2];\n if (category !== \"schema\" && category !== \"core\" && category !== \"function\") {\n return null;\n }\n\n const name = pathParts[3];\n const version = parseVersionString(pathParts[4]);\n\n return {\n baseUrl,\n category: category as \"schema\" | \"core\" | \"function\",\n name,\n version,\n };\n}\n\n/**\n * Extract the base URI without version\n *\n * @example\n * getBaseUri(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"https://.../api/v1/schema/rgb-color/\"\n *\n * getBaseUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => \"/api/v1/schema/rgb-color/\"\n */\nexport function getBaseUri(uri: string): string {\n const components = parseSchemaUri(uri);\n\n if (!components) {\n return uri;\n }\n\n const { baseUrl, category, name } = components;\n\n if (baseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/`;\n }\n\n return `${baseUrl}${DEFAULT_API_PATH}/${category}/${name}/`;\n}\n\n/**\n * Extract schema name from URI\n *\n * @example\n * extractSchemaName(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"rgb-color\"\n */\nexport function extractSchemaName(uri: string): string | null {\n const components = parseSchemaUri(uri);\n return components?.name || null;\n}\n\n/**\n * Normalize URI to ensure it ends with trailing slash\n */\nexport function normalizeUri(uri: string): string {\n return uri.endsWith(\"/\") ? uri : `${uri}/`;\n}\n","/**\n * Utilities for resolving schema dependencies automatically\n */\n\nimport { join } from \"node:path\";\nimport { log } from \"@tests/helpers/logger.js\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\nimport { extractSchemaName, parseSchemaUri } from \"@/utils/schema-uri\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\n\nexport interface SchemaReference {\n slug: string;\n type: \"type\" | \"function\";\n uri: string;\n}\n\nexport interface ExtractRequirementsOptions {\n /**\n * Whether to include type dependencies from color conversions\n * Useful for testing to ensure all conversion types are loaded\n * @default false\n */\n includeColorTypeDependencies?: boolean;\n}\n\n/**\n * Extract all required schema URIs from a schema specification\n * Only extracts explicit requirements - not conversions (which are capabilities, not dependencies)\n * However, for testing purposes, can optionally include color type dependencies from conversions\n */\nfunction extractRequirements(\n spec: SchemaSpecification,\n options: ExtractRequirementsOptions = {},\n): string[] {\n const requirements: string[] = [];\n\n if (spec.type === \"function\") {\n // Functions can have explicit requirements\n const funcSpec = spec as FunctionSpecification;\n if (funcSpec.requirements) {\n requirements.push(...funcSpec.requirements);\n }\n } else if (spec.type === \"color\" && options.includeColorTypeDependencies) {\n // Color types have requirements through conversions (when flag is enabled)\n // This is useful for testing to ensure all conversion types are loaded\n const colorSpec = spec as ColorSpecification;\n for (const conversion of colorSpec.conversions || []) {\n // Add source if it's not $self\n if (conversion.source !== \"$self\") {\n requirements.push(conversion.source);\n }\n // Add target if it's not $self\n if (conversion.target !== \"$self\") {\n requirements.push(conversion.target);\n }\n }\n }\n // Note: By default, color types don't have dependencies via conversions\n // Conversions are capabilities, not requirements\n\n return requirements;\n}\n\n/**\n * Resolve a URI to a schema slug and type\n * Works with both full URIs and just schema names\n *\n * @example\n * resolveSchemaReference(\"/api/v1/core/rgb-color/0/\") => { slug: \"rgb-color\", type: \"type\" }\n * resolveSchemaReference(\"rgb-color\") => { slug: \"rgb-color\", type: \"type\" }\n */\nexport function resolveSchemaReference(uriOrName: string): SchemaReference | null {\n // Try parsing as URI first\n const components = parseSchemaUri(uriOrName);\n\n if (components) {\n // Successfully parsed as URI\n const type = components.category === \"function\" ? \"function\" : \"type\";\n return {\n slug: components.name,\n type,\n uri: uriOrName,\n };\n }\n\n // Try extracting name (handles partial URIs)\n const extractedName = extractSchemaName(uriOrName);\n if (extractedName) {\n return {\n slug: extractedName,\n type: \"type\", // Default to type if we can't determine\n uri: uriOrName,\n };\n }\n\n // Treat as plain slug\n if (uriOrName && !uriOrName.includes(\"/\")) {\n return {\n slug: uriOrName,\n type: \"type\", // Default to type\n uri: \"\", // No URI, just a slug\n };\n }\n\n return null;\n}\n\nexport interface ResolvedDependencies {\n types: string[];\n functions: string[];\n}\n\nexport interface DependencyNode {\n slug: string;\n type: \"type\" | \"function\";\n dependencies: string[];\n}\n\nexport interface CollectRequiredSchemasOptions extends ExtractRequirementsOptions {\n baseUrl?: string;\n schemasDir?: string;\n}\n\n/**\n * Recursively collect all required schemas for a given schema\n * Returns a flat list of all dependencies (including transitive ones)\n *\n * @param slugOrUri - Schema slug (e.g., \"rgb-color\") or full URI\n * @param type - Schema type (\"type\" or \"function\"), optional if URI is provided\n * @param options - Options for dependency collection\n * @returns Object with separated type and function dependencies\n *\n * @example\n * // Using slug\n * await collectRequiredSchemas(\"invert\", \"function\")\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [] }\n *\n * // Using URI\n * await collectRequiredSchemas(\"/api/v1/core/rgb-color/0/\")\n * // => { types: [\"hex-color\"], functions: [] }\n */\nexport async function collectRequiredSchemas(\n slugOrUri: string,\n type?: \"type\" | \"function\",\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const visited = new Set<string>();\n const typeSchemas = new Set<string>();\n const functionSchemas = new Set<string>();\n\n async function traverse(currentSlugOrUri: string, currentType?: \"type\" | \"function\") {\n // Resolve to a proper schema reference\n const ref = resolveSchemaReference(currentSlugOrUri);\n if (!ref) {\n log.warn(`Could not resolve schema reference: ${currentSlugOrUri}`);\n return;\n }\n\n // Use provided type if available, otherwise use resolved type\n const effectiveType = currentType || ref.type;\n const slug = ref.slug;\n\n // Create a unique key for visited tracking\n const key = `${effectiveType}:${slug}`;\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n // Try to load the schema\n let spec: SchemaSpecification;\n try {\n // Dynamically determine schema directory\n const categoryDir = effectiveType === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, slug);\n\n spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n } catch (error) {\n log.warn(`Failed to load schema ${slug} (${effectiveType}):`, error);\n return;\n }\n\n // Extract requirements from this schema\n const requirements = extractRequirements(spec, extractOptions);\n\n // Recursively traverse requirements\n for (const reqUri of requirements) {\n const reqRef = resolveSchemaReference(reqUri);\n if (reqRef) {\n // Add to appropriate set\n if (reqRef.type === \"function\") {\n functionSchemas.add(reqRef.slug);\n } else {\n typeSchemas.add(reqRef.slug);\n }\n\n // Recursively collect dependencies\n await traverse(reqUri, reqRef.type);\n }\n }\n }\n\n // Start traversal\n await traverse(slugOrUri, type);\n\n return {\n types: Array.from(typeSchemas),\n functions: Array.from(functionSchemas),\n };\n}\n\n/**\n * Collect all schemas needed for a list of schemas (including their dependencies)\n *\n * @example\n * await collectRequiredSchemasForList([\n * { slug: \"invert\", type: \"function\" },\n * { slug: \"rgb-color\", type: \"type\" }\n * ])\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [\"invert\"] }\n */\nexport async function collectRequiredSchemasForList(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const allTypes = new Set<string>();\n const allFunctions = new Set<string>();\n\n for (const schema of schemas) {\n const deps = await collectRequiredSchemas(schema.slug, schema.type, options);\n\n // Add the schema itself\n if (schema.type === \"function\") {\n allFunctions.add(schema.slug);\n } else {\n allTypes.add(schema.slug);\n }\n\n // Add dependencies\n for (const t of deps.types) {\n allTypes.add(t);\n }\n for (const f of deps.functions) {\n allFunctions.add(f);\n }\n }\n\n return {\n types: Array.from(allTypes),\n functions: Array.from(allFunctions),\n };\n}\n\n/**\n * Collect dependency tree for schemas (non-recursive, shows direct dependencies only)\n */\nexport async function collectDependencyTree(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<Map<string, DependencyNode>> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const tree = new Map<string, DependencyNode>();\n\n for (const schema of schemas) {\n const categoryDir = schema.type === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, schema.slug);\n\n try {\n const spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n const requirements = extractRequirements(spec, extractOptions);\n\n // Extract just the slugs from URIs\n const dependencySlugs = requirements.map((uri) => {\n const ref = resolveSchemaReference(uri);\n return ref ? `${ref.type}:${ref.slug}` : uri;\n });\n\n const key = `${schema.type}:${schema.slug}`;\n tree.set(key, {\n slug: schema.slug,\n type: schema.type,\n dependencies: dependencySlugs,\n });\n } catch (error) {\n log.warn(`Failed to load schema ${schema.slug} (${schema.type}):`, error);\n }\n }\n\n return tree;\n}\n","/**\n * Selective schema bundler for CLI\n * Bundles specific schemas with automatic dependency resolution\n */\n\nimport { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\nimport {\n collectDependencyTree,\n collectRequiredSchemasForList,\n type DependencyNode,\n} from \"./schema-dependency-resolver.js\";\nimport type { ColorSpecification, FunctionSpecification } from \"./types.js\";\n\nexport interface SelectiveBundleOptions {\n schemas: string[]; // Schema slugs to bundle\n schemasDir?: string; // Source directory (default: src/schemas)\n baseUrl?: string; // Registry URL for URIs\n cliArgs?: string[]; // CLI arguments used\n}\n\nexport interface BundledSchemaEntry {\n uri: string;\n schema: ColorSpecification | FunctionSpecification;\n}\n\nexport interface SelectiveBundleResult {\n schemas: BundledSchemaEntry[];\n metadata: {\n requestedSchemas: string[];\n resolvedDependencies: string[];\n generatedAt: string;\n generatedBy?: string;\n };\n dependencyTree: Map<string, DependencyNode>;\n}\n\n/**\n * Detect whether a schema is a type or function by checking which directory exists\n */\nasync function detectSchemaType(\n slug: string,\n schemasDir: string,\n): Promise<\"type\" | \"function\" | null> {\n const typeDir = join(schemasDir, \"types\", slug);\n const functionDir = join(schemasDir, \"functions\", slug);\n\n try {\n await access(typeDir);\n return \"type\";\n } catch {\n // Not a type, try function\n }\n\n try {\n await access(functionDir);\n return \"function\";\n } catch {\n // Not found in either\n }\n\n return null;\n}\n\n/**\n * Bundle specific schemas with automatic dependency resolution\n */\nexport async function bundleSelectiveSchemas(\n options: SelectiveBundleOptions,\n): Promise<SelectiveBundleResult> {\n const schemasDir = options.schemasDir || join(process.cwd(), \"src/schemas\");\n const baseUrl = options.baseUrl || \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\n // Parse schema slugs - they might have type prefixes like \"function:invert\"\n const parsedSchemas = await Promise.all(\n options.schemas.map(async (slug) => {\n if (slug.includes(\":\")) {\n const [type, name] = slug.split(\":\");\n return {\n slug: name,\n type: (type === \"function\" ? \"function\" : \"type\") as \"type\" | \"function\",\n };\n }\n\n // Auto-detect type by checking which directory exists\n const detectedType = await detectSchemaType(slug, schemasDir);\n if (detectedType === null) {\n throw new Error(\n `Schema '${slug}' not found in types or functions directories. ` +\n `Use 'function:${slug}' or 'type:${slug}' prefix to be explicit.`,\n );\n }\n\n return { slug, type: detectedType };\n }),\n );\n\n // Collect all required schemas (including dependencies)\n // For CLI bundling, we include color type dependencies so conversions work\n const deps = await collectRequiredSchemasForList(parsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Collect dependency tree for all schemas (including resolved dependencies)\n const allParsedSchemas = [\n ...deps.types.map((slug) => ({ slug, type: \"type\" as const })),\n ...deps.functions.map((slug) => ({ slug, type: \"function\" as const })),\n ];\n const dependencyTree = await collectDependencyTree(allParsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Track all schema slugs for metadata\n const allSchemas = [...new Set([...deps.types, ...deps.functions])];\n\n // Bundle all schemas\n const bundledSchemas: BundledSchemaEntry[] = [];\n\n // Bundle type schemas\n for (const typeSlug of deps.types) {\n const schemaDir = join(schemasDir, \"types\", typeSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"color\") {\n const uri = `${baseUrl}/api/v1/core/${typeSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as ColorSpecification,\n });\n }\n }\n\n // Bundle function schemas\n for (const funcSlug of deps.functions) {\n const schemaDir = join(schemasDir, \"functions\", funcSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"function\") {\n const uri = `${baseUrl}/api/v1/function/${funcSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as FunctionSpecification,\n });\n }\n }\n\n // Build generatedBy string if CLI args are provided\n const baseCommand = \"npx @tokens-studio/tokenscript-schemas bundle\";\n const generatedBy = options.cliArgs?.length\n ? `${baseCommand} ${options.cliArgs.join(\" \")}`\n : undefined;\n\n return {\n schemas: bundledSchemas,\n metadata: {\n requestedSchemas: options.schemas,\n resolvedDependencies: allSchemas,\n generatedAt: new Date().toISOString(),\n generatedBy,\n },\n dependencyTree,\n };\n}\n","/**\n * Config file schema validation\n */\n\nexport interface BundleConfig {\n schemas: string[];\n output?: string;\n}\n\n/**\n * Validate bundle config\n */\nexport function validateBundleConfig(data: unknown): BundleConfig {\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"Config must be an object\");\n }\n\n const config = data as Record<string, unknown>;\n\n if (!Array.isArray(config.schemas)) {\n throw new Error(\"Config must have a 'schemas' array\");\n }\n\n if (!config.schemas.every((s) => typeof s === \"string\")) {\n throw new Error(\"All schemas must be strings\");\n }\n\n if (config.output !== undefined && typeof config.output !== \"string\") {\n throw new Error(\"Config 'output' must be a string if provided\");\n }\n\n return {\n schemas: config.schemas,\n output: config.output as string | undefined,\n };\n}\n","/**\n * Get version information for the bundled output\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport interface VersionInfo {\n version: string; // Package version or git SHA\n githubUrl: string;\n isLocal: boolean; // true if running from local repo (not published package)\n}\n\n/**\n * Get the current git SHA\n */\nfunction getGitSha(): string | null {\n try {\n return execSync(\"git rev-parse --short HEAD\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Check if we're running from a local git repo\n */\nfunction isGitRepo(): boolean {\n try {\n execSync(\"git rev-parse --git-dir\", {\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get version from package.json\n */\nfunction getPackageVersion(): string {\n try {\n // Try multiple paths for package.json\n const paths = [\n join(__dirname, \"../../package.json\"), // From src/cli\n join(__dirname, \"../../../package.json\"), // From dist/cli\n ];\n\n for (const path of paths) {\n try {\n const pkg = JSON.parse(readFileSync(path, \"utf-8\"));\n return pkg.version || \"unknown\";\n } catch {\n // Try next path\n }\n }\n\n return \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\n/**\n * Get version information for the bundle\n */\nexport function getVersionInfo(): VersionInfo {\n const githubUrl = \"https://github.com/tokens-studio/tokenscript-schemas\";\n const isLocal = isGitRepo();\n\n let version: string;\n if (isLocal) {\n const sha = getGitSha();\n version = sha ? `local-${sha}` : \"local\";\n } else {\n version = getPackageVersion();\n }\n\n return {\n version,\n githubUrl,\n isLocal,\n };\n}\n","/**\n * Generate JavaScript output for bundled schemas\n */\n\nimport type { BundledSchemaEntry } from \"@/bundler/selective-bundler.js\";\nimport { getVersionInfo } from \"./version-info.js\";\n\nexport interface OutputGeneratorOptions {\n schemas: BundledSchemaEntry[];\n includeHelper?: boolean; // Include makeConfig() helper\n generatedBy?: string; // CLI command used to generate\n}\n\n/**\n * Generate JavaScript code for bundled schemas\n */\nexport function generateOutput(options: OutputGeneratorOptions): string {\n const { schemas, includeHelper = true } = options;\n\n const timestamp = new Date().toISOString();\n const versionInfo = getVersionInfo();\n\n const lines: string[] = [];\n\n // Header comment\n lines.push(\"// Auto-generated by @tokens-studio/tokenscript-schemas\");\n lines.push(`// Version: ${versionInfo.version}`);\n lines.push(`// GitHub: ${versionInfo.githubUrl}`);\n if (options.generatedBy) {\n lines.push(`// Command: ${options.generatedBy}`);\n }\n lines.push(`// Generated: ${timestamp}`);\n lines.push(\"\");\n\n // Import statement\n lines.push('import { Config } from \"@tokens-studio/tokenscript-interpreter\";');\n lines.push(\"\");\n\n // SCHEMAS export\n lines.push(\"export const SCHEMAS = [\");\n for (const entry of schemas) {\n // Format each schema entry - we need to serialize both uri and schema\n const schemaJson = JSON.stringify(entry.schema, null, 2);\n const uriJson = JSON.stringify(entry.uri);\n\n // Indent the schema JSON\n const indentedSchema = schemaJson\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n\n lines.push(` {`);\n lines.push(` uri: ${uriJson},`);\n lines.push(` schema: ${indentedSchema.trim()}`);\n lines.push(` },`);\n }\n lines.push(\"];\");\n lines.push(\"\");\n\n // Helper function\n if (includeHelper) {\n lines.push(\"export function makeConfig() {\");\n lines.push(\" return new Config().registerSchemas(SCHEMAS);\");\n lines.push(\"}\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Bundle command - Bundle schemas into a JS file\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport anylogger from \"ulog\";\nimport { expandPresetSchemas } from \"@/bundler/presets/index.js\";\nimport { bundleSelectiveSchemas } from \"@/bundler/selective-bundler.js\";\nimport { type BundleConfig, validateBundleConfig } from \"@/cli/config-schema.js\";\nimport { generateOutput } from \"@/cli/output-generator.js\";\nimport { isSome } from \"@/utils/type.js\";\n\nconst log = anylogger(\"bundle\");\n\nexport interface BundleOptions {\n config?: string;\n output?: string;\n dryRun?: boolean;\n}\n\n/**\n * Load config from file\n */\nasync function loadConfig(configPath: string): Promise<BundleConfig> {\n try {\n const content = await readFile(configPath, \"utf-8\");\n const parsed = JSON.parse(content);\n return validateBundleConfig(parsed);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`Config file not found: ${configPath}`);\n }\n throw error;\n }\n}\n\n/**\n * Format dependency tree for display\n */\nfunction formatDependencyTree(\n tree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>,\n requestedSchemas: string[],\n): string {\n const lines: string[] = [];\n const visited = new Set<string>();\n\n lines.push(\"Dependency tree:\");\n lines.push(\"\");\n\n // Helper to format a node\n const formatNode = (key: string, indent: string = \"\", isLast: boolean = true) => {\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n const node = tree.get(key);\n if (!node) return;\n\n const prefix = indent + (isLast ? \"└── \" : \"├── \");\n const label = `${node.type}:${node.slug}`;\n lines.push(prefix + label);\n\n if (node.dependencies.length > 0) {\n const childIndent = indent + (isLast ? \" \" : \"│ \");\n node.dependencies.forEach((dep, idx) => {\n const isLastChild = idx === node.dependencies.length - 1;\n const childKey = dep;\n\n if (!visited.has(childKey)) {\n formatNode(childKey, childIndent, isLastChild);\n }\n });\n }\n };\n\n // Format requested schemas\n requestedSchemas.forEach((schema, idx) => {\n // Try to find the schema with different type prefixes\n const typeKey = `type:${schema}`;\n const funcKey = `function:${schema}`;\n const key = tree.has(typeKey) ? typeKey : tree.has(funcKey) ? funcKey : schema;\n\n formatNode(key, \"\", idx === requestedSchemas.length - 1);\n });\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format bundle result for dry-run display\n */\nfunction formatDryRunOutput(schemas: string[], resolvedDependencies: string[]): string {\n const lines: string[] = [];\n\n lines.push(\"Bundle preview:\");\n lines.push(\"\");\n lines.push(`Requested schemas: ${schemas.join(\", \")}`);\n lines.push(`Total schemas (with dependencies): ${resolvedDependencies.length}`);\n lines.push(\"\");\n lines.push(\"Schemas to be bundled:\");\n\n for (const schema of resolvedDependencies.sort()) {\n lines.push(` - ${schema}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Find the schemas directory - works for both development/tests and installed package\n */\nfunction findSchemasDir(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // From compiled dist/cli/index.js (bundled) to src/schemas\n const fromDist = join(__dirname, \"../../src/schemas\");\n\n // From source src/cli/commands/bundle.ts to src/schemas (for tests/dev)\n const fromSource = join(__dirname, \"../../schemas\");\n\n // Try to detect which one exists (check dist first for installed package)\n try {\n const fs = require(\"node:fs\");\n if (fs.existsSync(fromDist)) {\n return fromDist;\n }\n if (fs.existsSync(fromSource)) {\n return fromSource;\n }\n } catch {\n // If fs checks fail, default to dist structure\n }\n\n // Default to dist structure (for installed package)\n return fromDist;\n}\n\n/**\n * Core bundle logic (testable)\n */\nexport async function bundleSchemas(\n schemas: string[],\n schemasDir?: string,\n cliArgs?: string[],\n): Promise<{\n output: string;\n metadata: any;\n dependencyTree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>;\n}> {\n // Use provided schemasDir or auto-detect\n const resolvedSchemasDir = schemasDir || findSchemasDir();\n\n log.info(\"Bundling schemas:\", schemas);\n log.debug(\"Schemas directory:\", resolvedSchemasDir);\n\n // Bundle schemas with dependencies\n const result = await bundleSelectiveSchemas({\n schemas,\n schemasDir: resolvedSchemasDir,\n cliArgs,\n });\n\n log.info(\n `Resolved ${result.metadata.resolvedDependencies.length} schemas (including dependencies)`,\n );\n\n // Generate output\n const output = generateOutput({\n schemas: result.schemas,\n includeHelper: true,\n generatedBy: result.metadata.generatedBy,\n });\n\n return {\n output,\n metadata: result.metadata,\n dependencyTree: result.dependencyTree,\n };\n}\n\n/**\n * CLI action handler for bundle command\n */\nexport async function handleBundleCommand(\n schemas: string[],\n options: BundleOptions = {},\n): Promise<void> {\n try {\n // Load config if provided\n let configSchemas: string[] = schemas;\n let outputPath = options.output || \"./tokenscript-schemas.js\";\n\n if (isSome(options.config)) {\n log.info(`Loading config from ${options.config}`);\n const config = await loadConfig(options.config);\n configSchemas = config.schemas;\n if (config.output) {\n outputPath = config.output;\n }\n }\n\n // Validate we have schemas\n if (!configSchemas || configSchemas.length === 0) {\n throw new Error(\"No schemas specified. Provide schemas as arguments or via --config\");\n }\n\n // Expand any presets (preset:name -> list of schemas)\n configSchemas = expandPresetSchemas(configSchemas);\n\n // Build CLI args array for generatedBy metadata\n const cliArgs: string[] = [];\n if (schemas.length > 0) {\n cliArgs.push(...schemas);\n }\n if (options.config) {\n cliArgs.push(\"--config\", options.config);\n }\n if (options.output) {\n cliArgs.push(\"--output\", options.output);\n }\n if (options.dryRun) {\n cliArgs.push(\"--dry-run\");\n }\n\n // Bundle schemas\n const { output, metadata, dependencyTree } = await bundleSchemas(\n configSchemas,\n undefined,\n cliArgs,\n );\n\n // Show dependency tree\n console.log(\"\");\n console.log(formatDependencyTree(dependencyTree, metadata.requestedSchemas));\n console.log(\"\");\n\n // Dry run - just show what would be bundled\n if (options.dryRun) {\n const preview = formatDryRunOutput(metadata.requestedSchemas, metadata.resolvedDependencies);\n console.log(preview);\n return;\n }\n\n // Write output file\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, output, \"utf-8\");\n\n log.info(`Successfully bundled ${metadata.resolvedDependencies.length} schemas`);\n log.info(`Output written to: ${outputPath}`);\n\n // Summary\n console.log(`✓ Bundled ${metadata.resolvedDependencies.length} schemas → ${outputPath}`);\n } catch (error) {\n log.error(\"Bundle failed:\", error);\n throw error;\n }\n}\n","/**\n * List command - Display available schemas\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { readdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport anylogger from \"ulog\";\n\nconst log = anylogger(\"list\");\n\nexport interface ListOptions {\n types?: boolean;\n functions?: boolean;\n}\n\ninterface ListResult {\n types: string[];\n functions: string[];\n}\n\n/**\n * Find the schemas directory - works for both development/tests and installed package\n */\nfunction findSchemasDir(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // From compiled dist/cli/index.js (bundled) to src/schemas\n const fromDist = join(__dirname, \"../../src/schemas\");\n\n // From source src/cli/commands/list.ts to src/schemas (for tests/dev)\n const fromSource = join(__dirname, \"../../schemas\");\n\n // Try to detect which one exists\n try {\n const fs = require(\"node:fs\");\n if (fs.existsSync(fromDist)) {\n return fromDist;\n }\n if (fs.existsSync(fromSource)) {\n return fromSource;\n }\n } catch {\n // If fs checks fail, default to dist structure\n }\n\n // Default to dist structure (for installed package)\n return fromDist;\n}\n\n/**\n * List all available schemas\n */\nexport async function listSchemas(\n schemasDir?: string,\n options: ListOptions = {},\n): Promise<ListResult> {\n const resolvedSchemasDir = schemasDir || findSchemasDir();\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n const types: string[] = [];\n const functions: string[] = [];\n\n // List type schemas\n if (showTypes) {\n try {\n const typesDir = join(resolvedSchemasDir, \"types\");\n const typeEntries = await readdir(typesDir, { withFileTypes: true });\n types.push(\n ...typeEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read types directory:\", error);\n }\n }\n\n // List function schemas\n if (showFunctions) {\n try {\n const functionsDir = join(resolvedSchemasDir, \"functions\");\n const funcEntries = await readdir(functionsDir, { withFileTypes: true });\n functions.push(\n ...funcEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read functions directory:\", error);\n }\n }\n\n return { types, functions };\n}\n\n/**\n * Format list output for display\n */\nexport function formatListOutput(result: ListResult, options: ListOptions = {}): string {\n const lines: string[] = [];\n\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n if (showTypes && result.types.length > 0) {\n lines.push(\"Types:\");\n for (const type of result.types) {\n lines.push(` ${type}`);\n }\n }\n\n if (showFunctions && result.functions.length > 0) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(\"Functions:\");\n for (const func of result.functions) {\n lines.push(` function:${func}`);\n }\n }\n\n if (lines.length === 0) {\n lines.push(\"No schemas found.\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * CLI action handler for list command\n */\nexport async function handleListCommand(options: ListOptions = {}): Promise<void> {\n const result = await listSchemas(undefined, options);\n const output = formatListOutput(result, options);\n console.log(output);\n}\n","/**\n * Presets command - list available bundle presets\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport anylogger from \"ulog\";\nimport { BUNDLE_PRESETS } from \"@/bundler/presets/index\";\n\nconst log = anylogger(\"presets\");\n\n/**\n * Format preset information for display\n */\nfunction formatPresetInfo(): string {\n const lines: string[] = [];\n\n lines.push(\"=\".repeat(60));\n lines.push(\"Available Bundle Presets\");\n lines.push(\"=\".repeat(60));\n\n for (const [key, preset] of Object.entries(BUNDLE_PRESETS)) {\n lines.push(\"\");\n lines.push(`preset:${key}`);\n lines.push(` ${preset.description}`);\n\n // Types section\n const typesCount =\n preset.types.length === 1 && preset.types[0] === \"*\" ? \"all\" : preset.types.length;\n lines.push(\"\");\n lines.push(` Types (${typesCount}):`);\n if (preset.types.length > 0 && preset.types[0] !== \"*\") {\n for (const type of preset.types) {\n lines.push(` - ${type}`);\n }\n } else {\n lines.push(` - all`);\n }\n\n // Functions section\n const functionsCount =\n preset.functions.length === 1 && preset.functions[0] === \"*\"\n ? \"all\"\n : preset.functions.length;\n lines.push(\"\");\n lines.push(` Functions (${functionsCount}):`);\n if (preset.functions.length > 0 && preset.functions[0] !== \"*\") {\n for (const func of preset.functions) {\n lines.push(` - ${func}`);\n }\n } else {\n lines.push(` - all`);\n }\n }\n\n lines.push(\"\");\n lines.push(\"=\".repeat(60));\n lines.push(\"Usage Examples:\");\n lines.push(\"=\".repeat(60));\n lines.push(\"npx tokenscript-schemas bundle preset:css\");\n lines.push(\"npx tokenscript-schemas bundle preset:css type:oklab-color\");\n lines.push(\"npx tokenscript-schemas bundle type:hex-color function:lighten\");\n lines.push(\"\");\n lines.push(\"Note: You can combine multiple presets and specific schemas!\");\n\n return lines.join(\"\\n\");\n}\n\nexport async function handlePresetsCommand(): Promise<void> {\n try {\n log.info(\"Listing available presets\");\n\n const output = formatPresetInfo();\n console.log(output);\n\n log.info(`Listed ${Object.keys(BUNDLE_PRESETS).length} presets`);\n } catch (error) {\n log.error(\"Failed to list presets:\", error);\n throw error;\n }\n}\n","#!/usr/bin/env node\n\n/**\n * CLI entry point for @tokens-studio/tokenscript-schemas\n */\n\n/// <reference types=\"../../types/ulog\" />\n\nimport cac from \"cac\";\nimport anylogger from \"ulog\";\nimport { type BundleOptions, handleBundleCommand } from \"./commands/bundle.js\";\nimport { handleListCommand, type ListOptions } from \"./commands/list.js\";\nimport { handlePresetsCommand } from \"./commands/presets.js\";\n\nconst log = anylogger(\"cli\");\n\nconst cli = cac(\"tokenscript-schemas\");\n\n// Bundle command\ncli\n .command(\"bundle [...schemas]\", \"Bundle schemas into a JS file\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-o, --output <path>\", \"Output file path\", { default: \"./tokenscript-schemas.js\" })\n .option(\"-d, --dry-run\", \"Preview what would be bundled without writing\")\n .action(async (schemas: string[], options: BundleOptions) => {\n try {\n await handleBundleCommand(schemas, options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// List command\ncli\n .command(\"list\", \"List available schemas\")\n .option(\"--types\", \"List only type schemas\")\n .option(\"--functions\", \"List only function schemas\")\n .action(async (options: ListOptions) => {\n try {\n await handleListCommand(options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Presets command\ncli.command(\"presets\", \"List available bundle presets\").action(async () => {\n try {\n await handlePresetsCommand();\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n});\n\ncli.help();\ncli.version(\"0.0.14\");\n\ncli.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/bundler/presets/css.ts","../../src/bundler/presets/index.ts","../../src/bundler/bundle-schema.ts","../../tests/helpers/logger.ts","../../src/utils/type.ts","../../src/utils/schema-uri.ts","../../src/bundler/schema-dependency-resolver.ts","../../src/bundler/selective-bundler.ts","../../src/cli/config-schema.ts","../../src/cli/version-info.ts","../../src/cli/output-generator.ts","../../src/cli/commands/bundle.ts","../../src/cli/commands/list.ts","../../src/cli/commands/presets.ts","../../src/cli/index.ts"],"names":["join","__filename","__dirname","log","anylogger","readFile","fileURLToPath","dirname","findSchemasDir"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * CSS preset - Modern CSS color types and functions\n */\n\nimport type { BundlePreset } from \"./types\";\n\nexport const css: BundlePreset = {\n name: \"CSS\",\n description: \"CSS color types\",\n types: [\n \"hex-color\",\n \"rgb-color\",\n \"hsl-color\",\n \"oklch-color\",\n \"oklab-color\",\n\n // Converting colors to css strings\n \"css-color\",\n ],\n functions: [\"lighten\", \"darken\", \"saturate\", \"desaturate\", \"mix\", \"invert\"],\n};\n","/**\n * Bundle presets - predefined sets of schemas for common use cases\n */\n\nimport { css } from \"./css\";\nimport type { BundlePreset } from \"./types\";\n\nexport type { BundlePreset };\n\n/**\n * Available bundle presets\n */\nexport const BUNDLE_PRESETS: Record<string, BundlePreset> = {\n css,\n};\n\n/**\n * Expand schemas, replacing \"preset:name\" with actual schema list\n */\nexport function expandPresetSchemas(schemas: string[]): string[] {\n const expanded: string[] = [];\n\n for (const schema of schemas) {\n if (schema.startsWith(\"preset:\")) {\n const presetName = schema.slice(7); // Remove \"preset:\"\n const preset = BUNDLE_PRESETS[presetName];\n\n if (preset) {\n // Add all types from preset\n for (const type of preset.types) {\n expanded.push(type === \"*\" ? \"*\" : `type:${type}`);\n }\n // Add all functions from preset\n for (const func of preset.functions) {\n expanded.push(func === \"*\" ? \"*\" : `function:${func}`);\n }\n } else {\n console.warn(`⚠ Unknown preset: ${presetName}`);\n }\n } else {\n // Not a preset, keep as-is\n expanded.push(schema);\n }\n }\n\n return expanded;\n}\n","/**\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 * Centralized logging for tests using ulog\n * Logs are disabled by default and only shown on errors or when explicitly enabled\n */\n\n/// <reference path=\"../../types/ulog.d.ts\" />\nimport ulog from \"ulog\";\n\n// ulog levels: { error: 1, warn: 2, info: 3, log: 4, debug: 5, trace: 6 }\n// Using hardcoded values to avoid runtime initialization issues\nconst LOG_LEVELS = {\n error: 1,\n warn: 2,\n info: 3,\n log: 4,\n debug: 5,\n} as const;\n\n// Define Logger type locally to avoid TypeScript declaration errors\ninterface Logger {\n (...args: any[]): void;\n error(...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n log(...args: any[]): void;\n debug(...args: any[]): void;\n trace(...args: any[]): void;\n level: number;\n}\n\n/**\n * Default logger for all test operations\n * Use: log.debug(), log.info(), log.warn(), log.error()\n */\nexport const log: Logger = ulog(\"schema-registry\");\n\n// Set default log level from environment or disable by default (error = 1)\nconst logLevel = (process.env.LOG_LEVEL || \"error\") as keyof typeof LOG_LEVELS;\nlog.level = LOG_LEVELS[logLevel] || LOG_LEVELS.error;\n\n/**\n * Enable verbose logging for debugging\n * Useful for troubleshooting test failures\n */\nexport function enableVerboseLogging() {\n log.level = LOG_LEVELS.debug;\n}\n\n/**\n * Disable all logging (except errors)\n */\nexport function disableLogging() {\n log.level = LOG_LEVELS.error;\n}\n\n/**\n * Set custom log level\n * @param level - \"debug\" | \"log\" | \"info\" | \"warn\" | \"error\"\n */\nexport function setLogLevel(level: keyof typeof LOG_LEVELS) {\n log.level = LOG_LEVELS[level];\n}\n","// Optional --------------------------------------------------------------------\n\nexport const isSome = <T>(v: T | null | undefined): v is T => {\n return v != null;\n};\n\nexport const isNone = (v: unknown): v is null | undefined => {\n return v == null;\n};\n\n// Primitive type guards -------------------------------------------------------\n\nexport const isNull = (v: unknown): v is null => {\n return v === null;\n};\n\nexport const isUndefined = (v: unknown): v is undefined => {\n return v === undefined;\n};\n\nexport const isObject = (v: unknown): v is Record<string, unknown> => {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n};\n\nexport const isString = (v: unknown): v is string => {\n return typeof v === \"string\";\n};\n\nexport const isNumber = (v: unknown): v is number => {\n return typeof v === \"number\" && !Number.isNaN(v);\n};\n\nexport const isBoolean = (v: unknown): v is boolean => {\n return typeof v === \"boolean\";\n};\n\nexport const isArray = <T = unknown>(v: unknown): v is T[] => {\n return Array.isArray(v);\n};\n\nexport const isFunction = (v: unknown): v is (...args: unknown[]) => unknown => {\n return typeof v === \"function\";\n};\n\nexport const isDate = (v: unknown): v is Date => {\n return v instanceof Date && !Number.isNaN(v.getTime());\n};\n\n// Object ----------------------------------------------------------------------\n\nexport const isMap = (v: unknown): v is Map<unknown, unknown> => v instanceof Map;\n\nexport const isPlainObject = (v: unknown): v is Record<string, unknown> => {\n if (!isObject(v)) return false;\n\n // Objects created by the Object constructor or with null prototype\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n};\n\nexport const hasProperty = <K extends string>(obj: unknown, key: K): obj is Record<K, unknown> => {\n return isObject(obj) && key in obj;\n};\n\nexport const getKeyAlt = <K extends string, T>(\n keys: readonly K[],\n record: Partial<Record<K, T>>,\n): T | undefined => {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n return undefined;\n};\n\nexport const isObjectWithKey = <K extends string>(\n value: unknown,\n key: K,\n): value is Record<K, unknown> => {\n return isObject(value) && key in value;\n};\n\nexport const isNonEmptyObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length > 0;\n};\n\nexport const isSingleEntryObject = (v: unknown): boolean => {\n return isObject(v) && Object.keys(v).length === 1;\n};\n\n// Array -----------------------------------------------------------------------\n\nexport const isNonEmptyArray = <T>(v: unknown): v is [T, ...T[]] => {\n return isArray(v) && v.length > 0;\n};\n\nexport const ensureArray = <T>(v: T | T[] | null | undefined): T[] => {\n if (isNone(v)) return [];\n if (isArray<T>(v)) return v;\n return [v];\n};\n\nexport const isOutOfBounds = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index >= value.length;\n};\n\nexport const isOutOfBoundsInclusive = <T>(value: unknown, index: number): boolean => {\n if (!isArray<T>(value)) return true;\n return index < 0 || index > value.length;\n};\n\nexport const isEmpty = (v: unknown): boolean => {\n if (isNone(v)) return true;\n if (isString(v) || isArray(v)) return v.length === 0;\n if (isObject(v)) return Object.keys(v).length === 0;\n return false;\n};\n\n// Number parsing --------------------------------------------------------------\n\nexport const safeParseInt = (v: unknown): number | null => {\n if (isNumber(v)) return Math.floor(v);\n if (isString(v)) {\n const parsed = parseInt(v, 10);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\nexport const safeParseFloat = (v: unknown): number | null => {\n if (isNumber(v)) return v;\n if (isString(v)) {\n const parsed = parseFloat(v);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n};\n\n// Type Assertion Helpers ------------------------------------------------------\n\nexport const assertIsSome = <T>(v: T | null | undefined, message?: string): T => {\n if (isNone(v)) {\n throw new Error(message || \"Expected value to be defined\");\n }\n return v;\n};\n\nexport const assertIsType = <T>(v: unknown, guard: (v: unknown) => v is T, message?: string): T => {\n if (!guard(v)) {\n throw new Error(message || \"Type assertion failed\");\n }\n return v;\n};\n\nexport const optional = <T, R>(value: T | null | undefined, fn: (v: T) => R): R | undefined => {\n return isSome(value) ? fn(value) : undefined;\n};\n\nexport const when = <A, B>(a: A, b: B): B | undefined => {\n return a !== undefined && a !== null && a !== false ? b : undefined;\n};\n\nexport const withDefault = <T>(v: T | null | undefined, defaultValue: T): T => {\n return isSome(v) ? v : defaultValue;\n};\n\nexport const isEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (isNone(a) || isNone(b)) return a === b;\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => isEqual(item, b[index]));\n }\n\n if (isObject(a) && isObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) => keysB.includes(key) && isEqual(a[key], b[key]));\n }\n\n return false;\n};\n\n// Conversion ------------------------------------------------------------------\n\nexport const nullToUndefined = <T>(v: T | null | undefined): T | undefined =>\n isNull(v) ? undefined : v;\n","/**\n * Utilities for working with TokenScript schema URIs\n *\n * Handles URI construction, parsing, and manipulation for the TokenScript schema registry.\n */\n\nimport { isObject } from \"./type\";\n\nexport type SemanticVersion =\n | { major: number }\n | { major: number; minor: number }\n | { major: number; minor: number; patch: number };\n\ntype SchemaVersion = \"latest\" | SemanticVersion | null;\n\nexport interface SchemaUriComponents {\n baseUrl: string;\n category: \"schema\" | \"core\" | \"function\";\n name: string;\n version: SchemaVersion;\n}\n\nexport const DEFAULT_REGISTRY_URL = \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\nexport const DEFAULT_API_PATH = \"/api/v1\";\n\nfunction safeParseInt(value: string): number | null {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? null : parsed;\n}\n\nexport function parseSemverFromString(versionString: string): SemanticVersion | null {\n const parts = versionString.split(\".\");\n const numbers: number[] = [];\n\n for (const part of parts) {\n const num = safeParseInt(part);\n if (num === null) return null;\n numbers.push(num);\n }\n\n if (numbers.length !== parts.length) return null;\n\n if (numbers.length === 3) {\n return { major: numbers[0], minor: numbers[1], patch: numbers[2] };\n }\n\n if (numbers.length === 2) {\n return { major: numbers[0], minor: numbers[1] };\n }\n\n if (numbers.length === 1) {\n return { major: numbers[0] };\n }\n\n return null;\n}\n\nexport function parseVersionString(versionString: string): SchemaVersion {\n return versionString === \"latest\" ? \"latest\" : parseSemverFromString(versionString);\n}\n\nexport function semverToString(version: SchemaVersion | undefined): string {\n if (version === undefined) {\n return \"latest\";\n }\n if (isObject(version)) {\n if (\"patch\" in version) return `${version.major}.${version.minor}.${version.patch}`;\n if (\"minor\" in version) return `${version.major}.${version.minor}`;\n return `${version.major}`;\n }\n return \"latest\";\n}\n\nexport function buildSchemaUri(\n params: Partial<SchemaUriComponents> & { category: string; name: string },\n): string {\n const { baseUrl, category, name, version } = params;\n\n const versionString = semverToString(version);\n\n const effectiveBaseUrl = baseUrl === undefined ? DEFAULT_REGISTRY_URL : baseUrl;\n\n if (effectiveBaseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n }\n\n return `${effectiveBaseUrl}${DEFAULT_API_PATH}/${category}/${name}/${versionString}/`;\n}\n\n/**\n * Parse a schema URI into its components\n *\n * @example\n * parseSchemaUri(\"https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"...\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n *\n * parseSchemaUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => { baseUrl: \"\", category: \"schema\", name: \"rgb-color\", version: \"0.0.1\" }\n */\nexport function parseSchemaUri(uri: string): SchemaUriComponents | null {\n let baseUrl = \"\";\n let pathname = uri;\n\n // Try parsing as full URL first\n try {\n const url = new URL(uri);\n baseUrl = `${url.protocol}//${url.host}`;\n pathname = url.pathname;\n } catch {\n // If URL parsing fails, treat as relative path\n // Check if it starts with a protocol (incomplete URL)\n if (uri.includes(\"://\")) {\n return null;\n }\n // It's a relative path, use as-is\n pathname = uri;\n }\n\n // Parse pathname: /api/v1/schema/rgb-color/0.0.1/\n const pathParts = pathname.split(\"/\").filter((part) => part !== \"\");\n\n // Expected format: [api, v1, category, name, version]\n if (pathParts.length < 5) {\n return null;\n }\n\n // Check if it starts with api/vN\n if (pathParts[0] !== \"api\" || !pathParts[1].startsWith(\"v\")) {\n return null;\n }\n\n const category = pathParts[2];\n if (category !== \"schema\" && category !== \"core\" && category !== \"function\") {\n return null;\n }\n\n const name = pathParts[3];\n const version = parseVersionString(pathParts[4]);\n\n return {\n baseUrl,\n category: category as \"schema\" | \"core\" | \"function\",\n name,\n version,\n };\n}\n\n/**\n * Extract the base URI without version\n *\n * @example\n * getBaseUri(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"https://.../api/v1/schema/rgb-color/\"\n *\n * getBaseUri(\"/api/v1/schema/rgb-color/0.0.1/\")\n * // => \"/api/v1/schema/rgb-color/\"\n */\nexport function getBaseUri(uri: string): string {\n const components = parseSchemaUri(uri);\n\n if (!components) {\n return uri;\n }\n\n const { baseUrl, category, name } = components;\n\n if (baseUrl === \"\") {\n return `${DEFAULT_API_PATH}/${category}/${name}/`;\n }\n\n return `${baseUrl}${DEFAULT_API_PATH}/${category}/${name}/`;\n}\n\n/**\n * Extract schema name from URI\n *\n * @example\n * extractSchemaName(\"https://.../api/v1/schema/rgb-color/0.0.1/\")\n * // => \"rgb-color\"\n */\nexport function extractSchemaName(uri: string): string | null {\n const components = parseSchemaUri(uri);\n return components?.name || null;\n}\n\n/**\n * Normalize URI to ensure it ends with trailing slash\n */\nexport function normalizeUri(uri: string): string {\n return uri.endsWith(\"/\") ? uri : `${uri}/`;\n}\n","/**\n * Utilities for resolving schema dependencies automatically\n */\n\nimport { join } from \"node:path\";\nimport { log } from \"@tests/helpers/logger.js\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\nimport { extractSchemaName, parseSchemaUri } from \"@/utils/schema-uri\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\n\nexport interface SchemaReference {\n slug: string;\n type: \"type\" | \"function\";\n uri: string;\n}\n\nexport interface ExtractRequirementsOptions {\n /**\n * Whether to include type dependencies from color conversions\n * Useful for testing to ensure all conversion types are loaded\n * @default false\n */\n includeColorTypeDependencies?: boolean;\n}\n\n/**\n * Extract all required schema URIs from a schema specification\n * Only extracts explicit requirements - not conversions (which are capabilities, not dependencies)\n * However, for testing purposes, can optionally include color type dependencies from conversions\n */\nfunction extractRequirements(\n spec: SchemaSpecification,\n options: ExtractRequirementsOptions = {},\n): string[] {\n const requirements: string[] = [];\n\n if (spec.type === \"function\") {\n // Functions can have explicit requirements\n const funcSpec = spec as FunctionSpecification;\n if (funcSpec.requirements) {\n requirements.push(...funcSpec.requirements);\n }\n } else if (spec.type === \"color\" && options.includeColorTypeDependencies) {\n // Color types have requirements through conversions (when flag is enabled)\n // This is useful for testing to ensure all conversion types are loaded\n const colorSpec = spec as ColorSpecification;\n for (const conversion of colorSpec.conversions || []) {\n // Add source if it's not $self\n if (conversion.source !== \"$self\") {\n requirements.push(conversion.source);\n }\n // Add target if it's not $self\n if (conversion.target !== \"$self\") {\n requirements.push(conversion.target);\n }\n }\n }\n // Note: By default, color types don't have dependencies via conversions\n // Conversions are capabilities, not requirements\n\n return requirements;\n}\n\n/**\n * Resolve a URI to a schema slug and type\n * Works with both full URIs and just schema names\n *\n * @example\n * resolveSchemaReference(\"/api/v1/core/rgb-color/0/\") => { slug: \"rgb-color\", type: \"type\" }\n * resolveSchemaReference(\"rgb-color\") => { slug: \"rgb-color\", type: \"type\" }\n */\nexport function resolveSchemaReference(uriOrName: string): SchemaReference | null {\n // Try parsing as URI first\n const components = parseSchemaUri(uriOrName);\n\n if (components) {\n // Successfully parsed as URI\n const type = components.category === \"function\" ? \"function\" : \"type\";\n return {\n slug: components.name,\n type,\n uri: uriOrName,\n };\n }\n\n // Try extracting name (handles partial URIs)\n const extractedName = extractSchemaName(uriOrName);\n if (extractedName) {\n return {\n slug: extractedName,\n type: \"type\", // Default to type if we can't determine\n uri: uriOrName,\n };\n }\n\n // Treat as plain slug\n if (uriOrName && !uriOrName.includes(\"/\")) {\n return {\n slug: uriOrName,\n type: \"type\", // Default to type\n uri: \"\", // No URI, just a slug\n };\n }\n\n return null;\n}\n\nexport interface ResolvedDependencies {\n types: string[];\n functions: string[];\n}\n\nexport interface DependencyNode {\n slug: string;\n type: \"type\" | \"function\";\n dependencies: string[];\n}\n\nexport interface CollectRequiredSchemasOptions extends ExtractRequirementsOptions {\n baseUrl?: string;\n schemasDir?: string;\n}\n\n/**\n * Recursively collect all required schemas for a given schema\n * Returns a flat list of all dependencies (including transitive ones)\n *\n * @param slugOrUri - Schema slug (e.g., \"rgb-color\") or full URI\n * @param type - Schema type (\"type\" or \"function\"), optional if URI is provided\n * @param options - Options for dependency collection\n * @returns Object with separated type and function dependencies\n *\n * @example\n * // Using slug\n * await collectRequiredSchemas(\"invert\", \"function\")\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [] }\n *\n * // Using URI\n * await collectRequiredSchemas(\"/api/v1/core/rgb-color/0/\")\n * // => { types: [\"hex-color\"], functions: [] }\n */\nexport async function collectRequiredSchemas(\n slugOrUri: string,\n type?: \"type\" | \"function\",\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const visited = new Set<string>();\n const typeSchemas = new Set<string>();\n const functionSchemas = new Set<string>();\n\n async function traverse(currentSlugOrUri: string, currentType?: \"type\" | \"function\") {\n // Resolve to a proper schema reference\n const ref = resolveSchemaReference(currentSlugOrUri);\n if (!ref) {\n log.warn(`Could not resolve schema reference: ${currentSlugOrUri}`);\n return;\n }\n\n // Use provided type if available, otherwise use resolved type\n const effectiveType = currentType || ref.type;\n const slug = ref.slug;\n\n // Create a unique key for visited tracking\n const key = `${effectiveType}:${slug}`;\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n // Try to load the schema\n let spec: SchemaSpecification;\n try {\n // Dynamically determine schema directory\n const categoryDir = effectiveType === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, slug);\n\n spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n } catch (error) {\n log.warn(`Failed to load schema ${slug} (${effectiveType}):`, error);\n return;\n }\n\n // Extract requirements from this schema\n const requirements = extractRequirements(spec, extractOptions);\n\n // Recursively traverse requirements\n for (const reqUri of requirements) {\n const reqRef = resolveSchemaReference(reqUri);\n if (reqRef) {\n // Add to appropriate set\n if (reqRef.type === \"function\") {\n functionSchemas.add(reqRef.slug);\n } else {\n typeSchemas.add(reqRef.slug);\n }\n\n // Recursively collect dependencies\n await traverse(reqUri, reqRef.type);\n }\n }\n }\n\n // Start traversal\n await traverse(slugOrUri, type);\n\n return {\n types: Array.from(typeSchemas),\n functions: Array.from(functionSchemas),\n };\n}\n\n/**\n * Collect all schemas needed for a list of schemas (including their dependencies)\n *\n * @example\n * await collectRequiredSchemasForList([\n * { slug: \"invert\", type: \"function\" },\n * { slug: \"rgb-color\", type: \"type\" }\n * ])\n * // => { types: [\"rgb-color\", \"hex-color\"], functions: [\"invert\"] }\n */\nexport async function collectRequiredSchemasForList(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<ResolvedDependencies> {\n const allTypes = new Set<string>();\n const allFunctions = new Set<string>();\n\n for (const schema of schemas) {\n const deps = await collectRequiredSchemas(schema.slug, schema.type, options);\n\n // Add the schema itself\n if (schema.type === \"function\") {\n allFunctions.add(schema.slug);\n } else {\n allTypes.add(schema.slug);\n }\n\n // Add dependencies\n for (const t of deps.types) {\n allTypes.add(t);\n }\n for (const f of deps.functions) {\n allFunctions.add(f);\n }\n }\n\n return {\n types: Array.from(allTypes),\n functions: Array.from(allFunctions),\n };\n}\n\n/**\n * Collect dependency tree for schemas (non-recursive, shows direct dependencies only)\n */\nexport async function collectDependencyTree(\n schemas: Array<{ slug: string; type: \"type\" | \"function\" }>,\n options: CollectRequiredSchemasOptions = {},\n): Promise<Map<string, DependencyNode>> {\n const { baseUrl, schemasDir, ...extractOptions } = options;\n const tree = new Map<string, DependencyNode>();\n\n for (const schema of schemas) {\n const categoryDir = schema.type === \"type\" ? \"types\" : \"functions\";\n const resolvedSchemasDir =\n schemasDir || process.env.SCHEMAS_DIR || join(process.cwd(), \"src/schemas\");\n const schemaDir = join(resolvedSchemasDir, categoryDir, schema.slug);\n\n try {\n const spec = await bundleSchemaFromDirectory(schemaDir, baseUrl ? { baseUrl } : undefined);\n const requirements = extractRequirements(spec, extractOptions);\n\n // Extract just the slugs from URIs\n const dependencySlugs = requirements.map((uri) => {\n const ref = resolveSchemaReference(uri);\n return ref ? `${ref.type}:${ref.slug}` : uri;\n });\n\n const key = `${schema.type}:${schema.slug}`;\n tree.set(key, {\n slug: schema.slug,\n type: schema.type,\n dependencies: dependencySlugs,\n });\n } catch (error) {\n log.warn(`Failed to load schema ${schema.slug} (${schema.type}):`, error);\n }\n }\n\n return tree;\n}\n","/**\n * Selective schema bundler for CLI\n * Bundles specific schemas with automatic dependency resolution\n */\n\nimport { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { bundleSchemaFromDirectory } from \"./bundle-schema.js\";\nimport {\n collectDependencyTree,\n collectRequiredSchemasForList,\n type DependencyNode,\n} from \"./schema-dependency-resolver.js\";\nimport type { ColorSpecification, FunctionSpecification } from \"./types.js\";\n\nexport interface SelectiveBundleOptions {\n schemas: string[]; // Schema slugs to bundle\n schemasDir?: string; // Source directory (default: src/schemas)\n baseUrl?: string; // Registry URL for URIs\n cliArgs?: string[]; // CLI arguments used\n}\n\nexport interface BundledSchemaEntry {\n uri: string;\n schema: ColorSpecification | FunctionSpecification;\n}\n\nexport interface SelectiveBundleResult {\n schemas: BundledSchemaEntry[];\n metadata: {\n requestedSchemas: string[];\n resolvedDependencies: string[];\n generatedAt: string;\n generatedBy?: string;\n };\n dependencyTree: Map<string, DependencyNode>;\n}\n\n/**\n * Detect whether a schema is a type or function by checking which directory exists\n */\nasync function detectSchemaType(\n slug: string,\n schemasDir: string,\n): Promise<\"type\" | \"function\" | null> {\n const typeDir = join(schemasDir, \"types\", slug);\n const functionDir = join(schemasDir, \"functions\", slug);\n\n try {\n await access(typeDir);\n return \"type\";\n } catch {\n // Not a type, try function\n }\n\n try {\n await access(functionDir);\n return \"function\";\n } catch {\n // Not found in either\n }\n\n return null;\n}\n\n/**\n * Bundle specific schemas with automatic dependency resolution\n */\nexport async function bundleSelectiveSchemas(\n options: SelectiveBundleOptions,\n): Promise<SelectiveBundleResult> {\n const schemasDir = options.schemasDir || join(process.cwd(), \"src/schemas\");\n const baseUrl = options.baseUrl || \"https://schema.tokenscript.dev.gcp.tokens.studio\";\n\n // Parse schema slugs - they might have type prefixes like \"function:invert\"\n const parsedSchemas = await Promise.all(\n options.schemas.map(async (slug) => {\n if (slug.includes(\":\")) {\n const [type, name] = slug.split(\":\");\n return {\n slug: name,\n type: (type === \"function\" ? \"function\" : \"type\") as \"type\" | \"function\",\n };\n }\n\n // Auto-detect type by checking which directory exists\n const detectedType = await detectSchemaType(slug, schemasDir);\n if (detectedType === null) {\n throw new Error(\n `Schema '${slug}' not found in types or functions directories. ` +\n `Use 'function:${slug}' or 'type:${slug}' prefix to be explicit.`,\n );\n }\n\n return { slug, type: detectedType };\n }),\n );\n\n // Collect all required schemas (including dependencies)\n // For CLI bundling, we include color type dependencies so conversions work\n const deps = await collectRequiredSchemasForList(parsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Collect dependency tree for all schemas (including resolved dependencies)\n const allParsedSchemas = [\n ...deps.types.map((slug) => ({ slug, type: \"type\" as const })),\n ...deps.functions.map((slug) => ({ slug, type: \"function\" as const })),\n ];\n const dependencyTree = await collectDependencyTree(allParsedSchemas, {\n baseUrl,\n schemasDir,\n includeColorTypeDependencies: true,\n });\n\n // Track all schema slugs for metadata\n const allSchemas = [...new Set([...deps.types, ...deps.functions])];\n\n // Bundle all schemas\n const bundledSchemas: BundledSchemaEntry[] = [];\n\n // Bundle type schemas\n for (const typeSlug of deps.types) {\n const schemaDir = join(schemasDir, \"types\", typeSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"color\") {\n const uri = `${baseUrl}/api/v1/core/${typeSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as ColorSpecification,\n });\n }\n }\n\n // Bundle function schemas\n for (const funcSlug of deps.functions) {\n const schemaDir = join(schemasDir, \"functions\", funcSlug);\n const bundled = await bundleSchemaFromDirectory(schemaDir, { baseUrl });\n\n if (bundled.type === \"function\") {\n const uri = `${baseUrl}/api/v1/function/${funcSlug}/0/`;\n bundledSchemas.push({\n uri,\n schema: bundled as FunctionSpecification,\n });\n }\n }\n\n // Build generatedBy string if CLI args are provided\n const baseCommand = \"npx @tokens-studio/tokenscript-schemas bundle\";\n const generatedBy = options.cliArgs?.length\n ? `${baseCommand} ${options.cliArgs.join(\" \")}`\n : undefined;\n\n return {\n schemas: bundledSchemas,\n metadata: {\n requestedSchemas: options.schemas,\n resolvedDependencies: allSchemas,\n generatedAt: new Date().toISOString(),\n generatedBy,\n },\n dependencyTree,\n };\n}\n","/**\n * Config file schema validation\n */\n\nexport interface BundleConfig {\n schemas: string[];\n output?: string;\n}\n\n/**\n * Validate bundle config\n */\nexport function validateBundleConfig(data: unknown): BundleConfig {\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"Config must be an object\");\n }\n\n const config = data as Record<string, unknown>;\n\n if (!Array.isArray(config.schemas)) {\n throw new Error(\"Config must have a 'schemas' array\");\n }\n\n if (!config.schemas.every((s) => typeof s === \"string\")) {\n throw new Error(\"All schemas must be strings\");\n }\n\n if (config.output !== undefined && typeof config.output !== \"string\") {\n throw new Error(\"Config 'output' must be a string if provided\");\n }\n\n return {\n schemas: config.schemas,\n output: config.output as string | undefined,\n };\n}\n","/**\n * Get version information for the bundled output\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Build-time constant injected by tsup\ndeclare const __IS_BUILT_PACKAGE__: boolean;\n\n// Check if we're running from built package (will be true in dist, undefined when running via tsx)\nconst IS_BUILT = typeof __IS_BUILT_PACKAGE__ !== \"undefined\" && __IS_BUILT_PACKAGE__;\n\nexport interface VersionInfo {\n version: string; // Package version or git SHA\n githubUrl: string;\n isLocal: boolean; // true if running from local repo (not published package)\n}\n\n/**\n * Get the current git SHA\n */\nfunction getGitSha(): string | null {\n try {\n return execSync(\"git rev-parse --short HEAD\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Get version from package.json\n */\nfunction getPackageVersion(): string {\n try {\n // Try multiple paths for package.json\n const paths = [\n join(__dirname, \"../../package.json\"), // From src/cli\n join(__dirname, \"../../../package.json\"), // From dist/cli\n ];\n\n for (const path of paths) {\n try {\n const pkg = JSON.parse(readFileSync(path, \"utf-8\"));\n return pkg.version || \"unknown\";\n } catch {\n // Try next path\n }\n }\n\n return \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\n/**\n * Get version information for the bundle\n */\nexport function getVersionInfo(): VersionInfo {\n const githubUrl = \"https://github.com/tokens-studio/tokenscript-schemas\";\n const packageVersion = getPackageVersion();\n\n let version: string;\n let isLocal: boolean;\n\n if (IS_BUILT) {\n // Running from built package - use package version\n version = `@tokens-studio/tokenscript-schemas@v${packageVersion}`;\n isLocal = false;\n } else {\n // Running locally (via tsx) - use git SHA\n const sha = getGitSha();\n version = sha ? `local-${sha}` : \"local\";\n isLocal = true;\n }\n\n return {\n version,\n githubUrl,\n isLocal,\n };\n}\n","/**\n * Generate JavaScript output for bundled schemas\n */\n\nimport type { BundledSchemaEntry } from \"@/bundler/selective-bundler.js\";\nimport { getVersionInfo } from \"./version-info.js\";\n\nexport interface OutputGeneratorOptions {\n schemas: BundledSchemaEntry[];\n includeHelper?: boolean; // Include makeConfig() helper\n generatedBy?: string; // CLI command used to generate\n}\n\n/**\n * Generate JavaScript code for bundled schemas\n */\nexport function generateOutput(options: OutputGeneratorOptions): string {\n const { schemas, includeHelper = true } = options;\n\n const timestamp = new Date().toISOString();\n const versionInfo = getVersionInfo();\n\n const lines: string[] = [];\n\n // Header comment\n lines.push(\"// Auto-generated by @tokens-studio/tokenscript-schemas\");\n lines.push(`// Version: ${versionInfo.version}`);\n lines.push(`// GitHub: ${versionInfo.githubUrl}`);\n if (options.generatedBy) {\n lines.push(`// Command: ${options.generatedBy}`);\n }\n lines.push(`// Generated: ${timestamp}`);\n lines.push(\"\");\n\n // Import statement\n lines.push('import { Config } from \"@tokens-studio/tokenscript-interpreter\";');\n lines.push(\"\");\n\n // SCHEMAS export\n lines.push(\"export const SCHEMAS = [\");\n for (const entry of schemas) {\n // Format each schema entry - we need to serialize both uri and schema\n const schemaJson = JSON.stringify(entry.schema, null, 2);\n const uriJson = JSON.stringify(entry.uri);\n\n // Indent the schema JSON\n const indentedSchema = schemaJson\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n\n lines.push(` {`);\n lines.push(` uri: ${uriJson},`);\n lines.push(` schema: ${indentedSchema.trim()}`);\n lines.push(` },`);\n }\n lines.push(\"];\");\n lines.push(\"\");\n\n // Helper function\n if (includeHelper) {\n lines.push(\"export function makeConfig() {\");\n lines.push(\" return new Config().registerSchemas(SCHEMAS);\");\n lines.push(\"}\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Bundle command - Bundle schemas into a JS file\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport anylogger from \"ulog\";\nimport { expandPresetSchemas } from \"@/bundler/presets/index.js\";\nimport { bundleSelectiveSchemas } from \"@/bundler/selective-bundler.js\";\nimport { type BundleConfig, validateBundleConfig } from \"@/cli/config-schema.js\";\nimport { generateOutput } from \"@/cli/output-generator.js\";\nimport { isSome } from \"@/utils/type.js\";\n\nconst log = anylogger(\"bundle\");\n\nexport interface BundleOptions {\n config?: string;\n output?: string;\n dryRun?: boolean;\n}\n\n/**\n * Load config from file\n */\nasync function loadConfig(configPath: string): Promise<BundleConfig> {\n try {\n const content = await readFile(configPath, \"utf-8\");\n const parsed = JSON.parse(content);\n return validateBundleConfig(parsed);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`Config file not found: ${configPath}`);\n }\n throw error;\n }\n}\n\n/**\n * Format dependency tree for display\n */\nfunction formatDependencyTree(\n tree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>,\n requestedSchemas: string[],\n): string {\n const lines: string[] = [];\n const visited = new Set<string>();\n\n lines.push(\"Dependency tree:\");\n lines.push(\"\");\n\n // Helper to format a node\n const formatNode = (key: string, indent: string = \"\", isLast: boolean = true) => {\n if (visited.has(key)) {\n return;\n }\n visited.add(key);\n\n const node = tree.get(key);\n if (!node) return;\n\n const prefix = indent + (isLast ? \"└── \" : \"├── \");\n const label = `${node.type}:${node.slug}`;\n lines.push(prefix + label);\n\n if (node.dependencies.length > 0) {\n const childIndent = indent + (isLast ? \" \" : \"│ \");\n node.dependencies.forEach((dep, idx) => {\n const isLastChild = idx === node.dependencies.length - 1;\n const childKey = dep;\n\n if (!visited.has(childKey)) {\n formatNode(childKey, childIndent, isLastChild);\n }\n });\n }\n };\n\n // Format requested schemas\n requestedSchemas.forEach((schema, idx) => {\n // Try to find the schema with different type prefixes\n const typeKey = `type:${schema}`;\n const funcKey = `function:${schema}`;\n const key = tree.has(typeKey) ? typeKey : tree.has(funcKey) ? funcKey : schema;\n\n formatNode(key, \"\", idx === requestedSchemas.length - 1);\n });\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format bundle result for dry-run display\n */\nfunction formatDryRunOutput(schemas: string[], resolvedDependencies: string[]): string {\n const lines: string[] = [];\n\n lines.push(\"Bundle preview:\");\n lines.push(\"\");\n lines.push(`Requested schemas: ${schemas.join(\", \")}`);\n lines.push(`Total schemas (with dependencies): ${resolvedDependencies.length}`);\n lines.push(\"\");\n lines.push(\"Schemas to be bundled:\");\n\n for (const schema of resolvedDependencies.sort()) {\n lines.push(` - ${schema}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Find the schemas directory - works for both development/tests and installed package\n */\nfunction findSchemasDir(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // From compiled dist/cli/index.js (bundled) to src/schemas\n const fromDist = join(__dirname, \"../../src/schemas\");\n\n // From source src/cli/commands/bundle.ts to src/schemas (for tests/dev)\n const fromSource = join(__dirname, \"../../schemas\");\n\n // Try to detect which one exists (check dist first for installed package)\n try {\n const fs = require(\"node:fs\");\n if (fs.existsSync(fromDist)) {\n return fromDist;\n }\n if (fs.existsSync(fromSource)) {\n return fromSource;\n }\n } catch {\n // If fs checks fail, default to dist structure\n }\n\n // Default to dist structure (for installed package)\n return fromDist;\n}\n\n/**\n * Core bundle logic (testable)\n */\nexport async function bundleSchemas(\n schemas: string[],\n schemasDir?: string,\n cliArgs?: string[],\n): Promise<{\n output: string;\n metadata: any;\n dependencyTree: Map<string, import(\"@/bundler/schema-dependency-resolver.js\").DependencyNode>;\n}> {\n // Use provided schemasDir or auto-detect\n const resolvedSchemasDir = schemasDir || findSchemasDir();\n\n log.info(\"Bundling schemas:\", schemas);\n log.debug(\"Schemas directory:\", resolvedSchemasDir);\n\n // Bundle schemas with dependencies\n const result = await bundleSelectiveSchemas({\n schemas,\n schemasDir: resolvedSchemasDir,\n cliArgs,\n });\n\n log.info(\n `Resolved ${result.metadata.resolvedDependencies.length} schemas (including dependencies)`,\n );\n\n // Generate output\n const output = generateOutput({\n schemas: result.schemas,\n includeHelper: true,\n generatedBy: result.metadata.generatedBy,\n });\n\n return {\n output,\n metadata: result.metadata,\n dependencyTree: result.dependencyTree,\n };\n}\n\n/**\n * CLI action handler for bundle command\n */\nexport async function handleBundleCommand(\n schemas: string[],\n options: BundleOptions = {},\n): Promise<void> {\n try {\n // Load config if provided\n let configSchemas: string[] = schemas;\n let outputPath = options.output || \"./tokenscript-schemas.js\";\n\n if (isSome(options.config)) {\n log.info(`Loading config from ${options.config}`);\n const config = await loadConfig(options.config);\n configSchemas = config.schemas;\n if (config.output) {\n outputPath = config.output;\n }\n }\n\n // Validate we have schemas\n if (!configSchemas || configSchemas.length === 0) {\n throw new Error(\"No schemas specified. Provide schemas as arguments or via --config\");\n }\n\n // Expand any presets (preset:name -> list of schemas)\n configSchemas = expandPresetSchemas(configSchemas);\n\n // Build CLI args array for generatedBy metadata\n const cliArgs: string[] = [];\n if (schemas.length > 0) {\n cliArgs.push(...schemas);\n }\n if (options.config) {\n cliArgs.push(\"--config\", options.config);\n }\n if (options.output) {\n cliArgs.push(\"--output\", options.output);\n }\n if (options.dryRun) {\n cliArgs.push(\"--dry-run\");\n }\n\n // Bundle schemas\n const { output, metadata, dependencyTree } = await bundleSchemas(\n configSchemas,\n undefined,\n cliArgs,\n );\n\n // Show dependency tree\n console.log(\"\");\n console.log(formatDependencyTree(dependencyTree, metadata.requestedSchemas));\n console.log(\"\");\n\n // Dry run - just show what would be bundled\n if (options.dryRun) {\n const preview = formatDryRunOutput(metadata.requestedSchemas, metadata.resolvedDependencies);\n console.log(preview);\n return;\n }\n\n // Write output file\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, output, \"utf-8\");\n\n log.info(`Successfully bundled ${metadata.resolvedDependencies.length} schemas`);\n log.info(`Output written to: ${outputPath}`);\n\n // Summary\n console.log(`✓ Bundled ${metadata.resolvedDependencies.length} schemas → ${outputPath}`);\n } catch (error) {\n log.error(\"Bundle failed:\", error);\n throw error;\n }\n}\n","/**\n * List command - Display available schemas\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport { readdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport anylogger from \"ulog\";\n\nconst log = anylogger(\"list\");\n\nexport interface ListOptions {\n types?: boolean;\n functions?: boolean;\n}\n\ninterface ListResult {\n types: string[];\n functions: string[];\n}\n\n/**\n * Find the schemas directory - works for both development/tests and installed package\n */\nfunction findSchemasDir(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // From compiled dist/cli/index.js (bundled) to src/schemas\n const fromDist = join(__dirname, \"../../src/schemas\");\n\n // From source src/cli/commands/list.ts to src/schemas (for tests/dev)\n const fromSource = join(__dirname, \"../../schemas\");\n\n // Try to detect which one exists\n try {\n const fs = require(\"node:fs\");\n if (fs.existsSync(fromDist)) {\n return fromDist;\n }\n if (fs.existsSync(fromSource)) {\n return fromSource;\n }\n } catch {\n // If fs checks fail, default to dist structure\n }\n\n // Default to dist structure (for installed package)\n return fromDist;\n}\n\n/**\n * List all available schemas\n */\nexport async function listSchemas(\n schemasDir?: string,\n options: ListOptions = {},\n): Promise<ListResult> {\n const resolvedSchemasDir = schemasDir || findSchemasDir();\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n const types: string[] = [];\n const functions: string[] = [];\n\n // List type schemas\n if (showTypes) {\n try {\n const typesDir = join(resolvedSchemasDir, \"types\");\n const typeEntries = await readdir(typesDir, { withFileTypes: true });\n types.push(\n ...typeEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read types directory:\", error);\n }\n }\n\n // List function schemas\n if (showFunctions) {\n try {\n const functionsDir = join(resolvedSchemasDir, \"functions\");\n const funcEntries = await readdir(functionsDir, { withFileTypes: true });\n functions.push(\n ...funcEntries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort(),\n );\n } catch (error) {\n log.warn(\"Could not read functions directory:\", error);\n }\n }\n\n return { types, functions };\n}\n\n/**\n * Format list output for display\n */\nexport function formatListOutput(result: ListResult, options: ListOptions = {}): string {\n const lines: string[] = [];\n\n const showTypes = options.types || (!options.types && !options.functions);\n const showFunctions = options.functions || (!options.types && !options.functions);\n\n if (showTypes && result.types.length > 0) {\n lines.push(\"Types:\");\n for (const type of result.types) {\n lines.push(` ${type}`);\n }\n }\n\n if (showFunctions && result.functions.length > 0) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(\"Functions:\");\n for (const func of result.functions) {\n lines.push(` function:${func}`);\n }\n }\n\n if (lines.length === 0) {\n lines.push(\"No schemas found.\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * CLI action handler for list command\n */\nexport async function handleListCommand(options: ListOptions = {}): Promise<void> {\n const result = await listSchemas(undefined, options);\n const output = formatListOutput(result, options);\n console.log(output);\n}\n","/**\n * Presets command - list available bundle presets\n */\n\n/// <reference types=\"../../../types/ulog\" />\n\nimport anylogger from \"ulog\";\nimport { BUNDLE_PRESETS } from \"@/bundler/presets/index\";\n\nconst log = anylogger(\"presets\");\n\n/**\n * Format preset information for display\n */\nfunction formatPresetInfo(): string {\n const lines: string[] = [];\n\n lines.push(\"=\".repeat(60));\n lines.push(\"Available Bundle Presets\");\n lines.push(\"=\".repeat(60));\n\n for (const [key, preset] of Object.entries(BUNDLE_PRESETS)) {\n lines.push(\"\");\n lines.push(`preset:${key}`);\n lines.push(` ${preset.description}`);\n\n // Types section\n const typesCount =\n preset.types.length === 1 && preset.types[0] === \"*\" ? \"all\" : preset.types.length;\n lines.push(\"\");\n lines.push(` Types (${typesCount}):`);\n if (preset.types.length > 0 && preset.types[0] !== \"*\") {\n for (const type of preset.types) {\n lines.push(` - ${type}`);\n }\n } else {\n lines.push(` - all`);\n }\n\n // Functions section\n const functionsCount =\n preset.functions.length === 1 && preset.functions[0] === \"*\"\n ? \"all\"\n : preset.functions.length;\n lines.push(\"\");\n lines.push(` Functions (${functionsCount}):`);\n if (preset.functions.length > 0 && preset.functions[0] !== \"*\") {\n for (const func of preset.functions) {\n lines.push(` - ${func}`);\n }\n } else {\n lines.push(` - all`);\n }\n }\n\n lines.push(\"\");\n lines.push(\"=\".repeat(60));\n lines.push(\"Usage Examples:\");\n lines.push(\"=\".repeat(60));\n lines.push(\"npx tokenscript-schemas bundle preset:css\");\n lines.push(\"npx tokenscript-schemas bundle preset:css type:oklab-color\");\n lines.push(\"npx tokenscript-schemas bundle type:hex-color function:lighten\");\n lines.push(\"\");\n lines.push(\"Note: You can combine multiple presets and specific schemas!\");\n\n return lines.join(\"\\n\");\n}\n\nexport async function handlePresetsCommand(): Promise<void> {\n try {\n log.info(\"Listing available presets\");\n\n const output = formatPresetInfo();\n console.log(output);\n\n log.info(`Listed ${Object.keys(BUNDLE_PRESETS).length} presets`);\n } catch (error) {\n log.error(\"Failed to list presets:\", error);\n throw error;\n }\n}\n","#!/usr/bin/env node\n\n/**\n * CLI entry point for @tokens-studio/tokenscript-schemas\n */\n\n/// <reference types=\"../../types/ulog\" />\n\nimport cac from \"cac\";\nimport anylogger from \"ulog\";\nimport { type BundleOptions, handleBundleCommand } from \"./commands/bundle.js\";\nimport { handleListCommand, type ListOptions } from \"./commands/list.js\";\nimport { handlePresetsCommand } from \"./commands/presets.js\";\n\nconst log = anylogger(\"cli\");\n\nconst cli = cac(\"tokenscript-schemas\");\n\n// Bundle command\ncli\n .command(\"bundle [...schemas]\", \"Bundle schemas into a JS file\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-o, --output <path>\", \"Output file path\", { default: \"./tokenscript-schemas.js\" })\n .option(\"-d, --dry-run\", \"Preview what would be bundled without writing\")\n .action(async (schemas: string[], options: BundleOptions) => {\n try {\n await handleBundleCommand(schemas, options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// List command\ncli\n .command(\"list\", \"List available schemas\")\n .option(\"--types\", \"List only type schemas\")\n .option(\"--functions\", \"List only function schemas\")\n .action(async (options: ListOptions) => {\n try {\n await handleListCommand(options);\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Presets command\ncli.command(\"presets\", \"List available bundle presets\").action(async () => {\n try {\n await handlePresetsCommand();\n } catch (error) {\n log.error(\"Error:\", error);\n process.exit(1);\n }\n});\n\ncli.help();\ncli.version(\"0.0.14\");\n\ncli.parse();\n"]}
|
package/package.json
CHANGED
package/src/cli/version-info.ts
CHANGED
|
@@ -10,6 +10,12 @@ import { fileURLToPath } from "node:url";
|
|
|
10
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
11
11
|
const __dirname = dirname(__filename);
|
|
12
12
|
|
|
13
|
+
// Build-time constant injected by tsup
|
|
14
|
+
declare const __IS_BUILT_PACKAGE__: boolean;
|
|
15
|
+
|
|
16
|
+
// Check if we're running from built package (will be true in dist, undefined when running via tsx)
|
|
17
|
+
const IS_BUILT = typeof __IS_BUILT_PACKAGE__ !== "undefined" && __IS_BUILT_PACKAGE__;
|
|
18
|
+
|
|
13
19
|
export interface VersionInfo {
|
|
14
20
|
version: string; // Package version or git SHA
|
|
15
21
|
githubUrl: string;
|
|
@@ -30,20 +36,6 @@ function getGitSha(): string | null {
|
|
|
30
36
|
}
|
|
31
37
|
}
|
|
32
38
|
|
|
33
|
-
/**
|
|
34
|
-
* Check if we're running from a local git repo
|
|
35
|
-
*/
|
|
36
|
-
function isGitRepo(): boolean {
|
|
37
|
-
try {
|
|
38
|
-
execSync("git rev-parse --git-dir", {
|
|
39
|
-
stdio: ["pipe", "pipe", "ignore"],
|
|
40
|
-
});
|
|
41
|
-
return true;
|
|
42
|
-
} catch {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
39
|
/**
|
|
48
40
|
* Get version from package.json
|
|
49
41
|
*/
|
|
@@ -75,14 +67,20 @@ function getPackageVersion(): string {
|
|
|
75
67
|
*/
|
|
76
68
|
export function getVersionInfo(): VersionInfo {
|
|
77
69
|
const githubUrl = "https://github.com/tokens-studio/tokenscript-schemas";
|
|
78
|
-
const
|
|
70
|
+
const packageVersion = getPackageVersion();
|
|
79
71
|
|
|
80
72
|
let version: string;
|
|
81
|
-
|
|
73
|
+
let isLocal: boolean;
|
|
74
|
+
|
|
75
|
+
if (IS_BUILT) {
|
|
76
|
+
// Running from built package - use package version
|
|
77
|
+
version = `@tokens-studio/tokenscript-schemas@v${packageVersion}`;
|
|
78
|
+
isLocal = false;
|
|
79
|
+
} else {
|
|
80
|
+
// Running locally (via tsx) - use git SHA
|
|
82
81
|
const sha = getGitSha();
|
|
83
82
|
version = sha ? `local-${sha}` : "local";
|
|
84
|
-
|
|
85
|
-
version = getPackageVersion();
|
|
83
|
+
isLocal = true;
|
|
86
84
|
}
|
|
87
85
|
|
|
88
86
|
return {
|