@bilalba/fig-mcp 1.0.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/README.md +112 -0
- package/dist/compare-get-vector.d.ts +2 -0
- package/dist/compare-get-vector.d.ts.map +1 -0
- package/dist/compare-get-vector.js +124 -0
- package/dist/compare-get-vector.js.map +1 -0
- package/dist/compare-mcp-vs-direct.d.ts +2 -0
- package/dist/compare-mcp-vs-direct.d.ts.map +1 -0
- package/dist/compare-mcp-vs-direct.js +173 -0
- package/dist/compare-mcp-vs-direct.js.map +1 -0
- package/dist/compare-renderers.d.ts +2 -0
- package/dist/compare-renderers.d.ts.map +1 -0
- package/dist/compare-renderers.js +110 -0
- package/dist/compare-renderers.js.map +1 -0
- package/dist/debug/debug-stroke-geom.d.ts +2 -0
- package/dist/debug/debug-stroke-geom.d.ts.map +1 -0
- package/dist/debug/debug-stroke-geom.js +67 -0
- package/dist/debug/debug-stroke-geom.js.map +1 -0
- package/dist/debug/debug-transforms.d.ts +2 -0
- package/dist/debug/debug-transforms.d.ts.map +1 -0
- package/dist/debug/debug-transforms.js +97 -0
- package/dist/debug/debug-transforms.js.map +1 -0
- package/dist/debug/debug-vertex.d.ts +2 -0
- package/dist/debug/debug-vertex.d.ts.map +1 -0
- package/dist/debug/debug-vertex.js +72 -0
- package/dist/debug/debug-vertex.js.map +1 -0
- package/dist/debug-group.d.ts +5 -0
- package/dist/debug-group.d.ts.map +1 -0
- package/dist/debug-group.js +44 -0
- package/dist/debug-group.js.map +1 -0
- package/dist/debug-stroke-geom.d.ts +2 -0
- package/dist/debug-stroke-geom.d.ts.map +1 -0
- package/dist/debug-stroke-geom.js +67 -0
- package/dist/debug-stroke-geom.js.map +1 -0
- package/dist/debug-transforms.d.ts +2 -0
- package/dist/debug-transforms.d.ts.map +1 -0
- package/dist/debug-transforms.js +97 -0
- package/dist/debug-transforms.js.map +1 -0
- package/dist/debug-vertex.d.ts +2 -0
- package/dist/debug-vertex.d.ts.map +1 -0
- package/dist/debug-vertex.js +72 -0
- package/dist/debug-vertex.js.map +1 -0
- package/dist/decode-vector-network.d.ts +5 -0
- package/dist/decode-vector-network.d.ts.map +1 -0
- package/dist/decode-vector-network.js +160 -0
- package/dist/decode-vector-network.js.map +1 -0
- package/dist/experimental/paint-utils.d.ts +35 -0
- package/dist/experimental/paint-utils.d.ts.map +1 -0
- package/dist/experimental/paint-utils.js +105 -0
- package/dist/experimental/paint-utils.js.map +1 -0
- package/dist/experimental/render-screen-v2.d.ts +32 -0
- package/dist/experimental/render-screen-v2.d.ts.map +1 -0
- package/dist/experimental/render-screen-v2.js +366 -0
- package/dist/experimental/render-screen-v2.js.map +1 -0
- package/dist/experimental/render-screen.d.ts +26 -0
- package/dist/experimental/render-screen.d.ts.map +1 -0
- package/dist/experimental/render-screen.js +547 -0
- package/dist/experimental/render-screen.js.map +1 -0
- package/dist/experimental/render-types.d.ts +43 -0
- package/dist/experimental/render-types.d.ts.map +1 -0
- package/dist/experimental/render-types.js +22 -0
- package/dist/experimental/render-types.js.map +1 -0
- package/dist/experimental/render-utils.d.ts +38 -0
- package/dist/experimental/render-utils.d.ts.map +1 -0
- package/dist/experimental/render-utils.js +126 -0
- package/dist/experimental/render-utils.js.map +1 -0
- package/dist/experimental/screenshot.d.ts +11 -0
- package/dist/experimental/screenshot.d.ts.map +1 -0
- package/dist/experimental/screenshot.js +26 -0
- package/dist/experimental/screenshot.js.map +1 -0
- package/dist/experimental/vector-renderer.d.ts +31 -0
- package/dist/experimental/vector-renderer.d.ts.map +1 -0
- package/dist/experimental/vector-renderer.js +427 -0
- package/dist/experimental/vector-renderer.js.map +1 -0
- package/dist/explore-images.d.ts +9 -0
- package/dist/explore-images.d.ts.map +1 -0
- package/dist/explore-images.js +307 -0
- package/dist/explore-images.js.map +1 -0
- package/dist/http-server.d.ts +8 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +95 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect-fig.d.ts +16 -0
- package/dist/inspect-fig.d.ts.map +1 -0
- package/dist/inspect-fig.js +134 -0
- package/dist/inspect-fig.js.map +1 -0
- package/dist/inspect-frame.d.ts +2 -0
- package/dist/inspect-frame.d.ts.map +1 -0
- package/dist/inspect-frame.js +90 -0
- package/dist/inspect-frame.js.map +1 -0
- package/dist/inspect-nodes.d.ts +5 -0
- package/dist/inspect-nodes.d.ts.map +1 -0
- package/dist/inspect-nodes.js +193 -0
- package/dist/inspect-nodes.js.map +1 -0
- package/dist/mcp/server.d.ts +38 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +1524 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/parser/fig-reader.d.ts +29 -0
- package/dist/parser/fig-reader.d.ts.map +1 -0
- package/dist/parser/fig-reader.js +182 -0
- package/dist/parser/fig-reader.js.map +1 -0
- package/dist/parser/index.d.ts +48 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +106 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/kiwi-parser.d.ts +66 -0
- package/dist/parser/kiwi-parser.d.ts.map +1 -0
- package/dist/parser/kiwi-parser.js +491 -0
- package/dist/parser/kiwi-parser.js.map +1 -0
- package/dist/parser/layout-inference.d.ts +63 -0
- package/dist/parser/layout-inference.d.ts.map +1 -0
- package/dist/parser/layout-inference.js +446 -0
- package/dist/parser/layout-inference.js.map +1 -0
- package/dist/parser/types.d.ts +286 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +6 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/render-single.d.ts +2 -0
- package/dist/render-single.d.ts.map +1 -0
- package/dist/render-single.js +53 -0
- package/dist/render-single.js.map +1 -0
- package/dist/renderer/index.d.ts +16 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +18 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/paint-utils.d.ts +35 -0
- package/dist/renderer/paint-utils.d.ts.map +1 -0
- package/dist/renderer/paint-utils.js +105 -0
- package/dist/renderer/paint-utils.js.map +1 -0
- package/dist/renderer/render-screen.d.ts +26 -0
- package/dist/renderer/render-screen.d.ts.map +1 -0
- package/dist/renderer/render-screen.js +547 -0
- package/dist/renderer/render-screen.js.map +1 -0
- package/dist/renderer/render-types.d.ts +43 -0
- package/dist/renderer/render-types.d.ts.map +1 -0
- package/dist/renderer/render-types.js +22 -0
- package/dist/renderer/render-types.js.map +1 -0
- package/dist/renderer/render-utils.d.ts +38 -0
- package/dist/renderer/render-utils.d.ts.map +1 -0
- package/dist/renderer/render-utils.js +126 -0
- package/dist/renderer/render-utils.js.map +1 -0
- package/dist/renderer/screenshot.d.ts +11 -0
- package/dist/renderer/screenshot.d.ts.map +1 -0
- package/dist/renderer/screenshot.js +26 -0
- package/dist/renderer/screenshot.js.map +1 -0
- package/dist/renderer/vector-renderer.d.ts +31 -0
- package/dist/renderer/vector-renderer.d.ts.map +1 -0
- package/dist/renderer/vector-renderer.js +427 -0
- package/dist/renderer/vector-renderer.js.map +1 -0
- package/dist/shared-config.d.ts +9 -0
- package/dist/shared-config.d.ts.map +1 -0
- package/dist/shared-config.js +9 -0
- package/dist/shared-config.js.map +1 -0
- package/dist/test-parser.d.ts +3 -0
- package/dist/test-parser.d.ts.map +1 -0
- package/dist/test-parser.js +74 -0
- package/dist/test-parser.js.map +1 -0
- package/dist/test-render-v2.d.ts +5 -0
- package/dist/test-render-v2.d.ts.map +1 -0
- package/dist/test-render-v2.js +76 -0
- package/dist/test-render-v2.js.map +1 -0
- package/dist/test-render.d.ts +5 -0
- package/dist/test-render.d.ts.map +1 -0
- package/dist/test-render.js +76 -0
- package/dist/test-render.js.map +1 -0
- package/dist/vector-export.d.ts +52 -0
- package/dist/vector-export.d.ts.map +1 -0
- package/dist/vector-export.js +628 -0
- package/dist/vector-export.js.map +1 -0
- package/dist/web-viewer/build-client.d.ts +6 -0
- package/dist/web-viewer/build-client.d.ts.map +1 -0
- package/dist/web-viewer/build-client.js +36 -0
- package/dist/web-viewer/build-client.js.map +1 -0
- package/dist/web-viewer/client/viewer.d.ts +7 -0
- package/dist/web-viewer/client/viewer.d.ts.map +1 -0
- package/dist/web-viewer/client/viewer.js +873 -0
- package/dist/web-viewer/client/viewer.js.map +1 -0
- package/dist/web-viewer/server.d.ts +16 -0
- package/dist/web-viewer/server.d.ts.map +1 -0
- package/dist/web-viewer/server.js +420 -0
- package/dist/web-viewer/server.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KiwiParser - Parses canvas.fig binary using kiwi schema
|
|
3
|
+
*
|
|
4
|
+
* The canvas.fig file structure:
|
|
5
|
+
* - Header: "fig-kiwi" magic bytes (8 bytes)
|
|
6
|
+
* - Version: uint32 little-endian (4 bytes)
|
|
7
|
+
* - Schema chunk length: uint32 little-endian (4 bytes)
|
|
8
|
+
* - Schema chunk: deflate-compressed binary kiwi schema
|
|
9
|
+
* - Data chunk length: uint32 little-endian (4 bytes)
|
|
10
|
+
* - Data chunk: deflate-compressed document data encoded with the schema
|
|
11
|
+
*/
|
|
12
|
+
import * as kiwi from "kiwi-schema";
|
|
13
|
+
import { inflateRaw } from "pako";
|
|
14
|
+
import * as fzstd from "fzstd";
|
|
15
|
+
// ZSTD magic number
|
|
16
|
+
const ZSTD_MAGIC = 0xfd2fb528;
|
|
17
|
+
// Re-export ByteBuffer for external use
|
|
18
|
+
export const ByteBuffer = kiwi.ByteBuffer;
|
|
19
|
+
/**
|
|
20
|
+
* Decompress a buffer that might be deflate or zstd compressed
|
|
21
|
+
*/
|
|
22
|
+
function decompressChunk(data) {
|
|
23
|
+
// Check for ZSTD magic
|
|
24
|
+
const magic = readUint32LE(data, 0);
|
|
25
|
+
if (magic === ZSTD_MAGIC) {
|
|
26
|
+
return fzstd.decompress(data);
|
|
27
|
+
}
|
|
28
|
+
// Otherwise try deflate raw
|
|
29
|
+
return inflateRaw(data);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Read a little-endian uint32 from buffer
|
|
33
|
+
*/
|
|
34
|
+
function readUint32LE(data, offset) {
|
|
35
|
+
return (data[offset] |
|
|
36
|
+
(data[offset + 1] << 8) |
|
|
37
|
+
(data[offset + 2] << 16) |
|
|
38
|
+
(data[offset + 3] << 24)) >>> 0;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if buffer starts with "fig-kiwi" magic
|
|
42
|
+
*/
|
|
43
|
+
function hasFigKiwiMagic(data) {
|
|
44
|
+
const magic = "fig-kiwi";
|
|
45
|
+
for (let i = 0; i < magic.length; i++) {
|
|
46
|
+
if (data[i] !== magic.charCodeAt(i)) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Parse canvas.fig binary data
|
|
54
|
+
*/
|
|
55
|
+
export function parseCanvasFig(data) {
|
|
56
|
+
// Check magic bytes
|
|
57
|
+
if (!hasFigKiwiMagic(data)) {
|
|
58
|
+
throw new Error("Invalid canvas.fig: missing fig-kiwi magic header");
|
|
59
|
+
}
|
|
60
|
+
let offset = 8; // Skip magic
|
|
61
|
+
// Read version
|
|
62
|
+
const version = readUint32LE(data, offset);
|
|
63
|
+
offset += 4;
|
|
64
|
+
// Read schema chunk (compressed)
|
|
65
|
+
const schemaCompressedLength = readUint32LE(data, offset);
|
|
66
|
+
offset += 4;
|
|
67
|
+
const schemaCompressed = data.slice(offset, offset + schemaCompressedLength);
|
|
68
|
+
offset += schemaCompressedLength;
|
|
69
|
+
// Read data chunk (compressed)
|
|
70
|
+
const dataCompressedLength = readUint32LE(data, offset);
|
|
71
|
+
offset += 4;
|
|
72
|
+
const dataCompressed = data.slice(offset, offset + dataCompressedLength);
|
|
73
|
+
// Decompress both chunks (may be deflate or zstd)
|
|
74
|
+
const schemaBuffer = decompressChunk(schemaCompressed);
|
|
75
|
+
const dataBuffer = decompressChunk(dataCompressed);
|
|
76
|
+
// Decode the binary schema
|
|
77
|
+
const schema = kiwi.decodeBinarySchema(schemaBuffer);
|
|
78
|
+
// Compile the schema for decoding data
|
|
79
|
+
const compiledSchema = kiwi.compileSchema(schema);
|
|
80
|
+
// Find the root message type (usually "Message" or "Document")
|
|
81
|
+
const rootType = findRootMessageType(schema);
|
|
82
|
+
// Decode the data using the compiled schema
|
|
83
|
+
const decodeFn = compiledSchema[`decode${rootType}`];
|
|
84
|
+
if (typeof decodeFn !== "function") {
|
|
85
|
+
throw new Error(`Cannot find decoder for root type: ${rootType}`);
|
|
86
|
+
}
|
|
87
|
+
const message = decodeFn.call(compiledSchema, dataBuffer);
|
|
88
|
+
return {
|
|
89
|
+
version,
|
|
90
|
+
schema,
|
|
91
|
+
compiledSchema,
|
|
92
|
+
message,
|
|
93
|
+
rawSchemaBuffer: schemaBuffer,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Find the root message type in the schema
|
|
98
|
+
* The root type for .fig files is always "Message" which contains nodeChanges[]
|
|
99
|
+
*/
|
|
100
|
+
function findRootMessageType(schema) {
|
|
101
|
+
// Priority order - "Message" is the main container with nodeChanges
|
|
102
|
+
const possibleRoots = ["Message", "Document", "Fig", "Root"];
|
|
103
|
+
for (const rootName of possibleRoots) {
|
|
104
|
+
const def = schema.definitions.find(d => d.name === rootName);
|
|
105
|
+
if (def) {
|
|
106
|
+
return def.name;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// If no common root found, try the first MESSAGE type
|
|
110
|
+
for (const def of schema.definitions) {
|
|
111
|
+
if (def.kind === "MESSAGE") {
|
|
112
|
+
return def.name;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
throw new Error("Cannot find root message type in schema");
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Convert a raw parsed GUID to our GUID type
|
|
119
|
+
*/
|
|
120
|
+
export function parseGUID(raw) {
|
|
121
|
+
if (!raw || typeof raw !== "object")
|
|
122
|
+
return null;
|
|
123
|
+
const obj = raw;
|
|
124
|
+
return {
|
|
125
|
+
sessionID: typeof obj["sessionID"] === "number" ? obj["sessionID"] : 0,
|
|
126
|
+
localID: typeof obj["localID"] === "number" ? obj["localID"] : 0,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Format a GUID as a string for display
|
|
131
|
+
*/
|
|
132
|
+
export function formatGUID(guid) {
|
|
133
|
+
if (!guid)
|
|
134
|
+
return "null";
|
|
135
|
+
return `${guid.sessionID}:${guid.localID}`;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Map numeric node type to string type
|
|
139
|
+
*/
|
|
140
|
+
export function getNodeTypeName(typeValue) {
|
|
141
|
+
// Type values are typically stored as enum indices or strings
|
|
142
|
+
// This mapping may need adjustment based on actual schema
|
|
143
|
+
const typeMap = {
|
|
144
|
+
0: "DOCUMENT",
|
|
145
|
+
1: "CANVAS",
|
|
146
|
+
2: "FRAME",
|
|
147
|
+
3: "GROUP",
|
|
148
|
+
4: "VECTOR",
|
|
149
|
+
5: "BOOLEAN_OPERATION",
|
|
150
|
+
6: "STAR",
|
|
151
|
+
7: "LINE",
|
|
152
|
+
8: "ELLIPSE",
|
|
153
|
+
9: "REGULAR_POLYGON",
|
|
154
|
+
10: "RECTANGLE",
|
|
155
|
+
11: "TEXT",
|
|
156
|
+
12: "SLICE",
|
|
157
|
+
13: "COMPONENT",
|
|
158
|
+
14: "COMPONENT_SET",
|
|
159
|
+
15: "INSTANCE",
|
|
160
|
+
// String mappings
|
|
161
|
+
DOCUMENT: "DOCUMENT",
|
|
162
|
+
CANVAS: "CANVAS",
|
|
163
|
+
FRAME: "FRAME",
|
|
164
|
+
GROUP: "GROUP",
|
|
165
|
+
VECTOR: "VECTOR",
|
|
166
|
+
BOOLEAN_OPERATION: "BOOLEAN_OPERATION",
|
|
167
|
+
STAR: "STAR",
|
|
168
|
+
LINE: "LINE",
|
|
169
|
+
ELLIPSE: "ELLIPSE",
|
|
170
|
+
REGULAR_POLYGON: "REGULAR_POLYGON",
|
|
171
|
+
RECTANGLE: "RECTANGLE",
|
|
172
|
+
TEXT: "TEXT",
|
|
173
|
+
SLICE: "SLICE",
|
|
174
|
+
COMPONENT: "COMPONENT",
|
|
175
|
+
COMPONENT_SET: "COMPONENT_SET",
|
|
176
|
+
INSTANCE: "INSTANCE",
|
|
177
|
+
STICKY: "STICKY",
|
|
178
|
+
SHAPE_WITH_TEXT: "SHAPE_WITH_TEXT",
|
|
179
|
+
CONNECTOR: "CONNECTOR",
|
|
180
|
+
SECTION: "SECTION",
|
|
181
|
+
TABLE: "TABLE",
|
|
182
|
+
TABLE_CELL: "TABLE_CELL",
|
|
183
|
+
WIDGET: "WIDGET",
|
|
184
|
+
};
|
|
185
|
+
if (typeValue !== undefined && typeValue !== null) {
|
|
186
|
+
const mapped = typeMap[typeValue];
|
|
187
|
+
if (mapped)
|
|
188
|
+
return mapped;
|
|
189
|
+
}
|
|
190
|
+
return "FRAME"; // Default fallback
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Build a tree from the flat nodeChanges array using parentIndex references
|
|
194
|
+
*/
|
|
195
|
+
function buildTreeFromNodeChanges(nodeChanges) {
|
|
196
|
+
// Create a map of guid -> node
|
|
197
|
+
const nodeMap = new Map();
|
|
198
|
+
const childrenMap = new Map();
|
|
199
|
+
let documentNode = null;
|
|
200
|
+
// First pass: convert all nodes and build the map
|
|
201
|
+
for (const change of nodeChanges) {
|
|
202
|
+
if (!change || typeof change !== "object")
|
|
203
|
+
continue;
|
|
204
|
+
const changeObj = change;
|
|
205
|
+
const node = convertToFigNode(change);
|
|
206
|
+
if (!node)
|
|
207
|
+
continue;
|
|
208
|
+
// Add children array
|
|
209
|
+
const nodeWithChildren = node;
|
|
210
|
+
nodeWithChildren.children = [];
|
|
211
|
+
const guidKey = formatGUID(node.guid);
|
|
212
|
+
nodeMap.set(guidKey, nodeWithChildren);
|
|
213
|
+
// Track the document node
|
|
214
|
+
if (changeObj["type"] === "DOCUMENT") {
|
|
215
|
+
documentNode = nodeWithChildren;
|
|
216
|
+
}
|
|
217
|
+
// Track parent-child relationships
|
|
218
|
+
const parentIndex = changeObj["parentIndex"];
|
|
219
|
+
if (parentIndex && parentIndex["guid"]) {
|
|
220
|
+
const parentGuid = parseGUID(parentIndex["guid"]);
|
|
221
|
+
if (parentGuid) {
|
|
222
|
+
const parentKey = formatGUID(parentGuid);
|
|
223
|
+
if (!childrenMap.has(parentKey)) {
|
|
224
|
+
childrenMap.set(parentKey, []);
|
|
225
|
+
}
|
|
226
|
+
childrenMap.get(parentKey).push(nodeWithChildren);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Second pass: connect children to parents
|
|
231
|
+
for (const [parentKey, children] of childrenMap) {
|
|
232
|
+
const parent = nodeMap.get(parentKey);
|
|
233
|
+
if (parent) {
|
|
234
|
+
parent.children = children;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return documentNode;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Extract document tree from parsed message
|
|
241
|
+
* This handles the specific structure of the kiwi format used in .fig files
|
|
242
|
+
*/
|
|
243
|
+
export function extractDocumentTree(message) {
|
|
244
|
+
// Try direct document property (unlikely in .fig files)
|
|
245
|
+
if (message["document"]) {
|
|
246
|
+
return convertToFigNode(message["document"]);
|
|
247
|
+
}
|
|
248
|
+
// Try root property
|
|
249
|
+
if (message["root"]) {
|
|
250
|
+
return convertToFigNode(message["root"]);
|
|
251
|
+
}
|
|
252
|
+
// Try nodeChanges array (the standard format for .fig files)
|
|
253
|
+
// NodeChanges is a flat array - we need to rebuild the tree using parentIndex
|
|
254
|
+
const nodeChanges = message["nodeChanges"];
|
|
255
|
+
if (Array.isArray(nodeChanges) && nodeChanges.length > 0) {
|
|
256
|
+
return buildTreeFromNodeChanges(nodeChanges);
|
|
257
|
+
}
|
|
258
|
+
// Try to find nodes array
|
|
259
|
+
const nodes = message["nodes"];
|
|
260
|
+
if (Array.isArray(nodes) && nodes.length > 0) {
|
|
261
|
+
return buildTreeFromNodeChanges(nodes);
|
|
262
|
+
}
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
function inferFontWeight(styleName) {
|
|
266
|
+
const name = styleName.toLowerCase();
|
|
267
|
+
if (name.includes("thin"))
|
|
268
|
+
return 100;
|
|
269
|
+
if (name.includes("extra light") || name.includes("ultra light"))
|
|
270
|
+
return 200;
|
|
271
|
+
if (name.includes("light"))
|
|
272
|
+
return 300;
|
|
273
|
+
if (name.includes("regular") || name.includes("normal") || name.includes("book"))
|
|
274
|
+
return 400;
|
|
275
|
+
if (name.includes("medium"))
|
|
276
|
+
return 500;
|
|
277
|
+
if (name.includes("semi bold") || name.includes("semibold") || name.includes("demi"))
|
|
278
|
+
return 600;
|
|
279
|
+
if (name.includes("bold"))
|
|
280
|
+
return 700;
|
|
281
|
+
if (name.includes("extra bold") || name.includes("extrabold") || name.includes("heavy"))
|
|
282
|
+
return 800;
|
|
283
|
+
if (name.includes("black") || name.includes("ultra black"))
|
|
284
|
+
return 900;
|
|
285
|
+
return 400;
|
|
286
|
+
}
|
|
287
|
+
function inferFontStyle(styleName) {
|
|
288
|
+
const name = styleName.toLowerCase();
|
|
289
|
+
if (name.includes("italic"))
|
|
290
|
+
return "italic";
|
|
291
|
+
if (name.includes("oblique"))
|
|
292
|
+
return "oblique";
|
|
293
|
+
return "normal";
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Convert a raw parsed node to our FigNode type
|
|
297
|
+
*/
|
|
298
|
+
function convertToFigNode(raw) {
|
|
299
|
+
if (!raw || typeof raw !== "object")
|
|
300
|
+
return null;
|
|
301
|
+
const obj = raw;
|
|
302
|
+
const node = {
|
|
303
|
+
guid: parseGUID(obj["guid"] || obj["id"]) || { sessionID: 0, localID: 0 },
|
|
304
|
+
type: getNodeTypeName(obj["type"]),
|
|
305
|
+
name: String(obj["name"] || "Unnamed"),
|
|
306
|
+
visible: obj["visible"] !== false,
|
|
307
|
+
};
|
|
308
|
+
// Copy over additional properties
|
|
309
|
+
const propsToKeep = [
|
|
310
|
+
"x", "y", "width", "height", "rotation", "transform",
|
|
311
|
+
"opacity", "blendMode",
|
|
312
|
+
"fills", "strokes", "strokeWeight",
|
|
313
|
+
"strokeAlign", "strokeCap", "strokeJoin", "strokeDashes", "strokeWeights",
|
|
314
|
+
"cornerRadius", "effects",
|
|
315
|
+
"constraints", "layoutMode",
|
|
316
|
+
"characters", "style",
|
|
317
|
+
"backgroundColor",
|
|
318
|
+
"clipsContent", "isMask",
|
|
319
|
+
"fillGeometry", "strokeGeometry", "vectorData",
|
|
320
|
+
];
|
|
321
|
+
// Use an indexable type for property assignment
|
|
322
|
+
const nodeRecord = node;
|
|
323
|
+
const fillPaints = obj["fills"] ?? obj["fillPaints"];
|
|
324
|
+
if (fillPaints !== undefined) {
|
|
325
|
+
nodeRecord["fills"] = fillPaints;
|
|
326
|
+
}
|
|
327
|
+
const strokePaints = obj["strokes"] ?? obj["strokePaints"];
|
|
328
|
+
if (strokePaints !== undefined) {
|
|
329
|
+
nodeRecord["strokes"] = strokePaints;
|
|
330
|
+
}
|
|
331
|
+
for (const prop of propsToKeep) {
|
|
332
|
+
if (obj[prop] !== undefined) {
|
|
333
|
+
nodeRecord[prop] = obj[prop];
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
const textData = obj["textData"];
|
|
337
|
+
if (nodeRecord["characters"] === undefined && textData?.["characters"]) {
|
|
338
|
+
nodeRecord["characters"] = textData["characters"];
|
|
339
|
+
}
|
|
340
|
+
// Preserve derivedTextData for text wrapping
|
|
341
|
+
const derivedTextData = obj["derivedTextData"];
|
|
342
|
+
if (derivedTextData) {
|
|
343
|
+
const layoutSize = derivedTextData["layoutSize"];
|
|
344
|
+
const baselines = derivedTextData["baselines"];
|
|
345
|
+
if (layoutSize && baselines) {
|
|
346
|
+
nodeRecord["derivedTextData"] = {
|
|
347
|
+
layoutSize: {
|
|
348
|
+
x: typeof layoutSize["x"] === "number" ? layoutSize["x"] : 0,
|
|
349
|
+
y: typeof layoutSize["y"] === "number" ? layoutSize["y"] : 0,
|
|
350
|
+
},
|
|
351
|
+
baselines: baselines.map(baseline => {
|
|
352
|
+
const pos = baseline["position"];
|
|
353
|
+
return {
|
|
354
|
+
position: {
|
|
355
|
+
x: typeof pos?.["x"] === "number" ? pos["x"] : 0,
|
|
356
|
+
y: typeof pos?.["y"] === "number" ? pos["y"] : 0,
|
|
357
|
+
},
|
|
358
|
+
width: typeof baseline["width"] === "number" ? baseline["width"] : 0,
|
|
359
|
+
lineY: typeof baseline["lineY"] === "number" ? baseline["lineY"] : 0,
|
|
360
|
+
lineHeight: typeof baseline["lineHeight"] === "number" ? baseline["lineHeight"] : 0,
|
|
361
|
+
lineAscent: typeof baseline["lineAscent"] === "number" ? baseline["lineAscent"] : 0,
|
|
362
|
+
firstCharacter: typeof baseline["firstCharacter"] === "number" ? baseline["firstCharacter"] : 0,
|
|
363
|
+
endCharacter: typeof baseline["endCharacter"] === "number" ? baseline["endCharacter"] : 0,
|
|
364
|
+
};
|
|
365
|
+
}),
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
if (nodeRecord["style"] === undefined) {
|
|
370
|
+
const fontName = obj["fontName"];
|
|
371
|
+
const fontSize = typeof obj["fontSize"] === "number" ? obj["fontSize"] : undefined;
|
|
372
|
+
const textAlignHorizontal = typeof obj["textAlignHorizontal"] === "string"
|
|
373
|
+
? obj["textAlignHorizontal"]
|
|
374
|
+
: "LEFT";
|
|
375
|
+
const textAlignVertical = typeof obj["textAlignVertical"] === "string"
|
|
376
|
+
? obj["textAlignVertical"]
|
|
377
|
+
: "TOP";
|
|
378
|
+
const letterSpacing = obj["letterSpacing"];
|
|
379
|
+
const lineHeight = obj["lineHeight"];
|
|
380
|
+
const fontStyleName = typeof fontName?.["style"] === "string" ? fontName["style"] : "";
|
|
381
|
+
const fontWeightValue = typeof obj["fontWeight"] === "number" ? obj["fontWeight"] : inferFontWeight(fontStyleName);
|
|
382
|
+
const fontStyleValue = inferFontStyle(fontStyleName);
|
|
383
|
+
if (fontName || fontSize || letterSpacing || lineHeight) {
|
|
384
|
+
nodeRecord["style"] = {
|
|
385
|
+
fontFamily: typeof fontName?.["family"] === "string" ? fontName["family"] : "Inter",
|
|
386
|
+
fontPostScriptName: typeof fontName?.["postscript"] === "string" ? fontName["postscript"] : undefined,
|
|
387
|
+
fontStyle: fontStyleValue,
|
|
388
|
+
fontWeight: fontWeightValue,
|
|
389
|
+
fontSize: fontSize ?? 14,
|
|
390
|
+
textAlignHorizontal,
|
|
391
|
+
textAlignVertical,
|
|
392
|
+
letterSpacing: typeof letterSpacing?.["value"] === "number" ? letterSpacing["value"] : 0,
|
|
393
|
+
lineHeightPx: lineHeight?.["units"] === "PIXELS" && typeof lineHeight?.["value"] === "number"
|
|
394
|
+
? lineHeight["value"]
|
|
395
|
+
: undefined,
|
|
396
|
+
lineHeightPercent: lineHeight?.["units"] === "PERCENT" && typeof lineHeight?.["value"] === "number"
|
|
397
|
+
? lineHeight["value"]
|
|
398
|
+
: undefined,
|
|
399
|
+
lineHeightUnit: lineHeight?.["units"] === "PERCENT"
|
|
400
|
+
? "FONT_SIZE_%"
|
|
401
|
+
: lineHeight?.["units"] === "PIXELS"
|
|
402
|
+
? "PIXELS"
|
|
403
|
+
: "INTRINSIC_%",
|
|
404
|
+
textCase: typeof obj["textCase"] === "string" ? obj["textCase"] : undefined,
|
|
405
|
+
textDecoration: typeof obj["textDecoration"] === "string"
|
|
406
|
+
? obj["textDecoration"]
|
|
407
|
+
: undefined,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
const bounds = obj["absoluteBoundingBox"] ??
|
|
412
|
+
obj["absoluteRenderBounds"] ??
|
|
413
|
+
obj["bounds"];
|
|
414
|
+
if (bounds) {
|
|
415
|
+
if (nodeRecord["x"] === undefined && typeof bounds["x"] === "number") {
|
|
416
|
+
nodeRecord["x"] = bounds["x"];
|
|
417
|
+
}
|
|
418
|
+
if (nodeRecord["y"] === undefined && typeof bounds["y"] === "number") {
|
|
419
|
+
nodeRecord["y"] = bounds["y"];
|
|
420
|
+
}
|
|
421
|
+
if (nodeRecord["width"] === undefined && typeof bounds["width"] === "number") {
|
|
422
|
+
nodeRecord["width"] = bounds["width"];
|
|
423
|
+
}
|
|
424
|
+
if (nodeRecord["height"] === undefined && typeof bounds["height"] === "number") {
|
|
425
|
+
nodeRecord["height"] = bounds["height"];
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
const size = obj["size"];
|
|
429
|
+
if (size && typeof size["x"] === "number" && typeof size["y"] === "number") {
|
|
430
|
+
// Preserve original size field for vector scaling
|
|
431
|
+
nodeRecord["size"] = { x: size["x"], y: size["y"] };
|
|
432
|
+
if (nodeRecord["width"] === undefined) {
|
|
433
|
+
nodeRecord["width"] = size["x"];
|
|
434
|
+
}
|
|
435
|
+
if (nodeRecord["height"] === undefined) {
|
|
436
|
+
nodeRecord["height"] = size["y"];
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
const transform = obj["transform"];
|
|
440
|
+
if (transform) {
|
|
441
|
+
if (nodeRecord["x"] === undefined && typeof transform["m02"] === "number") {
|
|
442
|
+
nodeRecord["x"] = transform["m02"];
|
|
443
|
+
}
|
|
444
|
+
if (nodeRecord["y"] === undefined && typeof transform["m12"] === "number") {
|
|
445
|
+
nodeRecord["y"] = transform["m12"];
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
// Handle children
|
|
449
|
+
const children = obj["children"];
|
|
450
|
+
if (Array.isArray(children)) {
|
|
451
|
+
nodeRecord["children"] = children
|
|
452
|
+
.map(convertToFigNode)
|
|
453
|
+
.filter((n) => n !== null);
|
|
454
|
+
}
|
|
455
|
+
return node;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Convert image hash bytes object to hex string filename
|
|
459
|
+
* Images in .fig files are referenced by SHA-1 hash (20 bytes)
|
|
460
|
+
* The hash is stored as an object: {"0": byte, "1": byte, ..., "19": byte}
|
|
461
|
+
* The filename in images/ folder is the hex representation of these bytes
|
|
462
|
+
*/
|
|
463
|
+
export function hashBytesToHex(hashObj) {
|
|
464
|
+
const bytes = [];
|
|
465
|
+
for (let i = 0; i < 20; i++) {
|
|
466
|
+
const byte = hashObj[String(i)];
|
|
467
|
+
if (byte !== undefined) {
|
|
468
|
+
bytes.push(byte);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return bytes.map(b => b.toString(16).padStart(2, "0")).join("");
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Get schema information for debugging/inspection
|
|
475
|
+
*/
|
|
476
|
+
export function getSchemaInfo(schema) {
|
|
477
|
+
return {
|
|
478
|
+
definitionCount: schema.definitions.length,
|
|
479
|
+
definitions: schema.definitions.map((def) => ({
|
|
480
|
+
name: def.name,
|
|
481
|
+
kind: def.kind,
|
|
482
|
+
fieldCount: def.fields.length,
|
|
483
|
+
fields: def.fields.map((f) => ({
|
|
484
|
+
name: f.name,
|
|
485
|
+
type: f.type,
|
|
486
|
+
isArray: f.isArray,
|
|
487
|
+
})),
|
|
488
|
+
})),
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
//# sourceMappingURL=kiwi-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kiwi-parser.js","sourceRoot":"","sources":["../../src/parser/kiwi-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout Inference - Convert raw node data to structured layout information
|
|
3
|
+
*
|
|
4
|
+
* This module analyzes nodes and infers:
|
|
5
|
+
* - Spacing patterns (gaps, padding, margins)
|
|
6
|
+
* - Alignment (horizontal/vertical)
|
|
7
|
+
* - Layout direction (row/column)
|
|
8
|
+
* - Sizing modes (fixed/hug/fill)
|
|
9
|
+
*/
|
|
10
|
+
import type { FigNode, SceneNode, InferredLayout, SimplifiedNode, Rect, Color, Paint, Effect } from "./types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Convert RGBA color to CSS string
|
|
13
|
+
*/
|
|
14
|
+
export declare function colorToCSS(color: Color | undefined): string | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Extract primary fill color from paints array
|
|
17
|
+
*/
|
|
18
|
+
export declare function getPrimaryFillColor(fills: Paint[] | undefined): string | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Extract primary stroke color from paints array
|
|
21
|
+
*/
|
|
22
|
+
export declare function getPrimaryStrokeColor(strokes: Paint[] | undefined): string | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Convert effect to CSS-like description
|
|
25
|
+
*/
|
|
26
|
+
export declare function effectToDescription(effect: Effect): string;
|
|
27
|
+
/**
|
|
28
|
+
* Get bounds of a node
|
|
29
|
+
*/
|
|
30
|
+
export declare function getNodeBounds(node: SceneNode): Rect | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Infer layout from auto-layout properties
|
|
33
|
+
*/
|
|
34
|
+
export declare function inferLayoutFromAutoLayout(node: SceneNode): InferredLayout | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Infer layout from child positions (for non-auto-layout frames)
|
|
37
|
+
*/
|
|
38
|
+
export declare function inferLayoutFromChildren(children: SceneNode[]): InferredLayout | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Simplify a node for MCP output
|
|
41
|
+
*/
|
|
42
|
+
export declare function simplifyNode(node: FigNode, depth?: number, maxDepth?: number, options?: {
|
|
43
|
+
includeStyles?: boolean;
|
|
44
|
+
includeLayout?: boolean;
|
|
45
|
+
includeEffects?: boolean;
|
|
46
|
+
}): SimplifiedNode | null;
|
|
47
|
+
/**
|
|
48
|
+
* Get a summary of the document structure
|
|
49
|
+
*/
|
|
50
|
+
export declare function getDocumentSummary(node: FigNode): string;
|
|
51
|
+
/**
|
|
52
|
+
* Find nodes by type
|
|
53
|
+
*/
|
|
54
|
+
export declare function findNodesByType(node: FigNode, type: string): FigNode[];
|
|
55
|
+
/**
|
|
56
|
+
* Find node by name (partial match)
|
|
57
|
+
*/
|
|
58
|
+
export declare function findNodesByName(node: FigNode, name: string): FigNode[];
|
|
59
|
+
/**
|
|
60
|
+
* Count nodes by type
|
|
61
|
+
*/
|
|
62
|
+
export declare function countNodesByType(node: FigNode): Record<string, number>;
|
|
63
|
+
//# sourceMappingURL=layout-inference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-inference.d.ts","sourceRoot":"","sources":["../../src/parser/layout-inference.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EAEd,IAAI,EACJ,KAAK,EACL,KAAK,EACL,MAAM,EAEP,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAWlF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAStF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAe/D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAyFrF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,cAAc,GAAG,SAAS,CA+DzF;AAiBD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,KAAK,SAAI,EACT,QAAQ,SAAK,EACb,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CACrB,GACL,cAAc,GAAG,IAAI,CA+GvB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAoBxD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAgBtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAiBtE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CActE"}
|