@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.
- package/README.en.md +638 -0
- package/README.md +715 -0
- package/config.example.json +45 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +160 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/loader.d.ts +8 -0
- package/dist/core/loader.js +105 -0
- package/dist/core/loader.js.map +1 -0
- package/dist/core/parser.d.ts +5 -0
- package/dist/core/parser.js +186 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/types.d.ts +83 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/writer.d.ts +6 -0
- package/dist/core/writer.js +124 -0
- package/dist/core/writer.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/transformers/css.d.ts +2 -0
- package/dist/transformers/css.js +485 -0
- package/dist/transformers/css.js.map +1 -0
- package/dist/transformers/kotlin.d.ts +2 -0
- package/dist/transformers/kotlin.js +445 -0
- package/dist/transformers/kotlin.js.map +1 -0
- package/dist/transformers/swiftui.d.ts +2 -0
- package/dist/transformers/swiftui.js +436 -0
- package/dist/transformers/swiftui.js.map +1 -0
- package/dist/transformers/vue3.d.ts +28 -0
- package/dist/transformers/vue3.js +534 -0
- package/dist/transformers/vue3.js.map +1 -0
- package/dist/utils/color.d.ts +11 -0
- package/dist/utils/color.js +101 -0
- package/dist/utils/color.js.map +1 -0
- package/dist/utils/dimension.d.ts +7 -0
- package/dist/utils/dimension.js +62 -0
- package/dist/utils/dimension.js.map +1 -0
- package/dist/utils/naming.d.ts +13 -0
- package/dist/utils/naming.js +58 -0
- package/dist/utils/naming.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
export function parseColor(value) {
|
|
2
|
+
const v = value.trim();
|
|
3
|
+
if (v.toLowerCase() === "transparent")
|
|
4
|
+
return { r: 0, g: 0, b: 0, a: 0 };
|
|
5
|
+
if (v.startsWith("#"))
|
|
6
|
+
return parseHex(v);
|
|
7
|
+
const rgbaMatch = v.match(/rgba?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*(?:,\s*([\d.]+))?\s*\)/);
|
|
8
|
+
if (rgbaMatch) {
|
|
9
|
+
return {
|
|
10
|
+
r: clamp255(parseFloat(rgbaMatch[1])),
|
|
11
|
+
g: clamp255(parseFloat(rgbaMatch[2])),
|
|
12
|
+
b: clamp255(parseFloat(rgbaMatch[3])),
|
|
13
|
+
a: rgbaMatch[4] !== undefined ? clamp01(parseFloat(rgbaMatch[4])) : 1,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const hslaMatch = v.match(/hsla?\(\s*([\d.]+)\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?\s*(?:,\s*([\d.]+))?\s*\)/);
|
|
17
|
+
if (hslaMatch) {
|
|
18
|
+
return hslToRgba(parseFloat(hslaMatch[1]), parseFloat(hslaMatch[2]), parseFloat(hslaMatch[3]), hslaMatch[4] !== undefined ? parseFloat(hslaMatch[4]) : 1);
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
function parseHex(hex) {
|
|
23
|
+
let h = hex.replace("#", "");
|
|
24
|
+
if (h.length === 3)
|
|
25
|
+
h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
|
|
26
|
+
else if (h.length === 4)
|
|
27
|
+
h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2] + h[3] + h[3];
|
|
28
|
+
const r = parseInt(h.substring(0, 2), 16);
|
|
29
|
+
const g = parseInt(h.substring(2, 4), 16);
|
|
30
|
+
const b = parseInt(h.substring(4, 6), 16);
|
|
31
|
+
const a = h.length >= 8 ? parseInt(h.substring(6, 8), 16) / 255 : 1;
|
|
32
|
+
return { r, g, b, a };
|
|
33
|
+
}
|
|
34
|
+
function hslToRgba(h, s, l, a) {
|
|
35
|
+
s /= 100;
|
|
36
|
+
l /= 100;
|
|
37
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
38
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
39
|
+
const m = l - c / 2;
|
|
40
|
+
let r = 0, g = 0, b = 0;
|
|
41
|
+
if (h < 60) {
|
|
42
|
+
r = c;
|
|
43
|
+
g = x;
|
|
44
|
+
}
|
|
45
|
+
else if (h < 120) {
|
|
46
|
+
r = x;
|
|
47
|
+
g = c;
|
|
48
|
+
}
|
|
49
|
+
else if (h < 180) {
|
|
50
|
+
g = c;
|
|
51
|
+
b = x;
|
|
52
|
+
}
|
|
53
|
+
else if (h < 240) {
|
|
54
|
+
g = x;
|
|
55
|
+
b = c;
|
|
56
|
+
}
|
|
57
|
+
else if (h < 300) {
|
|
58
|
+
r = x;
|
|
59
|
+
b = c;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
r = c;
|
|
63
|
+
b = x;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
r: Math.round((r + m) * 255),
|
|
67
|
+
g: Math.round((g + m) * 255),
|
|
68
|
+
b: Math.round((b + m) * 255),
|
|
69
|
+
a: clamp01(a),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function rgbaToHex(c) {
|
|
73
|
+
const hex = (n) => Math.round(n).toString(16).padStart(2, "0");
|
|
74
|
+
const base = `#${hex(c.r)}${hex(c.g)}${hex(c.b)}`;
|
|
75
|
+
return c.a < 1 ? `${base}${hex(c.a * 255)}` : base;
|
|
76
|
+
}
|
|
77
|
+
export function rgbaToCSS(c) {
|
|
78
|
+
if (c.a === 0 && c.r === 0 && c.g === 0 && c.b === 0)
|
|
79
|
+
return "transparent";
|
|
80
|
+
if (c.a < 1) {
|
|
81
|
+
return `rgba(${c.r}, ${c.g}, ${c.b}, ${round(c.a)})`;
|
|
82
|
+
}
|
|
83
|
+
return rgbaToHex(c);
|
|
84
|
+
}
|
|
85
|
+
export function rgbaToSwiftUI(c) {
|
|
86
|
+
if (c.a === 0 && c.r === 0 && c.g === 0 && c.b === 0)
|
|
87
|
+
return "Color.clear";
|
|
88
|
+
return `Color(red: ${round(c.r / 255)}, green: ${round(c.g / 255)}, blue: ${round(c.b / 255)}${c.a < 1 ? `, opacity: ${round(c.a)}` : ""})`;
|
|
89
|
+
}
|
|
90
|
+
export function rgbaToKotlin(c) {
|
|
91
|
+
if (c.a === 0 && c.r === 0 && c.g === 0 && c.b === 0)
|
|
92
|
+
return "Color.Transparent";
|
|
93
|
+
return `Color(0x${Math.round(c.a * 255).toString(16).padStart(2, "0").toUpperCase()}${Math.round(c.r).toString(16).padStart(2, "0").toUpperCase()}${Math.round(c.g).toString(16).padStart(2, "0").toUpperCase()}${Math.round(c.b).toString(16).padStart(2, "0").toUpperCase()})`;
|
|
94
|
+
}
|
|
95
|
+
function clamp255(n) { return Math.max(0, Math.min(255, n)); }
|
|
96
|
+
function clamp01(n) { return Math.max(0, Math.min(1, n)); }
|
|
97
|
+
function round(n, p = 4) {
|
|
98
|
+
const f = 10 ** p;
|
|
99
|
+
return Math.round(n * f) / f;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=color.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.js","sourceRoot":"","sources":["../../src/utils/color.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function parseDimension(val: unknown): {
|
|
2
|
+
value: number;
|
|
3
|
+
unit: string;
|
|
4
|
+
} | null;
|
|
5
|
+
export declare function toCssDimension(val: unknown, _remBase?: number): string;
|
|
6
|
+
export declare function toSwiftDimension(val: unknown): string;
|
|
7
|
+
export declare function toKotlinDimension(val: unknown): string;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export function parseDimension(val) {
|
|
2
|
+
if (typeof val === "number")
|
|
3
|
+
return { value: val, unit: "px" };
|
|
4
|
+
if (typeof val !== "string")
|
|
5
|
+
return null;
|
|
6
|
+
const match = val.trim().match(/^(-?\d+(?:\.\d+)?)\s*(px|rem|em|%|pt|dp|sp|vw|vh)?$/);
|
|
7
|
+
if (!match)
|
|
8
|
+
return null;
|
|
9
|
+
return { value: parseFloat(match[1]), unit: match[2] || "px" };
|
|
10
|
+
}
|
|
11
|
+
export function toCssDimension(val, _remBase = 16) {
|
|
12
|
+
if (typeof val === "number")
|
|
13
|
+
return `${val}px`;
|
|
14
|
+
if (typeof val === "string") {
|
|
15
|
+
const d = parseDimension(val);
|
|
16
|
+
if (d)
|
|
17
|
+
return `${d.value}${d.unit}`;
|
|
18
|
+
return val;
|
|
19
|
+
}
|
|
20
|
+
if (typeof val === "object" && val !== null) {
|
|
21
|
+
const obj = val;
|
|
22
|
+
if (obj.value !== undefined)
|
|
23
|
+
return toCssDimension(obj.value, _remBase);
|
|
24
|
+
try {
|
|
25
|
+
return JSON.stringify(val);
|
|
26
|
+
}
|
|
27
|
+
catch { /* fallthrough */ }
|
|
28
|
+
}
|
|
29
|
+
return "0px";
|
|
30
|
+
}
|
|
31
|
+
export function toSwiftDimension(val) {
|
|
32
|
+
if (typeof val === "number")
|
|
33
|
+
return String(val);
|
|
34
|
+
if (typeof val === "string") {
|
|
35
|
+
const d = parseDimension(val);
|
|
36
|
+
return d ? String(d.value) : val.replace(/[a-z%]+$/i, "") || "0";
|
|
37
|
+
}
|
|
38
|
+
if (typeof val === "object" && val !== null) {
|
|
39
|
+
const obj = val;
|
|
40
|
+
if (obj.value !== undefined)
|
|
41
|
+
return toSwiftDimension(obj.value);
|
|
42
|
+
}
|
|
43
|
+
return "0";
|
|
44
|
+
}
|
|
45
|
+
export function toKotlinDimension(val) {
|
|
46
|
+
if (typeof val === "number")
|
|
47
|
+
return `${val}.dp`;
|
|
48
|
+
if (typeof val === "string") {
|
|
49
|
+
const d = parseDimension(val);
|
|
50
|
+
if (!d)
|
|
51
|
+
return `0.dp`;
|
|
52
|
+
const unit = d.unit === "px" ? "dp" : d.unit === "sp" ? "sp" : "dp";
|
|
53
|
+
return `${d.value}.${unit}`;
|
|
54
|
+
}
|
|
55
|
+
if (typeof val === "object" && val !== null) {
|
|
56
|
+
const obj = val;
|
|
57
|
+
if (obj.value !== undefined)
|
|
58
|
+
return toKotlinDimension(obj.value);
|
|
59
|
+
}
|
|
60
|
+
return "0.dp";
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=dimension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dimension.js","sourceRoot":"","sources":["../../src/utils/dimension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function toKebabCase(path: string): string;
|
|
2
|
+
export declare function toCamelCase(path: string): string;
|
|
3
|
+
export declare function toPascalCase(path: string): string;
|
|
4
|
+
export declare function toSnakeCase(path: string): string;
|
|
5
|
+
export declare function toUpperSnakeCase(path: string): string;
|
|
6
|
+
export declare function cssVarName(path: string, prefix?: string): string;
|
|
7
|
+
export declare function swiftVarName(path: string): string;
|
|
8
|
+
export declare function kotlinVarName(path: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Resolves a codeSyntax value. If it is a template (wrapped in `{...}`),
|
|
11
|
+
* resolves using the token path. Otherwise returns the raw value as-is.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveCodeSyntax(raw: string, tokenPath: string): string;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export function toKebabCase(path) {
|
|
2
|
+
return splitPathToWords(path).map((w) => w.toLowerCase()).join("-");
|
|
3
|
+
}
|
|
4
|
+
export function toCamelCase(path) {
|
|
5
|
+
const parts = splitPathToWords(path);
|
|
6
|
+
return parts
|
|
7
|
+
.map((p, i) => i === 0 ? p.toLowerCase() : capitalize(p))
|
|
8
|
+
.join("");
|
|
9
|
+
}
|
|
10
|
+
export function toPascalCase(path) {
|
|
11
|
+
return splitPathToWords(path).map(capitalize).join("");
|
|
12
|
+
}
|
|
13
|
+
export function toSnakeCase(path) {
|
|
14
|
+
return splitPathToWords(path).map((w) => w.toLowerCase()).join("_");
|
|
15
|
+
}
|
|
16
|
+
export function toUpperSnakeCase(path) {
|
|
17
|
+
return splitPathToWords(path).map((w) => w.toUpperCase()).join("_");
|
|
18
|
+
}
|
|
19
|
+
function splitPathToWords(path) {
|
|
20
|
+
return path
|
|
21
|
+
.replace(/\./g, "/")
|
|
22
|
+
.split(/[/\-_\s]+/)
|
|
23
|
+
.flatMap((seg) => seg.replace(/([a-z])([A-Z])/g, "$1/$2").split("/"))
|
|
24
|
+
.filter(Boolean);
|
|
25
|
+
}
|
|
26
|
+
function capitalize(s) {
|
|
27
|
+
return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();
|
|
28
|
+
}
|
|
29
|
+
export function cssVarName(path, prefix) {
|
|
30
|
+
const name = toKebabCase(path);
|
|
31
|
+
return prefix ? `--${prefix}-${name}` : `--${name}`;
|
|
32
|
+
}
|
|
33
|
+
export function swiftVarName(path) {
|
|
34
|
+
return toCamelCase(path);
|
|
35
|
+
}
|
|
36
|
+
export function kotlinVarName(path) {
|
|
37
|
+
return toPascalCase(path);
|
|
38
|
+
}
|
|
39
|
+
const CODE_SYNTAX_TEMPLATES = {
|
|
40
|
+
"{var(--css-variable)}": (p) => `var(--${toKebabCase(p)})`,
|
|
41
|
+
"{$sass-variable}": (p) => `$${toKebabCase(p)}`,
|
|
42
|
+
"{@less-variable}": (p) => `@${toKebabCase(p)}`,
|
|
43
|
+
"{UpperCamelCase}": toPascalCase,
|
|
44
|
+
"{lowerCamelCase}": toCamelCase,
|
|
45
|
+
"{UPPER_SNAKE_CASE}": toUpperSnakeCase,
|
|
46
|
+
"{lower_snake_case}": toSnakeCase,
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Resolves a codeSyntax value. If it is a template (wrapped in `{...}`),
|
|
50
|
+
* resolves using the token path. Otherwise returns the raw value as-is.
|
|
51
|
+
*/
|
|
52
|
+
export function resolveCodeSyntax(raw, tokenPath) {
|
|
53
|
+
const resolver = CODE_SYNTAX_TEMPLATES[raw];
|
|
54
|
+
if (resolver)
|
|
55
|
+
return resolver(tokenPath);
|
|
56
|
+
return raw;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sxl-studio/token-transformer",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Transform DTCG design tokens to CSS, SwiftUI, and Kotlin",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md",
|
|
10
|
+
"README.en.md",
|
|
11
|
+
"config.example.json"
|
|
12
|
+
],
|
|
13
|
+
"bin": {
|
|
14
|
+
"sxl-transform": "dist/cli.js"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"prepublishOnly": "npm run build && npm test",
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"start": "node dist/cli.js",
|
|
20
|
+
"dev": "tsx src/cli.ts",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"lint": "tsc --noEmit"
|
|
23
|
+
},
|
|
24
|
+
"keywords": ["design-tokens", "dtcg", "css", "swiftui", "kotlin", "figma"],
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"typescript": "^5.4.0",
|
|
31
|
+
"@types/node": "^20.11.0",
|
|
32
|
+
"vitest": "^3.0.0"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"ora": "^8.0.1",
|
|
36
|
+
"chalk": "^5.3.0",
|
|
37
|
+
"glob": "^10.3.10",
|
|
38
|
+
"tsx": "^4.7.0"
|
|
39
|
+
}
|
|
40
|
+
}
|