@ryndesign/cli 0.1.1
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/LICENSE +21 -0
- package/dist/add-ZYIVP5Z5.js +111 -0
- package/dist/add-ZYIVP5Z5.js.map +1 -0
- package/dist/bin.cjs +1332 -0
- package/dist/bin.cjs.map +1 -0
- package/dist/bin.d.cts +1 -0
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +28 -0
- package/dist/bin.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-TU5AB45W.js +76 -0
- package/dist/chunk-TU5AB45W.js.map +1 -0
- package/dist/eject-WIEISNL6.js +143 -0
- package/dist/eject-WIEISNL6.js.map +1 -0
- package/dist/figma-VTZWLYWQ.js +23 -0
- package/dist/figma-VTZWLYWQ.js.map +1 -0
- package/dist/figma-diff-SNSMOAZX.js +97 -0
- package/dist/figma-diff-SNSMOAZX.js.map +1 -0
- package/dist/figma-pull-RCRG6D5G.js +130 -0
- package/dist/figma-pull-RCRG6D5G.js.map +1 -0
- package/dist/figma-push-X4PSMN62.js +71 -0
- package/dist/figma-push-X4PSMN62.js.map +1 -0
- package/dist/generate-LES4SXIM.js +199 -0
- package/dist/generate-LES4SXIM.js.map +1 -0
- package/dist/index.cjs +115 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/init-AIT7XEQS.js +254 -0
- package/dist/init-AIT7XEQS.js.map +1 -0
- package/dist/preview-AXCPYQ53.js +40 -0
- package/dist/preview-AXCPYQ53.js.map +1 -0
- package/dist/validate-RGTQQSUE.js +87 -0
- package/dist/validate-RGTQQSUE.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/figma-diff.ts"],"sourcesContent":["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"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import {
|
|
2
|
+
loadConfig
|
|
3
|
+
} from "./chunk-TU5AB45W.js";
|
|
4
|
+
import "./chunk-DGUM43GV.js";
|
|
5
|
+
|
|
6
|
+
// src/commands/figma-pull.ts
|
|
7
|
+
import { defineCommand } from "citty";
|
|
8
|
+
import pc from "picocolors";
|
|
9
|
+
import fs from "fs/promises";
|
|
10
|
+
import path from "path";
|
|
11
|
+
var figma_pull_default = defineCommand({
|
|
12
|
+
meta: {
|
|
13
|
+
name: "pull",
|
|
14
|
+
description: "Pull design tokens from Figma"
|
|
15
|
+
},
|
|
16
|
+
args: {
|
|
17
|
+
"file-key": {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "Figma file key"
|
|
20
|
+
},
|
|
21
|
+
token: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "Figma personal access token"
|
|
24
|
+
},
|
|
25
|
+
config: {
|
|
26
|
+
type: "string",
|
|
27
|
+
description: "Path to config file",
|
|
28
|
+
default: "ryndesign.config.ts"
|
|
29
|
+
},
|
|
30
|
+
merge: {
|
|
31
|
+
type: "boolean",
|
|
32
|
+
description: "Merge with existing local tokens instead of overwriting",
|
|
33
|
+
default: false
|
|
34
|
+
},
|
|
35
|
+
strategy: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "Merge strategy: prefer-remote, prefer-local, remote-only-new",
|
|
38
|
+
default: "prefer-remote"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
async run({ args }) {
|
|
42
|
+
console.log(pc.cyan("\u{1F4E5} Figma Pull\n"));
|
|
43
|
+
const config = await loadConfig(args.config);
|
|
44
|
+
const fileKey = args["file-key"] || config?.figma?.fileKey;
|
|
45
|
+
const pat = args.token || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;
|
|
46
|
+
if (!fileKey) {
|
|
47
|
+
console.error(pc.red("Missing Figma file key. Use --file-key or set in config."));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
if (!pat) {
|
|
51
|
+
console.error(pc.red("Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts"));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
const shouldMerge = args.merge;
|
|
55
|
+
const strategy = args.strategy;
|
|
56
|
+
const validStrategies = ["prefer-remote", "prefer-local", "remote-only-new"];
|
|
57
|
+
if (shouldMerge && !validStrategies.includes(strategy)) {
|
|
58
|
+
console.error(pc.red(`Invalid merge strategy "${strategy}". Use: ${validStrategies.join(", ")}`));
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const { fetchFigmaVariables, mapFigmaToTokens, resolveFigmaModes, mergeTokens } = await import("@ryndesign/figma");
|
|
63
|
+
console.log(pc.gray("Fetching variables from Figma..."));
|
|
64
|
+
const variables = await fetchFigmaVariables({
|
|
65
|
+
fileKey,
|
|
66
|
+
personalAccessToken: pat
|
|
67
|
+
});
|
|
68
|
+
console.log(pc.green(`\u2713 Fetched ${variables.length} variables`));
|
|
69
|
+
const cwd = process.cwd();
|
|
70
|
+
const modeMapping = config?.figma?.modeMapping;
|
|
71
|
+
if (modeMapping) {
|
|
72
|
+
const modeFiles = resolveFigmaModes(variables, modeMapping);
|
|
73
|
+
for (const [filePath, tree] of Object.entries(modeFiles)) {
|
|
74
|
+
const absolutePath = path.resolve(cwd, filePath);
|
|
75
|
+
await fs.mkdir(path.dirname(absolutePath), { recursive: true });
|
|
76
|
+
if (shouldMerge) {
|
|
77
|
+
const existing = await readJsonSafe(absolutePath);
|
|
78
|
+
if (existing) {
|
|
79
|
+
const modeTokens = variables.filter((t) => {
|
|
80
|
+
const modeName = Object.keys(modeMapping).find((m) => modeMapping[m] === filePath);
|
|
81
|
+
return modeName && t.modes[modeName] !== void 0;
|
|
82
|
+
});
|
|
83
|
+
const result = mergeTokens(existing, modeTokens, { strategy });
|
|
84
|
+
await fs.writeFile(absolutePath, JSON.stringify(result.merged, null, 2), "utf-8");
|
|
85
|
+
console.log(pc.green(` \u2713 Merged ${filePath}`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
await fs.writeFile(absolutePath, JSON.stringify(tree, null, 2), "utf-8");
|
|
90
|
+
console.log(pc.green(` \u2713 Written ${filePath}`));
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
const outPath = path.resolve(cwd, "tokens/figma.tokens.json");
|
|
94
|
+
await fs.mkdir(path.dirname(outPath), { recursive: true });
|
|
95
|
+
if (shouldMerge) {
|
|
96
|
+
const existing = await readJsonSafe(outPath);
|
|
97
|
+
if (existing) {
|
|
98
|
+
const result = mergeTokens(existing, variables, { strategy });
|
|
99
|
+
await fs.writeFile(outPath, JSON.stringify(result.merged, null, 2), "utf-8");
|
|
100
|
+
console.log(pc.green(` \u2713 Merged tokens/figma.tokens.json`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));
|
|
101
|
+
} else {
|
|
102
|
+
const tree = mapFigmaToTokens(variables);
|
|
103
|
+
await fs.writeFile(outPath, JSON.stringify(tree, null, 2), "utf-8");
|
|
104
|
+
console.log(pc.green(` \u2713 Written tokens/figma.tokens.json`));
|
|
105
|
+
}
|
|
106
|
+
} else {
|
|
107
|
+
const tree = mapFigmaToTokens(variables);
|
|
108
|
+
await fs.writeFile(outPath, JSON.stringify(tree, null, 2), "utf-8");
|
|
109
|
+
console.log(pc.green(` \u2713 Written tokens/figma.tokens.json`));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
console.log(pc.green("\n\u2713 Figma pull complete!"));
|
|
113
|
+
} catch (err) {
|
|
114
|
+
console.error(pc.red(`Error: ${err.message}`));
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
async function readJsonSafe(absolutePath) {
|
|
120
|
+
try {
|
|
121
|
+
const content = await fs.readFile(absolutePath, "utf-8");
|
|
122
|
+
return JSON.parse(content);
|
|
123
|
+
} catch {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export {
|
|
128
|
+
figma_pull_default as default
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=figma-pull-RCRG6D5G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/figma-pull.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'pull',\n description: 'Pull design tokens from Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n merge: {\n type: 'boolean',\n description: 'Merge with existing local tokens instead of overwriting',\n default: false,\n },\n strategy: {\n type: 'string',\n description: 'Merge strategy: prefer-remote, prefer-local, remote-only-new',\n default: 'prefer-remote',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('š„ Figma Pull\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n const shouldMerge = args.merge as boolean;\n const strategy = args.strategy as string;\n const validStrategies = ['prefer-remote', 'prefer-local', 'remote-only-new'];\n if (shouldMerge && !validStrategies.includes(strategy)) {\n console.error(pc.red(`Invalid merge strategy \"${strategy}\". Use: ${validStrategies.join(', ')}`));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, mapFigmaToTokens, resolveFigmaModes, mergeTokens } = await import('@ryndesign/figma');\n\n console.log(pc.gray('Fetching variables from Figma...'));\n\n const variables = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n console.log(pc.green(`ā Fetched ${variables.length} variables`));\n\n const cwd = process.cwd();\n const modeMapping = config?.figma?.modeMapping;\n\n if (modeMapping) {\n // Resolve modes into separate files\n const modeFiles = resolveFigmaModes(variables, modeMapping);\n\n for (const [filePath, tree] of Object.entries(modeFiles)) {\n const absolutePath = path.resolve(cwd, filePath);\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(absolutePath);\n if (existing) {\n // For mode files, filter tokens belonging to this mode\n const modeTokens = variables.filter(t => {\n const modeName = Object.keys(modeMapping).find(m => modeMapping[m] === filePath);\n return modeName && t.modes[modeName] !== undefined;\n });\n\n const result = mergeTokens(existing, modeTokens, { strategy: strategy as any });\n await fs.writeFile(absolutePath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ā Merged ${filePath}`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n continue;\n }\n }\n\n await fs.writeFile(absolutePath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ā Written ${filePath}`));\n }\n } else {\n // Write all to single file\n const outPath = path.resolve(cwd, 'tokens/figma.tokens.json');\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(outPath);\n if (existing) {\n const result = mergeTokens(existing, variables, { strategy: strategy as any });\n await fs.writeFile(outPath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ā Merged tokens/figma.tokens.json`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n } else {\n // No existing file, write fresh\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ā Written tokens/figma.tokens.json`));\n }\n } else {\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ā Written tokens/figma.tokens.json`));\n }\n }\n\n console.log(pc.green('\\nā Figma pull complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n\nasync function readJsonSafe(absolutePath: string): Promise<Record<string, unknown> | null> {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import {
|
|
2
|
+
loadConfig
|
|
3
|
+
} from "./chunk-TU5AB45W.js";
|
|
4
|
+
import "./chunk-DGUM43GV.js";
|
|
5
|
+
|
|
6
|
+
// src/commands/figma-push.ts
|
|
7
|
+
import { defineCommand } from "citty";
|
|
8
|
+
import pc from "picocolors";
|
|
9
|
+
import { buildTokenSet } from "@ryndesign/core";
|
|
10
|
+
var figma_push_default = defineCommand({
|
|
11
|
+
meta: {
|
|
12
|
+
name: "push",
|
|
13
|
+
description: "Push design tokens to Figma"
|
|
14
|
+
},
|
|
15
|
+
args: {
|
|
16
|
+
"file-key": {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Figma file key"
|
|
19
|
+
},
|
|
20
|
+
token: {
|
|
21
|
+
type: "string",
|
|
22
|
+
description: "Figma personal access token"
|
|
23
|
+
},
|
|
24
|
+
config: {
|
|
25
|
+
type: "string",
|
|
26
|
+
description: "Path to config file",
|
|
27
|
+
default: "ryndesign.config.ts"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
async run({ args }) {
|
|
31
|
+
console.log(pc.cyan("\u{1F4E4} Figma Push\n"));
|
|
32
|
+
const config = await loadConfig(args.config);
|
|
33
|
+
const fileKey = args["file-key"] || config?.figma?.fileKey;
|
|
34
|
+
const pat = args.token || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;
|
|
35
|
+
if (!fileKey) {
|
|
36
|
+
console.error(pc.red("Missing Figma file key. Use --file-key or set in config."));
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
if (!pat) {
|
|
40
|
+
console.error(pc.red("Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts"));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const { pushVariablesToFigma } = await import("@ryndesign/figma");
|
|
45
|
+
const cwd = process.cwd();
|
|
46
|
+
console.log(pc.gray("Building token set..."));
|
|
47
|
+
const tokenSet = await buildTokenSet({
|
|
48
|
+
tokens: config?.tokens ?? ["tokens/**/*.tokens.json"],
|
|
49
|
+
basePath: cwd,
|
|
50
|
+
themes: config?.themes
|
|
51
|
+
});
|
|
52
|
+
console.log(pc.green(`\u2713 Resolved ${tokenSet.tokens.length} tokens`));
|
|
53
|
+
console.log(pc.gray("Pushing to Figma..."));
|
|
54
|
+
const darkTokens = tokenSet.themes.themes["dark"]?.tokens;
|
|
55
|
+
await pushVariablesToFigma({
|
|
56
|
+
fileKey,
|
|
57
|
+
personalAccessToken: pat,
|
|
58
|
+
tokens: tokenSet.tokens,
|
|
59
|
+
darkTokens
|
|
60
|
+
});
|
|
61
|
+
console.log(pc.green("\n\u2713 Figma push complete!"));
|
|
62
|
+
} catch (err) {
|
|
63
|
+
console.error(pc.red(`Error: ${err.message}`));
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
export {
|
|
69
|
+
figma_push_default as default
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=figma-push-X4PSMN62.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/figma-push.ts"],"sourcesContent":["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"],"mappings":";;;;;;AAAA,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAG9B,IAAO,qBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,YAAQ,IAAI,GAAG,KAAK,wBAAiB,CAAC;AAEtC,UAAM,SAAS,MAAM,WAAW,KAAK,MAAgB;AACrD,UAAM,UAAW,KAAK,UAAU,KAAgB,QAAQ,OAAO;AAC/D,UAAM,MAAO,KAAK,SAAoB,QAAQ,OAAO,uBAAuB,QAAQ,IAAI;AAExF,QAAI,CAAC,SAAS;AACZ,cAAQ,MAAM,GAAG,IAAI,0DAA0D,CAAC;AAChF,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,CAAC,KAAK;AACR,cAAQ,MAAM,GAAG,IAAI,gGAAgG,CAAC;AACtH,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI;AACF,YAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,kBAAkB;AAEhE,YAAM,MAAM,QAAQ,IAAI;AACxB,cAAQ,IAAI,GAAG,KAAK,uBAAuB,CAAC;AAE5C,YAAM,WAAW,MAAM,cAAc;AAAA,QACnC,QAAQ,QAAQ,UAAU,CAAC,yBAAyB;AAAA,QACpD,UAAU;AAAA,QACV,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,cAAQ,IAAI,GAAG,MAAM,mBAAc,SAAS,OAAO,MAAM,SAAS,CAAC;AACnE,cAAQ,IAAI,GAAG,KAAK,qBAAqB,CAAC;AAE1C,YAAM,aAAa,SAAS,OAAO,OAAO,MAAM,GAAG;AAEnD,YAAM,qBAAqB;AAAA,QACzB;AAAA,QACA,qBAAqB;AAAA,QACrB,QAAQ,SAAS;AAAA,QACjB;AAAA,MACF,CAAC;AAED,cAAQ,IAAI,GAAG,MAAM,+BAA0B,CAAC;AAAA,IAClD,SAAS,KAAK;AACZ,cAAQ,MAAM,GAAG,IAAI,UAAW,IAAc,OAAO,EAAE,CAAC;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import {
|
|
2
|
+
loadConfig
|
|
3
|
+
} from "./chunk-TU5AB45W.js";
|
|
4
|
+
import "./chunk-DGUM43GV.js";
|
|
5
|
+
|
|
6
|
+
// src/commands/generate.ts
|
|
7
|
+
import { defineCommand } from "citty";
|
|
8
|
+
import pc from "picocolors";
|
|
9
|
+
import path from "path";
|
|
10
|
+
import fs from "fs/promises";
|
|
11
|
+
import { buildTokenSet, loadComponents, resolveComponent, createGeneratorHelpers } from "@ryndesign/core";
|
|
12
|
+
var generate_default = defineCommand({
|
|
13
|
+
meta: {
|
|
14
|
+
name: "generate",
|
|
15
|
+
description: "Generate design system files for target platforms"
|
|
16
|
+
},
|
|
17
|
+
args: {
|
|
18
|
+
platforms: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Comma-separated list of platforms to generate"
|
|
21
|
+
},
|
|
22
|
+
watch: {
|
|
23
|
+
type: "boolean",
|
|
24
|
+
description: "Watch for changes and regenerate",
|
|
25
|
+
default: false
|
|
26
|
+
},
|
|
27
|
+
clean: {
|
|
28
|
+
type: "boolean",
|
|
29
|
+
description: "Clean output directory before generating",
|
|
30
|
+
default: false
|
|
31
|
+
},
|
|
32
|
+
"dry-run": {
|
|
33
|
+
type: "boolean",
|
|
34
|
+
description: "Show what would be generated without writing files",
|
|
35
|
+
default: false
|
|
36
|
+
},
|
|
37
|
+
config: {
|
|
38
|
+
type: "string",
|
|
39
|
+
description: "Path to config file",
|
|
40
|
+
default: "ryndesign.config.ts"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
async run({ args }) {
|
|
44
|
+
const dryRun = args["dry-run"];
|
|
45
|
+
console.log(pc.cyan(`\u26A1 RynDesign Generate${dryRun ? " (dry run)" : ""}
|
|
46
|
+
`));
|
|
47
|
+
const config = await loadConfig(args.config);
|
|
48
|
+
if (!config) {
|
|
49
|
+
console.error(pc.red("Config file not found. Run `ryndesign init` first."));
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
const cwd = process.cwd();
|
|
53
|
+
if (args.clean && config.outDir) {
|
|
54
|
+
const outDir = path.resolve(cwd, config.outDir);
|
|
55
|
+
await fs.rm(outDir, { recursive: true, force: true });
|
|
56
|
+
await fs.mkdir(outDir, { recursive: true });
|
|
57
|
+
console.log(pc.yellow(`Cleaned ${config.outDir}/`));
|
|
58
|
+
}
|
|
59
|
+
console.log(pc.gray("Building token set..."));
|
|
60
|
+
const tokenSet = await buildTokenSet({
|
|
61
|
+
tokens: config.tokens,
|
|
62
|
+
basePath: cwd,
|
|
63
|
+
themes: config.themes,
|
|
64
|
+
name: "design-system"
|
|
65
|
+
});
|
|
66
|
+
console.log(pc.green(`\u2713 Resolved ${tokenSet.tokens.length} tokens`));
|
|
67
|
+
if (Object.keys(tokenSet.themes.themes).length > 0) {
|
|
68
|
+
console.log(pc.green(`\u2713 Resolved themes: ${Object.keys(tokenSet.themes.themes).join(", ")}`));
|
|
69
|
+
}
|
|
70
|
+
let generators = config.generators ?? [];
|
|
71
|
+
if (args.platforms) {
|
|
72
|
+
const targetPlatforms = args.platforms.split(",").map((s) => s.trim());
|
|
73
|
+
generators = generators.filter((g) => targetPlatforms.includes(g.name));
|
|
74
|
+
}
|
|
75
|
+
if (generators.length === 0) {
|
|
76
|
+
console.log(pc.yellow("No generators configured. Add generators to your ryndesign.config.ts"));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const components = config.components ? await loadComponents(config.components, cwd) : [];
|
|
80
|
+
if (components.length > 0) {
|
|
81
|
+
console.log(pc.green(`\u2713 Loaded ${components.length} component(s)`));
|
|
82
|
+
}
|
|
83
|
+
const resolvedComponents = components.map((compDef) => resolveComponent(compDef, tokenSet));
|
|
84
|
+
const allFiles = [];
|
|
85
|
+
const summary = [];
|
|
86
|
+
for (const generator of generators) {
|
|
87
|
+
console.log(pc.gray(`
|
|
88
|
+
Generating ${generator.displayName}...`));
|
|
89
|
+
let genFiles = 0;
|
|
90
|
+
let genBytes = 0;
|
|
91
|
+
const ctx = {
|
|
92
|
+
tokenSet,
|
|
93
|
+
config: { outDir: config.outDir ?? "generated", ...generator },
|
|
94
|
+
outputDir: path.resolve(cwd, config.outDir ?? "generated"),
|
|
95
|
+
helpers: createGeneratorHelpers(),
|
|
96
|
+
components: resolvedComponents
|
|
97
|
+
};
|
|
98
|
+
try {
|
|
99
|
+
const tokenFiles = await generator.generateTokens(ctx);
|
|
100
|
+
allFiles.push(...tokenFiles);
|
|
101
|
+
for (const file of tokenFiles) {
|
|
102
|
+
genFiles++;
|
|
103
|
+
genBytes += Buffer.byteLength(file.content, "utf-8");
|
|
104
|
+
if (!dryRun) {
|
|
105
|
+
const filePath = path.resolve(ctx.outputDir, file.path);
|
|
106
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
107
|
+
await fs.writeFile(filePath, file.content, "utf-8");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (const resolvedComp of resolvedComponents) {
|
|
111
|
+
const compFiles = await generator.generateComponent(resolvedComp, ctx);
|
|
112
|
+
allFiles.push(...compFiles);
|
|
113
|
+
for (const file of compFiles) {
|
|
114
|
+
genFiles++;
|
|
115
|
+
genBytes += Buffer.byteLength(file.content, "utf-8");
|
|
116
|
+
if (!dryRun) {
|
|
117
|
+
const filePath = path.resolve(ctx.outputDir, file.path);
|
|
118
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
119
|
+
await fs.writeFile(filePath, file.content, "utf-8");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
console.log(pc.green(` \u2713 ${genFiles} files generated for ${generator.displayName}`));
|
|
124
|
+
summary.push({ name: generator.displayName, files: genFiles, bytes: genBytes });
|
|
125
|
+
} catch (err) {
|
|
126
|
+
console.error(pc.red(` \u2717 ${generator.displayName} failed: ${err.message}`));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (summary.length > 0) {
|
|
130
|
+
console.log(pc.gray("\n Platform Files Size"));
|
|
131
|
+
console.log(pc.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
132
|
+
for (const s of summary) {
|
|
133
|
+
const sizeStr = s.bytes < 1024 ? `${s.bytes} B` : `${(s.bytes / 1024).toFixed(1)} KB`;
|
|
134
|
+
console.log(` ${s.name.padEnd(18)} ${String(s.files).padStart(5)} ${sizeStr}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (config.hooks?.["generate:complete"]) {
|
|
138
|
+
await config.hooks["generate:complete"](allFiles);
|
|
139
|
+
}
|
|
140
|
+
console.log(pc.green(`
|
|
141
|
+
\u2713 Generation complete! ${allFiles.length} files ${dryRun ? "would be written" : "written"}.`));
|
|
142
|
+
if (args.watch) {
|
|
143
|
+
console.log(pc.cyan("\nWatching for changes..."));
|
|
144
|
+
const { watch } = await import("chokidar");
|
|
145
|
+
const watchPatterns = [...config.tokens, ...config.components ?? []];
|
|
146
|
+
const watcher = watch(watchPatterns, {
|
|
147
|
+
cwd,
|
|
148
|
+
ignoreInitial: true
|
|
149
|
+
});
|
|
150
|
+
watcher.on("change", async (changedPath) => {
|
|
151
|
+
console.log(pc.gray(`
|
|
152
|
+
File changed: ${changedPath}`));
|
|
153
|
+
try {
|
|
154
|
+
const newTokenSet = await buildTokenSet({
|
|
155
|
+
tokens: config.tokens,
|
|
156
|
+
basePath: cwd,
|
|
157
|
+
themes: config.themes
|
|
158
|
+
});
|
|
159
|
+
const newComponents = config.components ? await loadComponents(config.components, cwd) : [];
|
|
160
|
+
const newResolvedComponents = newComponents.map((c) => resolveComponent(c, newTokenSet));
|
|
161
|
+
for (const generator of generators) {
|
|
162
|
+
try {
|
|
163
|
+
const ctx = {
|
|
164
|
+
tokenSet: newTokenSet,
|
|
165
|
+
config: { outDir: config.outDir ?? "generated", ...generator },
|
|
166
|
+
outputDir: path.resolve(cwd, config.outDir ?? "generated"),
|
|
167
|
+
helpers: createGeneratorHelpers(),
|
|
168
|
+
components: newResolvedComponents
|
|
169
|
+
};
|
|
170
|
+
const tokenFiles = await generator.generateTokens(ctx);
|
|
171
|
+
for (const file of tokenFiles) {
|
|
172
|
+
const filePath = path.resolve(ctx.outputDir, file.path);
|
|
173
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
174
|
+
await fs.writeFile(filePath, file.content, "utf-8");
|
|
175
|
+
}
|
|
176
|
+
for (const resolvedComp of newResolvedComponents) {
|
|
177
|
+
const compFiles = await generator.generateComponent(resolvedComp, ctx);
|
|
178
|
+
for (const file of compFiles) {
|
|
179
|
+
const filePath = path.resolve(ctx.outputDir, file.path);
|
|
180
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
181
|
+
await fs.writeFile(filePath, file.content, "utf-8");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
} catch (err) {
|
|
185
|
+
console.error(pc.red(` \u2717 ${generator.displayName}: ${err.message}`));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
console.log(pc.green("\u2713 Rebuilt and regenerated"));
|
|
189
|
+
} catch (err) {
|
|
190
|
+
console.error(pc.red(`Error: ${err.message}`));
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
export {
|
|
197
|
+
generate_default as default
|
|
198
|
+
};
|
|
199
|
+
//# sourceMappingURL=generate-LES4SXIM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/generate.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { buildTokenSet, loadComponents, resolveComponent, createGeneratorHelpers } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\nimport type { GeneratedFile, GeneratorPlugin } from '@ryndesign/plugin-api';\n\nexport default defineCommand({\n meta: {\n name: 'generate',\n description: 'Generate design system files for target platforms',\n },\n args: {\n platforms: {\n type: 'string',\n description: 'Comma-separated list of platforms to generate',\n },\n watch: {\n type: 'boolean',\n description: 'Watch for changes and regenerate',\n default: false,\n },\n clean: {\n type: 'boolean',\n description: 'Clean output directory before generating',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Show what would be generated without writing files',\n default: false,\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n const dryRun = args['dry-run'] as boolean;\n console.log(pc.cyan(`ā” RynDesign Generate${dryRun ? ' (dry run)' : ''}\\n`));\n\n const config = await loadConfig(args.config);\n if (!config) {\n console.error(pc.red('Config file not found. Run `ryndesign init` first.'));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Clean output directory if requested\n if (args.clean && config.outDir) {\n const outDir = path.resolve(cwd, config.outDir);\n await fs.rm(outDir, { recursive: true, force: true });\n await fs.mkdir(outDir, { recursive: true });\n console.log(pc.yellow(`Cleaned ${config.outDir}/`));\n }\n\n // Build token set\n console.log(pc.gray('Building token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n name: 'design-system',\n });\n\n console.log(pc.green(`ā Resolved ${tokenSet.tokens.length} tokens`));\n if (Object.keys(tokenSet.themes.themes).length > 0) {\n console.log(pc.green(`ā Resolved themes: ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n // Filter generators by platform if specified\n let generators = config.generators ?? [];\n if (args.platforms) {\n const targetPlatforms = (args.platforms as string).split(',').map(s => s.trim());\n generators = generators.filter(g => targetPlatforms.includes(g.name));\n }\n\n if (generators.length === 0) {\n console.log(pc.yellow('No generators configured. Add generators to your ryndesign.config.ts'));\n return;\n }\n\n // Load and resolve components\n const components = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n\n if (components.length > 0) {\n console.log(pc.green(`ā Loaded ${components.length} component(s)`));\n }\n\n // Resolve all components\n const resolvedComponents = components.map(compDef => resolveComponent(compDef, tokenSet));\n\n // Run generators\n const allFiles: GeneratedFile[] = [];\n const summary: { name: string; files: number; bytes: number }[] = [];\n\n for (const generator of generators) {\n console.log(pc.gray(`\\nGenerating ${generator.displayName}...`));\n let genFiles = 0;\n let genBytes = 0;\n\n const ctx = {\n tokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: resolvedComponents,\n };\n\n try {\n // Generate tokens\n const tokenFiles = await generator.generateTokens(ctx);\n allFiles.push(...tokenFiles);\n\n for (const file of tokenFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n\n // Generate components\n for (const resolvedComp of resolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n allFiles.push(...compFiles);\n\n for (const file of compFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n }\n\n console.log(pc.green(` ā ${genFiles} files generated for ${generator.displayName}`));\n summary.push({ name: generator.displayName, files: genFiles, bytes: genBytes });\n } catch (err) {\n console.error(pc.red(` ā ${generator.displayName} failed: ${(err as Error).message}`));\n }\n }\n\n // Summary table\n if (summary.length > 0) {\n console.log(pc.gray('\\n Platform Files Size'));\n console.log(pc.gray(' āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā'));\n for (const s of summary) {\n const sizeStr = s.bytes < 1024 ? `${s.bytes} B` : `${(s.bytes / 1024).toFixed(1)} KB`;\n console.log(` ${s.name.padEnd(18)} ${String(s.files).padStart(5)} ${sizeStr}`);\n }\n }\n\n // Run hooks\n if (config.hooks?.['generate:complete']) {\n await config.hooks['generate:complete'](allFiles);\n }\n\n console.log(pc.green(`\\nā Generation complete! ${allFiles.length} files ${dryRun ? 'would be written' : 'written'}.`));\n\n // Watch mode\n if (args.watch) {\n console.log(pc.cyan('\\nWatching for changes...'));\n const { watch } = await import('chokidar');\n const watchPatterns = [...config.tokens, ...(config.components ?? [])];\n const watcher = watch(watchPatterns, {\n cwd,\n ignoreInitial: true,\n });\n\n watcher.on('change', async (changedPath) => {\n console.log(pc.gray(`\\nFile changed: ${changedPath}`));\n try {\n const newTokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n });\n\n // Reload components\n const newComponents = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n const newResolvedComponents = newComponents.map(c => resolveComponent(c, newTokenSet));\n\n // Re-run generators\n for (const generator of generators) {\n try {\n const ctx = {\n tokenSet: newTokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: newResolvedComponents,\n };\n\n const tokenFiles = await generator.generateTokens(ctx);\n for (const file of tokenFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n\n for (const resolvedComp of newResolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n for (const file of compFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n } catch (err) {\n console.error(pc.red(` ā ${generator.displayName}: ${(err as Error).message}`));\n }\n }\n console.log(pc.green('ā Rebuilt and regenerated'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n }\n });\n }\n },\n});\n\n"],"mappings":";;;;;;AAAA,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,eAAe,gBAAgB,kBAAkB,8BAA8B;AAIxF,IAAO,mBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,SAAS,KAAK,SAAS;AAC7B,YAAQ,IAAI,GAAG,KAAK,4BAAuB,SAAS,eAAe,EAAE;AAAA,CAAI,CAAC;AAE1E,UAAM,SAAS,MAAM,WAAW,KAAK,MAAM;AAC3C,QAAI,CAAC,QAAQ;AACX,cAAQ,MAAM,GAAG,IAAI,oDAAoD,CAAC;AAC1E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,MAAM,QAAQ,IAAI;AAGxB,QAAI,KAAK,SAAS,OAAO,QAAQ;AAC/B,YAAM,SAAS,KAAK,QAAQ,KAAK,OAAO,MAAM;AAC9C,YAAM,GAAG,GAAG,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACpD,YAAM,GAAG,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC1C,cAAQ,IAAI,GAAG,OAAO,WAAW,OAAO,MAAM,GAAG,CAAC;AAAA,IACpD;AAGA,YAAQ,IAAI,GAAG,KAAK,uBAAuB,CAAC;AAC5C,UAAM,WAAW,MAAM,cAAc;AAAA,MACnC,QAAQ,OAAO;AAAA,MACf,UAAU;AAAA,MACV,QAAQ,OAAO;AAAA,MACf,MAAM;AAAA,IACR,CAAC;AAED,YAAQ,IAAI,GAAG,MAAM,mBAAc,SAAS,OAAO,MAAM,SAAS,CAAC;AACnE,QAAI,OAAO,KAAK,SAAS,OAAO,MAAM,EAAE,SAAS,GAAG;AAClD,cAAQ,IAAI,GAAG,MAAM,2BAAsB,OAAO,KAAK,SAAS,OAAO,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9F;AAGA,QAAI,aAAa,OAAO,cAAc,CAAC;AACvC,QAAI,KAAK,WAAW;AAClB,YAAM,kBAAmB,KAAK,UAAqB,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AAC/E,mBAAa,WAAW,OAAO,OAAK,gBAAgB,SAAS,EAAE,IAAI,CAAC;AAAA,IACtE;AAEA,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,IAAI,GAAG,OAAO,sEAAsE,CAAC;AAC7F;AAAA,IACF;AAGA,UAAM,aAAa,OAAO,aACtB,MAAM,eAAe,OAAO,YAAY,GAAG,IAC3C,CAAC;AAEL,QAAI,WAAW,SAAS,GAAG;AACzB,cAAQ,IAAI,GAAG,MAAM,iBAAY,WAAW,MAAM,eAAe,CAAC;AAAA,IACpE;AAGA,UAAM,qBAAqB,WAAW,IAAI,aAAW,iBAAiB,SAAS,QAAQ,CAAC;AAGxF,UAAM,WAA4B,CAAC;AACnC,UAAM,UAA4D,CAAC;AAEnE,eAAW,aAAa,YAAY;AAClC,cAAQ,IAAI,GAAG,KAAK;AAAA,aAAgB,UAAU,WAAW,KAAK,CAAC;AAC/D,UAAI,WAAW;AACf,UAAI,WAAW;AAEf,YAAM,MAAM;AAAA,QACV;AAAA,QACA,QAAQ,EAAE,QAAQ,OAAO,UAAU,aAAa,GAAG,UAAU;AAAA,QAC7D,WAAW,KAAK,QAAQ,KAAK,OAAO,UAAU,WAAW;AAAA,QACzD,SAAS,uBAAuB;AAAA,QAChC,YAAY;AAAA,MACd;AAEA,UAAI;AAEF,cAAM,aAAa,MAAM,UAAU,eAAe,GAAG;AACrD,iBAAS,KAAK,GAAG,UAAU;AAE3B,mBAAW,QAAQ,YAAY;AAC7B;AACA,sBAAY,OAAO,WAAW,KAAK,SAAS,OAAO;AACnD,cAAI,CAAC,QAAQ;AACX,kBAAM,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI;AACtD,kBAAM,GAAG,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,kBAAM,GAAG,UAAU,UAAU,KAAK,SAAS,OAAO;AAAA,UACpD;AAAA,QACF;AAGA,mBAAW,gBAAgB,oBAAoB;AAC7C,gBAAM,YAAY,MAAM,UAAU,kBAAkB,cAAc,GAAG;AACrE,mBAAS,KAAK,GAAG,SAAS;AAE1B,qBAAW,QAAQ,WAAW;AAC5B;AACA,wBAAY,OAAO,WAAW,KAAK,SAAS,OAAO;AACnD,gBAAI,CAAC,QAAQ;AACX,oBAAM,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI;AACtD,oBAAM,GAAG,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,oBAAM,GAAG,UAAU,UAAU,KAAK,SAAS,OAAO;AAAA,YACpD;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,IAAI,GAAG,MAAM,YAAO,QAAQ,wBAAwB,UAAU,WAAW,EAAE,CAAC;AACpF,gBAAQ,KAAK,EAAE,MAAM,UAAU,aAAa,OAAO,UAAU,OAAO,SAAS,CAAC;AAAA,MAChF,SAAS,KAAK;AACZ,gBAAQ,MAAM,GAAG,IAAI,YAAO,UAAU,WAAW,YAAa,IAAc,OAAO,EAAE,CAAC;AAAA,MACxF;AAAA,IACF;AAGA,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ,IAAI,GAAG,KAAK,qCAAqC,CAAC;AAC1D,cAAQ,IAAI,GAAG,KAAK,0MAAqC,CAAC;AAC1D,iBAAW,KAAK,SAAS;AACvB,cAAM,UAAU,EAAE,QAAQ,OAAO,GAAG,EAAE,KAAK,OAAO,IAAI,EAAE,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAChF,gBAAQ,IAAI,KAAK,EAAE,KAAK,OAAO,EAAE,CAAC,IAAI,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,OAAO,OAAO,EAAE;AAAA,MACnF;AAAA,IACF;AAGA,QAAI,OAAO,QAAQ,mBAAmB,GAAG;AACvC,YAAM,OAAO,MAAM,mBAAmB,EAAE,QAAQ;AAAA,IAClD;AAEA,YAAQ,IAAI,GAAG,MAAM;AAAA,8BAA4B,SAAS,MAAM,UAAU,SAAS,qBAAqB,SAAS,GAAG,CAAC;AAGrH,QAAI,KAAK,OAAO;AACd,cAAQ,IAAI,GAAG,KAAK,2BAA2B,CAAC;AAChD,YAAM,EAAE,MAAM,IAAI,MAAM,OAAO,UAAU;AACzC,YAAM,gBAAgB,CAAC,GAAG,OAAO,QAAQ,GAAI,OAAO,cAAc,CAAC,CAAE;AACrE,YAAM,UAAU,MAAM,eAAe;AAAA,QACnC;AAAA,QACA,eAAe;AAAA,MACjB,CAAC;AAED,cAAQ,GAAG,UAAU,OAAO,gBAAgB;AAC1C,gBAAQ,IAAI,GAAG,KAAK;AAAA,gBAAmB,WAAW,EAAE,CAAC;AACrD,YAAI;AACF,gBAAM,cAAc,MAAM,cAAc;AAAA,YACtC,QAAQ,OAAO;AAAA,YACf,UAAU;AAAA,YACV,QAAQ,OAAO;AAAA,UACjB,CAAC;AAGD,gBAAM,gBAAgB,OAAO,aACzB,MAAM,eAAe,OAAO,YAAY,GAAG,IAC3C,CAAC;AACL,gBAAM,wBAAwB,cAAc,IAAI,OAAK,iBAAiB,GAAG,WAAW,CAAC;AAGrF,qBAAW,aAAa,YAAY;AAClC,gBAAI;AACF,oBAAM,MAAM;AAAA,gBACV,UAAU;AAAA,gBACV,QAAQ,EAAE,QAAQ,OAAO,UAAU,aAAa,GAAG,UAAU;AAAA,gBAC7D,WAAW,KAAK,QAAQ,KAAK,OAAO,UAAU,WAAW;AAAA,gBACzD,SAAS,uBAAuB;AAAA,gBAChC,YAAY;AAAA,cACd;AAEA,oBAAM,aAAa,MAAM,UAAU,eAAe,GAAG;AACrD,yBAAW,QAAQ,YAAY;AAC7B,sBAAM,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI;AACtD,sBAAM,GAAG,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,sBAAM,GAAG,UAAU,UAAU,KAAK,SAAS,OAAO;AAAA,cACpD;AAEA,yBAAW,gBAAgB,uBAAuB;AAChD,sBAAM,YAAY,MAAM,UAAU,kBAAkB,cAAc,GAAG;AACrE,2BAAW,QAAQ,WAAW;AAC5B,wBAAM,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI;AACtD,wBAAM,GAAG,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,wBAAM,GAAG,UAAU,UAAU,KAAK,SAAS,OAAO;AAAA,gBACpD;AAAA,cACF;AAAA,YACF,SAAS,KAAK;AACZ,sBAAQ,MAAM,GAAG,IAAI,YAAO,UAAU,WAAW,KAAM,IAAc,OAAO,EAAE,CAAC;AAAA,YACjF;AAAA,UACF;AACA,kBAAQ,IAAI,GAAG,MAAM,gCAA2B,CAAC;AAAA,QACnD,SAAS,KAAK;AACZ,kBAAQ,MAAM,GAAG,IAAI,UAAW,IAAc,OAAO,EAAE,CAAC;AAAA,QAC1D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;","names":[]}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/index.ts
|
|
31
|
+
var index_exports = {};
|
|
32
|
+
__export(index_exports, {
|
|
33
|
+
defineConfig: () => import_plugin_api2.defineConfig,
|
|
34
|
+
loadConfig: () => loadConfig
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(index_exports);
|
|
37
|
+
var import_plugin_api2 = require("@ryndesign/plugin-api");
|
|
38
|
+
|
|
39
|
+
// src/config.ts
|
|
40
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
41
|
+
var import_promises = __toESM(require("fs/promises"), 1);
|
|
42
|
+
var import_plugin_api = require("@ryndesign/plugin-api");
|
|
43
|
+
var CONFIG_NAMES = [
|
|
44
|
+
"ryndesign.config.ts",
|
|
45
|
+
"ryndesign.config.js",
|
|
46
|
+
"ryndesign.config.mjs",
|
|
47
|
+
"ryndesign.config.json"
|
|
48
|
+
];
|
|
49
|
+
async function loadConfig(configPath) {
|
|
50
|
+
const cwd = process.cwd();
|
|
51
|
+
if (configPath) {
|
|
52
|
+
return loadConfigFile(import_node_path.default.resolve(cwd, configPath));
|
|
53
|
+
}
|
|
54
|
+
for (const name of CONFIG_NAMES) {
|
|
55
|
+
const absolutePath = import_node_path.default.resolve(cwd, name);
|
|
56
|
+
try {
|
|
57
|
+
await import_promises.default.access(absolutePath);
|
|
58
|
+
return loadConfigFile(absolutePath);
|
|
59
|
+
} catch {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
async function loadConfigFile(absolutePath) {
|
|
66
|
+
try {
|
|
67
|
+
await import_promises.default.access(absolutePath);
|
|
68
|
+
} catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
if (absolutePath.endsWith(".json")) {
|
|
72
|
+
try {
|
|
73
|
+
const content = await import_promises.default.readFile(absolutePath, "utf-8");
|
|
74
|
+
const config = JSON.parse(content);
|
|
75
|
+
return validateConfig(config, absolutePath);
|
|
76
|
+
} catch (err) {
|
|
77
|
+
throw new Error(`Failed to parse config ${absolutePath}: ${err.message}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const { createJiti } = await import("jiti");
|
|
82
|
+
const loader = createJiti(absolutePath, {
|
|
83
|
+
interopDefault: true
|
|
84
|
+
});
|
|
85
|
+
const config = await loader.import(absolutePath);
|
|
86
|
+
const resolved = config.default ?? config;
|
|
87
|
+
return validateConfig(resolved, absolutePath);
|
|
88
|
+
} catch (err) {
|
|
89
|
+
try {
|
|
90
|
+
const mod = await import(absolutePath);
|
|
91
|
+
const resolved = mod.default ?? mod;
|
|
92
|
+
return validateConfig(resolved, absolutePath);
|
|
93
|
+
} catch {
|
|
94
|
+
throw new Error(`Failed to load config ${absolutePath}: ${err.message}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function validateConfig(config, filePath) {
|
|
99
|
+
if (!config.tokens || !Array.isArray(config.tokens) || config.tokens.length === 0) {
|
|
100
|
+
throw new Error(`Invalid config in ${filePath}: "tokens" must be a non-empty array of glob patterns`);
|
|
101
|
+
}
|
|
102
|
+
if (config.components && !Array.isArray(config.components)) {
|
|
103
|
+
throw new Error(`Invalid config in ${filePath}: "components" must be an array of glob patterns`);
|
|
104
|
+
}
|
|
105
|
+
if (config.generators && !Array.isArray(config.generators)) {
|
|
106
|
+
throw new Error(`Invalid config in ${filePath}: "generators" must be an array`);
|
|
107
|
+
}
|
|
108
|
+
return config;
|
|
109
|
+
}
|
|
110
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
111
|
+
0 && (module.exports = {
|
|
112
|
+
defineConfig,
|
|
113
|
+
loadConfig
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +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;AAuFf,wBAA6B;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,iBAAAC,QAAK,QAAQ,KAAK,UAAU,CAAC;AAAA,EACrD;AAGA,aAAW,QAAQ,cAAc;AAC/B,UAAM,eAAe,iBAAAA,QAAK,QAAQ,KAAK,IAAI;AAC3C,QAAI;AACF,YAAM,gBAAAC,QAAG,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,gBAAAA,QAAG,OAAO,YAAY;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AAGA,MAAI,aAAa,SAAS,OAAO,GAAG;AAClC,QAAI;AACF,YAAM,UAAU,MAAM,gBAAAA,QAAG,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":["import_plugin_api","path","fs"]}
|
package/dist/index.d.cts
ADDED
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { defineConfig } from '@ryndesign/plugin-api';\nexport { loadConfig } from './config.js';\n"],"mappings":";;;;;;AAAA,SAAS,oBAAoB;","names":[]}
|