From 7da08789cdecdac377d6263595e8ccd260251392 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Sun, 17 May 2026 16:30:35 +0300 Subject: [PATCH] refactor(figma-api): type creation methods against plugin typings --- packages/core/src/figma-api/compatibility.ts | 15 ++++- packages/core/src/figma-api/index.ts | 64 ++++++++++++++------ packages/core/src/figma-api/node-types.ts | 14 +++++ packages/core/src/tools/create/vector.ts | 20 +++--- 4 files changed, 83 insertions(+), 30 deletions(-) create mode 100644 packages/core/src/figma-api/node-types.ts diff --git a/packages/core/src/figma-api/compatibility.ts b/packages/core/src/figma-api/compatibility.ts index bb88b3b13..9b41b559c 100644 --- a/packages/core/src/figma-api/compatibility.ts +++ b/packages/core/src/figma-api/compatibility.ts @@ -8,7 +8,20 @@ type IsAssignable = Actual extends Expected ? true : false export type SupportedPluginAPI = Pick< PluginAPI, - 'base64Decode' | 'base64Encode' | 'loadFontAsync' | 'notify' + | 'base64Decode' + | 'base64Encode' + | 'loadFontAsync' + | 'notify' + | 'createComponent' + | 'createEllipse' + | 'createFrame' + | 'createLine' + | 'createPolygon' + | 'createRectangle' + | 'createSection' + | 'createStar' + | 'createText' + | 'createVector' > export type FigmaAPICompatibility = Expect> diff --git a/packages/core/src/figma-api/index.ts b/packages/core/src/figma-api/index.ts index 0875756d2..2a84c43ad 100644 --- a/packages/core/src/figma-api/index.ts +++ b/packages/core/src/figma-api/index.ts @@ -12,6 +12,18 @@ import type { import { copyFills, copyStrokes, copyEffects } from '#core/scene-graph/copy' import type { Rect, Vector } from '#core/types' +import type { + FigmaComponentNode, + FigmaEllipseNode, + FigmaFrameNode, + FigmaLineNode, + FigmaPolygonNode, + FigmaRectangleNode, + FigmaSectionNode, + FigmaStarNode, + FigmaTextNode, + FigmaVectorNode +} from './node-types' import { FigmaNodeProxy, INTERNAL_ID, @@ -24,6 +36,18 @@ import { const noop = () => undefined export { FigmaNodeProxy } from './proxy' +export type { + FigmaComponentNode, + FigmaEllipseNode, + FigmaFrameNode, + FigmaLineNode, + FigmaPolygonNode, + FigmaRectangleNode, + FigmaSectionNode, + FigmaStarNode, + FigmaTextNode, + FigmaVectorNode +} from './node-types' export type { FigmaFont, FigmaFontName } from './proxy' export function computeImageHash(data: Uint8Array): string { @@ -131,44 +155,44 @@ export class FigmaAPI implements NodeProxyHost { return this.wrapNode(node.id) } - createFrame(): FigmaNodeProxy { - return this._createNode('FRAME') + createFrame(): FigmaFrameNode { + return this._createNode('FRAME') as FigmaFrameNode } - createRectangle(): FigmaNodeProxy { - return this._createNode('RECTANGLE') + createRectangle(): FigmaRectangleNode { + return this._createNode('RECTANGLE') as FigmaRectangleNode } - createEllipse(): FigmaNodeProxy { - return this._createNode('ELLIPSE') + createEllipse(): FigmaEllipseNode { + return this._createNode('ELLIPSE') as FigmaEllipseNode } - createText(): FigmaNodeProxy { - return this._createNode('TEXT') + createText(): FigmaTextNode { + return this._createNode('TEXT') as FigmaTextNode } - createLine(): FigmaNodeProxy { - return this._createNode('LINE') + createLine(): FigmaLineNode { + return this._createNode('LINE') as FigmaLineNode } - createPolygon(): FigmaNodeProxy { - return this._createNode('POLYGON') + createPolygon(): FigmaPolygonNode { + return this._createNode('POLYGON') as FigmaPolygonNode } - createStar(): FigmaNodeProxy { - return this._createNode('STAR') + createStar(): FigmaStarNode { + return this._createNode('STAR') as FigmaStarNode } - createVector(): FigmaNodeProxy { - return this._createNode('VECTOR') + createVector(): FigmaVectorNode { + return this._createNode('VECTOR') as FigmaVectorNode } - createComponent(): FigmaNodeProxy { - return this._createNode('COMPONENT') + createComponent(): FigmaComponentNode { + return this._createNode('COMPONENT') as FigmaComponentNode } - createSection(): FigmaNodeProxy { - return this._createNode('SECTION') + createSection(): FigmaSectionNode { + return this._createNode('SECTION') as FigmaSectionNode } createPage(): FigmaNodeProxy { diff --git a/packages/core/src/figma-api/node-types.ts b/packages/core/src/figma-api/node-types.ts new file mode 100644 index 000000000..893396ee6 --- /dev/null +++ b/packages/core/src/figma-api/node-types.ts @@ -0,0 +1,14 @@ +/// + +import type { FigmaNodeProxy } from './proxy' + +export type FigmaRectangleNode = FigmaNodeProxy & RectangleNode +export type FigmaFrameNode = FigmaNodeProxy & FrameNode +export type FigmaTextNode = FigmaNodeProxy & TextNode +export type FigmaEllipseNode = FigmaNodeProxy & EllipseNode +export type FigmaLineNode = FigmaNodeProxy & LineNode +export type FigmaVectorNode = FigmaNodeProxy & VectorNode +export type FigmaPolygonNode = FigmaNodeProxy & PolygonNode +export type FigmaStarNode = FigmaNodeProxy & StarNode +export type FigmaComponentNode = FigmaNodeProxy & ComponentNode +export type FigmaSectionNode = FigmaNodeProxy & SectionNode diff --git a/packages/core/src/tools/create/vector.ts b/packages/core/src/tools/create/vector.ts index 318d1169c..ea3de0265 100644 --- a/packages/core/src/tools/create/vector.ts +++ b/packages/core/src/tools/create/vector.ts @@ -37,15 +37,17 @@ export const createVector = defineTool({ node.fills = [{ type: 'SOLID', color: parseColor(args.fill), opacity: 1, visible: true }] } if (args.stroke) { - node.strokes = [ - { - color: parseColor(args.stroke), - weight: args.stroke_weight ?? 1, - opacity: 1, - visible: true, - align: 'CENTER' - } - ] + figma.graph.updateNode(node.id, { + strokes: [ + { + color: parseColor(args.stroke), + weight: args.stroke_weight ?? 1, + opacity: 1, + visible: true, + align: 'CENTER' + } + ] + }) } if (args.parent_id) { const parent = figma.getNodeById(args.parent_id)