@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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=get-component-context.test.d.ts.map
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=token-resolution.test.d.ts.map
@@ -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;AA2CpF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,sBAAsB,CAwC3E"}
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 = process.env[providerEntry.accessTokenEnv];
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}To enable AI: export ${providerEntry.accessTokenEnv}=<your-key>${C.reset}`);
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":"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"}
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,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,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,YAAY,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC,cAAc,GAAG,CAAC,CAAC,KAAK,eAAe;gBAC3F,sCAAsC;gBACtC,KAAK,CAAC,CAAC,GAAG,sBAAsB,aAAa,CAAC,cAAc,2BAA2B,aAAa,CAAC,cAAc,eAAe,CAAC,CAAC,KAAK,EAAE,CAC9I,CAAC;YACF,OAAO,IAAI,0BAA0B,EAAE,CAAC;QAC5C,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;AACvE,CAAC"}
@@ -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;AACvE,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,CAS7D"}
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 = process.env[config.designTool.accessTokenEnv];
41
+ const token = resolveToken(config.designTool.accessTokenEnv);
41
42
  if (!token) {
42
- throw new Error(`Missing design tool access token. Please set ${config.designTool.accessTokenEnv} in your environment.`);
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;AAIvE;;;;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,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,gDAAgD,MAAM,CAAC,UAAU,CAAC,cAAc,uBAAuB,CAAC,CAAC;IAC7H,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,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;AAGlE,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA8DhF"}
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
- // Env var present
7
- const token = process.env[config.designTool.accessTokenEnv];
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}=your_figma_token`,
14
+ suggestion: `Run: ptb token set <your-token> (or export ${config.designTool.accessTokenEnv}=<your-token>)`,
14
15
  });
15
16
  }
16
17
  else {
17
- issues.push({ severity: "pass", check: "env-var", message: `${config.designTool.accessTokenEnv} is set`, suggestion: "" });
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;AAEnE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB;IAC/C,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,kBAAkB;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC;YACR,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,cAAc,aAAa;YACzD,UAAU,EAAE,UAAU,MAAM,CAAC,UAAU,CAAC,cAAc,mBAAmB;SAC5E,CAAC,CAAC;IACP,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,cAAc,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/H,CAAC;IAED,iCAAiC;IACjC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,KAAK,qBAAqB,EAAE,CAAC;QACpF,MAAM,CAAC,IAAI,CAAC;YACR,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,+CAA+C;YACxD,UAAU,EAAE,yEAAyE;SACxF,CAAC,CAAC;IACP,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,2BAA2B,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/G,CAAC;IAED,qBAAqB;IACrB,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC3D,IAAI,WAA+B,CAAC;IAEpC,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;QAEnE,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC;gBACR,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,eAAe,WAAW,WAAW;gBAC9C,UAAU,EAAE,qDAAqD;aACpE,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC;gBACR,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,eAAe,WAAW,OAAO,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM;gBAC5E,UAAU,EAAE,EAAE;aACjB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,CAAC,IAAI,CAAC;YACR,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,4DAA4D;YACrE,UAAU,EAAE,6DAA6D;SAC5E,CAAC,CAAC;IACP,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACnC,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
@@ -1,4 +1,5 @@
1
1
  export * from "./config/index.js";
2
+ export * from "./config/credentials.js";
2
3
  export * from "./scanner/index.js";
3
4
  export * from "./normalizer/index.js";
4
5
  export * from "./model/index.js";
@@ -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
@@ -1,4 +1,5 @@
1
1
  export * from "./config/index.js";
2
+ export * from "./config/credentials.js";
2
3
  export * from "./scanner/index.js";
3
4
  export * from "./normalizer/index.js";
4
5
  export * from "./model/index.js";
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;AAI5D;;;GAGG;AACH,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6BxB"}
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 = process.env[config.designTool.accessTokenEnv] ?? "";
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;AAEnE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,MAAc,EACd,IAAY,EACZ,MAAiB;IAEjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAClE,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"}
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.34",
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.34",
31
- "@calibrate-ds/figma-client": "^0.1.34"
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",