@ryndesign/cli 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.cjs +34 -8
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +4 -4
- package/dist/{figma-VTZWLYWQ.js → figma-CNDSVB36.js} +2 -2
- package/dist/{figma-pull-RCRG6D5G.js → figma-pull-4GFVG5YD.js} +9 -2
- package/dist/figma-pull-4GFVG5YD.js.map +1 -0
- package/dist/{generate-LES4SXIM.js → generate-KMAQLQTY.js} +7 -4
- package/dist/generate-KMAQLQTY.js.map +1 -0
- package/dist/{preview-AXCPYQ53.js → preview-2A5EQQWG.js} +14 -4
- package/dist/preview-2A5EQQWG.js.map +1 -0
- package/dist/{validate-RGTQQSUE.js → validate-DNJX65QZ.js} +12 -2
- package/dist/validate-DNJX65QZ.js.map +1 -0
- package/package.json +1 -1
- package/dist/figma-pull-RCRG6D5G.js.map +0 -1
- package/dist/generate-LES4SXIM.js.map +0 -1
- package/dist/preview-AXCPYQ53.js.map +0 -1
- package/dist/validate-RGTQQSUE.js.map +0 -1
- /package/dist/{figma-VTZWLYWQ.js.map → figma-CNDSVB36.js.map} +0 -0
package/dist/bin.cjs
CHANGED
|
@@ -389,12 +389,14 @@ var init_generate = __esm({
|
|
|
389
389
|
description: "Generate design system files for target platforms"
|
|
390
390
|
},
|
|
391
391
|
args: {
|
|
392
|
-
|
|
392
|
+
platform: {
|
|
393
393
|
type: "string",
|
|
394
|
+
alias: "p",
|
|
394
395
|
description: "Comma-separated list of platforms to generate"
|
|
395
396
|
},
|
|
396
397
|
watch: {
|
|
397
398
|
type: "boolean",
|
|
399
|
+
alias: "w",
|
|
398
400
|
description: "Watch for changes and regenerate",
|
|
399
401
|
default: false
|
|
400
402
|
},
|
|
@@ -410,6 +412,7 @@ var init_generate = __esm({
|
|
|
410
412
|
},
|
|
411
413
|
config: {
|
|
412
414
|
type: "string",
|
|
415
|
+
alias: "c",
|
|
413
416
|
description: "Path to config file",
|
|
414
417
|
default: "ryndesign.config.ts"
|
|
415
418
|
}
|
|
@@ -442,8 +445,8 @@ var init_generate = __esm({
|
|
|
442
445
|
console.log(import_picocolors2.default.green(`\u2713 Resolved themes: ${Object.keys(tokenSet.themes.themes).join(", ")}`));
|
|
443
446
|
}
|
|
444
447
|
let generators = config.generators ?? [];
|
|
445
|
-
if (args.
|
|
446
|
-
const targetPlatforms = args.
|
|
448
|
+
if (args.platform) {
|
|
449
|
+
const targetPlatforms = args.platform.split(",").map((s) => s.trim());
|
|
447
450
|
generators = generators.filter((g) => targetPlatforms.includes(g.name));
|
|
448
451
|
}
|
|
449
452
|
if (generators.length === 0) {
|
|
@@ -582,6 +585,7 @@ var init_validate = __esm({
|
|
|
582
585
|
import_citty3 = require("citty");
|
|
583
586
|
import_picocolors3 = __toESM(require("picocolors"), 1);
|
|
584
587
|
import_core2 = require("@ryndesign/core");
|
|
588
|
+
init_config();
|
|
585
589
|
validate_default = (0, import_citty3.defineCommand)({
|
|
586
590
|
meta: {
|
|
587
591
|
name: "validate",
|
|
@@ -593,6 +597,12 @@ var init_validate = __esm({
|
|
|
593
597
|
description: "Path to token file(s)",
|
|
594
598
|
required: false
|
|
595
599
|
},
|
|
600
|
+
config: {
|
|
601
|
+
type: "string",
|
|
602
|
+
alias: "c",
|
|
603
|
+
description: "Path to config file",
|
|
604
|
+
default: "ryndesign.config.ts"
|
|
605
|
+
},
|
|
596
606
|
strict: {
|
|
597
607
|
type: "boolean",
|
|
598
608
|
description: "Treat warnings as errors",
|
|
@@ -601,7 +611,8 @@ var init_validate = __esm({
|
|
|
601
611
|
},
|
|
602
612
|
async run({ args }) {
|
|
603
613
|
console.log(import_picocolors3.default.cyan(" RynDesign Validate\n"));
|
|
604
|
-
const
|
|
614
|
+
const config = await loadConfig(args.config);
|
|
615
|
+
const patterns = args.path ? [args.path] : config?.tokens ?? ["tokens/**/*.tokens.json"];
|
|
605
616
|
try {
|
|
606
617
|
const tree = await (0, import_core2.readAndMergeTokenFiles)(patterns);
|
|
607
618
|
(0, import_core2.validateTree)(tree);
|
|
@@ -673,16 +684,22 @@ var init_preview = __esm({
|
|
|
673
684
|
"use strict";
|
|
674
685
|
import_citty4 = require("citty");
|
|
675
686
|
import_picocolors4 = __toESM(require("picocolors"), 1);
|
|
687
|
+
init_config();
|
|
676
688
|
preview_default = (0, import_citty4.defineCommand)({
|
|
677
689
|
meta: {
|
|
678
690
|
name: "preview",
|
|
679
691
|
description: "Start the design system preview server"
|
|
680
692
|
},
|
|
681
693
|
args: {
|
|
694
|
+
config: {
|
|
695
|
+
type: "string",
|
|
696
|
+
alias: "c",
|
|
697
|
+
description: "Path to config file",
|
|
698
|
+
default: "ryndesign.config.ts"
|
|
699
|
+
},
|
|
682
700
|
port: {
|
|
683
701
|
type: "string",
|
|
684
|
-
description: "Port to run the preview server on"
|
|
685
|
-
default: "4400"
|
|
702
|
+
description: "Port to run the preview server on"
|
|
686
703
|
},
|
|
687
704
|
open: {
|
|
688
705
|
type: "boolean",
|
|
@@ -692,10 +709,12 @@ var init_preview = __esm({
|
|
|
692
709
|
},
|
|
693
710
|
async run({ args }) {
|
|
694
711
|
console.log(import_picocolors4.default.cyan("\u{1F5A5} RynDesign Preview\n"));
|
|
712
|
+
const config = await loadConfig(args.config);
|
|
713
|
+
const port = args.port ? parseInt(args.port, 10) : config?.preview?.port ?? 4400;
|
|
695
714
|
try {
|
|
696
715
|
const { startPreviewServer } = await import("@ryndesign/preview");
|
|
697
716
|
await startPreviewServer({
|
|
698
|
-
port
|
|
717
|
+
port,
|
|
699
718
|
open: args.open
|
|
700
719
|
});
|
|
701
720
|
} catch {
|
|
@@ -862,9 +881,16 @@ var init_figma_pull = __esm({
|
|
|
862
881
|
},
|
|
863
882
|
config: {
|
|
864
883
|
type: "string",
|
|
884
|
+
alias: "c",
|
|
865
885
|
description: "Path to config file",
|
|
866
886
|
default: "ryndesign.config.ts"
|
|
867
887
|
},
|
|
888
|
+
output: {
|
|
889
|
+
type: "string",
|
|
890
|
+
alias: "o",
|
|
891
|
+
description: "Output file path",
|
|
892
|
+
default: "tokens/figma.tokens.json"
|
|
893
|
+
},
|
|
868
894
|
merge: {
|
|
869
895
|
type: "boolean",
|
|
870
896
|
description: "Merge with existing local tokens instead of overwriting",
|
|
@@ -928,7 +954,7 @@ var init_figma_pull = __esm({
|
|
|
928
954
|
console.log(import_picocolors6.default.green(` \u2713 Written ${filePath}`));
|
|
929
955
|
}
|
|
930
956
|
} else {
|
|
931
|
-
const outPath = import_node_path5.default.resolve(cwd,
|
|
957
|
+
const outPath = import_node_path5.default.resolve(cwd, args.output);
|
|
932
958
|
await import_promises5.default.mkdir(import_node_path5.default.dirname(outPath), { recursive: true });
|
|
933
959
|
if (shouldMerge) {
|
|
934
960
|
const existing = await readJsonSafe(outPath);
|
package/dist/bin.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/init.ts","../src/config.ts","../src/commands/generate.ts","../src/commands/validate.ts","../src/commands/preview.ts","../src/commands/add.ts","../src/commands/figma-pull.ts","../src/commands/figma-push.ts","../src/commands/figma-diff.ts","../src/commands/figma.ts","../src/commands/eject.ts","../src/bin.ts","../src/commands/main.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport default defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new RynDesign project',\n },\n args: {\n template: {\n type: 'string',\n description: 'Template to use (minimal or full)',\n default: 'minimal',\n },\n platforms: {\n type: 'string',\n description: 'Comma-separated list of target platforms',\n },\n },\n async run({ args }) {\n p.intro(pc.bgCyan(pc.black(' RynDesign Init ')));\n\n const template = args.template || await p.select({\n message: 'Choose a template:',\n options: [\n { value: 'minimal', label: 'Minimal', hint: 'Basic color, spacing, typography tokens' },\n { value: 'full', label: 'Full', hint: 'Complete token set with shadows, borders, gradients' },\n ],\n }) as string;\n\n if (p.isCancel(template)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platformsInput = args.platforms || await p.multiselect({\n message: 'Select target platforms:',\n initialValues: ['react', 'swiftui'],\n options: [\n { value: 'react', label: 'React', hint: 'recommended' },\n { value: 'swiftui', label: 'SwiftUI', hint: 'recommended' },\n { value: 'vue', label: 'Vue' },\n { value: 'svelte', label: 'Svelte' },\n { value: 'rails', label: 'Rails' },\n { value: 'uikit', label: 'UIKit' },\n { value: 'compose', label: 'Jetpack Compose' },\n { value: 'android-view', label: 'Android View' },\n ],\n required: true,\n }) as string[];\n\n if (p.isCancel(platformsInput)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platforms = Array.isArray(platformsInput)\n ? platformsInput\n : (platformsInput as string).split(',').map(s => s.trim());\n\n const darkMode = await p.confirm({\n message: 'Enable dark mode support?',\n initialValue: true,\n });\n\n if (p.isCancel(darkMode)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const s = p.spinner();\n s.start('Creating project files...');\n\n const cwd = process.cwd();\n\n // Create directories\n await fs.mkdir(path.join(cwd, 'tokens'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'components'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'generated'), { recursive: true });\n\n // Copy template tokens\n // ESM-compatible path resolution\n const templateDir = path.resolve(\n typeof __dirname !== 'undefined'\n ? path.resolve(__dirname, '../../templates')\n : path.resolve(new URL('.', import.meta.url).pathname, '../../templates')\n );\n const templateFile = template === 'full' ? 'full.tokens.json' : 'minimal.tokens.json';\n\n try {\n const templateContent = await fs.readFile(\n path.join(templateDir, templateFile),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n templateContent\n );\n } catch {\n // If templates not found, create a basic one inline\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n JSON.stringify(getDefaultTokens(), null, 2)\n );\n }\n\n // Create semantic tokens\n await fs.writeFile(\n path.join(cwd, 'tokens', 'semantic.tokens.json'),\n JSON.stringify(getSemanticTokens(), null, 2)\n );\n\n // Create dark theme if enabled\n if (darkMode) {\n try {\n const darkContent = await fs.readFile(\n path.join(templateDir, 'dark.tokens.json'),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n darkContent\n );\n } catch {\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n JSON.stringify(getDarkTokens(), null, 2)\n );\n }\n }\n\n // Create config file\n const configContent = generateConfig(platforms, darkMode as boolean);\n await fs.writeFile(path.join(cwd, 'ryndesign.config.ts'), configContent);\n\n // Copy button component\n try {\n const buttonComp = await fs.readFile(\n path.join(templateDir, '../components/button.component.json'),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'components', 'button.component.json'),\n buttonComp\n );\n } catch {\n // Skip if not found\n }\n\n // Add generated/ to .gitignore\n const gitignorePath = path.join(cwd, '.gitignore');\n try {\n let gitignore = '';\n try {\n gitignore = await fs.readFile(gitignorePath, 'utf-8');\n } catch {\n // File doesn't exist yet\n }\n if (!gitignore.includes('generated/')) {\n gitignore += (gitignore.endsWith('\\n') || gitignore === '' ? '' : '\\n') + 'generated/\\n';\n await fs.writeFile(gitignorePath, gitignore);\n }\n } catch {\n // Skip if can't write .gitignore\n }\n\n // Add scripts to package.json if it exists\n try {\n const pkgJsonPath = path.join(cwd, 'package.json');\n const pkgContent = await fs.readFile(pkgJsonPath, 'utf-8');\n const pkg = JSON.parse(pkgContent);\n if (!pkg.scripts) pkg.scripts = {};\n if (!pkg.scripts['generate']) pkg.scripts['generate'] = 'ryndesign generate';\n if (!pkg.scripts['preview']) pkg.scripts['preview'] = 'ryndesign preview';\n await fs.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + '\\n');\n } catch {\n // Skip if no package.json or can't modify\n }\n\n s.stop('Project files created!');\n\n p.note(\n [\n `${pc.green('tokens/')} - Your design tokens`,\n `${pc.green('components/')} - Component definitions`,\n `${pc.green('generated/')} - Generated output (gitignored)`,\n `${pc.green('ryndesign.config.ts')} - Configuration`,\n ].join('\\n'),\n 'Project structure'\n );\n\n p.outro(pc.green('Run `ryndesign generate` to generate your design system!'));\n },\n});\n\nfunction generateConfig(platforms: string[], darkMode: boolean): string {\n const imports: string[] = [];\n const generators: string[] = [];\n\n for (const platform of platforms) {\n const pkgName = `@ryndesign/generator-${platform}`;\n const varName = platform.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n imports.push(`import ${varName} from '${pkgName}';`);\n\n if (['react', 'vue', 'svelte'].includes(platform)) {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n cssStrategy: 'css-variables',\n typescript: true,${darkMode ? \"\\n darkMode: 'media+class',\" : ''}\n })`);\n } else {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n })`);\n }\n }\n\n return `import { defineConfig } from '@ryndesign/cli';\n${imports.join('\\n')}\n\nexport default defineConfig({\n tokens: ['tokens/**/*.tokens.json'],\n components: ['components/**/*.component.json'],\n outDir: 'generated',\n${darkMode ? `\n themes: {\n default: 'light',\n dark: { file: 'tokens/dark.tokens.json' },\n },\n` : ''}\n generators: [\n${generators.join(',\\n')}\n ],\n\n preview: { port: 4400, open: true },\n});\n`;\n}\n\nfunction getDefaultTokens() {\n return {\n color: {\n $type: 'color',\n primary: { $value: '#3B82F6' },\n white: { $value: '#FFFFFF' },\n black: { $value: '#000000' },\n gray: {\n 50: { $value: '#F9FAFB' },\n 900: { $value: '#111827' },\n },\n },\n spacing: {\n $type: 'dimension',\n sm: { $value: '8px' },\n md: { $value: '16px' },\n lg: { $value: '24px' },\n },\n };\n}\n\nfunction getSemanticTokens() {\n return {\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.white}' },\n secondary: { $value: '{color.gray.50}' },\n },\n text: {\n primary: { $value: '{color.gray.900}' },\n },\n },\n };\n}\n\nfunction getDarkTokens() {\n return {\n $description: 'Dark theme overrides',\n $extensions: { 'com.ryndesign.theme': { name: 'dark', extends: 'default' } },\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.gray.900}' },\n secondary: { $value: '{color.gray.800}' },\n },\n text: {\n primary: { $value: '{color.gray.50}' },\n },\n },\n };\n}\n","import type { RynDesignConfig } from '@ryndesign/plugin-api';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\n\nconst CONFIG_NAMES = [\n 'ryndesign.config.ts',\n 'ryndesign.config.js',\n 'ryndesign.config.mjs',\n 'ryndesign.config.json',\n];\n\nexport async function loadConfig(configPath?: string): Promise<RynDesignConfig | null> {\n const cwd = process.cwd();\n\n // If explicit path provided, try only that\n if (configPath) {\n return loadConfigFile(path.resolve(cwd, configPath));\n }\n\n // Try each config name in order\n for (const name of CONFIG_NAMES) {\n const absolutePath = path.resolve(cwd, name);\n try {\n await fs.access(absolutePath);\n return loadConfigFile(absolutePath);\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nasync function loadConfigFile(absolutePath: string): Promise<RynDesignConfig | null> {\n try {\n await fs.access(absolutePath);\n } catch {\n return null;\n }\n\n // JSON config\n if (absolutePath.endsWith('.json')) {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n const config = JSON.parse(content) as RynDesignConfig;\n return validateConfig(config, absolutePath);\n } catch (err) {\n throw new Error(`Failed to parse config ${absolutePath}: ${(err as Error).message}`);\n }\n }\n\n // JS/TS config\n try {\n const { createJiti } = await import('jiti');\n const loader = createJiti(absolutePath, {\n interopDefault: true,\n });\n const config = await loader.import(absolutePath) as Record<string, unknown>;\n const resolved = (config.default ?? config) as RynDesignConfig;\n return validateConfig(resolved, absolutePath);\n } catch (err) {\n // Fallback: try dynamic import\n try {\n const mod = await import(absolutePath);\n const resolved = mod.default ?? mod;\n return validateConfig(resolved, absolutePath);\n } catch {\n throw new Error(`Failed to load config ${absolutePath}: ${(err as Error).message}`);\n }\n }\n}\n\nfunction validateConfig(config: RynDesignConfig, filePath: string): RynDesignConfig {\n if (!config.tokens || !Array.isArray(config.tokens) || config.tokens.length === 0) {\n throw new Error(`Invalid config in ${filePath}: \"tokens\" must be a non-empty array of glob patterns`);\n }\n\n if (config.components && !Array.isArray(config.components)) {\n throw new Error(`Invalid config in ${filePath}: \"components\" must be an array of glob patterns`);\n }\n\n if (config.generators && !Array.isArray(config.generators)) {\n throw new Error(`Invalid config in ${filePath}: \"generators\" must be an array`);\n }\n\n return config;\n}\n\n// Re-export defineConfig for convenience\nexport { defineConfig } from '@ryndesign/plugin-api';\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { buildTokenSet, loadComponents, resolveComponent, createGeneratorHelpers } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\nimport type { GeneratedFile, GeneratorPlugin } from '@ryndesign/plugin-api';\n\nexport default defineCommand({\n meta: {\n name: 'generate',\n description: 'Generate design system files for target platforms',\n },\n args: {\n platforms: {\n type: 'string',\n description: 'Comma-separated list of platforms to generate',\n },\n watch: {\n type: 'boolean',\n description: 'Watch for changes and regenerate',\n default: false,\n },\n clean: {\n type: 'boolean',\n description: 'Clean output directory before generating',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Show what would be generated without writing files',\n default: false,\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n const dryRun = args['dry-run'] as boolean;\n console.log(pc.cyan(`⚡ RynDesign Generate${dryRun ? ' (dry run)' : ''}\\n`));\n\n const config = await loadConfig(args.config);\n if (!config) {\n console.error(pc.red('Config file not found. Run `ryndesign init` first.'));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Clean output directory if requested\n if (args.clean && config.outDir) {\n const outDir = path.resolve(cwd, config.outDir);\n await fs.rm(outDir, { recursive: true, force: true });\n await fs.mkdir(outDir, { recursive: true });\n console.log(pc.yellow(`Cleaned ${config.outDir}/`));\n }\n\n // Build token set\n console.log(pc.gray('Building token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n name: 'design-system',\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n if (Object.keys(tokenSet.themes.themes).length > 0) {\n console.log(pc.green(`✓ Resolved themes: ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n // Filter generators by platform if specified\n let generators = config.generators ?? [];\n if (args.platforms) {\n const targetPlatforms = (args.platforms as string).split(',').map(s => s.trim());\n generators = generators.filter(g => targetPlatforms.includes(g.name));\n }\n\n if (generators.length === 0) {\n console.log(pc.yellow('No generators configured. Add generators to your ryndesign.config.ts'));\n return;\n }\n\n // Load and resolve components\n const components = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n\n if (components.length > 0) {\n console.log(pc.green(`✓ Loaded ${components.length} component(s)`));\n }\n\n // Resolve all components\n const resolvedComponents = components.map(compDef => resolveComponent(compDef, tokenSet));\n\n // Run generators\n const allFiles: GeneratedFile[] = [];\n const summary: { name: string; files: number; bytes: number }[] = [];\n\n for (const generator of generators) {\n console.log(pc.gray(`\\nGenerating ${generator.displayName}...`));\n let genFiles = 0;\n let genBytes = 0;\n\n const ctx = {\n tokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: resolvedComponents,\n };\n\n try {\n // Generate tokens\n const tokenFiles = await generator.generateTokens(ctx);\n allFiles.push(...tokenFiles);\n\n for (const file of tokenFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n\n // Generate components\n for (const resolvedComp of resolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n allFiles.push(...compFiles);\n\n for (const file of compFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n }\n\n console.log(pc.green(` ✓ ${genFiles} files generated for ${generator.displayName}`));\n summary.push({ name: generator.displayName, files: genFiles, bytes: genBytes });\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName} failed: ${(err as Error).message}`));\n }\n }\n\n // Summary table\n if (summary.length > 0) {\n console.log(pc.gray('\\n Platform Files Size'));\n console.log(pc.gray(' ─────────────────────────────────'));\n for (const s of summary) {\n const sizeStr = s.bytes < 1024 ? `${s.bytes} B` : `${(s.bytes / 1024).toFixed(1)} KB`;\n console.log(` ${s.name.padEnd(18)} ${String(s.files).padStart(5)} ${sizeStr}`);\n }\n }\n\n // Run hooks\n if (config.hooks?.['generate:complete']) {\n await config.hooks['generate:complete'](allFiles);\n }\n\n console.log(pc.green(`\\n✓ Generation complete! ${allFiles.length} files ${dryRun ? 'would be written' : 'written'}.`));\n\n // Watch mode\n if (args.watch) {\n console.log(pc.cyan('\\nWatching for changes...'));\n const { watch } = await import('chokidar');\n const watchPatterns = [...config.tokens, ...(config.components ?? [])];\n const watcher = watch(watchPatterns, {\n cwd,\n ignoreInitial: true,\n });\n\n watcher.on('change', async (changedPath) => {\n console.log(pc.gray(`\\nFile changed: ${changedPath}`));\n try {\n const newTokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n });\n\n // Reload components\n const newComponents = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n const newResolvedComponents = newComponents.map(c => resolveComponent(c, newTokenSet));\n\n // Re-run generators\n for (const generator of generators) {\n try {\n const ctx = {\n tokenSet: newTokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: newResolvedComponents,\n };\n\n const tokenFiles = await generator.generateTokens(ctx);\n for (const file of tokenFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n\n for (const resolvedComp of newResolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n for (const file of compFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName}: ${(err as Error).message}`));\n }\n }\n console.log(pc.green('✓ Rebuilt and regenerated'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n }\n });\n }\n },\n});\n\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { readAndMergeTokenFiles, validateTree, buildTokenSet, postValidate, TokenValidationError } from '@ryndesign/core';\n\nexport default defineCommand({\n meta: {\n name: 'validate',\n description: 'Validate design token files',\n },\n args: {\n path: {\n type: 'positional',\n description: 'Path to token file(s)',\n required: false,\n },\n strict: {\n type: 'boolean',\n description: 'Treat warnings as errors',\n default: false,\n },\n },\n async run({ args }) {\n console.log(pc.cyan(' RynDesign Validate\\n'));\n\n const patterns = args.path ? [args.path as string] : ['tokens/**/*.tokens.json'];\n\n try {\n // Step 1: Parse and validate structure\n const tree = await readAndMergeTokenFiles(patterns);\n validateTree(tree);\n\n // Step 2: Build full token set for post-validation\n const tokenSet = await buildTokenSet({\n tokens: patterns,\n basePath: process.cwd(),\n });\n\n // Step 3: Post-resolution validation\n const issues = postValidate(tokenSet.tokens, tokenSet.themes);\n const errors = issues.filter(i => i.severity === 'error');\n const warnings = issues.filter(i => i.severity === 'warning');\n\n // Summary\n console.log(pc.green(` ${tokenSet.tokens.length} tokens resolved`));\n console.log(pc.green(` ${tokenSet.groups.length} groups`));\n const themeCount = Object.keys(tokenSet.themes.themes).length;\n if (themeCount > 0) {\n console.log(pc.green(` ${themeCount} theme(s): ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n if (errors.length > 0) {\n console.error(pc.red(`\\n ${errors.length} error(s):\\n`));\n for (const issue of errors) {\n console.error(` ${pc.red('x')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (warnings.length > 0) {\n console.log(pc.yellow(`\\n ${warnings.length} warning(s):\\n`));\n for (const issue of warnings) {\n console.log(` ${pc.yellow('!')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (errors.length === 0 && warnings.length === 0) {\n console.log(pc.green('\\n All tokens are valid!'));\n } else if (errors.length === 0) {\n console.log(pc.green('\\n Tokens are valid (with warnings)'));\n }\n\n // --strict: exit with error if any warnings\n if (args.strict && (errors.length > 0 || warnings.length > 0)) {\n process.exit(1);\n }\n if (errors.length > 0) {\n process.exit(1);\n }\n } catch (err) {\n if (err instanceof TokenValidationError) {\n console.error(pc.red(` Validation failed with ${err.errors.length} issue(s):\\n`));\n for (const issue of err.errors) {\n const icon = issue.severity === 'error' ? pc.red('x') : pc.yellow('!');\n console.error(` ${icon} ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n throw err;\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\n\nexport default defineCommand({\n meta: {\n name: 'preview',\n description: 'Start the design system preview server',\n },\n args: {\n port: {\n type: 'string',\n description: 'Port to run the preview server on',\n default: '4400',\n },\n open: {\n type: 'boolean',\n description: 'Open browser automatically',\n default: true,\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🖥 RynDesign Preview\\n'));\n\n try {\n const { startPreviewServer } = await import('@ryndesign/preview');\n await startPreviewServer({\n port: parseInt(args.port as string, 10),\n open: args.open as boolean,\n });\n } catch {\n console.log(pc.yellow('Preview package not found. Install @ryndesign/preview'));\n console.log(pc.gray(' pnpm add @ryndesign/preview'));\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst AVAILABLE_COMPONENTS = ['button', 'input', 'card', 'checkbox', 'toggle', 'badge', 'avatar'];\n\n// Token dependencies for each component\nconst COMPONENT_TOKENS: Record<string, Record<string, any>> = {\n button: {\n 'component.button': {\n $type: 'color',\n primary: {\n background: { $value: '{color.primary}' },\n text: { $value: '{color.white}' },\n hover: { background: { $value: '{color.primary}' } },\n pressed: { background: { $value: '{color.primary}' } },\n },\n secondary: {\n background: { $value: '{color.secondary}' },\n text: { $value: '{color.white}' },\n },\n borderRadius: { $type: 'dimension', $value: '8px' },\n sm: { paddingX: { $type: 'dimension', $value: '12px' }, paddingY: { $type: 'dimension', $value: '6px' }, fontSize: { $type: 'dimension', $value: '14px' } },\n md: { paddingX: { $type: 'dimension', $value: '16px' }, paddingY: { $type: 'dimension', $value: '10px' }, fontSize: { $type: 'dimension', $value: '16px' } },\n lg: { paddingX: { $type: 'dimension', $value: '24px' }, paddingY: { $type: 'dimension', $value: '14px' }, fontSize: { $type: 'dimension', $value: '18px' } },\n disabled: { background: { $value: '{color.gray.300}' } },\n },\n },\n};\n\nexport default defineCommand({\n meta: {\n name: 'add',\n description: 'Add a component definition',\n },\n args: {\n name: {\n type: 'positional',\n description: 'Component name to add',\n required: false,\n },\n 'with-tokens': {\n type: 'boolean',\n description: 'Also scaffold component tokens',\n default: false,\n },\n },\n async run({ args }) {\n const name = args.name as string || await p.select({\n message: 'Choose a component to add:',\n options: AVAILABLE_COMPONENTS.map(c => ({\n value: c,\n label: c.charAt(0).toUpperCase() + c.slice(1),\n })),\n }) as string;\n\n if (p.isCancel(name)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const cwd = process.cwd();\n const componentsDir = path.join(cwd, 'components');\n await fs.mkdir(componentsDir, { recursive: true });\n\n const destPath = path.join(componentsDir, `${name}.component.json`);\n\n // Check if already exists\n try {\n await fs.access(destPath);\n console.log(pc.yellow(`Component ${name} already exists at ${destPath}`));\n return;\n } catch {\n // Doesn't exist, proceed\n }\n\n // Try to copy from bundled components\n let copied = false;\n const searchPaths = [\n path.resolve(__dirname, `../../components/${name}.component.json`),\n // ESM fallback\n typeof __dirname !== 'undefined'\n ? path.resolve(__dirname, `../../components/${name}.component.json`)\n : path.resolve(new URL('.', import.meta.url).pathname, `../../components/${name}.component.json`),\n ];\n\n for (const srcPath of searchPaths) {\n try {\n const content = await fs.readFile(srcPath, 'utf-8');\n await fs.writeFile(destPath, content);\n console.log(pc.green(` Added ${name} component to ${destPath}`));\n copied = true;\n break;\n } catch {\n continue;\n }\n }\n\n if (!copied) {\n console.error(pc.red(`Component \"${name}\" not found in available components.`));\n console.log(pc.gray(`Available: ${AVAILABLE_COMPONENTS.join(', ')}`));\n return;\n }\n\n // Scaffold component tokens if requested\n const withTokens = args['with-tokens'] as boolean;\n if (withTokens && COMPONENT_TOKENS[name]) {\n const tokensDir = path.join(cwd, 'tokens');\n await fs.mkdir(tokensDir, { recursive: true });\n const tokenFile = path.join(tokensDir, `${name}.tokens.json`);\n\n try {\n await fs.access(tokenFile);\n console.log(pc.yellow(` Token file already exists: ${tokenFile}`));\n } catch {\n await fs.writeFile(tokenFile, JSON.stringify(COMPONENT_TOKENS[name], null, 2));\n console.log(pc.green(` Created component tokens: ${tokenFile}`));\n }\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'pull',\n description: 'Pull design tokens from Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n merge: {\n type: 'boolean',\n description: 'Merge with existing local tokens instead of overwriting',\n default: false,\n },\n strategy: {\n type: 'string',\n description: 'Merge strategy: prefer-remote, prefer-local, remote-only-new',\n default: 'prefer-remote',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📥 Figma Pull\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n const shouldMerge = args.merge as boolean;\n const strategy = args.strategy as string;\n const validStrategies = ['prefer-remote', 'prefer-local', 'remote-only-new'];\n if (shouldMerge && !validStrategies.includes(strategy)) {\n console.error(pc.red(`Invalid merge strategy \"${strategy}\". Use: ${validStrategies.join(', ')}`));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, mapFigmaToTokens, resolveFigmaModes, mergeTokens } = await import('@ryndesign/figma');\n\n console.log(pc.gray('Fetching variables from Figma...'));\n\n const variables = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n console.log(pc.green(`✓ Fetched ${variables.length} variables`));\n\n const cwd = process.cwd();\n const modeMapping = config?.figma?.modeMapping;\n\n if (modeMapping) {\n // Resolve modes into separate files\n const modeFiles = resolveFigmaModes(variables, modeMapping);\n\n for (const [filePath, tree] of Object.entries(modeFiles)) {\n const absolutePath = path.resolve(cwd, filePath);\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(absolutePath);\n if (existing) {\n // For mode files, filter tokens belonging to this mode\n const modeTokens = variables.filter(t => {\n const modeName = Object.keys(modeMapping).find(m => modeMapping[m] === filePath);\n return modeName && t.modes[modeName] !== undefined;\n });\n\n const result = mergeTokens(existing, modeTokens, { strategy: strategy as any });\n await fs.writeFile(absolutePath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged ${filePath}`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n continue;\n }\n }\n\n await fs.writeFile(absolutePath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written ${filePath}`));\n }\n } else {\n // Write all to single file\n const outPath = path.resolve(cwd, 'tokens/figma.tokens.json');\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(outPath);\n if (existing) {\n const result = mergeTokens(existing, variables, { strategy: strategy as any });\n await fs.writeFile(outPath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged tokens/figma.tokens.json`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n } else {\n // No existing file, write fresh\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n } else {\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n }\n\n console.log(pc.green('\\n✓ Figma pull complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n\nasync function readJsonSafe(absolutePath: string): Promise<Record<string, unknown> | null> {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { buildTokenSet } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'push',\n description: 'Push design tokens to Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📤 Figma Push\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n try {\n const { pushVariablesToFigma } = await import('@ryndesign/figma');\n\n const cwd = process.cwd();\n console.log(pc.gray('Building token set...'));\n\n const tokenSet = await buildTokenSet({\n tokens: config?.tokens ?? ['tokens/**/*.tokens.json'],\n basePath: cwd,\n themes: config?.themes as any,\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n console.log(pc.gray('Pushing to Figma...'));\n\n const darkTokens = tokenSet.themes.themes['dark']?.tokens;\n\n await pushVariablesToFigma({\n fileKey,\n personalAccessToken: pat,\n tokens: tokenSet.tokens,\n darkTokens,\n });\n\n console.log(pc.green('\\n✓ Figma push complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { buildTokenSet } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'diff',\n description: 'Compare local tokens with Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🔍 Figma Diff\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, diffFigmaTokens } = await import('@ryndesign/figma');\n\n const cwd = process.cwd();\n\n // Build local tokens\n console.log(pc.gray('Building local token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config?.tokens ?? ['tokens/**/*.tokens.json'],\n basePath: cwd,\n themes: config?.themes as any,\n });\n\n // Fetch remote tokens\n console.log(pc.gray('Fetching Figma variables...'));\n const remoteTokens = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n // Diff\n const result = diffFigmaTokens(tokenSet.tokens, remoteTokens);\n\n // Display results\n if (result.added.length > 0) {\n console.log(pc.green(`\\n+ Added (local only): ${result.added.length}`));\n for (const entry of result.added) {\n console.log(pc.green(` + ${entry.path}: ${JSON.stringify(entry.local)}`));\n }\n }\n\n if (result.removed.length > 0) {\n console.log(pc.red(`\\n- Removed (Figma only): ${result.removed.length}`));\n for (const entry of result.removed) {\n console.log(pc.red(` - ${entry.path}: ${JSON.stringify(entry.remote)}`));\n }\n }\n\n if (result.modified.length > 0) {\n console.log(pc.yellow(`\\n~ Modified: ${result.modified.length}`));\n for (const entry of result.modified) {\n console.log(pc.yellow(` ~ ${entry.path}: ${JSON.stringify(entry.local)} ← ${JSON.stringify(entry.remote)}`));\n }\n }\n\n console.log(pc.gray(`\\n Unchanged: ${result.unchanged}`));\n\n const total = result.added.length + result.removed.length + result.modified.length;\n if (total === 0) {\n console.log(pc.green('\\n✓ Local and Figma tokens are in sync!'));\n } else {\n console.log(pc.yellow(`\\n${total} difference(s) found.`));\n }\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'figma',\n description: 'Figma integration commands',\n },\n subCommands: {\n pull: () => import('./figma-pull.js').then(m => m.default),\n push: () => import('./figma-push.js').then(m => m.default),\n diff: () => import('./figma-diff.js').then(m => m.default),\n },\n});\n","import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst GENERATORS = ['react', 'vue', 'svelte', 'rails', 'swiftui', 'uikit', 'compose', 'android-view'];\n\nexport default defineCommand({\n meta: {\n name: 'eject',\n description: 'Eject a generator for customization',\n },\n args: {\n name: {\n type: 'positional',\n description: 'Generator name to eject',\n required: false,\n },\n },\n async run({ args }) {\n p.intro(pc.bgYellow(pc.black(' RynDesign Eject ')));\n\n const name = args.name as string || await p.select({\n message: 'Select a generator to eject:',\n options: GENERATORS.map(g => ({ value: g, label: `@ryndesign/generator-${g}` })),\n }) as string;\n\n if (p.isCancel(name)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n if (!GENERATORS.includes(name)) {\n console.error(pc.red(`Unknown generator: ${name}`));\n console.log(pc.gray(`Available: ${GENERATORS.join(', ')}`));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n const destDir = path.join(cwd, 'generators', name);\n\n // Check if already ejected\n try {\n await fs.access(destDir);\n console.error(pc.yellow(`Generator \"${name}\" already ejected at generators/${name}/`));\n process.exit(0);\n } catch {\n // Doesn't exist, proceed\n }\n\n const confirm = await p.confirm({\n message: `Eject @ryndesign/generator-${name} to generators/${name}/?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const s = p.spinner();\n s.start(`Ejecting generator-${name}...`);\n\n try {\n // Find the installed package source\n const pkgPath = require.resolve(`@ryndesign/generator-${name}/package.json`, {\n paths: [cwd],\n });\n const pkgDir = path.dirname(pkgPath);\n const srcDir = path.join(pkgDir, 'src');\n\n // Check if source exists; if not, copy dist\n let sourceDir: string;\n try {\n await fs.access(srcDir);\n sourceDir = srcDir;\n } catch {\n // Fallback to dist\n sourceDir = path.join(pkgDir, 'dist');\n }\n\n // Create destination\n await fs.mkdir(destDir, { recursive: true });\n\n // Copy files\n await copyDir(sourceDir, destDir);\n\n s.stop(`Generator ejected!`);\n\n p.note(\n [\n `Files copied to: ${pc.green(`generators/${name}/`)}`,\n '',\n 'Update your ryndesign.config.ts:',\n pc.gray(` import customGenerator from './generators/${name}/index.js';`),\n '',\n 'Replace the original generator with your custom one.',\n ].join('\\n'),\n 'Next steps'\n );\n } catch (err) {\n s.stop('Eject failed');\n console.error(pc.red(`Error: ${(err as Error).message}`));\n\n // Fallback: create a skeleton generator\n s.start('Creating skeleton generator...');\n await createSkeletonGenerator(destDir, name);\n s.stop('Skeleton generator created!');\n\n p.note(\n [\n `Skeleton created at: ${pc.green(`generators/${name}/`)}`,\n '',\n 'Customize the generator files and update your config.',\n ].join('\\n'),\n 'Next steps'\n );\n }\n\n p.outro(pc.green('Done!'));\n },\n});\n\nasync function copyDir(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\nasync function createSkeletonGenerator(dir: string, name: string): Promise<void> {\n const pascalName = name.charAt(0).toUpperCase() + name.slice(1).replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n\n const indexContent = `import type { GeneratorPlugin, GeneratorContext, GeneratedFile, ResolvedComponent } from '@ryndesign/plugin-api';\n\nexport default function ${name.replace(/-/g, '')}Generator(options = {}): GeneratorPlugin {\n return {\n name: '${name}',\n displayName: '${pascalName}',\n platform: 'web',\n outputExtensions: ['.ts', '.css'],\n\n async generateTokens(ctx: GeneratorContext): Promise<GeneratedFile[]> {\n // TODO: Implement token generation\n return [];\n },\n\n async generateComponent(comp: ResolvedComponent, ctx: GeneratorContext): Promise<GeneratedFile[]> {\n // TODO: Implement component generation\n return [];\n },\n };\n}\n`;\n\n await fs.writeFile(path.join(dir, 'index.ts'), indexContent, 'utf-8');\n}\n","#!/usr/bin/env node\nimport { runMain } from 'citty';\nimport { main } from './commands/main.js';\n\nrunMain(main);\n","import { defineCommand } from 'citty';\n\nexport const main = defineCommand({\n meta: {\n name: 'ryndesign',\n version: '0.1.0',\n description: 'Multi-platform design system generator',\n },\n subCommands: {\n init: () => import('./init.js').then(m => m.default),\n generate: () => import('./generate.js').then(m => m.default),\n validate: () => import('./validate.js').then(m => m.default),\n preview: () => import('./preview.js').then(m => m.default),\n add: () => import('./add.js').then(m => m.default),\n figma: () => import('./figma.js').then(m => m.default),\n eject: () => import('./eject.js').then(m => m.default),\n },\n});\n"],"mappings":"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","names":["pc","s","fs","path","path","fs","import_node_path","import_promises","import_citty","import_picocolors","import_node_path","import_promises","pc","path","fs","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","pc","import_citty","p","import_picocolors","import_promises","import_node_path","import_meta","path","fs","pc","fs","import_citty","import_picocolors","import_promises","import_node_path","pc","path","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","import_node_path","import_promises","fs","path","import_citty","p","import_picocolors","import_promises","import_node_path","pc","confirm","import_citty","import_citty"]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/init.ts","../src/config.ts","../src/commands/generate.ts","../src/commands/validate.ts","../src/commands/preview.ts","../src/commands/add.ts","../src/commands/figma-pull.ts","../src/commands/figma-push.ts","../src/commands/figma-diff.ts","../src/commands/figma.ts","../src/commands/eject.ts","../src/bin.ts","../src/commands/main.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport default defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new RynDesign project',\n },\n args: {\n template: {\n type: 'string',\n description: 'Template to use (minimal or full)',\n default: 'minimal',\n },\n platforms: {\n type: 'string',\n description: 'Comma-separated list of target platforms',\n },\n },\n async run({ args }) {\n p.intro(pc.bgCyan(pc.black(' RynDesign Init ')));\n\n const template = args.template || await p.select({\n message: 'Choose a template:',\n options: [\n { value: 'minimal', label: 'Minimal', hint: 'Basic color, spacing, typography tokens' },\n { value: 'full', label: 'Full', hint: 'Complete token set with shadows, borders, gradients' },\n ],\n }) as string;\n\n if (p.isCancel(template)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platformsInput = args.platforms || await p.multiselect({\n message: 'Select target platforms:',\n initialValues: ['react', 'swiftui'],\n options: [\n { value: 'react', label: 'React', hint: 'recommended' },\n { value: 'swiftui', label: 'SwiftUI', hint: 'recommended' },\n { value: 'vue', label: 'Vue' },\n { value: 'svelte', label: 'Svelte' },\n { value: 'rails', label: 'Rails' },\n { value: 'uikit', label: 'UIKit' },\n { value: 'compose', label: 'Jetpack Compose' },\n { value: 'android-view', label: 'Android View' },\n ],\n required: true,\n }) as string[];\n\n if (p.isCancel(platformsInput)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platforms = Array.isArray(platformsInput)\n ? platformsInput\n : (platformsInput as string).split(',').map(s => s.trim());\n\n const darkMode = await p.confirm({\n message: 'Enable dark mode support?',\n initialValue: true,\n });\n\n if (p.isCancel(darkMode)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const s = p.spinner();\n s.start('Creating project files...');\n\n const cwd = process.cwd();\n\n // Create directories\n await fs.mkdir(path.join(cwd, 'tokens'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'components'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'generated'), { recursive: true });\n\n // Copy template tokens\n // ESM-compatible path resolution\n const templateDir = path.resolve(\n typeof __dirname !== 'undefined'\n ? path.resolve(__dirname, '../../templates')\n : path.resolve(new URL('.', import.meta.url).pathname, '../../templates')\n );\n const templateFile = template === 'full' ? 'full.tokens.json' : 'minimal.tokens.json';\n\n try {\n const templateContent = await fs.readFile(\n path.join(templateDir, templateFile),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n templateContent\n );\n } catch {\n // If templates not found, create a basic one inline\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n JSON.stringify(getDefaultTokens(), null, 2)\n );\n }\n\n // Create semantic tokens\n await fs.writeFile(\n path.join(cwd, 'tokens', 'semantic.tokens.json'),\n JSON.stringify(getSemanticTokens(), null, 2)\n );\n\n // Create dark theme if enabled\n if (darkMode) {\n try {\n const darkContent = await fs.readFile(\n path.join(templateDir, 'dark.tokens.json'),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n darkContent\n );\n } catch {\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n JSON.stringify(getDarkTokens(), null, 2)\n );\n }\n }\n\n // Create config file\n const configContent = generateConfig(platforms, darkMode as boolean);\n await fs.writeFile(path.join(cwd, 'ryndesign.config.ts'), configContent);\n\n // Copy button component\n try {\n const buttonComp = await fs.readFile(\n path.join(templateDir, '../components/button.component.json'),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'components', 'button.component.json'),\n buttonComp\n );\n } catch {\n // Skip if not found\n }\n\n // Add generated/ to .gitignore\n const gitignorePath = path.join(cwd, '.gitignore');\n try {\n let gitignore = '';\n try {\n gitignore = await fs.readFile(gitignorePath, 'utf-8');\n } catch {\n // File doesn't exist yet\n }\n if (!gitignore.includes('generated/')) {\n gitignore += (gitignore.endsWith('\\n') || gitignore === '' ? '' : '\\n') + 'generated/\\n';\n await fs.writeFile(gitignorePath, gitignore);\n }\n } catch {\n // Skip if can't write .gitignore\n }\n\n // Add scripts to package.json if it exists\n try {\n const pkgJsonPath = path.join(cwd, 'package.json');\n const pkgContent = await fs.readFile(pkgJsonPath, 'utf-8');\n const pkg = JSON.parse(pkgContent);\n if (!pkg.scripts) pkg.scripts = {};\n if (!pkg.scripts['generate']) pkg.scripts['generate'] = 'ryndesign generate';\n if (!pkg.scripts['preview']) pkg.scripts['preview'] = 'ryndesign preview';\n await fs.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + '\\n');\n } catch {\n // Skip if no package.json or can't modify\n }\n\n s.stop('Project files created!');\n\n p.note(\n [\n `${pc.green('tokens/')} - Your design tokens`,\n `${pc.green('components/')} - Component definitions`,\n `${pc.green('generated/')} - Generated output (gitignored)`,\n `${pc.green('ryndesign.config.ts')} - Configuration`,\n ].join('\\n'),\n 'Project structure'\n );\n\n p.outro(pc.green('Run `ryndesign generate` to generate your design system!'));\n },\n});\n\nfunction generateConfig(platforms: string[], darkMode: boolean): string {\n const imports: string[] = [];\n const generators: string[] = [];\n\n for (const platform of platforms) {\n const pkgName = `@ryndesign/generator-${platform}`;\n const varName = platform.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n imports.push(`import ${varName} from '${pkgName}';`);\n\n if (['react', 'vue', 'svelte'].includes(platform)) {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n cssStrategy: 'css-variables',\n typescript: true,${darkMode ? \"\\n darkMode: 'media+class',\" : ''}\n })`);\n } else {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n })`);\n }\n }\n\n return `import { defineConfig } from '@ryndesign/cli';\n${imports.join('\\n')}\n\nexport default defineConfig({\n tokens: ['tokens/**/*.tokens.json'],\n components: ['components/**/*.component.json'],\n outDir: 'generated',\n${darkMode ? `\n themes: {\n default: 'light',\n dark: { file: 'tokens/dark.tokens.json' },\n },\n` : ''}\n generators: [\n${generators.join(',\\n')}\n ],\n\n preview: { port: 4400, open: true },\n});\n`;\n}\n\nfunction getDefaultTokens() {\n return {\n color: {\n $type: 'color',\n primary: { $value: '#3B82F6' },\n white: { $value: '#FFFFFF' },\n black: { $value: '#000000' },\n gray: {\n 50: { $value: '#F9FAFB' },\n 900: { $value: '#111827' },\n },\n },\n spacing: {\n $type: 'dimension',\n sm: { $value: '8px' },\n md: { $value: '16px' },\n lg: { $value: '24px' },\n },\n };\n}\n\nfunction getSemanticTokens() {\n return {\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.white}' },\n secondary: { $value: '{color.gray.50}' },\n },\n text: {\n primary: { $value: '{color.gray.900}' },\n },\n },\n };\n}\n\nfunction getDarkTokens() {\n return {\n $description: 'Dark theme overrides',\n $extensions: { 'com.ryndesign.theme': { name: 'dark', extends: 'default' } },\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.gray.900}' },\n secondary: { $value: '{color.gray.800}' },\n },\n text: {\n primary: { $value: '{color.gray.50}' },\n },\n },\n };\n}\n","import type { RynDesignConfig } from '@ryndesign/plugin-api';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\n\nconst CONFIG_NAMES = [\n 'ryndesign.config.ts',\n 'ryndesign.config.js',\n 'ryndesign.config.mjs',\n 'ryndesign.config.json',\n];\n\nexport async function loadConfig(configPath?: string): Promise<RynDesignConfig | null> {\n const cwd = process.cwd();\n\n // If explicit path provided, try only that\n if (configPath) {\n return loadConfigFile(path.resolve(cwd, configPath));\n }\n\n // Try each config name in order\n for (const name of CONFIG_NAMES) {\n const absolutePath = path.resolve(cwd, name);\n try {\n await fs.access(absolutePath);\n return loadConfigFile(absolutePath);\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nasync function loadConfigFile(absolutePath: string): Promise<RynDesignConfig | null> {\n try {\n await fs.access(absolutePath);\n } catch {\n return null;\n }\n\n // JSON config\n if (absolutePath.endsWith('.json')) {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n const config = JSON.parse(content) as RynDesignConfig;\n return validateConfig(config, absolutePath);\n } catch (err) {\n throw new Error(`Failed to parse config ${absolutePath}: ${(err as Error).message}`);\n }\n }\n\n // JS/TS config\n try {\n const { createJiti } = await import('jiti');\n const loader = createJiti(absolutePath, {\n interopDefault: true,\n });\n const config = await loader.import(absolutePath) as Record<string, unknown>;\n const resolved = (config.default ?? config) as RynDesignConfig;\n return validateConfig(resolved, absolutePath);\n } catch (err) {\n // Fallback: try dynamic import\n try {\n const mod = await import(absolutePath);\n const resolved = mod.default ?? mod;\n return validateConfig(resolved, absolutePath);\n } catch {\n throw new Error(`Failed to load config ${absolutePath}: ${(err as Error).message}`);\n }\n }\n}\n\nfunction validateConfig(config: RynDesignConfig, filePath: string): RynDesignConfig {\n if (!config.tokens || !Array.isArray(config.tokens) || config.tokens.length === 0) {\n throw new Error(`Invalid config in ${filePath}: \"tokens\" must be a non-empty array of glob patterns`);\n }\n\n if (config.components && !Array.isArray(config.components)) {\n throw new Error(`Invalid config in ${filePath}: \"components\" must be an array of glob patterns`);\n }\n\n if (config.generators && !Array.isArray(config.generators)) {\n throw new Error(`Invalid config in ${filePath}: \"generators\" must be an array`);\n }\n\n return config;\n}\n\n// Re-export defineConfig for convenience\nexport { defineConfig } from '@ryndesign/plugin-api';\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { buildTokenSet, loadComponents, resolveComponent, createGeneratorHelpers } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\nimport type { GeneratedFile, GeneratorPlugin } from '@ryndesign/plugin-api';\n\nexport default defineCommand({\n meta: {\n name: 'generate',\n description: 'Generate design system files for target platforms',\n },\n args: {\n platform: {\n type: 'string',\n alias: 'p',\n description: 'Comma-separated list of platforms to generate',\n },\n watch: {\n type: 'boolean',\n alias: 'w',\n description: 'Watch for changes and regenerate',\n default: false,\n },\n clean: {\n type: 'boolean',\n description: 'Clean output directory before generating',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Show what would be generated without writing files',\n default: false,\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n const dryRun = args['dry-run'] as boolean;\n console.log(pc.cyan(`⚡ RynDesign Generate${dryRun ? ' (dry run)' : ''}\\n`));\n\n const config = await loadConfig(args.config);\n if (!config) {\n console.error(pc.red('Config file not found. Run `ryndesign init` first.'));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Clean output directory if requested\n if (args.clean && config.outDir) {\n const outDir = path.resolve(cwd, config.outDir);\n await fs.rm(outDir, { recursive: true, force: true });\n await fs.mkdir(outDir, { recursive: true });\n console.log(pc.yellow(`Cleaned ${config.outDir}/`));\n }\n\n // Build token set\n console.log(pc.gray('Building token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n name: 'design-system',\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n if (Object.keys(tokenSet.themes.themes).length > 0) {\n console.log(pc.green(`✓ Resolved themes: ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n // Filter generators by platform if specified\n let generators = config.generators ?? [];\n if (args.platform) {\n const targetPlatforms = (args.platform as string).split(',').map(s => s.trim());\n generators = generators.filter(g => targetPlatforms.includes(g.name));\n }\n\n if (generators.length === 0) {\n console.log(pc.yellow('No generators configured. Add generators to your ryndesign.config.ts'));\n return;\n }\n\n // Load and resolve components\n const components = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n\n if (components.length > 0) {\n console.log(pc.green(`✓ Loaded ${components.length} component(s)`));\n }\n\n // Resolve all components\n const resolvedComponents = components.map(compDef => resolveComponent(compDef, tokenSet));\n\n // Run generators\n const allFiles: GeneratedFile[] = [];\n const summary: { name: string; files: number; bytes: number }[] = [];\n\n for (const generator of generators) {\n console.log(pc.gray(`\\nGenerating ${generator.displayName}...`));\n let genFiles = 0;\n let genBytes = 0;\n\n const ctx = {\n tokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: resolvedComponents,\n };\n\n try {\n // Generate tokens\n const tokenFiles = await generator.generateTokens(ctx);\n allFiles.push(...tokenFiles);\n\n for (const file of tokenFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n\n // Generate components\n for (const resolvedComp of resolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n allFiles.push(...compFiles);\n\n for (const file of compFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n }\n\n console.log(pc.green(` ✓ ${genFiles} files generated for ${generator.displayName}`));\n summary.push({ name: generator.displayName, files: genFiles, bytes: genBytes });\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName} failed: ${(err as Error).message}`));\n }\n }\n\n // Summary table\n if (summary.length > 0) {\n console.log(pc.gray('\\n Platform Files Size'));\n console.log(pc.gray(' ─────────────────────────────────'));\n for (const s of summary) {\n const sizeStr = s.bytes < 1024 ? `${s.bytes} B` : `${(s.bytes / 1024).toFixed(1)} KB`;\n console.log(` ${s.name.padEnd(18)} ${String(s.files).padStart(5)} ${sizeStr}`);\n }\n }\n\n // Run hooks\n if (config.hooks?.['generate:complete']) {\n await config.hooks['generate:complete'](allFiles);\n }\n\n console.log(pc.green(`\\n✓ Generation complete! ${allFiles.length} files ${dryRun ? 'would be written' : 'written'}.`));\n\n // Watch mode\n if (args.watch) {\n console.log(pc.cyan('\\nWatching for changes...'));\n const { watch } = await import('chokidar');\n const watchPatterns = [...config.tokens, ...(config.components ?? [])];\n const watcher = watch(watchPatterns, {\n cwd,\n ignoreInitial: true,\n });\n\n watcher.on('change', async (changedPath) => {\n console.log(pc.gray(`\\nFile changed: ${changedPath}`));\n try {\n const newTokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n });\n\n // Reload components\n const newComponents = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n const newResolvedComponents = newComponents.map(c => resolveComponent(c, newTokenSet));\n\n // Re-run generators\n for (const generator of generators) {\n try {\n const ctx = {\n tokenSet: newTokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: newResolvedComponents,\n };\n\n const tokenFiles = await generator.generateTokens(ctx);\n for (const file of tokenFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n\n for (const resolvedComp of newResolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n for (const file of compFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName}: ${(err as Error).message}`));\n }\n }\n console.log(pc.green('✓ Rebuilt and regenerated'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n }\n });\n }\n },\n});\n\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { readAndMergeTokenFiles, validateTree, buildTokenSet, postValidate, TokenValidationError } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'validate',\n description: 'Validate design token files',\n },\n args: {\n path: {\n type: 'positional',\n description: 'Path to token file(s)',\n required: false,\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n strict: {\n type: 'boolean',\n description: 'Treat warnings as errors',\n default: false,\n },\n },\n async run({ args }) {\n console.log(pc.cyan(' RynDesign Validate\\n'));\n\n const config = await loadConfig(args.config as string);\n const patterns = args.path\n ? [args.path as string]\n : config?.tokens ?? ['tokens/**/*.tokens.json'];\n\n try {\n // Step 1: Parse and validate structure\n const tree = await readAndMergeTokenFiles(patterns);\n validateTree(tree);\n\n // Step 2: Build full token set for post-validation\n const tokenSet = await buildTokenSet({\n tokens: patterns,\n basePath: process.cwd(),\n });\n\n // Step 3: Post-resolution validation\n const issues = postValidate(tokenSet.tokens, tokenSet.themes);\n const errors = issues.filter(i => i.severity === 'error');\n const warnings = issues.filter(i => i.severity === 'warning');\n\n // Summary\n console.log(pc.green(` ${tokenSet.tokens.length} tokens resolved`));\n console.log(pc.green(` ${tokenSet.groups.length} groups`));\n const themeCount = Object.keys(tokenSet.themes.themes).length;\n if (themeCount > 0) {\n console.log(pc.green(` ${themeCount} theme(s): ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n if (errors.length > 0) {\n console.error(pc.red(`\\n ${errors.length} error(s):\\n`));\n for (const issue of errors) {\n console.error(` ${pc.red('x')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (warnings.length > 0) {\n console.log(pc.yellow(`\\n ${warnings.length} warning(s):\\n`));\n for (const issue of warnings) {\n console.log(` ${pc.yellow('!')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (errors.length === 0 && warnings.length === 0) {\n console.log(pc.green('\\n All tokens are valid!'));\n } else if (errors.length === 0) {\n console.log(pc.green('\\n Tokens are valid (with warnings)'));\n }\n\n // --strict: exit with error if any warnings\n if (args.strict && (errors.length > 0 || warnings.length > 0)) {\n process.exit(1);\n }\n if (errors.length > 0) {\n process.exit(1);\n }\n } catch (err) {\n if (err instanceof TokenValidationError) {\n console.error(pc.red(` Validation failed with ${err.errors.length} issue(s):\\n`));\n for (const issue of err.errors) {\n const icon = issue.severity === 'error' ? pc.red('x') : pc.yellow('!');\n console.error(` ${icon} ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n throw err;\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'preview',\n description: 'Start the design system preview server',\n },\n args: {\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n port: {\n type: 'string',\n description: 'Port to run the preview server on',\n },\n open: {\n type: 'boolean',\n description: 'Open browser automatically',\n default: true,\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🖥 RynDesign Preview\\n'));\n\n const config = await loadConfig(args.config as string);\n const port = args.port\n ? parseInt(args.port as string, 10)\n : config?.preview?.port ?? 4400;\n\n try {\n const { startPreviewServer } = await import('@ryndesign/preview');\n await startPreviewServer({\n port,\n open: args.open as boolean,\n });\n } catch {\n console.log(pc.yellow('Preview package not found. Install @ryndesign/preview'));\n console.log(pc.gray(' pnpm add @ryndesign/preview'));\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst AVAILABLE_COMPONENTS = ['button', 'input', 'card', 'checkbox', 'toggle', 'badge', 'avatar'];\n\n// Token dependencies for each component\nconst COMPONENT_TOKENS: Record<string, Record<string, any>> = {\n button: {\n 'component.button': {\n $type: 'color',\n primary: {\n background: { $value: '{color.primary}' },\n text: { $value: '{color.white}' },\n hover: { background: { $value: '{color.primary}' } },\n pressed: { background: { $value: '{color.primary}' } },\n },\n secondary: {\n background: { $value: '{color.secondary}' },\n text: { $value: '{color.white}' },\n },\n borderRadius: { $type: 'dimension', $value: '8px' },\n sm: { paddingX: { $type: 'dimension', $value: '12px' }, paddingY: { $type: 'dimension', $value: '6px' }, fontSize: { $type: 'dimension', $value: '14px' } },\n md: { paddingX: { $type: 'dimension', $value: '16px' }, paddingY: { $type: 'dimension', $value: '10px' }, fontSize: { $type: 'dimension', $value: '16px' } },\n lg: { paddingX: { $type: 'dimension', $value: '24px' }, paddingY: { $type: 'dimension', $value: '14px' }, fontSize: { $type: 'dimension', $value: '18px' } },\n disabled: { background: { $value: '{color.gray.300}' } },\n },\n },\n};\n\nexport default defineCommand({\n meta: {\n name: 'add',\n description: 'Add a component definition',\n },\n args: {\n name: {\n type: 'positional',\n description: 'Component name to add',\n required: false,\n },\n 'with-tokens': {\n type: 'boolean',\n description: 'Also scaffold component tokens',\n default: false,\n },\n },\n async run({ args }) {\n const name = args.name as string || await p.select({\n message: 'Choose a component to add:',\n options: AVAILABLE_COMPONENTS.map(c => ({\n value: c,\n label: c.charAt(0).toUpperCase() + c.slice(1),\n })),\n }) as string;\n\n if (p.isCancel(name)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const cwd = process.cwd();\n const componentsDir = path.join(cwd, 'components');\n await fs.mkdir(componentsDir, { recursive: true });\n\n const destPath = path.join(componentsDir, `${name}.component.json`);\n\n // Check if already exists\n try {\n await fs.access(destPath);\n console.log(pc.yellow(`Component ${name} already exists at ${destPath}`));\n return;\n } catch {\n // Doesn't exist, proceed\n }\n\n // Try to copy from bundled components\n let copied = false;\n const searchPaths = [\n path.resolve(__dirname, `../../components/${name}.component.json`),\n // ESM fallback\n typeof __dirname !== 'undefined'\n ? path.resolve(__dirname, `../../components/${name}.component.json`)\n : path.resolve(new URL('.', import.meta.url).pathname, `../../components/${name}.component.json`),\n ];\n\n for (const srcPath of searchPaths) {\n try {\n const content = await fs.readFile(srcPath, 'utf-8');\n await fs.writeFile(destPath, content);\n console.log(pc.green(` Added ${name} component to ${destPath}`));\n copied = true;\n break;\n } catch {\n continue;\n }\n }\n\n if (!copied) {\n console.error(pc.red(`Component \"${name}\" not found in available components.`));\n console.log(pc.gray(`Available: ${AVAILABLE_COMPONENTS.join(', ')}`));\n return;\n }\n\n // Scaffold component tokens if requested\n const withTokens = args['with-tokens'] as boolean;\n if (withTokens && COMPONENT_TOKENS[name]) {\n const tokensDir = path.join(cwd, 'tokens');\n await fs.mkdir(tokensDir, { recursive: true });\n const tokenFile = path.join(tokensDir, `${name}.tokens.json`);\n\n try {\n await fs.access(tokenFile);\n console.log(pc.yellow(` Token file already exists: ${tokenFile}`));\n } catch {\n await fs.writeFile(tokenFile, JSON.stringify(COMPONENT_TOKENS[name], null, 2));\n console.log(pc.green(` Created component tokens: ${tokenFile}`));\n }\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'pull',\n description: 'Pull design tokens from Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n output: {\n type: 'string',\n alias: 'o',\n description: 'Output file path',\n default: 'tokens/figma.tokens.json',\n },\n merge: {\n type: 'boolean',\n description: 'Merge with existing local tokens instead of overwriting',\n default: false,\n },\n strategy: {\n type: 'string',\n description: 'Merge strategy: prefer-remote, prefer-local, remote-only-new',\n default: 'prefer-remote',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📥 Figma Pull\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n const shouldMerge = args.merge as boolean;\n const strategy = args.strategy as string;\n const validStrategies = ['prefer-remote', 'prefer-local', 'remote-only-new'];\n if (shouldMerge && !validStrategies.includes(strategy)) {\n console.error(pc.red(`Invalid merge strategy \"${strategy}\". Use: ${validStrategies.join(', ')}`));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, mapFigmaToTokens, resolveFigmaModes, mergeTokens } = await import('@ryndesign/figma');\n\n console.log(pc.gray('Fetching variables from Figma...'));\n\n const variables = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n console.log(pc.green(`✓ Fetched ${variables.length} variables`));\n\n const cwd = process.cwd();\n const modeMapping = config?.figma?.modeMapping;\n\n if (modeMapping) {\n // Resolve modes into separate files\n const modeFiles = resolveFigmaModes(variables, modeMapping);\n\n for (const [filePath, tree] of Object.entries(modeFiles)) {\n const absolutePath = path.resolve(cwd, filePath);\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(absolutePath);\n if (existing) {\n // For mode files, filter tokens belonging to this mode\n const modeTokens = variables.filter(t => {\n const modeName = Object.keys(modeMapping).find(m => modeMapping[m] === filePath);\n return modeName && t.modes[modeName] !== undefined;\n });\n\n const result = mergeTokens(existing, modeTokens, { strategy: strategy as any });\n await fs.writeFile(absolutePath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged ${filePath}`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n continue;\n }\n }\n\n await fs.writeFile(absolutePath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written ${filePath}`));\n }\n } else {\n // Write all to single file\n const outPath = path.resolve(cwd, args.output as string);\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(outPath);\n if (existing) {\n const result = mergeTokens(existing, variables, { strategy: strategy as any });\n await fs.writeFile(outPath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged tokens/figma.tokens.json`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n } else {\n // No existing file, write fresh\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n } else {\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n }\n\n console.log(pc.green('\\n✓ Figma pull complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n\nasync function readJsonSafe(absolutePath: string): Promise<Record<string, unknown> | null> {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { buildTokenSet } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'push',\n description: 'Push design tokens to Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📤 Figma Push\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n try {\n const { pushVariablesToFigma } = await import('@ryndesign/figma');\n\n const cwd = process.cwd();\n console.log(pc.gray('Building token set...'));\n\n const tokenSet = await buildTokenSet({\n tokens: config?.tokens ?? ['tokens/**/*.tokens.json'],\n basePath: cwd,\n themes: config?.themes as any,\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n console.log(pc.gray('Pushing to Figma...'));\n\n const darkTokens = tokenSet.themes.themes['dark']?.tokens;\n\n await pushVariablesToFigma({\n fileKey,\n personalAccessToken: pat,\n tokens: tokenSet.tokens,\n darkTokens,\n });\n\n console.log(pc.green('\\n✓ Figma push complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { buildTokenSet } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'diff',\n description: 'Compare local tokens with Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🔍 Figma Diff\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, diffFigmaTokens } = await import('@ryndesign/figma');\n\n const cwd = process.cwd();\n\n // Build local tokens\n console.log(pc.gray('Building local token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config?.tokens ?? ['tokens/**/*.tokens.json'],\n basePath: cwd,\n themes: config?.themes as any,\n });\n\n // Fetch remote tokens\n console.log(pc.gray('Fetching Figma variables...'));\n const remoteTokens = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n // Diff\n const result = diffFigmaTokens(tokenSet.tokens, remoteTokens);\n\n // Display results\n if (result.added.length > 0) {\n console.log(pc.green(`\\n+ Added (local only): ${result.added.length}`));\n for (const entry of result.added) {\n console.log(pc.green(` + ${entry.path}: ${JSON.stringify(entry.local)}`));\n }\n }\n\n if (result.removed.length > 0) {\n console.log(pc.red(`\\n- Removed (Figma only): ${result.removed.length}`));\n for (const entry of result.removed) {\n console.log(pc.red(` - ${entry.path}: ${JSON.stringify(entry.remote)}`));\n }\n }\n\n if (result.modified.length > 0) {\n console.log(pc.yellow(`\\n~ Modified: ${result.modified.length}`));\n for (const entry of result.modified) {\n console.log(pc.yellow(` ~ ${entry.path}: ${JSON.stringify(entry.local)} ← ${JSON.stringify(entry.remote)}`));\n }\n }\n\n console.log(pc.gray(`\\n Unchanged: ${result.unchanged}`));\n\n const total = result.added.length + result.removed.length + result.modified.length;\n if (total === 0) {\n console.log(pc.green('\\n✓ Local and Figma tokens are in sync!'));\n } else {\n console.log(pc.yellow(`\\n${total} difference(s) found.`));\n }\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'figma',\n description: 'Figma integration commands',\n },\n subCommands: {\n pull: () => import('./figma-pull.js').then(m => m.default),\n push: () => import('./figma-push.js').then(m => m.default),\n diff: () => import('./figma-diff.js').then(m => m.default),\n },\n});\n","import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst GENERATORS = ['react', 'vue', 'svelte', 'rails', 'swiftui', 'uikit', 'compose', 'android-view'];\n\nexport default defineCommand({\n meta: {\n name: 'eject',\n description: 'Eject a generator for customization',\n },\n args: {\n name: {\n type: 'positional',\n description: 'Generator name to eject',\n required: false,\n },\n },\n async run({ args }) {\n p.intro(pc.bgYellow(pc.black(' RynDesign Eject ')));\n\n const name = args.name as string || await p.select({\n message: 'Select a generator to eject:',\n options: GENERATORS.map(g => ({ value: g, label: `@ryndesign/generator-${g}` })),\n }) as string;\n\n if (p.isCancel(name)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n if (!GENERATORS.includes(name)) {\n console.error(pc.red(`Unknown generator: ${name}`));\n console.log(pc.gray(`Available: ${GENERATORS.join(', ')}`));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n const destDir = path.join(cwd, 'generators', name);\n\n // Check if already ejected\n try {\n await fs.access(destDir);\n console.error(pc.yellow(`Generator \"${name}\" already ejected at generators/${name}/`));\n process.exit(0);\n } catch {\n // Doesn't exist, proceed\n }\n\n const confirm = await p.confirm({\n message: `Eject @ryndesign/generator-${name} to generators/${name}/?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const s = p.spinner();\n s.start(`Ejecting generator-${name}...`);\n\n try {\n // Find the installed package source\n const pkgPath = require.resolve(`@ryndesign/generator-${name}/package.json`, {\n paths: [cwd],\n });\n const pkgDir = path.dirname(pkgPath);\n const srcDir = path.join(pkgDir, 'src');\n\n // Check if source exists; if not, copy dist\n let sourceDir: string;\n try {\n await fs.access(srcDir);\n sourceDir = srcDir;\n } catch {\n // Fallback to dist\n sourceDir = path.join(pkgDir, 'dist');\n }\n\n // Create destination\n await fs.mkdir(destDir, { recursive: true });\n\n // Copy files\n await copyDir(sourceDir, destDir);\n\n s.stop(`Generator ejected!`);\n\n p.note(\n [\n `Files copied to: ${pc.green(`generators/${name}/`)}`,\n '',\n 'Update your ryndesign.config.ts:',\n pc.gray(` import customGenerator from './generators/${name}/index.js';`),\n '',\n 'Replace the original generator with your custom one.',\n ].join('\\n'),\n 'Next steps'\n );\n } catch (err) {\n s.stop('Eject failed');\n console.error(pc.red(`Error: ${(err as Error).message}`));\n\n // Fallback: create a skeleton generator\n s.start('Creating skeleton generator...');\n await createSkeletonGenerator(destDir, name);\n s.stop('Skeleton generator created!');\n\n p.note(\n [\n `Skeleton created at: ${pc.green(`generators/${name}/`)}`,\n '',\n 'Customize the generator files and update your config.',\n ].join('\\n'),\n 'Next steps'\n );\n }\n\n p.outro(pc.green('Done!'));\n },\n});\n\nasync function copyDir(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\nasync function createSkeletonGenerator(dir: string, name: string): Promise<void> {\n const pascalName = name.charAt(0).toUpperCase() + name.slice(1).replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n\n const indexContent = `import type { GeneratorPlugin, GeneratorContext, GeneratedFile, ResolvedComponent } from '@ryndesign/plugin-api';\n\nexport default function ${name.replace(/-/g, '')}Generator(options = {}): GeneratorPlugin {\n return {\n name: '${name}',\n displayName: '${pascalName}',\n platform: 'web',\n outputExtensions: ['.ts', '.css'],\n\n async generateTokens(ctx: GeneratorContext): Promise<GeneratedFile[]> {\n // TODO: Implement token generation\n return [];\n },\n\n async generateComponent(comp: ResolvedComponent, ctx: GeneratorContext): Promise<GeneratedFile[]> {\n // TODO: Implement component generation\n return [];\n },\n };\n}\n`;\n\n await fs.writeFile(path.join(dir, 'index.ts'), indexContent, 'utf-8');\n}\n","#!/usr/bin/env node\nimport { runMain } from 'citty';\nimport { main } from './commands/main.js';\n\nrunMain(main);\n","import { defineCommand } from 'citty';\n\nexport const main = defineCommand({\n meta: {\n name: 'ryndesign',\n version: '0.1.0',\n description: 'Multi-platform design system generator',\n },\n subCommands: {\n init: () => import('./init.js').then(m => m.default),\n generate: () => import('./generate.js').then(m => m.default),\n validate: () => import('./validate.js').then(m => m.default),\n preview: () => import('./preview.js').then(m => m.default),\n add: () => import('./add.js').then(m => m.default),\n figma: () => import('./figma.js').then(m => m.default),\n eject: () => import('./eject.js').then(m => m.default),\n },\n});\n"],"mappings":"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","names":["pc","s","fs","path","path","fs","import_node_path","import_promises","import_citty","import_picocolors","import_node_path","import_promises","pc","path","fs","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","pc","import_citty","p","import_picocolors","import_promises","import_node_path","import_meta","path","fs","pc","fs","import_citty","import_picocolors","import_promises","import_node_path","pc","path","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","import_node_path","import_promises","fs","path","import_citty","p","import_picocolors","import_promises","import_node_path","pc","confirm","import_citty","import_citty"]}
|
package/dist/bin.js
CHANGED
|
@@ -14,11 +14,11 @@ var main = defineCommand({
|
|
|
14
14
|
},
|
|
15
15
|
subCommands: {
|
|
16
16
|
init: () => import("./init-AIT7XEQS.js").then((m) => m.default),
|
|
17
|
-
generate: () => import("./generate-
|
|
18
|
-
validate: () => import("./validate-
|
|
19
|
-
preview: () => import("./preview-
|
|
17
|
+
generate: () => import("./generate-KMAQLQTY.js").then((m) => m.default),
|
|
18
|
+
validate: () => import("./validate-DNJX65QZ.js").then((m) => m.default),
|
|
19
|
+
preview: () => import("./preview-2A5EQQWG.js").then((m) => m.default),
|
|
20
20
|
add: () => import("./add-ZYIVP5Z5.js").then((m) => m.default),
|
|
21
|
-
figma: () => import("./figma-
|
|
21
|
+
figma: () => import("./figma-CNDSVB36.js").then((m) => m.default),
|
|
22
22
|
eject: () => import("./eject-WIEISNL6.js").then((m) => m.default)
|
|
23
23
|
}
|
|
24
24
|
});
|
|
@@ -12,7 +12,7 @@ var figma_default = defineCommand({
|
|
|
12
12
|
description: "Figma integration commands"
|
|
13
13
|
},
|
|
14
14
|
subCommands: {
|
|
15
|
-
pull: () => import("./figma-pull-
|
|
15
|
+
pull: () => import("./figma-pull-4GFVG5YD.js").then((m) => m.default),
|
|
16
16
|
push: () => import("./figma-push-X4PSMN62.js").then((m) => m.default),
|
|
17
17
|
diff: () => import("./figma-diff-SNSMOAZX.js").then((m) => m.default)
|
|
18
18
|
}
|
|
@@ -20,4 +20,4 @@ var figma_default = defineCommand({
|
|
|
20
20
|
export {
|
|
21
21
|
figma_default as default
|
|
22
22
|
};
|
|
23
|
-
//# sourceMappingURL=figma-
|
|
23
|
+
//# sourceMappingURL=figma-CNDSVB36.js.map
|
|
@@ -24,9 +24,16 @@ var figma_pull_default = defineCommand({
|
|
|
24
24
|
},
|
|
25
25
|
config: {
|
|
26
26
|
type: "string",
|
|
27
|
+
alias: "c",
|
|
27
28
|
description: "Path to config file",
|
|
28
29
|
default: "ryndesign.config.ts"
|
|
29
30
|
},
|
|
31
|
+
output: {
|
|
32
|
+
type: "string",
|
|
33
|
+
alias: "o",
|
|
34
|
+
description: "Output file path",
|
|
35
|
+
default: "tokens/figma.tokens.json"
|
|
36
|
+
},
|
|
30
37
|
merge: {
|
|
31
38
|
type: "boolean",
|
|
32
39
|
description: "Merge with existing local tokens instead of overwriting",
|
|
@@ -90,7 +97,7 @@ var figma_pull_default = defineCommand({
|
|
|
90
97
|
console.log(pc.green(` \u2713 Written ${filePath}`));
|
|
91
98
|
}
|
|
92
99
|
} else {
|
|
93
|
-
const outPath = path.resolve(cwd,
|
|
100
|
+
const outPath = path.resolve(cwd, args.output);
|
|
94
101
|
await fs.mkdir(path.dirname(outPath), { recursive: true });
|
|
95
102
|
if (shouldMerge) {
|
|
96
103
|
const existing = await readJsonSafe(outPath);
|
|
@@ -127,4 +134,4 @@ async function readJsonSafe(absolutePath) {
|
|
|
127
134
|
export {
|
|
128
135
|
figma_pull_default as default
|
|
129
136
|
};
|
|
130
|
-
//# sourceMappingURL=figma-pull-
|
|
137
|
+
//# sourceMappingURL=figma-pull-4GFVG5YD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/figma-pull.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'pull',\n description: 'Pull design tokens from Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n output: {\n type: 'string',\n alias: 'o',\n description: 'Output file path',\n default: 'tokens/figma.tokens.json',\n },\n merge: {\n type: 'boolean',\n description: 'Merge with existing local tokens instead of overwriting',\n default: false,\n },\n strategy: {\n type: 'string',\n description: 'Merge strategy: prefer-remote, prefer-local, remote-only-new',\n default: 'prefer-remote',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📥 Figma Pull\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n const shouldMerge = args.merge as boolean;\n const strategy = args.strategy as string;\n const validStrategies = ['prefer-remote', 'prefer-local', 'remote-only-new'];\n if (shouldMerge && !validStrategies.includes(strategy)) {\n console.error(pc.red(`Invalid merge strategy \"${strategy}\". Use: ${validStrategies.join(', ')}`));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, mapFigmaToTokens, resolveFigmaModes, mergeTokens } = await import('@ryndesign/figma');\n\n console.log(pc.gray('Fetching variables from Figma...'));\n\n const variables = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n console.log(pc.green(`✓ Fetched ${variables.length} variables`));\n\n const cwd = process.cwd();\n const modeMapping = config?.figma?.modeMapping;\n\n if (modeMapping) {\n // Resolve modes into separate files\n const modeFiles = resolveFigmaModes(variables, modeMapping);\n\n for (const [filePath, tree] of Object.entries(modeFiles)) {\n const absolutePath = path.resolve(cwd, filePath);\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(absolutePath);\n if (existing) {\n // For mode files, filter tokens belonging to this mode\n const modeTokens = variables.filter(t => {\n const modeName = Object.keys(modeMapping).find(m => modeMapping[m] === filePath);\n return modeName && t.modes[modeName] !== undefined;\n });\n\n const result = mergeTokens(existing, modeTokens, { strategy: strategy as any });\n await fs.writeFile(absolutePath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged ${filePath}`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n continue;\n }\n }\n\n await fs.writeFile(absolutePath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written ${filePath}`));\n }\n } else {\n // Write all to single file\n const outPath = path.resolve(cwd, args.output as string);\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(outPath);\n if (existing) {\n const result = mergeTokens(existing, variables, { strategy: strategy as any });\n await fs.writeFile(outPath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged tokens/figma.tokens.json`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n } else {\n // No existing file, write fresh\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n } else {\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n }\n\n console.log(pc.green('\\n✓ Figma pull complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n\nasync function readJsonSafe(absolutePath: string): Promise<Record<string, unknown> | null> {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -15,12 +15,14 @@ var generate_default = defineCommand({
|
|
|
15
15
|
description: "Generate design system files for target platforms"
|
|
16
16
|
},
|
|
17
17
|
args: {
|
|
18
|
-
|
|
18
|
+
platform: {
|
|
19
19
|
type: "string",
|
|
20
|
+
alias: "p",
|
|
20
21
|
description: "Comma-separated list of platforms to generate"
|
|
21
22
|
},
|
|
22
23
|
watch: {
|
|
23
24
|
type: "boolean",
|
|
25
|
+
alias: "w",
|
|
24
26
|
description: "Watch for changes and regenerate",
|
|
25
27
|
default: false
|
|
26
28
|
},
|
|
@@ -36,6 +38,7 @@ var generate_default = defineCommand({
|
|
|
36
38
|
},
|
|
37
39
|
config: {
|
|
38
40
|
type: "string",
|
|
41
|
+
alias: "c",
|
|
39
42
|
description: "Path to config file",
|
|
40
43
|
default: "ryndesign.config.ts"
|
|
41
44
|
}
|
|
@@ -68,8 +71,8 @@ var generate_default = defineCommand({
|
|
|
68
71
|
console.log(pc.green(`\u2713 Resolved themes: ${Object.keys(tokenSet.themes.themes).join(", ")}`));
|
|
69
72
|
}
|
|
70
73
|
let generators = config.generators ?? [];
|
|
71
|
-
if (args.
|
|
72
|
-
const targetPlatforms = args.
|
|
74
|
+
if (args.platform) {
|
|
75
|
+
const targetPlatforms = args.platform.split(",").map((s) => s.trim());
|
|
73
76
|
generators = generators.filter((g) => targetPlatforms.includes(g.name));
|
|
74
77
|
}
|
|
75
78
|
if (generators.length === 0) {
|
|
@@ -196,4 +199,4 @@ File changed: ${changedPath}`));
|
|
|
196
199
|
export {
|
|
197
200
|
generate_default as default
|
|
198
201
|
};
|
|
199
|
-
//# sourceMappingURL=generate-
|
|
202
|
+
//# sourceMappingURL=generate-KMAQLQTY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/generate.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { buildTokenSet, loadComponents, resolveComponent, createGeneratorHelpers } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\nimport type { GeneratedFile, GeneratorPlugin } from '@ryndesign/plugin-api';\n\nexport default defineCommand({\n meta: {\n name: 'generate',\n description: 'Generate design system files for target platforms',\n },\n args: {\n platform: {\n type: 'string',\n alias: 'p',\n description: 'Comma-separated list of platforms to generate',\n },\n watch: {\n type: 'boolean',\n alias: 'w',\n description: 'Watch for changes and regenerate',\n default: false,\n },\n clean: {\n type: 'boolean',\n description: 'Clean output directory before generating',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Show what would be generated without writing files',\n default: false,\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n const dryRun = args['dry-run'] as boolean;\n console.log(pc.cyan(`⚡ RynDesign Generate${dryRun ? ' (dry run)' : ''}\\n`));\n\n const config = await loadConfig(args.config);\n if (!config) {\n console.error(pc.red('Config file not found. Run `ryndesign init` first.'));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Clean output directory if requested\n if (args.clean && config.outDir) {\n const outDir = path.resolve(cwd, config.outDir);\n await fs.rm(outDir, { recursive: true, force: true });\n await fs.mkdir(outDir, { recursive: true });\n console.log(pc.yellow(`Cleaned ${config.outDir}/`));\n }\n\n // Build token set\n console.log(pc.gray('Building token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n name: 'design-system',\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n if (Object.keys(tokenSet.themes.themes).length > 0) {\n console.log(pc.green(`✓ Resolved themes: ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n // Filter generators by platform if specified\n let generators = config.generators ?? [];\n if (args.platform) {\n const targetPlatforms = (args.platform as string).split(',').map(s => s.trim());\n generators = generators.filter(g => targetPlatforms.includes(g.name));\n }\n\n if (generators.length === 0) {\n console.log(pc.yellow('No generators configured. Add generators to your ryndesign.config.ts'));\n return;\n }\n\n // Load and resolve components\n const components = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n\n if (components.length > 0) {\n console.log(pc.green(`✓ Loaded ${components.length} component(s)`));\n }\n\n // Resolve all components\n const resolvedComponents = components.map(compDef => resolveComponent(compDef, tokenSet));\n\n // Run generators\n const allFiles: GeneratedFile[] = [];\n const summary: { name: string; files: number; bytes: number }[] = [];\n\n for (const generator of generators) {\n console.log(pc.gray(`\\nGenerating ${generator.displayName}...`));\n let genFiles = 0;\n let genBytes = 0;\n\n const ctx = {\n tokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: resolvedComponents,\n };\n\n try {\n // Generate tokens\n const tokenFiles = await generator.generateTokens(ctx);\n allFiles.push(...tokenFiles);\n\n for (const file of tokenFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n\n // Generate components\n for (const resolvedComp of resolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n allFiles.push(...compFiles);\n\n for (const file of compFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n }\n\n console.log(pc.green(` ✓ ${genFiles} files generated for ${generator.displayName}`));\n summary.push({ name: generator.displayName, files: genFiles, bytes: genBytes });\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName} failed: ${(err as Error).message}`));\n }\n }\n\n // Summary table\n if (summary.length > 0) {\n console.log(pc.gray('\\n Platform Files Size'));\n console.log(pc.gray(' ─────────────────────────────────'));\n for (const s of summary) {\n const sizeStr = s.bytes < 1024 ? `${s.bytes} B` : `${(s.bytes / 1024).toFixed(1)} KB`;\n console.log(` ${s.name.padEnd(18)} ${String(s.files).padStart(5)} ${sizeStr}`);\n }\n }\n\n // Run hooks\n if (config.hooks?.['generate:complete']) {\n await config.hooks['generate:complete'](allFiles);\n }\n\n console.log(pc.green(`\\n✓ Generation complete! ${allFiles.length} files ${dryRun ? 'would be written' : 'written'}.`));\n\n // Watch mode\n if (args.watch) {\n console.log(pc.cyan('\\nWatching for changes...'));\n const { watch } = await import('chokidar');\n const watchPatterns = [...config.tokens, ...(config.components ?? [])];\n const watcher = watch(watchPatterns, {\n cwd,\n ignoreInitial: true,\n });\n\n watcher.on('change', async (changedPath) => {\n console.log(pc.gray(`\\nFile changed: ${changedPath}`));\n try {\n const newTokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n });\n\n // Reload components\n const newComponents = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n const newResolvedComponents = newComponents.map(c => resolveComponent(c, newTokenSet));\n\n // Re-run generators\n for (const generator of generators) {\n try {\n const ctx = {\n tokenSet: newTokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: newResolvedComponents,\n };\n\n const tokenFiles = await generator.generateTokens(ctx);\n for (const file of tokenFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n\n for (const resolvedComp of newResolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n for (const file of compFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName}: ${(err as Error).message}`));\n }\n }\n console.log(pc.green('✓ Rebuilt and regenerated'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n }\n });\n }\n },\n});\n\n"],"mappings":"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","names":[]}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
loadConfig
|
|
3
|
+
} from "./chunk-TU5AB45W.js";
|
|
1
4
|
import "./chunk-DGUM43GV.js";
|
|
2
5
|
|
|
3
6
|
// src/commands/preview.ts
|
|
@@ -9,10 +12,15 @@ var preview_default = defineCommand({
|
|
|
9
12
|
description: "Start the design system preview server"
|
|
10
13
|
},
|
|
11
14
|
args: {
|
|
15
|
+
config: {
|
|
16
|
+
type: "string",
|
|
17
|
+
alias: "c",
|
|
18
|
+
description: "Path to config file",
|
|
19
|
+
default: "ryndesign.config.ts"
|
|
20
|
+
},
|
|
12
21
|
port: {
|
|
13
22
|
type: "string",
|
|
14
|
-
description: "Port to run the preview server on"
|
|
15
|
-
default: "4400"
|
|
23
|
+
description: "Port to run the preview server on"
|
|
16
24
|
},
|
|
17
25
|
open: {
|
|
18
26
|
type: "boolean",
|
|
@@ -22,10 +30,12 @@ var preview_default = defineCommand({
|
|
|
22
30
|
},
|
|
23
31
|
async run({ args }) {
|
|
24
32
|
console.log(pc.cyan("\u{1F5A5} RynDesign Preview\n"));
|
|
33
|
+
const config = await loadConfig(args.config);
|
|
34
|
+
const port = args.port ? parseInt(args.port, 10) : config?.preview?.port ?? 4400;
|
|
25
35
|
try {
|
|
26
36
|
const { startPreviewServer } = await import("@ryndesign/preview");
|
|
27
37
|
await startPreviewServer({
|
|
28
|
-
port
|
|
38
|
+
port,
|
|
29
39
|
open: args.open
|
|
30
40
|
});
|
|
31
41
|
} catch {
|
|
@@ -37,4 +47,4 @@ var preview_default = defineCommand({
|
|
|
37
47
|
export {
|
|
38
48
|
preview_default as default
|
|
39
49
|
};
|
|
40
|
-
//# sourceMappingURL=preview-
|
|
50
|
+
//# sourceMappingURL=preview-2A5EQQWG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/preview.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'preview',\n description: 'Start the design system preview server',\n },\n args: {\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n port: {\n type: 'string',\n description: 'Port to run the preview server on',\n },\n open: {\n type: 'boolean',\n description: 'Open browser automatically',\n default: true,\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🖥 RynDesign Preview\\n'));\n\n const config = await loadConfig(args.config as string);\n const port = args.port\n ? parseInt(args.port as string, 10)\n : config?.preview?.port ?? 4400;\n\n try {\n const { startPreviewServer } = await import('@ryndesign/preview');\n await startPreviewServer({\n port,\n open: args.open as boolean,\n });\n } catch {\n console.log(pc.yellow('Preview package not found. Install @ryndesign/preview'));\n console.log(pc.gray(' pnpm add @ryndesign/preview'));\n }\n },\n});\n"],"mappings":";;;;;;AAAA,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AAGf,IAAO,kBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,YAAQ,IAAI,GAAG,KAAK,gCAAyB,CAAC;AAE9C,UAAM,SAAS,MAAM,WAAW,KAAK,MAAgB;AACrD,UAAM,OAAO,KAAK,OACd,SAAS,KAAK,MAAgB,EAAE,IAChC,QAAQ,SAAS,QAAQ;AAE7B,QAAI;AACF,YAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,oBAAoB;AAChE,YAAM,mBAAmB;AAAA,QACvB;AAAA,QACA,MAAM,KAAK;AAAA,MACb,CAAC;AAAA,IACH,QAAQ;AACN,cAAQ,IAAI,GAAG,OAAO,uDAAuD,CAAC;AAC9E,cAAQ,IAAI,GAAG,KAAK,+BAA+B,CAAC;AAAA,IACtD;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
loadConfig
|
|
3
|
+
} from "./chunk-TU5AB45W.js";
|
|
1
4
|
import "./chunk-DGUM43GV.js";
|
|
2
5
|
|
|
3
6
|
// src/commands/validate.ts
|
|
@@ -15,6 +18,12 @@ var validate_default = defineCommand({
|
|
|
15
18
|
description: "Path to token file(s)",
|
|
16
19
|
required: false
|
|
17
20
|
},
|
|
21
|
+
config: {
|
|
22
|
+
type: "string",
|
|
23
|
+
alias: "c",
|
|
24
|
+
description: "Path to config file",
|
|
25
|
+
default: "ryndesign.config.ts"
|
|
26
|
+
},
|
|
18
27
|
strict: {
|
|
19
28
|
type: "boolean",
|
|
20
29
|
description: "Treat warnings as errors",
|
|
@@ -23,7 +32,8 @@ var validate_default = defineCommand({
|
|
|
23
32
|
},
|
|
24
33
|
async run({ args }) {
|
|
25
34
|
console.log(pc.cyan(" RynDesign Validate\n"));
|
|
26
|
-
const
|
|
35
|
+
const config = await loadConfig(args.config);
|
|
36
|
+
const patterns = args.path ? [args.path] : config?.tokens ?? ["tokens/**/*.tokens.json"];
|
|
27
37
|
try {
|
|
28
38
|
const tree = await readAndMergeTokenFiles(patterns);
|
|
29
39
|
validateTree(tree);
|
|
@@ -84,4 +94,4 @@ var validate_default = defineCommand({
|
|
|
84
94
|
export {
|
|
85
95
|
validate_default as default
|
|
86
96
|
};
|
|
87
|
-
//# sourceMappingURL=validate-
|
|
97
|
+
//# sourceMappingURL=validate-DNJX65QZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/validate.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { readAndMergeTokenFiles, validateTree, buildTokenSet, postValidate, TokenValidationError } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'validate',\n description: 'Validate design token files',\n },\n args: {\n path: {\n type: 'positional',\n description: 'Path to token file(s)',\n required: false,\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n strict: {\n type: 'boolean',\n description: 'Treat warnings as errors',\n default: false,\n },\n },\n async run({ args }) {\n console.log(pc.cyan(' RynDesign Validate\\n'));\n\n const config = await loadConfig(args.config as string);\n const patterns = args.path\n ? [args.path as string]\n : config?.tokens ?? ['tokens/**/*.tokens.json'];\n\n try {\n // Step 1: Parse and validate structure\n const tree = await readAndMergeTokenFiles(patterns);\n validateTree(tree);\n\n // Step 2: Build full token set for post-validation\n const tokenSet = await buildTokenSet({\n tokens: patterns,\n basePath: process.cwd(),\n });\n\n // Step 3: Post-resolution validation\n const issues = postValidate(tokenSet.tokens, tokenSet.themes);\n const errors = issues.filter(i => i.severity === 'error');\n const warnings = issues.filter(i => i.severity === 'warning');\n\n // Summary\n console.log(pc.green(` ${tokenSet.tokens.length} tokens resolved`));\n console.log(pc.green(` ${tokenSet.groups.length} groups`));\n const themeCount = Object.keys(tokenSet.themes.themes).length;\n if (themeCount > 0) {\n console.log(pc.green(` ${themeCount} theme(s): ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n if (errors.length > 0) {\n console.error(pc.red(`\\n ${errors.length} error(s):\\n`));\n for (const issue of errors) {\n console.error(` ${pc.red('x')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (warnings.length > 0) {\n console.log(pc.yellow(`\\n ${warnings.length} warning(s):\\n`));\n for (const issue of warnings) {\n console.log(` ${pc.yellow('!')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (errors.length === 0 && warnings.length === 0) {\n console.log(pc.green('\\n All tokens are valid!'));\n } else if (errors.length === 0) {\n console.log(pc.green('\\n Tokens are valid (with warnings)'));\n }\n\n // --strict: exit with error if any warnings\n if (args.strict && (errors.length > 0 || warnings.length > 0)) {\n process.exit(1);\n }\n if (errors.length > 0) {\n process.exit(1);\n }\n } catch (err) {\n if (err instanceof TokenValidationError) {\n console.error(pc.red(` Validation failed with ${err.errors.length} issue(s):\\n`));\n for (const issue of err.errors) {\n const icon = issue.severity === 'error' ? pc.red('x') : pc.yellow('!');\n console.error(` ${icon} ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n throw err;\n }\n },\n});\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/figma-pull.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'pull',\n description: 'Pull design tokens from Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n merge: {\n type: 'boolean',\n description: 'Merge with existing local tokens instead of overwriting',\n default: false,\n },\n strategy: {\n type: 'string',\n description: 'Merge strategy: prefer-remote, prefer-local, remote-only-new',\n default: 'prefer-remote',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📥 Figma Pull\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n const shouldMerge = args.merge as boolean;\n const strategy = args.strategy as string;\n const validStrategies = ['prefer-remote', 'prefer-local', 'remote-only-new'];\n if (shouldMerge && !validStrategies.includes(strategy)) {\n console.error(pc.red(`Invalid merge strategy \"${strategy}\". Use: ${validStrategies.join(', ')}`));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, mapFigmaToTokens, resolveFigmaModes, mergeTokens } = await import('@ryndesign/figma');\n\n console.log(pc.gray('Fetching variables from Figma...'));\n\n const variables = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n console.log(pc.green(`✓ Fetched ${variables.length} variables`));\n\n const cwd = process.cwd();\n const modeMapping = config?.figma?.modeMapping;\n\n if (modeMapping) {\n // Resolve modes into separate files\n const modeFiles = resolveFigmaModes(variables, modeMapping);\n\n for (const [filePath, tree] of Object.entries(modeFiles)) {\n const absolutePath = path.resolve(cwd, filePath);\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(absolutePath);\n if (existing) {\n // For mode files, filter tokens belonging to this mode\n const modeTokens = variables.filter(t => {\n const modeName = Object.keys(modeMapping).find(m => modeMapping[m] === filePath);\n return modeName && t.modes[modeName] !== undefined;\n });\n\n const result = mergeTokens(existing, modeTokens, { strategy: strategy as any });\n await fs.writeFile(absolutePath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged ${filePath}`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n continue;\n }\n }\n\n await fs.writeFile(absolutePath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written ${filePath}`));\n }\n } else {\n // Write all to single file\n const outPath = path.resolve(cwd, 'tokens/figma.tokens.json');\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(outPath);\n if (existing) {\n const result = mergeTokens(existing, variables, { strategy: strategy as any });\n await fs.writeFile(outPath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged tokens/figma.tokens.json`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n } else {\n // No existing file, write fresh\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n } else {\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n }\n\n console.log(pc.green('\\n✓ Figma pull complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n\nasync function readJsonSafe(absolutePath: string): Promise<Record<string, unknown> | null> {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/generate.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { buildTokenSet, loadComponents, resolveComponent, createGeneratorHelpers } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\nimport type { GeneratedFile, GeneratorPlugin } from '@ryndesign/plugin-api';\n\nexport default defineCommand({\n meta: {\n name: 'generate',\n description: 'Generate design system files for target platforms',\n },\n args: {\n platforms: {\n type: 'string',\n description: 'Comma-separated list of platforms to generate',\n },\n watch: {\n type: 'boolean',\n description: 'Watch for changes and regenerate',\n default: false,\n },\n clean: {\n type: 'boolean',\n description: 'Clean output directory before generating',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Show what would be generated without writing files',\n default: false,\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n const dryRun = args['dry-run'] as boolean;\n console.log(pc.cyan(`⚡ RynDesign Generate${dryRun ? ' (dry run)' : ''}\\n`));\n\n const config = await loadConfig(args.config);\n if (!config) {\n console.error(pc.red('Config file not found. Run `ryndesign init` first.'));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Clean output directory if requested\n if (args.clean && config.outDir) {\n const outDir = path.resolve(cwd, config.outDir);\n await fs.rm(outDir, { recursive: true, force: true });\n await fs.mkdir(outDir, { recursive: true });\n console.log(pc.yellow(`Cleaned ${config.outDir}/`));\n }\n\n // Build token set\n console.log(pc.gray('Building token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n name: 'design-system',\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n if (Object.keys(tokenSet.themes.themes).length > 0) {\n console.log(pc.green(`✓ Resolved themes: ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n // Filter generators by platform if specified\n let generators = config.generators ?? [];\n if (args.platforms) {\n const targetPlatforms = (args.platforms as string).split(',').map(s => s.trim());\n generators = generators.filter(g => targetPlatforms.includes(g.name));\n }\n\n if (generators.length === 0) {\n console.log(pc.yellow('No generators configured. Add generators to your ryndesign.config.ts'));\n return;\n }\n\n // Load and resolve components\n const components = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n\n if (components.length > 0) {\n console.log(pc.green(`✓ Loaded ${components.length} component(s)`));\n }\n\n // Resolve all components\n const resolvedComponents = components.map(compDef => resolveComponent(compDef, tokenSet));\n\n // Run generators\n const allFiles: GeneratedFile[] = [];\n const summary: { name: string; files: number; bytes: number }[] = [];\n\n for (const generator of generators) {\n console.log(pc.gray(`\\nGenerating ${generator.displayName}...`));\n let genFiles = 0;\n let genBytes = 0;\n\n const ctx = {\n tokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: resolvedComponents,\n };\n\n try {\n // Generate tokens\n const tokenFiles = await generator.generateTokens(ctx);\n allFiles.push(...tokenFiles);\n\n for (const file of tokenFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n\n // Generate components\n for (const resolvedComp of resolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n allFiles.push(...compFiles);\n\n for (const file of compFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n }\n\n console.log(pc.green(` ✓ ${genFiles} files generated for ${generator.displayName}`));\n summary.push({ name: generator.displayName, files: genFiles, bytes: genBytes });\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName} failed: ${(err as Error).message}`));\n }\n }\n\n // Summary table\n if (summary.length > 0) {\n console.log(pc.gray('\\n Platform Files Size'));\n console.log(pc.gray(' ─────────────────────────────────'));\n for (const s of summary) {\n const sizeStr = s.bytes < 1024 ? `${s.bytes} B` : `${(s.bytes / 1024).toFixed(1)} KB`;\n console.log(` ${s.name.padEnd(18)} ${String(s.files).padStart(5)} ${sizeStr}`);\n }\n }\n\n // Run hooks\n if (config.hooks?.['generate:complete']) {\n await config.hooks['generate:complete'](allFiles);\n }\n\n console.log(pc.green(`\\n✓ Generation complete! ${allFiles.length} files ${dryRun ? 'would be written' : 'written'}.`));\n\n // Watch mode\n if (args.watch) {\n console.log(pc.cyan('\\nWatching for changes...'));\n const { watch } = await import('chokidar');\n const watchPatterns = [...config.tokens, ...(config.components ?? [])];\n const watcher = watch(watchPatterns, {\n cwd,\n ignoreInitial: true,\n });\n\n watcher.on('change', async (changedPath) => {\n console.log(pc.gray(`\\nFile changed: ${changedPath}`));\n try {\n const newTokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n });\n\n // Reload components\n const newComponents = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n const newResolvedComponents = newComponents.map(c => resolveComponent(c, newTokenSet));\n\n // Re-run generators\n for (const generator of generators) {\n try {\n const ctx = {\n tokenSet: newTokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: newResolvedComponents,\n };\n\n const tokenFiles = await generator.generateTokens(ctx);\n for (const file of tokenFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n\n for (const resolvedComp of newResolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n for (const file of compFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName}: ${(err as Error).message}`));\n }\n }\n console.log(pc.green('✓ Rebuilt and regenerated'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n }\n });\n }\n },\n});\n\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/preview.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\n\nexport default defineCommand({\n meta: {\n name: 'preview',\n description: 'Start the design system preview server',\n },\n args: {\n port: {\n type: 'string',\n description: 'Port to run the preview server on',\n default: '4400',\n },\n open: {\n type: 'boolean',\n description: 'Open browser automatically',\n default: true,\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🖥 RynDesign Preview\\n'));\n\n try {\n const { startPreviewServer } = await import('@ryndesign/preview');\n await startPreviewServer({\n port: parseInt(args.port as string, 10),\n open: args.open as boolean,\n });\n } catch {\n console.log(pc.yellow('Preview package not found. Install @ryndesign/preview'));\n console.log(pc.gray(' pnpm add @ryndesign/preview'));\n }\n },\n});\n"],"mappings":";;;AAAA,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AAEf,IAAO,kBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,YAAQ,IAAI,GAAG,KAAK,gCAAyB,CAAC;AAE9C,QAAI;AACF,YAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,oBAAoB;AAChE,YAAM,mBAAmB;AAAA,QACvB,MAAM,SAAS,KAAK,MAAgB,EAAE;AAAA,QACtC,MAAM,KAAK;AAAA,MACb,CAAC;AAAA,IACH,QAAQ;AACN,cAAQ,IAAI,GAAG,OAAO,uDAAuD,CAAC;AAC9E,cAAQ,IAAI,GAAG,KAAK,+BAA+B,CAAC;AAAA,IACtD;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/validate.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { readAndMergeTokenFiles, validateTree, buildTokenSet, postValidate, TokenValidationError } from '@ryndesign/core';\n\nexport default defineCommand({\n meta: {\n name: 'validate',\n description: 'Validate design token files',\n },\n args: {\n path: {\n type: 'positional',\n description: 'Path to token file(s)',\n required: false,\n },\n strict: {\n type: 'boolean',\n description: 'Treat warnings as errors',\n default: false,\n },\n },\n async run({ args }) {\n console.log(pc.cyan(' RynDesign Validate\\n'));\n\n const patterns = args.path ? [args.path as string] : ['tokens/**/*.tokens.json'];\n\n try {\n // Step 1: Parse and validate structure\n const tree = await readAndMergeTokenFiles(patterns);\n validateTree(tree);\n\n // Step 2: Build full token set for post-validation\n const tokenSet = await buildTokenSet({\n tokens: patterns,\n basePath: process.cwd(),\n });\n\n // Step 3: Post-resolution validation\n const issues = postValidate(tokenSet.tokens, tokenSet.themes);\n const errors = issues.filter(i => i.severity === 'error');\n const warnings = issues.filter(i => i.severity === 'warning');\n\n // Summary\n console.log(pc.green(` ${tokenSet.tokens.length} tokens resolved`));\n console.log(pc.green(` ${tokenSet.groups.length} groups`));\n const themeCount = Object.keys(tokenSet.themes.themes).length;\n if (themeCount > 0) {\n console.log(pc.green(` ${themeCount} theme(s): ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n if (errors.length > 0) {\n console.error(pc.red(`\\n ${errors.length} error(s):\\n`));\n for (const issue of errors) {\n console.error(` ${pc.red('x')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (warnings.length > 0) {\n console.log(pc.yellow(`\\n ${warnings.length} warning(s):\\n`));\n for (const issue of warnings) {\n console.log(` ${pc.yellow('!')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (errors.length === 0 && warnings.length === 0) {\n console.log(pc.green('\\n All tokens are valid!'));\n } else if (errors.length === 0) {\n console.log(pc.green('\\n Tokens are valid (with warnings)'));\n }\n\n // --strict: exit with error if any warnings\n if (args.strict && (errors.length > 0 || warnings.length > 0)) {\n process.exit(1);\n }\n if (errors.length > 0) {\n process.exit(1);\n }\n } catch (err) {\n if (err instanceof TokenValidationError) {\n console.error(pc.red(` Validation failed with ${err.errors.length} issue(s):\\n`));\n for (const issue of err.errors) {\n const icon = issue.severity === 'error' ? pc.red('x') : pc.yellow('!');\n console.error(` ${icon} ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n throw err;\n }\n },\n});\n"],"mappings":"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","names":[]}
|
|
File without changes
|