@sxl-studio/token-transformer 1.0.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.
Files changed (43) hide show
  1. package/README.en.md +638 -0
  2. package/README.md +715 -0
  3. package/config.example.json +45 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +160 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/core/loader.d.ts +8 -0
  8. package/dist/core/loader.js +105 -0
  9. package/dist/core/loader.js.map +1 -0
  10. package/dist/core/parser.d.ts +5 -0
  11. package/dist/core/parser.js +186 -0
  12. package/dist/core/parser.js.map +1 -0
  13. package/dist/core/types.d.ts +83 -0
  14. package/dist/core/types.js +2 -0
  15. package/dist/core/types.js.map +1 -0
  16. package/dist/core/writer.d.ts +6 -0
  17. package/dist/core/writer.js +124 -0
  18. package/dist/core/writer.js.map +1 -0
  19. package/dist/index.d.ts +7 -0
  20. package/dist/index.js +7 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/transformers/css.d.ts +2 -0
  23. package/dist/transformers/css.js +485 -0
  24. package/dist/transformers/css.js.map +1 -0
  25. package/dist/transformers/kotlin.d.ts +2 -0
  26. package/dist/transformers/kotlin.js +445 -0
  27. package/dist/transformers/kotlin.js.map +1 -0
  28. package/dist/transformers/swiftui.d.ts +2 -0
  29. package/dist/transformers/swiftui.js +436 -0
  30. package/dist/transformers/swiftui.js.map +1 -0
  31. package/dist/transformers/vue3.d.ts +28 -0
  32. package/dist/transformers/vue3.js +534 -0
  33. package/dist/transformers/vue3.js.map +1 -0
  34. package/dist/utils/color.d.ts +11 -0
  35. package/dist/utils/color.js +101 -0
  36. package/dist/utils/color.js.map +1 -0
  37. package/dist/utils/dimension.d.ts +7 -0
  38. package/dist/utils/dimension.js +62 -0
  39. package/dist/utils/dimension.js.map +1 -0
  40. package/dist/utils/naming.d.ts +13 -0
  41. package/dist/utils/naming.js +58 -0
  42. package/dist/utils/naming.js.map +1 -0
  43. package/package.json +40 -0
@@ -0,0 +1,45 @@
1
+ {
2
+ "source": {
3
+ "tokenDir": "../Plugin/tokens",
4
+ "include": ["example/*.json", "core/*.json"],
5
+ "exclude": ["config.json", "**/diff-id*.json", "**/composition*"]
6
+ },
7
+ "platforms": {
8
+ "css": {
9
+ "outputDir": "./project-style/example",
10
+ "prefix": "",
11
+ "resolveAliases": false,
12
+ "fileMapping": [
13
+ {
14
+ "sources": ["example/*.json"],
15
+ "output": "all-tokens.css"
16
+ }
17
+ ]
18
+ },
19
+ "swiftui": {
20
+ "outputDir": "./project-style/example",
21
+ "prefix": "",
22
+ "resolveAliases": false,
23
+ "fileMapping": [
24
+ {
25
+ "sources": ["example/*.json"],
26
+ "output": "AllTokens.swift"
27
+ }
28
+ ]
29
+ },
30
+ "kotlin": {
31
+ "outputDir": "./project-style/example",
32
+ "prefix": "",
33
+ "resolveAliases": false,
34
+ "fileMapping": [
35
+ {
36
+ "sources": ["example/*.json"],
37
+ "output": "AllTokens.kt"
38
+ }
39
+ ]
40
+ }
41
+ },
42
+ "settings": {
43
+ "remBase": 16
44
+ }
45
+ }
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,160 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import ora from "ora";
5
+ import chalk from "chalk";
6
+ import { runTransform, writeOutputFiles } from "./core/writer.js";
7
+ import { transformCompositionFile } from "./transformers/vue3.js";
8
+ const CONFIG_FILE = "sxl-transform.config.json";
9
+ async function main() {
10
+ const args = process.argv.slice(2);
11
+ const compositionArg = args.find(a => a.startsWith("--composition="))?.split("=")[1];
12
+ const compositionOutArg = args.find(a => a.startsWith("--output="))?.split("=")[1];
13
+ if (compositionArg) {
14
+ return runComposition(compositionArg, compositionOutArg);
15
+ }
16
+ const configPath = args.find(a => a.startsWith("--config="))?.split("=")[1]
17
+ ?? args[args.indexOf("--config") + 1]
18
+ ?? CONFIG_FILE;
19
+ console.log("");
20
+ console.log(chalk.bold.magenta(" ╔═══════════════════════════════════════╗"));
21
+ console.log(chalk.bold.magenta(" ║") + chalk.bold.white(" SXL Studio — Token Transformer ") + chalk.bold.magenta("║"));
22
+ console.log(chalk.bold.magenta(" ╚═══════════════════════════════════════╝"));
23
+ console.log("");
24
+ const fullConfigPath = path.resolve(configPath);
25
+ if (!fs.existsSync(fullConfigPath)) {
26
+ if (args.includes("--init")) {
27
+ generateDefaultConfig(fullConfigPath);
28
+ return;
29
+ }
30
+ console.log(chalk.red(` Config file not found: ${fullConfigPath}`));
31
+ console.log(chalk.dim(` Run with --init to generate a default config.`));
32
+ process.exit(1);
33
+ }
34
+ const spinner = ora({ text: "Loading config...", color: "magenta" }).start();
35
+ let config;
36
+ try {
37
+ config = JSON.parse(fs.readFileSync(fullConfigPath, "utf-8"));
38
+ spinner.succeed(chalk.green("Config loaded"));
39
+ }
40
+ catch (err) {
41
+ spinner.fail(chalk.red(`Invalid config: ${err}`));
42
+ process.exit(1);
43
+ }
44
+ const platforms = Object.keys(config.platforms);
45
+ console.log(chalk.dim(` Platforms: ${platforms.map(p => chalk.cyan(p)).join(", ")}`));
46
+ console.log(chalk.dim(` Source: ${config.source.tokenDir}`));
47
+ console.log("");
48
+ spinner.start("Parsing tokens...");
49
+ const results = await runTransform(config);
50
+ const totalTokens = results.reduce((sum, r) => sum + r.tokenCount, 0);
51
+ spinner.succeed(chalk.green(`Parsed ${chalk.bold(String(totalTokens))} tokens`));
52
+ for (const result of results) {
53
+ const allErrors = result.errors;
54
+ if (allErrors.length > 0) {
55
+ console.log(chalk.yellow(`\n ⚠ ${result.platform} warnings:`));
56
+ for (const err of allErrors) {
57
+ console.log(chalk.dim(` • ${err}`));
58
+ }
59
+ }
60
+ }
61
+ spinner.start("Writing output files...");
62
+ const { written, errors: writeErrors } = writeOutputFiles(results);
63
+ spinner.succeed(chalk.green(`Written ${chalk.bold(String(written))} files`));
64
+ if (writeErrors.length > 0) {
65
+ for (const err of writeErrors) {
66
+ console.log(chalk.red(` ✗ ${err}`));
67
+ }
68
+ }
69
+ console.log("");
70
+ for (const result of results) {
71
+ const icon = platformIcon(result.platform);
72
+ console.log(chalk.bold(` ${icon} ${chalk.cyan(result.platform.toUpperCase())}`));
73
+ for (const file of result.files) {
74
+ console.log(chalk.dim(` → ${file.path} (${file.tokenCount} tokens)`));
75
+ }
76
+ }
77
+ console.log("");
78
+ console.log(chalk.green.bold(" ✓ Transform complete!"));
79
+ console.log("");
80
+ }
81
+ function runComposition(inputPath, outputDir) {
82
+ console.log("");
83
+ console.log(chalk.bold.magenta(" ╔═══════════════════════════════════════╗"));
84
+ console.log(chalk.bold.magenta(" ║") + chalk.bold.white(" SXL Studio — Composition → Vue 3 ") + chalk.bold.magenta("║"));
85
+ console.log(chalk.bold.magenta(" ╚═══════════════════════════════════════╝"));
86
+ console.log("");
87
+ const fullPath = path.resolve(inputPath);
88
+ if (!fs.existsSync(fullPath)) {
89
+ console.log(chalk.red(` File not found: ${fullPath}`));
90
+ process.exit(1);
91
+ }
92
+ const outDir = outputDir ? path.resolve(outputDir) : path.dirname(fullPath);
93
+ const spinner = ora({ text: "Transforming composition → Vue 3...", color: "magenta" }).start();
94
+ try {
95
+ const outPath = transformCompositionFile(fullPath, outDir);
96
+ spinner.succeed(chalk.green("Composition transformed"));
97
+ console.log("");
98
+ console.log(chalk.bold(` 🧩 ${chalk.cyan("VUE 3")}`));
99
+ console.log(chalk.dim(` → ${outPath}`));
100
+ console.log("");
101
+ console.log(chalk.green.bold(" ✓ Done!"));
102
+ console.log("");
103
+ }
104
+ catch (err) {
105
+ spinner.fail(chalk.red(`Composition transform failed: ${err}`));
106
+ process.exit(1);
107
+ }
108
+ }
109
+ function platformIcon(platform) {
110
+ switch (platform) {
111
+ case "css": return "🌐";
112
+ case "swiftui": return "🍎";
113
+ case "kotlin": return "🤖";
114
+ }
115
+ }
116
+ function generateDefaultConfig(configPath) {
117
+ const config = {
118
+ source: {
119
+ tokenDir: "./tokens",
120
+ configFile: "config.json",
121
+ exclude: ["config.json", "**/diff-id*.json", "**/composition*"],
122
+ },
123
+ platforms: {
124
+ css: {
125
+ outputDir: "./output/css",
126
+ prefix: "ds",
127
+ resolveAliases: false,
128
+ splitEffects: true,
129
+ showDescriptions: true,
130
+ codeSyntax: {
131
+ colorFormat: "hex",
132
+ },
133
+ },
134
+ swiftui: {
135
+ outputDir: "./output/ios",
136
+ prefix: "DS",
137
+ resolveAliases: true,
138
+ showDescriptions: true,
139
+ },
140
+ kotlin: {
141
+ outputDir: "./output/android",
142
+ prefix: "DS",
143
+ resolveAliases: true,
144
+ showDescriptions: true,
145
+ },
146
+ },
147
+ settings: {
148
+ remBase: 16,
149
+ verbose: false,
150
+ },
151
+ };
152
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
153
+ console.log(chalk.green(` ✓ Default config generated at: ${configPath}`));
154
+ console.log(chalk.dim(` Edit the config and run again.`));
155
+ }
156
+ main().catch(err => {
157
+ console.error(chalk.red(`\n Fatal error: ${err}`));
158
+ process.exit(1);
159
+ });
160
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { FlatToken, TransformConfig, CollectionConfig } from "./types.js";
2
+ export type LoadResult = {
3
+ tokens: FlatToken[];
4
+ collections: CollectionConfig[];
5
+ errors: string[];
6
+ };
7
+ export declare function loadTokens(config: TransformConfig): Promise<LoadResult>;
8
+ export declare function groupTokensByFile(tokens: FlatToken[], collections: CollectionConfig[]): Map<string, FlatToken[]>;
@@ -0,0 +1,105 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { glob } from "glob";
4
+ import { parseTokenFile, buildValueMap, resolveAllAliases, evaluateMathExpressions, } from "./parser.js";
5
+ export async function loadTokens(config) {
6
+ const errors = [];
7
+ const tokenDir = path.resolve(config.source.tokenDir);
8
+ if (!fs.existsSync(tokenDir)) {
9
+ return { tokens: [], collections: [], errors: [`Token directory not found: ${tokenDir}`] };
10
+ }
11
+ let collections = [];
12
+ const pluginConfigPath = config.source.configFile
13
+ ? path.resolve(tokenDir, config.source.configFile)
14
+ : path.resolve(tokenDir, "config.json");
15
+ if (fs.existsSync(pluginConfigPath)) {
16
+ try {
17
+ const raw = JSON.parse(fs.readFileSync(pluginConfigPath, "utf-8"));
18
+ if (raw.collections && Array.isArray(raw.collections)) {
19
+ collections = raw.collections;
20
+ }
21
+ }
22
+ catch (e) {
23
+ errors.push(`Failed to parse config.json: ${e}`);
24
+ }
25
+ }
26
+ let filePaths;
27
+ if (config.source.include && config.source.include.length > 0) {
28
+ filePaths = [];
29
+ for (const pattern of config.source.include) {
30
+ const matches = await glob(pattern, { cwd: tokenDir, absolute: false });
31
+ filePaths.push(...matches);
32
+ }
33
+ }
34
+ else {
35
+ filePaths = await glob("**/*.json", { cwd: tokenDir, absolute: false });
36
+ }
37
+ const exclude = new Set(config.source.exclude ?? ["config.json", "**/diff-id*.json", "**/composition*"]);
38
+ filePaths = filePaths.filter(fp => {
39
+ for (const ex of exclude) {
40
+ if (fp === ex)
41
+ return false;
42
+ if (ex.includes("*") && new RegExp("^" + ex.replace(/\*/g, ".*") + "$").test(fp))
43
+ return false;
44
+ }
45
+ return true;
46
+ });
47
+ const allTokens = [];
48
+ for (const fp of filePaths) {
49
+ const fullPath = path.join(tokenDir, fp);
50
+ try {
51
+ const raw = fs.readFileSync(fullPath, "utf-8");
52
+ const json = JSON.parse(raw);
53
+ const tokens = parseTokenFile(json, fp);
54
+ allTokens.push(...tokens);
55
+ }
56
+ catch (e) {
57
+ errors.push(`Failed to parse ${fp}: ${e}`);
58
+ }
59
+ }
60
+ const lookup = buildValueMap(allTokens);
61
+ resolveAllAliases(allTokens, lookup);
62
+ evaluateMathExpressions(allTokens);
63
+ return { tokens: allTokens, collections, errors };
64
+ }
65
+ export function groupTokensByFile(tokens, collections) {
66
+ if (collections.length === 0) {
67
+ const groups = new Map();
68
+ for (const t of tokens) {
69
+ const file = t.sourceFile || "tokens";
70
+ if (!groups.has(file))
71
+ groups.set(file, []);
72
+ groups.get(file).push(t);
73
+ }
74
+ return groups;
75
+ }
76
+ const groups = new Map();
77
+ const tokensBySource = new Map();
78
+ for (const t of tokens) {
79
+ const src = t.sourceFile || "";
80
+ if (!tokensBySource.has(src))
81
+ tokensBySource.set(src, []);
82
+ tokensBySource.get(src).push(t);
83
+ }
84
+ for (const coll of collections) {
85
+ if (!coll.enabled)
86
+ continue;
87
+ for (const mode of coll.modes) {
88
+ if (!mode.enabled)
89
+ continue;
90
+ const key = `${coll.name}/${mode.name}`;
91
+ const modeTokens = [];
92
+ for (const [filePath, status] of Object.entries(mode.files)) {
93
+ if (status !== "enabled")
94
+ continue;
95
+ const fileTokens = tokensBySource.get(filePath) ?? [];
96
+ modeTokens.push(...fileTokens);
97
+ }
98
+ if (modeTokens.length > 0) {
99
+ groups.set(key, modeTokens);
100
+ }
101
+ }
102
+ }
103
+ return groups;
104
+ }
105
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { FlatToken } from "./types.js";
2
+ export declare function parseTokenFile(json: Record<string, unknown>, filePath: string): FlatToken[];
3
+ export declare function buildValueMap(tokens: FlatToken[]): Map<string, FlatToken>;
4
+ export declare function resolveAllAliases(tokens: FlatToken[], lookup: Map<string, FlatToken>): void;
5
+ export declare function evaluateMathExpressions(tokens: FlatToken[]): void;
@@ -0,0 +1,186 @@
1
+ export function parseTokenFile(json, filePath) {
2
+ return collectTokens(json, undefined, "", filePath);
3
+ }
4
+ function collectTokens(obj, inheritedType, prefix, filePath) {
5
+ const tokens = [];
6
+ const groupType = obj.$type || inheritedType;
7
+ for (const [key, value] of Object.entries(obj)) {
8
+ if (key.startsWith("$"))
9
+ continue;
10
+ if (typeof value !== "object" || value === null || Array.isArray(value))
11
+ continue;
12
+ const node = value;
13
+ const path = prefix ? `${prefix}.${key}` : key;
14
+ const nodeType = node.$type || groupType;
15
+ if ("$value" in node) {
16
+ const val = node.$value;
17
+ const isPureAlias = typeof val === "string" && /^\{[^{}]+\}$/.test(val.trim());
18
+ const aliasPath = isPureAlias ? val.slice(1, -1) : undefined;
19
+ const description = node.$description;
20
+ const extensions = node.$extensions;
21
+ tokens.push({
22
+ path,
23
+ name: key,
24
+ type: (nodeType || inferType(val)),
25
+ value: val,
26
+ isAlias: isPureAlias,
27
+ aliasPath,
28
+ description,
29
+ extensions,
30
+ sourceFile: filePath,
31
+ });
32
+ }
33
+ else {
34
+ tokens.push(...collectTokens(node, nodeType, path, filePath));
35
+ }
36
+ }
37
+ return tokens;
38
+ }
39
+ function inferType(value) {
40
+ if (typeof value === "boolean")
41
+ return "boolean";
42
+ if (typeof value === "number")
43
+ return "number";
44
+ if (typeof value === "string") {
45
+ const v = value.trim();
46
+ if (/^#|^rgb|^hsl|^oklch|^lch|^color\(/.test(v))
47
+ return "color";
48
+ if (/^-?\d+(\.\d+)?(px|rem|em|%|pt|dp|sp)?$/.test(v))
49
+ return "dimension";
50
+ }
51
+ if (typeof value === "object" && value !== null) {
52
+ const obj = value;
53
+ if ("fontFamily" in obj)
54
+ return "typography";
55
+ if ("offsetX" in obj || "offsetY" in obj)
56
+ return "shadow";
57
+ if ("color" in obj && "width" in obj && "style" in obj)
58
+ return "border";
59
+ if ("stops" in obj)
60
+ return "gradient";
61
+ if ("blur" in obj)
62
+ return "blur";
63
+ }
64
+ return "string";
65
+ }
66
+ export function buildValueMap(tokens) {
67
+ const map = new Map();
68
+ for (const t of tokens) {
69
+ map.set(t.path, t);
70
+ map.set(t.path.replace(/\./g, "/"), t);
71
+ }
72
+ return map;
73
+ }
74
+ export function resolveAllAliases(tokens, lookup) {
75
+ for (const token of tokens) {
76
+ if (token.isAlias && token.aliasPath) {
77
+ token.resolvedValue = resolveAlias(token.aliasPath, lookup, new Set(), 20);
78
+ }
79
+ else if (hasEmbeddedAliases(token.value)) {
80
+ token.resolvedValue = resolveEmbeddedAliases(token.value, lookup);
81
+ }
82
+ else {
83
+ token.resolvedValue = token.value;
84
+ }
85
+ }
86
+ }
87
+ function resolveAlias(aliasPath, lookup, visited, maxDepth) {
88
+ if (maxDepth <= 0 || visited.has(aliasPath))
89
+ return `{${aliasPath}}`;
90
+ visited.add(aliasPath);
91
+ const normalized = aliasPath.replace(/\//g, ".");
92
+ const target = lookup.get(normalized) ?? lookup.get(aliasPath);
93
+ if (!target)
94
+ return `{${aliasPath}}`;
95
+ if (target.isAlias && target.aliasPath) {
96
+ return resolveAlias(target.aliasPath, lookup, visited, maxDepth - 1);
97
+ }
98
+ if (hasEmbeddedAliases(target.value)) {
99
+ return resolveEmbeddedAliases(target.value, lookup, visited);
100
+ }
101
+ return target.value;
102
+ }
103
+ function hasEmbeddedAliases(val) {
104
+ if (typeof val === "string")
105
+ return /\{[^{}]+\}/.test(val);
106
+ if (Array.isArray(val))
107
+ return val.some(hasEmbeddedAliases);
108
+ if (typeof val === "object" && val !== null) {
109
+ return Object.values(val).some(hasEmbeddedAliases);
110
+ }
111
+ return false;
112
+ }
113
+ function resolveEmbeddedAliases(val, lookup, visited) {
114
+ const seen = visited ?? new Set();
115
+ if (typeof val === "string") {
116
+ if (/^\{[^{}]+\}$/.test(val.trim())) {
117
+ const ref = val.trim().slice(1, -1);
118
+ return resolveAlias(ref, lookup, new Set(seen), 20);
119
+ }
120
+ return val.replace(/\{([^{}]+)\}/g, (_m, ref) => {
121
+ const resolved = resolveAlias(ref, lookup, new Set(seen), 20);
122
+ if (typeof resolved === "string")
123
+ return resolved;
124
+ if (typeof resolved === "number" || typeof resolved === "boolean")
125
+ return String(resolved);
126
+ try {
127
+ return JSON.stringify(resolved);
128
+ }
129
+ catch {
130
+ return `{${ref}}`;
131
+ }
132
+ });
133
+ }
134
+ if (Array.isArray(val))
135
+ return val.map(item => resolveEmbeddedAliases(item, lookup, seen));
136
+ if (typeof val === "object" && val !== null) {
137
+ const result = {};
138
+ for (const [k, v] of Object.entries(val)) {
139
+ result[k] = resolveEmbeddedAliases(v, lookup, seen);
140
+ }
141
+ return result;
142
+ }
143
+ return val;
144
+ }
145
+ export function evaluateMathExpressions(tokens) {
146
+ for (const t of tokens) {
147
+ t.resolvedValue = evalMathDeep(t.resolvedValue);
148
+ }
149
+ }
150
+ function evalMathDeep(val) {
151
+ if (typeof val === "string")
152
+ return tryEvalMath(val);
153
+ if (Array.isArray(val))
154
+ return val.map(evalMathDeep);
155
+ if (typeof val === "object" && val !== null) {
156
+ const result = {};
157
+ for (const [k, v] of Object.entries(val)) {
158
+ result[k] = evalMathDeep(v);
159
+ }
160
+ return result;
161
+ }
162
+ return val;
163
+ }
164
+ function tryEvalMath(val) {
165
+ if (/^\d+(\.\d+)?$/.test(val.trim()))
166
+ return val;
167
+ const mathPattern = /^[\d.]+\s*[*/+-]\s*[\d.]+(\s*[*/+-]\s*[\d.]+)*$/;
168
+ const stripped = val.replace(/px|rem|em|%|pt|dp|sp/g, "").trim();
169
+ if (mathPattern.test(stripped)) {
170
+ try {
171
+ const result = Function(`"use strict"; return (${stripped})`)();
172
+ const unit = val.match(/(px|rem|em|%|pt|dp|sp)/)?.[1] || "";
173
+ return unit ? `${result}${unit}` : result;
174
+ }
175
+ catch { /* not math */ }
176
+ }
177
+ const roundMatch = val.match(/^round\((.+)\)$/);
178
+ if (roundMatch) {
179
+ const inner = tryEvalMath(roundMatch[1]);
180
+ const num = typeof inner === "number" ? inner : parseFloat(String(inner));
181
+ if (!isNaN(num))
182
+ return Math.round(num);
183
+ }
184
+ return val;
185
+ }
186
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ export type Platform = "css" | "swiftui" | "kotlin";
2
+ export type SimpleTokenType = "color" | "dimension" | "sizing" | "spacing" | "borderRadius" | "borderWidth" | "opacity" | "number" | "fontFamily" | "fontWeight" | "fontStyle" | "fontSize" | "lineHeight" | "letterSpacing" | "paragraphSpacing" | "paragraphIndent" | "textCase" | "textDecoration" | "boolean" | "text" | "string" | "duration" | "cubicBezier" | "strokeStyle";
3
+ export type CompositeTokenType = "typography" | "shadow" | "border" | "fill" | "gradient" | "effects" | "blur" | "backdrop-blur" | "glass" | "grid" | "transition";
4
+ export type TokenType = SimpleTokenType | CompositeTokenType;
5
+ export type FlatToken = {
6
+ path: string;
7
+ name: string;
8
+ type: TokenType | string;
9
+ value: unknown;
10
+ resolvedValue?: unknown;
11
+ isAlias: boolean;
12
+ aliasPath?: string;
13
+ description?: string;
14
+ extensions?: Record<string, unknown>;
15
+ sourceFile?: string;
16
+ };
17
+ export type TransformConfig = {
18
+ source: SourceConfig;
19
+ platforms: Partial<Record<Platform, PlatformConfig>>;
20
+ settings?: GlobalSettings;
21
+ };
22
+ export type SourceConfig = {
23
+ tokenDir: string;
24
+ configFile?: string;
25
+ include?: string[];
26
+ exclude?: string[];
27
+ };
28
+ export type PlatformConfig = {
29
+ outputDir: string;
30
+ fileMapping?: FileMapping[];
31
+ prefix?: string;
32
+ codeSyntax?: CodeSyntaxConfig;
33
+ resolveAliases?: boolean;
34
+ splitEffects?: boolean;
35
+ showDescriptions?: boolean;
36
+ options?: Record<string, unknown>;
37
+ };
38
+ export type FileMapping = {
39
+ sources: string[];
40
+ output: string;
41
+ filter?: TokenFilter;
42
+ };
43
+ export type TokenFilter = {
44
+ types?: string[];
45
+ paths?: string[];
46
+ excludePaths?: string[];
47
+ };
48
+ export type CodeSyntaxConfig = {
49
+ variableTemplate?: string;
50
+ colorFormat?: "hex" | "rgb" | "rgba" | "hsl";
51
+ dimensionUnit?: string;
52
+ prefix?: string;
53
+ };
54
+ export type GlobalSettings = {
55
+ remBase?: number;
56
+ colorFormat?: "hex" | "rgb" | "rgba" | "hsl";
57
+ verbose?: boolean;
58
+ };
59
+ export type TransformResult = {
60
+ platform: Platform;
61
+ files: OutputFile[];
62
+ tokenCount: number;
63
+ errors: string[];
64
+ };
65
+ export type OutputFile = {
66
+ path: string;
67
+ content: string;
68
+ tokenCount: number;
69
+ };
70
+ export type CollectionConfig = {
71
+ name: string;
72
+ enabled: boolean;
73
+ modes: ModeConfig[];
74
+ ref?: {
75
+ type: string;
76
+ collection: string;
77
+ }[];
78
+ };
79
+ export type ModeConfig = {
80
+ name: string;
81
+ enabled: boolean;
82
+ files: Record<string, string>;
83
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { TransformConfig, TransformResult } from "./types.js";
2
+ export declare function runTransform(config: TransformConfig): Promise<TransformResult[]>;
3
+ export declare function writeOutputFiles(results: TransformResult[]): {
4
+ written: number;
5
+ errors: string[];
6
+ };