@mp3wizard/figma-console-mcp 1.14.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/LICENSE +21 -0
- package/README.md +816 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.js +278 -0
- package/dist/apps/design-system-dashboard/scoring/accessibility.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts +29 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.js +358 -0
- package/dist/apps/design-system-dashboard/scoring/component-metadata.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.js +342 -0
- package/dist/apps/design-system-dashboard/scoring/consistency.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.js +231 -0
- package/dist/apps/design-system-dashboard/scoring/coverage.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/engine.d.ts +27 -0
- package/dist/apps/design-system-dashboard/scoring/engine.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/engine.js +93 -0
- package/dist/apps/design-system-dashboard/scoring/engine.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.js +309 -0
- package/dist/apps/design-system-dashboard/scoring/naming-semantics.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts +14 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.js +350 -0
- package/dist/apps/design-system-dashboard/scoring/token-architecture.js.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/types.d.ts +89 -0
- package/dist/apps/design-system-dashboard/scoring/types.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/scoring/types.js +41 -0
- package/dist/apps/design-system-dashboard/scoring/types.js.map +1 -0
- package/dist/apps/design-system-dashboard/server.d.ts +24 -0
- package/dist/apps/design-system-dashboard/server.d.ts.map +1 -0
- package/dist/apps/design-system-dashboard/server.js +160 -0
- package/dist/apps/design-system-dashboard/server.js.map +1 -0
- package/dist/apps/token-browser/server.d.ts +26 -0
- package/dist/apps/token-browser/server.d.ts.map +1 -0
- package/dist/apps/token-browser/server.js +137 -0
- package/dist/apps/token-browser/server.js.map +1 -0
- package/dist/browser/base.d.ts +58 -0
- package/dist/browser/base.d.ts.map +1 -0
- package/dist/browser/base.js +6 -0
- package/dist/browser/base.js.map +1 -0
- package/dist/browser/local.d.ts +87 -0
- package/dist/browser/local.d.ts.map +1 -0
- package/dist/browser/local.js +318 -0
- package/dist/browser/local.js.map +1 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/accessibility.js +277 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/component-metadata.js +357 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/consistency.js +341 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/coverage.js +230 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/engine.js +92 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/naming-semantics.js +308 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/token-architecture.js +349 -0
- package/dist/cloudflare/apps/design-system-dashboard/scoring/types.js +40 -0
- package/dist/cloudflare/apps/design-system-dashboard/server.js +159 -0
- package/dist/cloudflare/apps/token-browser/server.js +136 -0
- package/dist/cloudflare/browser/base.js +5 -0
- package/dist/cloudflare/browser/cloudflare.js +156 -0
- package/dist/cloudflare/browser-manager.js +157 -0
- package/dist/cloudflare/core/cloud-websocket-connector.js +267 -0
- package/dist/cloudflare/core/cloud-websocket-relay.js +199 -0
- package/dist/cloudflare/core/comment-tools.js +292 -0
- package/dist/cloudflare/core/config.js +161 -0
- package/dist/cloudflare/core/console-monitor.js +427 -0
- package/dist/cloudflare/core/design-code-tools.js +2504 -0
- package/dist/cloudflare/core/design-system-manifest.js +260 -0
- package/dist/cloudflare/core/design-system-tools.js +863 -0
- package/dist/cloudflare/core/enrichment/enrichment-service.js +272 -0
- package/dist/cloudflare/core/enrichment/index.js +7 -0
- package/dist/cloudflare/core/enrichment/relationship-mapper.js +351 -0
- package/dist/cloudflare/core/enrichment/style-resolver.js +326 -0
- package/dist/cloudflare/core/figma-api.js +409 -0
- package/dist/cloudflare/core/figma-connector.js +7 -0
- package/dist/cloudflare/core/figma-desktop-connector.js +1184 -0
- package/dist/cloudflare/core/figma-reconstruction-spec.js +402 -0
- package/dist/cloudflare/core/figma-style-extractor.js +311 -0
- package/dist/cloudflare/core/figma-tools.js +2947 -0
- package/dist/cloudflare/core/logger.js +53 -0
- package/dist/cloudflare/core/port-discovery.js +282 -0
- package/dist/cloudflare/core/snippet-injector.js +96 -0
- package/dist/cloudflare/core/types/design-code.js +4 -0
- package/dist/cloudflare/core/types/enriched.js +5 -0
- package/dist/cloudflare/core/types/index.js +4 -0
- package/dist/cloudflare/core/websocket-connector.js +256 -0
- package/dist/cloudflare/core/websocket-server.js +646 -0
- package/dist/cloudflare/core/write-tools.js +2091 -0
- package/dist/cloudflare/index.js +2899 -0
- package/dist/cloudflare/test-browser.js +88 -0
- package/dist/core/comment-tools.d.ts +11 -0
- package/dist/core/comment-tools.d.ts.map +1 -0
- package/dist/core/comment-tools.js +293 -0
- package/dist/core/comment-tools.js.map +1 -0
- package/dist/core/config.d.ts +17 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +162 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/console-monitor.d.ts +82 -0
- package/dist/core/console-monitor.d.ts.map +1 -0
- package/dist/core/console-monitor.js +428 -0
- package/dist/core/console-monitor.js.map +1 -0
- package/dist/core/design-code-tools.d.ts +127 -0
- package/dist/core/design-code-tools.d.ts.map +1 -0
- package/dist/core/design-code-tools.js +2505 -0
- package/dist/core/design-code-tools.js.map +1 -0
- package/dist/core/design-system-manifest.d.ts +272 -0
- package/dist/core/design-system-manifest.d.ts.map +1 -0
- package/dist/core/design-system-manifest.js +261 -0
- package/dist/core/design-system-manifest.js.map +1 -0
- package/dist/core/design-system-tools.d.ts +17 -0
- package/dist/core/design-system-tools.d.ts.map +1 -0
- package/dist/core/design-system-tools.js +864 -0
- package/dist/core/design-system-tools.js.map +1 -0
- package/dist/core/enrichment/enrichment-service.d.ts +52 -0
- package/dist/core/enrichment/enrichment-service.d.ts.map +1 -0
- package/dist/core/enrichment/enrichment-service.js +273 -0
- package/dist/core/enrichment/enrichment-service.js.map +1 -0
- package/dist/core/enrichment/index.d.ts +8 -0
- package/dist/core/enrichment/index.d.ts.map +1 -0
- package/dist/core/enrichment/index.js +8 -0
- package/dist/core/enrichment/index.js.map +1 -0
- package/dist/core/enrichment/relationship-mapper.d.ts +106 -0
- package/dist/core/enrichment/relationship-mapper.d.ts.map +1 -0
- package/dist/core/enrichment/relationship-mapper.js +352 -0
- package/dist/core/enrichment/relationship-mapper.js.map +1 -0
- package/dist/core/enrichment/style-resolver.d.ts +80 -0
- package/dist/core/enrichment/style-resolver.d.ts.map +1 -0
- package/dist/core/enrichment/style-resolver.js +327 -0
- package/dist/core/enrichment/style-resolver.js.map +1 -0
- package/dist/core/figma-api.d.ts +201 -0
- package/dist/core/figma-api.d.ts.map +1 -0
- package/dist/core/figma-api.js +410 -0
- package/dist/core/figma-api.js.map +1 -0
- package/dist/core/figma-connector.d.ts +48 -0
- package/dist/core/figma-connector.d.ts.map +1 -0
- package/dist/core/figma-connector.js +8 -0
- package/dist/core/figma-connector.js.map +1 -0
- package/dist/core/figma-desktop-connector.d.ts +265 -0
- package/dist/core/figma-desktop-connector.d.ts.map +1 -0
- package/dist/core/figma-desktop-connector.js +1184 -0
- package/dist/core/figma-desktop-connector.js.map +1 -0
- package/dist/core/figma-reconstruction-spec.d.ts +166 -0
- package/dist/core/figma-reconstruction-spec.d.ts.map +1 -0
- package/dist/core/figma-reconstruction-spec.js +403 -0
- package/dist/core/figma-reconstruction-spec.js.map +1 -0
- package/dist/core/figma-style-extractor.d.ts +76 -0
- package/dist/core/figma-style-extractor.d.ts.map +1 -0
- package/dist/core/figma-style-extractor.js +312 -0
- package/dist/core/figma-style-extractor.js.map +1 -0
- package/dist/core/figma-tools.d.ts +23 -0
- package/dist/core/figma-tools.d.ts.map +1 -0
- package/dist/core/figma-tools.js +2948 -0
- package/dist/core/figma-tools.js.map +1 -0
- package/dist/core/logger.d.ts +22 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +54 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/port-discovery.d.ts +110 -0
- package/dist/core/port-discovery.d.ts.map +1 -0
- package/dist/core/port-discovery.js +283 -0
- package/dist/core/port-discovery.js.map +1 -0
- package/dist/core/snippet-injector.d.ts +24 -0
- package/dist/core/snippet-injector.d.ts.map +1 -0
- package/dist/core/snippet-injector.js +97 -0
- package/dist/core/snippet-injector.js.map +1 -0
- package/dist/core/types/design-code.d.ts +262 -0
- package/dist/core/types/design-code.d.ts.map +1 -0
- package/dist/core/types/design-code.js +5 -0
- package/dist/core/types/design-code.js.map +1 -0
- package/dist/core/types/enriched.d.ts +213 -0
- package/dist/core/types/enriched.d.ts.map +1 -0
- package/dist/core/types/enriched.js +6 -0
- package/dist/core/types/enriched.js.map +1 -0
- package/dist/core/types/index.d.ts +112 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +5 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/websocket-connector.d.ts +55 -0
- package/dist/core/websocket-connector.d.ts.map +1 -0
- package/dist/core/websocket-connector.js +257 -0
- package/dist/core/websocket-connector.js.map +1 -0
- package/dist/core/websocket-server.d.ts +191 -0
- package/dist/core/websocket-server.d.ts.map +1 -0
- package/dist/core/websocket-server.js +647 -0
- package/dist/core/websocket-server.js.map +1 -0
- package/dist/core/write-tools.d.ts +7 -0
- package/dist/core/write-tools.d.ts.map +1 -0
- package/dist/core/write-tools.js +2092 -0
- package/dist/core/write-tools.js.map +1 -0
- package/dist/local.d.ts +84 -0
- package/dist/local.d.ts.map +1 -0
- package/dist/local.js +5039 -0
- package/dist/local.js.map +1 -0
- package/figma-desktop-bridge/README.md +313 -0
- package/figma-desktop-bridge/code.js +2818 -0
- package/figma-desktop-bridge/manifest.json +67 -0
- package/figma-desktop-bridge/ui.html +1236 -0
- package/package.json +87 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Style Value Resolver
|
|
3
|
+
* Resolves style values from variable references and provides formatted outputs
|
|
4
|
+
*/
|
|
5
|
+
export class StyleValueResolver {
|
|
6
|
+
constructor(logger) {
|
|
7
|
+
this.cache = new Map();
|
|
8
|
+
this.variableCache = new Map();
|
|
9
|
+
this.logger = logger;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Resolve a style's value, handling variable references
|
|
13
|
+
*/
|
|
14
|
+
async resolveStyleValue(style, variables, maxDepth = 10) {
|
|
15
|
+
const cacheKey = `style:${style.key || style.node_id}`;
|
|
16
|
+
// Check cache
|
|
17
|
+
if (this.cache.has(cacheKey)) {
|
|
18
|
+
return this.cache.get(cacheKey);
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
// Get the actual style node data
|
|
22
|
+
const styleData = await this.getStyleData(style);
|
|
23
|
+
if (!styleData) {
|
|
24
|
+
return { value: null };
|
|
25
|
+
}
|
|
26
|
+
// Check if this style uses a variable
|
|
27
|
+
const variableRef = this.findVariableReference(styleData);
|
|
28
|
+
if (variableRef && variables.has(variableRef.id)) {
|
|
29
|
+
// Resolve the variable value
|
|
30
|
+
const variable = variables.get(variableRef.id);
|
|
31
|
+
const resolvedValue = await this.resolveVariableValue(variable, variables, maxDepth);
|
|
32
|
+
const result = {
|
|
33
|
+
value: resolvedValue,
|
|
34
|
+
variableRef: {
|
|
35
|
+
id: variableRef.id,
|
|
36
|
+
name: variable.name,
|
|
37
|
+
collection: variable.variableCollectionId,
|
|
38
|
+
resolvedType: variable.resolvedType,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
this.cache.set(cacheKey, result);
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
// No variable reference, return direct value
|
|
45
|
+
const directValue = this.extractDirectValue(styleData, style.style_type);
|
|
46
|
+
const result = { value: directValue };
|
|
47
|
+
this.cache.set(cacheKey, result);
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
this.logger.error({
|
|
52
|
+
error,
|
|
53
|
+
style: style.name,
|
|
54
|
+
}, "Error resolving style value");
|
|
55
|
+
return { value: null };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Resolve a variable's value, handling alias chains
|
|
60
|
+
*/
|
|
61
|
+
async resolveVariableValue(variable, allVariables, maxDepth = 10, currentDepth = 0) {
|
|
62
|
+
if (currentDepth >= maxDepth) {
|
|
63
|
+
this.logger.warn({
|
|
64
|
+
variable: variable.name,
|
|
65
|
+
}, "Max resolution depth reached");
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const cacheKey = `var:${variable.id}`;
|
|
69
|
+
if (this.variableCache.has(cacheKey)) {
|
|
70
|
+
return this.variableCache.get(cacheKey);
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
// Get the value for the default mode (or first available mode)
|
|
74
|
+
const modes = Object.keys(variable.valuesByMode || {});
|
|
75
|
+
if (modes.length === 0) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const defaultMode = modes[0]; // TODO: Support mode selection
|
|
79
|
+
const value = variable.valuesByMode[defaultMode];
|
|
80
|
+
// Check if this is an alias (reference to another variable)
|
|
81
|
+
if (typeof value === "object" && value.type === "VARIABLE_ALIAS") {
|
|
82
|
+
const targetVariable = allVariables.get(value.id);
|
|
83
|
+
if (!targetVariable) {
|
|
84
|
+
this.logger.warn({
|
|
85
|
+
source: variable.name,
|
|
86
|
+
targetId: value.id,
|
|
87
|
+
}, "Variable alias target not found");
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
// Recursively resolve the alias
|
|
91
|
+
const resolvedValue = await this.resolveVariableValue(targetVariable, allVariables, maxDepth, currentDepth + 1);
|
|
92
|
+
this.variableCache.set(cacheKey, resolvedValue);
|
|
93
|
+
return resolvedValue;
|
|
94
|
+
}
|
|
95
|
+
// Direct value - format based on type
|
|
96
|
+
const formattedValue = this.formatVariableValue(value, variable.resolvedType);
|
|
97
|
+
this.variableCache.set(cacheKey, formattedValue);
|
|
98
|
+
return formattedValue;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
this.logger.error({
|
|
102
|
+
error,
|
|
103
|
+
variable: variable.name,
|
|
104
|
+
}, "Error resolving variable value");
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Format a variable value based on its type
|
|
110
|
+
*/
|
|
111
|
+
formatVariableValue(value, type) {
|
|
112
|
+
if (!value)
|
|
113
|
+
return null;
|
|
114
|
+
switch (type) {
|
|
115
|
+
case "COLOR":
|
|
116
|
+
return this.formatColor(value);
|
|
117
|
+
case "FLOAT":
|
|
118
|
+
case "NUMBER":
|
|
119
|
+
return value;
|
|
120
|
+
case "STRING":
|
|
121
|
+
return value;
|
|
122
|
+
case "BOOLEAN":
|
|
123
|
+
return Boolean(value);
|
|
124
|
+
default:
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Format a color value to hex string
|
|
130
|
+
*/
|
|
131
|
+
formatColor(color) {
|
|
132
|
+
if (typeof color === "string") {
|
|
133
|
+
return color;
|
|
134
|
+
}
|
|
135
|
+
if (color.r !== undefined && color.g !== undefined && color.b !== undefined) {
|
|
136
|
+
const r = Math.round(color.r * 255);
|
|
137
|
+
const g = Math.round(color.g * 255);
|
|
138
|
+
const b = Math.round(color.b * 255);
|
|
139
|
+
return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`.toUpperCase();
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Generate export formats for a resolved value
|
|
145
|
+
*/
|
|
146
|
+
generateExportFormats(name, value, type, formats = ["css", "sass", "tailwind", "typescript", "json"]) {
|
|
147
|
+
const result = {};
|
|
148
|
+
// Sanitize name for different formats
|
|
149
|
+
const cssName = this.toCSSVariableName(name);
|
|
150
|
+
const sassName = this.toSassVariableName(name);
|
|
151
|
+
const tailwindName = this.toTailwindClassName(name);
|
|
152
|
+
const tsName = this.toTypeScriptPath(name);
|
|
153
|
+
const jsonPath = this.toJSONPath(name);
|
|
154
|
+
for (const format of formats) {
|
|
155
|
+
switch (format) {
|
|
156
|
+
case "css":
|
|
157
|
+
result.css = `var(${cssName})`;
|
|
158
|
+
break;
|
|
159
|
+
case "sass":
|
|
160
|
+
result.sass = sassName;
|
|
161
|
+
break;
|
|
162
|
+
case "tailwind":
|
|
163
|
+
result.tailwind = tailwindName;
|
|
164
|
+
break;
|
|
165
|
+
case "typescript":
|
|
166
|
+
result.typescript = tsName;
|
|
167
|
+
break;
|
|
168
|
+
case "json":
|
|
169
|
+
result.json = jsonPath;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Convert token name to CSS variable format
|
|
177
|
+
* Example: "color/background/primary-default" -> "--color-background-primary-default"
|
|
178
|
+
*/
|
|
179
|
+
toCSSVariableName(name) {
|
|
180
|
+
return `--${name.replace(/\//g, "-").toLowerCase()}`;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Convert token name to Sass variable format
|
|
184
|
+
* Example: "color/background/primary-default" -> "$color-background-primary-default"
|
|
185
|
+
*/
|
|
186
|
+
toSassVariableName(name) {
|
|
187
|
+
return `$${name.replace(/\//g, "-").toLowerCase()}`;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Convert token name to Tailwind class format
|
|
191
|
+
* Example: "color/background/primary-default" -> "bg-primary"
|
|
192
|
+
*/
|
|
193
|
+
toTailwindClassName(name) {
|
|
194
|
+
const parts = name.split("/");
|
|
195
|
+
// Try to infer Tailwind utility class
|
|
196
|
+
if (parts[0] === "color") {
|
|
197
|
+
if (parts[1] === "background") {
|
|
198
|
+
return `bg-${parts[parts.length - 1].toLowerCase()}`;
|
|
199
|
+
}
|
|
200
|
+
if (parts[1] === "text") {
|
|
201
|
+
return `text-${parts[parts.length - 1].toLowerCase()}`;
|
|
202
|
+
}
|
|
203
|
+
if (parts[1] === "border") {
|
|
204
|
+
return `border-${parts[parts.length - 1].toLowerCase()}`;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (parts[0] === "spacing") {
|
|
208
|
+
return `space-${parts[parts.length - 1].toLowerCase()}`;
|
|
209
|
+
}
|
|
210
|
+
// Fallback: use last part
|
|
211
|
+
return parts[parts.length - 1].toLowerCase();
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Convert token name to TypeScript path format
|
|
215
|
+
* Example: "color/background/primary-default" -> "tokens.color.background.primaryDefault"
|
|
216
|
+
*/
|
|
217
|
+
toTypeScriptPath(name) {
|
|
218
|
+
const parts = name.split("/");
|
|
219
|
+
const camelCaseParts = parts.map((part, index) => {
|
|
220
|
+
if (index === 0)
|
|
221
|
+
return part.toLowerCase();
|
|
222
|
+
return part
|
|
223
|
+
.split("-")
|
|
224
|
+
.map((word, i) => i === 0
|
|
225
|
+
? word.toLowerCase()
|
|
226
|
+
: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
227
|
+
.join("");
|
|
228
|
+
});
|
|
229
|
+
return `tokens.${camelCaseParts.join(".")}`;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Convert token name to nested JSON path
|
|
233
|
+
* Example: "color/background/primary-default" -> { color: { background: { primaryDefault: value } } }
|
|
234
|
+
*/
|
|
235
|
+
toJSONPath(name) {
|
|
236
|
+
const parts = name.split("/");
|
|
237
|
+
const result = {};
|
|
238
|
+
let current = result;
|
|
239
|
+
for (let i = 0; i < parts.length; i++) {
|
|
240
|
+
const key = parts[i]
|
|
241
|
+
.split("-")
|
|
242
|
+
.map((word, j) => j === 0
|
|
243
|
+
? word.toLowerCase()
|
|
244
|
+
: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
245
|
+
.join("");
|
|
246
|
+
if (i === parts.length - 1) {
|
|
247
|
+
current[key] = "[VALUE]"; // Placeholder
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
current[key] = {};
|
|
251
|
+
current = current[key];
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return result;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get style data from Figma API
|
|
258
|
+
* This would be called via the Figma API client
|
|
259
|
+
*/
|
|
260
|
+
async getStyleData(style) {
|
|
261
|
+
// TODO: Implement actual Figma API call
|
|
262
|
+
// For now, return the style object itself
|
|
263
|
+
return style;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Find variable reference in style data
|
|
267
|
+
*/
|
|
268
|
+
findVariableReference(styleData) {
|
|
269
|
+
// Check for boundVariables (new variables API)
|
|
270
|
+
if (styleData.boundVariables) {
|
|
271
|
+
// Check common properties that can be bound to variables
|
|
272
|
+
const props = ["fills", "strokes", "effects", "text"];
|
|
273
|
+
for (const prop of props) {
|
|
274
|
+
if (styleData.boundVariables[prop]) {
|
|
275
|
+
const binding = styleData.boundVariables[prop];
|
|
276
|
+
if (Array.isArray(binding) && binding.length > 0) {
|
|
277
|
+
return { id: binding[0].id };
|
|
278
|
+
}
|
|
279
|
+
if (binding.id) {
|
|
280
|
+
return { id: binding.id };
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Extract direct value from style (no variable)
|
|
289
|
+
*/
|
|
290
|
+
extractDirectValue(styleData, styleType) {
|
|
291
|
+
switch (styleType) {
|
|
292
|
+
case "FILL":
|
|
293
|
+
if (styleData.fills && styleData.fills.length > 0) {
|
|
294
|
+
const fill = styleData.fills[0];
|
|
295
|
+
if (fill.type === "SOLID") {
|
|
296
|
+
return this.formatColor(fill.color);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return null;
|
|
300
|
+
case "TEXT":
|
|
301
|
+
if (styleData.fontFamily) {
|
|
302
|
+
return {
|
|
303
|
+
fontFamily: styleData.fontFamily,
|
|
304
|
+
fontSize: styleData.fontSize,
|
|
305
|
+
fontWeight: styleData.fontWeight,
|
|
306
|
+
lineHeight: styleData.lineHeight,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
return null;
|
|
310
|
+
case "EFFECT":
|
|
311
|
+
if (styleData.effects && styleData.effects.length > 0) {
|
|
312
|
+
return styleData.effects;
|
|
313
|
+
}
|
|
314
|
+
return null;
|
|
315
|
+
default:
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Clear the cache
|
|
321
|
+
*/
|
|
322
|
+
clearCache() {
|
|
323
|
+
this.cache.clear();
|
|
324
|
+
this.variableCache.clear();
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=style-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-resolver.js","sourceRoot":"","sources":["../../../src/core/enrichment/style-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Figma REST API Client
|
|
3
|
+
* Handles HTTP calls to Figma's REST API for file data, variables, components, and styles
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Figma API Client Configuration
|
|
7
|
+
*/
|
|
8
|
+
export interface FigmaAPIConfig {
|
|
9
|
+
accessToken: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Extract file key from Figma URL
|
|
13
|
+
* @example https://www.figma.com/design/abc123/My-File -> abc123
|
|
14
|
+
*/
|
|
15
|
+
export declare function extractFileKey(url: string): string | null;
|
|
16
|
+
/**
|
|
17
|
+
* Information extracted from a Figma URL
|
|
18
|
+
* Includes file key, optional branch ID, and optional node ID
|
|
19
|
+
*/
|
|
20
|
+
export interface FigmaUrlInfo {
|
|
21
|
+
fileKey: string;
|
|
22
|
+
branchId?: string;
|
|
23
|
+
nodeId?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Extract comprehensive URL info including branch and node IDs
|
|
27
|
+
* Supports both URL formats:
|
|
28
|
+
* - Path-based: /design/{fileKey}/branch/{branchKey}/{fileName}
|
|
29
|
+
* - Query-based: /design/{fileKey}/{fileName}?branch-id={branchId}
|
|
30
|
+
*
|
|
31
|
+
* @example https://www.figma.com/design/abc123/branch/xyz789/My-File?node-id=1-2
|
|
32
|
+
* -> { fileKey: 'abc123', branchId: 'xyz789', nodeId: '1:2' }
|
|
33
|
+
* @example https://www.figma.com/design/abc123/My-File?branch-id=xyz789&node-id=1-2
|
|
34
|
+
* -> { fileKey: 'abc123', branchId: 'xyz789', nodeId: '1:2' }
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractFigmaUrlInfo(url: string): FigmaUrlInfo | null;
|
|
37
|
+
/**
|
|
38
|
+
* Wrap a promise with a timeout
|
|
39
|
+
* @param promise The promise to wrap
|
|
40
|
+
* @param ms Timeout in milliseconds
|
|
41
|
+
* @param label Label for error message
|
|
42
|
+
* @returns Promise that rejects if timeout exceeded
|
|
43
|
+
*/
|
|
44
|
+
export declare function withTimeout<T>(promise: Promise<T>, ms: number, label: string): Promise<T>;
|
|
45
|
+
/**
|
|
46
|
+
* Figma API Client
|
|
47
|
+
* Makes authenticated requests to Figma REST API
|
|
48
|
+
*/
|
|
49
|
+
export declare class FigmaAPI {
|
|
50
|
+
private accessToken;
|
|
51
|
+
constructor(config: FigmaAPIConfig);
|
|
52
|
+
/**
|
|
53
|
+
* Make authenticated request to Figma API
|
|
54
|
+
*/
|
|
55
|
+
private request;
|
|
56
|
+
/**
|
|
57
|
+
* GET /v1/files/:file_key
|
|
58
|
+
* Get full file data including document tree, components, and styles
|
|
59
|
+
*/
|
|
60
|
+
getFile(fileKey: string, options?: {
|
|
61
|
+
version?: string;
|
|
62
|
+
ids?: string[];
|
|
63
|
+
depth?: number;
|
|
64
|
+
geometry?: 'paths' | 'screen';
|
|
65
|
+
plugin_data?: string;
|
|
66
|
+
branch_data?: boolean;
|
|
67
|
+
}): Promise<any>;
|
|
68
|
+
/**
|
|
69
|
+
* Resolve a branch key from a branch ID
|
|
70
|
+
* If branchId is provided, fetches branch data and returns the branch's unique key
|
|
71
|
+
* Otherwise returns the main file key unchanged
|
|
72
|
+
* @param fileKey The main file key from the URL
|
|
73
|
+
* @param branchId Optional branch ID from URL query param (branch-id)
|
|
74
|
+
* @returns The effective file key to use for API calls (branch key if on branch, otherwise fileKey)
|
|
75
|
+
*/
|
|
76
|
+
getBranchKey(fileKey: string, branchId?: string): Promise<string>;
|
|
77
|
+
/**
|
|
78
|
+
* GET /v1/files/:file_key/variables/local
|
|
79
|
+
* Get local variables (design tokens) from a file
|
|
80
|
+
*/
|
|
81
|
+
getLocalVariables(fileKey: string): Promise<any>;
|
|
82
|
+
/**
|
|
83
|
+
* GET /v1/files/:file_key/variables/published
|
|
84
|
+
* Get published variables from a file
|
|
85
|
+
*/
|
|
86
|
+
getPublishedVariables(fileKey: string): Promise<any>;
|
|
87
|
+
/**
|
|
88
|
+
* GET /v1/files/:file_key/nodes
|
|
89
|
+
* Get specific nodes by ID
|
|
90
|
+
*/
|
|
91
|
+
getNodes(fileKey: string, nodeIds: string[], options?: {
|
|
92
|
+
version?: string;
|
|
93
|
+
depth?: number;
|
|
94
|
+
geometry?: 'paths' | 'screen';
|
|
95
|
+
plugin_data?: string;
|
|
96
|
+
}): Promise<any>;
|
|
97
|
+
/**
|
|
98
|
+
* GET /v1/files/:file_key/styles
|
|
99
|
+
* Get styles from a file
|
|
100
|
+
*/
|
|
101
|
+
getStyles(fileKey: string): Promise<any>;
|
|
102
|
+
/**
|
|
103
|
+
* GET /v1/files/:file_key/components
|
|
104
|
+
* Get components from a file
|
|
105
|
+
*/
|
|
106
|
+
getComponents(fileKey: string): Promise<any>;
|
|
107
|
+
/**
|
|
108
|
+
* GET /v1/files/:file_key/component_sets
|
|
109
|
+
* Get component sets (variants) from a file
|
|
110
|
+
*/
|
|
111
|
+
getComponentSets(fileKey: string): Promise<any>;
|
|
112
|
+
/**
|
|
113
|
+
* GET /v1/images/:file_key
|
|
114
|
+
* Renders images for specified nodes
|
|
115
|
+
* @param fileKey - The file key
|
|
116
|
+
* @param nodeIds - Node IDs to render (single string or array)
|
|
117
|
+
* @param options - Rendering options
|
|
118
|
+
* @returns Map of node IDs to image URLs (URLs expire after 30 days)
|
|
119
|
+
*/
|
|
120
|
+
getImages(fileKey: string, nodeIds: string | string[], options?: {
|
|
121
|
+
scale?: number;
|
|
122
|
+
format?: 'png' | 'jpg' | 'svg' | 'pdf';
|
|
123
|
+
svg_outline_text?: boolean;
|
|
124
|
+
svg_include_id?: boolean;
|
|
125
|
+
svg_include_node_id?: boolean;
|
|
126
|
+
svg_simplify_stroke?: boolean;
|
|
127
|
+
contents_only?: boolean;
|
|
128
|
+
}): Promise<{
|
|
129
|
+
images: Record<string, string | null>;
|
|
130
|
+
}>;
|
|
131
|
+
/**
|
|
132
|
+
* GET /v1/files/:file_key/comments
|
|
133
|
+
* Get comments on a file
|
|
134
|
+
*/
|
|
135
|
+
getComments(fileKey: string, options?: {
|
|
136
|
+
as_md?: boolean;
|
|
137
|
+
}): Promise<any>;
|
|
138
|
+
/**
|
|
139
|
+
* POST /v1/files/:file_key/comments
|
|
140
|
+
* Post a comment on a file
|
|
141
|
+
*/
|
|
142
|
+
postComment(fileKey: string, message: string, clientMeta?: {
|
|
143
|
+
node_id?: string;
|
|
144
|
+
node_offset?: {
|
|
145
|
+
x: number;
|
|
146
|
+
y: number;
|
|
147
|
+
};
|
|
148
|
+
}, commentId?: string): Promise<any>;
|
|
149
|
+
/**
|
|
150
|
+
* DELETE /v1/files/:file_key/comments/:comment_id
|
|
151
|
+
* Delete a comment on a file
|
|
152
|
+
*/
|
|
153
|
+
deleteComment(fileKey: string, commentId: string): Promise<any>;
|
|
154
|
+
/**
|
|
155
|
+
* Helper: Get all design tokens (variables) with formatted output
|
|
156
|
+
* Both local and published can fail gracefully (e.g., 403 without Enterprise plan)
|
|
157
|
+
*/
|
|
158
|
+
getAllVariables(fileKey: string): Promise<{
|
|
159
|
+
local: any;
|
|
160
|
+
published: any;
|
|
161
|
+
localError?: string;
|
|
162
|
+
publishedError?: string;
|
|
163
|
+
}>;
|
|
164
|
+
/**
|
|
165
|
+
* Helper: Get component metadata with properties
|
|
166
|
+
*/
|
|
167
|
+
getComponentData(fileKey: string, nodeId: string): Promise<any>;
|
|
168
|
+
/**
|
|
169
|
+
* Helper: Search for components by name
|
|
170
|
+
*/
|
|
171
|
+
searchComponents(fileKey: string, searchTerm: string): Promise<any[]>;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Helper function to format variables for display
|
|
175
|
+
*/
|
|
176
|
+
export declare function formatVariables(variablesData: any): {
|
|
177
|
+
collections: any[];
|
|
178
|
+
variables: any[];
|
|
179
|
+
summary: {
|
|
180
|
+
totalCollections: number;
|
|
181
|
+
totalVariables: number;
|
|
182
|
+
variablesByType: Record<string, number>;
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* Helper function to format component data for display
|
|
187
|
+
*/
|
|
188
|
+
export declare function formatComponentData(componentNode: any): {
|
|
189
|
+
id: string;
|
|
190
|
+
name: string;
|
|
191
|
+
type: string;
|
|
192
|
+
description?: string;
|
|
193
|
+
descriptionMarkdown?: string;
|
|
194
|
+
properties?: any;
|
|
195
|
+
children?: any[];
|
|
196
|
+
bounds?: any;
|
|
197
|
+
fills?: any[];
|
|
198
|
+
strokes?: any[];
|
|
199
|
+
effects?: any[];
|
|
200
|
+
};
|
|
201
|
+
//# sourceMappingURL=figma-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figma-api.d.ts","sourceRoot":"","sources":["../../src/core/figma-api.ts"],"names":[],"mappings":"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"}
|