@calibrate-ds/core 0.1.34 → 0.1.36
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/dist/__tests__/get-component-context.test.d.ts +2 -0
- package/dist/__tests__/get-component-context.test.d.ts.map +1 -0
- package/dist/__tests__/get-component-context.test.js +320 -0
- package/dist/__tests__/get-component-context.test.js.map +1 -0
- package/dist/__tests__/token-resolution.test.d.ts +2 -0
- package/dist/__tests__/token-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/token-resolution.test.js +366 -0
- package/dist/__tests__/token-resolution.test.js.map +1 -0
- package/dist/ai/resolve-provider.d.ts.map +1 -1
- package/dist/ai/resolve-provider.js +3 -2
- package/dist/ai/resolve-provider.js.map +1 -1
- package/dist/config/credentials.d.ts +23 -0
- package/dist/config/credentials.d.ts.map +1 -0
- package/dist/config/credentials.js +62 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/design-tool/figma-adapter.d.ts.map +1 -1
- package/dist/design-tool/figma-adapter.js +5 -2
- package/dist/design-tool/figma-adapter.js.map +1 -1
- package/dist/doctor/check-config.d.ts.map +1 -1
- package/dist/doctor/check-config.js +6 -4
- package/dist/doctor/check-config.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/verify/fetch-figma-screenshot.d.ts.map +1 -1
- package/dist/verify/fetch-figma-screenshot.js +2 -1
- package/dist/verify/fetch-figma-screenshot.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-component-context.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/get-component-context.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { getComponentContext } from "../context/get-component-context.js";
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Shared config fixture — uses /tmp as rootDir so filesystem checks don't explode
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
const testConfig = {
|
|
7
|
+
designTool: { provider: "figma", fileKey: "test-key", accessTokenEnv: "FIGMA_ACCESS_TOKEN" },
|
|
8
|
+
project: { rootDir: "/tmp/ptb-test" },
|
|
9
|
+
output: {
|
|
10
|
+
componentsDir: "src/components/ui",
|
|
11
|
+
tokensDir: "src/tokens",
|
|
12
|
+
metadataDir: ".ptb",
|
|
13
|
+
},
|
|
14
|
+
framework: { name: "react", typescript: true, styling: "unstyled" },
|
|
15
|
+
generation: { stories: false, tests: false, types: true, indexFiles: true },
|
|
16
|
+
naming: { componentCase: "PascalCase", folderCase: "kebab-case", tokenCase: "kebab-case" },
|
|
17
|
+
classification: {
|
|
18
|
+
treatComponentSetsAsCanonical: true,
|
|
19
|
+
treatStandaloneComponentsAsCanonical: false,
|
|
20
|
+
treatNestedInstancesAsReferences: true,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Component factory
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
function comp(overrides = {}) {
|
|
27
|
+
return {
|
|
28
|
+
id: "c1",
|
|
29
|
+
name: "Card",
|
|
30
|
+
kind: { value: "atomic", inferred: false },
|
|
31
|
+
variantAxes: [],
|
|
32
|
+
properties: [],
|
|
33
|
+
dependencies: [],
|
|
34
|
+
...overrides,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function model(components, tokens = []) {
|
|
38
|
+
return { version: "1.0", components, tokens };
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Basic resolution
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
describe("getComponentContext — basic resolution", () => {
|
|
44
|
+
it("returns undefined when the component ID is not in the model", async () => {
|
|
45
|
+
const m = model([comp()]);
|
|
46
|
+
const result = await getComponentContext("missing-id", m, testConfig);
|
|
47
|
+
expect(result).toBeUndefined();
|
|
48
|
+
});
|
|
49
|
+
it("returns a defined context for a known component", async () => {
|
|
50
|
+
const c = comp({ id: "c1" });
|
|
51
|
+
const m = model([c]);
|
|
52
|
+
const result = await getComponentContext("c1", m, testConfig);
|
|
53
|
+
expect(result).toBeDefined();
|
|
54
|
+
});
|
|
55
|
+
it("metadata.componentId matches the requested ID", async () => {
|
|
56
|
+
const c = comp({ id: "abc" });
|
|
57
|
+
const m = model([c]);
|
|
58
|
+
const result = await getComponentContext("abc", m, testConfig);
|
|
59
|
+
expect(result.metadata.componentId).toBe("abc");
|
|
60
|
+
});
|
|
61
|
+
it("metadata.componentName matches the component name", async () => {
|
|
62
|
+
const c = comp({ id: "c1", name: "Property Card" });
|
|
63
|
+
const m = model([c]);
|
|
64
|
+
const result = await getComponentContext("c1", m, testConfig);
|
|
65
|
+
expect(result.metadata.componentName).toBe("Property Card");
|
|
66
|
+
});
|
|
67
|
+
it("metadata.contextHash is a non-empty string", async () => {
|
|
68
|
+
const c = comp({ id: "c1" });
|
|
69
|
+
const m = model([c]);
|
|
70
|
+
const result = await getComponentContext("c1", m, testConfig);
|
|
71
|
+
expect(typeof result.metadata.contextHash).toBe("string");
|
|
72
|
+
expect(result.metadata.contextHash.length).toBeGreaterThan(0);
|
|
73
|
+
});
|
|
74
|
+
it("two different models produce different contextHashes for the same component ID", async () => {
|
|
75
|
+
const c1 = comp({ id: "c1", name: "Card" });
|
|
76
|
+
const c2 = comp({ id: "c1", name: "Notification Card" });
|
|
77
|
+
const r1 = await getComponentContext("c1", model([c1]), testConfig);
|
|
78
|
+
const r2 = await getComponentContext("c1", model([c2]), testConfig);
|
|
79
|
+
expect(r1.metadata.contextHash).not.toBe(r2.metadata.contextHash);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Context shape invariants
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
describe("getComponentContext — output shape", () => {
|
|
86
|
+
it("returned object has all expected top-level keys", async () => {
|
|
87
|
+
const c = comp({ id: "c1" });
|
|
88
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
89
|
+
const ctx = result;
|
|
90
|
+
expect(ctx).toHaveProperty("metadata");
|
|
91
|
+
expect(ctx).toHaveProperty("component");
|
|
92
|
+
expect(ctx).toHaveProperty("variantAxes");
|
|
93
|
+
expect(ctx).toHaveProperty("properties");
|
|
94
|
+
expect(ctx).toHaveProperty("dependencies");
|
|
95
|
+
expect(ctx).toHaveProperty("resolvedBindings");
|
|
96
|
+
expect(ctx).toHaveProperty("interactionContract");
|
|
97
|
+
expect(ctx).toHaveProperty("stateContract");
|
|
98
|
+
expect(ctx).toHaveProperty("implementationHints");
|
|
99
|
+
});
|
|
100
|
+
it("component.name matches the source component name", async () => {
|
|
101
|
+
const c = comp({ id: "c1", name: "Notification Item" });
|
|
102
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
103
|
+
expect(result.component.name).toBe("Notification Item");
|
|
104
|
+
});
|
|
105
|
+
it("variantAxes is an array", async () => {
|
|
106
|
+
const result = await getComponentContext("c1", model([comp()]), testConfig);
|
|
107
|
+
expect(Array.isArray(result.variantAxes)).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
it("dependencies is an array", async () => {
|
|
110
|
+
const result = await getComponentContext("c1", model([comp()]), testConfig);
|
|
111
|
+
expect(Array.isArray(result.dependencies)).toBe(true);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// semanticElement inference
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
describe("getComponentContext — semanticElement inference", () => {
|
|
118
|
+
async function hint(name) {
|
|
119
|
+
const c = comp({ id: "c1", name });
|
|
120
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
121
|
+
return result.implementationHints?.semanticElement;
|
|
122
|
+
}
|
|
123
|
+
it('"Button" → semanticElement = "button"', async () => {
|
|
124
|
+
expect(await hint("Button")).toBe("button");
|
|
125
|
+
});
|
|
126
|
+
it('"Primary Button" → semanticElement = "button"', async () => {
|
|
127
|
+
expect(await hint("Primary Button")).toBe("button");
|
|
128
|
+
});
|
|
129
|
+
it('"Navigation" → semanticElement = "nav"', async () => {
|
|
130
|
+
expect(await hint("Navigation")).toBe("nav");
|
|
131
|
+
});
|
|
132
|
+
it('"Nav Bar" → semanticElement = "nav"', async () => {
|
|
133
|
+
expect(await hint("Nav Bar")).toBe("nav");
|
|
134
|
+
});
|
|
135
|
+
it('"Modal Dialog" → semanticElement = "dialog"', async () => {
|
|
136
|
+
expect(await hint("Modal Dialog")).toBe("dialog");
|
|
137
|
+
});
|
|
138
|
+
it('"Checkbox" → semanticElement = "label" (wraps native input)', async () => {
|
|
139
|
+
expect(await hint("Checkbox")).toBe("label");
|
|
140
|
+
});
|
|
141
|
+
it('"Card" (generic) → no semanticElement (div is the default)', async () => {
|
|
142
|
+
expect(await hint("Card")).toBeUndefined();
|
|
143
|
+
});
|
|
144
|
+
it('"Property Card" (generic) → no semanticElement', async () => {
|
|
145
|
+
expect(await hint("Property Card")).toBeUndefined();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// isFormControl flag
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
describe("getComponentContext — isFormControl flag", () => {
|
|
152
|
+
it('"Checkbox" → implementationHints.isFormControl = true', async () => {
|
|
153
|
+
const c = comp({ id: "c1", name: "Checkbox" });
|
|
154
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
155
|
+
expect(result.implementationHints?.isFormControl).toBe(true);
|
|
156
|
+
});
|
|
157
|
+
it('"Button" → implementationHints.isFormControl = true', async () => {
|
|
158
|
+
const c = comp({ id: "c1", name: "Button" });
|
|
159
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
160
|
+
expect(result.implementationHints?.isFormControl).toBe(true);
|
|
161
|
+
});
|
|
162
|
+
it('"Card" → isFormControl is NOT set', async () => {
|
|
163
|
+
const c = comp({ id: "c1", name: "Card" });
|
|
164
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
165
|
+
expect(result.implementationHints?.isFormControl).toBeFalsy();
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
// stateContract
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
describe("getComponentContext — stateContract", () => {
|
|
172
|
+
it("component with no variantAxes → stateContract is undefined", async () => {
|
|
173
|
+
const c = comp({ id: "c1", variantAxes: [] });
|
|
174
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
175
|
+
expect(result.stateContract).toBeUndefined();
|
|
176
|
+
});
|
|
177
|
+
it("component with variantAxes → stateContract is defined", async () => {
|
|
178
|
+
const c = comp({
|
|
179
|
+
id: "c1",
|
|
180
|
+
variantAxes: [{ name: "State", type: "string", options: ["Default", "Hover", "Pressed"] }],
|
|
181
|
+
});
|
|
182
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
183
|
+
expect(result.stateContract).toBeDefined();
|
|
184
|
+
});
|
|
185
|
+
it("stateContract.controller.name is camelCase of the primary axis name", async () => {
|
|
186
|
+
const c = comp({
|
|
187
|
+
id: "c1",
|
|
188
|
+
variantAxes: [{ name: "Button State", type: "string", options: ["Default", "Hover"] }],
|
|
189
|
+
});
|
|
190
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
191
|
+
expect(result.stateContract.controller.name).toBe("buttonState");
|
|
192
|
+
});
|
|
193
|
+
it("stateContract.stateAxis.options matches the axis options", async () => {
|
|
194
|
+
const options = ["Default", "Hover", "Disabled"];
|
|
195
|
+
const c = comp({
|
|
196
|
+
id: "c1",
|
|
197
|
+
variantAxes: [{ name: "State", type: "string", options }],
|
|
198
|
+
});
|
|
199
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
200
|
+
expect(result.stateContract.stateAxis.options).toEqual(options);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
// interactionContract
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
describe("getComponentContext — interactionContract", () => {
|
|
207
|
+
it("always includes interactionContract.events array", async () => {
|
|
208
|
+
const result = await getComponentContext("c1", model([comp()]), testConfig);
|
|
209
|
+
expect(Array.isArray(result.interactionContract.events)).toBe(true);
|
|
210
|
+
});
|
|
211
|
+
it("button-named component → interactionContract.warnings is populated", async () => {
|
|
212
|
+
const c = comp({ id: "c1", name: "Primary Button" });
|
|
213
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
214
|
+
expect(result.interactionContract.warnings).toBeDefined();
|
|
215
|
+
expect(result.interactionContract.warnings.length).toBeGreaterThan(0);
|
|
216
|
+
});
|
|
217
|
+
it("non-interactive component → interactionContract.warnings is undefined", async () => {
|
|
218
|
+
const c = comp({ id: "c1", name: "Card" });
|
|
219
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
220
|
+
expect(result.interactionContract.warnings).toBeUndefined();
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
// Token binding resolution
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
describe("getComponentContext — token binding resolution", () => {
|
|
227
|
+
it("resolvedBindings is empty when no tokenBindings and no bound variables", async () => {
|
|
228
|
+
const c = comp({ id: "c1" });
|
|
229
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
230
|
+
expect(Object.keys(result.resolvedBindings)).toHaveLength(0);
|
|
231
|
+
});
|
|
232
|
+
it("tokenBinding with a matching token → appears in resolvedBindings", async () => {
|
|
233
|
+
const c = comp({
|
|
234
|
+
id: "c1",
|
|
235
|
+
tokenBindings: [{
|
|
236
|
+
slot: "fill",
|
|
237
|
+
boundToken: { id: "tok-1" },
|
|
238
|
+
}],
|
|
239
|
+
});
|
|
240
|
+
const m = model([c], [{
|
|
241
|
+
id: "col-colors",
|
|
242
|
+
name: "Colors",
|
|
243
|
+
tokens: [{ id: "tok-1", name: "brand-900", type: "color", value: "#103D1A" }],
|
|
244
|
+
}]);
|
|
245
|
+
const result = await getComponentContext("c1", m, testConfig);
|
|
246
|
+
expect(result.resolvedBindings["fill"]).toBeDefined();
|
|
247
|
+
expect(result.resolvedBindings["fill"].cssValue).toBe("#103D1A");
|
|
248
|
+
});
|
|
249
|
+
it("tokenBinding whose ID is not in model.tokens → resolvedBindings slot absent", async () => {
|
|
250
|
+
const c = comp({
|
|
251
|
+
id: "c1",
|
|
252
|
+
tokenBindings: [{
|
|
253
|
+
slot: "fill",
|
|
254
|
+
boundToken: { id: "missing-tok" },
|
|
255
|
+
}],
|
|
256
|
+
});
|
|
257
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
258
|
+
expect(result.resolvedBindings["fill"]).toBeUndefined();
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
// Dependencies
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
describe("getComponentContext — dependencies", () => {
|
|
265
|
+
it("component with no dependencies → context.dependencies is empty", async () => {
|
|
266
|
+
const c = comp({ id: "c1", dependencies: [] });
|
|
267
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
268
|
+
expect(result.dependencies).toHaveLength(0);
|
|
269
|
+
});
|
|
270
|
+
it("component with a dep that exists in the model → dep appears in context.dependencies", async () => {
|
|
271
|
+
const badge = comp({ id: "dep-1", name: "Badge", dependencies: [] });
|
|
272
|
+
const card = comp({
|
|
273
|
+
id: "c1",
|
|
274
|
+
name: "Card",
|
|
275
|
+
dependencies: ["dep-1"],
|
|
276
|
+
});
|
|
277
|
+
const result = await getComponentContext("c1", model([card, badge]), testConfig);
|
|
278
|
+
const names = result.dependencies.map((d) => d.name);
|
|
279
|
+
expect(names).toContain("Badge");
|
|
280
|
+
});
|
|
281
|
+
it("same dep ID appearing twice → deduplicated (count incremented, not a second entry)", async () => {
|
|
282
|
+
const badge = comp({ id: "dep-1", name: "Badge", dependencies: [] });
|
|
283
|
+
const card = comp({
|
|
284
|
+
id: "c1",
|
|
285
|
+
name: "Card",
|
|
286
|
+
dependencies: ["dep-1", "dep-1"],
|
|
287
|
+
});
|
|
288
|
+
const result = await getComponentContext("c1", model([card, badge]), testConfig);
|
|
289
|
+
const badgeDeps = result.dependencies.filter((d) => d.name === "Badge");
|
|
290
|
+
expect(badgeDeps).toHaveLength(1);
|
|
291
|
+
expect(badgeDeps[0].count).toBe(2);
|
|
292
|
+
});
|
|
293
|
+
it("unknown dep ID → appears with name containing 'unknown'", async () => {
|
|
294
|
+
const card = comp({ id: "c1", name: "Card", dependencies: ["ghost-id"] });
|
|
295
|
+
const result = await getComponentContext("c1", model([card]), testConfig);
|
|
296
|
+
expect(result.dependencies.some((d) => d.name.includes("unknown"))).toBe(true);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
// ---------------------------------------------------------------------------
|
|
300
|
+
// Auto-named axis warning
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
describe("getComponentContext — unnamedAxes warning", () => {
|
|
303
|
+
it('"Property 1" axis → implementationHints.unnamedAxesWarning is set', async () => {
|
|
304
|
+
const c = comp({
|
|
305
|
+
id: "c1",
|
|
306
|
+
variantAxes: [{ name: "Property 1", type: "string", options: ["A", "B"] }],
|
|
307
|
+
});
|
|
308
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
309
|
+
expect(result.implementationHints?.unnamedAxesWarning).toBeDefined();
|
|
310
|
+
});
|
|
311
|
+
it('properly named axis ("Size") → no unnamedAxesWarning', async () => {
|
|
312
|
+
const c = comp({
|
|
313
|
+
id: "c1",
|
|
314
|
+
variantAxes: [{ name: "Size", type: "string", options: ["sm", "md", "lg"] }],
|
|
315
|
+
});
|
|
316
|
+
const result = await getComponentContext("c1", model([c]), testConfig);
|
|
317
|
+
expect(result.implementationHints?.unnamedAxesWarning).toBeUndefined();
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
//# sourceMappingURL=get-component-context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-component-context.test.js","sourceRoot":"","sources":["../../src/__tests__/get-component-context.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG1E,8EAA8E;AAC9E,kFAAkF;AAClF,8EAA8E;AAE9E,MAAM,UAAU,GAAc;IAC1B,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,oBAAoB,EAAE;IAC5F,OAAO,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE;IACrC,MAAM,EAAE;QACJ,aAAa,EAAE,mBAAmB;QAClC,SAAS,EAAE,YAAY;QACvB,WAAW,EAAE,MAAM;KACtB;IACD,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE;IACnE,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;IAC3E,MAAM,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE;IAC1F,cAAc,EAAE;QACZ,6BAA6B,EAAE,IAAI;QACnC,oCAAoC,EAAE,KAAK;QAC3C,gCAAgC,EAAE,IAAI;KACzC;CACJ,CAAC;AAEF,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,SAAS,IAAI,CAAC,YAA0C,EAAE;IACtD,OAAO;QACH,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC1C,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,EAAE;QAChB,GAAG,SAAS;KACQ,CAAC;AAC7B,CAAC;AAED,SAAS,KAAK,CAAC,UAAiC,EAAE,SAAgB,EAAE;IAChE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAClD,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,YAAY,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,MAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACzD,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACpE,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACpE,MAAM,CAAC,EAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,MAAO,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAO,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC7D,KAAK,UAAU,IAAI,CAAC,IAAY;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,OAAO,MAAO,CAAC,mBAAmB,EAAE,eAAe,CAAC;IACxD,CAAC;IAED,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,aAAa,CAAC,CAAC,aAAa,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,CAAC,GAAG,IAAI,CAAC;YACX,EAAE,EAAE,IAAI;YACR,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;SAC7F,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,CAAC,GAAG,IAAI,CAAC;YACX,EAAE,EAAE,IAAI;YACR,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;SACzF,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,aAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,IAAI,CAAC;YACX,EAAE,EAAE,IAAI;YACR,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;SAC5D,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,aAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3D,MAAM,CAAE,MAAO,CAAC,mBAAmB,CAAC,QAAqB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC5D,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,CAAC,GAAG,IAAI,CAAC;YACX,EAAE,EAAE,IAAI;YACR,aAAa,EAAE,CAAC;oBACZ,IAAI,EAAE,MAAM;oBACZ,UAAU,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;iBAC9B,CAAQ;SACZ,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClB,EAAE,EAAE,YAAY;gBAChB,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aAChF,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACvD,MAAM,CAAC,MAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,CAAC,GAAG,IAAI,CAAC;YACX,EAAE,EAAE,IAAI;YACR,aAAa,EAAE,CAAC;oBACZ,IAAI,EAAE,MAAM;oBACZ,UAAU,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE;iBACpC,CAAQ;SACZ,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC;YACd,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,CAAC,OAAO,CAAC;SAC1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,MAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC;YACd,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;SACnC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACjF,MAAM,SAAS,GAAG,MAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAC9E,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAE,SAAS,CAAC,CAAC,CAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,CAAC,GAAG,IAAI,CAAC;YACX,EAAE,EAAE,IAAI;YACR,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;SAC7E,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,CAAC,GAAG,IAAI,CAAC;YACX,EAAE,EAAE,IAAI;YACR,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;SAC/E,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,MAAO,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC,aAAa,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-resolution.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/token-resolution.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { resolveTokenBinding } from "../tokens/resolution.js";
|
|
3
|
+
import { getPTBTokenVariableName, normalizeTokenVariablePart } from "../tokens/naming.js";
|
|
4
|
+
import { buildTokenModel, adaptCanonicalToTokenCollections } from "../tokens/build-token-model.js";
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Fixture helpers
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
function col(name, tokens) {
|
|
9
|
+
return {
|
|
10
|
+
id: `col-${name}`,
|
|
11
|
+
name,
|
|
12
|
+
tokens: tokens.map(t => ({
|
|
13
|
+
...t,
|
|
14
|
+
type: (t.type ?? "color"),
|
|
15
|
+
})),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// normalizeTokenVariablePart
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
describe("normalizeTokenVariablePart", () => {
|
|
22
|
+
it("lowercases and replaces slashes and spaces with hyphens", () => {
|
|
23
|
+
expect(normalizeTokenVariablePart("Brand / 900")).toBe("brand-900");
|
|
24
|
+
});
|
|
25
|
+
it("strips leading and trailing hyphens", () => {
|
|
26
|
+
expect(normalizeTokenVariablePart(" scale / 300 ")).toBe("scale-300");
|
|
27
|
+
});
|
|
28
|
+
it("collapses consecutive non-alphanumeric runs into a single hyphen", () => {
|
|
29
|
+
expect(normalizeTokenVariablePart("scale / 300 (12px)")).toBe("scale-300-12px");
|
|
30
|
+
});
|
|
31
|
+
it("preserves numbers", () => {
|
|
32
|
+
expect(normalizeTokenVariablePart("color-900")).toBe("color-900");
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// getPTBTokenVariableName
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
describe("getPTBTokenVariableName", () => {
|
|
39
|
+
it("builds a valid --ptb- CSS variable from collection and token name", () => {
|
|
40
|
+
expect(getPTBTokenVariableName("Colors", "Brand / 900")).toBe("--ptb-colors-brand-900");
|
|
41
|
+
});
|
|
42
|
+
it("handles multi-segment token names", () => {
|
|
43
|
+
expect(getPTBTokenVariableName("Spacing", "scale / 300 (12px)")).toBe("--ptb-spacing-scale-300-12px");
|
|
44
|
+
});
|
|
45
|
+
it("always starts with --ptb-", () => {
|
|
46
|
+
const result = getPTBTokenVariableName("Alias", "text-primary");
|
|
47
|
+
expect(result.startsWith("--ptb-")).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// resolveTokenBinding — ID resolution
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
describe("resolveTokenBinding — ID resolution", () => {
|
|
54
|
+
const collections = [
|
|
55
|
+
col("Colors", [
|
|
56
|
+
{ id: "100", name: "brand-900", value: "#103D1A", type: "color" },
|
|
57
|
+
]),
|
|
58
|
+
];
|
|
59
|
+
it("resolves a plain ID match", () => {
|
|
60
|
+
const result = resolveTokenBinding("100", collections);
|
|
61
|
+
expect(result).toBeDefined();
|
|
62
|
+
expect(result.resolvedTokenName).toBe("brand-900");
|
|
63
|
+
expect(result.cssValue).toBe("#103D1A");
|
|
64
|
+
});
|
|
65
|
+
it("strips 'VariableID:' prefix before matching — normalizeTokenId", () => {
|
|
66
|
+
const result = resolveTokenBinding("VariableID:100", collections);
|
|
67
|
+
expect(result).toBeDefined();
|
|
68
|
+
expect(result.resolvedTokenName).toBe("brand-900");
|
|
69
|
+
});
|
|
70
|
+
it("strips 'variableid:' (case-insensitive) prefix", () => {
|
|
71
|
+
const result = resolveTokenBinding("variableid:100", collections);
|
|
72
|
+
expect(result).toBeDefined();
|
|
73
|
+
expect(result.resolvedTokenName).toBe("brand-900");
|
|
74
|
+
});
|
|
75
|
+
it("returns undefined for a completely unknown ID", () => {
|
|
76
|
+
const result = resolveTokenBinding("999", collections);
|
|
77
|
+
expect(result).toBeUndefined();
|
|
78
|
+
});
|
|
79
|
+
it("returns undefined when sourceVariableId is undefined", () => {
|
|
80
|
+
const result = resolveTokenBinding(undefined, collections);
|
|
81
|
+
expect(result).toBeUndefined();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// resolveTokenBinding — key-based and compound ID resolution
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
describe("resolveTokenBinding — key-based resolution", () => {
|
|
88
|
+
const collections = [
|
|
89
|
+
col("Colors", [
|
|
90
|
+
{ id: "200", key: "abc123", name: "surface-page", value: "#FFFFFF", type: "color" },
|
|
91
|
+
]),
|
|
92
|
+
];
|
|
93
|
+
it("resolves by token.key when id lookup fails", () => {
|
|
94
|
+
const result = resolveTokenBinding("abc123", collections);
|
|
95
|
+
expect(result).toBeDefined();
|
|
96
|
+
expect(result.resolvedTokenName).toBe("surface-page");
|
|
97
|
+
});
|
|
98
|
+
it("resolves compound 'key/sessionId' by taking the key part", () => {
|
|
99
|
+
const result = resolveTokenBinding("abc123/session-99", collections);
|
|
100
|
+
expect(result).toBeDefined();
|
|
101
|
+
expect(result.resolvedTokenName).toBe("surface-page");
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
// resolveTokenBinding — alias chain (aliasTargetId) — 0.1.28 bug class
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
describe("resolveTokenBinding — alias chain via aliasTargetId", () => {
|
|
108
|
+
// primitive/900 ← aliasTargetId chain from mapped/text-primary → alias/brand-900 → primitive/900
|
|
109
|
+
const collections = [
|
|
110
|
+
col("Mapped", [
|
|
111
|
+
{ id: "m1", name: "text-primary", value: "{alias-brand-900}", type: "color", aliasTargetId: "a1" },
|
|
112
|
+
]),
|
|
113
|
+
col("Alias", [
|
|
114
|
+
{ id: "a1", name: "brand-900", value: "{primitive-900}", type: "color", aliasTargetId: "p1" },
|
|
115
|
+
]),
|
|
116
|
+
col("Primitives", [
|
|
117
|
+
{ id: "p1", name: "green-900", value: "#103D1A", type: "color" },
|
|
118
|
+
]),
|
|
119
|
+
];
|
|
120
|
+
it("follows the aliasTargetId chain to the resolved terminal token", () => {
|
|
121
|
+
const result = resolveTokenBinding("m1", collections);
|
|
122
|
+
expect(result).toBeDefined();
|
|
123
|
+
expect(result.resolvedTokenName).toBe("green-900");
|
|
124
|
+
expect(result.cssValue).toBe("#103D1A");
|
|
125
|
+
});
|
|
126
|
+
it("cssVar uses the SOURCE token (what the component is directly bound to)", () => {
|
|
127
|
+
const result = resolveTokenBinding("m1", collections);
|
|
128
|
+
expect(result.cssVar).toContain("mapped");
|
|
129
|
+
expect(result.cssVar).toContain("text-primary");
|
|
130
|
+
});
|
|
131
|
+
it("canonicalCssVar uses the RESOLVED terminal token", () => {
|
|
132
|
+
const result = resolveTokenBinding("m1", collections);
|
|
133
|
+
expect(result.canonicalCssVar).toContain("primitives");
|
|
134
|
+
expect(result.canonicalCssVar).toContain("green-900");
|
|
135
|
+
});
|
|
136
|
+
it("resolutionPath lists all tokens traversed in order", () => {
|
|
137
|
+
const result = resolveTokenBinding("m1", collections);
|
|
138
|
+
expect(result.resolutionPath).toEqual(["text-primary", "brand-900", "green-900"]);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
// resolveTokenBinding — value-string alias (VariableID: in value string)
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
describe("resolveTokenBinding — value-string alias resolution", () => {
|
|
145
|
+
const collections = [
|
|
146
|
+
col("Mapped", [
|
|
147
|
+
{ id: "m2", name: "text-secondary", value: "VariableID:p2", type: "color" },
|
|
148
|
+
]),
|
|
149
|
+
col("Primitives", [
|
|
150
|
+
{ id: "p2", name: "green-700", value: "#1A5C2A", type: "color" },
|
|
151
|
+
]),
|
|
152
|
+
];
|
|
153
|
+
it("follows a VariableID: value string to the target token", () => {
|
|
154
|
+
const result = resolveTokenBinding("m2", collections);
|
|
155
|
+
expect(result).toBeDefined();
|
|
156
|
+
expect(result.resolvedTokenName).toBe("green-700");
|
|
157
|
+
expect(result.cssValue).toBe("#1A5C2A");
|
|
158
|
+
});
|
|
159
|
+
it("does not surface a bare VariableID: string as the cssValue for non-color types", () => {
|
|
160
|
+
// For spacing/other types, the VariableID guard fires and formatCSSValue returns "".
|
|
161
|
+
// The || fallback then produces the cssVar — never the raw VariableID: string.
|
|
162
|
+
const unresolvable = [
|
|
163
|
+
col("Mapped", [
|
|
164
|
+
{ id: "m3", name: "broken", value: "VariableID:missing", type: "other" },
|
|
165
|
+
]),
|
|
166
|
+
];
|
|
167
|
+
const result = resolveTokenBinding("m3", unresolvable);
|
|
168
|
+
expect(result).toBeDefined();
|
|
169
|
+
expect(result.cssValue).not.toContain("VariableID:");
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
// resolveTokenBinding — color formatting (0.1.26 bug class — RGBA objects)
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
describe("resolveTokenBinding — color formatting", () => {
|
|
176
|
+
it("RGBA object with alpha=1 → uppercase hex string", () => {
|
|
177
|
+
const collections = [
|
|
178
|
+
col("Colors", [
|
|
179
|
+
{
|
|
180
|
+
id: "c1", name: "brand-900",
|
|
181
|
+
value: { r: 16 / 255, g: 61 / 255, b: 26 / 255, a: 1 },
|
|
182
|
+
type: "color",
|
|
183
|
+
},
|
|
184
|
+
]),
|
|
185
|
+
];
|
|
186
|
+
const result = resolveTokenBinding("c1", collections);
|
|
187
|
+
expect(result.cssValue).toBe("#103D1A");
|
|
188
|
+
expect(result.valueType).toBe("COLOR");
|
|
189
|
+
});
|
|
190
|
+
it("RGBA object with alpha < 1 → rgba() string", () => {
|
|
191
|
+
const collections = [
|
|
192
|
+
col("Colors", [
|
|
193
|
+
{
|
|
194
|
+
id: "c2", name: "overlay",
|
|
195
|
+
value: { r: 0, g: 0, b: 0, a: 0.5 },
|
|
196
|
+
type: "color",
|
|
197
|
+
},
|
|
198
|
+
]),
|
|
199
|
+
];
|
|
200
|
+
const result = resolveTokenBinding("c2", collections);
|
|
201
|
+
expect(result.cssValue).toBe("rgba(0, 0, 0, 0.5)");
|
|
202
|
+
expect(result.valueType).toBe("COLOR");
|
|
203
|
+
});
|
|
204
|
+
it("plain hex string color → passed through unchanged", () => {
|
|
205
|
+
const collections = [
|
|
206
|
+
col("Colors", [{ id: "c3", name: "white", value: "#FFFFFF", type: "color" }]),
|
|
207
|
+
];
|
|
208
|
+
const result = resolveTokenBinding("c3", collections);
|
|
209
|
+
expect(result.cssValue).toBe("#FFFFFF");
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
// resolveTokenBinding — numeric token formatting (0.1.29 bug class)
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
describe("resolveTokenBinding — numeric token formatting", () => {
|
|
216
|
+
it("numeric number value with type=spacing → appends px", () => {
|
|
217
|
+
const collections = [
|
|
218
|
+
col("Spacing", [{ id: "s1", name: "scale-300", value: 16, type: "spacing" }]),
|
|
219
|
+
];
|
|
220
|
+
const result = resolveTokenBinding("s1", collections);
|
|
221
|
+
expect(result.cssValue).toBe("16px");
|
|
222
|
+
expect(result.valueType).toBe("DIMENSION");
|
|
223
|
+
});
|
|
224
|
+
it("numeric STRING value with type=spacing → also appends px — 0.1.29 regression guard", () => {
|
|
225
|
+
const collections = [
|
|
226
|
+
col("Spacing", [{ id: "s2", name: "scale-400", value: "24", type: "spacing" }]),
|
|
227
|
+
];
|
|
228
|
+
const result = resolveTokenBinding("s2", collections);
|
|
229
|
+
expect(result.cssValue).toBe("24px");
|
|
230
|
+
expect(result.valueType).toBe("DIMENSION");
|
|
231
|
+
});
|
|
232
|
+
it("numeric value with type=radius → appends px", () => {
|
|
233
|
+
const collections = [
|
|
234
|
+
col("Radius", [{ id: "r1", name: "border-radius-md", value: 8, type: "radius" }]),
|
|
235
|
+
];
|
|
236
|
+
const result = resolveTokenBinding("r1", collections);
|
|
237
|
+
expect(result.cssValue).toBe("8px");
|
|
238
|
+
});
|
|
239
|
+
it("numeric value with type=other → appends px (dimension bucket)", () => {
|
|
240
|
+
const collections = [
|
|
241
|
+
col("Misc", [{ id: "o1", name: "icon-size", value: 20, type: "other" }]),
|
|
242
|
+
];
|
|
243
|
+
const result = resolveTokenBinding("o1", collections);
|
|
244
|
+
expect(result.cssValue).toBe("20px");
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
// ---------------------------------------------------------------------------
|
|
248
|
+
// buildTokenModel
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
describe("buildTokenModel", () => {
|
|
251
|
+
it("returns empty array when data is null", () => {
|
|
252
|
+
expect(buildTokenModel(null)).toEqual([]);
|
|
253
|
+
});
|
|
254
|
+
it("returns empty array when meta is missing", () => {
|
|
255
|
+
expect(buildTokenModel({ notMeta: {} })).toEqual([]);
|
|
256
|
+
});
|
|
257
|
+
it("normalizes a minimal Figma REST response into TokenCollections", () => {
|
|
258
|
+
const data = {
|
|
259
|
+
meta: {
|
|
260
|
+
variableCollections: {
|
|
261
|
+
"col:1": {
|
|
262
|
+
id: "col:1",
|
|
263
|
+
name: "Colors",
|
|
264
|
+
defaultModeId: "mode:1",
|
|
265
|
+
variableIds: ["var:1"],
|
|
266
|
+
hiddenFromPublishing: false,
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
variables: {
|
|
270
|
+
"var:1": {
|
|
271
|
+
id: "var:1",
|
|
272
|
+
key: "key-abc",
|
|
273
|
+
name: "Brand/900",
|
|
274
|
+
resolvedType: "COLOR",
|
|
275
|
+
description: "",
|
|
276
|
+
hiddenFromPublishing: false,
|
|
277
|
+
valuesByMode: {
|
|
278
|
+
"mode:1": { r: 16 / 255, g: 61 / 255, b: 26 / 255, a: 1 },
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
const result = buildTokenModel(data);
|
|
285
|
+
expect(result).toHaveLength(1);
|
|
286
|
+
expect(result[0].name).toBe("Colors");
|
|
287
|
+
expect(result[0].tokens).toHaveLength(1);
|
|
288
|
+
expect(result[0].tokens[0].name).toBe("Brand-900");
|
|
289
|
+
});
|
|
290
|
+
it("skips collections that are hidden from publishing", () => {
|
|
291
|
+
const data = {
|
|
292
|
+
meta: {
|
|
293
|
+
variableCollections: {
|
|
294
|
+
"col:1": {
|
|
295
|
+
id: "col:1",
|
|
296
|
+
name: "Internal",
|
|
297
|
+
defaultModeId: "mode:1",
|
|
298
|
+
variableIds: ["var:secret"],
|
|
299
|
+
hiddenFromPublishing: true,
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
variables: {
|
|
303
|
+
"var:secret": {
|
|
304
|
+
id: "var:secret",
|
|
305
|
+
key: "key-secret",
|
|
306
|
+
name: "internal/color",
|
|
307
|
+
resolvedType: "COLOR",
|
|
308
|
+
description: "",
|
|
309
|
+
hiddenFromPublishing: false,
|
|
310
|
+
valuesByMode: { "mode:1": { r: 1, g: 0, b: 0, a: 1 } },
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
const result = buildTokenModel(data);
|
|
316
|
+
expect(result).toHaveLength(0);
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
// ---------------------------------------------------------------------------
|
|
320
|
+
// adaptCanonicalToTokenCollections — alias detection
|
|
321
|
+
// ---------------------------------------------------------------------------
|
|
322
|
+
describe("adaptCanonicalToTokenCollections", () => {
|
|
323
|
+
function makeExport(modeValue) {
|
|
324
|
+
return {
|
|
325
|
+
collections: [{
|
|
326
|
+
id: "col-1",
|
|
327
|
+
name: "Mapped",
|
|
328
|
+
modes: [{ id: "mode-1", name: "Default" }],
|
|
329
|
+
tokens: [{
|
|
330
|
+
id: "t1",
|
|
331
|
+
name: "text-primary",
|
|
332
|
+
valuesByMode: { "mode-1": modeValue },
|
|
333
|
+
}],
|
|
334
|
+
}],
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
it("detects VARIABLE_ALIAS with PTB-schema value format and strips VariableID: prefix", () => {
|
|
338
|
+
const result = adaptCanonicalToTokenCollections(makeExport({
|
|
339
|
+
type: "VARIABLE_ALIAS",
|
|
340
|
+
value: "VariableID:30:592",
|
|
341
|
+
}));
|
|
342
|
+
expect(result[0].tokens[0].aliasTargetId).toBe("30:592");
|
|
343
|
+
});
|
|
344
|
+
it("detects VARIABLE_ALIAS with raw Figma id format and strips VariableID: prefix", () => {
|
|
345
|
+
const result = adaptCanonicalToTokenCollections(makeExport({
|
|
346
|
+
type: "VARIABLE_ALIAS",
|
|
347
|
+
id: "VariableID:30:593",
|
|
348
|
+
}));
|
|
349
|
+
expect(result[0].tokens[0].aliasTargetId).toBe("30:593");
|
|
350
|
+
});
|
|
351
|
+
it("plain color value → no aliasTargetId set", () => {
|
|
352
|
+
const result = adaptCanonicalToTokenCollections(makeExport({
|
|
353
|
+
type: "COLOR",
|
|
354
|
+
value: "#103D1A",
|
|
355
|
+
}));
|
|
356
|
+
expect(result[0].tokens[0].aliasTargetId).toBeUndefined();
|
|
357
|
+
});
|
|
358
|
+
it("numeric value → preserved on the token", () => {
|
|
359
|
+
const result = adaptCanonicalToTokenCollections(makeExport({
|
|
360
|
+
type: "FLOAT",
|
|
361
|
+
value: 16,
|
|
362
|
+
}));
|
|
363
|
+
expect(result[0].tokens[0].value).toBe(16);
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
//# sourceMappingURL=token-resolution.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-resolution.test.js","sourceRoot":"","sources":["../../src/__tests__/token-resolution.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-provider.d.ts","sourceRoot":"","sources":["../../src/ai/resolve-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-provider.d.ts","sourceRoot":"","sources":["../../src/ai/resolve-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AA4CpF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,sBAAsB,CAwC3E"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getAIProvider, hasAIProvider } from "../registry/ai-provider-registry.js";
|
|
2
|
+
import { resolveToken } from "../config/credentials.js";
|
|
2
3
|
import { MockImplementationProvider } from "./provider.js";
|
|
3
4
|
const C = {
|
|
4
5
|
yellow: "\x1b[33m",
|
|
@@ -47,11 +48,11 @@ export function resolveAIProvider(config) {
|
|
|
47
48
|
}
|
|
48
49
|
let apiKey;
|
|
49
50
|
if (providerEntry.accessTokenEnv) {
|
|
50
|
-
apiKey =
|
|
51
|
+
apiKey = resolveToken(providerEntry.accessTokenEnv);
|
|
51
52
|
if (!apiKey) {
|
|
52
53
|
console.warn(` ${C.yellow}⚠${C.reset} ${C.bold}${providerEntry.accessTokenEnv}${C.reset} is not set. ` +
|
|
53
54
|
`Falling back to placeholder files.\n` +
|
|
54
|
-
` ${C.dim}
|
|
55
|
+
` ${C.dim}Run: ptb token set ${providerEntry.accessTokenEnv} <your-key> (or export ${providerEntry.accessTokenEnv}=<your-key>)${C.reset}`);
|
|
55
56
|
return new MockImplementationProvider();
|
|
56
57
|
}
|
|
57
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-provider.js","sourceRoot":"","sources":["../../src/ai/resolve-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAE3D,MAAM,CAAC,GAAG;IACN,MAAM,EAAE,UAAU;IAClB,GAAG,EAAK,SAAS;IACjB,KAAK,EAAG,SAAS;IACjB,IAAI,EAAI,SAAS;CACpB,CAAC;AAaF,oFAAoF;AACpF,0DAA0D;AAC1D,mFAAmF;AACnF,SAAS,iBAAiB,CAAC,GAAQ;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QACzD,OAAO;YACH,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE;gBACP,CAAC,QAAQ,CAAC,EAAE;oBACR,GAAG,CAAC,KAAK,CAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAW,CAAC,CAAC,EAAE,CAAC;oBAC/C,GAAG,CAAC,cAAc,CAAE,CAAC,CAAC,EAAE,cAAc,EAAE,CAAE,CAAC,CAAC,EAAE,CAAC;oBAC/C,GAAG,CAAC,OAAO,CAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAS,CAAC,CAAC,EAAE,CAAC;iBAClD;aACJ;SACJ,CAAC;IACN,CAAC;IACD,OAAO,GAAwB,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IAC/C,MAAM,OAAO,GAAG,iBAAiB,CAAE,MAAc,CAAC,EAAE,CAAC,CAAC;IAEtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,6DAA6D,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,4CAA4C,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7E,OAAO,IAAI,0BAA0B,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IACnD,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,iCAAiC,CAAC,CAAC,IAAI,wBAAwB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QAChH,OAAO,IAAI,0BAA0B,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,aAAa,GAAoB,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAE7E,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,kBAAkB,YAAY,uBAAuB;YAC7E,oCAAoC,CACvC,CAAC;QACF,OAAO,IAAI,0BAA0B,EAAE,CAAC;IAC5C,CAAC;IAED,IAAI,MAA0B,CAAC;IAC/B,IAAI,aAAa,CAAC,cAAc,EAAE,CAAC;QAC/B,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"resolve-provider.js","sourceRoot":"","sources":["../../src/ai/resolve-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Read one stored credential (env var name → value). Returns undefined if not stored. */
|
|
2
|
+
export declare function readCredential(key: string): string | undefined;
|
|
3
|
+
/** Persist a credential to ~/.config/calibrate-ds/credentials.json (mode 600, owner-only). */
|
|
4
|
+
export declare function writeCredential(key: string, value: string): void;
|
|
5
|
+
/** Remove one stored credential. Deletes the file when it becomes empty. */
|
|
6
|
+
export declare function clearCredential(key: string): void;
|
|
7
|
+
/**
|
|
8
|
+
* Single source of truth for all token resolution in PTB.
|
|
9
|
+
*
|
|
10
|
+
* Resolution order:
|
|
11
|
+
* 1. process.env[key] — env var set in the current process (wins if set, allows overrides)
|
|
12
|
+
* 2. ~/.config/calibrate-ds/credentials.json[key] — stored via `ptb token set`
|
|
13
|
+
*
|
|
14
|
+
* This means both the CLI and the MCP server (which runs as a separate process and does NOT
|
|
15
|
+
* inherit terminal env vars when launched from a GUI IDE) can reach the same stored token
|
|
16
|
+
* without any `launchctl setenv`, shell profile edits, or IDE restarts after `ptb token set`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveToken(key: string): string | undefined;
|
|
19
|
+
/** Returns all stored credentials as a key→value map (for `ptb token list`). */
|
|
20
|
+
export declare function listCredentials(): Record<string, string>;
|
|
21
|
+
/** Path exposed so `ptb token show` can tell the user where the file lives. */
|
|
22
|
+
export declare const CREDENTIALS_PATH: string;
|
|
23
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/config/credentials.ts"],"names":[],"mappings":"AAgBA,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE9D;AAED,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMhE;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CASjD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE5D;AAED,gFAAgF;AAChF,wBAAgB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAExD;AAED,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,EAAE,MAA6B,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
function getCredentialsPath() {
|
|
5
|
+
return path.join(os.homedir(), ".config", "calibrate-ds", "credentials.json");
|
|
6
|
+
}
|
|
7
|
+
function readAll() {
|
|
8
|
+
try {
|
|
9
|
+
return JSON.parse(fs.readFileSync(getCredentialsPath(), "utf-8"));
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Read one stored credential (env var name → value). Returns undefined if not stored. */
|
|
16
|
+
export function readCredential(key) {
|
|
17
|
+
return readAll()[key];
|
|
18
|
+
}
|
|
19
|
+
/** Persist a credential to ~/.config/calibrate-ds/credentials.json (mode 600, owner-only). */
|
|
20
|
+
export function writeCredential(key, value) {
|
|
21
|
+
const p = getCredentialsPath();
|
|
22
|
+
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
23
|
+
const all = readAll();
|
|
24
|
+
all[key] = value;
|
|
25
|
+
fs.writeFileSync(p, JSON.stringify(all, null, 2), { mode: 0o600 });
|
|
26
|
+
}
|
|
27
|
+
/** Remove one stored credential. Deletes the file when it becomes empty. */
|
|
28
|
+
export function clearCredential(key) {
|
|
29
|
+
const all = readAll();
|
|
30
|
+
delete all[key];
|
|
31
|
+
const p = getCredentialsPath();
|
|
32
|
+
if (Object.keys(all).length === 0) {
|
|
33
|
+
try {
|
|
34
|
+
fs.unlinkSync(p);
|
|
35
|
+
}
|
|
36
|
+
catch { /* already gone */ }
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
fs.writeFileSync(p, JSON.stringify(all, null, 2), { mode: 0o600 });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Single source of truth for all token resolution in PTB.
|
|
44
|
+
*
|
|
45
|
+
* Resolution order:
|
|
46
|
+
* 1. process.env[key] — env var set in the current process (wins if set, allows overrides)
|
|
47
|
+
* 2. ~/.config/calibrate-ds/credentials.json[key] — stored via `ptb token set`
|
|
48
|
+
*
|
|
49
|
+
* This means both the CLI and the MCP server (which runs as a separate process and does NOT
|
|
50
|
+
* inherit terminal env vars when launched from a GUI IDE) can reach the same stored token
|
|
51
|
+
* without any `launchctl setenv`, shell profile edits, or IDE restarts after `ptb token set`.
|
|
52
|
+
*/
|
|
53
|
+
export function resolveToken(key) {
|
|
54
|
+
return process.env[key] ?? readCredential(key);
|
|
55
|
+
}
|
|
56
|
+
/** Returns all stored credentials as a key→value map (for `ptb token list`). */
|
|
57
|
+
export function listCredentials() {
|
|
58
|
+
return readAll();
|
|
59
|
+
}
|
|
60
|
+
/** Path exposed so `ptb token show` can tell the user where the file lives. */
|
|
61
|
+
export const CREDENTIALS_PATH = getCredentialsPath();
|
|
62
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/config/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,SAAS,kBAAkB;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,OAAO;IACZ,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,CAA2B,CAAC;IAChG,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,cAAc,CAAC,GAAW;IACtC,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,KAAa;IACtD,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;IAC/B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACjB,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAAC,GAAW;IACvC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;IAC/B,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACJ,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,eAAe;IAC3B,OAAO,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAW,kBAAkB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"figma-adapter.d.ts","sourceRoot":"","sources":["../../src/design-tool/figma-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"figma-adapter.d.ts","sourceRoot":"","sources":["../../src/design-tool/figma-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,OAAO,KAAK,EAAE,kBAAkB,EAAwB,MAAM,YAAY,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,kBAqB1B,CAAC;AAEF;;;GAGG;AACH,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAa7D"}
|
|
@@ -2,6 +2,7 @@ import { getFigmaFile, getFigmaLocalVariables, getImageExports } from "@calibrat
|
|
|
2
2
|
import { scanFigmaFile } from "../scanner/index.js";
|
|
3
3
|
import { buildDesignSystemModel } from "../model/build-design-system-model.js";
|
|
4
4
|
import { resolveTokenSource } from "../tokens/resolve-token-source.js";
|
|
5
|
+
import { resolveToken } from "../config/credentials.js";
|
|
5
6
|
/**
|
|
6
7
|
* Figma adapter — the built-in implementation of IDesignToolAdapter.
|
|
7
8
|
* Wraps @calibrate-ds/figma-client and the core Figma scanner/normalizer pipeline.
|
|
@@ -37,9 +38,11 @@ export function getFigmaAccessToken(config) {
|
|
|
37
38
|
if (config.designTool.provider !== "figma") {
|
|
38
39
|
throw new Error(`getFigmaAccessToken called with non-Figma provider "${config.designTool.provider}"`);
|
|
39
40
|
}
|
|
40
|
-
const token =
|
|
41
|
+
const token = resolveToken(config.designTool.accessTokenEnv);
|
|
41
42
|
if (!token) {
|
|
42
|
-
throw new Error(`Missing design tool access token
|
|
43
|
+
throw new Error(`Missing design tool access token.\n` +
|
|
44
|
+
` Run: ptb token set <your-token>\n` +
|
|
45
|
+
` Or set the env var: export ${config.designTool.accessTokenEnv}=<your-token>`);
|
|
43
46
|
}
|
|
44
47
|
return token;
|
|
45
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"figma-adapter.js","sourceRoot":"","sources":["../../src/design-tool/figma-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"figma-adapter.js","sourceRoot":"","sources":["../../src/design-tool/figma-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIxD;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAuB;IAC5C,QAAQ,EAAE,OAAO;IAEjB,KAAK,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,WAAW,EAAwB;QAC/D,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAClD,gEAAgE;QAChE,OAAO,sBAAsB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAwB;QACtE,OAAO,sBAAsB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAgD;QAChG,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC9F,wEAAwE;QACxE,OAAO,MAAM,CAAC,WAAW,CACrB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAA6B,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CACzF,CAAC;IACN,CAAC;CACJ,CAAC;AAEF;;;GAGG;AACH,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACjD,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,uDAAuD,MAAM,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC1G,CAAC;IACD,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACX,qCAAqC;YACrC,qCAAqC;YACrC,gCAAgC,MAAM,CAAC,UAAU,CAAC,cAAc,eAAe,CAClF,CAAC;IACN,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-config.d.ts","sourceRoot":"","sources":["../../src/doctor/check-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"check-config.d.ts","sourceRoot":"","sources":["../../src/doctor/check-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,YAAY,CAAC;AAIlE,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+DhF"}
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import * as fs from "node:fs/promises";
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import { resolveDSPaths } from "../filesystem/resolve-ds-paths.js";
|
|
4
|
+
import { resolveToken } from "../config/credentials.js";
|
|
4
5
|
export async function checkConfig(config) {
|
|
5
6
|
const issues = [];
|
|
6
|
-
//
|
|
7
|
-
const token =
|
|
7
|
+
// Token present (env var or credentials file)
|
|
8
|
+
const token = resolveToken(config.designTool.accessTokenEnv);
|
|
8
9
|
if (!token) {
|
|
9
10
|
issues.push({
|
|
10
11
|
severity: "critical",
|
|
11
12
|
check: "env-var",
|
|
12
13
|
message: `${config.designTool.accessTokenEnv} is not set`,
|
|
13
|
-
suggestion: `export ${config.designTool.accessTokenEnv}
|
|
14
|
+
suggestion: `Run: ptb token set <your-token> (or export ${config.designTool.accessTokenEnv}=<your-token>)`,
|
|
14
15
|
});
|
|
15
16
|
}
|
|
16
17
|
else {
|
|
17
|
-
|
|
18
|
+
const source = process.env[config.designTool.accessTokenEnv] ? "env var" : "credentials file";
|
|
19
|
+
issues.push({ severity: "pass", check: "env-var", message: `${config.designTool.accessTokenEnv} is set (${source})`, suggestion: "" });
|
|
18
20
|
}
|
|
19
21
|
// Figma file key not placeholder
|
|
20
22
|
if (!config.designTool.fileKey || config.designTool.fileKey === "YOUR_FIGMA_FILE_KEY") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-config.js","sourceRoot":"","sources":["../../src/doctor/check-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"check-config.js","sourceRoot":"","sources":["../../src/doctor/check-config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AAErC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oCAAoC,CAAC;AACnD,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qCAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AAErC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oCAAoC,CAAC;AACnD,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qCAAqC,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AAErC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oCAAoC,CAAC;AACnD,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qCAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AAErC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oCAAoC,CAAC;AACnD,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qCAAqC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-figma-screenshot.d.ts","sourceRoot":"","sources":["../../src/verify/fetch-figma-screenshot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch-figma-screenshot.d.ts","sourceRoot":"","sources":["../../src/verify/fetch-figma-screenshot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAK5D;;;GAGG;AACH,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6BxB"}
|
|
@@ -2,12 +2,13 @@ import * as fs from "node:fs/promises";
|
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import { getImageExports } from "@calibrate-ds/figma-client";
|
|
4
4
|
import { resolveDSPaths } from "../filesystem/resolve-ds-paths.js";
|
|
5
|
+
import { resolveToken } from "../config/credentials.js";
|
|
5
6
|
/**
|
|
6
7
|
* Fetches a PNG export of a Figma component node and saves it to
|
|
7
8
|
* .ptb/verify/<slug>/figma.png. Returns the saved path, or null on failure.
|
|
8
9
|
*/
|
|
9
10
|
export async function fetchFigmaScreenshot(nodeId, slug, config) {
|
|
10
|
-
const token =
|
|
11
|
+
const token = resolveToken(config.designTool.accessTokenEnv) ?? "";
|
|
11
12
|
if (!token || !nodeId)
|
|
12
13
|
return null;
|
|
13
14
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-figma-screenshot.js","sourceRoot":"","sources":["../../src/verify/fetch-figma-screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch-figma-screenshot.js","sourceRoot":"","sources":["../../src/verify/fetch-figma-screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,MAAc,EACd,IAAY,EACZ,MAAiB;IAEjB,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACnE,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC;YAC/B,KAAK;YACL,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO;YAClC,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,MAAM,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAEpD,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@calibrate-ds/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.36",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"pixelmatch": "^6.0.0",
|
|
28
28
|
"pngjs": "^7.0.0",
|
|
29
29
|
"zod": "^4.3.6",
|
|
30
|
-
"@calibrate-ds/shared-types": "^0.1.
|
|
31
|
-
"@calibrate-ds/figma-client": "^0.1.
|
|
30
|
+
"@calibrate-ds/shared-types": "^0.1.36",
|
|
31
|
+
"@calibrate-ds/figma-client": "^0.1.36"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "tsc -p tsconfig.json",
|