@mp3wizard/figma-console-mcp 1.25.1 → 1.27.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -33
- package/dist/cloudflare/core/config.js +0 -8
- package/dist/cloudflare/core/console-monitor.js +3 -3
- package/dist/cloudflare/core/diagnose-tool.js +96 -0
- package/dist/cloudflare/core/figma-tools.js +69 -229
- package/dist/cloudflare/core/identity.js +96 -0
- package/dist/cloudflare/core/tokens/alias-resolver.js +98 -0
- package/dist/cloudflare/core/tokens/config.js +284 -0
- package/dist/cloudflare/core/tokens/figma-converter.js +195 -0
- package/dist/cloudflare/core/tokens/formatters/css-vars.js +329 -0
- package/dist/cloudflare/core/tokens/formatters/dtcg.js +300 -0
- package/dist/cloudflare/core/tokens/formatters/index.js +45 -0
- package/dist/cloudflare/core/tokens/formatters/json.js +7 -0
- package/dist/cloudflare/core/tokens/formatters/less.js +4 -0
- package/dist/cloudflare/core/tokens/formatters/scss.js +4 -0
- package/dist/cloudflare/core/tokens/formatters/stubs.js +11 -0
- package/dist/cloudflare/core/tokens/formatters/style-dictionary-v3.js +4 -0
- package/dist/cloudflare/core/tokens/formatters/tailwind-v3.js +4 -0
- package/dist/cloudflare/core/tokens/formatters/tailwind-v4.js +4 -0
- package/dist/cloudflare/core/tokens/formatters/tokens-studio.js +4 -0
- package/dist/cloudflare/core/tokens/formatters/ts-module.js +4 -0
- package/dist/cloudflare/core/tokens/index.js +15 -0
- package/dist/cloudflare/core/tokens/parsers/css-vars.js +4 -0
- package/dist/cloudflare/core/tokens/parsers/dtcg.js +253 -0
- package/dist/cloudflare/core/tokens/parsers/index.js +138 -0
- package/dist/cloudflare/core/tokens/parsers/json.js +7 -0
- package/dist/cloudflare/core/tokens/parsers/scss.js +4 -0
- package/dist/cloudflare/core/tokens/parsers/stubs.js +13 -0
- package/dist/cloudflare/core/tokens/parsers/style-dictionary-v3.js +4 -0
- package/dist/cloudflare/core/tokens/parsers/tailwind-v3.js +4 -0
- package/dist/cloudflare/core/tokens/parsers/tailwind-v4.js +4 -0
- package/dist/cloudflare/core/tokens/parsers/tokens-studio.js +4 -0
- package/dist/cloudflare/core/tokens/schemas.js +148 -0
- package/dist/cloudflare/core/tokens/transforms/color.js +12 -0
- package/dist/cloudflare/core/tokens/transforms/index.js +29 -0
- package/dist/cloudflare/core/tokens/transforms/size.js +7 -0
- package/dist/cloudflare/core/tokens/types.js +18 -0
- package/dist/cloudflare/core/tokens-tools.js +849 -0
- package/dist/cloudflare/core/websocket-server.js +5 -55
- package/dist/cloudflare/index.js +37 -26
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +0 -8
- package/dist/core/config.js.map +1 -1
- package/dist/core/console-monitor.d.ts +2 -2
- package/dist/core/console-monitor.d.ts.map +1 -1
- package/dist/core/console-monitor.js +3 -3
- package/dist/core/console-monitor.js.map +1 -1
- package/dist/core/diagnose-tool.d.ts +33 -0
- package/dist/core/diagnose-tool.d.ts.map +1 -0
- package/dist/core/diagnose-tool.js +97 -0
- package/dist/core/diagnose-tool.js.map +1 -0
- package/dist/core/figma-connector.d.ts +1 -1
- package/dist/core/figma-connector.d.ts.map +1 -1
- package/dist/core/figma-tools.d.ts +1 -2
- package/dist/core/figma-tools.d.ts.map +1 -1
- package/dist/core/figma-tools.js +69 -229
- package/dist/core/figma-tools.js.map +1 -1
- package/dist/core/identity.d.ts +41 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +97 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/tokens/alias-resolver.d.ts +40 -0
- package/dist/core/tokens/alias-resolver.d.ts.map +1 -0
- package/dist/core/tokens/alias-resolver.js +99 -0
- package/dist/core/tokens/alias-resolver.js.map +1 -0
- package/dist/core/tokens/config.d.ts +352 -0
- package/dist/core/tokens/config.d.ts.map +1 -0
- package/dist/core/tokens/config.js +285 -0
- package/dist/core/tokens/config.js.map +1 -0
- package/dist/core/tokens/figma-converter.d.ts +81 -0
- package/dist/core/tokens/figma-converter.d.ts.map +1 -0
- package/dist/core/tokens/figma-converter.js +196 -0
- package/dist/core/tokens/figma-converter.js.map +1 -0
- package/dist/core/tokens/formatters/css-vars.d.ts +24 -0
- package/dist/core/tokens/formatters/css-vars.d.ts.map +1 -0
- package/dist/core/tokens/formatters/css-vars.js +330 -0
- package/dist/core/tokens/formatters/css-vars.js.map +1 -0
- package/dist/core/tokens/formatters/dtcg.d.ts +28 -0
- package/dist/core/tokens/formatters/dtcg.d.ts.map +1 -0
- package/dist/core/tokens/formatters/dtcg.js +301 -0
- package/dist/core/tokens/formatters/dtcg.js.map +1 -0
- package/dist/core/tokens/formatters/index.d.ts +30 -0
- package/dist/core/tokens/formatters/index.d.ts.map +1 -0
- package/dist/core/tokens/formatters/index.js +46 -0
- package/dist/core/tokens/formatters/index.js.map +1 -0
- package/dist/core/tokens/formatters/json.d.ts +5 -0
- package/dist/core/tokens/formatters/json.d.ts.map +1 -0
- package/dist/core/tokens/formatters/json.js +8 -0
- package/dist/core/tokens/formatters/json.js.map +1 -0
- package/dist/core/tokens/formatters/less.d.ts +4 -0
- package/dist/core/tokens/formatters/less.d.ts.map +1 -0
- package/dist/core/tokens/formatters/less.js +5 -0
- package/dist/core/tokens/formatters/less.js.map +1 -0
- package/dist/core/tokens/formatters/scss.d.ts +4 -0
- package/dist/core/tokens/formatters/scss.d.ts.map +1 -0
- package/dist/core/tokens/formatters/scss.js +5 -0
- package/dist/core/tokens/formatters/scss.js.map +1 -0
- package/dist/core/tokens/formatters/stubs.d.ts +9 -0
- package/dist/core/tokens/formatters/stubs.d.ts.map +1 -0
- package/dist/core/tokens/formatters/stubs.js +12 -0
- package/dist/core/tokens/formatters/stubs.js.map +1 -0
- package/dist/core/tokens/formatters/style-dictionary-v3.d.ts +4 -0
- package/dist/core/tokens/formatters/style-dictionary-v3.d.ts.map +1 -0
- package/dist/core/tokens/formatters/style-dictionary-v3.js +5 -0
- package/dist/core/tokens/formatters/style-dictionary-v3.js.map +1 -0
- package/dist/core/tokens/formatters/tailwind-v3.d.ts +4 -0
- package/dist/core/tokens/formatters/tailwind-v3.d.ts.map +1 -0
- package/dist/core/tokens/formatters/tailwind-v3.js +5 -0
- package/dist/core/tokens/formatters/tailwind-v3.js.map +1 -0
- package/dist/core/tokens/formatters/tailwind-v4.d.ts +4 -0
- package/dist/core/tokens/formatters/tailwind-v4.d.ts.map +1 -0
- package/dist/core/tokens/formatters/tailwind-v4.js +5 -0
- package/dist/core/tokens/formatters/tailwind-v4.js.map +1 -0
- package/dist/core/tokens/formatters/tokens-studio.d.ts +4 -0
- package/dist/core/tokens/formatters/tokens-studio.d.ts.map +1 -0
- package/dist/core/tokens/formatters/tokens-studio.js +5 -0
- package/dist/core/tokens/formatters/tokens-studio.js.map +1 -0
- package/dist/core/tokens/formatters/ts-module.d.ts +4 -0
- package/dist/core/tokens/formatters/ts-module.d.ts.map +1 -0
- package/dist/core/tokens/formatters/ts-module.js +5 -0
- package/dist/core/tokens/formatters/ts-module.js.map +1 -0
- package/dist/core/tokens/index.d.ts +17 -0
- package/dist/core/tokens/index.d.ts.map +1 -0
- package/dist/core/tokens/index.js +16 -0
- package/dist/core/tokens/index.js.map +1 -0
- package/dist/core/tokens/parsers/css-vars.d.ts +3 -0
- package/dist/core/tokens/parsers/css-vars.d.ts.map +1 -0
- package/dist/core/tokens/parsers/css-vars.js +5 -0
- package/dist/core/tokens/parsers/css-vars.js.map +1 -0
- package/dist/core/tokens/parsers/dtcg.d.ts +21 -0
- package/dist/core/tokens/parsers/dtcg.d.ts.map +1 -0
- package/dist/core/tokens/parsers/dtcg.js +254 -0
- package/dist/core/tokens/parsers/dtcg.js.map +1 -0
- package/dist/core/tokens/parsers/index.d.ts +37 -0
- package/dist/core/tokens/parsers/index.d.ts.map +1 -0
- package/dist/core/tokens/parsers/index.js +139 -0
- package/dist/core/tokens/parsers/index.js.map +1 -0
- package/dist/core/tokens/parsers/json.d.ts +4 -0
- package/dist/core/tokens/parsers/json.d.ts.map +1 -0
- package/dist/core/tokens/parsers/json.js +8 -0
- package/dist/core/tokens/parsers/json.js.map +1 -0
- package/dist/core/tokens/parsers/scss.d.ts +3 -0
- package/dist/core/tokens/parsers/scss.d.ts.map +1 -0
- package/dist/core/tokens/parsers/scss.js +5 -0
- package/dist/core/tokens/parsers/scss.js.map +1 -0
- package/dist/core/tokens/parsers/stubs.d.ts +11 -0
- package/dist/core/tokens/parsers/stubs.d.ts.map +1 -0
- package/dist/core/tokens/parsers/stubs.js +14 -0
- package/dist/core/tokens/parsers/stubs.js.map +1 -0
- package/dist/core/tokens/parsers/style-dictionary-v3.d.ts +3 -0
- package/dist/core/tokens/parsers/style-dictionary-v3.d.ts.map +1 -0
- package/dist/core/tokens/parsers/style-dictionary-v3.js +5 -0
- package/dist/core/tokens/parsers/style-dictionary-v3.js.map +1 -0
- package/dist/core/tokens/parsers/tailwind-v3.d.ts +3 -0
- package/dist/core/tokens/parsers/tailwind-v3.d.ts.map +1 -0
- package/dist/core/tokens/parsers/tailwind-v3.js +5 -0
- package/dist/core/tokens/parsers/tailwind-v3.js.map +1 -0
- package/dist/core/tokens/parsers/tailwind-v4.d.ts +3 -0
- package/dist/core/tokens/parsers/tailwind-v4.d.ts.map +1 -0
- package/dist/core/tokens/parsers/tailwind-v4.js +5 -0
- package/dist/core/tokens/parsers/tailwind-v4.js.map +1 -0
- package/dist/core/tokens/parsers/tokens-studio.d.ts +3 -0
- package/dist/core/tokens/parsers/tokens-studio.d.ts.map +1 -0
- package/dist/core/tokens/parsers/tokens-studio.js +5 -0
- package/dist/core/tokens/parsers/tokens-studio.js.map +1 -0
- package/dist/core/tokens/schemas.d.ts +152 -0
- package/dist/core/tokens/schemas.d.ts.map +1 -0
- package/dist/core/tokens/schemas.js +149 -0
- package/dist/core/tokens/schemas.js.map +1 -0
- package/dist/core/tokens/transforms/color.d.ts +9 -0
- package/dist/core/tokens/transforms/color.d.ts.map +1 -0
- package/dist/core/tokens/transforms/color.js +13 -0
- package/dist/core/tokens/transforms/color.js.map +1 -0
- package/dist/core/tokens/transforms/index.d.ts +36 -0
- package/dist/core/tokens/transforms/index.d.ts.map +1 -0
- package/dist/core/tokens/transforms/index.js +30 -0
- package/dist/core/tokens/transforms/index.js.map +1 -0
- package/dist/core/tokens/transforms/size.d.ts +7 -0
- package/dist/core/tokens/transforms/size.d.ts.map +1 -0
- package/dist/core/tokens/transforms/size.js +8 -0
- package/dist/core/tokens/transforms/size.js.map +1 -0
- package/dist/core/tokens/types.d.ts +228 -0
- package/dist/core/tokens/types.d.ts.map +1 -0
- package/dist/core/tokens/types.js +19 -0
- package/dist/core/tokens/types.js.map +1 -0
- package/dist/core/tokens-tools.d.ts +42 -0
- package/dist/core/tokens-tools.d.ts.map +1 -0
- package/dist/core/tokens-tools.js +850 -0
- package/dist/core/tokens-tools.js.map +1 -0
- package/dist/core/types/index.d.ts +0 -8
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/websocket-connector.d.ts +1 -1
- package/dist/core/websocket-connector.d.ts.map +1 -1
- package/dist/core/websocket-server.d.ts +4 -3
- package/dist/core/websocket-server.d.ts.map +1 -1
- package/dist/core/websocket-server.js +5 -55
- package/dist/core/websocket-server.js.map +1 -1
- package/dist/local.d.ts +0 -12
- package/dist/local.d.ts.map +1 -1
- package/dist/local.js +959 -3406
- package/dist/local.js.map +1 -1
- package/figma-desktop-bridge/code.js +11 -63
- package/figma-desktop-bridge/ui.html +72 -11
- package/package.json +10 -9
- package/figma-desktop-bridge/ui-full.html +0 -1353
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DTCG (Design Tokens Community Group) JSON parser.
|
|
3
|
+
*
|
|
4
|
+
* Reads DTCG-spec JSON (https://tr.designtokens.org/format/) and produces our
|
|
5
|
+
* canonical internal TokenDocument. Designed for non-destructive round-trip:
|
|
6
|
+
* a document serialized by `formatDtcg` then parsed back through this module
|
|
7
|
+
* is equal to the original (modulo key ordering, which the formatter sorts
|
|
8
|
+
* for stable diffs).
|
|
9
|
+
*
|
|
10
|
+
* Handles:
|
|
11
|
+
* - Group nesting with arbitrary depth
|
|
12
|
+
* - $value / $type / $description / $extensions on leaf tokens
|
|
13
|
+
* - Alias references: `"$value": "{path.to.token}"`
|
|
14
|
+
* - Group-level $type inheritance per the DTCG spec (tokens without their
|
|
15
|
+
* own $type inherit from their nearest ancestor group that has one)
|
|
16
|
+
* - Our $extensions["figma-console-mcp"] metadata for round-trip ID preservation
|
|
17
|
+
* - Multi-mode tokens stashed in $extensions.modes by our formatter
|
|
18
|
+
*/
|
|
19
|
+
import { FIGMA_MCP_EXTENSION_KEY } from "../types.js";
|
|
20
|
+
import { parseDtcgReference } from "../alias-resolver.js";
|
|
21
|
+
const DTCG_TYPES = new Set([
|
|
22
|
+
"color",
|
|
23
|
+
"dimension",
|
|
24
|
+
"fontFamily",
|
|
25
|
+
"fontWeight",
|
|
26
|
+
"duration",
|
|
27
|
+
"cubicBezier",
|
|
28
|
+
"number",
|
|
29
|
+
"string",
|
|
30
|
+
"boolean",
|
|
31
|
+
"shadow",
|
|
32
|
+
"typography",
|
|
33
|
+
"gradient",
|
|
34
|
+
"border",
|
|
35
|
+
"transition",
|
|
36
|
+
"strokeStyle",
|
|
37
|
+
]);
|
|
38
|
+
export function parseDtcg(input) {
|
|
39
|
+
const warnings = [];
|
|
40
|
+
const root = parseJson(input);
|
|
41
|
+
// Document-level $extensions: pull out our MCP metadata if present.
|
|
42
|
+
// `fileMode` is the critical piece for splitByMode round-trip — when set,
|
|
43
|
+
// every token in the file represents that mode's value, so we label them
|
|
44
|
+
// accordingly instead of falling back to "Default".
|
|
45
|
+
const meta = {};
|
|
46
|
+
let fileMode;
|
|
47
|
+
const rootExt = root.$extensions;
|
|
48
|
+
if (rootExt && typeof rootExt === "object") {
|
|
49
|
+
const mcpMeta = rootExt[FIGMA_MCP_EXTENSION_KEY];
|
|
50
|
+
if (mcpMeta && typeof mcpMeta === "object") {
|
|
51
|
+
const m = mcpMeta;
|
|
52
|
+
if (typeof m.figmaFileKey === "string")
|
|
53
|
+
meta.figmaFileKey = m.figmaFileKey;
|
|
54
|
+
if (typeof m.exportedAt === "string")
|
|
55
|
+
meta.exportedAt = m.exportedAt;
|
|
56
|
+
if (typeof m.mcpVersion === "string")
|
|
57
|
+
meta.mcpVersion = m.mcpVersion;
|
|
58
|
+
if (typeof m.fileMode === "string")
|
|
59
|
+
fileMode = m.fileMode;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Each top-level group is a TokenSet. Walk it to extract its tokens.
|
|
63
|
+
const sets = [];
|
|
64
|
+
for (const [setKey, setNode] of Object.entries(root)) {
|
|
65
|
+
if (setKey.startsWith("$"))
|
|
66
|
+
continue; // $extensions etc.
|
|
67
|
+
if (!setNode || typeof setNode !== "object") {
|
|
68
|
+
warnings.push(`Top-level entry "${setKey}" is not a group; skipping. Expected object.`);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
sets.push(extractSet(setKey, setNode, warnings, fileMode));
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
document: {
|
|
75
|
+
$schema: "https://figma-console-mcp.southleft.com/schemas/dtcg-extended-v1.json",
|
|
76
|
+
sets,
|
|
77
|
+
meta: Object.keys(meta).length > 0 ? meta : undefined,
|
|
78
|
+
},
|
|
79
|
+
detectedFormat: "dtcg",
|
|
80
|
+
warnings,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function parseJson(input) {
|
|
84
|
+
try {
|
|
85
|
+
return JSON.parse(input.payload);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
throw new Error(`[figma-console-mcp] Failed to parse DTCG JSON${input.sourcePath ? ` at ${input.sourcePath}` : ""}: ${err instanceof Error ? err.message : String(err)}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function extractSet(setKey, setNode, warnings, fileMode) {
|
|
92
|
+
const tokens = [];
|
|
93
|
+
const modes = new Set();
|
|
94
|
+
// Set-level metadata pulled from $extensions["figma-console-mcp"]. We
|
|
95
|
+
// recover the original (un-slugified) set name from `originalName` so
|
|
96
|
+
// round-trip matching works even after slugification.
|
|
97
|
+
const setExt = setNode.$extensions;
|
|
98
|
+
let figmaCollectionId;
|
|
99
|
+
let originalName;
|
|
100
|
+
if (setExt && typeof setExt === "object") {
|
|
101
|
+
const mcp = setExt[FIGMA_MCP_EXTENSION_KEY];
|
|
102
|
+
if (mcp && typeof mcp === "object") {
|
|
103
|
+
const m = mcp;
|
|
104
|
+
if (typeof m.figmaCollectionId === "string") {
|
|
105
|
+
figmaCollectionId = m.figmaCollectionId;
|
|
106
|
+
}
|
|
107
|
+
if (typeof m.originalName === "string") {
|
|
108
|
+
originalName = m.originalName;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Walk the set's tree, collecting tokens.
|
|
113
|
+
walkGroup(setNode, [], undefined, tokens, modes, warnings, fileMode);
|
|
114
|
+
return {
|
|
115
|
+
name: originalName ?? setKey,
|
|
116
|
+
description: typeof setNode.$description === "string" ? setNode.$description : undefined,
|
|
117
|
+
modes: modes.size > 0 ? [...modes] : ["Default"],
|
|
118
|
+
tokens,
|
|
119
|
+
meta: figmaCollectionId ? { figmaCollectionId } : undefined,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function walkGroup(node, path, inheritedType, tokens, modes, warnings, fileMode) {
|
|
123
|
+
// Group-level $type provides inheritance for descendant tokens that lack
|
|
124
|
+
// their own $type, per the DTCG spec.
|
|
125
|
+
const groupType = typeof node.$type === "string" && DTCG_TYPES.has(node.$type)
|
|
126
|
+
? node.$type
|
|
127
|
+
: inheritedType;
|
|
128
|
+
for (const [key, value] of Object.entries(node)) {
|
|
129
|
+
if (key.startsWith("$"))
|
|
130
|
+
continue;
|
|
131
|
+
if (!value || typeof value !== "object") {
|
|
132
|
+
warnings.push(`Non-group, non-token entry at ${[...path, key].join(".")}; skipping.`);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const childPath = [...path, key];
|
|
136
|
+
if (isLeafToken(value)) {
|
|
137
|
+
const token = extractToken(childPath, value, groupType, warnings, fileMode);
|
|
138
|
+
tokens.push(token);
|
|
139
|
+
for (const mode of Object.keys(token.values))
|
|
140
|
+
modes.add(mode);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
walkGroup(value, childPath, groupType, tokens, modes, warnings, fileMode);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function isLeafToken(node) {
|
|
148
|
+
return "$value" in node;
|
|
149
|
+
}
|
|
150
|
+
function extractToken(path, node, inheritedType, warnings, fileMode) {
|
|
151
|
+
const rawType = node.$type;
|
|
152
|
+
let type;
|
|
153
|
+
if (typeof rawType === "string" && DTCG_TYPES.has(rawType)) {
|
|
154
|
+
type = rawType;
|
|
155
|
+
}
|
|
156
|
+
else if (inheritedType) {
|
|
157
|
+
type = inheritedType;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
type = inferType(node.$value);
|
|
161
|
+
warnings.push(`Token ${path.join(".")} has no $type and no group $type inherited; inferred "${type}".`);
|
|
162
|
+
}
|
|
163
|
+
const description = typeof node.$description === "string" ? node.$description : undefined;
|
|
164
|
+
// Detect multi-mode stashed in $extensions.{FIGMA_MCP_EXTENSION_KEY}.modes
|
|
165
|
+
// (placed there by our own formatter for one-file-multi-mode output).
|
|
166
|
+
const values = {};
|
|
167
|
+
const ext = node.$extensions;
|
|
168
|
+
const mcpExt = ext && typeof ext === "object"
|
|
169
|
+
? ext[FIGMA_MCP_EXTENSION_KEY]
|
|
170
|
+
: undefined;
|
|
171
|
+
const stashedModes = mcpExt?.modes;
|
|
172
|
+
// Decide which mode name to assign to the primary $value.
|
|
173
|
+
// 1. If the file declares a fileMode (splitByMode output), use that.
|
|
174
|
+
// 2. Otherwise fall back to "Default" — the parser can't know the
|
|
175
|
+
// mode without that hint.
|
|
176
|
+
// Then absorb any stashedModes (one-file-multi-mode output) verbatim.
|
|
177
|
+
const primaryMode = fileMode ?? "Default";
|
|
178
|
+
values[primaryMode] = decodeValue(node.$value);
|
|
179
|
+
if (stashedModes) {
|
|
180
|
+
for (const [modeName, modeValue] of Object.entries(stashedModes)) {
|
|
181
|
+
// Don't overwrite the primary if a stashed entry collides with it.
|
|
182
|
+
if (modeName !== primaryMode) {
|
|
183
|
+
values[modeName] = decodeValue(modeValue);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Preserve all other vendor extensions verbatim.
|
|
188
|
+
let extensions;
|
|
189
|
+
if (ext && typeof ext === "object") {
|
|
190
|
+
extensions = {};
|
|
191
|
+
for (const [vendor, payload] of Object.entries(ext)) {
|
|
192
|
+
if (vendor === FIGMA_MCP_EXTENSION_KEY &&
|
|
193
|
+
payload &&
|
|
194
|
+
typeof payload === "object") {
|
|
195
|
+
// Strip the "modes" we already absorbed into values.
|
|
196
|
+
const cleaned = { ...payload };
|
|
197
|
+
delete cleaned.modes;
|
|
198
|
+
if (Object.keys(cleaned).length > 0) {
|
|
199
|
+
extensions[vendor] = cleaned;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
extensions[vendor] = payload;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (Object.keys(extensions).length === 0)
|
|
207
|
+
extensions = undefined;
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
path,
|
|
211
|
+
type,
|
|
212
|
+
description,
|
|
213
|
+
values,
|
|
214
|
+
extensions,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Convert a DTCG $value to our internal TokenValue. Detects alias references
|
|
219
|
+
* (strings of the form `{path.to.token}`) and unwraps them into TokenValue.reference.
|
|
220
|
+
*/
|
|
221
|
+
function decodeValue(rawValue) {
|
|
222
|
+
if (typeof rawValue === "string") {
|
|
223
|
+
const refPath = parseDtcgReference(rawValue);
|
|
224
|
+
if (refPath) {
|
|
225
|
+
return { reference: rawValue };
|
|
226
|
+
}
|
|
227
|
+
return { literal: rawValue };
|
|
228
|
+
}
|
|
229
|
+
if (rawValue === null ||
|
|
230
|
+
typeof rawValue === "number" ||
|
|
231
|
+
typeof rawValue === "boolean") {
|
|
232
|
+
return { literal: rawValue ?? "" };
|
|
233
|
+
}
|
|
234
|
+
// Composite values (typography, shadow, etc.) — preserve verbatim.
|
|
235
|
+
return { literal: rawValue };
|
|
236
|
+
}
|
|
237
|
+
function inferType(rawValue) {
|
|
238
|
+
if (typeof rawValue === "string") {
|
|
239
|
+
// Heuristics: color-ish strings → color; px/rem/em → dimension; else string.
|
|
240
|
+
if (/^#[0-9a-f]{3,8}$/i.test(rawValue))
|
|
241
|
+
return "color";
|
|
242
|
+
if (/^(rgb|hsl|oklch)/i.test(rawValue))
|
|
243
|
+
return "color";
|
|
244
|
+
if (/^[\d.]+(px|rem|em|pt|dp)$/i.test(rawValue))
|
|
245
|
+
return "dimension";
|
|
246
|
+
return "string";
|
|
247
|
+
}
|
|
248
|
+
if (typeof rawValue === "number")
|
|
249
|
+
return "number";
|
|
250
|
+
if (typeof rawValue === "boolean")
|
|
251
|
+
return "boolean";
|
|
252
|
+
return "string";
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=dtcg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dtcg.js","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/dtcg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AASH,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAU1D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAY;IACpC,OAAO;IACP,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,aAAa;IACb,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,YAAY;IACZ,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAE9B,oEAAoE;IACpE,0EAA0E;IAC1E,yEAAyE;IACzE,oDAAoD;IACpD,MAAM,IAAI,GAA0B,EAAE,CAAC;IACvC,IAAI,QAA4B,CAAC;IACjC,MAAM,OAAO,GAAI,IAAkB,CAAC,WAAW,CAAC;IAChD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAI,OAAmC,CAAC,uBAAuB,CAAC,CAAC;QAC9E,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,OAAkC,CAAC;YAC7C,IAAI,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ;gBAAE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;YAC3E,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;gBAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;YACrE,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;gBAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;YACrE,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;gBAAE,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAiB,CAAC,EAAE,CAAC;QAClE,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,mBAAmB;QACzD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CACX,oBAAoB,MAAM,8CAA8C,CACzE,CAAC;YACF,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAoB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO;QACL,QAAQ,EAAE;YACR,OAAO,EACL,uEAAuE;YACzE,IAAI;YACJ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SACtD;QACD,cAAc,EAAE,MAAM;QACtB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAiB;IAClC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,gDACE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EACjD,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,MAAc,EACd,OAAkB,EAClB,QAAkB,EAClB,QAAiB;IAEjB,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,sEAAsE;IACtE,sEAAsE;IACtE,sDAAsD;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IACnC,IAAI,iBAAqC,CAAC;IAC1C,IAAI,YAAgC,CAAC;IACrC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACzC,MAAM,GAAG,GAAI,MAAkC,CAAC,uBAAuB,CAAC,CAAC;QACzE,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,GAA8B,CAAC;YACzC,IAAI,OAAO,CAAC,CAAC,iBAAiB,KAAK,QAAQ,EAAE,CAAC;gBAC5C,iBAAiB,GAAG,CAAC,CAAC,iBAAiB,CAAC;YAC1C,CAAC;YACD,IAAI,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACvC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAErE,OAAO;QACL,IAAI,EAAE,YAAY,IAAI,MAAM;QAC5B,WAAW,EACT,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;QAC7E,KAAK,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChD,MAAM;QACN,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,IAAe,EACf,IAAc,EACd,aAAoC,EACpC,MAAe,EACf,KAAkB,EAClB,QAAkB,EAClB,QAAiB;IAEjB,yEAAyE;IACzE,sCAAsC;IACtC,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAkB,CAAC;QACvE,CAAC,CAAE,IAAI,CAAC,KAAmB;QAC3B,CAAC,CAAC,aAAa,CAAC;IAEpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CACX,iCAAiC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CACvE,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,WAAW,CAAC,KAAkB,CAAC,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,YAAY,CACxB,SAAS,EACT,KAAgC,EAChC,SAAS,EACT,QAAQ,EACR,QAAQ,CACT,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,SAAS,CACP,KAAkB,EAClB,SAAS,EACT,SAAS,EACT,MAAM,EACN,KAAK,EACL,QAAQ,EACR,QAAQ,CACT,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAe;IAClC,OAAO,QAAQ,IAAI,IAAI,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CACnB,IAAc,EACd,IAA6B,EAC7B,aAAoC,EACpC,QAAkB,EAClB,QAAiB;IAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;IAC3B,IAAI,IAAe,CAAC;IACpB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,OAAoB,CAAC,EAAE,CAAC;QACxE,IAAI,GAAG,OAAoB,CAAC;IAC9B,CAAC;SAAM,IAAI,aAAa,EAAE,CAAC;QACzB,IAAI,GAAG,aAAa,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,QAAQ,CAAC,IAAI,CACX,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,yDAAyD,IAAI,IAAI,CACzF,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GACf,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAExE,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,MAAM,GAA+B,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;IAC7B,MAAM,MAAM,GACV,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAC5B,CAAC,CAAG,GAA+B,CAAC,uBAAuB,CAE3C;QAChB,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,YAAY,GAAG,MAAM,EAAE,KAA4C,CAAC;IAE1E,0DAA0D;IAC1D,uEAAuE;IACvE,oEAAoE;IACpE,+BAA+B;IAC/B,sEAAsE;IACtE,MAAM,WAAW,GAAG,QAAQ,IAAI,SAAS,CAAC;IAC1C,MAAM,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE/C,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACjE,mEAAmE;YACnE,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,IAAI,UAA+B,CAAC;IACpC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,UAAU,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAa,CAAC,EAAE,CAAC;YAC9D,IACE,MAAM,KAAK,uBAAuB;gBAClC,OAAO;gBACP,OAAO,OAAO,KAAK,QAAQ,EAC3B,CAAC;gBACD,qDAAqD;gBACrD,MAAM,OAAO,GAA4B,EAAE,GAAI,OAAkB,EAAE,CAAC;gBACpE,OAAO,OAAO,CAAC,KAAK,CAAC;gBACrB,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnC,UAAsC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;gBAC5D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACL,UAAsC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;YAC5D,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,UAAU,GAAG,SAAS,CAAC;IACnE,CAAC;IAED,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,WAAW;QACX,MAAM;QACN,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,QAAiB;IACpC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IACD,IACE,QAAQ,KAAK,IAAI;QACjB,OAAO,QAAQ,KAAK,QAAQ;QAC5B,OAAO,QAAQ,KAAK,SAAS,EAC7B,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;IACrC,CAAC;IACD,mEAAmE;IACnE,OAAO,EAAE,OAAO,EAAE,QAAmC,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,QAAiB;IAClC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,6EAA6E;QAC7E,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,OAAO,CAAC;QACvD,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,OAAO,CAAC;QACvD,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,WAAW,CAAC;QACpE,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,OAAO,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser dispatcher. Each parser converts an input format into our canonical
|
|
3
|
+
* internal TokenDocument model.
|
|
4
|
+
*/
|
|
5
|
+
import type { ImportFormat, TokenDocument } from "../types.js";
|
|
6
|
+
export interface ParseInput {
|
|
7
|
+
/** Raw text content of the source file. */
|
|
8
|
+
payload: string;
|
|
9
|
+
/** Optional file path — used for auto-detection by extension and for error messages. */
|
|
10
|
+
sourcePath?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ParseResult {
|
|
13
|
+
document: TokenDocument;
|
|
14
|
+
/** Format the parser used (resolved from 'auto' when applicable). */
|
|
15
|
+
detectedFormat: Exclude<ImportFormat, "auto">;
|
|
16
|
+
/** Non-fatal warnings to surface to the user (unknown $type, etc.). */
|
|
17
|
+
warnings: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse a payload using the given format. When format is 'auto', sniffs the
|
|
21
|
+
* payload to pick the right parser.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parse(format: ImportFormat, input: ParseInput): ParseResult;
|
|
24
|
+
/**
|
|
25
|
+
* Sniff the payload to determine its format. Order matters — earlier checks
|
|
26
|
+
* are higher-priority signals.
|
|
27
|
+
*
|
|
28
|
+
* 1. JSON content with DTCG markers ($value/$type at any depth)
|
|
29
|
+
* 2. JSON content with Tokens Studio markers ($themes.json or $metadata)
|
|
30
|
+
* 3. JSON content with Style Dictionary v3 markers (bare value/type)
|
|
31
|
+
* 4. Tailwind v4 `@theme` block
|
|
32
|
+
* 5. CSS custom properties (`:root { --foo: bar; }`)
|
|
33
|
+
* 6. SCSS variables (`$foo: bar;`)
|
|
34
|
+
* 7. File extension as a last-resort hint
|
|
35
|
+
*/
|
|
36
|
+
export declare function detectFormat(input: ParseInput): Exclude<ImportFormat, "auto">;
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAW/D,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,qEAAqE;IACrE,cAAc,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC9C,uEAAuE;IACvE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,WAAW,CA0B1E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAsC7E"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser dispatcher. Each parser converts an input format into our canonical
|
|
3
|
+
* internal TokenDocument model.
|
|
4
|
+
*/
|
|
5
|
+
import { parseDtcg } from "./dtcg.js";
|
|
6
|
+
import { parseTokensStudio } from "./tokens-studio.js";
|
|
7
|
+
import { parseCssVars } from "./css-vars.js";
|
|
8
|
+
import { parseTailwindV4 } from "./tailwind-v4.js";
|
|
9
|
+
import { parseTailwindV3Config } from "./tailwind-v3.js";
|
|
10
|
+
import { parseScss } from "./scss.js";
|
|
11
|
+
import { parseStyleDictionaryV3 } from "./style-dictionary-v3.js";
|
|
12
|
+
import { parseJsonFlat, parseJsonNested } from "./json.js";
|
|
13
|
+
/**
|
|
14
|
+
* Parse a payload using the given format. When format is 'auto', sniffs the
|
|
15
|
+
* payload to pick the right parser.
|
|
16
|
+
*/
|
|
17
|
+
export function parse(format, input) {
|
|
18
|
+
const resolved = format === "auto" ? detectFormat(input) : format;
|
|
19
|
+
switch (resolved) {
|
|
20
|
+
case "dtcg":
|
|
21
|
+
return parseDtcg(input);
|
|
22
|
+
case "tokens-studio":
|
|
23
|
+
return parseTokensStudio(input);
|
|
24
|
+
case "css-vars":
|
|
25
|
+
return parseCssVars(input);
|
|
26
|
+
case "tailwind-v4":
|
|
27
|
+
return parseTailwindV4(input);
|
|
28
|
+
case "tailwind-v3-config":
|
|
29
|
+
return parseTailwindV3Config(input);
|
|
30
|
+
case "scss":
|
|
31
|
+
return parseScss(input);
|
|
32
|
+
case "style-dictionary-v3":
|
|
33
|
+
return parseStyleDictionaryV3(input);
|
|
34
|
+
case "json-flat":
|
|
35
|
+
return parseJsonFlat(input);
|
|
36
|
+
case "json-nested":
|
|
37
|
+
return parseJsonNested(input);
|
|
38
|
+
default: {
|
|
39
|
+
const _exhaustive = resolved;
|
|
40
|
+
throw new Error(`[figma-console-mcp] Unknown import format: ${_exhaustive}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Sniff the payload to determine its format. Order matters — earlier checks
|
|
46
|
+
* are higher-priority signals.
|
|
47
|
+
*
|
|
48
|
+
* 1. JSON content with DTCG markers ($value/$type at any depth)
|
|
49
|
+
* 2. JSON content with Tokens Studio markers ($themes.json or $metadata)
|
|
50
|
+
* 3. JSON content with Style Dictionary v3 markers (bare value/type)
|
|
51
|
+
* 4. Tailwind v4 `@theme` block
|
|
52
|
+
* 5. CSS custom properties (`:root { --foo: bar; }`)
|
|
53
|
+
* 6. SCSS variables (`$foo: bar;`)
|
|
54
|
+
* 7. File extension as a last-resort hint
|
|
55
|
+
*/
|
|
56
|
+
export function detectFormat(input) {
|
|
57
|
+
const trimmed = input.payload.trim();
|
|
58
|
+
// JSON-shape sniffing
|
|
59
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
60
|
+
try {
|
|
61
|
+
const parsed = JSON.parse(trimmed);
|
|
62
|
+
if (hasDtcgMarkers(parsed))
|
|
63
|
+
return "dtcg";
|
|
64
|
+
if (hasTokensStudioMarkers(parsed))
|
|
65
|
+
return "tokens-studio";
|
|
66
|
+
if (hasStyleDictionaryV3Markers(parsed))
|
|
67
|
+
return "style-dictionary-v3";
|
|
68
|
+
if (looksFlat(parsed))
|
|
69
|
+
return "json-flat";
|
|
70
|
+
return "json-nested";
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Not actually JSON — fall through to text sniffing.
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Tailwind v4: presence of `@theme` directive
|
|
77
|
+
if (trimmed.includes("@theme"))
|
|
78
|
+
return "tailwind-v4";
|
|
79
|
+
// CSS custom properties
|
|
80
|
+
if (/--[a-z][a-z0-9_-]*\s*:/i.test(trimmed))
|
|
81
|
+
return "css-vars";
|
|
82
|
+
// SCSS variables
|
|
83
|
+
if (/^\s*\$[a-z][a-z0-9_-]*\s*:/im.test(trimmed))
|
|
84
|
+
return "scss";
|
|
85
|
+
// File extension fallback
|
|
86
|
+
if (input.sourcePath) {
|
|
87
|
+
if (input.sourcePath.endsWith(".css"))
|
|
88
|
+
return "css-vars";
|
|
89
|
+
if (input.sourcePath.endsWith(".scss"))
|
|
90
|
+
return "scss";
|
|
91
|
+
if (input.sourcePath.endsWith(".json"))
|
|
92
|
+
return "json-nested";
|
|
93
|
+
}
|
|
94
|
+
throw new Error(`[figma-console-mcp] Unable to auto-detect format for ${input.sourcePath ?? "payload"}. Pass an explicit format to figma_import_tokens.`);
|
|
95
|
+
}
|
|
96
|
+
function hasDtcgMarkers(obj) {
|
|
97
|
+
if (typeof obj !== "object" || obj === null)
|
|
98
|
+
return false;
|
|
99
|
+
for (const key of Object.keys(obj)) {
|
|
100
|
+
const val = obj[key];
|
|
101
|
+
if (key === "$value" || key === "$type")
|
|
102
|
+
return true;
|
|
103
|
+
if (val && typeof val === "object" && hasDtcgMarkers(val))
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
function hasTokensStudioMarkers(obj) {
|
|
109
|
+
if (typeof obj !== "object" || obj === null)
|
|
110
|
+
return false;
|
|
111
|
+
const top = obj;
|
|
112
|
+
// Tokens Studio's signature: presence of $themes or $metadata at the root,
|
|
113
|
+
// or selectedTokenSets nested inside the document.
|
|
114
|
+
return ("$themes" in top ||
|
|
115
|
+
"$metadata" in top ||
|
|
116
|
+
JSON.stringify(top).includes("selectedTokenSets"));
|
|
117
|
+
}
|
|
118
|
+
function hasStyleDictionaryV3Markers(obj) {
|
|
119
|
+
if (typeof obj !== "object" || obj === null)
|
|
120
|
+
return false;
|
|
121
|
+
// SD v3 uses bare "value" and "type" fields (no $ prefix) on leaf nodes.
|
|
122
|
+
for (const val of Object.values(obj)) {
|
|
123
|
+
if (val && typeof val === "object") {
|
|
124
|
+
const inner = val;
|
|
125
|
+
if ("value" in inner && ("type" in inner || typeof inner.value !== "object")) {
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
if (hasStyleDictionaryV3Markers(val))
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
function looksFlat(obj) {
|
|
135
|
+
if (typeof obj !== "object" || obj === null)
|
|
136
|
+
return false;
|
|
137
|
+
return Object.values(obj).every((v) => typeof v !== "object" || v === null);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG1D,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAE7D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAE/D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TokenFormatNotImplementedError } from "./stubs.js";
|
|
2
|
+
export function parseJsonFlat(_input) {
|
|
3
|
+
throw new TokenFormatNotImplementedError("flat JSON", "parser");
|
|
4
|
+
}
|
|
5
|
+
export function parseJsonNested(_input) {
|
|
6
|
+
throw new TokenFormatNotImplementedError("nested JSON", "parser");
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,UAAU,aAAa,CAAC,MAAkB;IAC9C,MAAM,IAAI,8BAA8B,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAkB;IAChD,MAAM,IAAI,8BAA8B,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scss.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/scss.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG1D,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAEzD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scss.js","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/scss.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,UAAU,SAAS,CAAC,MAAkB;IAC1C,MAAM,IAAI,8BAA8B,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared NotImplementedError for parsers/formatters that are scaffolded but
|
|
3
|
+
* not yet implemented. DTCG round-trip is the canonical fully-implemented
|
|
4
|
+
* path; CSS variables is also fully implemented as a formatter output.
|
|
5
|
+
* Everything else returns a helpful error pointing the user at the canonical
|
|
6
|
+
* format.
|
|
7
|
+
*/
|
|
8
|
+
export declare class TokenFormatNotImplementedError extends Error {
|
|
9
|
+
constructor(formatName: string, kind: "parser" | "formatter");
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=stubs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/stubs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,qBAAa,8BAA+B,SAAQ,KAAK;gBAC3C,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,WAAW;CAM7D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared NotImplementedError for parsers/formatters that are scaffolded but
|
|
3
|
+
* not yet implemented. DTCG round-trip is the canonical fully-implemented
|
|
4
|
+
* path; CSS variables is also fully implemented as a formatter output.
|
|
5
|
+
* Everything else returns a helpful error pointing the user at the canonical
|
|
6
|
+
* format.
|
|
7
|
+
*/
|
|
8
|
+
export class TokenFormatNotImplementedError extends Error {
|
|
9
|
+
constructor(formatName, kind) {
|
|
10
|
+
super(`[figma-console-mcp] The ${formatName} ${kind} is scaffolded but not yet implemented. Fully implemented: DTCG JSON (parser + formatter) and CSS custom properties (formatter only). For now, export to 'dtcg' as the canonical format and either consume the JSON directly or convert downstream — or open an issue with your use case to prioritize this format.`);
|
|
11
|
+
this.name = "TokenFormatNotImplementedError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=stubs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stubs.js","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/stubs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD,YAAY,UAAkB,EAAE,IAA4B;QAC1D,KAAK,CACH,2BAA2B,UAAU,IAAI,IAAI,qTAAqT,CACnW,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-dictionary-v3.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/style-dictionary-v3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG1D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAEtE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-dictionary-v3.js","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/style-dictionary-v3.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,UAAU,sBAAsB,CAAC,MAAkB;IACvD,MAAM,IAAI,8BAA8B,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind-v3.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/tailwind-v3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG1D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAErE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind-v3.js","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/tailwind-v3.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,UAAU,qBAAqB,CAAC,MAAkB;IACtD,MAAM,IAAI,8BAA8B,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind-v4.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/tailwind-v4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG1D,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAE/D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind-v4.js","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/tailwind-v4.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,UAAU,eAAe,CAAC,MAAkB;IAChD,MAAM,IAAI,8BAA8B,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens-studio.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/tokens-studio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG1D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAEjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens-studio.js","sourceRoot":"","sources":["../../../../src/core/tokens/parsers/tokens-studio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,UAAU,iBAAiB,CAAC,MAAkB;IAClD,MAAM,IAAI,8BAA8B,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;AACtE,CAAC"}
|