@mstrathman/figma 0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/client.ts","../src/internal/config/config.ts","../src/internal/auth/keyring.ts","../src/internal/auth/oauth.ts","../src/pkg/cmdutil/factory.ts","../src/pkg/iostreams/iostreams.ts","../src/cmd/root.ts","../src/cmd/auth/index.ts","../src/cmd/auth/login.ts","../src/cmd/auth/logout.ts","../src/cmd/auth/status.ts","../src/cmd/file/index.ts","../src/cmd/file/get.ts","../src/pkg/output/formatter.ts","../src/cmd/file/nodes.ts","../src/cmd/file/images.ts","../src/internal/download/index.ts","../src/cmd/project/index.ts","../src/cmd/project/list.ts","../src/cmd/project/files.ts","../src/cmd/component/index.ts","../src/cmd/component/list.ts","../src/cmd/component/get.ts","../src/cmd/style/index.ts","../src/cmd/style/list.ts","../src/cmd/style/get.ts","../src/cmd/variable/index.ts","../src/cmd/variable/list.ts","../src/cmd/variable/export.ts","../src/cmd/export/index.ts","../src/cmd/export/tokens.ts","../src/internal/transform/tokens.ts","../src/cmd/export/icons.ts","../src/cmd/export/theme.ts","../src/cmd/api/index.ts","../src/main.ts"],"sourcesContent":["import type * as Figma from \"@figma/rest-api-spec\";\n\nconst FIGMA_API_BASE = \"https://api.figma.com/v1\";\nconst DEFAULT_TIMEOUT_MS = 30000; // 30 seconds\nconst MAX_RETRIES = 3;\nconst INITIAL_RETRY_DELAY_MS = 1000;\n\nexport interface FigmaClientOptions {\n token: string;\n baseUrl?: string;\n timeout?: number;\n maxRetries?: number;\n}\n\nexport class FigmaApiError extends Error {\n constructor(\n public status: number,\n public statusText: string,\n public body?: unknown\n ) {\n super(`Figma API error: ${status} ${statusText}`);\n this.name = \"FigmaApiError\";\n }\n\n isRateLimited(): boolean {\n return this.status === 429;\n }\n\n isServerError(): boolean {\n return this.status >= 500;\n }\n}\n\nexport class FigmaNetworkError extends Error {\n constructor(\n message: string,\n public cause?: Error\n ) {\n super(message);\n this.name = \"FigmaNetworkError\";\n }\n}\n\nexport class FigmaClient {\n private token: string;\n private baseUrl: string;\n private timeout: number;\n private maxRetries: number;\n\n constructor(options: FigmaClientOptions) {\n if (!options.token || options.token.trim() === \"\") {\n throw new Error(\"Figma API token is required\");\n }\n this.token = options.token;\n this.baseUrl = options.baseUrl ?? FIGMA_API_BASE;\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = options.maxRetries ?? MAX_RETRIES;\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: {\n params?: Record<string, string | number | boolean | string[] | undefined>;\n body?: unknown;\n } = {},\n retryCount = 0\n ): Promise<T> {\n // Properly join base URL and path (avoid URL constructor's absolute path behavior)\n const baseWithSlash = this.baseUrl.endsWith(\"/\")\n ? this.baseUrl\n : `${this.baseUrl}/`;\n const pathWithoutLeadingSlash = path.startsWith(\"/\") ? path.slice(1) : path;\n const url = new URL(pathWithoutLeadingSlash, baseWithSlash);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n // Filter out empty strings from arrays\n const filtered = value.filter((v) => v !== \"\");\n if (filtered.length > 0) {\n url.searchParams.set(key, filtered.join(\",\"));\n }\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n }\n }\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method,\n headers: {\n \"X-Figma-Token\": this.token,\n \"Content-Type\": \"application/json\",\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Handle abort (timeout)\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new FigmaNetworkError(\n `Request timed out after ${this.timeout}ms`,\n error\n );\n }\n\n // Handle other network errors\n throw new FigmaNetworkError(\n `Network error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error instanceof Error ? error : undefined\n );\n } finally {\n clearTimeout(timeoutId);\n }\n\n // Handle rate limiting with exponential backoff\n if (response.status === 429 && retryCount < this.maxRetries) {\n const retryAfter = response.headers.get(\"Retry-After\");\n const delayMs = retryAfter\n ? parseInt(retryAfter, 10) * 1000\n : INITIAL_RETRY_DELAY_MS * Math.pow(2, retryCount);\n\n await this.sleep(delayMs);\n return this.request<T>(method, path, options, retryCount + 1);\n }\n\n // Retry on server errors (5xx)\n if (response.status >= 500 && retryCount < this.maxRetries) {\n const delayMs = INITIAL_RETRY_DELAY_MS * Math.pow(2, retryCount);\n await this.sleep(delayMs);\n return this.request<T>(method, path, options, retryCount + 1);\n }\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n try {\n body = await response.text();\n } catch {\n body = null;\n }\n }\n throw new FigmaApiError(response.status, response.statusText, body);\n }\n\n return response.json() as Promise<T>;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n // User endpoints\n async getMe(): Promise<Figma.GetMeResponse> {\n return this.request<Figma.GetMeResponse>(\"GET\", \"/me\");\n }\n\n // File endpoints\n async getFile(\n fileKey: string,\n options?: {\n version?: string;\n ids?: string[];\n depth?: number;\n geometry?: string;\n plugin_data?: string;\n branch_data?: boolean;\n }\n ): Promise<Figma.GetFileResponse> {\n return this.request<Figma.GetFileResponse>(\"GET\", `/files/${fileKey}`, {\n params: options,\n });\n }\n\n async getFileNodes(\n fileKey: string,\n nodeIds: string[],\n options?: {\n version?: string;\n depth?: number;\n geometry?: string;\n plugin_data?: string;\n }\n ): Promise<Figma.GetFileNodesResponse> {\n return this.request<Figma.GetFileNodesResponse>(\n \"GET\",\n `/files/${fileKey}/nodes`,\n {\n params: {\n ids: nodeIds,\n ...options,\n },\n }\n );\n }\n\n async getImages(\n fileKey: string,\n nodeIds: string[],\n options?: {\n scale?: number;\n format?: \"jpg\" | \"png\" | \"svg\" | \"pdf\";\n svg_include_id?: boolean;\n svg_include_node_id?: boolean;\n svg_simplify_stroke?: boolean;\n contents_only?: boolean;\n use_absolute_bounds?: boolean;\n }\n ): Promise<Figma.GetImagesResponse> {\n return this.request<Figma.GetImagesResponse>(\"GET\", `/images/${fileKey}`, {\n params: {\n ids: nodeIds,\n ...options,\n },\n });\n }\n\n async getImageFills(fileKey: string): Promise<Figma.GetImageFillsResponse> {\n return this.request<Figma.GetImageFillsResponse>(\n \"GET\",\n `/files/${fileKey}/images`\n );\n }\n\n // Project endpoints\n async getTeamProjects(\n teamId: string\n ): Promise<Figma.GetTeamProjectsResponse> {\n return this.request<Figma.GetTeamProjectsResponse>(\n \"GET\",\n `/teams/${teamId}/projects`\n );\n }\n\n async getProjectFiles(\n projectId: string,\n options?: {\n branch_data?: boolean;\n }\n ): Promise<Figma.GetProjectFilesResponse> {\n return this.request<Figma.GetProjectFilesResponse>(\n \"GET\",\n `/projects/${projectId}/files`,\n { params: options }\n );\n }\n\n // Component endpoints\n async getTeamComponents(\n teamId: string,\n options?: {\n page_size?: number;\n after?: number;\n }\n ): Promise<Figma.GetTeamComponentsResponse> {\n return this.request<Figma.GetTeamComponentsResponse>(\n \"GET\",\n `/teams/${teamId}/components`,\n { params: options }\n );\n }\n\n async getFileComponents(\n fileKey: string\n ): Promise<Figma.GetFileComponentsResponse> {\n return this.request<Figma.GetFileComponentsResponse>(\n \"GET\",\n `/files/${fileKey}/components`\n );\n }\n\n async getComponent(\n componentKey: string\n ): Promise<Figma.GetComponentResponse> {\n return this.request<Figma.GetComponentResponse>(\n \"GET\",\n `/components/${componentKey}`\n );\n }\n\n async getTeamComponentSets(\n teamId: string,\n options?: {\n page_size?: number;\n after?: number;\n }\n ): Promise<Figma.GetTeamComponentSetsResponse> {\n return this.request<Figma.GetTeamComponentSetsResponse>(\n \"GET\",\n `/teams/${teamId}/component_sets`,\n { params: options }\n );\n }\n\n async getFileComponentSets(\n fileKey: string\n ): Promise<Figma.GetFileComponentSetsResponse> {\n return this.request<Figma.GetFileComponentSetsResponse>(\n \"GET\",\n `/files/${fileKey}/component_sets`\n );\n }\n\n // Style endpoints\n async getTeamStyles(\n teamId: string,\n options?: {\n page_size?: number;\n after?: number;\n }\n ): Promise<Figma.GetTeamStylesResponse> {\n return this.request<Figma.GetTeamStylesResponse>(\n \"GET\",\n `/teams/${teamId}/styles`,\n { params: options }\n );\n }\n\n async getFileStyles(fileKey: string): Promise<Figma.GetFileStylesResponse> {\n return this.request<Figma.GetFileStylesResponse>(\n \"GET\",\n `/files/${fileKey}/styles`\n );\n }\n\n async getStyle(styleKey: string): Promise<Figma.GetStyleResponse> {\n return this.request<Figma.GetStyleResponse>(\"GET\", `/styles/${styleKey}`);\n }\n\n // Variable endpoints (Enterprise)\n async getLocalVariables(\n fileKey: string\n ): Promise<Figma.GetLocalVariablesResponse> {\n return this.request<Figma.GetLocalVariablesResponse>(\n \"GET\",\n `/files/${fileKey}/variables/local`\n );\n }\n\n async getPublishedVariables(\n fileKey: string\n ): Promise<Figma.GetPublishedVariablesResponse> {\n return this.request<Figma.GetPublishedVariablesResponse>(\n \"GET\",\n `/files/${fileKey}/variables/published`\n );\n }\n\n // Comments endpoints\n async getComments(fileKey: string): Promise<Figma.GetCommentsResponse> {\n return this.request<Figma.GetCommentsResponse>(\n \"GET\",\n `/files/${fileKey}/comments`\n );\n }\n\n async postComment(\n fileKey: string,\n message: string,\n options?: {\n client_meta?: Figma.Vector | Figma.FrameOffset;\n comment_id?: string;\n }\n ): Promise<Figma.PostCommentResponse> {\n return this.request<Figma.PostCommentResponse>(\n \"POST\",\n `/files/${fileKey}/comments`,\n {\n body: {\n message,\n ...options,\n },\n }\n );\n }\n\n // Webhooks endpoints\n async getTeamWebhooks(\n teamId: string\n ): Promise<Figma.GetTeamWebhooksResponse> {\n return this.request<Figma.GetTeamWebhooksResponse>(\n \"GET\",\n `/webhooks/team/${teamId}`\n );\n }\n\n async getWebhook(webhookId: string): Promise<Figma.GetWebhookResponse> {\n return this.request<Figma.GetWebhookResponse>(\n \"GET\",\n `/webhooks/${webhookId}`\n );\n }\n\n // Generic API method for raw access\n async api<T = unknown>(\n method: string,\n path: string,\n options?: {\n params?: Record<string, string | number | boolean | string[] | undefined>;\n body?: unknown;\n }\n ): Promise<T> {\n // Ensure path starts with /\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return this.request<T>(method.toUpperCase(), normalizedPath, options);\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\n\nexport interface Config {\n token?: string;\n teamId?: string;\n defaultFormat?: \"json\" | \"table\";\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), \".config\", \"figma\");\nconst CONFIG_FILE = path.join(CONFIG_DIR, \"config.json\");\nconst LOCAL_CONFIG_FILE = \".figmarc\";\n\nexport class ConfigManager {\n private config: Config = {};\n private loaded = false;\n\n constructor() {}\n\n load(): Config {\n if (this.loaded) {\n return this.config;\n }\n\n // Start with empty config\n this.config = {};\n\n // Layer 1: User config (~/.config/figma/config.json)\n const userConfig = this.loadUserConfig();\n this.config = { ...this.config, ...userConfig };\n\n // Layer 2: Local config (.figmarc in current directory)\n const localConfig = this.loadLocalConfig();\n this.config = { ...this.config, ...localConfig };\n\n // Layer 3: Environment variables (highest priority)\n this.applyEnvVars();\n\n this.loaded = true;\n return this.config;\n }\n\n private loadUserConfig(): Config {\n try {\n if (fs.existsSync(CONFIG_FILE)) {\n const content = fs.readFileSync(CONFIG_FILE, \"utf-8\");\n return JSON.parse(content) as Config;\n }\n } catch {\n // Ignore errors\n }\n return {};\n }\n\n private loadLocalConfig(): Config {\n try {\n if (fs.existsSync(LOCAL_CONFIG_FILE)) {\n const content = fs.readFileSync(LOCAL_CONFIG_FILE, \"utf-8\");\n return JSON.parse(content) as Config;\n }\n } catch {\n // Ignore errors\n }\n return {};\n }\n\n private applyEnvVars(): void {\n if (process.env.FIGMA_TOKEN) {\n this.config.token = process.env.FIGMA_TOKEN;\n }\n if (process.env.FIGMA_TEAM_ID) {\n this.config.teamId = process.env.FIGMA_TEAM_ID;\n }\n }\n\n get(key: keyof Config): Config[keyof Config] {\n if (!this.loaded) {\n this.load();\n }\n return this.config[key];\n }\n\n set<K extends keyof Config>(key: K, value: Config[K]): void {\n if (!this.loaded) {\n this.load();\n }\n this.config[key] = value;\n this.save();\n }\n\n getAll(): Config {\n if (!this.loaded) {\n this.load();\n }\n return { ...this.config };\n }\n\n private save(): void {\n try {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n }\n // Don't save token or sensitive data to config file\n const { token: _token, ...safeConfig } = this.config;\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(safeConfig, null, 2));\n } catch {\n // Ignore errors\n }\n }\n\n getConfigDir(): string {\n return CONFIG_DIR;\n }\n\n getConfigFile(): string {\n return CONFIG_FILE;\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\n\nconst SERVICE_NAME = \"figma\";\nconst ACCOUNT_NAME = \"default\";\nconst CREDENTIALS_DIR = path.join(os.homedir(), \".config\", \"figma\");\nconst CREDENTIALS_FILE = path.join(CREDENTIALS_DIR, \"credentials.json\");\n\nexport interface AuthStore {\n getToken(): Promise<string | null>;\n setToken(token: string): Promise<void>;\n deleteToken(): Promise<void>;\n}\n\ninterface Credentials {\n token?: string;\n}\n\n// Callback type for storage fallback notifications\nexport type StorageFallbackCallback = (message: string) => void;\n\nclass KeytarAuthStore implements AuthStore {\n private keytar: typeof import(\"keytar\") | null = null;\n\n private async getKeytar(): Promise<typeof import(\"keytar\") | null> {\n if (this.keytar) {\n return this.keytar;\n }\n try {\n this.keytar = await import(\"keytar\");\n return this.keytar;\n } catch {\n return null;\n }\n }\n\n async getToken(): Promise<string | null> {\n const keytar = await this.getKeytar();\n if (!keytar) {\n return null;\n }\n try {\n return await keytar.getPassword(SERVICE_NAME, ACCOUNT_NAME);\n } catch {\n return null;\n }\n }\n\n async setToken(token: string): Promise<void> {\n const keytar = await this.getKeytar();\n if (!keytar) {\n throw new Error(\"Keytar not available\");\n }\n await keytar.setPassword(SERVICE_NAME, ACCOUNT_NAME, token);\n }\n\n async deleteToken(): Promise<void> {\n const keytar = await this.getKeytar();\n if (!keytar) {\n throw new Error(\"Keytar not available\");\n }\n await keytar.deletePassword(SERVICE_NAME, ACCOUNT_NAME);\n }\n\n async isAvailable(): Promise<boolean> {\n const keytar = await this.getKeytar();\n return keytar !== null;\n }\n}\n\nclass FileAuthStore implements AuthStore {\n async getToken(): Promise<string | null> {\n try {\n if (!fs.existsSync(CREDENTIALS_FILE)) {\n return null;\n }\n const content = fs.readFileSync(CREDENTIALS_FILE, \"utf-8\");\n const credentials: Credentials = JSON.parse(content);\n return credentials.token ?? null;\n } catch {\n return null;\n }\n }\n\n async setToken(token: string): Promise<void> {\n // Create directory with secure permissions (owner only)\n if (!fs.existsSync(CREDENTIALS_DIR)) {\n fs.mkdirSync(CREDENTIALS_DIR, { recursive: true, mode: 0o700 });\n }\n\n let credentials: Credentials = {};\n try {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n const content = fs.readFileSync(CREDENTIALS_FILE, \"utf-8\");\n credentials = JSON.parse(content);\n }\n } catch {\n // Ignore read errors, start fresh\n }\n\n credentials.token = token;\n\n fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), {\n mode: 0o600, // Only owner can read/write\n });\n }\n\n async deleteToken(): Promise<void> {\n try {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n const content = fs.readFileSync(CREDENTIALS_FILE, \"utf-8\");\n const credentials: Credentials = JSON.parse(content);\n delete credentials.token;\n\n if (Object.keys(credentials).length === 0) {\n fs.unlinkSync(CREDENTIALS_FILE);\n } else {\n fs.writeFileSync(\n CREDENTIALS_FILE,\n JSON.stringify(credentials, null, 2),\n { mode: 0o600 }\n );\n }\n }\n } catch {\n // Ignore errors during deletion\n }\n }\n}\n\nexport class AuthManager implements AuthStore {\n private keytarStore: KeytarAuthStore;\n private fileStore: FileAuthStore;\n private useKeytar: boolean | null = null;\n private onFallback: StorageFallbackCallback | null = null;\n private fallbackWarningShown = false;\n\n constructor(onFallback?: StorageFallbackCallback) {\n this.keytarStore = new KeytarAuthStore();\n this.fileStore = new FileAuthStore();\n this.onFallback = onFallback ?? null;\n }\n\n private async shouldUseKeytar(): Promise<boolean> {\n if (this.useKeytar !== null) {\n return this.useKeytar;\n }\n this.useKeytar = await this.keytarStore.isAvailable();\n return this.useKeytar;\n }\n\n private notifyFallback(reason: string): void {\n if (this.onFallback && !this.fallbackWarningShown) {\n this.fallbackWarningShown = true;\n this.onFallback(\n `Warning: Using file-based credential storage (${reason}). ` +\n `Token stored in ${CREDENTIALS_FILE}`\n );\n }\n }\n\n async getToken(): Promise<string | null> {\n // Try keytar first\n if (await this.shouldUseKeytar()) {\n const token = await this.keytarStore.getToken();\n if (token) {\n return token;\n }\n }\n\n // Fall back to file\n return this.fileStore.getToken();\n }\n\n async setToken(token: string): Promise<void> {\n if (await this.shouldUseKeytar()) {\n try {\n await this.keytarStore.setToken(token);\n return;\n } catch (error) {\n // Notify about fallback with reason\n const reason = error instanceof Error ? error.message : \"keytar failed\";\n this.notifyFallback(reason);\n }\n } else {\n this.notifyFallback(\"system keyring not available\");\n }\n\n await this.fileStore.setToken(token);\n }\n\n async deleteToken(): Promise<void> {\n // Try to delete from both stores\n const useKeytar = await this.shouldUseKeytar();\n\n if (useKeytar) {\n try {\n await this.keytarStore.deleteToken();\n } catch {\n // Ignore keytar deletion errors\n }\n }\n\n await this.fileStore.deleteToken();\n }\n\n async getStorageType(): Promise<\"keyring\" | \"file\"> {\n if (await this.shouldUseKeytar()) {\n const token = await this.keytarStore.getToken();\n if (token) {\n return \"keyring\";\n }\n }\n return \"file\";\n }\n}\n","import * as http from \"node:http\";\nimport * as crypto from \"node:crypto\";\nimport { URL } from \"node:url\";\n\nconst FIGMA_OAUTH_URL = \"https://www.figma.com/oauth\";\nconst FIGMA_TOKEN_URL = \"https://www.figma.com/api/oauth/token\";\nconst MAX_PORT = 65535;\n\nexport interface OAuthConfig {\n clientId: string;\n clientSecret: string;\n redirectUri?: string;\n scopes?: string[];\n}\n\nexport interface OAuthResult {\n accessToken: string;\n refreshToken?: string;\n expiresIn?: number;\n userId?: string;\n}\n\nfunction generateState(): string {\n return crypto.randomBytes(16).toString(\"hex\");\n}\n\n// Timing-safe comparison of state parameter to prevent timing attacks\nfunction verifyState(received: string, expected: string): boolean {\n if (received.length !== expected.length) {\n return false;\n }\n try {\n return crypto.timingSafeEqual(\n Buffer.from(received, \"utf8\"),\n Buffer.from(expected, \"utf8\")\n );\n } catch {\n return false;\n }\n}\n\nasync function findAvailablePort(\n startPort: number,\n maxPort: number = MAX_PORT\n): Promise<number> {\n if (startPort > maxPort) {\n throw new Error(`No available ports found between 8585 and ${maxPort}`);\n }\n\n return new Promise((resolve, reject) => {\n const server = http.createServer();\n server.listen(startPort, \"127.0.0.1\", () => {\n const address = server.address();\n if (address && typeof address === \"object\") {\n const port = address.port;\n server.close(() => resolve(port));\n } else {\n reject(new Error(\"Could not get server address\"));\n }\n });\n server.on(\"error\", () => {\n // Port in use, try next (with recursion limit)\n findAvailablePort(startPort + 1, maxPort)\n .then(resolve)\n .catch(reject);\n });\n });\n}\n\nexport async function startOAuthFlow(\n config: OAuthConfig,\n onOpenUrl: (url: string) => void\n): Promise<OAuthResult> {\n const port = await findAvailablePort(8585);\n const redirectUri = config.redirectUri || `http://127.0.0.1:${port}/callback`;\n const state = generateState();\n const scopes = config.scopes || [\"files:read\"];\n\n return new Promise((resolve, reject) => {\n let serverClosed = false;\n\n const closeServer = () => {\n if (!serverClosed) {\n serverClosed = true;\n server.close();\n }\n };\n\n const server = http.createServer(async (req, res) => {\n const url = new URL(req.url || \"/\", `http://127.0.0.1:${port}`);\n\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n const returnedState = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n\n if (error) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(getErrorHtml(error));\n closeServer();\n reject(new Error(`OAuth error: ${error}`));\n return;\n }\n\n // Use timing-safe comparison to prevent timing attacks on state parameter\n if (!returnedState || !verifyState(returnedState, state)) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(getErrorHtml(\"State mismatch - possible CSRF attack\"));\n closeServer();\n reject(new Error(\"OAuth state mismatch\"));\n return;\n }\n\n if (!code) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(getErrorHtml(\"No authorization code received\"));\n closeServer();\n reject(new Error(\"No authorization code\"));\n return;\n }\n\n try {\n // Exchange code for token\n const tokenResponse = await fetch(FIGMA_TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n client_id: config.clientId,\n client_secret: config.clientSecret,\n redirect_uri: redirectUri,\n code,\n grant_type: \"authorization_code\",\n }),\n });\n\n if (!tokenResponse.ok) {\n const errorText = await tokenResponse.text();\n throw new Error(`Token exchange failed: ${errorText}`);\n }\n\n const tokenData = (await tokenResponse.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n user_id?: string;\n };\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(getSuccessHtml());\n closeServer();\n\n resolve({\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token,\n expiresIn: tokenData.expires_in,\n userId: tokenData.user_id?.toString(),\n });\n } catch (err) {\n res.writeHead(500, { \"Content-Type\": \"text/html\" });\n res.end(\n getErrorHtml(err instanceof Error ? err.message : \"Unknown error\")\n );\n closeServer();\n reject(err);\n }\n } else {\n res.writeHead(404);\n res.end(\"Not found\");\n }\n });\n\n server.listen(port, \"127.0.0.1\", () => {\n // Build authorization URL\n const authUrl = new URL(FIGMA_OAUTH_URL);\n authUrl.searchParams.set(\"client_id\", config.clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"scope\", scopes.join(\",\"));\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\"response_type\", \"code\");\n\n onOpenUrl(authUrl.toString());\n });\n\n // Timeout after 5 minutes\n setTimeout(\n () => {\n closeServer();\n reject(new Error(\"OAuth flow timed out\"));\n },\n 5 * 60 * 1000\n );\n });\n}\n\nfunction getSuccessHtml(): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Figma CLI - Authentication Successful</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n }\n .card {\n background: white;\n padding: 3rem;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n text-align: center;\n max-width: 400px;\n }\n .checkmark {\n width: 80px;\n height: 80px;\n background: #10b981;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 1.5rem;\n }\n .checkmark svg {\n width: 40px;\n height: 40px;\n stroke: white;\n stroke-width: 3;\n }\n h1 { color: #1f2937; margin: 0 0 0.5rem; }\n p { color: #6b7280; margin: 0; }\n </style>\n</head>\n<body>\n <div class=\"card\">\n <div class=\"checkmark\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5 13l4 4L19 7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1>Authentication Successful!</h1>\n <p>You can close this window and return to your terminal.</p>\n </div>\n</body>\n</html>`;\n}\n\nfunction getErrorHtml(error: string): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n <title>Figma CLI - Authentication Failed</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);\n }\n .card {\n background: white;\n padding: 3rem;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n text-align: center;\n max-width: 400px;\n }\n .error-icon {\n width: 80px;\n height: 80px;\n background: #ef4444;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 1.5rem;\n }\n .error-icon svg {\n width: 40px;\n height: 40px;\n stroke: white;\n stroke-width: 3;\n }\n h1 { color: #1f2937; margin: 0 0 0.5rem; }\n p { color: #6b7280; margin: 0; }\n .error-detail {\n background: #fef2f2;\n color: #991b1b;\n padding: 1rem;\n border-radius: 8px;\n margin-top: 1rem;\n font-size: 0.875rem;\n }\n </style>\n</head>\n<body>\n <div class=\"card\">\n <div class=\"error-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M6 18L18 6M6 6l12 12\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <h1>Authentication Failed</h1>\n <p>Something went wrong during authentication.</p>\n <div class=\"error-detail\">${escapeHtml(error)}</div>\n </div>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n","import { ConfigManager } from \"../../internal/config/index.js\";\nimport { AuthManager } from \"../../internal/auth/index.js\";\nimport { FigmaClient } from \"../../api/client.js\";\nimport { IOStreams, createIOStreams } from \"../iostreams/index.js\";\nimport chalk from \"chalk\";\n\nexport interface Factory {\n config: ConfigManager;\n auth: AuthManager;\n io: IOStreams;\n\n // Lazy-loaded API client\n getClient(): Promise<FigmaClient>;\n\n // Get token with fallback to options\n getToken(tokenOption?: string): Promise<string>;\n}\n\nexport function createFactory(): Factory {\n const config = new ConfigManager();\n const io = createIOStreams();\n\n // Create AuthManager with fallback warning callback\n const auth = new AuthManager((message) => {\n io.err.write(chalk.yellow(`${message}\\n`));\n });\n\n let clientCache: FigmaClient | null = null;\n\n return {\n config,\n auth,\n io,\n\n async getToken(tokenOption?: string): Promise<string> {\n // Priority: CLI flag > env var > stored credential\n if (tokenOption) {\n return tokenOption;\n }\n\n config.load();\n const envToken = config.get(\"token\");\n if (envToken) {\n return envToken;\n }\n\n const storedToken = await auth.getToken();\n if (storedToken) {\n return storedToken;\n }\n\n throw new Error(\n `No Figma token found. Please run ${chalk.cyan(\"figma auth login\")} or set the ${chalk.cyan(\"FIGMA_TOKEN\")} environment variable.`\n );\n },\n\n async getClient(): Promise<FigmaClient> {\n if (clientCache) {\n return clientCache;\n }\n\n const token = await this.getToken();\n clientCache = new FigmaClient({ token });\n return clientCache;\n },\n };\n}\n","import { Writable, Readable } from \"node:stream\";\n\nexport interface IOStreams {\n in: Readable;\n out: Writable;\n err: Writable;\n isInteractive: boolean;\n isTTY: boolean;\n}\n\nexport function createIOStreams(): IOStreams {\n const isTTY = process.stdout.isTTY ?? false;\n\n return {\n in: process.stdin,\n out: process.stdout,\n err: process.stderr,\n isInteractive: isTTY && process.env.CI !== \"true\",\n isTTY,\n };\n}\n","import { Command } from \"commander\";\nimport type { Factory } from \"../pkg/cmdutil/index.js\";\nimport { createAuthCommand } from \"./auth/index.js\";\nimport { createFileCommand } from \"./file/index.js\";\nimport { createProjectCommand } from \"./project/index.js\";\nimport { createComponentCommand } from \"./component/index.js\";\nimport { createStyleCommand } from \"./style/index.js\";\nimport { createVariableCommand } from \"./variable/index.js\";\nimport { createExportCommand } from \"./export/index.js\";\nimport { createApiCommand } from \"./api/index.js\";\n\nexport function createRootCommand(factory: Factory): Command {\n const program = new Command();\n\n program\n .name(\"figma\")\n .description(\"CLI for the Figma API\")\n .version(\"1.0.0\")\n .configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n });\n\n // Add subcommands\n program.addCommand(createAuthCommand(factory));\n program.addCommand(createFileCommand(factory));\n program.addCommand(createProjectCommand(factory));\n program.addCommand(createComponentCommand(factory));\n program.addCommand(createStyleCommand(factory));\n program.addCommand(createVariableCommand(factory));\n program.addCommand(createExportCommand(factory));\n program.addCommand(createApiCommand(factory));\n\n return program;\n}\n","import { Command } from \"commander\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { createLoginCommand } from \"./login.js\";\nimport { createLogoutCommand } from \"./logout.js\";\nimport { createStatusCommand } from \"./status.js\";\n\nexport function createAuthCommand(factory: Factory): Command {\n const cmd = new Command(\"auth\").description(\"Manage Figma authentication\");\n\n cmd.addCommand(createLoginCommand(factory));\n cmd.addCommand(createLogoutCommand(factory));\n cmd.addCommand(createStatusCommand(factory));\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { spawn } from \"node:child_process\";\nimport { platform } from \"node:os\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { FigmaClient } from \"../../api/client.js\";\nimport { startOAuthFlow } from \"../../internal/auth/index.js\";\nimport type { IOStreams } from \"../../pkg/iostreams/index.js\";\nimport type { AuthManager } from \"../../internal/auth/index.js\";\n\n// Safe browser open using spawn instead of exec to prevent command injection\nfunction openBrowser(url: string): void {\n const plat = platform();\n\n if (plat === \"darwin\") {\n spawn(\"open\", [url], { detached: true, stdio: \"ignore\" }).unref();\n } else if (plat === \"win32\") {\n spawn(\"cmd\", [\"/c\", \"start\", \"\", url], {\n detached: true,\n stdio: \"ignore\",\n }).unref();\n } else {\n spawn(\"xdg-open\", [url], { detached: true, stdio: \"ignore\" }).unref();\n }\n}\n\n// Helper to display logged in user info\nfunction displayUserInfo(\n io: IOStreams,\n user: { handle?: string; email: string }\n): void {\n io.out.write(chalk.green(\"✓ Logged in as \"));\n io.out.write(chalk.bold(user.handle || user.email));\n io.out.write(\"\\n\");\n}\n\n// Helper to perform OAuth flow and store token\nasync function performOAuthFlow(\n io: IOStreams,\n auth: AuthManager,\n clientId: string,\n clientSecret: string,\n scopes?: string[]\n): Promise<void> {\n io.out.write(chalk.cyan(\"Opening browser for authentication...\\n\"));\n io.out.write(chalk.dim(\"Waiting for authorization...\\n\\n\"));\n\n const result = await startOAuthFlow(\n { clientId, clientSecret, scopes },\n (url) => {\n io.out.write(chalk.dim(`If browser doesn't open, visit:\\n${url}\\n\\n`));\n openBrowser(url);\n }\n );\n\n await auth.setToken(result.accessToken);\n\n const client = new FigmaClient({ token: result.accessToken });\n const user = await client.getMe();\n displayUserInfo(io, user);\n}\n\nexport function createLoginCommand(factory: Factory): Command {\n const cmd = new Command(\"login\")\n .description(\"Authenticate with Figma\")\n .option(\"-t, --token <token>\", \"Personal access token\")\n .option(\"-w, --web\", \"Login via browser (OAuth)\")\n .option(\"--client-id <id>\", \"OAuth client ID (or set FIGMA_CLIENT_ID)\")\n .option(\"--scopes <scopes>\", \"OAuth scopes (comma-separated)\", \"files:read\")\n .action(\n async (options: {\n token?: string;\n web?: boolean;\n clientId?: string;\n scopes?: string;\n }) => {\n const { io, auth } = factory;\n\n // OAuth web flow\n if (options.web) {\n const clientId = options.clientId || process.env.FIGMA_CLIENT_ID;\n const clientSecret = process.env.FIGMA_CLIENT_SECRET;\n\n if (!clientId || !clientSecret) {\n io.err.write(\n chalk.red(\"Error: OAuth requires client ID and secret.\\n\\n\")\n );\n io.err.write(chalk.dim(\"Set them via environment variables:\\n\"));\n io.err.write(\n chalk.dim(\" export FIGMA_CLIENT_ID=your_client_id\\n\")\n );\n io.err.write(\n chalk.dim(\" export FIGMA_CLIENT_SECRET=your_client_secret\\n\\n\")\n );\n io.err.write(\n chalk.dim(\"You can also pass --client-id as a flag.\\n\")\n );\n io.err.write(\n chalk.yellow(\n \"\\nNote: Client secret must be set via FIGMA_CLIENT_SECRET env var for security.\\n\"\n )\n );\n io.err.write(\n chalk.dim(\n \"\\nCreate an OAuth app at: https://www.figma.com/developers/apps\\n\"\n )\n );\n process.exit(1);\n }\n\n try {\n await performOAuthFlow(\n io,\n auth,\n clientId,\n clientSecret,\n options.scopes?.split(\",\")\n );\n } catch (error) {\n io.err.write(chalk.red(\"Error: OAuth authentication failed.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n return;\n }\n\n // Token-based flow\n let token = options.token;\n\n if (!token) {\n // Check if running interactively\n if (!io.isInteractive) {\n io.err.write(\n chalk.red(\n \"Error: No token provided. Use --token, --web, or run interactively.\\n\"\n )\n );\n io.err.write(\n chalk.dim(\n \"\\nGet a personal access token from: https://www.figma.com/developers/api#access-tokens\\n\"\n )\n );\n process.exit(1);\n }\n\n // Prompt for auth method\n const { default: Enquirer } = await import(\"enquirer\");\n const enquirer = new Enquirer();\n\n const methodResponse = (await enquirer.prompt({\n type: \"select\",\n name: \"method\",\n message: \"How would you like to authenticate?\",\n choices: [\n { name: \"token\", message: \"Paste a personal access token\" },\n {\n name: \"web\",\n message: \"Login with browser (requires OAuth app)\",\n },\n ],\n })) as { method: string };\n\n if (methodResponse.method === \"web\") {\n const clientIdResponse = (await enquirer.prompt({\n type: \"input\",\n name: \"clientId\",\n message: \"OAuth Client ID:\",\n initial: process.env.FIGMA_CLIENT_ID,\n })) as { clientId: string };\n\n const clientSecretResponse = (await enquirer.prompt({\n type: \"password\",\n name: \"clientSecret\",\n message: \"OAuth Client Secret:\",\n })) as { clientSecret: string };\n\n if (\n !clientIdResponse.clientId ||\n !clientSecretResponse.clientSecret\n ) {\n io.err.write(\n chalk.red(\"Error: Client ID and secret are required.\\n\")\n );\n process.exit(1);\n }\n\n try {\n await performOAuthFlow(\n io,\n auth,\n clientIdResponse.clientId,\n clientSecretResponse.clientSecret\n );\n } catch (error) {\n io.err.write(chalk.red(\"Error: OAuth authentication failed.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n return;\n }\n\n // Token flow\n io.out.write(\n chalk.cyan(\n \"\\nGet a personal access token from: https://www.figma.com/developers/api#access-tokens\\n\\n\"\n )\n );\n\n const tokenResponse = (await enquirer.prompt({\n type: \"password\",\n name: \"token\",\n message: \"Paste your token:\",\n })) as { token: string };\n\n token = tokenResponse.token;\n }\n\n if (!token || token.trim() === \"\") {\n io.err.write(chalk.red(\"Error: Token cannot be empty.\\n\"));\n process.exit(1);\n }\n\n // Verify the token works\n io.out.write(chalk.dim(\"Verifying token...\\n\"));\n\n try {\n const client = new FigmaClient({ token });\n const user = await client.getMe();\n\n // Store the token\n await auth.setToken(token);\n displayUserInfo(io, user);\n } catch (error) {\n io.err.write(chalk.red(\"Error: Invalid token or API error.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\n\nexport function createLogoutCommand(factory: Factory): Command {\n const cmd = new Command(\"logout\")\n .description(\"Remove stored Figma credentials\")\n .action(async () => {\n const { io, auth } = factory;\n\n const existingToken = await auth.getToken();\n\n if (!existingToken) {\n io.out.write(chalk.yellow(\"No stored credentials found.\\n\"));\n return;\n }\n\n await auth.deleteToken();\n io.out.write(chalk.green(\"✓ Logged out successfully.\\n\"));\n });\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { FigmaClient } from \"../../api/client.js\";\n\nexport function createStatusCommand(factory: Factory): Command {\n const cmd = new Command(\"status\")\n .description(\"Show authentication status\")\n .action(async () => {\n const { io, auth, config } = factory;\n\n // Check for token from various sources\n config.load();\n const envToken = config.get(\"token\");\n const storedToken = await auth.getToken();\n\n const token = envToken || storedToken;\n\n if (!token) {\n io.out.write(chalk.yellow(\"Not logged in.\\n\"));\n io.out.write(\n chalk.dim(`Run ${chalk.cyan(\"figma auth login\")} to authenticate.\\n`)\n );\n return;\n }\n\n const source = envToken ? \"environment variable\" : \"stored credential\";\n\n try {\n const client = new FigmaClient({ token });\n const user = await client.getMe();\n\n io.out.write(chalk.green(\"✓ Logged in to Figma\\n\\n\"));\n io.out.write(\n ` ${chalk.dim(\"User:\")} ${user.handle || user.email}\\n`\n );\n io.out.write(` ${chalk.dim(\"Email:\")} ${user.email}\\n`);\n io.out.write(` ${chalk.dim(\"User ID:\")} ${user.id}\\n`);\n io.out.write(` ${chalk.dim(\"Source:\")} ${source}\\n`);\n\n if (envToken) {\n io.out.write(\n chalk.dim(\"\\n Token from FIGMA_TOKEN environment variable.\\n\")\n );\n } else {\n const storageType = await auth.getStorageType();\n io.out.write(chalk.dim(`\\n Token stored in ${storageType}.\\n`));\n }\n } catch (error) {\n io.err.write(chalk.red(\"Error: Token is invalid or expired.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n io.out.write(\n chalk.dim(\n `\\nRun ${chalk.cyan(\"figma auth login\")} to re-authenticate.\\n`\n )\n );\n process.exit(1);\n }\n });\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { createFileGetCommand } from \"./get.js\";\nimport { createFileNodesCommand } from \"./nodes.js\";\nimport { createFileImagesCommand } from \"./images.js\";\n\nexport function createFileCommand(factory: Factory): Command {\n const cmd = new Command(\"file\").description(\"Work with Figma files\");\n\n cmd.addCommand(createFileGetCommand(factory));\n cmd.addCommand(createFileNodesCommand(factory));\n cmd.addCommand(createFileImagesCommand(factory));\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { formatOutput, type OutputFormat } from \"../../pkg/output/index.js\";\n\nexport function createFileGetCommand(factory: Factory): Command {\n const cmd = new Command(\"get\")\n .description(\"Get file JSON structure\")\n .argument(\"<key>\", \"File key (from Figma URL)\")\n .option(\"-v, --version <version>\", \"File version to get\")\n .option(\n \"-d, --depth <depth>\",\n \"Depth of node tree to return (default: full tree)\",\n parseInt\n )\n .option(\"-i, --ids <ids>\", \"Comma-separated list of node IDs to include\")\n .option(\"--geometry <paths>\", \"Include geometry data (paths)\")\n .option(\"-f, --format <format>\", \"Output format (json, table)\", \"json\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n fileKey: string,\n options: {\n version?: string;\n depth?: number;\n ids?: string;\n geometry?: string;\n format: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const token = await factory.getToken(options.token);\n const client = await factory.getClient();\n\n // Override client token if provided\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n const overrideClient = new FigmaClient({ token });\n const file = await overrideClient.getFile(fileKey, {\n version: options.version,\n depth: options.depth,\n ids: options.ids?.split(\",\"),\n geometry: options.geometry,\n });\n io.out.write(\n formatOutput(file, { format: options.format as OutputFormat })\n );\n io.out.write(\"\\n\");\n return;\n }\n\n const file = await client.getFile(fileKey, {\n version: options.version,\n depth: options.depth,\n ids: options.ids?.split(\",\"),\n geometry: options.geometry,\n });\n\n io.out.write(\n formatOutput(file, { format: options.format as OutputFormat })\n );\n io.out.write(\"\\n\");\n } catch (error) {\n io.err.write(chalk.red(\"Error fetching file.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import Table from \"cli-table3\";\n\nexport type OutputFormat = \"json\" | \"table\";\n\nexport interface FormatterOptions {\n format: OutputFormat;\n columns?: string[];\n}\n\nexport function formatOutput<T>(\n data: T,\n options: FormatterOptions = { format: \"json\" }\n): string {\n switch (options.format) {\n case \"json\":\n return JSON.stringify(data, null, 2);\n case \"table\":\n return formatTable(data, options.columns);\n default:\n return JSON.stringify(data, null, 2);\n }\n}\n\nfunction formatTable<T>(data: T, columns?: string[]): string {\n if (!Array.isArray(data)) {\n // For single objects, convert to key-value table\n return formatKeyValueTable(data as Record<string, unknown>);\n }\n\n if (data.length === 0) {\n return \"No data\";\n }\n\n const firstItem = data[0] as Record<string, unknown>;\n const headers = columns ?? Object.keys(firstItem);\n\n const table = new Table({\n head: headers,\n style: {\n head: [\"cyan\"],\n border: [\"gray\"],\n },\n });\n\n for (const item of data) {\n const row = headers.map((col) => {\n const value = (item as Record<string, unknown>)[col];\n return formatValue(value);\n });\n table.push(row);\n }\n\n return table.toString();\n}\n\nfunction formatKeyValueTable(obj: Record<string, unknown>): string {\n const table = new Table({\n style: {\n head: [\"cyan\"],\n border: [\"gray\"],\n },\n });\n\n for (const [key, value] of Object.entries(obj)) {\n table.push({ [key]: formatValue(value) });\n }\n\n return table.toString();\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.slice(0, maxLength - 3) + \"...\";\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { formatOutput, type OutputFormat } from \"../../pkg/output/index.js\";\n\nexport function createFileNodesCommand(factory: Factory): Command {\n const cmd = new Command(\"nodes\")\n .description(\"Get specific nodes from a file\")\n .argument(\"<key>\", \"File key (from Figma URL)\")\n .requiredOption(\"-i, --ids <ids>\", \"Comma-separated list of node IDs\")\n .option(\"-v, --version <version>\", \"File version to get\")\n .option(\"-d, --depth <depth>\", \"Depth of node tree to return\", parseInt)\n .option(\"--geometry <paths>\", \"Include geometry data (paths)\")\n .option(\"-f, --format <format>\", \"Output format (json, table)\", \"json\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n fileKey: string,\n options: {\n ids: string;\n version?: string;\n depth?: number;\n geometry?: string;\n format: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const token = await factory.getToken(options.token);\n const client = await factory.getClient();\n\n const nodeIds = options.ids.split(\",\").map((id) => id.trim());\n\n // Override client token if provided\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n const overrideClient = new FigmaClient({ token });\n const nodes = await overrideClient.getFileNodes(fileKey, nodeIds, {\n version: options.version,\n depth: options.depth,\n geometry: options.geometry,\n });\n io.out.write(\n formatOutput(nodes, { format: options.format as OutputFormat })\n );\n io.out.write(\"\\n\");\n return;\n }\n\n const nodes = await client.getFileNodes(fileKey, nodeIds, {\n version: options.version,\n depth: options.depth,\n geometry: options.geometry,\n });\n\n io.out.write(\n formatOutput(nodes, { format: options.format as OutputFormat })\n );\n io.out.write(\"\\n\");\n } catch (error) {\n io.err.write(chalk.red(\"Error fetching nodes.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { formatOutput, type OutputFormat } from \"../../pkg/output/index.js\";\nimport {\n downloadFiles,\n sanitizeFilename,\n} from \"../../internal/download/index.js\";\n\nexport function createFileImagesCommand(factory: Factory): Command {\n const cmd = new Command(\"images\")\n .description(\"Export images from a file\")\n .argument(\"<key>\", \"File key (from Figma URL)\")\n .requiredOption(\n \"-i, --ids <ids>\",\n \"Comma-separated list of node IDs to export\"\n )\n .option(\"-s, --scale <scale>\", \"Scale factor (0.01-4)\", parseFloat, 1)\n .option(\"--format <format>\", \"Image format (jpg, png, svg, pdf)\", \"png\")\n .option(\"--svg-include-id\", \"Include node ID as an attribute in SVGs\")\n .option(\"--svg-simplify-stroke\", \"Simplify strokes in SVG export\")\n .option(\"-o, --output <dir>\", \"Output directory for downloaded images\")\n .option(\n \"-O, --output-format <format>\",\n \"Output format (json, table)\",\n \"json\"\n )\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n fileKey: string,\n options: {\n ids: string;\n scale: number;\n format: string;\n svgIncludeId?: boolean;\n svgSimplifyStroke?: boolean;\n output?: string;\n outputFormat: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n // Validate format option\n const validFormats = [\"jpg\", \"png\", \"svg\", \"pdf\"] as const;\n type ImageFormat = (typeof validFormats)[number];\n if (!validFormats.includes(options.format as ImageFormat)) {\n io.err.write(\n chalk.red(\n `Invalid format \"${options.format}\". Valid formats: ${validFormats.join(\", \")}\\n`\n )\n );\n process.exit(1);\n }\n const imageFormat = options.format as ImageFormat;\n\n try {\n const token = await factory.getToken(options.token);\n const client = await factory.getClient();\n\n const nodeIds = options.ids.split(\",\").map((id) => id.trim());\n\n // Override client token if provided\n let activeClient = client;\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n activeClient = new FigmaClient({ token });\n }\n\n const images = await activeClient.getImages(fileKey, nodeIds, {\n scale: options.scale,\n format: imageFormat,\n svg_include_id: options.svgIncludeId,\n svg_simplify_stroke: options.svgSimplifyStroke,\n });\n\n // If output directory specified, download the images\n if (options.output) {\n const imageUrls = images.images || {};\n\n const downloadItems = Object.entries(imageUrls).map(\n ([nodeId, url]) => ({\n id: nodeId,\n url: url ?? null,\n filename: `${sanitizeFilename(nodeId)}.${imageFormat}`,\n })\n );\n\n const results = await downloadFiles(downloadItems, options.output);\n\n // Transform results to expected output format\n const downloadResults = results.map((r) => ({\n nodeId: r.id,\n file: r.file,\n status:\n r.status === \"success\" ? \"downloaded\" : (r.error ?? \"error\"),\n }));\n\n io.out.write(\n formatOutput(downloadResults, {\n format: options.outputFormat as OutputFormat,\n })\n );\n io.out.write(\"\\n\");\n } else {\n // Just output the image URLs\n io.out.write(\n formatOutput(images, {\n format: options.outputFormat as OutputFormat,\n })\n );\n io.out.write(\"\\n\");\n }\n } catch (error) {\n io.err.write(chalk.red(\"Error exporting images.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport interface DownloadResult {\n id: string;\n name?: string;\n file: string;\n status: \"success\" | \"error\";\n error?: string;\n}\n\nexport interface DownloadOptions {\n outputDir: string;\n filename: string;\n timeoutMs?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30000;\n\n/**\n * Download a file from a URL to the local filesystem\n */\nexport async function downloadFile(\n url: string,\n options: DownloadOptions\n): Promise<void> {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n );\n\n try {\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n\n const buffer = await response.arrayBuffer();\n const filepath = path.join(options.outputDir, options.filename);\n\n fs.writeFileSync(filepath, Buffer.from(buffer));\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Download multiple files from URLs, returning results for each\n */\nexport async function downloadFiles(\n items: Array<{\n id: string;\n name?: string;\n url: string | null;\n filename: string;\n }>,\n outputDir: string,\n options?: {\n timeoutMs?: number;\n onProgress?: (completed: number, total: number, item: string) => void;\n }\n): Promise<DownloadResult[]> {\n // Ensure output directory exists\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const results: DownloadResult[] = [];\n const total = items.length;\n let completed = 0;\n\n for (const item of items) {\n if (!item.url) {\n results.push({\n id: item.id,\n name: item.name,\n file: \"\",\n status: \"error\",\n error: \"No URL provided\",\n });\n completed++;\n options?.onProgress?.(completed, total, item.name ?? item.id);\n continue;\n }\n\n try {\n const filepath = path.join(outputDir, item.filename);\n await downloadFile(item.url, {\n outputDir,\n filename: item.filename,\n timeoutMs: options?.timeoutMs,\n });\n\n results.push({\n id: item.id,\n name: item.name,\n file: filepath,\n status: \"success\",\n });\n } catch (err) {\n results.push({\n id: item.id,\n name: item.name,\n file: \"\",\n status: \"error\",\n error: err instanceof Error ? err.message : \"Download failed\",\n });\n }\n\n completed++;\n options?.onProgress?.(completed, total, item.name ?? item.id);\n }\n\n return results;\n}\n\n/**\n * Sanitize a string for use as a filename\n */\nexport function sanitizeFilename(name: string): string {\n return name.replace(/[:/\\\\?*\"<>|]/g, \"-\");\n}\n","import { Command } from \"commander\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { createProjectListCommand } from \"./list.js\";\nimport { createProjectFilesCommand } from \"./files.js\";\n\nexport function createProjectCommand(factory: Factory): Command {\n const cmd = new Command(\"project\").description(\"Work with Figma projects\");\n\n cmd.addCommand(createProjectListCommand(factory));\n cmd.addCommand(createProjectFilesCommand(factory));\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { formatOutput } from \"../../pkg/output/index.js\";\n\nexport function createProjectListCommand(factory: Factory): Command {\n const cmd = new Command(\"list\")\n .description(\"List team projects\")\n .requiredOption(\"--team <id>\", \"Team ID\")\n .option(\"-f, --format <format>\", \"Output format (json, table)\", \"json\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (options: { team: string; format: string; token?: string }) => {\n const { io } = factory;\n\n try {\n const token = await factory.getToken(options.token);\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token });\n }\n\n const projects = await client.getTeamProjects(options.team);\n\n if (options.format === \"table\") {\n const tableData = projects.projects.map((p) => ({\n id: p.id,\n name: p.name,\n }));\n io.out.write(\n formatOutput(tableData, {\n format: \"table\",\n columns: [\"id\", \"name\"],\n })\n );\n } else {\n io.out.write(formatOutput(projects, { format: \"json\" }));\n }\n io.out.write(\"\\n\");\n } catch (error) {\n io.err.write(chalk.red(\"Error fetching projects.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { formatOutput } from \"../../pkg/output/index.js\";\n\nexport function createProjectFilesCommand(factory: Factory): Command {\n const cmd = new Command(\"files\")\n .description(\"List files in a project\")\n .argument(\"<project-id>\", \"Project ID\")\n .option(\"--branch-data\", \"Include branch metadata\")\n .option(\"-f, --format <format>\", \"Output format (json, table)\", \"json\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n projectId: string,\n options: {\n branchData?: boolean;\n format: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const token = await factory.getToken(options.token);\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token });\n }\n\n const files = await client.getProjectFiles(projectId, {\n branch_data: options.branchData,\n });\n\n if (options.format === \"table\") {\n const tableData = files.files.map((f) => ({\n key: f.key,\n name: f.name,\n last_modified: f.last_modified,\n }));\n io.out.write(\n formatOutput(tableData, {\n format: \"table\",\n columns: [\"key\", \"name\", \"last_modified\"],\n })\n );\n } else {\n io.out.write(formatOutput(files, { format: \"json\" }));\n }\n io.out.write(\"\\n\");\n } catch (error) {\n io.err.write(chalk.red(\"Error fetching project files.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { createComponentListCommand } from \"./list.js\";\nimport { createComponentGetCommand } from \"./get.js\";\n\nexport function createComponentCommand(factory: Factory): Command {\n const cmd = new Command(\"component\").description(\n \"Work with Figma components\"\n );\n\n cmd.addCommand(createComponentListCommand(factory));\n cmd.addCommand(createComponentGetCommand(factory));\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { formatOutput } from \"../../pkg/output/index.js\";\n\nexport function createComponentListCommand(factory: Factory): Command {\n const cmd = new Command(\"list\")\n .description(\"List components (from team or file)\")\n .option(\"--team <id>\", \"Team ID to list components from\")\n .option(\"--file <key>\", \"File key to list components from\")\n .option(\"--page-size <size>\", \"Number of results per page\", parseInt)\n .option(\"-f, --format <format>\", \"Output format (json, table)\", \"json\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (options: {\n team?: string;\n file?: string;\n pageSize?: number;\n format: string;\n token?: string;\n }) => {\n const { io } = factory;\n\n if (!options.team && !options.file) {\n io.err.write(\n chalk.red(\"Error: Either --team or --file must be specified.\\n\")\n );\n process.exit(1);\n }\n\n try {\n const token = await factory.getToken(options.token);\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token });\n }\n\n if (options.team) {\n const components = await client.getTeamComponents(options.team, {\n page_size: options.pageSize,\n });\n\n if (options.format === \"table\") {\n const tableData =\n components.meta?.components?.map((c) => ({\n key: c.key,\n name: c.name,\n description: c.description || \"\",\n })) || [];\n io.out.write(\n formatOutput(tableData, {\n format: \"table\",\n columns: [\"key\", \"name\", \"description\"],\n })\n );\n } else {\n io.out.write(formatOutput(components, { format: \"json\" }));\n }\n } else if (options.file) {\n const components = await client.getFileComponents(options.file);\n\n if (options.format === \"table\") {\n const tableData =\n components.meta?.components?.map((c) => ({\n key: c.key,\n name: c.name,\n description: c.description || \"\",\n })) || [];\n io.out.write(\n formatOutput(tableData, {\n format: \"table\",\n columns: [\"key\", \"name\", \"description\"],\n })\n );\n } else {\n io.out.write(formatOutput(components, { format: \"json\" }));\n }\n }\n\n io.out.write(\"\\n\");\n } catch (error) {\n io.err.write(chalk.red(\"Error fetching components.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { formatOutput, type OutputFormat } from \"../../pkg/output/index.js\";\n\nexport function createComponentGetCommand(factory: Factory): Command {\n const cmd = new Command(\"get\")\n .description(\"Get component details\")\n .argument(\"<key>\", \"Component key\")\n .option(\"-f, --format <format>\", \"Output format (json, table)\", \"json\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n componentKey: string,\n options: {\n format: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const token = await factory.getToken(options.token);\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token });\n }\n\n const component = await client.getComponent(componentKey);\n\n io.out.write(\n formatOutput(component, {\n format: options.format as OutputFormat,\n })\n );\n io.out.write(\"\\n\");\n } catch (error) {\n io.err.write(chalk.red(\"Error fetching component.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { createStyleListCommand } from \"./list.js\";\nimport { createStyleGetCommand } from \"./get.js\";\n\nexport function createStyleCommand(factory: Factory): Command {\n const cmd = new Command(\"style\").description(\"Work with Figma styles\");\n\n cmd.addCommand(createStyleListCommand(factory));\n cmd.addCommand(createStyleGetCommand(factory));\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { formatOutput } from \"../../pkg/output/index.js\";\n\nexport function createStyleListCommand(factory: Factory): Command {\n const cmd = new Command(\"list\")\n .description(\"List styles (from team or file)\")\n .option(\"--team <id>\", \"Team ID to list styles from\")\n .option(\"--file <key>\", \"File key to list styles from\")\n .option(\"--page-size <size>\", \"Number of results per page\", parseInt)\n .option(\"-f, --format <format>\", \"Output format (json, table)\", \"json\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (options: {\n team?: string;\n file?: string;\n pageSize?: number;\n format: string;\n token?: string;\n }) => {\n const { io } = factory;\n\n if (!options.team && !options.file) {\n io.err.write(\n chalk.red(\"Error: Either --team or --file must be specified.\\n\")\n );\n process.exit(1);\n }\n\n try {\n const token = await factory.getToken(options.token);\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token });\n }\n\n if (options.team) {\n const styles = await client.getTeamStyles(options.team, {\n page_size: options.pageSize,\n });\n\n if (options.format === \"table\") {\n const tableData =\n styles.meta?.styles?.map((s) => ({\n key: s.key,\n name: s.name,\n style_type: s.style_type,\n description: s.description || \"\",\n })) || [];\n io.out.write(\n formatOutput(tableData, {\n format: \"table\",\n columns: [\"key\", \"name\", \"style_type\", \"description\"],\n })\n );\n } else {\n io.out.write(formatOutput(styles, { format: \"json\" }));\n }\n } else if (options.file) {\n const styles = await client.getFileStyles(options.file);\n\n if (options.format === \"table\") {\n const tableData =\n styles.meta?.styles?.map((s) => ({\n key: s.key,\n name: s.name,\n style_type: s.style_type,\n description: s.description || \"\",\n })) || [];\n io.out.write(\n formatOutput(tableData, {\n format: \"table\",\n columns: [\"key\", \"name\", \"style_type\", \"description\"],\n })\n );\n } else {\n io.out.write(formatOutput(styles, { format: \"json\" }));\n }\n }\n\n io.out.write(\"\\n\");\n } catch (error) {\n io.err.write(chalk.red(\"Error fetching styles.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { formatOutput, type OutputFormat } from \"../../pkg/output/index.js\";\n\nexport function createStyleGetCommand(factory: Factory): Command {\n const cmd = new Command(\"get\")\n .description(\"Get style details\")\n .argument(\"<key>\", \"Style key\")\n .option(\"-f, --format <format>\", \"Output format (json, table)\", \"json\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n styleKey: string,\n options: {\n format: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const token = await factory.getToken(options.token);\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token });\n }\n\n const style = await client.getStyle(styleKey);\n\n io.out.write(\n formatOutput(style, {\n format: options.format as OutputFormat,\n })\n );\n io.out.write(\"\\n\");\n } catch (error) {\n io.err.write(chalk.red(\"Error fetching style.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { createVariableListCommand } from \"./list.js\";\nimport { createVariableExportCommand } from \"./export.js\";\n\nexport function createVariableCommand(factory: Factory): Command {\n const cmd = new Command(\"variable\").description(\n \"Work with Figma variables (Enterprise)\"\n );\n\n cmd.addCommand(createVariableListCommand(factory));\n cmd.addCommand(createVariableExportCommand(factory));\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { formatOutput } from \"../../pkg/output/index.js\";\n\nexport function createVariableListCommand(factory: Factory): Command {\n const cmd = new Command(\"list\")\n .description(\"List variables from a file (Enterprise)\")\n .argument(\"<file-key>\", \"File key\")\n .option(\"--published\", \"List published variables only\")\n .option(\"-f, --format <format>\", \"Output format (json, table)\", \"json\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n fileKey: string,\n options: {\n published?: boolean;\n format: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const token = await factory.getToken(options.token);\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token });\n }\n\n const variables = options.published\n ? await client.getPublishedVariables(fileKey)\n : await client.getLocalVariables(fileKey);\n\n if (options.format === \"table\") {\n // Extract variables from the response structure\n const variableMap =\n \"meta\" in variables ? variables.meta?.variables : {};\n const tableData = Object.entries(variableMap || {}).map(\n ([id, v]) => ({\n id,\n name: (v as { name?: string }).name || \"\",\n resolvedType:\n (v as { resolvedType?: string }).resolvedType || \"\",\n })\n );\n io.out.write(\n formatOutput(tableData, {\n format: \"table\",\n columns: [\"id\", \"name\", \"resolvedType\"],\n })\n );\n } else {\n io.out.write(formatOutput(variables, { format: \"json\" }));\n }\n io.out.write(\"\\n\");\n } catch (error) {\n io.err.write(chalk.red(\"Error fetching variables.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n io.err.write(\n chalk.dim(\"\\nNote: Variables API requires Figma Enterprise plan.\\n\")\n );\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport * as fs from \"node:fs\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\n\ninterface FigmaVariable {\n id: string;\n name: string;\n key: string;\n variableCollectionId: string;\n resolvedType: string;\n valuesByMode: Record<string, unknown>;\n remote?: boolean;\n description?: string;\n hiddenFromPublishing?: boolean;\n scopes?: string[];\n}\n\ninterface FigmaVariableCollection {\n id: string;\n name: string;\n key: string;\n modes: Array<{ modeId: string; name: string }>;\n defaultModeId: string;\n remote?: boolean;\n hiddenFromPublishing?: boolean;\n}\n\nexport function createVariableExportCommand(factory: Factory): Command {\n const cmd = new Command(\"export\")\n .description(\"Export variables as design tokens (Enterprise)\")\n .argument(\"<file-key>\", \"File key\")\n .option(\n \"--format <format>\",\n \"Output format (json, css, scss, style-dictionary)\",\n \"json\"\n )\n .option(\"--mode <mode>\", \"Specific mode to export\")\n .option(\"-o, --output <file>\", \"Output file path\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n fileKey: string,\n options: {\n format: string;\n mode?: string;\n output?: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const token = await factory.getToken(options.token);\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token });\n }\n\n const response = await client.getLocalVariables(fileKey);\n const meta = response.meta;\n\n if (!meta) {\n io.err.write(chalk.red(\"No variables found in file.\\n\"));\n process.exit(1);\n }\n\n const variables = meta.variables as Record<string, FigmaVariable>;\n const collections = meta.variableCollections as Record<\n string,\n FigmaVariableCollection\n >;\n\n // Find the mode to use\n let targetModeId: string | undefined;\n if (options.mode) {\n for (const collection of Object.values(collections)) {\n const mode = collection.modes.find(\n (m) => m.name.toLowerCase() === options.mode?.toLowerCase()\n );\n if (mode) {\n targetModeId = mode.modeId;\n break;\n }\n }\n if (!targetModeId) {\n io.err.write(chalk.red(`Mode \"${options.mode}\" not found.\\n`));\n const allModes = Object.values(collections).flatMap((c) =>\n c.modes.map((m) => m.name)\n );\n io.err.write(\n chalk.dim(`Available modes: ${allModes.join(\", \")}\\n`)\n );\n process.exit(1);\n }\n }\n\n let output: string;\n\n switch (options.format) {\n case \"css\":\n output = exportToCss(variables, collections, targetModeId);\n break;\n case \"scss\":\n output = exportToScss(variables, collections, targetModeId);\n break;\n case \"style-dictionary\":\n output = exportToStyleDictionary(\n variables,\n collections,\n targetModeId\n );\n break;\n default:\n output = JSON.stringify({ variables, collections }, null, 2);\n }\n\n if (options.output) {\n fs.writeFileSync(options.output, output);\n io.out.write(chalk.green(`✓ Exported to ${options.output}\\n`));\n } else {\n io.out.write(output);\n io.out.write(\"\\n\");\n }\n } catch (error) {\n io.err.write(chalk.red(\"Error exporting variables.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n io.err.write(\n chalk.dim(\"\\nNote: Variables API requires Figma Enterprise plan.\\n\")\n );\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/\\s+/g, \"-\")\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[^a-zA-Z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .toLowerCase();\n}\n\nfunction resolveValue(\n value: unknown,\n variables: Record<string, FigmaVariable>,\n _modeId?: string\n): string {\n if (typeof value === \"object\" && value !== null) {\n // Check if it's a color (RGBA)\n if (\"r\" in value && \"g\" in value && \"b\" in value) {\n const rgba = value as { r: number; g: number; b: number; a?: number };\n const r = Math.round(rgba.r * 255);\n const g = Math.round(rgba.g * 255);\n const b = Math.round(rgba.b * 255);\n const a = rgba.a ?? 1;\n\n if (a === 1) {\n return `rgb(${r}, ${g}, ${b})`;\n }\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n }\n\n // Check if it's a variable alias\n if (\n \"type\" in value &&\n (value as { type: string }).type === \"VARIABLE_ALIAS\"\n ) {\n const aliasId = (value as unknown as { id: string }).id;\n const aliasVar = variables[aliasId];\n if (aliasVar) {\n return `var(--${toKebabCase(aliasVar.name)})`;\n }\n }\n }\n\n if (typeof value === \"number\") {\n return `${value}px`;\n }\n\n return String(value);\n}\n\nfunction exportToCss(\n variables: Record<string, FigmaVariable>,\n collections: Record<string, FigmaVariableCollection>,\n modeId?: string\n): string {\n const lines: string[] = [\":root {\"];\n\n for (const variable of Object.values(variables)) {\n const collection = collections[variable.variableCollectionId];\n const targetMode = modeId || collection?.defaultModeId;\n const value = variable.valuesByMode[targetMode];\n\n if (value !== undefined) {\n const cssName = toKebabCase(variable.name);\n const cssValue = resolveValue(value, variables, targetMode);\n lines.push(` --${cssName}: ${cssValue};`);\n }\n }\n\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n\nfunction exportToScss(\n variables: Record<string, FigmaVariable>,\n collections: Record<string, FigmaVariableCollection>,\n modeId?: string\n): string {\n const lines: string[] = [];\n\n for (const variable of Object.values(variables)) {\n const collection = collections[variable.variableCollectionId];\n const targetMode = modeId || collection?.defaultModeId;\n const value = variable.valuesByMode[targetMode];\n\n if (value !== undefined) {\n const scssName = toKebabCase(variable.name);\n const scssValue = resolveValue(value, variables, targetMode).replace(\n /var\\(--([^)]+)\\)/g,\n \"$$$1\"\n );\n lines.push(`$${scssName}: ${scssValue};`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction exportToStyleDictionary(\n variables: Record<string, FigmaVariable>,\n collections: Record<string, FigmaVariableCollection>,\n modeId?: string\n): string {\n const tokens: Record<string, unknown> = {};\n\n for (const variable of Object.values(variables)) {\n const collection = collections[variable.variableCollectionId];\n const targetMode = modeId || collection?.defaultModeId;\n const value = variable.valuesByMode[targetMode];\n\n if (value === undefined) continue;\n\n // Parse the name path (e.g., \"colors/primary/500\" -> [\"colors\", \"primary\", \"500\"])\n const pathParts = variable.name.split(\"/\").map((p) => p.trim());\n let current: Record<string, unknown> = tokens;\n\n for (let i = 0; i < pathParts.length - 1; i++) {\n const part = pathParts[i];\n if (!current[part]) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n const finalKey = pathParts[pathParts.length - 1];\n current[finalKey] = {\n value: resolveValueForStyleDictionary(value, variables, targetMode),\n type: mapTypeToStyleDictionary(variable.resolvedType),\n description: variable.description || undefined,\n };\n }\n\n return JSON.stringify(tokens, null, 2);\n}\n\nfunction resolveValueForStyleDictionary(\n value: unknown,\n variables: Record<string, FigmaVariable>,\n _modeId?: string\n): unknown {\n if (typeof value === \"object\" && value !== null) {\n // Check if it's a color (RGBA)\n if (\"r\" in value && \"g\" in value && \"b\" in value) {\n const rgba = value as { r: number; g: number; b: number; a?: number };\n const r = Math.round(rgba.r * 255)\n .toString(16)\n .padStart(2, \"0\");\n const g = Math.round(rgba.g * 255)\n .toString(16)\n .padStart(2, \"0\");\n const b = Math.round(rgba.b * 255)\n .toString(16)\n .padStart(2, \"0\");\n const a = rgba.a ?? 1;\n\n if (a === 1) {\n return `#${r}${g}${b}`;\n }\n const aHex = Math.round(a * 255)\n .toString(16)\n .padStart(2, \"0\");\n return `#${r}${g}${b}${aHex}`;\n }\n\n // Check if it's a variable alias\n if (\n \"type\" in value &&\n (value as { type: string }).type === \"VARIABLE_ALIAS\"\n ) {\n const aliasId = (value as unknown as { id: string }).id;\n const aliasVar = variables[aliasId];\n if (aliasVar) {\n return `{${aliasVar.name.replace(/\\//g, \".\")}}`;\n }\n }\n }\n\n return value;\n}\n\nfunction mapTypeToStyleDictionary(figmaType: string): string {\n switch (figmaType) {\n case \"COLOR\":\n return \"color\";\n case \"FLOAT\":\n return \"dimension\";\n case \"STRING\":\n return \"string\";\n case \"BOOLEAN\":\n return \"boolean\";\n default:\n return figmaType.toLowerCase();\n }\n}\n","import { Command } from \"commander\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { createExportTokensCommand } from \"./tokens.js\";\nimport { createExportIconsCommand } from \"./icons.js\";\nimport { createExportThemeCommand } from \"./theme.js\";\n\nexport function createExportCommand(factory: Factory): Command {\n const cmd = new Command(\"export\").description(\n \"Design-to-code export commands\"\n );\n\n cmd.addCommand(createExportTokensCommand(factory));\n cmd.addCommand(createExportIconsCommand(factory));\n cmd.addCommand(createExportThemeCommand(factory));\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport * as fs from \"node:fs\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport {\n extractStylesFromFile,\n tokensToCss,\n tokensToScss,\n tokensToStyleDictionary,\n tokensToTailwind,\n type TokenCollection,\n} from \"../../internal/transform/tokens.js\";\n\nexport function createExportTokensCommand(factory: Factory): Command {\n const cmd = new Command(\"tokens\")\n .description(\"Export design tokens from a Figma file\")\n .argument(\"<file-key>\", \"File key\")\n .option(\n \"--format <format>\",\n \"Output format (json, css, scss, style-dictionary, tailwind)\",\n \"json\"\n )\n .option(\"-o, --output <file>\", \"Output file path\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n fileKey: string,\n options: {\n format: string;\n output?: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const token = await factory.getToken(options.token);\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token });\n }\n\n io.err.write(chalk.dim(\"Fetching file styles...\\n\"));\n\n // Get file styles metadata\n const stylesResponse = await client.getFileStyles(fileKey);\n const styles = stylesResponse.meta?.styles || [];\n\n if (styles.length === 0) {\n io.err.write(\n chalk.yellow(\"No styles found in file. Trying variables...\\n\")\n );\n\n // Try to get variables instead (Enterprise feature)\n try {\n const variablesResponse = await client.getLocalVariables(fileKey);\n if (variablesResponse.meta?.variables) {\n io.err.write(\n chalk.dim(\n \"Found variables. Use 'figma variable export' for variable-based tokens.\\n\"\n )\n );\n }\n } catch {\n // Variables not available\n }\n\n process.exit(0);\n }\n\n // Get file to extract style values\n io.err.write(chalk.dim(\"Extracting token values...\\n\"));\n const file = await client.getFile(fileKey);\n\n // Extract tokens from file\n const tokens: TokenCollection = extractStylesFromFile(file, styles);\n\n let output: string;\n\n switch (options.format) {\n case \"css\":\n output = tokensToCss(tokens);\n break;\n case \"scss\":\n output = tokensToScss(tokens);\n break;\n case \"style-dictionary\":\n output = tokensToStyleDictionary(tokens);\n break;\n case \"tailwind\":\n output = tokensToTailwind(tokens);\n break;\n default:\n output = JSON.stringify(tokens, null, 2);\n }\n\n if (options.output) {\n fs.writeFileSync(options.output, output);\n io.out.write(chalk.green(`✓ Exported to ${options.output}\\n`));\n } else {\n io.out.write(output);\n io.out.write(\"\\n\");\n }\n } catch (error) {\n io.err.write(chalk.red(\"Error exporting tokens.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import type * as Figma from \"@figma/rest-api-spec\";\n\nexport interface DesignToken {\n value: string | number | Record<string, unknown>;\n type: string;\n description?: string;\n name: string;\n}\n\nexport interface ColorToken extends DesignToken {\n type: \"color\";\n value: string;\n}\n\nexport interface DimensionToken extends DesignToken {\n type: \"dimension\";\n value: string;\n}\n\nexport interface TypographyToken extends DesignToken {\n type: \"typography\";\n value: {\n fontFamily: string;\n fontSize: string;\n fontWeight: number | string;\n lineHeight: string;\n letterSpacing: string;\n };\n}\n\nexport type TokenValue =\n | ColorToken\n | DimensionToken\n | TypographyToken\n | DesignToken;\n\nexport interface TokenCollection {\n colors?: Record<string, ColorToken>;\n typography?: Record<string, TypographyToken>;\n spacing?: Record<string, DimensionToken>;\n effects?: Record<string, DesignToken>;\n}\n\n// Helper to convert Figma color to CSS\nexport function figmaColorToCss(color: {\n r: number;\n g: number;\n b: number;\n a?: number;\n}): string {\n const r = Math.round(color.r * 255);\n const g = Math.round(color.g * 255);\n const b = Math.round(color.b * 255);\n const a = color.a ?? 1;\n\n if (a === 1) {\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`;\n }\n return `rgba(${r}, ${g}, ${b}, ${a.toFixed(2)})`;\n}\n\n// Helper to convert Figma color to hex\nexport function figmaColorToHex(color: {\n r: number;\n g: number;\n b: number;\n a?: number;\n}): string {\n const r = Math.round(color.r * 255);\n const g = Math.round(color.g * 255);\n const b = Math.round(color.b * 255);\n\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`;\n}\n\n// Convert name to kebab-case\nexport function toKebabCase(str: string): string {\n return str\n .replace(/\\s+/g, \"-\")\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[^a-zA-Z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .toLowerCase();\n}\n\n// Convert name to camelCase\nexport function toCamelCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char) => char.toUpperCase())\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n}\n\n// Style type with node_id (returned by file styles API)\ntype StyleWithNodeId = Figma.Style & { node_id: string };\n\n// Extract styles from file response\nexport function extractStylesFromFile(\n file: Figma.GetFileResponse,\n styleMetadata: Array<Figma.Style | Figma.PublishedStyle>\n): TokenCollection {\n const tokens: TokenCollection = {\n colors: {},\n typography: {},\n spacing: {},\n effects: {},\n };\n\n // Map styles by their node_id\n const styleNodeMap = new Map<string, Figma.Style | Figma.PublishedStyle>();\n for (const style of styleMetadata) {\n // Handle both Style and PublishedStyle types\n const nodeId = (style as StyleWithNodeId).node_id;\n if (nodeId) {\n styleNodeMap.set(nodeId, style);\n }\n }\n\n // Traverse document to find style definitions\n function traverseNode(node: Figma.Node): void {\n const nodeWithStyles = node as Figma.Node & {\n fills?: Figma.Paint[];\n style?: Figma.TypeStyle;\n styles?: Record<string, string>;\n };\n\n // Check if this node is a style definition\n if (\"styles\" in nodeWithStyles && nodeWithStyles.styles) {\n const styles = nodeWithStyles.styles;\n\n // Fill styles (colors)\n if (styles.fill && \"fills\" in nodeWithStyles) {\n const fills = nodeWithStyles.fills;\n if (fills && fills.length > 0 && fills[0].type === \"SOLID\") {\n const fill = fills[0] as Figma.SolidPaint;\n if (fill.color) {\n const styleInfo = styleNodeMap.get(node.id);\n const styleName = styleInfo?.name || node.name;\n const tokenName = toKebabCase(styleName);\n\n tokens.colors![tokenName] = {\n name: styleName,\n type: \"color\",\n value: figmaColorToCss(fill.color),\n description: styleInfo?.description,\n };\n }\n }\n }\n\n // Text styles (typography)\n if (styles.text && \"style\" in nodeWithStyles && nodeWithStyles.style) {\n const textStyle = nodeWithStyles.style;\n const styleInfo = styleNodeMap.get(node.id);\n const styleName = styleInfo?.name || node.name;\n const tokenName = toKebabCase(styleName);\n\n tokens.typography![tokenName] = {\n name: styleName,\n type: \"typography\",\n value: {\n fontFamily: textStyle.fontFamily || \"sans-serif\",\n fontSize: `${textStyle.fontSize || 16}px`,\n fontWeight: textStyle.fontWeight || 400,\n lineHeight:\n textStyle.lineHeightPx !== undefined\n ? `${textStyle.lineHeightPx}px`\n : \"normal\",\n letterSpacing:\n textStyle.letterSpacing !== undefined\n ? `${textStyle.letterSpacing}px`\n : \"normal\",\n },\n description: styleInfo?.description,\n };\n }\n }\n\n // Recursively traverse children\n if (\"children\" in node) {\n const parent = node as { children?: Figma.Node[] };\n for (const child of parent.children || []) {\n traverseNode(child);\n }\n }\n }\n\n if (file.document) {\n traverseNode(file.document);\n }\n\n return tokens;\n}\n\n// Export to CSS variables\nexport function tokensToCss(tokens: TokenCollection): string {\n const lines: string[] = [\":root {\"];\n\n if (tokens.colors) {\n lines.push(\" /* Colors */\");\n for (const [name, token] of Object.entries(tokens.colors)) {\n lines.push(` --color-${name}: ${token.value};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.typography) {\n lines.push(\" /* Typography */\");\n for (const [name, token] of Object.entries(tokens.typography)) {\n const value = token.value as {\n fontFamily: string;\n fontSize: string;\n fontWeight: number | string;\n lineHeight: string;\n letterSpacing: string;\n };\n lines.push(` --font-${name}-family: ${value.fontFamily};`);\n lines.push(` --font-${name}-size: ${value.fontSize};`);\n lines.push(` --font-${name}-weight: ${value.fontWeight};`);\n lines.push(` --font-${name}-line-height: ${value.lineHeight};`);\n lines.push(` --font-${name}-letter-spacing: ${value.letterSpacing};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.spacing) {\n lines.push(\" /* Spacing */\");\n for (const [name, token] of Object.entries(tokens.spacing)) {\n lines.push(` --spacing-${name}: ${token.value};`);\n }\n }\n\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n\n// Export to SCSS variables\nexport function tokensToScss(tokens: TokenCollection): string {\n const lines: string[] = [];\n\n if (tokens.colors) {\n lines.push(\"// Colors\");\n for (const [name, token] of Object.entries(tokens.colors)) {\n lines.push(`$color-${name}: ${token.value};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.typography) {\n lines.push(\"// Typography\");\n for (const [name, token] of Object.entries(tokens.typography)) {\n const value = token.value as {\n fontFamily: string;\n fontSize: string;\n fontWeight: number | string;\n lineHeight: string;\n letterSpacing: string;\n };\n lines.push(`$font-${name}-family: ${value.fontFamily};`);\n lines.push(`$font-${name}-size: ${value.fontSize};`);\n lines.push(`$font-${name}-weight: ${value.fontWeight};`);\n lines.push(`$font-${name}-line-height: ${value.lineHeight};`);\n lines.push(`$font-${name}-letter-spacing: ${value.letterSpacing};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.spacing) {\n lines.push(\"// Spacing\");\n for (const [name, token] of Object.entries(tokens.spacing)) {\n lines.push(`$spacing-${name}: ${token.value};`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// Export to Style Dictionary format\nexport function tokensToStyleDictionary(tokens: TokenCollection): string {\n const output: Record<string, unknown> = {};\n\n if (tokens.colors && Object.keys(tokens.colors).length > 0) {\n output.color = {};\n for (const [name, token] of Object.entries(tokens.colors)) {\n (output.color as Record<string, unknown>)[name] = {\n value: token.value,\n type: \"color\",\n description: token.description,\n };\n }\n }\n\n if (tokens.typography && Object.keys(tokens.typography).length > 0) {\n output.typography = {};\n for (const [name, token] of Object.entries(tokens.typography)) {\n (output.typography as Record<string, unknown>)[name] = {\n value: token.value,\n type: \"typography\",\n description: token.description,\n };\n }\n }\n\n if (tokens.spacing && Object.keys(tokens.spacing).length > 0) {\n output.spacing = {};\n for (const [name, token] of Object.entries(tokens.spacing)) {\n (output.spacing as Record<string, unknown>)[name] = {\n value: token.value,\n type: \"dimension\",\n description: token.description,\n };\n }\n }\n\n return JSON.stringify(output, null, 2);\n}\n\n// Export to Tailwind config\nexport function tokensToTailwind(tokens: TokenCollection): string {\n const config: {\n theme: {\n extend: {\n colors?: Record<string, string>;\n fontFamily?: Record<string, string[]>;\n fontSize?: Record<string, string>;\n spacing?: Record<string, string>;\n };\n };\n } = {\n theme: {\n extend: {},\n },\n };\n\n if (tokens.colors && Object.keys(tokens.colors).length > 0) {\n config.theme.extend.colors = {};\n for (const [name, token] of Object.entries(tokens.colors)) {\n config.theme.extend.colors[name] = token.value;\n }\n }\n\n if (tokens.typography && Object.keys(tokens.typography).length > 0) {\n config.theme.extend.fontFamily = {};\n config.theme.extend.fontSize = {};\n for (const [name, token] of Object.entries(tokens.typography)) {\n const value = token.value as {\n fontFamily: string;\n fontSize: string;\n };\n config.theme.extend.fontFamily[name] = [value.fontFamily];\n config.theme.extend.fontSize[name] = value.fontSize;\n }\n }\n\n if (tokens.spacing && Object.keys(tokens.spacing).length > 0) {\n config.theme.extend.spacing = {};\n for (const [name, token] of Object.entries(tokens.spacing)) {\n config.theme.extend.spacing[name] = token.value;\n }\n }\n\n return `/** @type {import('tailwindcss').Config} */\nmodule.exports = ${JSON.stringify(config, null, 2)};`;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport type * as Figma from \"@figma/rest-api-spec\";\nimport { toKebabCase } from \"../../internal/transform/tokens.js\";\nimport { downloadFiles } from \"../../internal/download/index.js\";\n\nexport function createExportIconsCommand(factory: Factory): Command {\n const cmd = new Command(\"icons\")\n .description(\"Export icons from a Figma file\")\n .argument(\"<file-key>\", \"File key\")\n .option(\n \"--frame <name>\",\n \"Name of frame/page containing icons (searches all pages if not specified)\"\n )\n .option(\"--format <format>\", \"Export format (svg, png)\", \"svg\")\n .option(\"-s, --scale <scale>\", \"Scale factor for PNG export\", parseFloat, 1)\n .option(\"-o, --output <dir>\", \"Output directory\", \"./icons\")\n .option(\"--prefix <prefix>\", \"Prefix for icon filenames\", \"icon-\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n fileKey: string,\n options: {\n frame?: string;\n format: string;\n scale: number;\n output: string;\n prefix: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n // Validate format option\n const validFormats = [\"svg\", \"png\"] as const;\n type IconFormat = (typeof validFormats)[number];\n if (!validFormats.includes(options.format as IconFormat)) {\n io.err.write(\n chalk.red(\n `Invalid format \"${options.format}\". Valid formats: ${validFormats.join(\", \")}\\n`\n )\n );\n process.exit(1);\n }\n const imageFormat = options.format as IconFormat;\n\n try {\n const token = await factory.getToken(options.token);\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token });\n }\n\n io.err.write(chalk.dim(\"Fetching file structure...\\n\"));\n\n // Get file structure\n const file = await client.getFile(fileKey, { depth: 2 });\n\n // Find icon nodes\n const iconNodes: Array<{ id: string; name: string }> = [];\n\n function findIcons(node: Figma.Node, inTargetFrame: boolean): void {\n // Check if we're looking for a specific frame\n if (options.frame) {\n if (\n node.name.toLowerCase() === options.frame.toLowerCase() &&\n (node.type === \"FRAME\" ||\n node.type === \"CANVAS\" ||\n node.type === \"COMPONENT\")\n ) {\n inTargetFrame = true;\n }\n } else {\n inTargetFrame = true;\n }\n\n // Collect components and frames as potential icons\n if (inTargetFrame) {\n if (\n node.type === \"COMPONENT\" ||\n node.type === \"INSTANCE\" ||\n (node.type === \"FRAME\" &&\n !(\"children\" in node && hasDeepChildren(node)))\n ) {\n iconNodes.push({ id: node.id, name: node.name });\n }\n }\n\n // Recursively search children\n if (\"children\" in node) {\n const parent = node as { children?: Figma.Node[] };\n for (const child of parent.children || []) {\n findIcons(child, inTargetFrame);\n }\n }\n }\n\n function hasDeepChildren(node: Figma.Node): boolean {\n if (!(\"children\" in node)) return false;\n const parent = node as { children?: Figma.Node[] };\n return (parent.children || []).some(\n (child: Figma.Node) =>\n child.type === \"FRAME\" ||\n child.type === \"COMPONENT\" ||\n child.type === \"GROUP\"\n );\n }\n\n // Search through document\n if (file.document) {\n findIcons(file.document, false);\n }\n\n if (iconNodes.length === 0) {\n io.err.write(chalk.yellow(\"No icons found in file.\\n\"));\n if (options.frame) {\n io.err.write(\n chalk.dim(`Looking for frame: \"${options.frame}\"\\n`)\n );\n }\n process.exit(0);\n }\n\n io.err.write(\n chalk.dim(`Found ${iconNodes.length} icons. Exporting...\\n`)\n );\n\n // Get image URLs\n const nodeIds = iconNodes.map((n) => n.id);\n\n const imagesResponse = await client.getImages(fileKey, nodeIds, {\n format: imageFormat,\n scale: options.scale,\n svg_include_id: false,\n svg_simplify_stroke: true,\n });\n\n const imageUrls = imagesResponse.images || {};\n\n // Prepare download items\n const downloadItems = iconNodes.map((node) => ({\n id: node.id,\n name: node.name,\n url: imageUrls[node.id] ?? null,\n filename: `${options.prefix}${toKebabCase(node.name)}.${imageFormat}`,\n }));\n\n // Download icons\n const results = await downloadFiles(downloadItems, options.output);\n\n // Report results\n const successCount = results.filter(\n (r) => r.status === \"success\"\n ).length;\n const failures = results.filter((r) => r.status === \"error\");\n\n for (const failure of failures) {\n io.err.write(\n chalk.yellow(\n `Warning: Failed to download \"${failure.name ?? failure.id}\": ${failure.error}\\n`\n )\n );\n }\n\n // Status messages go to stderr, data goes to stdout\n io.err.write(\n chalk.green(`Exported ${successCount} icons to ${options.output}\\n`)\n );\n if (failures.length > 0) {\n io.err.write(chalk.yellow(`${failures.length} icons failed\\n`));\n process.exit(1);\n }\n } catch (error) {\n io.err.write(chalk.red(\"Error exporting icons.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport {\n extractStylesFromFile,\n tokensToCss,\n tokensToScss,\n tokensToStyleDictionary,\n tokensToTailwind,\n} from \"../../internal/transform/tokens.js\";\n\nexport function createExportThemeCommand(factory: Factory): Command {\n const cmd = new Command(\"theme\")\n .description(\"Export complete theme package from a Figma file\")\n .argument(\"<file-key>\", \"File key\")\n .option(\"-o, --output <dir>\", \"Output directory\", \"./theme\")\n .option(\n \"--formats <formats>\",\n \"Comma-separated list of formats (json, css, scss, style-dictionary, tailwind)\",\n \"json,css\"\n )\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n fileKey: string,\n options: {\n output: string;\n formats: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const token = await factory.getToken(options.token);\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token });\n }\n\n io.err.write(chalk.dim(\"Fetching file styles...\\n\"));\n\n // Get file styles metadata\n const stylesResponse = await client.getFileStyles(fileKey);\n const styles = stylesResponse.meta?.styles || [];\n\n // Get file to extract style values\n io.err.write(chalk.dim(\"Extracting token values...\\n\"));\n const file = await client.getFile(fileKey);\n\n // Extract tokens from file\n const tokens = extractStylesFromFile(file, styles);\n\n // Create output directory\n if (!fs.existsSync(options.output)) {\n fs.mkdirSync(options.output, { recursive: true });\n }\n\n const formats = options.formats.split(\",\").map((f) => f.trim());\n const outputs: string[] = [];\n\n for (const format of formats) {\n let output: string;\n let filename: string;\n\n switch (format) {\n case \"css\":\n output = tokensToCss(tokens);\n filename = \"tokens.css\";\n break;\n case \"scss\":\n output = tokensToScss(tokens);\n filename = \"_tokens.scss\";\n break;\n case \"style-dictionary\":\n output = tokensToStyleDictionary(tokens);\n filename = \"tokens.style-dictionary.json\";\n break;\n case \"tailwind\":\n output = tokensToTailwind(tokens);\n filename = \"tailwind.tokens.js\";\n break;\n case \"json\":\n default:\n output = JSON.stringify(tokens, null, 2);\n filename = \"tokens.json\";\n }\n\n const filepath = path.join(options.output, filename);\n fs.writeFileSync(filepath, output);\n outputs.push(filename);\n }\n\n // Also save file metadata\n const metadata = {\n name: file.name,\n lastModified: file.lastModified,\n version: file.version,\n exportedAt: new Date().toISOString(),\n formats: formats,\n };\n fs.writeFileSync(\n path.join(options.output, \"metadata.json\"),\n JSON.stringify(metadata, null, 2)\n );\n\n io.out.write(chalk.green(`✓ Theme exported to ${options.output}\\n`));\n io.out.write(chalk.dim(\" Files:\\n\"));\n for (const filename of outputs) {\n io.out.write(chalk.dim(` - ${filename}\\n`));\n }\n io.out.write(chalk.dim(\" - metadata.json\\n\"));\n } catch (error) {\n io.err.write(chalk.red(\"Error exporting theme.\\n\"));\n if (error instanceof Error) {\n io.err.write(chalk.dim(`${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n return cmd;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { FigmaClient, FigmaApiError } from \"../../api/client.js\";\n\nexport function createApiCommand(factory: Factory): Command {\n const cmd = new Command(\"api\")\n .description(\"Make direct API requests to Figma\")\n .argument(\"<path>\", \"API path (e.g., /v1/files/:key)\")\n .option(\"-X, --method <method>\", \"HTTP method\", \"GET\")\n .option(\"-d, --data <json>\", \"Request body as JSON\")\n .option(\"-q, --query <params>\", \"Query parameters (key=value,key2=value2)\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .option(\"--raw\", \"Output raw response without formatting\")\n .action(\n async (\n apiPath: string,\n options: {\n method: string;\n data?: string;\n query?: string;\n token?: string;\n raw?: boolean;\n }\n ) => {\n const { io } = factory;\n\n try {\n const token = await factory.getToken(options.token);\n // Use base URL without /v1 so users can pass full paths like /v1/me\n const client = new FigmaClient({\n token,\n baseUrl: \"https://api.figma.com\",\n });\n\n // Parse query parameters\n let params: Record<string, string> | undefined;\n if (options.query) {\n params = {};\n const pairs = options.query.split(\",\");\n for (const pair of pairs) {\n const [key, value] = pair.split(\"=\");\n if (key && value !== undefined) {\n params[key.trim()] = value.trim();\n }\n }\n }\n\n // Parse request body\n let body: unknown;\n if (options.data) {\n try {\n body = JSON.parse(options.data);\n } catch {\n io.err.write(chalk.red(\"Error: Invalid JSON in --data\\n\"));\n process.exit(1);\n }\n }\n\n // Make API request\n const response = await client.api(options.method, apiPath, {\n params,\n body,\n });\n\n // Output response\n if (options.raw) {\n io.out.write(JSON.stringify(response));\n } else {\n io.out.write(JSON.stringify(response, null, 2));\n }\n io.out.write(\"\\n\");\n } catch (error) {\n if (error instanceof FigmaApiError) {\n io.err.write(\n chalk.red(`API Error: ${error.status} ${error.statusText}\\n`)\n );\n if (error.body) {\n io.err.write(chalk.dim(JSON.stringify(error.body, null, 2)));\n io.err.write(\"\\n\");\n }\n } else if (error instanceof Error) {\n io.err.write(chalk.red(`Error: ${error.message}\\n`));\n }\n process.exit(1);\n }\n }\n );\n\n // Add helpful examples to the description\n cmd.addHelpText(\n \"after\",\n `\nExamples:\n $ figma api /v1/me\n $ figma api /v1/files/abc123\n $ figma api /v1/teams/12345/projects\n $ figma api /v1/files/abc123/comments -X POST -d '{\"message\":\"Hello\"}'\n $ figma api /v1/files/abc123/images -q \"ids=1:2,format=svg\"\n`\n );\n\n return cmd;\n}\n","import { createFactory } from \"./pkg/cmdutil/index.js\";\nimport { createRootCommand } from \"./cmd/root.js\";\n\nasync function main(): Promise<void> {\n const factory = createFactory();\n const program = createRootCommand(factory);\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.message);\n }\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["path","fs","path","os","URL","Command","Command","chalk","chalk","Command","chalk","Command","chalk","Command","Command","Command","chalk","Command","FigmaClient","file","chalk","Command","chalk","Command","FigmaClient","nodes","chalk","Command","chalk","fs","path","DEFAULT_TIMEOUT_MS","Command","chalk","FigmaClient","Command","Command","Command","chalk","Command","FigmaClient","chalk","Command","chalk","Command","FigmaClient","chalk","Command","Command","Command","chalk","Command","chalk","FigmaClient","Command","chalk","Command","FigmaClient","chalk","Command","Command","Command","chalk","Command","chalk","FigmaClient","Command","chalk","Command","FigmaClient","chalk","Command","Command","Command","chalk","Command","FigmaClient","chalk","Command","chalk","fs","FigmaClient","Command","Command","Command","chalk","fs","toKebabCase","toKebabCase","Command","FigmaClient","chalk","Command","chalk","Command","chalk","findIcons","hasDeepChildren","FigmaClient","toKebabCase","Command","chalk","fs","path","Command","FigmaClient","chalk","Command","Command","chalk","Command"]}
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "@mstrathman/figma",
3
+ "version": "0.1.0",
4
+ "description": "A CLI for interacting with the Figma API, inspired by GitHub's gh CLI",
5
+ "type": "module",
6
+ "bin": {
7
+ "figma": "dist/main.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "CHANGELOG.md"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "import": "./dist/main.js",
16
+ "types": "./dist/main.d.ts"
17
+ }
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/mstrathman/figma.git"
22
+ },
23
+ "bugs": {
24
+ "url": "https://github.com/mstrathman/figma/issues"
25
+ },
26
+ "homepage": "https://github.com/mstrathman/figma#readme",
27
+ "author": "mstrathman",
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "dev": "tsup --watch",
34
+ "start": "node dist/main.js",
35
+ "test": "vitest",
36
+ "typecheck": "tsc --noEmit",
37
+ "lint": "eslint src/",
38
+ "lint:fix": "eslint src/ --fix",
39
+ "format": "prettier --write .",
40
+ "format:check": "prettier --check .",
41
+ "figma": "node dist/main.js",
42
+ "prepublishOnly": "npm run lint && npm run typecheck && npm run test -- --run && npm run build",
43
+ "prepare": "husky"
44
+ },
45
+ "dependencies": {
46
+ "@figma/rest-api-spec": "^0.21.0",
47
+ "chalk": "^5.4.1",
48
+ "cli-table3": "^0.6.5",
49
+ "commander": "^13.1.0",
50
+ "enquirer": "^2.4.1",
51
+ "keytar": "^7.9.0"
52
+ },
53
+ "devDependencies": {
54
+ "@eslint/js": "^9.17.0",
55
+ "@types/node": "^22.12.0",
56
+ "eslint": "^9.17.0",
57
+ "globals": "^15.14.0",
58
+ "husky": "^9.1.7",
59
+ "lint-staged": "^15.3.0",
60
+ "prettier": "^3.4.2",
61
+ "tsup": "^8.3.6",
62
+ "typescript": "^5.7.3",
63
+ "typescript-eslint": "^8.19.1",
64
+ "vitest": "^3.0.4"
65
+ },
66
+ "lint-staged": {
67
+ "*.ts": [
68
+ "eslint --fix",
69
+ "prettier --write"
70
+ ]
71
+ },
72
+ "engines": {
73
+ "node": ">=18.0.0"
74
+ },
75
+ "keywords": [
76
+ "figma",
77
+ "cli",
78
+ "design-tokens",
79
+ "design-system"
80
+ ],
81
+ "license": "MIT"
82
+ }