@ryndesign/cli 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.cjs +82 -18
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +5 -5
- package/dist/{chunk-TU5AB45W.js → chunk-OL6BWLYJ.js} +24 -2
- package/dist/chunk-OL6BWLYJ.js.map +1 -0
- package/dist/{figma-CNDSVB36.js → figma-OEUFWXDS.js} +5 -5
- package/dist/{figma-diff-SNSMOAZX.js → figma-diff-FVLAV2TV.js} +2 -2
- package/dist/{figma-pull-4GFVG5YD.js → figma-pull-GYOM2RUW.js} +2 -2
- package/dist/{figma-push-X4PSMN62.js → figma-push-Y7YBFCLR.js} +2 -2
- package/dist/{generate-KMAQLQTY.js → generate-TKLUCGRF.js} +2 -2
- package/dist/index.cjs +24 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{init-AIT7XEQS.js → init-3GPO2FZN.js} +46 -7
- package/dist/init-3GPO2FZN.js.map +1 -0
- package/dist/{preview-2A5EQQWG.js → preview-EOO6TMLY.js} +10 -8
- package/dist/preview-EOO6TMLY.js.map +1 -0
- package/dist/{validate-DNJX65QZ.js → validate-EGVTSB3N.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-TU5AB45W.js.map +0 -1
- package/dist/init-AIT7XEQS.js.map +0 -1
- package/dist/preview-2A5EQQWG.js.map +0 -1
- /package/dist/{figma-CNDSVB36.js.map → figma-OEUFWXDS.js.map} +0 -0
- /package/dist/{figma-diff-SNSMOAZX.js.map → figma-diff-FVLAV2TV.js.map} +0 -0
- /package/dist/{figma-pull-4GFVG5YD.js.map → figma-pull-GYOM2RUW.js.map} +0 -0
- /package/dist/{figma-push-X4PSMN62.js.map → figma-push-Y7YBFCLR.js.map} +0 -0
- /package/dist/{generate-KMAQLQTY.js.map → generate-TKLUCGRF.js.map} +0 -0
- /package/dist/{validate-DNJX65QZ.js.map → validate-EGVTSB3N.js.map} +0 -0
package/dist/bin.cjs
CHANGED
|
@@ -125,7 +125,20 @@ function getDarkTokens() {
|
|
|
125
125
|
}
|
|
126
126
|
};
|
|
127
127
|
}
|
|
128
|
-
|
|
128
|
+
function detectPackageManager(cwd) {
|
|
129
|
+
try {
|
|
130
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
131
|
+
if (userAgent.startsWith("pnpm")) return "pnpm";
|
|
132
|
+
if (userAgent.startsWith("yarn")) return "yarn";
|
|
133
|
+
if (userAgent.startsWith("bun")) return "bun";
|
|
134
|
+
} catch {
|
|
135
|
+
}
|
|
136
|
+
if ((0, import_node_fs.existsSync)(import_node_path.default.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
|
|
137
|
+
if ((0, import_node_fs.existsSync)(import_node_path.default.join(cwd, "yarn.lock"))) return "yarn";
|
|
138
|
+
if ((0, import_node_fs.existsSync)(import_node_path.default.join(cwd, "bun.lockb"))) return "bun";
|
|
139
|
+
return "npm";
|
|
140
|
+
}
|
|
141
|
+
var import_citty, p, import_picocolors, import_promises, import_node_fs, import_node_path, import_node_child_process, import_meta, init_default;
|
|
129
142
|
var init_init = __esm({
|
|
130
143
|
"src/commands/init.ts"() {
|
|
131
144
|
"use strict";
|
|
@@ -133,7 +146,9 @@ var init_init = __esm({
|
|
|
133
146
|
p = __toESM(require("@clack/prompts"), 1);
|
|
134
147
|
import_picocolors = __toESM(require("picocolors"), 1);
|
|
135
148
|
import_promises = __toESM(require("fs/promises"), 1);
|
|
149
|
+
import_node_fs = require("fs");
|
|
136
150
|
import_node_path = __toESM(require("path"), 1);
|
|
151
|
+
import_node_child_process = require("child_process");
|
|
137
152
|
import_meta = {};
|
|
138
153
|
init_default = (0, import_citty.defineCommand)({
|
|
139
154
|
meta: {
|
|
@@ -264,17 +279,41 @@ var init_init = __esm({
|
|
|
264
279
|
}
|
|
265
280
|
} catch {
|
|
266
281
|
}
|
|
282
|
+
const pkgJsonPath = import_node_path.default.join(cwd, "package.json");
|
|
283
|
+
let pkg;
|
|
267
284
|
try {
|
|
268
|
-
const pkgJsonPath = import_node_path.default.join(cwd, "package.json");
|
|
269
285
|
const pkgContent = await import_promises.default.readFile(pkgJsonPath, "utf-8");
|
|
270
|
-
|
|
271
|
-
if (!pkg.scripts) pkg.scripts = {};
|
|
272
|
-
if (!pkg.scripts["generate"]) pkg.scripts["generate"] = "ryndesign generate";
|
|
273
|
-
if (!pkg.scripts["preview"]) pkg.scripts["preview"] = "ryndesign preview";
|
|
274
|
-
await import_promises.default.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
286
|
+
pkg = JSON.parse(pkgContent);
|
|
275
287
|
} catch {
|
|
288
|
+
const dirName = import_node_path.default.basename(cwd);
|
|
289
|
+
pkg = {
|
|
290
|
+
name: dirName,
|
|
291
|
+
version: "1.0.0",
|
|
292
|
+
private: true,
|
|
293
|
+
type: "module"
|
|
294
|
+
};
|
|
276
295
|
}
|
|
296
|
+
if (!pkg.scripts || typeof pkg.scripts !== "object") pkg.scripts = {};
|
|
297
|
+
const scripts = pkg.scripts;
|
|
298
|
+
if (!scripts["generate"]) scripts["generate"] = "ryndesign generate";
|
|
299
|
+
if (!scripts["preview"]) scripts["preview"] = "ryndesign preview";
|
|
300
|
+
if (!pkg.devDependencies || typeof pkg.devDependencies !== "object") pkg.devDependencies = {};
|
|
301
|
+
const devDeps = pkg.devDependencies;
|
|
302
|
+
devDeps["@ryndesign/cli"] = "latest";
|
|
303
|
+
for (const platform of platforms) {
|
|
304
|
+
devDeps[`@ryndesign/generator-${platform}`] = "latest";
|
|
305
|
+
}
|
|
306
|
+
await import_promises.default.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
277
307
|
s.stop("Project files created!");
|
|
308
|
+
const installSpinner = p.spinner();
|
|
309
|
+
installSpinner.start("Installing dependencies...");
|
|
310
|
+
try {
|
|
311
|
+
const pm = detectPackageManager(cwd);
|
|
312
|
+
(0, import_node_child_process.execSync)(`${pm} install`, { cwd, stdio: "pipe" });
|
|
313
|
+
installSpinner.stop("Dependencies installed!");
|
|
314
|
+
} catch {
|
|
315
|
+
installSpinner.stop(import_picocolors.default.yellow("Could not auto-install. Run `npm install` manually."));
|
|
316
|
+
}
|
|
278
317
|
p.note(
|
|
279
318
|
[
|
|
280
319
|
`${import_picocolors.default.green("tokens/")} - Your design tokens`,
|
|
@@ -323,9 +362,11 @@ async function loadConfigFile(absolutePath) {
|
|
|
323
362
|
}
|
|
324
363
|
}
|
|
325
364
|
try {
|
|
365
|
+
const alias = await resolveCliPackageAlias();
|
|
326
366
|
const { createJiti } = await import("jiti");
|
|
327
367
|
const loader = createJiti(absolutePath, {
|
|
328
|
-
interopDefault: true
|
|
368
|
+
interopDefault: true,
|
|
369
|
+
alias
|
|
329
370
|
});
|
|
330
371
|
const config = await loader.import(absolutePath);
|
|
331
372
|
const resolved = config.default ?? config;
|
|
@@ -352,13 +393,34 @@ function validateConfig(config, filePath) {
|
|
|
352
393
|
}
|
|
353
394
|
return config;
|
|
354
395
|
}
|
|
355
|
-
|
|
396
|
+
async function resolveCliPackageAlias() {
|
|
397
|
+
const alias = {};
|
|
398
|
+
try {
|
|
399
|
+
const cliRequire = (0, import_node_module.createRequire)(import_meta2.url);
|
|
400
|
+
const pluginApiPkg = cliRequire.resolve("@ryndesign/plugin-api/package.json");
|
|
401
|
+
const ryndesignDir = import_node_path2.default.resolve(import_node_path2.default.dirname(pluginApiPkg), "..");
|
|
402
|
+
const entries = await import_promises2.default.readdir(ryndesignDir);
|
|
403
|
+
for (const entry of entries) {
|
|
404
|
+
const pkgJsonPath = import_node_path2.default.join(ryndesignDir, entry, "package.json");
|
|
405
|
+
try {
|
|
406
|
+
await import_promises2.default.access(pkgJsonPath);
|
|
407
|
+
alias[`@ryndesign/${entry}`] = import_node_path2.default.join(ryndesignDir, entry);
|
|
408
|
+
} catch {
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
} catch {
|
|
412
|
+
}
|
|
413
|
+
return alias;
|
|
414
|
+
}
|
|
415
|
+
var import_node_path2, import_promises2, import_node_module, import_plugin_api, import_meta2, CONFIG_NAMES;
|
|
356
416
|
var init_config = __esm({
|
|
357
417
|
"src/config.ts"() {
|
|
358
418
|
"use strict";
|
|
359
419
|
import_node_path2 = __toESM(require("path"), 1);
|
|
360
420
|
import_promises2 = __toESM(require("fs/promises"), 1);
|
|
421
|
+
import_node_module = require("module");
|
|
361
422
|
import_plugin_api = require("@ryndesign/plugin-api");
|
|
423
|
+
import_meta2 = {};
|
|
362
424
|
CONFIG_NAMES = [
|
|
363
425
|
"ryndesign.config.ts",
|
|
364
426
|
"ryndesign.config.js",
|
|
@@ -711,16 +773,18 @@ var init_preview = __esm({
|
|
|
711
773
|
console.log(import_picocolors4.default.cyan("\u{1F5A5} RynDesign Preview\n"));
|
|
712
774
|
const config = await loadConfig(args.config);
|
|
713
775
|
const port = args.port ? parseInt(args.port, 10) : config?.preview?.port ?? 4400;
|
|
776
|
+
let previewModule;
|
|
714
777
|
try {
|
|
715
|
-
|
|
716
|
-
await startPreviewServer({
|
|
717
|
-
port,
|
|
718
|
-
open: args.open
|
|
719
|
-
});
|
|
778
|
+
previewModule = await import("@ryndesign/preview");
|
|
720
779
|
} catch {
|
|
721
780
|
console.log(import_picocolors4.default.yellow("Preview package not found. Install @ryndesign/preview"));
|
|
722
|
-
console.log(import_picocolors4.default.gray("
|
|
781
|
+
console.log(import_picocolors4.default.gray(" npm install @ryndesign/preview"));
|
|
782
|
+
return;
|
|
723
783
|
}
|
|
784
|
+
await previewModule.startPreviewServer({
|
|
785
|
+
port,
|
|
786
|
+
open: args.open
|
|
787
|
+
});
|
|
724
788
|
}
|
|
725
789
|
});
|
|
726
790
|
}
|
|
@@ -731,7 +795,7 @@ var add_exports = {};
|
|
|
731
795
|
__export(add_exports, {
|
|
732
796
|
default: () => add_default
|
|
733
797
|
});
|
|
734
|
-
var import_citty5, p2, import_picocolors5, import_promises4, import_node_path4,
|
|
798
|
+
var import_citty5, p2, import_picocolors5, import_promises4, import_node_path4, import_meta3, AVAILABLE_COMPONENTS, COMPONENT_TOKENS, add_default;
|
|
735
799
|
var init_add = __esm({
|
|
736
800
|
"src/commands/add.ts"() {
|
|
737
801
|
"use strict";
|
|
@@ -740,7 +804,7 @@ var init_add = __esm({
|
|
|
740
804
|
import_picocolors5 = __toESM(require("picocolors"), 1);
|
|
741
805
|
import_promises4 = __toESM(require("fs/promises"), 1);
|
|
742
806
|
import_node_path4 = __toESM(require("path"), 1);
|
|
743
|
-
|
|
807
|
+
import_meta3 = {};
|
|
744
808
|
AVAILABLE_COMPONENTS = ["button", "input", "card", "checkbox", "toggle", "badge", "avatar"];
|
|
745
809
|
COMPONENT_TOKENS = {
|
|
746
810
|
button: {
|
|
@@ -807,7 +871,7 @@ var init_add = __esm({
|
|
|
807
871
|
const searchPaths = [
|
|
808
872
|
import_node_path4.default.resolve(__dirname, `../../components/${name}.component.json`),
|
|
809
873
|
// ESM fallback
|
|
810
|
-
typeof __dirname !== "undefined" ? import_node_path4.default.resolve(__dirname, `../../components/${name}.component.json`) : import_node_path4.default.resolve(new URL(".",
|
|
874
|
+
typeof __dirname !== "undefined" ? import_node_path4.default.resolve(__dirname, `../../components/${name}.component.json`) : import_node_path4.default.resolve(new URL(".", import_meta3.url).pathname, `../../components/${name}.component.json`)
|
|
811
875
|
];
|
|
812
876
|
for (const srcPath of searchPaths) {
|
|
813
877
|
try {
|
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 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"]}
|
|
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 { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\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 // Ensure package.json exists, then add scripts and dependencies\n const pkgJsonPath = path.join(cwd, 'package.json');\n let pkg: Record<string, unknown>;\n try {\n const pkgContent = await fs.readFile(pkgJsonPath, 'utf-8');\n pkg = JSON.parse(pkgContent);\n } catch {\n // No package.json yet — create one\n const dirName = path.basename(cwd);\n pkg = {\n name: dirName,\n version: '1.0.0',\n private: true,\n type: 'module',\n };\n }\n\n if (!pkg.scripts || typeof pkg.scripts !== 'object') pkg.scripts = {};\n const scripts = pkg.scripts as Record<string, string>;\n if (!scripts['generate']) scripts['generate'] = 'ryndesign generate';\n if (!scripts['preview']) scripts['preview'] = 'ryndesign preview';\n\n // Add generator packages as devDependencies\n if (!pkg.devDependencies || typeof pkg.devDependencies !== 'object') pkg.devDependencies = {};\n const devDeps = pkg.devDependencies as Record<string, string>;\n devDeps['@ryndesign/cli'] = 'latest';\n for (const platform of platforms) {\n devDeps[`@ryndesign/generator-${platform}`] = 'latest';\n }\n\n await fs.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + '\\n');\n\n s.stop('Project files created!');\n\n // Install dependencies\n const installSpinner = p.spinner();\n installSpinner.start('Installing dependencies...');\n try {\n const pm = detectPackageManager(cwd);\n execSync(`${pm} install`, { cwd, stdio: 'pipe' });\n installSpinner.stop('Dependencies installed!');\n } catch {\n installSpinner.stop(pc.yellow('Could not auto-install. Run `npm install` manually.'));\n }\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\nfunction detectPackageManager(cwd: string): string {\n try {\n const userAgent = process.env.npm_config_user_agent || '';\n if (userAgent.startsWith('pnpm')) return 'pnpm';\n if (userAgent.startsWith('yarn')) return 'yarn';\n if (userAgent.startsWith('bun')) return 'bun';\n } catch {}\n\n // Check for lock files\n if (existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(path.join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(path.join(cwd, 'bun.lockb'))) return 'bun';\n return 'npm';\n}\n","import type { RynDesignConfig } from '@ryndesign/plugin-api';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\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 // Discover all @ryndesign/* packages from the CLI's own node_modules\n // so globally-installed generators are resolvable even without local node_modules.\n const alias = await resolveCliPackageAlias();\n\n const { createJiti } = await import('jiti');\n const loader = createJiti(absolutePath, {\n interopDefault: true,\n alias,\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\nasync function resolveCliPackageAlias(): Promise<Record<string, string>> {\n const alias: Record<string, string> = {};\n try {\n const cliRequire = createRequire(import.meta.url);\n const pluginApiPkg = cliRequire.resolve('@ryndesign/plugin-api/package.json');\n const ryndesignDir = path.resolve(path.dirname(pluginApiPkg), '..');\n\n const entries = await fs.readdir(ryndesignDir);\n for (const entry of entries) {\n const pkgJsonPath = path.join(ryndesignDir, entry, 'package.json');\n try {\n await fs.access(pkgJsonPath);\n alias[`@ryndesign/${entry}`] = path.join(ryndesignDir, entry);\n } catch {\n // Not a valid package, skip\n }\n }\n } catch {\n // CLI packages not discoverable, alias stays empty\n }\n return alias;\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 let previewModule;\n try {\n previewModule = await import('@ryndesign/preview');\n } catch {\n console.log(pc.yellow('Preview package not found. Install @ryndesign/preview'));\n console.log(pc.gray(' npm install @ryndesign/preview'));\n return;\n }\n\n await previewModule.startPreviewServer({\n port,\n open: args.open as boolean,\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":["path","pc","s","fs","path","fs","import_meta","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
|
@@ -13,12 +13,12 @@ var main = defineCommand({
|
|
|
13
13
|
description: "Multi-platform design system generator"
|
|
14
14
|
},
|
|
15
15
|
subCommands: {
|
|
16
|
-
init: () => import("./init-
|
|
17
|
-
generate: () => import("./generate-
|
|
18
|
-
validate: () => import("./validate-
|
|
19
|
-
preview: () => import("./preview-
|
|
16
|
+
init: () => import("./init-3GPO2FZN.js").then((m) => m.default),
|
|
17
|
+
generate: () => import("./generate-TKLUCGRF.js").then((m) => m.default),
|
|
18
|
+
validate: () => import("./validate-EGVTSB3N.js").then((m) => m.default),
|
|
19
|
+
preview: () => import("./preview-EOO6TMLY.js").then((m) => m.default),
|
|
20
20
|
add: () => import("./add-ZYIVP5Z5.js").then((m) => m.default),
|
|
21
|
-
figma: () => import("./figma-
|
|
21
|
+
figma: () => import("./figma-OEUFWXDS.js").then((m) => m.default),
|
|
22
22
|
eject: () => import("./eject-WIEISNL6.js").then((m) => m.default)
|
|
23
23
|
}
|
|
24
24
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// src/config.ts
|
|
2
2
|
import path from "path";
|
|
3
3
|
import fs from "fs/promises";
|
|
4
|
+
import { createRequire } from "module";
|
|
4
5
|
import { defineConfig } from "@ryndesign/plugin-api";
|
|
5
6
|
var CONFIG_NAMES = [
|
|
6
7
|
"ryndesign.config.ts",
|
|
@@ -40,9 +41,11 @@ async function loadConfigFile(absolutePath) {
|
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
43
|
try {
|
|
44
|
+
const alias = await resolveCliPackageAlias();
|
|
43
45
|
const { createJiti } = await import("jiti");
|
|
44
46
|
const loader = createJiti(absolutePath, {
|
|
45
|
-
interopDefault: true
|
|
47
|
+
interopDefault: true,
|
|
48
|
+
alias
|
|
46
49
|
});
|
|
47
50
|
const config = await loader.import(absolutePath);
|
|
48
51
|
const resolved = config.default ?? config;
|
|
@@ -69,8 +72,27 @@ function validateConfig(config, filePath) {
|
|
|
69
72
|
}
|
|
70
73
|
return config;
|
|
71
74
|
}
|
|
75
|
+
async function resolveCliPackageAlias() {
|
|
76
|
+
const alias = {};
|
|
77
|
+
try {
|
|
78
|
+
const cliRequire = createRequire(import.meta.url);
|
|
79
|
+
const pluginApiPkg = cliRequire.resolve("@ryndesign/plugin-api/package.json");
|
|
80
|
+
const ryndesignDir = path.resolve(path.dirname(pluginApiPkg), "..");
|
|
81
|
+
const entries = await fs.readdir(ryndesignDir);
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const pkgJsonPath = path.join(ryndesignDir, entry, "package.json");
|
|
84
|
+
try {
|
|
85
|
+
await fs.access(pkgJsonPath);
|
|
86
|
+
alias[`@ryndesign/${entry}`] = path.join(ryndesignDir, entry);
|
|
87
|
+
} catch {
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
} catch {
|
|
91
|
+
}
|
|
92
|
+
return alias;
|
|
93
|
+
}
|
|
72
94
|
|
|
73
95
|
export {
|
|
74
96
|
loadConfig
|
|
75
97
|
};
|
|
76
|
-
//# sourceMappingURL=chunk-
|
|
98
|
+
//# sourceMappingURL=chunk-OL6BWLYJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts"],"sourcesContent":["import type { RynDesignConfig } from '@ryndesign/plugin-api';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\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 // Discover all @ryndesign/* packages from the CLI's own node_modules\n // so globally-installed generators are resolvable even without local node_modules.\n const alias = await resolveCliPackageAlias();\n\n const { createJiti } = await import('jiti');\n const loader = createJiti(absolutePath, {\n interopDefault: true,\n alias,\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\nasync function resolveCliPackageAlias(): Promise<Record<string, string>> {\n const alias: Record<string, string> = {};\n try {\n const cliRequire = createRequire(import.meta.url);\n const pluginApiPkg = cliRequire.resolve('@ryndesign/plugin-api/package.json');\n const ryndesignDir = path.resolve(path.dirname(pluginApiPkg), '..');\n\n const entries = await fs.readdir(ryndesignDir);\n for (const entry of entries) {\n const pkgJsonPath = path.join(ryndesignDir, entry, 'package.json');\n try {\n await fs.access(pkgJsonPath);\n alias[`@ryndesign/${entry}`] = path.join(ryndesignDir, entry);\n } catch {\n // Not a valid package, skip\n }\n }\n } catch {\n // CLI packages not discoverable, alias stays empty\n }\n return alias;\n}\n\n// Re-export defineConfig for convenience\nexport { defineConfig } from '@ryndesign/plugin-api';\n"],"mappings":";AACA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAmH9B,SAAS,oBAAoB;AAjH7B,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAsB,WAAW,YAAsD;AACrF,QAAM,MAAM,QAAQ,IAAI;AAGxB,MAAI,YAAY;AACd,WAAO,eAAe,KAAK,QAAQ,KAAK,UAAU,CAAC;AAAA,EACrD;AAGA,aAAW,QAAQ,cAAc;AAC/B,UAAM,eAAe,KAAK,QAAQ,KAAK,IAAI;AAC3C,QAAI;AACF,YAAM,GAAG,OAAO,YAAY;AAC5B,aAAO,eAAe,YAAY;AAAA,IACpC,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,eAAe,cAAuD;AACnF,MAAI;AACF,UAAM,GAAG,OAAO,YAAY;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AAGA,MAAI,aAAa,SAAS,OAAO,GAAG;AAClC,QAAI;AACF,YAAM,UAAU,MAAM,GAAG,SAAS,cAAc,OAAO;AACvD,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,aAAO,eAAe,QAAQ,YAAY;AAAA,IAC5C,SAAS,KAAK;AACZ,YAAM,IAAI,MAAM,0BAA0B,YAAY,KAAM,IAAc,OAAO,EAAE;AAAA,IACrF;AAAA,EACF;AAGA,MAAI;AAGF,UAAM,QAAQ,MAAM,uBAAuB;AAE3C,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,MAAM;AAC1C,UAAM,SAAS,WAAW,cAAc;AAAA,MACtC,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AACD,UAAM,SAAS,MAAM,OAAO,OAAO,YAAY;AAC/C,UAAM,WAAY,OAAO,WAAW;AACpC,WAAO,eAAe,UAAU,YAAY;AAAA,EAC9C,SAAS,KAAK;AAEZ,QAAI;AACF,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,WAAW,IAAI,WAAW;AAChC,aAAO,eAAe,UAAU,YAAY;AAAA,IAC9C,QAAQ;AACN,YAAM,IAAI,MAAM,yBAAyB,YAAY,KAAM,IAAc,OAAO,EAAE;AAAA,IACpF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,QAAyB,UAAmC;AAClF,MAAI,CAAC,OAAO,UAAU,CAAC,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,OAAO,WAAW,GAAG;AACjF,UAAM,IAAI,MAAM,qBAAqB,QAAQ,uDAAuD;AAAA,EACtG;AAEA,MAAI,OAAO,cAAc,CAAC,MAAM,QAAQ,OAAO,UAAU,GAAG;AAC1D,UAAM,IAAI,MAAM,qBAAqB,QAAQ,kDAAkD;AAAA,EACjG;AAEA,MAAI,OAAO,cAAc,CAAC,MAAM,QAAQ,OAAO,UAAU,GAAG;AAC1D,UAAM,IAAI,MAAM,qBAAqB,QAAQ,iCAAiC;AAAA,EAChF;AAEA,SAAO;AACT;AAEA,eAAe,yBAA0D;AACvE,QAAM,QAAgC,CAAC;AACvC,MAAI;AACF,UAAM,aAAa,cAAc,YAAY,GAAG;AAChD,UAAM,eAAe,WAAW,QAAQ,oCAAoC;AAC5E,UAAM,eAAe,KAAK,QAAQ,KAAK,QAAQ,YAAY,GAAG,IAAI;AAElE,UAAM,UAAU,MAAM,GAAG,QAAQ,YAAY;AAC7C,eAAW,SAAS,SAAS;AAC3B,YAAM,cAAc,KAAK,KAAK,cAAc,OAAO,cAAc;AACjE,UAAI;AACF,cAAM,GAAG,OAAO,WAAW;AAC3B,cAAM,cAAc,KAAK,EAAE,IAAI,KAAK,KAAK,cAAc,KAAK;AAAA,MAC9D,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "./chunk-
|
|
1
|
+
import "./chunk-OL6BWLYJ.js";
|
|
2
2
|
import "./chunk-DGUM43GV.js";
|
|
3
3
|
|
|
4
4
|
// src/commands/figma.ts
|
|
@@ -12,12 +12,12 @@ var figma_default = defineCommand({
|
|
|
12
12
|
description: "Figma integration commands"
|
|
13
13
|
},
|
|
14
14
|
subCommands: {
|
|
15
|
-
pull: () => import("./figma-pull-
|
|
16
|
-
push: () => import("./figma-push-
|
|
17
|
-
diff: () => import("./figma-diff-
|
|
15
|
+
pull: () => import("./figma-pull-GYOM2RUW.js").then((m) => m.default),
|
|
16
|
+
push: () => import("./figma-push-Y7YBFCLR.js").then((m) => m.default),
|
|
17
|
+
diff: () => import("./figma-diff-FVLAV2TV.js").then((m) => m.default)
|
|
18
18
|
}
|
|
19
19
|
});
|
|
20
20
|
export {
|
|
21
21
|
figma_default as default
|
|
22
22
|
};
|
|
23
|
-
//# sourceMappingURL=figma-
|
|
23
|
+
//# sourceMappingURL=figma-OEUFWXDS.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OL6BWLYJ.js";
|
|
4
4
|
import "./chunk-DGUM43GV.js";
|
|
5
5
|
|
|
6
6
|
// src/commands/figma-diff.ts
|
|
@@ -94,4 +94,4 @@ ${total} difference(s) found.`));
|
|
|
94
94
|
export {
|
|
95
95
|
figma_diff_default as default
|
|
96
96
|
};
|
|
97
|
-
//# sourceMappingURL=figma-diff-
|
|
97
|
+
//# sourceMappingURL=figma-diff-FVLAV2TV.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OL6BWLYJ.js";
|
|
4
4
|
import "./chunk-DGUM43GV.js";
|
|
5
5
|
|
|
6
6
|
// src/commands/figma-pull.ts
|
|
@@ -134,4 +134,4 @@ async function readJsonSafe(absolutePath) {
|
|
|
134
134
|
export {
|
|
135
135
|
figma_pull_default as default
|
|
136
136
|
};
|
|
137
|
-
//# sourceMappingURL=figma-pull-
|
|
137
|
+
//# sourceMappingURL=figma-pull-GYOM2RUW.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OL6BWLYJ.js";
|
|
4
4
|
import "./chunk-DGUM43GV.js";
|
|
5
5
|
|
|
6
6
|
// src/commands/figma-push.ts
|
|
@@ -68,4 +68,4 @@ var figma_push_default = defineCommand({
|
|
|
68
68
|
export {
|
|
69
69
|
figma_push_default as default
|
|
70
70
|
};
|
|
71
|
-
//# sourceMappingURL=figma-push-
|
|
71
|
+
//# sourceMappingURL=figma-push-Y7YBFCLR.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OL6BWLYJ.js";
|
|
4
4
|
import "./chunk-DGUM43GV.js";
|
|
5
5
|
|
|
6
6
|
// src/commands/generate.ts
|
|
@@ -199,4 +199,4 @@ File changed: ${changedPath}`));
|
|
|
199
199
|
export {
|
|
200
200
|
generate_default as default
|
|
201
201
|
};
|
|
202
|
-
//# sourceMappingURL=generate-
|
|
202
|
+
//# sourceMappingURL=generate-TKLUCGRF.js.map
|
package/dist/index.cjs
CHANGED
|
@@ -39,7 +39,9 @@ var import_plugin_api2 = require("@ryndesign/plugin-api");
|
|
|
39
39
|
// src/config.ts
|
|
40
40
|
var import_node_path = __toESM(require("path"), 1);
|
|
41
41
|
var import_promises = __toESM(require("fs/promises"), 1);
|
|
42
|
+
var import_node_module = require("module");
|
|
42
43
|
var import_plugin_api = require("@ryndesign/plugin-api");
|
|
44
|
+
var import_meta = {};
|
|
43
45
|
var CONFIG_NAMES = [
|
|
44
46
|
"ryndesign.config.ts",
|
|
45
47
|
"ryndesign.config.js",
|
|
@@ -78,9 +80,11 @@ async function loadConfigFile(absolutePath) {
|
|
|
78
80
|
}
|
|
79
81
|
}
|
|
80
82
|
try {
|
|
83
|
+
const alias = await resolveCliPackageAlias();
|
|
81
84
|
const { createJiti } = await import("jiti");
|
|
82
85
|
const loader = createJiti(absolutePath, {
|
|
83
|
-
interopDefault: true
|
|
86
|
+
interopDefault: true,
|
|
87
|
+
alias
|
|
84
88
|
});
|
|
85
89
|
const config = await loader.import(absolutePath);
|
|
86
90
|
const resolved = config.default ?? config;
|
|
@@ -107,6 +111,25 @@ function validateConfig(config, filePath) {
|
|
|
107
111
|
}
|
|
108
112
|
return config;
|
|
109
113
|
}
|
|
114
|
+
async function resolveCliPackageAlias() {
|
|
115
|
+
const alias = {};
|
|
116
|
+
try {
|
|
117
|
+
const cliRequire = (0, import_node_module.createRequire)(import_meta.url);
|
|
118
|
+
const pluginApiPkg = cliRequire.resolve("@ryndesign/plugin-api/package.json");
|
|
119
|
+
const ryndesignDir = import_node_path.default.resolve(import_node_path.default.dirname(pluginApiPkg), "..");
|
|
120
|
+
const entries = await import_promises.default.readdir(ryndesignDir);
|
|
121
|
+
for (const entry of entries) {
|
|
122
|
+
const pkgJsonPath = import_node_path.default.join(ryndesignDir, entry, "package.json");
|
|
123
|
+
try {
|
|
124
|
+
await import_promises.default.access(pkgJsonPath);
|
|
125
|
+
alias[`@ryndesign/${entry}`] = import_node_path.default.join(ryndesignDir, entry);
|
|
126
|
+
} catch {
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
} catch {
|
|
130
|
+
}
|
|
131
|
+
return alias;
|
|
132
|
+
}
|
|
110
133
|
// Annotate the CommonJS export names for ESM import in node:
|
|
111
134
|
0 && (module.exports = {
|
|
112
135
|
defineConfig,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts"],"sourcesContent":["export { defineConfig } from '@ryndesign/plugin-api';\nexport { loadConfig } from './config.js';\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,qBAA6B;;;ACC7B,uBAAiB;AACjB,sBAAe;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts"],"sourcesContent":["export { defineConfig } from '@ryndesign/plugin-api';\nexport { loadConfig } from './config.js';\n","import type { RynDesignConfig } from '@ryndesign/plugin-api';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\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 // Discover all @ryndesign/* packages from the CLI's own node_modules\n // so globally-installed generators are resolvable even without local node_modules.\n const alias = await resolveCliPackageAlias();\n\n const { createJiti } = await import('jiti');\n const loader = createJiti(absolutePath, {\n interopDefault: true,\n alias,\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\nasync function resolveCliPackageAlias(): Promise<Record<string, string>> {\n const alias: Record<string, string> = {};\n try {\n const cliRequire = createRequire(import.meta.url);\n const pluginApiPkg = cliRequire.resolve('@ryndesign/plugin-api/package.json');\n const ryndesignDir = path.resolve(path.dirname(pluginApiPkg), '..');\n\n const entries = await fs.readdir(ryndesignDir);\n for (const entry of entries) {\n const pkgJsonPath = path.join(ryndesignDir, entry, 'package.json');\n try {\n await fs.access(pkgJsonPath);\n alias[`@ryndesign/${entry}`] = path.join(ryndesignDir, entry);\n } catch {\n // Not a valid package, skip\n }\n }\n } catch {\n // CLI packages not discoverable, alias stays empty\n }\n return alias;\n}\n\n// Re-export defineConfig for convenience\nexport { defineConfig } from '@ryndesign/plugin-api';\n"],"mappings":"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","names":["import_plugin_api","path","fs"]}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,9 @@ import { defineCommand } from "citty";
|
|
|
5
5
|
import * as p from "@clack/prompts";
|
|
6
6
|
import pc from "picocolors";
|
|
7
7
|
import fs from "fs/promises";
|
|
8
|
+
import { existsSync } from "fs";
|
|
8
9
|
import path from "path";
|
|
10
|
+
import { execSync } from "child_process";
|
|
9
11
|
var init_default = defineCommand({
|
|
10
12
|
meta: {
|
|
11
13
|
name: "init",
|
|
@@ -135,17 +137,41 @@ var init_default = defineCommand({
|
|
|
135
137
|
}
|
|
136
138
|
} catch {
|
|
137
139
|
}
|
|
140
|
+
const pkgJsonPath = path.join(cwd, "package.json");
|
|
141
|
+
let pkg;
|
|
138
142
|
try {
|
|
139
|
-
const pkgJsonPath = path.join(cwd, "package.json");
|
|
140
143
|
const pkgContent = await fs.readFile(pkgJsonPath, "utf-8");
|
|
141
|
-
|
|
142
|
-
if (!pkg.scripts) pkg.scripts = {};
|
|
143
|
-
if (!pkg.scripts["generate"]) pkg.scripts["generate"] = "ryndesign generate";
|
|
144
|
-
if (!pkg.scripts["preview"]) pkg.scripts["preview"] = "ryndesign preview";
|
|
145
|
-
await fs.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
144
|
+
pkg = JSON.parse(pkgContent);
|
|
146
145
|
} catch {
|
|
146
|
+
const dirName = path.basename(cwd);
|
|
147
|
+
pkg = {
|
|
148
|
+
name: dirName,
|
|
149
|
+
version: "1.0.0",
|
|
150
|
+
private: true,
|
|
151
|
+
type: "module"
|
|
152
|
+
};
|
|
147
153
|
}
|
|
154
|
+
if (!pkg.scripts || typeof pkg.scripts !== "object") pkg.scripts = {};
|
|
155
|
+
const scripts = pkg.scripts;
|
|
156
|
+
if (!scripts["generate"]) scripts["generate"] = "ryndesign generate";
|
|
157
|
+
if (!scripts["preview"]) scripts["preview"] = "ryndesign preview";
|
|
158
|
+
if (!pkg.devDependencies || typeof pkg.devDependencies !== "object") pkg.devDependencies = {};
|
|
159
|
+
const devDeps = pkg.devDependencies;
|
|
160
|
+
devDeps["@ryndesign/cli"] = "latest";
|
|
161
|
+
for (const platform of platforms) {
|
|
162
|
+
devDeps[`@ryndesign/generator-${platform}`] = "latest";
|
|
163
|
+
}
|
|
164
|
+
await fs.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
148
165
|
s.stop("Project files created!");
|
|
166
|
+
const installSpinner = p.spinner();
|
|
167
|
+
installSpinner.start("Installing dependencies...");
|
|
168
|
+
try {
|
|
169
|
+
const pm = detectPackageManager(cwd);
|
|
170
|
+
execSync(`${pm} install`, { cwd, stdio: "pipe" });
|
|
171
|
+
installSpinner.stop("Dependencies installed!");
|
|
172
|
+
} catch {
|
|
173
|
+
installSpinner.stop(pc.yellow("Could not auto-install. Run `npm install` manually."));
|
|
174
|
+
}
|
|
149
175
|
p.note(
|
|
150
176
|
[
|
|
151
177
|
`${pc.green("tokens/")} - Your design tokens`,
|
|
@@ -248,7 +274,20 @@ function getDarkTokens() {
|
|
|
248
274
|
}
|
|
249
275
|
};
|
|
250
276
|
}
|
|
277
|
+
function detectPackageManager(cwd) {
|
|
278
|
+
try {
|
|
279
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
280
|
+
if (userAgent.startsWith("pnpm")) return "pnpm";
|
|
281
|
+
if (userAgent.startsWith("yarn")) return "yarn";
|
|
282
|
+
if (userAgent.startsWith("bun")) return "bun";
|
|
283
|
+
} catch {
|
|
284
|
+
}
|
|
285
|
+
if (existsSync(path.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
|
|
286
|
+
if (existsSync(path.join(cwd, "yarn.lock"))) return "yarn";
|
|
287
|
+
if (existsSync(path.join(cwd, "bun.lockb"))) return "bun";
|
|
288
|
+
return "npm";
|
|
289
|
+
}
|
|
251
290
|
export {
|
|
252
291
|
init_default as default
|
|
253
292
|
};
|
|
254
|
-
//# sourceMappingURL=init-
|
|
293
|
+
//# sourceMappingURL=init-3GPO2FZN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\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 // Ensure package.json exists, then add scripts and dependencies\n const pkgJsonPath = path.join(cwd, 'package.json');\n let pkg: Record<string, unknown>;\n try {\n const pkgContent = await fs.readFile(pkgJsonPath, 'utf-8');\n pkg = JSON.parse(pkgContent);\n } catch {\n // No package.json yet — create one\n const dirName = path.basename(cwd);\n pkg = {\n name: dirName,\n version: '1.0.0',\n private: true,\n type: 'module',\n };\n }\n\n if (!pkg.scripts || typeof pkg.scripts !== 'object') pkg.scripts = {};\n const scripts = pkg.scripts as Record<string, string>;\n if (!scripts['generate']) scripts['generate'] = 'ryndesign generate';\n if (!scripts['preview']) scripts['preview'] = 'ryndesign preview';\n\n // Add generator packages as devDependencies\n if (!pkg.devDependencies || typeof pkg.devDependencies !== 'object') pkg.devDependencies = {};\n const devDeps = pkg.devDependencies as Record<string, string>;\n devDeps['@ryndesign/cli'] = 'latest';\n for (const platform of platforms) {\n devDeps[`@ryndesign/generator-${platform}`] = 'latest';\n }\n\n await fs.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + '\\n');\n\n s.stop('Project files created!');\n\n // Install dependencies\n const installSpinner = p.spinner();\n installSpinner.start('Installing dependencies...');\n try {\n const pm = detectPackageManager(cwd);\n execSync(`${pm} install`, { cwd, stdio: 'pipe' });\n installSpinner.stop('Dependencies installed!');\n } catch {\n installSpinner.stop(pc.yellow('Could not auto-install. Run `npm install` manually.'));\n }\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\nfunction detectPackageManager(cwd: string): string {\n try {\n const userAgent = process.env.npm_config_user_agent || '';\n if (userAgent.startsWith('pnpm')) return 'pnpm';\n if (userAgent.startsWith('yarn')) return 'yarn';\n if (userAgent.startsWith('bun')) return 'bun';\n } catch {}\n\n // Check for lock files\n if (existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(path.join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(path.join(cwd, 'bun.lockb'))) return 'bun';\n return 'npm';\n}\n"],"mappings":"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","names":["s"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OL6BWLYJ.js";
|
|
4
4
|
import "./chunk-DGUM43GV.js";
|
|
5
5
|
|
|
6
6
|
// src/commands/preview.ts
|
|
@@ -32,19 +32,21 @@ var preview_default = defineCommand({
|
|
|
32
32
|
console.log(pc.cyan("\u{1F5A5} RynDesign Preview\n"));
|
|
33
33
|
const config = await loadConfig(args.config);
|
|
34
34
|
const port = args.port ? parseInt(args.port, 10) : config?.preview?.port ?? 4400;
|
|
35
|
+
let previewModule;
|
|
35
36
|
try {
|
|
36
|
-
|
|
37
|
-
await startPreviewServer({
|
|
38
|
-
port,
|
|
39
|
-
open: args.open
|
|
40
|
-
});
|
|
37
|
+
previewModule = await import("@ryndesign/preview");
|
|
41
38
|
} catch {
|
|
42
39
|
console.log(pc.yellow("Preview package not found. Install @ryndesign/preview"));
|
|
43
|
-
console.log(pc.gray("
|
|
40
|
+
console.log(pc.gray(" npm install @ryndesign/preview"));
|
|
41
|
+
return;
|
|
44
42
|
}
|
|
43
|
+
await previewModule.startPreviewServer({
|
|
44
|
+
port,
|
|
45
|
+
open: args.open
|
|
46
|
+
});
|
|
45
47
|
}
|
|
46
48
|
});
|
|
47
49
|
export {
|
|
48
50
|
preview_default as default
|
|
49
51
|
};
|
|
50
|
-
//# sourceMappingURL=preview-
|
|
52
|
+
//# sourceMappingURL=preview-EOO6TMLY.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 let previewModule;\n try {\n previewModule = await import('@ryndesign/preview');\n } catch {\n console.log(pc.yellow('Preview package not found. Install @ryndesign/preview'));\n console.log(pc.gray(' npm install @ryndesign/preview'));\n return;\n }\n\n await previewModule.startPreviewServer({\n port,\n open: args.open as boolean,\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;AACJ,QAAI;AACF,sBAAgB,MAAM,OAAO,oBAAoB;AAAA,IACnD,QAAQ;AACN,cAAQ,IAAI,GAAG,OAAO,uDAAuD,CAAC;AAC9E,cAAQ,IAAI,GAAG,KAAK,kCAAkC,CAAC;AACvD;AAAA,IACF;AAEA,UAAM,cAAc,mBAAmB;AAAA,MACrC;AAAA,MACA,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OL6BWLYJ.js";
|
|
4
4
|
import "./chunk-DGUM43GV.js";
|
|
5
5
|
|
|
6
6
|
// src/commands/validate.ts
|
|
@@ -94,4 +94,4 @@ var validate_default = defineCommand({
|
|
|
94
94
|
export {
|
|
95
95
|
validate_default as default
|
|
96
96
|
};
|
|
97
|
-
//# sourceMappingURL=validate-
|
|
97
|
+
//# sourceMappingURL=validate-EGVTSB3N.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts"],"sourcesContent":["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"],"mappings":";AACA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAuFf,SAAS,oBAAoB;AArF7B,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAsB,WAAW,YAAsD;AACrF,QAAM,MAAM,QAAQ,IAAI;AAGxB,MAAI,YAAY;AACd,WAAO,eAAe,KAAK,QAAQ,KAAK,UAAU,CAAC;AAAA,EACrD;AAGA,aAAW,QAAQ,cAAc;AAC/B,UAAM,eAAe,KAAK,QAAQ,KAAK,IAAI;AAC3C,QAAI;AACF,YAAM,GAAG,OAAO,YAAY;AAC5B,aAAO,eAAe,YAAY;AAAA,IACpC,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,eAAe,cAAuD;AACnF,MAAI;AACF,UAAM,GAAG,OAAO,YAAY;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AAGA,MAAI,aAAa,SAAS,OAAO,GAAG;AAClC,QAAI;AACF,YAAM,UAAU,MAAM,GAAG,SAAS,cAAc,OAAO;AACvD,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,aAAO,eAAe,QAAQ,YAAY;AAAA,IAC5C,SAAS,KAAK;AACZ,YAAM,IAAI,MAAM,0BAA0B,YAAY,KAAM,IAAc,OAAO,EAAE;AAAA,IACrF;AAAA,EACF;AAGA,MAAI;AACF,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,MAAM;AAC1C,UAAM,SAAS,WAAW,cAAc;AAAA,MACtC,gBAAgB;AAAA,IAClB,CAAC;AACD,UAAM,SAAS,MAAM,OAAO,OAAO,YAAY;AAC/C,UAAM,WAAY,OAAO,WAAW;AACpC,WAAO,eAAe,UAAU,YAAY;AAAA,EAC9C,SAAS,KAAK;AAEZ,QAAI;AACF,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,WAAW,IAAI,WAAW;AAChC,aAAO,eAAe,UAAU,YAAY;AAAA,IAC9C,QAAQ;AACN,YAAM,IAAI,MAAM,yBAAyB,YAAY,KAAM,IAAc,OAAO,EAAE;AAAA,IACpF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,QAAyB,UAAmC;AAClF,MAAI,CAAC,OAAO,UAAU,CAAC,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,OAAO,WAAW,GAAG;AACjF,UAAM,IAAI,MAAM,qBAAqB,QAAQ,uDAAuD;AAAA,EACtG;AAEA,MAAI,OAAO,cAAc,CAAC,MAAM,QAAQ,OAAO,UAAU,GAAG;AAC1D,UAAM,IAAI,MAAM,qBAAqB,QAAQ,kDAAkD;AAAA,EACjG;AAEA,MAAI,OAAO,cAAc,CAAC,MAAM,QAAQ,OAAO,UAAU,GAAG;AAC1D,UAAM,IAAI,MAAM,qBAAqB,QAAQ,iCAAiC;AAAA,EAChF;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/init.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"],"mappings":"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","names":["s"]}
|
|
@@ -1 +0,0 @@
|
|
|
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":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|