@visual-layer/figma-rest 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +27 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +93 -5
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/normalize.d.ts +13 -0
- package/dist/normalize.d.ts.map +1 -1
- package/dist/normalize.js +33 -12
- package/dist/normalize.js.map +1 -1
- package/package.json +2 -2
package/dist/client.d.ts
CHANGED
|
@@ -21,12 +21,21 @@ export interface FigmaNodeResult {
|
|
|
21
21
|
document: FigmaNode;
|
|
22
22
|
version: string;
|
|
23
23
|
}
|
|
24
|
+
export interface FigmaImageBytes {
|
|
25
|
+
bytes: Uint8Array;
|
|
26
|
+
mimeType: 'image/png' | 'image/jpeg';
|
|
27
|
+
width: number;
|
|
28
|
+
height: number;
|
|
29
|
+
}
|
|
24
30
|
export interface FigmaClient {
|
|
25
|
-
getFileNodes(fileKey: string, nodeIds: readonly string[]
|
|
31
|
+
getFileNodes(fileKey: string, nodeIds: readonly string[], opts?: {
|
|
32
|
+
version?: string;
|
|
33
|
+
}): Promise<FigmaNodeResult>;
|
|
26
34
|
getNodeImage(fileKey: string, nodeIds: readonly string[], opts?: {
|
|
27
35
|
format?: 'png' | 'jpg';
|
|
28
36
|
scale?: number;
|
|
29
37
|
}): Promise<Record<string, string | null>>;
|
|
38
|
+
getImageBytes(url: string): Promise<FigmaImageBytes>;
|
|
30
39
|
}
|
|
31
40
|
export declare class FigmaClientError extends Error {
|
|
32
41
|
readonly retryAfterMs?: number | undefined;
|
|
@@ -38,30 +47,46 @@ export interface HttpFigmaOptions {
|
|
|
38
47
|
fetch?: typeof fetch;
|
|
39
48
|
maxRetries?: number;
|
|
40
49
|
baseUrl?: string;
|
|
50
|
+
cacheTtlMs?: number;
|
|
51
|
+
now?: () => number;
|
|
41
52
|
}
|
|
42
53
|
export declare class HttpFigmaClient implements FigmaClient {
|
|
43
54
|
private readonly token;
|
|
44
55
|
private readonly fetchImpl;
|
|
45
56
|
private readonly maxRetries;
|
|
46
57
|
private readonly baseUrl;
|
|
58
|
+
private readonly cacheTtlMs;
|
|
59
|
+
private readonly now;
|
|
60
|
+
private readonly nodeCache;
|
|
47
61
|
constructor(opts?: HttpFigmaOptions);
|
|
48
|
-
getFileNodes(fileKey: string, nodeIds: readonly string[]
|
|
62
|
+
getFileNodes(fileKey: string, nodeIds: readonly string[], opts?: {
|
|
63
|
+
version?: string;
|
|
64
|
+
}): Promise<FigmaNodeResult>;
|
|
49
65
|
getNodeImage(fileKey: string, nodeIds: readonly string[], opts?: {
|
|
50
66
|
format?: 'png' | 'jpg';
|
|
51
67
|
scale?: number;
|
|
52
68
|
}): Promise<Record<string, string | null>>;
|
|
69
|
+
getImageBytes(url: string): Promise<FigmaImageBytes>;
|
|
53
70
|
private requestJson;
|
|
54
71
|
}
|
|
55
72
|
export interface MockEntry {
|
|
56
73
|
document: FigmaNode;
|
|
57
74
|
version: string;
|
|
58
75
|
images?: Record<string, string | null>;
|
|
76
|
+
imageData?: Record<string, {
|
|
77
|
+
base64: string;
|
|
78
|
+
mimeType: 'image/png' | 'image/jpeg';
|
|
79
|
+
width: number;
|
|
80
|
+
height: number;
|
|
81
|
+
}>;
|
|
59
82
|
}
|
|
60
83
|
export declare class MockFigmaClient implements FigmaClient {
|
|
61
84
|
private files;
|
|
62
85
|
constructor(files: Record<string, MockEntry>);
|
|
63
86
|
getFileNodes(fileKey: string, nodeIds: readonly string[]): Promise<FigmaNodeResult>;
|
|
64
87
|
getNodeImage(fileKey: string, nodeIds: readonly string[]): Promise<Record<string, string | null>>;
|
|
88
|
+
getImageBytes(url: string): Promise<FigmaImageBytes>;
|
|
65
89
|
}
|
|
66
90
|
export declare function findNode(root: FigmaNode, id: string): FigmaNode | null;
|
|
91
|
+
export declare function nodeCacheKey(fileKey: string, nodeIds: readonly string[], version: string): string;
|
|
67
92
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,SAAS;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAChC,oBAAoB,CAAC,EAAE,SAAS,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD,8CAA8C;IAC9C,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,SAAS;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAChC,oBAAoB,CAAC,EAAE,SAAS,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD,8CAA8C;IAC9C,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,WAAW,GAAG,YAAY,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACjH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACrJ,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACtD;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAEE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM;IADzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAW,YAAY,CAAC,EAAE,MAAM,YAAA;CAK1E;AAID,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoE;gBAElF,IAAI,GAAE,gBAAqB;IASjC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAsBpH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAYxJ,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YAuB5C,WAAW;CA8B1B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,WAAW,GAAG,YAAY,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrH;AAED,qBAAa,eAAgB,YAAW,WAAW;IACrC,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;IAE9C,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAUnF,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAQjG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAc3D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAOtE;AAiBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjG"}
|
package/dist/client.js
CHANGED
|
@@ -25,27 +25,44 @@ export class HttpFigmaClient {
|
|
|
25
25
|
fetchImpl;
|
|
26
26
|
maxRetries;
|
|
27
27
|
baseUrl;
|
|
28
|
+
cacheTtlMs;
|
|
29
|
+
now;
|
|
30
|
+
nodeCache = new Map();
|
|
28
31
|
constructor(opts = {}) {
|
|
29
32
|
this.token = opts.token ?? process.env['FIGMA_TOKEN'];
|
|
30
33
|
this.fetchImpl = opts.fetch ?? fetch;
|
|
31
34
|
this.maxRetries = opts.maxRetries ?? 3;
|
|
32
35
|
this.baseUrl = opts.baseUrl ?? API;
|
|
36
|
+
this.cacheTtlMs = opts.cacheTtlMs ?? 5 * 60 * 1000;
|
|
37
|
+
this.now = opts.now ?? Date.now;
|
|
33
38
|
}
|
|
34
|
-
async getFileNodes(fileKey, nodeIds) {
|
|
39
|
+
async getFileNodes(fileKey, nodeIds, opts = {}) {
|
|
40
|
+
const key = nodeCacheKey(fileKey, nodeIds, opts.version ?? 'latest');
|
|
41
|
+
const cached = this.nodeCache.get(key);
|
|
42
|
+
if (cached && cached.expiresAt >= this.now())
|
|
43
|
+
return cached.value;
|
|
35
44
|
// Figma /nodes expects comma-separated ids; encode each id individually and join with a
|
|
36
45
|
// literal comma so the separator survives URL encoding (encodeURIComponent would turn it into %2C).
|
|
37
46
|
const ids = nodeIds.map((id) => encodeURIComponent(id)).join(',');
|
|
38
|
-
const
|
|
47
|
+
const version = opts.version ? `&version=${encodeURIComponent(opts.version)}` : '';
|
|
48
|
+
const url = `${this.baseUrl}/v1/files/${encodeURIComponent(fileKey)}/nodes?ids=${ids}${version}`;
|
|
39
49
|
const body = await this.requestJson(url);
|
|
40
50
|
const entry = body?.nodes?.[nodeIds[0]];
|
|
41
51
|
if (!entry)
|
|
42
52
|
throw new FigmaClientError(ErrorCodes.node_not_found, `node ${nodeIds[0]} not found in file ${fileKey}`);
|
|
43
|
-
|
|
53
|
+
const value = { document: entry.document, version: String(body?.version ?? '') };
|
|
54
|
+
const expiresAt = this.now() + this.cacheTtlMs;
|
|
55
|
+
this.nodeCache.set(key, { value, expiresAt });
|
|
56
|
+
if (value.version) {
|
|
57
|
+
this.nodeCache.set(nodeCacheKey(fileKey, nodeIds, value.version), { value, expiresAt });
|
|
58
|
+
}
|
|
59
|
+
return value;
|
|
44
60
|
}
|
|
45
61
|
async getNodeImage(fileKey, nodeIds, opts = {}) {
|
|
46
|
-
const ids = nodeIds.map((id) => encodeURIComponent(id)).join(',');
|
|
47
62
|
const params = new URLSearchParams();
|
|
48
|
-
|
|
63
|
+
// URLSearchParams performs encoding; pass raw ids to avoid double-encoding
|
|
64
|
+
// Figma's `1:2` node id into `1%253A2`.
|
|
65
|
+
params.set('ids', nodeIds.join(','));
|
|
49
66
|
if (opts.format)
|
|
50
67
|
params.set('format', opts.format);
|
|
51
68
|
if (opts.scale)
|
|
@@ -54,6 +71,29 @@ export class HttpFigmaClient {
|
|
|
54
71
|
const body = await this.requestJson(url);
|
|
55
72
|
return (body?.images ?? {});
|
|
56
73
|
}
|
|
74
|
+
async getImageBytes(url) {
|
|
75
|
+
let parsedUrl;
|
|
76
|
+
try {
|
|
77
|
+
parsedUrl = new URL(url);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
throw new FigmaClientError('image_url_forbidden', 'figma render URL is invalid');
|
|
81
|
+
}
|
|
82
|
+
if (parsedUrl.protocol !== 'https:') {
|
|
83
|
+
throw new FigmaClientError('image_url_forbidden', 'figma render URL must use https');
|
|
84
|
+
}
|
|
85
|
+
const res = await this.fetchImpl(parsedUrl);
|
|
86
|
+
if (!res.ok) {
|
|
87
|
+
throw new FigmaClientError('image_fetch_failed', `figma render fetch failed (${res.status})`);
|
|
88
|
+
}
|
|
89
|
+
const bytes = new Uint8Array(await res.arrayBuffer());
|
|
90
|
+
const header = (res.headers.get('content-type') ?? '').toLowerCase();
|
|
91
|
+
const mimeType = header.includes('jpeg') || header.includes('jpg')
|
|
92
|
+
? 'image/jpeg'
|
|
93
|
+
: 'image/png';
|
|
94
|
+
const { width, height } = imageDimensions(bytes, mimeType);
|
|
95
|
+
return { bytes, mimeType, width, height };
|
|
96
|
+
}
|
|
57
97
|
async requestJson(url) {
|
|
58
98
|
if (!this.token) {
|
|
59
99
|
throw new FigmaClientError(ErrorCodes.missing_token, 'FIGMA_TOKEN not set');
|
|
@@ -108,6 +148,20 @@ export class MockFigmaClient {
|
|
|
108
148
|
out[id] = images[id] ?? null;
|
|
109
149
|
return out;
|
|
110
150
|
}
|
|
151
|
+
async getImageBytes(url) {
|
|
152
|
+
for (const entry of Object.values(this.files)) {
|
|
153
|
+
const image = entry.imageData?.[url];
|
|
154
|
+
if (image) {
|
|
155
|
+
return {
|
|
156
|
+
bytes: new Uint8Array(Buffer.from(image.base64, 'base64')),
|
|
157
|
+
mimeType: image.mimeType,
|
|
158
|
+
width: image.width,
|
|
159
|
+
height: image.height,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
throw new FigmaClientError('image_fetch_failed', `mock image data missing for ${url}`);
|
|
164
|
+
}
|
|
111
165
|
}
|
|
112
166
|
export function findNode(root, id) {
|
|
113
167
|
if (root.id === id)
|
|
@@ -133,4 +187,38 @@ function backoffMs(attempt) {
|
|
|
133
187
|
function sleep(ms) {
|
|
134
188
|
return new Promise((r) => setTimeout(r, ms));
|
|
135
189
|
}
|
|
190
|
+
export function nodeCacheKey(fileKey, nodeIds, version) {
|
|
191
|
+
return `${fileKey}:${[...nodeIds].sort().join(',')}:${version}`;
|
|
192
|
+
}
|
|
193
|
+
function imageDimensions(bytes, mimeType) {
|
|
194
|
+
if (mimeType === 'image/png') {
|
|
195
|
+
if (bytes.length < 24 || bytes[0] !== 0x89 || bytes[1] !== 0x50 || bytes[2] !== 0x4e || bytes[3] !== 0x47) {
|
|
196
|
+
throw new FigmaClientError('image_invalid', 'render is not a valid PNG');
|
|
197
|
+
}
|
|
198
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
199
|
+
return { width: view.getUint32(16), height: view.getUint32(20) };
|
|
200
|
+
}
|
|
201
|
+
if (bytes.length < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8) {
|
|
202
|
+
throw new FigmaClientError('image_invalid', 'render is not a valid JPEG');
|
|
203
|
+
}
|
|
204
|
+
let offset = 2;
|
|
205
|
+
while (offset + 8 < bytes.length) {
|
|
206
|
+
if (bytes[offset] !== 0xff) {
|
|
207
|
+
offset++;
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
const marker = bytes[offset + 1];
|
|
211
|
+
const length = (bytes[offset + 2] << 8) + bytes[offset + 3];
|
|
212
|
+
if (marker >= 0xc0 && marker <= 0xc3) {
|
|
213
|
+
return {
|
|
214
|
+
height: (bytes[offset + 5] << 8) + bytes[offset + 6],
|
|
215
|
+
width: (bytes[offset + 7] << 8) + bytes[offset + 8],
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
if (length < 2)
|
|
219
|
+
break;
|
|
220
|
+
offset += 2 + length;
|
|
221
|
+
}
|
|
222
|
+
throw new FigmaClientError('image_invalid', 'JPEG dimensions not found');
|
|
223
|
+
}
|
|
136
224
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/normalize.d.ts
CHANGED
|
@@ -14,11 +14,24 @@ export interface CaptureFigmaOptions {
|
|
|
14
14
|
id?: string;
|
|
15
15
|
/** Override the viewport (Figma frames have their own size). */
|
|
16
16
|
viewport?: ScreenGraph['viewport'];
|
|
17
|
+
/** Capture an immutable Figma version and use the version-aware client cache. */
|
|
18
|
+
version?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface FigmaRenderArtifact {
|
|
21
|
+
artifactId: string;
|
|
22
|
+
bytes: Uint8Array;
|
|
23
|
+
mimeType: 'image/png' | 'image/jpeg';
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
sha256: string;
|
|
27
|
+
sourceUrl: string;
|
|
17
28
|
}
|
|
18
29
|
export interface CaptureFigmaResult {
|
|
19
30
|
graph: ScreenGraph;
|
|
20
31
|
/** Rendered image URL per node id, when includeImage was set. */
|
|
21
32
|
imageUrls?: Record<string, string | null>;
|
|
33
|
+
/** Materialized render ready for the artifact-store boundary. */
|
|
34
|
+
renderedImage?: FigmaRenderArtifact;
|
|
22
35
|
warnings: Warning[];
|
|
23
36
|
}
|
|
24
37
|
export declare function captureFigma(client: FigmaClient, opts: CaptureFigmaOptions): Promise<CaptureFigmaResult>;
|
package/dist/normalize.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,OAAO,
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,OAAO,EASb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kCAAkC;IAClC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IACnC,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,WAAW,GAAG,YAAY,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,CAAC;IACnB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,iEAAiE;IACjE,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAID,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkH9G"}
|
package/dist/normalize.js
CHANGED
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
* Structure-first: derive interactables from FRAME / COMPONENT / INSTANCE / TEXT
|
|
4
4
|
* nodes, not from rendered pixels.
|
|
5
5
|
*/
|
|
6
|
-
import { SCHEMA_VERSION, deterministicId, warn, info, } from '@visual-layer/core';
|
|
6
|
+
import { SCHEMA_VERSION, deterministicId, sha256, warn, info, } from '@visual-layer/core';
|
|
7
7
|
const INTERACTIVE_TYPES = new Set(['COMPONENT', 'INSTANCE', 'FRAME', 'TEXT', 'RECTANGLE']);
|
|
8
8
|
export async function captureFigma(client, opts) {
|
|
9
|
-
const { document, version } = await client.getFileNodes(opts.fileKey, [opts.nodeId]
|
|
9
|
+
const { document, version } = await client.getFileNodes(opts.fileKey, [opts.nodeId], {
|
|
10
|
+
version: opts.version,
|
|
11
|
+
});
|
|
10
12
|
const warnings = [];
|
|
11
13
|
const interactables = [];
|
|
12
14
|
const seenLabels = new Map();
|
|
@@ -50,6 +52,7 @@ export async function captureFigma(client, opts) {
|
|
|
50
52
|
}
|
|
51
53
|
let imageUrls;
|
|
52
54
|
let screenshot;
|
|
55
|
+
let renderedImage;
|
|
53
56
|
if (opts.includeImage) {
|
|
54
57
|
imageUrls = await client.getNodeImage(opts.fileKey, [opts.nodeId]).catch(() => ({ [opts.nodeId]: null }));
|
|
55
58
|
const url = imageUrls[opts.nodeId];
|
|
@@ -57,15 +60,33 @@ export async function captureFigma(client, opts) {
|
|
|
57
60
|
warnings.push(warn('image_render_null', `image render for ${opts.nodeId} returned null`, undefined));
|
|
58
61
|
}
|
|
59
62
|
else {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
63
|
+
try {
|
|
64
|
+
const image = await client.getImageBytes(url);
|
|
65
|
+
const artifactId = deterministicId('img', url);
|
|
66
|
+
const hash = sha256(image.bytes);
|
|
67
|
+
renderedImage = {
|
|
68
|
+
artifactId,
|
|
69
|
+
bytes: image.bytes,
|
|
70
|
+
mimeType: image.mimeType,
|
|
71
|
+
width: image.width,
|
|
72
|
+
height: image.height,
|
|
73
|
+
sha256: hash,
|
|
74
|
+
sourceUrl: url,
|
|
75
|
+
};
|
|
76
|
+
screenshot = {
|
|
77
|
+
artifactId,
|
|
78
|
+
sha256: hash,
|
|
79
|
+
width: image.width,
|
|
80
|
+
height: image.height,
|
|
81
|
+
mimeType: image.mimeType,
|
|
82
|
+
};
|
|
83
|
+
if (Math.max(image.width, image.height) > 4096) {
|
|
84
|
+
warnings.push(warn('screenshot_dimension_oversize', `Figma render ${image.width}x${image.height} exceeds 4096px longest-side budget`, undefined));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
warnings.push(warn('image_fetch_failed', `image render for ${opts.nodeId} could not be materialized: ${e instanceof Error ? e.message : String(e)}`, undefined));
|
|
89
|
+
}
|
|
69
90
|
}
|
|
70
91
|
}
|
|
71
92
|
const graph = {
|
|
@@ -83,7 +104,7 @@ export async function captureFigma(client, opts) {
|
|
|
83
104
|
{ field: 'interactables', source: 'figma', confidence: 0.85, note: `fileKey=${opts.fileKey} node=${opts.nodeId} v=${version}` },
|
|
84
105
|
],
|
|
85
106
|
};
|
|
86
|
-
return { graph, imageUrls, warnings };
|
|
107
|
+
return { graph, imageUrls, renderedImage, warnings };
|
|
87
108
|
}
|
|
88
109
|
function flatten(node, out) {
|
|
89
110
|
out.push(node);
|
package/dist/normalize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAOL,cAAc,EACd,eAAe,EACf,IAAI,EACJ,IAAI,GACL,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visual-layer/figma-rest",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Figma REST capture with mockable client, rate-limit, retry",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"zod": "^3.23.8",
|
|
28
|
-
"@visual-layer/core": "1.
|
|
28
|
+
"@visual-layer/core": "1.1.0"
|
|
29
29
|
},
|
|
30
30
|
"scripts": {
|
|
31
31
|
"build": "tsc -b",
|