@tokens-studio/tokenscript-schemas 0.0.12 → 0.0.14
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/dist/cli/index.cjs +23 -8
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +23 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.cts +158 -0
- package/dist/index.d.ts +158 -0
- package/package.json +1 -1
- package/src/cli/commands/bundle.ts +1 -4
- package/src/cli/commands/list.ts +36 -4
- package/src/cli/index.ts +1 -1
package/dist/cli/index.cjs
CHANGED
|
@@ -492,10 +492,7 @@ function formatDependencyTree(tree, requestedSchemas) {
|
|
|
492
492
|
node.dependencies.forEach((dep, idx) => {
|
|
493
493
|
const isLastChild = idx === node.dependencies.length - 1;
|
|
494
494
|
const childKey = dep;
|
|
495
|
-
if (visited.has(childKey)) {
|
|
496
|
-
const childPrefix = childIndent + (isLastChild ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ");
|
|
497
|
-
lines.push(`${childPrefix + childKey} (already visited)`);
|
|
498
|
-
} else {
|
|
495
|
+
if (!visited.has(childKey)) {
|
|
499
496
|
formatNode(childKey, childIndent, isLastChild);
|
|
500
497
|
}
|
|
501
498
|
});
|
|
@@ -595,14 +592,32 @@ async function handleBundleCommand(schemas, options = {}) {
|
|
|
595
592
|
}
|
|
596
593
|
}
|
|
597
594
|
var log3 = ulog__default.default("list");
|
|
598
|
-
|
|
595
|
+
function findSchemasDir2() {
|
|
596
|
+
const __filename = 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)));
|
|
597
|
+
const __dirname = path.dirname(__filename);
|
|
598
|
+
const fromDist = path.join(__dirname, "../../src/schemas");
|
|
599
|
+
const fromSource = path.join(__dirname, "../../schemas");
|
|
600
|
+
try {
|
|
601
|
+
const fs = __require("fs");
|
|
602
|
+
if (fs.existsSync(fromDist)) {
|
|
603
|
+
return fromDist;
|
|
604
|
+
}
|
|
605
|
+
if (fs.existsSync(fromSource)) {
|
|
606
|
+
return fromSource;
|
|
607
|
+
}
|
|
608
|
+
} catch {
|
|
609
|
+
}
|
|
610
|
+
return fromDist;
|
|
611
|
+
}
|
|
612
|
+
async function listSchemas(schemasDir, options = {}) {
|
|
613
|
+
const resolvedSchemasDir = findSchemasDir2();
|
|
599
614
|
const showTypes = options.types || !options.types && !options.functions;
|
|
600
615
|
const showFunctions = options.functions || !options.types && !options.functions;
|
|
601
616
|
const types = [];
|
|
602
617
|
const functions = [];
|
|
603
618
|
if (showTypes) {
|
|
604
619
|
try {
|
|
605
|
-
const typesDir = path.join(
|
|
620
|
+
const typesDir = path.join(resolvedSchemasDir, "types");
|
|
606
621
|
const typeEntries = await promises.readdir(typesDir, { withFileTypes: true });
|
|
607
622
|
types.push(
|
|
608
623
|
...typeEntries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort()
|
|
@@ -613,7 +628,7 @@ async function listSchemas(schemasDir = path.join(process.cwd(), "src/schemas"),
|
|
|
613
628
|
}
|
|
614
629
|
if (showFunctions) {
|
|
615
630
|
try {
|
|
616
|
-
const functionsDir = path.join(
|
|
631
|
+
const functionsDir = path.join(resolvedSchemasDir, "functions");
|
|
617
632
|
const funcEntries = await promises.readdir(functionsDir, { withFileTypes: true });
|
|
618
633
|
functions.push(
|
|
619
634
|
...funcEntries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort()
|
|
@@ -672,7 +687,7 @@ cli.command("list", "List available schemas").option("--types", "List only type
|
|
|
672
687
|
}
|
|
673
688
|
});
|
|
674
689
|
cli.help();
|
|
675
|
-
cli.version("0.0.
|
|
690
|
+
cli.version("0.0.14");
|
|
676
691
|
cli.parse();
|
|
677
692
|
//# sourceMappingURL=index.cjs.map
|
|
678
693
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cli/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../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/output-generator.ts","../../src/cli/commands/bundle.ts","../../src/cli/commands/list.ts","../../src/cli/index.ts"],"names":["join","readFile","ulog","access","log","anylogger","fileURLToPath","dirname","mkdir","writeFile","readdir","cac"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Shared schema bundling logic\n * Used by both the build-time bundler and runtime test helpers\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\n\nexport interface BundleOptions {\n /**\n * Base URL to prepend to relative schema URIs\n * If provided, transforms /api/v1/... to https://domain.com/api/v1/...\n * If not provided, keeps URIs as-is (useful for tests)\n */\n baseUrl?: string;\n}\n\n/**\n * Replace script file references with actual content\n * This is the core bundling logic shared by build and runtime\n */\nexport async function bundleSchemaFromDirectory(\n schemaDir: string,\n options?: BundleOptions,\n): Promise<SchemaSpecification> {\n // Read schema.json which contains the full specification\n const schemaJsonPath = join(schemaDir, \"schema.json\");\n const schemaContent = await readFile(schemaJsonPath, \"utf-8\");\n const schema = JSON.parse(schemaContent) as SchemaSpecification;\n\n if (schema.type === \"function\") {\n return await inlineFunctionScriptReferences(\n schemaDir,\n schema as FunctionSpecification,\n options,\n );\n } else {\n return await inlineColorScriptReferences(schemaDir, schema as ColorSpecification, options);\n }\n}\n\n/**\n * Inline script file references in a color schema specification\n */\nasync function inlineColorScriptReferences(\n schemaDir: string,\n schema: ColorSpecification,\n options?: BundleOptions,\n): Promise<ColorSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as ColorSpecification;\n\n // Inline initializer scripts and transform URIs\n for (const initializer of result.initializers) {\n if (initializer.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, initializer.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n initializer.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n initializer.script.type = addBaseUrl(initializer.script.type, options.baseUrl);\n }\n }\n\n // Inline conversion scripts and transform URIs\n for (const conversion of result.conversions) {\n if (conversion.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, conversion.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n conversion.script.script = scriptContent.trim();\n }\n\n // Transform URIs if baseUrl is provided\n if (options?.baseUrl) {\n conversion.script.type = addBaseUrl(conversion.script.type, options.baseUrl);\n\n // Transform source and target URIs (but not $self)\n if (conversion.source !== \"$self\") {\n conversion.source = addBaseUrl(conversion.source, options.baseUrl);\n }\n if (conversion.target !== \"$self\") {\n conversion.target = addBaseUrl(conversion.target, options.baseUrl);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Inline script file references in a function specification\n */\nasync function inlineFunctionScriptReferences(\n schemaDir: string,\n schema: FunctionSpecification,\n options?: BundleOptions,\n): Promise<FunctionSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as FunctionSpecification;\n\n // Inline the main function script\n if (result.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, result.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n result.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n result.script.type = addBaseUrl(result.script.type, options.baseUrl);\n\n // Transform requirement URIs\n if (result.requirements) {\n const baseUrl = options.baseUrl;\n result.requirements = result.requirements.map((req) => addBaseUrl(req, baseUrl));\n }\n }\n\n return result;\n}\n\n/**\n * Add base URL to relative schema URIs\n * Transforms /api/v1/... to https://domain.com/api/v1/...\n */\nfunction addBaseUrl(uri: string, baseUrl: string): string {\n // If URI already has a protocol, return as-is\n if (uri.includes(\"://\")) {\n return uri;\n }\n\n // If URI is relative (starts with /), prepend base URL\n if (uri.startsWith(\"/\")) {\n // Remove trailing slash from baseUrl if present\n const cleanBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n return `${cleanBaseUrl}${uri}`;\n }\n\n // Otherwise return as-is (e.g., $self)\n return uri;\n}\n","/**\n * 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}\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 };\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 return {\n schemas: bundledSchemas,\n metadata: {\n requestedSchemas: options.schemas,\n resolvedDependencies: allSchemas,\n generatedAt: new Date().toISOString(),\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 * Generate JavaScript output for bundled schemas\n */\n\nimport type { BundledSchemaEntry } from \"@/bundler/selective-bundler.js\";\n\nexport interface OutputGeneratorOptions {\n schemas: BundledSchemaEntry[];\n includeHelper?: boolean; // Include makeConfig() helper\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 schemaList = schemas.map((s) => s.uri).join(\", \");\n\n const lines: string[] = [];\n\n // Header comment\n lines.push(\"// Auto-generated by @tokens-studio/tokenscript-schemas\");\n lines.push(`// Generated: ${timestamp}`);\n lines.push(`// Schemas: ${schemaList}`);\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 { 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 const childPrefix = childIndent + (isLastChild ? \"└── \" : \"├── \");\n lines.push(`${childPrefix + childKey} (already visited)`);\n } else {\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\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): 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 });\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 });\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 // Bundle schemas\n const { output, metadata, dependencyTree } = await bundleSchemas(configSchemas);\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 { join } from \"node:path\";\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 * List all available schemas\n */\nexport async function listSchemas(\n schemasDir: string = join(process.cwd(), \"src/schemas\"),\n options: ListOptions = {},\n): Promise<ListResult> {\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(schemasDir, \"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(schemasDir, \"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","#!/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\";\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\ncli.help();\ncli.version(\"0.0.12\");\n\ncli.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../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/output-generator.ts","../../src/cli/commands/bundle.ts","../../src/cli/commands/list.ts","../../src/cli/index.ts"],"names":["join","readFile","ulog","access","log","anylogger","fileURLToPath","dirname","mkdir","writeFile","findSchemasDir","readdir","cac"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Shared schema bundling logic\n * Used by both the build-time bundler and runtime test helpers\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ColorSpecification,\n FunctionSpecification,\n SchemaSpecification,\n} from \"@/bundler/types.js\";\n\nexport interface BundleOptions {\n /**\n * Base URL to prepend to relative schema URIs\n * If provided, transforms /api/v1/... to https://domain.com/api/v1/...\n * If not provided, keeps URIs as-is (useful for tests)\n */\n baseUrl?: string;\n}\n\n/**\n * Replace script file references with actual content\n * This is the core bundling logic shared by build and runtime\n */\nexport async function bundleSchemaFromDirectory(\n schemaDir: string,\n options?: BundleOptions,\n): Promise<SchemaSpecification> {\n // Read schema.json which contains the full specification\n const schemaJsonPath = join(schemaDir, \"schema.json\");\n const schemaContent = await readFile(schemaJsonPath, \"utf-8\");\n const schema = JSON.parse(schemaContent) as SchemaSpecification;\n\n if (schema.type === \"function\") {\n return await inlineFunctionScriptReferences(\n schemaDir,\n schema as FunctionSpecification,\n options,\n );\n } else {\n return await inlineColorScriptReferences(schemaDir, schema as ColorSpecification, options);\n }\n}\n\n/**\n * Inline script file references in a color schema specification\n */\nasync function inlineColorScriptReferences(\n schemaDir: string,\n schema: ColorSpecification,\n options?: BundleOptions,\n): Promise<ColorSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as ColorSpecification;\n\n // Inline initializer scripts and transform URIs\n for (const initializer of result.initializers) {\n if (initializer.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, initializer.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n initializer.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n initializer.script.type = addBaseUrl(initializer.script.type, options.baseUrl);\n }\n }\n\n // Inline conversion scripts and transform URIs\n for (const conversion of result.conversions) {\n if (conversion.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, conversion.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n conversion.script.script = scriptContent.trim();\n }\n\n // Transform URIs if baseUrl is provided\n if (options?.baseUrl) {\n conversion.script.type = addBaseUrl(conversion.script.type, options.baseUrl);\n\n // Transform source and target URIs (but not $self)\n if (conversion.source !== \"$self\") {\n conversion.source = addBaseUrl(conversion.source, options.baseUrl);\n }\n if (conversion.target !== \"$self\") {\n conversion.target = addBaseUrl(conversion.target, options.baseUrl);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Inline script file references in a function specification\n */\nasync function inlineFunctionScriptReferences(\n schemaDir: string,\n schema: FunctionSpecification,\n options?: BundleOptions,\n): Promise<FunctionSpecification> {\n const result = JSON.parse(JSON.stringify(schema)) as FunctionSpecification;\n\n // Inline the main function script\n if (result.script.script.startsWith(\"./\")) {\n const scriptPath = join(schemaDir, result.script.script.slice(2));\n const scriptContent = await readFile(scriptPath, \"utf-8\");\n result.script.script = scriptContent.trim();\n }\n\n // Transform script type URI if baseUrl is provided\n if (options?.baseUrl) {\n result.script.type = addBaseUrl(result.script.type, options.baseUrl);\n\n // Transform requirement URIs\n if (result.requirements) {\n const baseUrl = options.baseUrl;\n result.requirements = result.requirements.map((req) => addBaseUrl(req, baseUrl));\n }\n }\n\n return result;\n}\n\n/**\n * Add base URL to relative schema URIs\n * Transforms /api/v1/... to https://domain.com/api/v1/...\n */\nfunction addBaseUrl(uri: string, baseUrl: string): string {\n // If URI already has a protocol, return as-is\n if (uri.includes(\"://\")) {\n return uri;\n }\n\n // If URI is relative (starts with /), prepend base URL\n if (uri.startsWith(\"/\")) {\n // Remove trailing slash from baseUrl if present\n const cleanBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n return `${cleanBaseUrl}${uri}`;\n }\n\n // Otherwise return as-is (e.g., $self)\n return uri;\n}\n","/**\n * 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}\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 };\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 return {\n schemas: bundledSchemas,\n metadata: {\n requestedSchemas: options.schemas,\n resolvedDependencies: allSchemas,\n generatedAt: new Date().toISOString(),\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 * Generate JavaScript output for bundled schemas\n */\n\nimport type { BundledSchemaEntry } from \"@/bundler/selective-bundler.js\";\n\nexport interface OutputGeneratorOptions {\n schemas: BundledSchemaEntry[];\n includeHelper?: boolean; // Include makeConfig() helper\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 schemaList = schemas.map((s) => s.uri).join(\", \");\n\n const lines: string[] = [];\n\n // Header comment\n lines.push(\"// Auto-generated by @tokens-studio/tokenscript-schemas\");\n lines.push(`// Generated: ${timestamp}`);\n lines.push(`// Schemas: ${schemaList}`);\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 { 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\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): 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 });\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 });\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 // Bundle schemas\n const { output, metadata, dependencyTree } = await bundleSchemas(configSchemas);\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","#!/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\";\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\ncli.help();\ncli.version(\"0.0.14\");\n\ncli.parse();\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/cli/index.js
CHANGED
|
@@ -484,10 +484,7 @@ function formatDependencyTree(tree, requestedSchemas) {
|
|
|
484
484
|
node.dependencies.forEach((dep, idx) => {
|
|
485
485
|
const isLastChild = idx === node.dependencies.length - 1;
|
|
486
486
|
const childKey = dep;
|
|
487
|
-
if (visited.has(childKey)) {
|
|
488
|
-
const childPrefix = childIndent + (isLastChild ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ");
|
|
489
|
-
lines.push(`${childPrefix + childKey} (already visited)`);
|
|
490
|
-
} else {
|
|
487
|
+
if (!visited.has(childKey)) {
|
|
491
488
|
formatNode(childKey, childIndent, isLastChild);
|
|
492
489
|
}
|
|
493
490
|
});
|
|
@@ -587,14 +584,32 @@ async function handleBundleCommand(schemas, options = {}) {
|
|
|
587
584
|
}
|
|
588
585
|
}
|
|
589
586
|
var log3 = ulog("list");
|
|
590
|
-
|
|
587
|
+
function findSchemasDir2() {
|
|
588
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
589
|
+
const __dirname = dirname(__filename);
|
|
590
|
+
const fromDist = join(__dirname, "../../src/schemas");
|
|
591
|
+
const fromSource = join(__dirname, "../../schemas");
|
|
592
|
+
try {
|
|
593
|
+
const fs = __require("fs");
|
|
594
|
+
if (fs.existsSync(fromDist)) {
|
|
595
|
+
return fromDist;
|
|
596
|
+
}
|
|
597
|
+
if (fs.existsSync(fromSource)) {
|
|
598
|
+
return fromSource;
|
|
599
|
+
}
|
|
600
|
+
} catch {
|
|
601
|
+
}
|
|
602
|
+
return fromDist;
|
|
603
|
+
}
|
|
604
|
+
async function listSchemas(schemasDir, options = {}) {
|
|
605
|
+
const resolvedSchemasDir = findSchemasDir2();
|
|
591
606
|
const showTypes = options.types || !options.types && !options.functions;
|
|
592
607
|
const showFunctions = options.functions || !options.types && !options.functions;
|
|
593
608
|
const types = [];
|
|
594
609
|
const functions = [];
|
|
595
610
|
if (showTypes) {
|
|
596
611
|
try {
|
|
597
|
-
const typesDir = join(
|
|
612
|
+
const typesDir = join(resolvedSchemasDir, "types");
|
|
598
613
|
const typeEntries = await readdir(typesDir, { withFileTypes: true });
|
|
599
614
|
types.push(
|
|
600
615
|
...typeEntries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort()
|
|
@@ -605,7 +620,7 @@ async function listSchemas(schemasDir = join(process.cwd(), "src/schemas"), opti
|
|
|
605
620
|
}
|
|
606
621
|
if (showFunctions) {
|
|
607
622
|
try {
|
|
608
|
-
const functionsDir = join(
|
|
623
|
+
const functionsDir = join(resolvedSchemasDir, "functions");
|
|
609
624
|
const funcEntries = await readdir(functionsDir, { withFileTypes: true });
|
|
610
625
|
functions.push(
|
|
611
626
|
...funcEntries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort()
|
|
@@ -664,7 +679,7 @@ cli.command("list", "List available schemas").option("--types", "List only type
|
|
|
664
679
|
}
|
|
665
680
|
});
|
|
666
681
|
cli.help();
|
|
667
|
-
cli.version("0.0.
|
|
682
|
+
cli.version("0.0.14");
|
|
668
683
|
cli.parse();
|
|
669
684
|
//# sourceMappingURL=index.js.map
|
|
670
685
|
//# sourceMappingURL=index.js.map
|