@mstrathman/figma 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
package/dist/main.js.map
CHANGED
|
@@ -1 +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/internal/url/parser.ts","../src/cmd/file/nodes.ts","../src/cmd/file/images.ts","../src/internal/download/index.ts","../src/internal/transform/tokens.ts","../src/cmd/file/structure.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/cmd/export/icons.ts","../src/cmd/export/theme.ts","../src/cmd/api/index.ts","../src/cmd/frame/index.ts","../src/cmd/frame/list.ts","../src/cmd/handoff/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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\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\";\nimport { createFrameCommand } from \"./frame/index.js\";\nimport { createHandoffCommand } from \"./handoff/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(createFrameCommand(factory));\n program.addCommand(createHandoffCommand(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\";\nimport { createFileStructureCommand } from \"./structure.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 cmd.addCommand(createFileStructureCommand(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\";\nimport { parseFigmaInput, parseNodeIds } from \"../../internal/url/index.js\";\n\nexport function createFileGetCommand(factory: Factory): Command {\n const cmd = new Command(\"get\")\n .description(\"Get file JSON structure\")\n .argument(\"<url>\", \"Figma URL or file key\")\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(\"--id <ids>\", \"Comma-separated node IDs (overrides URL node-id)\")\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 url: string,\n options: {\n version?: string;\n depth?: number;\n id?: string;\n geometry?: string;\n format: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n\n // --id flag overrides URL node-id, otherwise use URL node-id\n let nodeIds: string[] | undefined;\n if (options.id) {\n nodeIds = parseNodeIds(options.id);\n } else if (parsed.nodeId) {\n nodeIds = [parsed.nodeId];\n }\n\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: options.token });\n const file = await overrideClient.getFile(fileKey, {\n version: options.version,\n depth: options.depth,\n ids: nodeIds,\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: nodeIds,\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 {\n parseFileAndNodeId,\n parseFileId,\n formatNodeId,\n} from \"@design-sdk/figma-url\";\n\nexport interface ParsedFigmaInput {\n fileKey: string;\n nodeId?: string;\n}\n\n/**\n * Parses a Figma URL or raw file key into its components.\n *\n * Supported inputs:\n * - Raw file key: \"abc123XYZ\"\n * - File URL: \"https://www.figma.com/file/abc123XYZ/Name\"\n * - Design URL: \"https://www.figma.com/design/abc123XYZ/Name\"\n * - URL with node-id: \"https://www.figma.com/file/abc123XYZ/Name?node-id=1-2\"\n *\n * Note: URLs must include \"www.\" prefix (library limitation).\n *\n * @returns fileKey and optional nodeId (normalized to colon format \"1:2\")\n * @throws Error if URL contains figma.com but cannot be parsed\n */\nexport function parseFigmaInput(input: string): ParsedFigmaInput {\n const trimmed = input.trim();\n\n // Check if it's a URL\n if (trimmed.includes(\"figma.com/\")) {\n const result = parseFileAndNodeId(trimmed);\n if (result) {\n return {\n fileKey: result.file,\n nodeId: result.node || undefined,\n };\n }\n // Fallback to just file ID\n try {\n const fileKey = parseFileId(trimmed);\n return { fileKey };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Could not parse Figma URL: ${trimmed}. ${message}`);\n }\n }\n\n // Treat as raw file key\n return { fileKey: trimmed };\n}\n\n/**\n * Parses and normalizes node IDs from comma-separated input.\n * Converts hyphen format (1-2) to colon format (1:2).\n * Throws an error if any node IDs are invalid.\n */\nexport function parseNodeIds(input: string): string[] {\n const rawIds = input\n .split(\",\")\n .map((id) => id.trim())\n .filter(Boolean);\n const validIds: string[] = [];\n const invalidIds: string[] = [];\n\n for (const id of rawIds) {\n const formatted = formatNodeId(id);\n if (formatted) {\n validIds.push(formatted);\n } else {\n invalidIds.push(id);\n }\n }\n\n if (invalidIds.length > 0) {\n throw new Error(\n `Invalid node ID(s): ${invalidIds.join(\", \")}. ` +\n `Node IDs should be in format \"1:2\" or \"1-2\".`\n );\n }\n\n return validIds;\n}\n\nexport { formatNodeId };\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 { parseFigmaInput, parseNodeIds } from \"../../internal/url/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(\"<url>\", \"Figma URL (with node-id) or file key\")\n .option(\"--id <ids>\", \"Comma-separated node IDs (overrides URL node-id)\")\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 url: string,\n options: {\n id?: 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 parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n\n // --id flag overrides URL node-id\n let nodeIds: string[];\n if (options.id) {\n nodeIds = parseNodeIds(options.id);\n } else if (parsed.nodeId) {\n nodeIds = [parsed.nodeId];\n } else {\n io.err.write(\n chalk.red(\n \"Error: node ID required. Use a URL with node-id or --id flag.\\n\"\n )\n );\n process.exit(1);\n }\n\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 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\";\nimport { parseFigmaInput, parseNodeIds } from \"../../internal/url/index.js\";\nimport { toKebabCase } from \"../../internal/transform/tokens.js\";\nimport type * as Figma from \"@figma/rest-api-spec\";\n\ntype NamingStrategy = \"id\" | \"name\" | \"path\";\n\ninterface NodeInfo {\n name: string;\n parentNames: string[];\n}\n\n// Get node information for naming\nfunction getNodeInfoMap(\n nodes: Record<string, { document: Figma.Node }>,\n nodeIds: string[]\n): Map<string, NodeInfo> {\n const nodeInfoMap = new Map<string, NodeInfo>();\n\n for (const nodeId of nodeIds) {\n const nodeData = nodes[nodeId];\n if (nodeData && nodeData.document) {\n const node = nodeData.document;\n // Figma uses \"/\" as a path separator in node names (e.g., \"Icons/Nav/Arrow\")\n const nameParts = node.name.split(\"/\");\n const name = nameParts[nameParts.length - 1]; // Leaf name\n const parentNames = nameParts.slice(0, -1); // Path segments before the leaf\n\n nodeInfoMap.set(nodeId, {\n name,\n parentNames,\n });\n }\n }\n\n return nodeInfoMap;\n}\n\n// Generate filename based on naming strategy\nfunction generateFilename(\n nodeId: string,\n nodeInfo: NodeInfo | undefined,\n namingStrategy: NamingStrategy,\n format: string,\n isVariant: boolean,\n variantSuffix?: string\n): string {\n let baseName: string;\n\n switch (namingStrategy) {\n case \"name\":\n if (nodeInfo) {\n baseName = toKebabCase(nodeInfo.name);\n } else {\n baseName = sanitizeFilename(nodeId);\n }\n break;\n case \"path\":\n if (nodeInfo && nodeInfo.parentNames.length > 0) {\n const pathParts = [...nodeInfo.parentNames, nodeInfo.name];\n baseName = pathParts.map((p) => toKebabCase(p)).join(\"--\");\n } else if (nodeInfo) {\n baseName = toKebabCase(nodeInfo.name);\n } else {\n baseName = sanitizeFilename(nodeId);\n }\n break;\n case \"id\":\n default:\n baseName = sanitizeFilename(nodeId);\n break;\n }\n\n if (isVariant && variantSuffix) {\n baseName = `${baseName}--${toKebabCase(variantSuffix)}`;\n }\n\n return `${baseName}.${format}`;\n}\n\nexport function createFileImagesCommand(factory: Factory): Command {\n const cmd = new Command(\"images\")\n .description(\"Export images from a file\")\n .argument(\"<url>\", \"Figma URL (with node-id) or file key\")\n .option(\"--id <ids>\", \"Comma-separated node IDs (overrides URL node-id)\")\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(\n \"--naming <strategy>\",\n \"Naming strategy: id, name, or path (default: id)\",\n \"id\"\n )\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n url: string,\n options: {\n id?: string;\n scale: number;\n format: string;\n svgIncludeId?: boolean;\n svgSimplifyStroke?: boolean;\n output?: string;\n outputFormat: string;\n naming: 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 // Validate scale option\n if (isNaN(options.scale) || options.scale < 0.01 || options.scale > 4) {\n io.err.write(\n chalk.red(\n `Invalid scale \"${options.scale}\". Scale must be between 0.01 and 4.\\n`\n )\n );\n process.exit(1);\n }\n\n // Validate naming strategy before making API calls\n const validNamingStrategies = [\"id\", \"name\", \"path\"] as const;\n if (!validNamingStrategies.includes(options.naming as NamingStrategy)) {\n io.err.write(\n chalk.red(\n `Invalid naming strategy \"${options.naming}\". Valid strategies: ${validNamingStrategies.join(\", \")}\\n`\n )\n );\n process.exit(1);\n }\n const namingStrategy = options.naming as NamingStrategy;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n\n // --id flag overrides URL node-id\n let nodeIds: string[];\n if (options.id) {\n nodeIds = parseNodeIds(options.id);\n } else if (parsed.nodeId) {\n nodeIds = [parsed.nodeId];\n } else {\n io.err.write(\n chalk.red(\n \"Error: node ID required. Use a URL with node-id or --id flag.\\n\"\n )\n );\n process.exit(1);\n }\n\n const client = await factory.getClient();\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: options.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 if (Object.keys(imageUrls).length === 0) {\n io.err.write(\n chalk.yellow(\n \"Warning: No image URLs returned from Figma API.\\n\"\n )\n );\n }\n\n // Fetch node info if using name or path naming strategy\n let nodeInfoMap = new Map<string, NodeInfo>();\n if (namingStrategy === \"name\" || namingStrategy === \"path\") {\n try {\n const nodesResponse = await activeClient.getFileNodes(\n fileKey,\n nodeIds\n );\n nodeInfoMap = getNodeInfoMap(nodesResponse.nodes, nodeIds);\n } catch (fetchError) {\n // Fallback to ID naming if node fetch fails\n const errorMsg =\n fetchError instanceof Error\n ? fetchError.message\n : String(fetchError);\n io.err.write(\n chalk.yellow(\n `Warning: Could not fetch node names (${errorMsg}), falling back to ID naming.\\n`\n )\n );\n }\n }\n\n const downloadItems = Object.entries(imageUrls).map(\n ([nodeId, url]) => {\n const nodeInfo = nodeInfoMap.get(nodeId);\n const filename = generateFilename(\n nodeId,\n nodeInfo,\n namingStrategy,\n imageFormat,\n false\n );\n return {\n id: nodeId,\n url: url ?? null,\n filename,\n };\n }\n );\n\n const results = await downloadFiles(downloadItems, options.output);\n\n // Check for failures\n const failures = results.filter((r) => r.status === \"error\");\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\n if (failures.length > 0) {\n io.err.write(\n chalk.yellow(\n `${failures.length} image(s) failed to download.\\n`\n )\n );\n process.exit(1);\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 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 interface ShadowToken extends DesignToken {\n type: \"shadow\";\n value: {\n x: number;\n y: number;\n blur: number;\n spread: number;\n color: string;\n inset?: boolean;\n };\n}\n\nexport interface RadiusToken extends DesignToken {\n type: \"radius\";\n value: string;\n}\n\nexport interface SpacingToken extends DesignToken {\n type: \"spacing\";\n value: string;\n}\n\n// GenericToken for tokens that don't fit a specific category\nexport interface GenericToken extends DesignToken {\n type: \"generic\";\n}\n\nexport type TokenValue =\n | ColorToken\n | DimensionToken\n | TypographyToken\n | ShadowToken\n | RadiusToken\n | SpacingToken\n | GenericToken;\n\nexport interface TokenCollection {\n colors?: Record<string, ColorToken>;\n typography?: Record<string, TypographyToken>;\n shadows?: Record<string, ShadowToken>;\n radii?: Record<string, RadiusToken>;\n spacing?: Record<string, SpacingToken>;\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// Helper to convert shadow effect to CSS box-shadow value\nexport function shadowToCss(shadow: {\n x: number;\n y: number;\n blur: number;\n spread: number;\n color: string;\n inset?: boolean;\n}): string {\n const inset = shadow.inset ? \"inset \" : \"\";\n return `${inset}${shadow.x}px ${shadow.y}px ${shadow.blur}px ${shadow.spread}px ${shadow.color}`;\n}\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 shadows: {},\n radii: {},\n spacing: {},\n effects: {},\n };\n\n // Track unique radii and spacing values\n const seenRadii = new Set<string>();\n const seenSpacing = new Set<string>();\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 effects?: Figma.Effect[];\n cornerRadius?: number;\n rectangleCornerRadii?: [number, number, number, number];\n paddingLeft?: number;\n paddingRight?: number;\n paddingTop?: number;\n paddingBottom?: number;\n itemSpacing?: number;\n layoutMode?: \"NONE\" | \"HORIZONTAL\" | \"VERTICAL\";\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 // Effect styles (shadows)\n if (\n styles.effect &&\n \"effects\" in nodeWithStyles &&\n nodeWithStyles.effects\n ) {\n const effects = nodeWithStyles.effects;\n const styleInfo = styleNodeMap.get(node.id);\n const styleName = styleInfo?.name || node.name;\n const baseTokenName = toKebabCase(styleName);\n\n // Extract shadow effects - handle multiple shadows with index suffix\n let shadowIndex = 0;\n for (const effect of effects) {\n if (\n (effect.type === \"DROP_SHADOW\" || effect.type === \"INNER_SHADOW\") &&\n effect.visible !== false\n ) {\n const shadowEffect = effect as\n | Figma.DropShadowEffect\n | Figma.InnerShadowEffect;\n const colorValue = shadowEffect.color\n ? figmaColorToCss(shadowEffect.color)\n : \"rgba(0, 0, 0, 0.25)\";\n\n // Use index suffix if multiple shadows, otherwise use base name\n const tokenName =\n shadowIndex === 0\n ? baseTokenName\n : `${baseTokenName}-${shadowIndex}`;\n\n tokens.shadows![tokenName] = {\n name:\n shadowIndex === 0\n ? styleName\n : `${styleName} ${shadowIndex + 1}`,\n type: \"shadow\",\n value: {\n x: shadowEffect.offset?.x ?? 0,\n y: shadowEffect.offset?.y ?? 0,\n blur: shadowEffect.radius ?? 0,\n spread: shadowEffect.spread ?? 0,\n color: colorValue,\n inset: effect.type === \"INNER_SHADOW\",\n },\n description: styleInfo?.description,\n };\n shadowIndex++;\n }\n }\n }\n }\n\n // Extract corner radius from frames/components (not tied to styles)\n if (\n \"cornerRadius\" in nodeWithStyles &&\n nodeWithStyles.cornerRadius !== undefined\n ) {\n const radius = nodeWithStyles.cornerRadius;\n if (radius > 0) {\n const radiusValue = `${radius}px`;\n if (!seenRadii.has(radiusValue)) {\n seenRadii.add(radiusValue);\n const tokenName = `radius-${radius}`;\n tokens.radii![tokenName] = {\n name: `Radius ${radius}`,\n type: \"radius\",\n value: radiusValue,\n };\n }\n }\n }\n\n // Extract individual corner radii if different\n if (\n \"rectangleCornerRadii\" in nodeWithStyles &&\n nodeWithStyles.rectangleCornerRadii\n ) {\n const [topLeft, topRight, bottomRight, bottomLeft] =\n nodeWithStyles.rectangleCornerRadii;\n for (const radius of [topLeft, topRight, bottomRight, bottomLeft]) {\n if (radius > 0) {\n const radiusValue = `${radius}px`;\n if (!seenRadii.has(radiusValue)) {\n seenRadii.add(radiusValue);\n const tokenName = `radius-${radius}`;\n tokens.radii![tokenName] = {\n name: `Radius ${radius}`,\n type: \"radius\",\n value: radiusValue,\n };\n }\n }\n }\n }\n\n // Extract spacing from auto-layout properties\n if (\n \"layoutMode\" in nodeWithStyles &&\n nodeWithStyles.layoutMode !== \"NONE\"\n ) {\n // Item spacing (gap)\n if (\n nodeWithStyles.itemSpacing !== undefined &&\n nodeWithStyles.itemSpacing > 0\n ) {\n const spacingValue = `${nodeWithStyles.itemSpacing}px`;\n if (!seenSpacing.has(spacingValue)) {\n seenSpacing.add(spacingValue);\n const tokenName = `spacing-${nodeWithStyles.itemSpacing}`;\n tokens.spacing![tokenName] = {\n name: `Spacing ${nodeWithStyles.itemSpacing}`,\n type: \"spacing\",\n value: spacingValue,\n };\n }\n }\n\n // Padding values\n const paddings = [\n nodeWithStyles.paddingTop,\n nodeWithStyles.paddingRight,\n nodeWithStyles.paddingBottom,\n nodeWithStyles.paddingLeft,\n ];\n for (const padding of paddings) {\n if (padding !== undefined && padding > 0) {\n const spacingValue = `${padding}px`;\n if (!seenSpacing.has(spacingValue)) {\n seenSpacing.add(spacingValue);\n const tokenName = `spacing-${padding}`;\n tokens.spacing![tokenName] = {\n name: `Spacing ${padding}`,\n type: \"spacing\",\n value: spacingValue,\n };\n }\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 && Object.keys(tokens.colors).length > 0) {\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 && Object.keys(tokens.typography).length > 0) {\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.shadows && Object.keys(tokens.shadows).length > 0) {\n lines.push(\" /* Shadows */\");\n for (const [name, token] of Object.entries(tokens.shadows)) {\n const value = token.value;\n const shadowCss = shadowToCss(value);\n lines.push(` --shadow-${name}: ${shadowCss};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.radii && Object.keys(tokens.radii).length > 0) {\n lines.push(\" /* Border Radii */\");\n for (const [name, token] of Object.entries(tokens.radii)) {\n lines.push(` --${name}: ${token.value};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.spacing && Object.keys(tokens.spacing).length > 0) {\n lines.push(\" /* Spacing */\");\n for (const [name, token] of Object.entries(tokens.spacing)) {\n lines.push(` --${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 && Object.keys(tokens.colors).length > 0) {\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 && Object.keys(tokens.typography).length > 0) {\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.shadows && Object.keys(tokens.shadows).length > 0) {\n lines.push(\"// Shadows\");\n for (const [name, token] of Object.entries(tokens.shadows)) {\n const value = token.value;\n const shadowCss = shadowToCss(value);\n lines.push(`$shadow-${name}: ${shadowCss};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.radii && Object.keys(tokens.radii).length > 0) {\n lines.push(\"// Border Radii\");\n for (const [name, token] of Object.entries(tokens.radii)) {\n lines.push(`$${name}: ${token.value};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.spacing && Object.keys(tokens.spacing).length > 0) {\n lines.push(\"// Spacing\");\n for (const [name, token] of Object.entries(tokens.spacing)) {\n lines.push(`$${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.shadows && Object.keys(tokens.shadows).length > 0) {\n output.shadow = {};\n for (const [name, token] of Object.entries(tokens.shadows)) {\n (output.shadow as Record<string, unknown>)[name] = {\n value: token.value,\n type: \"shadow\",\n description: token.description,\n };\n }\n }\n\n if (tokens.radii && Object.keys(tokens.radii).length > 0) {\n output.borderRadius = {};\n for (const [name, token] of Object.entries(tokens.radii)) {\n (output.borderRadius as Record<string, unknown>)[name] = {\n value: token.value,\n type: \"dimension\",\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 boxShadow?: Record<string, string>;\n borderRadius?: 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.shadows && Object.keys(tokens.shadows).length > 0) {\n config.theme.extend.boxShadow = {};\n for (const [name, token] of Object.entries(tokens.shadows)) {\n config.theme.extend.boxShadow[name] = shadowToCss(token.value);\n }\n }\n\n if (tokens.radii && Object.keys(tokens.radii).length > 0) {\n config.theme.extend.borderRadius = {};\n for (const [name, token] of Object.entries(tokens.radii)) {\n config.theme.extend.borderRadius[name] = token.value;\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 { parseFigmaInput } from \"../../internal/url/index.js\";\nimport type * as Figma from \"@figma/rest-api-spec\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nexport interface SimplifiedFrame {\n id: string;\n name: string;\n type: string;\n width?: number;\n height?: number;\n children?: SimplifiedFrame[];\n}\n\nexport interface SimplifiedPage {\n id: string;\n name: string;\n frames: SimplifiedFrame[];\n}\n\nexport interface SimplifiedStructure {\n name: string;\n lastModified: string;\n version?: string;\n pages: SimplifiedPage[];\n}\n\nfunction extractFrameInfo(\n node: Figma.Node,\n currentDepth: number,\n maxDepth: number,\n includeHidden: boolean\n): SimplifiedFrame | null {\n const nodeWithBounds = node as Figma.Node & {\n absoluteBoundingBox?: { width: number; height: number };\n visible?: boolean;\n };\n\n // Skip hidden nodes unless includeHidden is true\n if (!includeHidden && nodeWithBounds.visible === false) {\n return null;\n }\n\n // Only include structural node types relevant for design hierarchy\n const relevantTypes = [\n \"FRAME\",\n \"COMPONENT\",\n \"COMPONENT_SET\",\n \"SECTION\",\n \"GROUP\",\n \"INSTANCE\",\n ];\n if (!relevantTypes.includes(node.type)) {\n return null;\n }\n\n const frame: SimplifiedFrame = {\n id: node.id,\n name: node.name,\n type: node.type,\n };\n\n if (nodeWithBounds.absoluteBoundingBox) {\n frame.width = Math.round(nodeWithBounds.absoluteBoundingBox.width);\n frame.height = Math.round(nodeWithBounds.absoluteBoundingBox.height);\n }\n\n // Include children if within depth limit\n if (currentDepth < maxDepth && \"children\" in node) {\n const parent = node as { children?: Figma.Node[] };\n const children = (parent.children || [])\n .map((child) =>\n extractFrameInfo(child, currentDepth + 1, maxDepth, includeHidden)\n )\n .filter((child): child is SimplifiedFrame => child !== null);\n\n if (children.length > 0) {\n frame.children = children;\n }\n }\n\n return frame;\n}\n\nfunction extractStructure(\n file: Figma.GetFileResponse,\n maxDepth: number,\n includeHidden: boolean\n): SimplifiedStructure {\n const pages: SimplifiedPage[] = [];\n\n if (file.document && \"children\" in file.document) {\n const doc = file.document as { children?: Figma.Node[] };\n for (const pageNode of doc.children || []) {\n if (pageNode.type !== \"CANVAS\") continue;\n\n const page: SimplifiedPage = {\n id: pageNode.id,\n name: pageNode.name,\n frames: [],\n };\n\n if (\"children\" in pageNode) {\n const pageWithChildren = pageNode as { children?: Figma.Node[] };\n for (const child of pageWithChildren.children || []) {\n const frame = extractFrameInfo(child, 1, maxDepth, includeHidden);\n if (frame) {\n page.frames.push(frame);\n }\n }\n }\n\n pages.push(page);\n }\n }\n\n return {\n name: file.name,\n lastModified: file.lastModified,\n version: file.version,\n pages,\n };\n}\n\nfunction formatTree(structure: SimplifiedStructure): string {\n const lines: string[] = [];\n lines.push(`📁 ${structure.name}`);\n lines.push(` Last Modified: ${structure.lastModified}`);\n lines.push(\"\");\n\n for (let i = 0; i < structure.pages.length; i++) {\n const page = structure.pages[i];\n const isLastPage = i === structure.pages.length - 1;\n const pagePrefix = isLastPage ? \"└──\" : \"├──\";\n lines.push(`${pagePrefix} 📄 ${page.name} (${page.id})`);\n\n const indent = isLastPage ? \" \" : \"│ \";\n formatFramesTree(page.frames, indent, lines);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatFramesTree(\n frames: SimplifiedFrame[],\n indent: string,\n lines: string[]\n): void {\n for (let i = 0; i < frames.length; i++) {\n const frame = frames[i];\n const isLast = i === frames.length - 1;\n const prefix = isLast ? \"└──\" : \"├──\";\n const icon = getTypeIcon(frame.type);\n const sizeInfo =\n frame.width && frame.height ? ` (${frame.width}×${frame.height})` : \"\";\n lines.push(`${indent}${prefix} ${icon} ${frame.name}${sizeInfo}`);\n\n if (frame.children && frame.children.length > 0) {\n const childIndent = indent + (isLast ? \" \" : \"│ \");\n formatFramesTree(frame.children, childIndent, lines);\n }\n }\n}\n\nfunction getTypeIcon(type: string): string {\n switch (type) {\n case \"COMPONENT\":\n return \"🔷\";\n case \"COMPONENT_SET\":\n return \"🔶\";\n case \"FRAME\":\n return \"⬜\";\n case \"SECTION\":\n return \"📂\";\n case \"GROUP\":\n return \"📦\";\n case \"INSTANCE\":\n return \"◇\";\n default:\n return \"▫\";\n }\n}\n\nexport function createFileStructureCommand(factory: Factory): Command {\n const cmd = new Command(\"structure\")\n .description(\"Get simplified file structure\")\n .argument(\"<url>\", \"Figma URL or file key\")\n .option(\"-d, --depth <depth>\", \"Max depth of hierarchy (default: 2)\", \"2\")\n .option(\"--include-hidden\", \"Include hidden nodes\", false)\n .option(\"-f, --format <format>\", \"Output format (json, tree)\", \"json\")\n .option(\"-o, --output <file>\", \"Write output to file\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n url: string,\n options: {\n depth: string;\n includeHidden: boolean;\n format: string;\n output?: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n const maxDepth = parseInt(options.depth, 10);\n\n // Validate depth\n if (isNaN(maxDepth) || maxDepth < 1) {\n io.err.write(\n chalk.red(\n `Invalid depth \"${options.depth}\". Depth must be a positive integer.\\n`\n )\n );\n process.exit(1);\n }\n\n // Validate format\n const validFormats = [\"json\", \"tree\"] as const;\n if (\n !validFormats.includes(\n options.format as (typeof validFormats)[number]\n )\n ) {\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\n const client = await factory.getClient();\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: options.token });\n }\n\n const file = await activeClient.getFile(fileKey, {\n depth: maxDepth + 1, // +1 to include top-level frames\n });\n\n const structure = extractStructure(\n file,\n maxDepth,\n options.includeHidden\n );\n\n let output: string;\n if (options.format === \"tree\") {\n output = formatTree(structure);\n } else {\n output = JSON.stringify(structure, null, 2);\n }\n\n if (options.output) {\n const outputPath = path.resolve(options.output);\n fs.writeFileSync(outputPath, output + \"\\n\");\n io.out.write(chalk.green(`Structure written to ${outputPath}\\n`));\n } else {\n io.out.write(output + \"\\n\");\n }\n } catch (error) {\n io.err.write(chalk.red(\"Error fetching file structure.\\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 { 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\";\nimport { parseFigmaInput } from \"../../internal/url/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 <url>\", \"Figma URL or file key\")\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 parsed = parseFigmaInput(options.file);\n const components = await client.getFileComponents(parsed.fileKey);\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\";\nimport { parseFigmaInput } from \"../../internal/url/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 <url>\", \"Figma URL or file key\")\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 parsed = parseFigmaInput(options.file);\n const styles = await client.getFileStyles(parsed.fileKey);\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\";\nimport { parseFigmaInput } from \"../../internal/url/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(\"<url>\", \"Figma URL or 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 url: string,\n options: {\n published?: boolean;\n format: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\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\";\nimport { parseFigmaInput } from \"../../internal/url/index.js\";\nimport { toKebabCase } from \"../../internal/transform/tokens.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\n// Scope categories for organizing variables\nconst SCOPE_CATEGORIES: Record<string, string[]> = {\n colors: [\n \"ALL_FILLS\",\n \"FRAME_FILL\",\n \"SHAPE_FILL\",\n \"TEXT_FILL\",\n \"STROKE_COLOR\",\n ],\n spacing: [\"GAP\", \"WIDTH_HEIGHT\"],\n radius: [\"CORNER_RADIUS\"],\n effects: [\"EFFECT_COLOR\"],\n typography: [\n \"FONT_FAMILY\",\n \"FONT_SIZE\",\n \"FONT_WEIGHT\",\n \"LINE_HEIGHT\",\n \"LETTER_SPACING\",\n ],\n other: [],\n};\n\nfunction categorizeVariables(\n variables: Record<string, FigmaVariable>\n): Record<string, FigmaVariable[]> {\n const categorized: Record<string, FigmaVariable[]> = {\n colors: [],\n spacing: [],\n radius: [],\n effects: [],\n typography: [],\n other: [],\n };\n\n for (const variable of Object.values(variables)) {\n const scopes = variable.scopes || [];\n let placed = false;\n\n for (const [category, categoryScopes] of Object.entries(SCOPE_CATEGORIES)) {\n if (category === \"other\") continue;\n if (scopes.some((scope) => categoryScopes.includes(scope))) {\n categorized[category].push(variable);\n placed = true;\n break;\n }\n }\n\n // Also categorize by resolved type if no scope match\n if (!placed) {\n switch (variable.resolvedType) {\n case \"COLOR\":\n categorized.colors.push(variable);\n break;\n case \"FLOAT\": {\n // Check if name suggests a category\n const nameLower = variable.name.toLowerCase();\n if (nameLower.includes(\"radius\") || nameLower.includes(\"corner\")) {\n categorized.radius.push(variable);\n } else if (\n nameLower.includes(\"spacing\") ||\n nameLower.includes(\"gap\") ||\n nameLower.includes(\"padding\") ||\n nameLower.includes(\"margin\")\n ) {\n categorized.spacing.push(variable);\n } else {\n categorized.other.push(variable);\n }\n break;\n }\n default:\n categorized.other.push(variable);\n }\n }\n }\n\n // Remove empty categories\n return Object.fromEntries(\n Object.entries(categorized).filter(([, vars]) => vars.length > 0)\n );\n}\n\nexport function createVariableExportCommand(factory: Factory): Command {\n const cmd = new Command(\"export\")\n .description(\"Export variables as design tokens (Enterprise)\")\n .argument(\"<url>\", \"Figma URL or 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(\n \"--categorize\",\n \"Group variables by scope (CORNER_RADIUS, GAP, etc.)\",\n false\n )\n .option(\"-o, --output <file>\", \"Output file path\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n url: string,\n options: {\n format: string;\n mode?: string;\n categorize: boolean;\n output?: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n // Validate format\n const validFormats = [\n \"json\",\n \"css\",\n \"scss\",\n \"style-dictionary\",\n ] as const;\n if (\n !validFormats.includes(\n options.format as (typeof validFormats)[number]\n )\n ) {\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\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token: options.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(\n variables,\n collections,\n targetModeId,\n options.categorize\n );\n break;\n case \"scss\":\n output = exportToScss(\n variables,\n collections,\n targetModeId,\n options.categorize\n );\n break;\n case \"style-dictionary\":\n output = exportToStyleDictionary(\n variables,\n collections,\n targetModeId,\n options.categorize\n );\n break;\n default:\n if (options.categorize) {\n const categorized = categorizeVariables(variables);\n output = JSON.stringify({ categorized, collections }, null, 2);\n } else {\n output = JSON.stringify({ variables, collections }, null, 2);\n }\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 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 categorize?: boolean\n): string {\n const lines: string[] = [\":root {\"];\n\n if (categorize) {\n const categorized = categorizeVariables(variables);\n\n for (const [category, categoryVars] of Object.entries(categorized)) {\n if (categoryVars.length === 0) continue;\n\n lines.push(\n ` /* ${category.charAt(0).toUpperCase() + category.slice(1)} */`\n );\n\n for (const variable of categoryVars) {\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 lines.push(\"\");\n }\n } else {\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\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 categorize?: boolean\n): string {\n const lines: string[] = [];\n\n if (categorize) {\n const categorized = categorizeVariables(variables);\n\n for (const [category, categoryVars] of Object.entries(categorized)) {\n if (categoryVars.length === 0) continue;\n\n lines.push(`// ${category.charAt(0).toUpperCase() + category.slice(1)}`);\n\n for (const variable of categoryVars) {\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 lines.push(\"\");\n }\n } else {\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\n return lines.join(\"\\n\");\n}\n\nfunction exportToStyleDictionary(\n variables: Record<string, FigmaVariable>,\n collections: Record<string, FigmaVariableCollection>,\n modeId?: string,\n categorize?: boolean\n): string {\n const tokens: Record<string, unknown> = {};\n\n const processVariable = (\n variable: FigmaVariable,\n targetTokens: Record<string, unknown>\n ): void => {\n const collection = collections[variable.variableCollectionId];\n const targetMode = modeId || collection?.defaultModeId;\n const value = variable.valuesByMode[targetMode];\n\n if (value === undefined) return;\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> = targetTokens;\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 if (categorize) {\n const categorized = categorizeVariables(variables);\n\n for (const [category, categoryVars] of Object.entries(categorized)) {\n if (categoryVars.length === 0) continue;\n\n tokens[category] = {};\n for (const variable of categoryVars) {\n processVariable(variable, tokens[category] as Record<string, unknown>);\n }\n }\n } else {\n for (const variable of Object.values(variables)) {\n processVariable(variable, tokens);\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\";\nimport { parseFigmaInput } from \"../../internal/url/index.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(\"<url>\", \"Figma URL or 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 url: string,\n options: {\n format: string;\n output?: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n // Validate format\n const validFormats = [\n \"json\",\n \"css\",\n \"scss\",\n \"style-dictionary\",\n \"tailwind\",\n ] as const;\n if (\n !validFormats.includes(\n options.format as (typeof validFormats)[number]\n )\n ) {\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\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token: options.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 (error) {\n // Only silence Enterprise/permission errors, log others\n const message =\n error instanceof Error ? error.message.toLowerCase() : \"\";\n const isPermissionError =\n message.includes(\"403\") ||\n message.includes(\"enterprise\") ||\n message.includes(\"permission\") ||\n message.includes(\"forbidden\");\n if (!isPermissionError) {\n io.err.write(\n chalk.dim(\n `Note: Could not check for variables: ${error instanceof Error ? error.message : String(error)}\\n`\n )\n );\n }\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 { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\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\";\nimport { parseFigmaInput } from \"../../internal/url/index.js\";\n\ntype VariantFormat = \"flat\" | \"suffix\" | \"folder\";\n\n/**\n * Parse variant properties from Figma component name.\n *\n * Figma variant components use \"/\" as path separator and \"Key=Value\" for variants.\n * Example: \"Icon/Size=Large/Style=Filled\"\n *\n * @returns baseName - Non-variant path segments joined by hyphens (e.g., \"Icon\")\n * @returns variants - Array of variant VALUES only (e.g., [\"Large\", \"Filled\"])\n *\n * If no base name segments exist, returns the original name as baseName.\n */\nfunction parseVariantName(name: string): {\n baseName: string;\n variants: string[];\n} {\n const parts = name.split(\"/\");\n const variants: string[] = [];\n let baseName = \"\";\n\n for (const part of parts) {\n if (part.includes(\"=\")) {\n // Variant property (e.g., \"Size=Large\") - extract only the value\n const [, value] = part.split(\"=\");\n if (value) {\n variants.push(value.trim());\n }\n } else {\n // Base name segment - join with hyphens\n baseName = baseName ? `${baseName}-${part}` : part;\n }\n }\n\n return { baseName: baseName || name, variants };\n}\n\n// Generate filename based on variant format\nfunction generateVariantFilename(\n name: string,\n variantFormat: VariantFormat,\n prefix: string,\n imageFormat: string\n): { filename: string; subdir?: string } {\n const { baseName, variants } = parseVariantName(name);\n const kebabBase = toKebabCase(baseName);\n\n switch (variantFormat) {\n case \"suffix\":\n // icon-name--variant1-variant2.svg\n if (variants.length > 0) {\n const variantSuffix = variants.map((v) => toKebabCase(v)).join(\"-\");\n return {\n filename: `${prefix}${kebabBase}--${variantSuffix}.${imageFormat}`,\n };\n }\n return { filename: `${prefix}${kebabBase}.${imageFormat}` };\n\n case \"folder\":\n // baseName/variant1-variant2.svg\n if (variants.length > 0) {\n const variantSuffix = variants.map((v) => toKebabCase(v)).join(\"-\");\n return {\n filename: `${variantSuffix}.${imageFormat}`,\n subdir: `${prefix}${kebabBase}`,\n };\n }\n return { filename: `${prefix}${kebabBase}.${imageFormat}` };\n\n case \"flat\":\n default:\n // Flatten everything with dashes\n return { filename: `${prefix}${toKebabCase(name)}.${imageFormat}` };\n }\n}\n\nexport function createExportIconsCommand(factory: Factory): Command {\n const cmd = new Command(\"icons\")\n .description(\"Export icons from a Figma file\")\n .argument(\"<url>\", \"Figma URL or 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(\n \"--variant-format <format>\",\n \"How to handle variants: flat, suffix, or folder (default: flat)\",\n \"flat\"\n )\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n url: string,\n options: {\n frame?: string;\n format: string;\n scale: number;\n output: string;\n prefix: string;\n variantFormat: 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 parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\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 // Validate variant format\n const validVariantFormats = [\"flat\", \"suffix\", \"folder\"] as const;\n if (\n !validVariantFormats.includes(\n options.variantFormat as VariantFormat\n )\n ) {\n io.err.write(\n chalk.red(\n `Invalid variant format \"${options.variantFormat}\". Valid formats: ${validVariantFormats.join(\", \")}\\n`\n )\n );\n process.exit(1);\n }\n const variantFormat = options.variantFormat as VariantFormat;\n\n // Create subdirectories if needed (for folder variant format)\n const subdirs = new Set<string>();\n for (const node of iconNodes) {\n const { subdir } = generateVariantFilename(\n node.name,\n variantFormat,\n options.prefix,\n imageFormat\n );\n if (subdir) {\n subdirs.add(subdir);\n }\n }\n\n // Create output directory and any subdirectories\n fs.mkdirSync(options.output, { recursive: true });\n for (const subdir of subdirs) {\n fs.mkdirSync(path.join(options.output, subdir), {\n recursive: true,\n });\n }\n\n // Prepare download items\n const downloadItems = iconNodes.map((node) => {\n const { filename, subdir } = generateVariantFilename(\n node.name,\n variantFormat,\n options.prefix,\n imageFormat\n );\n return {\n id: node.id,\n name: node.name,\n url: imageUrls[node.id] ?? null,\n filename: subdir ? path.join(subdir, filename) : filename,\n };\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\";\nimport { parseFigmaInput } from \"../../internal/url/index.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(\"<url>\", \"Figma URL or 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 url: string,\n options: {\n output: string;\n formats: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\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 { Command } from \"commander\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { createFrameListCommand } from \"./list.js\";\n\nexport function createFrameCommand(factory: Factory): Command {\n const cmd = new Command(\"frame\").description(\"Work with Figma frames\");\n\n cmd.addCommand(createFrameListCommand(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\";\nimport { parseFigmaInput } from \"../../internal/url/index.js\";\nimport type * as Figma from \"@figma/rest-api-spec\";\n\nexport interface FrameInfo {\n id: string;\n name: string;\n type: string;\n page: string;\n pageId: string;\n width?: number;\n height?: number;\n}\n\nconst FRAME_TYPES = [\n \"FRAME\",\n \"COMPONENT\",\n \"COMPONENT_SET\",\n \"SECTION\",\n \"GROUP\",\n \"INSTANCE\",\n] as const;\ntype FrameType = (typeof FRAME_TYPES)[number];\n\nfunction extractFrames(\n file: Figma.GetFileResponse,\n options: {\n page?: string;\n types?: FrameType[];\n topLevel: boolean;\n }\n): FrameInfo[] {\n const frames: FrameInfo[] = [];\n const allowedTypes = options.types || FRAME_TYPES;\n\n if (!file.document || !(\"children\" in file.document)) {\n return frames;\n }\n\n const doc = file.document as { children?: Figma.Node[] };\n\n for (const pageNode of doc.children || []) {\n if (pageNode.type !== \"CANVAS\") continue;\n\n // Filter by page name if specified\n if (options.page && pageNode.name !== options.page) continue;\n\n if (!(\"children\" in pageNode)) continue;\n const page = pageNode as { children?: Figma.Node[] };\n\n function traverseNode(node: Figma.Node, isTopLevel: boolean): void {\n const nodeWithBounds = node as Figma.Node & {\n absoluteBoundingBox?: { width: number; height: number };\n visible?: boolean;\n };\n\n // Check if this node type is in our allowed types\n if (allowedTypes.includes(node.type as FrameType)) {\n // If top-level only, only include nodes directly under the page\n if (!options.topLevel || isTopLevel) {\n const frame: FrameInfo = {\n id: node.id,\n name: node.name,\n type: node.type,\n page: pageNode.name,\n pageId: pageNode.id,\n };\n\n if (nodeWithBounds.absoluteBoundingBox) {\n frame.width = Math.round(nodeWithBounds.absoluteBoundingBox.width);\n frame.height = Math.round(\n nodeWithBounds.absoluteBoundingBox.height\n );\n }\n\n frames.push(frame);\n }\n }\n\n // If not top-level only, recurse into children\n if (!options.topLevel && \"children\" in node) {\n const parent = node as { children?: Figma.Node[] };\n for (const child of parent.children || []) {\n traverseNode(child, false);\n }\n }\n }\n\n for (const child of page.children || []) {\n traverseNode(child, true);\n }\n }\n\n return frames;\n}\n\nfunction formatTable(frames: FrameInfo[]): string {\n if (frames.length === 0) {\n return \"No frames found.\";\n }\n\n // Calculate column widths\n const headers = [\"ID\", \"Name\", \"Type\", \"Page\", \"Size\"];\n const rows = frames.map((f) => [\n f.id,\n f.name,\n f.type,\n f.page,\n f.width && f.height ? `${f.width}×${f.height}` : \"-\",\n ]);\n\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => r[i].length))\n );\n\n const separator = widths.map((w) => \"-\".repeat(w)).join(\"-+-\");\n const headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(\" | \");\n const rowLines = rows.map((r) =>\n r.map((cell, i) => cell.padEnd(widths[i])).join(\" | \")\n );\n\n return [headerLine, separator, ...rowLines].join(\"\\n\");\n}\n\nexport function createFrameListCommand(factory: Factory): Command {\n const cmd = new Command(\"list\")\n .description(\"List frames in a file\")\n .requiredOption(\"--file <url>\", \"Figma URL or file key\")\n .option(\"--page <name>\", \"Filter to specific page\")\n .option(\n \"--type <types>\",\n \"Comma-separated types: frame,component,component_set,section,group,instance\"\n )\n .option(\"--top-level\", \"Only top-level frames\", false)\n .option(\"-f, --format <format>\", \"Output format (json, table)\", \"json\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (options: {\n file: string;\n page?: string;\n type?: string;\n topLevel: boolean;\n format: string;\n token?: string;\n }) => {\n const { io } = factory;\n\n // Validate format\n const validFormats = [\"json\", \"table\"] as const;\n if (\n !validFormats.includes(\n options.format as (typeof validFormats)[number]\n )\n ) {\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\n try {\n const parsed = parseFigmaInput(options.file);\n const fileKey = parsed.fileKey;\n\n // Parse type filter\n let types: FrameType[] | undefined;\n if (options.type) {\n const typeMap: Record<string, FrameType> = {\n frame: \"FRAME\",\n component: \"COMPONENT\",\n component_set: \"COMPONENT_SET\",\n section: \"SECTION\",\n group: \"GROUP\",\n instance: \"INSTANCE\",\n };\n types = options.type.split(\",\").map((t) => {\n const mapped = typeMap[t.trim().toLowerCase()];\n if (!mapped) {\n throw new Error(\n `Invalid type \"${t}\". Valid types: ${Object.keys(typeMap).join(\", \")}`\n );\n }\n return mapped;\n });\n }\n\n const client = await factory.getClient();\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: options.token });\n }\n\n const file = await activeClient.getFile(fileKey, {\n depth: options.topLevel ? 2 : undefined,\n });\n\n const frames = extractFrames(file, {\n page: options.page,\n types,\n topLevel: options.topLevel,\n });\n\n if (options.format === \"table\") {\n io.out.write(formatTable(frames) + \"\\n\");\n } else {\n io.out.write(\n formatOutput(frames, { format: options.format as OutputFormat })\n );\n io.out.write(\"\\n\");\n }\n } catch (error) {\n io.err.write(chalk.red(\"Error listing frames.\\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 \"fs\";\nimport * as path from \"path\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { parseFigmaInput } from \"../../internal/url/index.js\";\nimport {\n extractStylesFromFile,\n tokensToCss,\n tokensToScss,\n toKebabCase,\n type TokenCollection,\n} from \"../../internal/transform/tokens.js\";\nimport {\n downloadFiles,\n sanitizeFilename,\n} from \"../../internal/download/index.js\";\nimport type * as Figma from \"@figma/rest-api-spec\";\n\ninterface ComponentInfo {\n id: string;\n name: string;\n type: string;\n asset?: string;\n}\n\ninterface HandoffSummary {\n name: string;\n url: string;\n generatedAt: string;\n tokens: {\n colors: number;\n typography: number;\n shadows: number;\n radii: number;\n spacing: number;\n };\n components: ComponentInfo[];\n pages: number;\n frames: number;\n}\n\nfunction countTokens(tokens: TokenCollection): HandoffSummary[\"tokens\"] {\n return {\n colors: Object.keys(tokens.colors || {}).length,\n typography: Object.keys(tokens.typography || {}).length,\n shadows: Object.keys(tokens.shadows || {}).length,\n radii: Object.keys(tokens.radii || {}).length,\n spacing: Object.keys(tokens.spacing || {}).length,\n };\n}\n\nfunction extractComponents(file: Figma.GetFileResponse): ComponentInfo[] {\n const components: ComponentInfo[] = [];\n\n function traverseNode(node: Figma.Node): void {\n if (node.type === \"COMPONENT\" || node.type === \"COMPONENT_SET\") {\n components.push({\n id: node.id,\n name: node.name,\n type: node.type,\n });\n }\n\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 components;\n}\n\nfunction countPagesAndFrames(file: Figma.GetFileResponse): {\n pages: number;\n frames: number;\n} {\n let pages = 0;\n let frames = 0;\n\n if (file.document && \"children\" in file.document) {\n const doc = file.document as { children?: Figma.Node[] };\n for (const pageNode of doc.children || []) {\n if (pageNode.type === \"CANVAS\") {\n pages++;\n if (\"children\" in pageNode) {\n const page = pageNode as { children?: Figma.Node[] };\n frames += (page.children || []).length;\n }\n }\n }\n }\n\n return { pages, frames };\n}\n\nfunction generateHandoffReadme(\n summary: HandoffSummary,\n tokenFormats: string[]\n): string {\n const lines: string[] = [];\n\n lines.push(`# Design Handoff: ${summary.name}`);\n lines.push(\"\");\n lines.push(`Source: ${summary.url}`);\n lines.push(`Generated: ${summary.generatedAt}`);\n lines.push(\"\");\n\n lines.push(\"## Tokens Summary\");\n lines.push(`- Colors: ${summary.tokens.colors} tokens`);\n lines.push(`- Typography: ${summary.tokens.typography} tokens`);\n lines.push(`- Shadows: ${summary.tokens.shadows} tokens`);\n lines.push(`- Radii: ${summary.tokens.radii} tokens`);\n lines.push(`- Spacing: ${summary.tokens.spacing} tokens`);\n lines.push(\"\");\n\n if (summary.components.length > 0) {\n lines.push(\"## Component Inventory\");\n lines.push(\"| ID | Name | Type | Asset |\");\n lines.push(\"|----|------|------|-------|\");\n for (const comp of summary.components) {\n lines.push(\n `| ${comp.id} | ${comp.name} | ${comp.type} | ${comp.asset || \"-\"} |`\n );\n }\n lines.push(\"\");\n }\n\n lines.push(\"## File Structure\");\n lines.push(\n `${summary.pages} pages, ${summary.frames} frames, ${summary.components.length} components`\n );\n lines.push(\"\");\n\n lines.push(\"## Implementation Notes\");\n if (tokenFormats.includes(\"css\")) {\n lines.push(\"- Import tokens: `@import './tokens/tokens.css'`\");\n }\n if (tokenFormats.includes(\"scss\")) {\n lines.push(\"- SCSS import: `@import './tokens/tokens.scss'`\");\n }\n if (summary.components.some((c) => c.asset)) {\n lines.push(\"- Asset path: `./assets/{name}.svg`\");\n }\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction extractSimplifiedStructure(\n file: Figma.GetFileResponse\n): Record<string, unknown> {\n const structure: Record<string, unknown> = {\n name: file.name,\n lastModified: file.lastModified,\n pages: [] as Array<{\n id: string;\n name: string;\n frames: Array<{\n id: string;\n name: string;\n type: string;\n width?: number;\n height?: number;\n }>;\n }>,\n };\n\n if (file.document && \"children\" in file.document) {\n const doc = file.document as { children?: Figma.Node[] };\n for (const pageNode of doc.children || []) {\n if (pageNode.type !== \"CANVAS\") continue;\n\n const page = {\n id: pageNode.id,\n name: pageNode.name,\n frames: [] as Array<{\n id: string;\n name: string;\n type: string;\n width?: number;\n height?: number;\n }>,\n };\n\n if (\"children\" in pageNode) {\n const pageWithChildren = pageNode as { children?: Figma.Node[] };\n for (const child of pageWithChildren.children || []) {\n const childWithBounds = child as Figma.Node & {\n absoluteBoundingBox?: { width: number; height: number };\n };\n\n const frame: {\n id: string;\n name: string;\n type: string;\n width?: number;\n height?: number;\n } = {\n id: child.id,\n name: child.name,\n type: child.type,\n };\n\n if (childWithBounds.absoluteBoundingBox) {\n frame.width = Math.round(childWithBounds.absoluteBoundingBox.width);\n frame.height = Math.round(\n childWithBounds.absoluteBoundingBox.height\n );\n }\n\n page.frames.push(frame);\n }\n }\n\n (structure.pages as (typeof page)[]).push(page);\n }\n }\n\n return structure;\n}\n\nexport function createHandoffCommand(factory: Factory): Command {\n const cmd = new Command(\"handoff\")\n .description(\"Export complete design handoff package\")\n .argument(\"<url>\", \"Figma URL or file key\")\n .option(\"-o, --output <dir>\", \"Output directory\", \"./figma-handoff\")\n .option(\n \"--tokens <formats>\",\n \"Token formats to export (comma-separated: css,json,scss)\",\n \"css,json\"\n )\n .option(\"--assets\", \"Export component assets\", false)\n .option(\"--asset-format <format>\", \"Asset format (svg, png)\", \"svg\")\n .option(\"--structure\", \"Include structure.json\", false)\n .option(\"--readme\", \"Generate HANDOFF.md\", false)\n .option(\"--all\", \"Export all (tokens, assets, structure, readme)\", false)\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n url: string,\n options: {\n output: string;\n tokens: string;\n assets: boolean;\n assetFormat: string;\n structure: boolean;\n readme: boolean;\n all: boolean;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n\n // Handle --all flag\n const exportAssets = options.all || options.assets;\n const exportStructure = options.all || options.structure;\n const exportReadme = options.all || options.readme;\n\n const tokenFormats = options.tokens.split(\",\").map((f) => f.trim());\n\n // Validate token formats\n const validTokenFormats = [\"css\", \"scss\", \"json\"] as const;\n for (const format of tokenFormats) {\n if (\n !validTokenFormats.includes(\n format as (typeof validTokenFormats)[number]\n )\n ) {\n io.err.write(\n chalk.red(\n `Invalid token format \"${format}\". Valid formats: ${validTokenFormats.join(\", \")}\\n`\n )\n );\n process.exit(1);\n }\n }\n\n // Validate asset format\n const validAssetFormats = [\"svg\", \"png\"] as const;\n if (\n !validAssetFormats.includes(\n options.assetFormat as (typeof validAssetFormats)[number]\n )\n ) {\n io.err.write(\n chalk.red(\n `Invalid asset format \"${options.assetFormat}\". Valid formats: ${validAssetFormats.join(\", \")}\\n`\n )\n );\n process.exit(1);\n }\n const assetFormat = options.assetFormat as \"svg\" | \"png\";\n\n // Create output directories\n const outputDir = path.resolve(options.output);\n\n // Security: Only allow writes within cwd or user's home directory\n const cwd = process.cwd();\n const homeDir = process.env.HOME || \"\";\n if (!outputDir.startsWith(cwd) && !outputDir.startsWith(homeDir)) {\n io.err.write(\n chalk.red(\n `Error: Output directory \"${outputDir}\" is outside your project and home directory. ` +\n `Use a relative path or a path within your home directory.\\n`\n )\n );\n process.exit(1);\n }\n\n const tokensDir = path.join(outputDir, \"tokens\");\n const assetsDir = path.join(outputDir, \"assets\");\n\n fs.mkdirSync(tokensDir, { recursive: true });\n if (exportAssets) {\n fs.mkdirSync(assetsDir, { recursive: true });\n }\n\n io.err.write(chalk.dim(\"Fetching Figma file...\\n\"));\n\n const client = await factory.getClient();\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: options.token });\n }\n\n // Fetch file and styles\n const [file, stylesResponse] = await Promise.all([\n activeClient.getFile(fileKey),\n activeClient.getFileStyles(fileKey),\n ]);\n\n const styles = stylesResponse.meta?.styles || [];\n\n // Extract tokens\n io.err.write(chalk.dim(\"Extracting design tokens...\\n\"));\n const tokens = extractStylesFromFile(file, styles);\n\n // Export tokens in requested formats\n for (const format of tokenFormats) {\n let content: string;\n let filename: string;\n\n switch (format) {\n case \"css\":\n content = tokensToCss(tokens);\n filename = \"tokens.css\";\n break;\n case \"scss\":\n content = tokensToScss(tokens);\n filename = \"tokens.scss\";\n break;\n case \"json\":\n default:\n content = JSON.stringify(tokens, null, 2);\n filename = \"tokens.json\";\n break;\n }\n\n fs.writeFileSync(path.join(tokensDir, filename), content + \"\\n\");\n io.err.write(chalk.green(` ✓ ${filename}\\n`));\n }\n\n // Extract components for summary\n const components = extractComponents(file);\n const { pages, frames } = countPagesAndFrames(file);\n\n // Export assets\n if (exportAssets && components.length > 0) {\n io.err.write(chalk.dim(\"Exporting component assets...\\n\"));\n\n const componentIds = components.map((c) => c.id);\n const images = await activeClient.getImages(fileKey, componentIds, {\n format: assetFormat,\n });\n\n const imageUrls = images.images || {};\n\n if (Object.keys(imageUrls).length === 0) {\n io.err.write(\n chalk.yellow(\n \" Warning: No image URLs returned from Figma API.\\n\"\n )\n );\n }\n const downloadItems = Object.entries(imageUrls).map(\n ([nodeId, imageUrl]) => {\n const component = components.find((c) => c.id === nodeId);\n const filename = component\n ? `${toKebabCase(component.name)}.${assetFormat}`\n : `${sanitizeFilename(nodeId)}.${assetFormat}`;\n\n // Update component with asset filename\n if (component) {\n component.asset = filename;\n }\n\n return {\n id: nodeId,\n url: imageUrl ?? null,\n filename,\n };\n }\n );\n\n const downloadResults = await downloadFiles(\n downloadItems,\n assetsDir\n );\n\n // Report download results\n const successCount = downloadResults.filter(\n (r) => r.status === \"success\"\n ).length;\n const failures = downloadResults.filter(\n (r) => r.status === \"error\"\n );\n\n io.err.write(chalk.green(` ✓ ${successCount} assets exported\\n`));\n\n if (failures.length > 0) {\n io.err.write(\n chalk.yellow(\n ` Warning: ${failures.length} asset(s) failed to download:\\n`\n )\n );\n for (const failure of failures) {\n io.err.write(\n chalk.dim(\n ` - ${failure.name ?? failure.id}: ${failure.error}\\n`\n )\n );\n }\n process.exit(1);\n }\n }\n\n // Export structure\n if (exportStructure) {\n io.err.write(chalk.dim(\"Generating structure.json...\\n\"));\n const structure = extractSimplifiedStructure(file);\n fs.writeFileSync(\n path.join(outputDir, \"structure.json\"),\n JSON.stringify(structure, null, 2) + \"\\n\"\n );\n io.err.write(chalk.green(\" ✓ structure.json\\n\"));\n }\n\n // Generate README\n if (exportReadme) {\n io.err.write(chalk.dim(\"Generating HANDOFF.md...\\n\"));\n\n const summary: HandoffSummary = {\n name: file.name,\n url: `https://www.figma.com/file/${fileKey}`,\n generatedAt: new Date().toISOString(),\n tokens: countTokens(tokens),\n components,\n pages,\n frames,\n };\n\n const readme = generateHandoffReadme(summary, tokenFormats);\n fs.writeFileSync(path.join(outputDir, \"HANDOFF.md\"), readme);\n io.err.write(chalk.green(\" ✓ HANDOFF.md\\n\"));\n }\n\n io.out.write(\n chalk.bold.green(`\\n✓ Handoff package created at ${outputDir}\\n`)\n );\n } catch (error) {\n io.err.write(chalk.red(\"Error creating handoff package.\\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 { 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","resolve","fs","path","os","URL","resolve","Command","Command","chalk","chalk","Command","chalk","Command","chalk","Command","Command","Command","chalk","Command","FigmaClient","file","chalk","Command","chalk","Command","chalk","FigmaClient","nodes","Command","chalk","fs","path","DEFAULT_TIMEOUT_MS","Command","chalk","FigmaClient","url","Command","chalk","fs","path","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","Command","chalk","FigmaClient","Command","Command","Command","chalk","fs","Command","chalk","FigmaClient","Command","chalk","path","fs","Command","chalk","findIcons","hasDeepChildren","FigmaClient","Command","chalk","fs","path","Command","FigmaClient","chalk","Command","Command","chalk","Command","Command","chalk","traverseNode","formatTable","Command","chalk","FigmaClient","Command","Command","chalk","fs","path","Command","chalk","FigmaClient","Command"]}
|
|
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/internal/url/parser.ts","../src/cmd/file/nodes.ts","../src/cmd/file/images.ts","../src/internal/download/index.ts","../src/internal/transform/tokens.ts","../src/cmd/file/structure.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/cmd/export/icons.ts","../src/cmd/export/theme.ts","../src/cmd/api/index.ts","../src/cmd/frame/index.ts","../src/cmd/frame/list.ts","../src/cmd/handoff/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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\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\";\nimport { createFrameCommand } from \"./frame/index.js\";\nimport { createHandoffCommand } from \"./handoff/index.js\";\n\ndeclare const __VERSION__: string;\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(__VERSION__)\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(createFrameCommand(factory));\n program.addCommand(createHandoffCommand(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\";\nimport { createFileStructureCommand } from \"./structure.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 cmd.addCommand(createFileStructureCommand(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\";\nimport { parseFigmaInput, parseNodeIds } from \"../../internal/url/index.js\";\n\nexport function createFileGetCommand(factory: Factory): Command {\n const cmd = new Command(\"get\")\n .description(\"Get file JSON structure\")\n .argument(\"<url>\", \"Figma URL or file key\")\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(\"--id <ids>\", \"Comma-separated node IDs (overrides URL node-id)\")\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 url: string,\n options: {\n version?: string;\n depth?: number;\n id?: string;\n geometry?: string;\n format: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n\n // --id flag overrides URL node-id, otherwise use URL node-id\n let nodeIds: string[] | undefined;\n if (options.id) {\n nodeIds = parseNodeIds(options.id);\n } else if (parsed.nodeId) {\n nodeIds = [parsed.nodeId];\n }\n\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: options.token });\n const file = await overrideClient.getFile(fileKey, {\n version: options.version,\n depth: options.depth,\n ids: nodeIds,\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: nodeIds,\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 {\n parseFileAndNodeId,\n parseFileId,\n formatNodeId,\n} from \"@design-sdk/figma-url\";\n\nexport interface ParsedFigmaInput {\n fileKey: string;\n nodeId?: string;\n}\n\n/**\n * Parses a Figma URL or raw file key into its components.\n *\n * Supported inputs:\n * - Raw file key: \"abc123XYZ\"\n * - File URL: \"https://www.figma.com/file/abc123XYZ/Name\"\n * - Design URL: \"https://www.figma.com/design/abc123XYZ/Name\"\n * - URL with node-id: \"https://www.figma.com/file/abc123XYZ/Name?node-id=1-2\"\n *\n * Note: URLs must include \"www.\" prefix (library limitation).\n *\n * @returns fileKey and optional nodeId (normalized to colon format \"1:2\")\n * @throws Error if URL contains figma.com but cannot be parsed\n */\nexport function parseFigmaInput(input: string): ParsedFigmaInput {\n const trimmed = input.trim();\n\n // Check if it's a URL\n if (trimmed.includes(\"figma.com/\")) {\n const result = parseFileAndNodeId(trimmed);\n if (result) {\n return {\n fileKey: result.file,\n nodeId: result.node || undefined,\n };\n }\n // Fallback to just file ID\n try {\n const fileKey = parseFileId(trimmed);\n return { fileKey };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Could not parse Figma URL: ${trimmed}. ${message}`);\n }\n }\n\n // Treat as raw file key\n return { fileKey: trimmed };\n}\n\n/**\n * Parses and normalizes node IDs from comma-separated input.\n * Converts hyphen format (1-2) to colon format (1:2).\n * Throws an error if any node IDs are invalid.\n */\nexport function parseNodeIds(input: string): string[] {\n const rawIds = input\n .split(\",\")\n .map((id) => id.trim())\n .filter(Boolean);\n const validIds: string[] = [];\n const invalidIds: string[] = [];\n\n for (const id of rawIds) {\n const formatted = formatNodeId(id);\n if (formatted) {\n validIds.push(formatted);\n } else {\n invalidIds.push(id);\n }\n }\n\n if (invalidIds.length > 0) {\n throw new Error(\n `Invalid node ID(s): ${invalidIds.join(\", \")}. ` +\n `Node IDs should be in format \"1:2\" or \"1-2\".`\n );\n }\n\n return validIds;\n}\n\nexport { formatNodeId };\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 { parseFigmaInput, parseNodeIds } from \"../../internal/url/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(\"<url>\", \"Figma URL (with node-id) or file key\")\n .option(\"--id <ids>\", \"Comma-separated node IDs (overrides URL node-id)\")\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 url: string,\n options: {\n id?: 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 parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n\n // --id flag overrides URL node-id\n let nodeIds: string[];\n if (options.id) {\n nodeIds = parseNodeIds(options.id);\n } else if (parsed.nodeId) {\n nodeIds = [parsed.nodeId];\n } else {\n io.err.write(\n chalk.red(\n \"Error: node ID required. Use a URL with node-id or --id flag.\\n\"\n )\n );\n process.exit(1);\n }\n\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 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\";\nimport { parseFigmaInput, parseNodeIds } from \"../../internal/url/index.js\";\nimport { toKebabCase } from \"../../internal/transform/tokens.js\";\nimport type * as Figma from \"@figma/rest-api-spec\";\n\ntype NamingStrategy = \"id\" | \"name\" | \"path\";\n\ninterface NodeInfo {\n name: string;\n parentNames: string[];\n}\n\n// Get node information for naming\nfunction getNodeInfoMap(\n nodes: Record<string, { document: Figma.Node }>,\n nodeIds: string[]\n): Map<string, NodeInfo> {\n const nodeInfoMap = new Map<string, NodeInfo>();\n\n for (const nodeId of nodeIds) {\n const nodeData = nodes[nodeId];\n if (nodeData && nodeData.document) {\n const node = nodeData.document;\n // Figma uses \"/\" as a path separator in node names (e.g., \"Icons/Nav/Arrow\")\n const nameParts = node.name.split(\"/\");\n const name = nameParts[nameParts.length - 1]; // Leaf name\n const parentNames = nameParts.slice(0, -1); // Path segments before the leaf\n\n nodeInfoMap.set(nodeId, {\n name,\n parentNames,\n });\n }\n }\n\n return nodeInfoMap;\n}\n\n// Generate filename based on naming strategy\nfunction generateFilename(\n nodeId: string,\n nodeInfo: NodeInfo | undefined,\n namingStrategy: NamingStrategy,\n format: string,\n isVariant: boolean,\n variantSuffix?: string\n): string {\n let baseName: string;\n\n switch (namingStrategy) {\n case \"name\":\n if (nodeInfo) {\n baseName = toKebabCase(nodeInfo.name);\n } else {\n baseName = sanitizeFilename(nodeId);\n }\n break;\n case \"path\":\n if (nodeInfo && nodeInfo.parentNames.length > 0) {\n const pathParts = [...nodeInfo.parentNames, nodeInfo.name];\n baseName = pathParts.map((p) => toKebabCase(p)).join(\"--\");\n } else if (nodeInfo) {\n baseName = toKebabCase(nodeInfo.name);\n } else {\n baseName = sanitizeFilename(nodeId);\n }\n break;\n case \"id\":\n default:\n baseName = sanitizeFilename(nodeId);\n break;\n }\n\n if (isVariant && variantSuffix) {\n baseName = `${baseName}--${toKebabCase(variantSuffix)}`;\n }\n\n return `${baseName}.${format}`;\n}\n\nexport function createFileImagesCommand(factory: Factory): Command {\n const cmd = new Command(\"images\")\n .description(\"Export images from a file\")\n .argument(\"<url>\", \"Figma URL (with node-id) or file key\")\n .option(\"--id <ids>\", \"Comma-separated node IDs (overrides URL node-id)\")\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(\n \"--naming <strategy>\",\n \"Naming strategy: id, name, or path (default: id)\",\n \"id\"\n )\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n url: string,\n options: {\n id?: string;\n scale: number;\n format: string;\n svgIncludeId?: boolean;\n svgSimplifyStroke?: boolean;\n output?: string;\n outputFormat: string;\n naming: 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 // Validate scale option\n if (isNaN(options.scale) || options.scale < 0.01 || options.scale > 4) {\n io.err.write(\n chalk.red(\n `Invalid scale \"${options.scale}\". Scale must be between 0.01 and 4.\\n`\n )\n );\n process.exit(1);\n }\n\n // Validate naming strategy before making API calls\n const validNamingStrategies = [\"id\", \"name\", \"path\"] as const;\n if (!validNamingStrategies.includes(options.naming as NamingStrategy)) {\n io.err.write(\n chalk.red(\n `Invalid naming strategy \"${options.naming}\". Valid strategies: ${validNamingStrategies.join(\", \")}\\n`\n )\n );\n process.exit(1);\n }\n const namingStrategy = options.naming as NamingStrategy;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n\n // --id flag overrides URL node-id\n let nodeIds: string[];\n if (options.id) {\n nodeIds = parseNodeIds(options.id);\n } else if (parsed.nodeId) {\n nodeIds = [parsed.nodeId];\n } else {\n io.err.write(\n chalk.red(\n \"Error: node ID required. Use a URL with node-id or --id flag.\\n\"\n )\n );\n process.exit(1);\n }\n\n const client = await factory.getClient();\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: options.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 if (Object.keys(imageUrls).length === 0) {\n io.err.write(\n chalk.yellow(\n \"Warning: No image URLs returned from Figma API.\\n\"\n )\n );\n }\n\n // Fetch node info if using name or path naming strategy\n let nodeInfoMap = new Map<string, NodeInfo>();\n if (namingStrategy === \"name\" || namingStrategy === \"path\") {\n try {\n const nodesResponse = await activeClient.getFileNodes(\n fileKey,\n nodeIds\n );\n nodeInfoMap = getNodeInfoMap(nodesResponse.nodes, nodeIds);\n } catch (fetchError) {\n // Fallback to ID naming if node fetch fails\n const errorMsg =\n fetchError instanceof Error\n ? fetchError.message\n : String(fetchError);\n io.err.write(\n chalk.yellow(\n `Warning: Could not fetch node names (${errorMsg}), falling back to ID naming.\\n`\n )\n );\n }\n }\n\n const downloadItems = Object.entries(imageUrls).map(\n ([nodeId, url]) => {\n const nodeInfo = nodeInfoMap.get(nodeId);\n const filename = generateFilename(\n nodeId,\n nodeInfo,\n namingStrategy,\n imageFormat,\n false\n );\n return {\n id: nodeId,\n url: url ?? null,\n filename,\n };\n }\n );\n\n const results = await downloadFiles(downloadItems, options.output);\n\n // Check for failures\n const failures = results.filter((r) => r.status === \"error\");\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\n if (failures.length > 0) {\n io.err.write(\n chalk.yellow(\n `${failures.length} image(s) failed to download.\\n`\n )\n );\n process.exit(1);\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 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 interface ShadowToken extends DesignToken {\n type: \"shadow\";\n value: {\n x: number;\n y: number;\n blur: number;\n spread: number;\n color: string;\n inset?: boolean;\n };\n}\n\nexport interface RadiusToken extends DesignToken {\n type: \"radius\";\n value: string;\n}\n\nexport interface SpacingToken extends DesignToken {\n type: \"spacing\";\n value: string;\n}\n\n// GenericToken for tokens that don't fit a specific category\nexport interface GenericToken extends DesignToken {\n type: \"generic\";\n}\n\nexport type TokenValue =\n | ColorToken\n | DimensionToken\n | TypographyToken\n | ShadowToken\n | RadiusToken\n | SpacingToken\n | GenericToken;\n\nexport interface TokenCollection {\n colors?: Record<string, ColorToken>;\n typography?: Record<string, TypographyToken>;\n shadows?: Record<string, ShadowToken>;\n radii?: Record<string, RadiusToken>;\n spacing?: Record<string, SpacingToken>;\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// Helper to convert shadow effect to CSS box-shadow value\nexport function shadowToCss(shadow: {\n x: number;\n y: number;\n blur: number;\n spread: number;\n color: string;\n inset?: boolean;\n}): string {\n const inset = shadow.inset ? \"inset \" : \"\";\n return `${inset}${shadow.x}px ${shadow.y}px ${shadow.blur}px ${shadow.spread}px ${shadow.color}`;\n}\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 shadows: {},\n radii: {},\n spacing: {},\n effects: {},\n };\n\n // Track unique radii and spacing values\n const seenRadii = new Set<string>();\n const seenSpacing = new Set<string>();\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 effects?: Figma.Effect[];\n cornerRadius?: number;\n rectangleCornerRadii?: [number, number, number, number];\n paddingLeft?: number;\n paddingRight?: number;\n paddingTop?: number;\n paddingBottom?: number;\n itemSpacing?: number;\n layoutMode?: \"NONE\" | \"HORIZONTAL\" | \"VERTICAL\";\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 // Effect styles (shadows)\n if (\n styles.effect &&\n \"effects\" in nodeWithStyles &&\n nodeWithStyles.effects\n ) {\n const effects = nodeWithStyles.effects;\n const styleInfo = styleNodeMap.get(node.id);\n const styleName = styleInfo?.name || node.name;\n const baseTokenName = toKebabCase(styleName);\n\n // Extract shadow effects - handle multiple shadows with index suffix\n let shadowIndex = 0;\n for (const effect of effects) {\n if (\n (effect.type === \"DROP_SHADOW\" || effect.type === \"INNER_SHADOW\") &&\n effect.visible !== false\n ) {\n const shadowEffect = effect as\n | Figma.DropShadowEffect\n | Figma.InnerShadowEffect;\n const colorValue = shadowEffect.color\n ? figmaColorToCss(shadowEffect.color)\n : \"rgba(0, 0, 0, 0.25)\";\n\n // Use index suffix if multiple shadows, otherwise use base name\n const tokenName =\n shadowIndex === 0\n ? baseTokenName\n : `${baseTokenName}-${shadowIndex}`;\n\n tokens.shadows![tokenName] = {\n name:\n shadowIndex === 0\n ? styleName\n : `${styleName} ${shadowIndex + 1}`,\n type: \"shadow\",\n value: {\n x: shadowEffect.offset?.x ?? 0,\n y: shadowEffect.offset?.y ?? 0,\n blur: shadowEffect.radius ?? 0,\n spread: shadowEffect.spread ?? 0,\n color: colorValue,\n inset: effect.type === \"INNER_SHADOW\",\n },\n description: styleInfo?.description,\n };\n shadowIndex++;\n }\n }\n }\n }\n\n // Extract corner radius from frames/components (not tied to styles)\n if (\n \"cornerRadius\" in nodeWithStyles &&\n nodeWithStyles.cornerRadius !== undefined\n ) {\n const radius = nodeWithStyles.cornerRadius;\n if (radius > 0) {\n const radiusValue = `${radius}px`;\n if (!seenRadii.has(radiusValue)) {\n seenRadii.add(radiusValue);\n const tokenName = `radius-${radius}`;\n tokens.radii![tokenName] = {\n name: `Radius ${radius}`,\n type: \"radius\",\n value: radiusValue,\n };\n }\n }\n }\n\n // Extract individual corner radii if different\n if (\n \"rectangleCornerRadii\" in nodeWithStyles &&\n nodeWithStyles.rectangleCornerRadii\n ) {\n const [topLeft, topRight, bottomRight, bottomLeft] =\n nodeWithStyles.rectangleCornerRadii;\n for (const radius of [topLeft, topRight, bottomRight, bottomLeft]) {\n if (radius > 0) {\n const radiusValue = `${radius}px`;\n if (!seenRadii.has(radiusValue)) {\n seenRadii.add(radiusValue);\n const tokenName = `radius-${radius}`;\n tokens.radii![tokenName] = {\n name: `Radius ${radius}`,\n type: \"radius\",\n value: radiusValue,\n };\n }\n }\n }\n }\n\n // Extract spacing from auto-layout properties\n if (\n \"layoutMode\" in nodeWithStyles &&\n nodeWithStyles.layoutMode !== \"NONE\"\n ) {\n // Item spacing (gap)\n if (\n nodeWithStyles.itemSpacing !== undefined &&\n nodeWithStyles.itemSpacing > 0\n ) {\n const spacingValue = `${nodeWithStyles.itemSpacing}px`;\n if (!seenSpacing.has(spacingValue)) {\n seenSpacing.add(spacingValue);\n const tokenName = `spacing-${nodeWithStyles.itemSpacing}`;\n tokens.spacing![tokenName] = {\n name: `Spacing ${nodeWithStyles.itemSpacing}`,\n type: \"spacing\",\n value: spacingValue,\n };\n }\n }\n\n // Padding values\n const paddings = [\n nodeWithStyles.paddingTop,\n nodeWithStyles.paddingRight,\n nodeWithStyles.paddingBottom,\n nodeWithStyles.paddingLeft,\n ];\n for (const padding of paddings) {\n if (padding !== undefined && padding > 0) {\n const spacingValue = `${padding}px`;\n if (!seenSpacing.has(spacingValue)) {\n seenSpacing.add(spacingValue);\n const tokenName = `spacing-${padding}`;\n tokens.spacing![tokenName] = {\n name: `Spacing ${padding}`,\n type: \"spacing\",\n value: spacingValue,\n };\n }\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 && Object.keys(tokens.colors).length > 0) {\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 && Object.keys(tokens.typography).length > 0) {\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.shadows && Object.keys(tokens.shadows).length > 0) {\n lines.push(\" /* Shadows */\");\n for (const [name, token] of Object.entries(tokens.shadows)) {\n const value = token.value;\n const shadowCss = shadowToCss(value);\n lines.push(` --shadow-${name}: ${shadowCss};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.radii && Object.keys(tokens.radii).length > 0) {\n lines.push(\" /* Border Radii */\");\n for (const [name, token] of Object.entries(tokens.radii)) {\n lines.push(` --${name}: ${token.value};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.spacing && Object.keys(tokens.spacing).length > 0) {\n lines.push(\" /* Spacing */\");\n for (const [name, token] of Object.entries(tokens.spacing)) {\n lines.push(` --${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 && Object.keys(tokens.colors).length > 0) {\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 && Object.keys(tokens.typography).length > 0) {\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.shadows && Object.keys(tokens.shadows).length > 0) {\n lines.push(\"// Shadows\");\n for (const [name, token] of Object.entries(tokens.shadows)) {\n const value = token.value;\n const shadowCss = shadowToCss(value);\n lines.push(`$shadow-${name}: ${shadowCss};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.radii && Object.keys(tokens.radii).length > 0) {\n lines.push(\"// Border Radii\");\n for (const [name, token] of Object.entries(tokens.radii)) {\n lines.push(`$${name}: ${token.value};`);\n }\n lines.push(\"\");\n }\n\n if (tokens.spacing && Object.keys(tokens.spacing).length > 0) {\n lines.push(\"// Spacing\");\n for (const [name, token] of Object.entries(tokens.spacing)) {\n lines.push(`$${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.shadows && Object.keys(tokens.shadows).length > 0) {\n output.shadow = {};\n for (const [name, token] of Object.entries(tokens.shadows)) {\n (output.shadow as Record<string, unknown>)[name] = {\n value: token.value,\n type: \"shadow\",\n description: token.description,\n };\n }\n }\n\n if (tokens.radii && Object.keys(tokens.radii).length > 0) {\n output.borderRadius = {};\n for (const [name, token] of Object.entries(tokens.radii)) {\n (output.borderRadius as Record<string, unknown>)[name] = {\n value: token.value,\n type: \"dimension\",\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 boxShadow?: Record<string, string>;\n borderRadius?: 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.shadows && Object.keys(tokens.shadows).length > 0) {\n config.theme.extend.boxShadow = {};\n for (const [name, token] of Object.entries(tokens.shadows)) {\n config.theme.extend.boxShadow[name] = shadowToCss(token.value);\n }\n }\n\n if (tokens.radii && Object.keys(tokens.radii).length > 0) {\n config.theme.extend.borderRadius = {};\n for (const [name, token] of Object.entries(tokens.radii)) {\n config.theme.extend.borderRadius[name] = token.value;\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 { parseFigmaInput } from \"../../internal/url/index.js\";\nimport type * as Figma from \"@figma/rest-api-spec\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nexport interface SimplifiedFrame {\n id: string;\n name: string;\n type: string;\n width?: number;\n height?: number;\n children?: SimplifiedFrame[];\n}\n\nexport interface SimplifiedPage {\n id: string;\n name: string;\n frames: SimplifiedFrame[];\n}\n\nexport interface SimplifiedStructure {\n name: string;\n lastModified: string;\n version?: string;\n pages: SimplifiedPage[];\n}\n\nfunction extractFrameInfo(\n node: Figma.Node,\n currentDepth: number,\n maxDepth: number,\n includeHidden: boolean\n): SimplifiedFrame | null {\n const nodeWithBounds = node as Figma.Node & {\n absoluteBoundingBox?: { width: number; height: number };\n visible?: boolean;\n };\n\n // Skip hidden nodes unless includeHidden is true\n if (!includeHidden && nodeWithBounds.visible === false) {\n return null;\n }\n\n // Only include structural node types relevant for design hierarchy\n const relevantTypes = [\n \"FRAME\",\n \"COMPONENT\",\n \"COMPONENT_SET\",\n \"SECTION\",\n \"GROUP\",\n \"INSTANCE\",\n ];\n if (!relevantTypes.includes(node.type)) {\n return null;\n }\n\n const frame: SimplifiedFrame = {\n id: node.id,\n name: node.name,\n type: node.type,\n };\n\n if (nodeWithBounds.absoluteBoundingBox) {\n frame.width = Math.round(nodeWithBounds.absoluteBoundingBox.width);\n frame.height = Math.round(nodeWithBounds.absoluteBoundingBox.height);\n }\n\n // Include children if within depth limit\n if (currentDepth < maxDepth && \"children\" in node) {\n const parent = node as { children?: Figma.Node[] };\n const children = (parent.children || [])\n .map((child) =>\n extractFrameInfo(child, currentDepth + 1, maxDepth, includeHidden)\n )\n .filter((child): child is SimplifiedFrame => child !== null);\n\n if (children.length > 0) {\n frame.children = children;\n }\n }\n\n return frame;\n}\n\nfunction extractStructure(\n file: Figma.GetFileResponse,\n maxDepth: number,\n includeHidden: boolean\n): SimplifiedStructure {\n const pages: SimplifiedPage[] = [];\n\n if (file.document && \"children\" in file.document) {\n const doc = file.document as { children?: Figma.Node[] };\n for (const pageNode of doc.children || []) {\n if (pageNode.type !== \"CANVAS\") continue;\n\n const page: SimplifiedPage = {\n id: pageNode.id,\n name: pageNode.name,\n frames: [],\n };\n\n if (\"children\" in pageNode) {\n const pageWithChildren = pageNode as { children?: Figma.Node[] };\n for (const child of pageWithChildren.children || []) {\n const frame = extractFrameInfo(child, 1, maxDepth, includeHidden);\n if (frame) {\n page.frames.push(frame);\n }\n }\n }\n\n pages.push(page);\n }\n }\n\n return {\n name: file.name,\n lastModified: file.lastModified,\n version: file.version,\n pages,\n };\n}\n\nfunction formatTree(structure: SimplifiedStructure): string {\n const lines: string[] = [];\n lines.push(`📁 ${structure.name}`);\n lines.push(` Last Modified: ${structure.lastModified}`);\n lines.push(\"\");\n\n for (let i = 0; i < structure.pages.length; i++) {\n const page = structure.pages[i];\n const isLastPage = i === structure.pages.length - 1;\n const pagePrefix = isLastPage ? \"└──\" : \"├──\";\n lines.push(`${pagePrefix} 📄 ${page.name} (${page.id})`);\n\n const indent = isLastPage ? \" \" : \"│ \";\n formatFramesTree(page.frames, indent, lines);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatFramesTree(\n frames: SimplifiedFrame[],\n indent: string,\n lines: string[]\n): void {\n for (let i = 0; i < frames.length; i++) {\n const frame = frames[i];\n const isLast = i === frames.length - 1;\n const prefix = isLast ? \"└──\" : \"├──\";\n const icon = getTypeIcon(frame.type);\n const sizeInfo =\n frame.width && frame.height ? ` (${frame.width}×${frame.height})` : \"\";\n lines.push(`${indent}${prefix} ${icon} ${frame.name}${sizeInfo}`);\n\n if (frame.children && frame.children.length > 0) {\n const childIndent = indent + (isLast ? \" \" : \"│ \");\n formatFramesTree(frame.children, childIndent, lines);\n }\n }\n}\n\nfunction getTypeIcon(type: string): string {\n switch (type) {\n case \"COMPONENT\":\n return \"🔷\";\n case \"COMPONENT_SET\":\n return \"🔶\";\n case \"FRAME\":\n return \"⬜\";\n case \"SECTION\":\n return \"📂\";\n case \"GROUP\":\n return \"📦\";\n case \"INSTANCE\":\n return \"◇\";\n default:\n return \"▫\";\n }\n}\n\nexport function createFileStructureCommand(factory: Factory): Command {\n const cmd = new Command(\"structure\")\n .description(\"Get simplified file structure\")\n .argument(\"<url>\", \"Figma URL or file key\")\n .option(\"-d, --depth <depth>\", \"Max depth of hierarchy (default: 2)\", \"2\")\n .option(\"--include-hidden\", \"Include hidden nodes\", false)\n .option(\"-f, --format <format>\", \"Output format (json, tree)\", \"json\")\n .option(\"-o, --output <file>\", \"Write output to file\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n url: string,\n options: {\n depth: string;\n includeHidden: boolean;\n format: string;\n output?: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n const maxDepth = parseInt(options.depth, 10);\n\n // Validate depth\n if (isNaN(maxDepth) || maxDepth < 1) {\n io.err.write(\n chalk.red(\n `Invalid depth \"${options.depth}\". Depth must be a positive integer.\\n`\n )\n );\n process.exit(1);\n }\n\n // Validate format\n const validFormats = [\"json\", \"tree\"] as const;\n if (\n !validFormats.includes(\n options.format as (typeof validFormats)[number]\n )\n ) {\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\n const client = await factory.getClient();\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: options.token });\n }\n\n const file = await activeClient.getFile(fileKey, {\n depth: maxDepth + 1, // +1 to include top-level frames\n });\n\n const structure = extractStructure(\n file,\n maxDepth,\n options.includeHidden\n );\n\n let output: string;\n if (options.format === \"tree\") {\n output = formatTree(structure);\n } else {\n output = JSON.stringify(structure, null, 2);\n }\n\n if (options.output) {\n const outputPath = path.resolve(options.output);\n fs.writeFileSync(outputPath, output + \"\\n\");\n io.out.write(chalk.green(`Structure written to ${outputPath}\\n`));\n } else {\n io.out.write(output + \"\\n\");\n }\n } catch (error) {\n io.err.write(chalk.red(\"Error fetching file structure.\\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 { 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\";\nimport { parseFigmaInput } from \"../../internal/url/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 <url>\", \"Figma URL or file key\")\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 parsed = parseFigmaInput(options.file);\n const components = await client.getFileComponents(parsed.fileKey);\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\";\nimport { parseFigmaInput } from \"../../internal/url/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 <url>\", \"Figma URL or file key\")\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 parsed = parseFigmaInput(options.file);\n const styles = await client.getFileStyles(parsed.fileKey);\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\";\nimport { parseFigmaInput } from \"../../internal/url/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(\"<url>\", \"Figma URL or 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 url: string,\n options: {\n published?: boolean;\n format: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\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\";\nimport { parseFigmaInput } from \"../../internal/url/index.js\";\nimport { toKebabCase } from \"../../internal/transform/tokens.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\n// Scope categories for organizing variables\nconst SCOPE_CATEGORIES: Record<string, string[]> = {\n colors: [\n \"ALL_FILLS\",\n \"FRAME_FILL\",\n \"SHAPE_FILL\",\n \"TEXT_FILL\",\n \"STROKE_COLOR\",\n ],\n spacing: [\"GAP\", \"WIDTH_HEIGHT\"],\n radius: [\"CORNER_RADIUS\"],\n effects: [\"EFFECT_COLOR\"],\n typography: [\n \"FONT_FAMILY\",\n \"FONT_SIZE\",\n \"FONT_WEIGHT\",\n \"LINE_HEIGHT\",\n \"LETTER_SPACING\",\n ],\n other: [],\n};\n\nfunction categorizeVariables(\n variables: Record<string, FigmaVariable>\n): Record<string, FigmaVariable[]> {\n const categorized: Record<string, FigmaVariable[]> = {\n colors: [],\n spacing: [],\n radius: [],\n effects: [],\n typography: [],\n other: [],\n };\n\n for (const variable of Object.values(variables)) {\n const scopes = variable.scopes || [];\n let placed = false;\n\n for (const [category, categoryScopes] of Object.entries(SCOPE_CATEGORIES)) {\n if (category === \"other\") continue;\n if (scopes.some((scope) => categoryScopes.includes(scope))) {\n categorized[category].push(variable);\n placed = true;\n break;\n }\n }\n\n // Also categorize by resolved type if no scope match\n if (!placed) {\n switch (variable.resolvedType) {\n case \"COLOR\":\n categorized.colors.push(variable);\n break;\n case \"FLOAT\": {\n // Check if name suggests a category\n const nameLower = variable.name.toLowerCase();\n if (nameLower.includes(\"radius\") || nameLower.includes(\"corner\")) {\n categorized.radius.push(variable);\n } else if (\n nameLower.includes(\"spacing\") ||\n nameLower.includes(\"gap\") ||\n nameLower.includes(\"padding\") ||\n nameLower.includes(\"margin\")\n ) {\n categorized.spacing.push(variable);\n } else {\n categorized.other.push(variable);\n }\n break;\n }\n default:\n categorized.other.push(variable);\n }\n }\n }\n\n // Remove empty categories\n return Object.fromEntries(\n Object.entries(categorized).filter(([, vars]) => vars.length > 0)\n );\n}\n\nexport function createVariableExportCommand(factory: Factory): Command {\n const cmd = new Command(\"export\")\n .description(\"Export variables as design tokens (Enterprise)\")\n .argument(\"<url>\", \"Figma URL or 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(\n \"--categorize\",\n \"Group variables by scope (CORNER_RADIUS, GAP, etc.)\",\n false\n )\n .option(\"-o, --output <file>\", \"Output file path\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n url: string,\n options: {\n format: string;\n mode?: string;\n categorize: boolean;\n output?: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n // Validate format\n const validFormats = [\n \"json\",\n \"css\",\n \"scss\",\n \"style-dictionary\",\n ] as const;\n if (\n !validFormats.includes(\n options.format as (typeof validFormats)[number]\n )\n ) {\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\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token: options.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(\n variables,\n collections,\n targetModeId,\n options.categorize\n );\n break;\n case \"scss\":\n output = exportToScss(\n variables,\n collections,\n targetModeId,\n options.categorize\n );\n break;\n case \"style-dictionary\":\n output = exportToStyleDictionary(\n variables,\n collections,\n targetModeId,\n options.categorize\n );\n break;\n default:\n if (options.categorize) {\n const categorized = categorizeVariables(variables);\n output = JSON.stringify({ categorized, collections }, null, 2);\n } else {\n output = JSON.stringify({ variables, collections }, null, 2);\n }\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 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 categorize?: boolean\n): string {\n const lines: string[] = [\":root {\"];\n\n if (categorize) {\n const categorized = categorizeVariables(variables);\n\n for (const [category, categoryVars] of Object.entries(categorized)) {\n if (categoryVars.length === 0) continue;\n\n lines.push(\n ` /* ${category.charAt(0).toUpperCase() + category.slice(1)} */`\n );\n\n for (const variable of categoryVars) {\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 lines.push(\"\");\n }\n } else {\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\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 categorize?: boolean\n): string {\n const lines: string[] = [];\n\n if (categorize) {\n const categorized = categorizeVariables(variables);\n\n for (const [category, categoryVars] of Object.entries(categorized)) {\n if (categoryVars.length === 0) continue;\n\n lines.push(`// ${category.charAt(0).toUpperCase() + category.slice(1)}`);\n\n for (const variable of categoryVars) {\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 lines.push(\"\");\n }\n } else {\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\n return lines.join(\"\\n\");\n}\n\nfunction exportToStyleDictionary(\n variables: Record<string, FigmaVariable>,\n collections: Record<string, FigmaVariableCollection>,\n modeId?: string,\n categorize?: boolean\n): string {\n const tokens: Record<string, unknown> = {};\n\n const processVariable = (\n variable: FigmaVariable,\n targetTokens: Record<string, unknown>\n ): void => {\n const collection = collections[variable.variableCollectionId];\n const targetMode = modeId || collection?.defaultModeId;\n const value = variable.valuesByMode[targetMode];\n\n if (value === undefined) return;\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> = targetTokens;\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 if (categorize) {\n const categorized = categorizeVariables(variables);\n\n for (const [category, categoryVars] of Object.entries(categorized)) {\n if (categoryVars.length === 0) continue;\n\n tokens[category] = {};\n for (const variable of categoryVars) {\n processVariable(variable, tokens[category] as Record<string, unknown>);\n }\n }\n } else {\n for (const variable of Object.values(variables)) {\n processVariable(variable, tokens);\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\";\nimport { parseFigmaInput } from \"../../internal/url/index.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(\"<url>\", \"Figma URL or 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 url: string,\n options: {\n format: string;\n output?: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n // Validate format\n const validFormats = [\n \"json\",\n \"css\",\n \"scss\",\n \"style-dictionary\",\n \"tailwind\",\n ] as const;\n if (\n !validFormats.includes(\n options.format as (typeof validFormats)[number]\n )\n ) {\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\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n let client = await factory.getClient();\n\n if (options.token) {\n const { FigmaClient } = await import(\"../../api/client.js\");\n client = new FigmaClient({ token: options.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 (error) {\n // Only silence Enterprise/permission errors, log others\n const message =\n error instanceof Error ? error.message.toLowerCase() : \"\";\n const isPermissionError =\n message.includes(\"403\") ||\n message.includes(\"enterprise\") ||\n message.includes(\"permission\") ||\n message.includes(\"forbidden\");\n if (!isPermissionError) {\n io.err.write(\n chalk.dim(\n `Note: Could not check for variables: ${error instanceof Error ? error.message : String(error)}\\n`\n )\n );\n }\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 { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\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\";\nimport { parseFigmaInput } from \"../../internal/url/index.js\";\n\ntype VariantFormat = \"flat\" | \"suffix\" | \"folder\";\n\n/**\n * Parse variant properties from Figma component name.\n *\n * Figma variant components use \"/\" as path separator and \"Key=Value\" for variants.\n * Example: \"Icon/Size=Large/Style=Filled\"\n *\n * @returns baseName - Non-variant path segments joined by hyphens (e.g., \"Icon\")\n * @returns variants - Array of variant VALUES only (e.g., [\"Large\", \"Filled\"])\n *\n * If no base name segments exist, returns the original name as baseName.\n */\nfunction parseVariantName(name: string): {\n baseName: string;\n variants: string[];\n} {\n const parts = name.split(\"/\");\n const variants: string[] = [];\n let baseName = \"\";\n\n for (const part of parts) {\n if (part.includes(\"=\")) {\n // Variant property (e.g., \"Size=Large\") - extract only the value\n const [, value] = part.split(\"=\");\n if (value) {\n variants.push(value.trim());\n }\n } else {\n // Base name segment - join with hyphens\n baseName = baseName ? `${baseName}-${part}` : part;\n }\n }\n\n return { baseName: baseName || name, variants };\n}\n\n// Generate filename based on variant format\nfunction generateVariantFilename(\n name: string,\n variantFormat: VariantFormat,\n prefix: string,\n imageFormat: string\n): { filename: string; subdir?: string } {\n const { baseName, variants } = parseVariantName(name);\n const kebabBase = toKebabCase(baseName);\n\n switch (variantFormat) {\n case \"suffix\":\n // icon-name--variant1-variant2.svg\n if (variants.length > 0) {\n const variantSuffix = variants.map((v) => toKebabCase(v)).join(\"-\");\n return {\n filename: `${prefix}${kebabBase}--${variantSuffix}.${imageFormat}`,\n };\n }\n return { filename: `${prefix}${kebabBase}.${imageFormat}` };\n\n case \"folder\":\n // baseName/variant1-variant2.svg\n if (variants.length > 0) {\n const variantSuffix = variants.map((v) => toKebabCase(v)).join(\"-\");\n return {\n filename: `${variantSuffix}.${imageFormat}`,\n subdir: `${prefix}${kebabBase}`,\n };\n }\n return { filename: `${prefix}${kebabBase}.${imageFormat}` };\n\n case \"flat\":\n default:\n // Flatten everything with dashes\n return { filename: `${prefix}${toKebabCase(name)}.${imageFormat}` };\n }\n}\n\nexport function createExportIconsCommand(factory: Factory): Command {\n const cmd = new Command(\"icons\")\n .description(\"Export icons from a Figma file\")\n .argument(\"<url>\", \"Figma URL or 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(\n \"--variant-format <format>\",\n \"How to handle variants: flat, suffix, or folder (default: flat)\",\n \"flat\"\n )\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n url: string,\n options: {\n frame?: string;\n format: string;\n scale: number;\n output: string;\n prefix: string;\n variantFormat: 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 parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\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 // Validate variant format\n const validVariantFormats = [\"flat\", \"suffix\", \"folder\"] as const;\n if (\n !validVariantFormats.includes(\n options.variantFormat as VariantFormat\n )\n ) {\n io.err.write(\n chalk.red(\n `Invalid variant format \"${options.variantFormat}\". Valid formats: ${validVariantFormats.join(\", \")}\\n`\n )\n );\n process.exit(1);\n }\n const variantFormat = options.variantFormat as VariantFormat;\n\n // Create subdirectories if needed (for folder variant format)\n const subdirs = new Set<string>();\n for (const node of iconNodes) {\n const { subdir } = generateVariantFilename(\n node.name,\n variantFormat,\n options.prefix,\n imageFormat\n );\n if (subdir) {\n subdirs.add(subdir);\n }\n }\n\n // Create output directory and any subdirectories\n fs.mkdirSync(options.output, { recursive: true });\n for (const subdir of subdirs) {\n fs.mkdirSync(path.join(options.output, subdir), {\n recursive: true,\n });\n }\n\n // Prepare download items\n const downloadItems = iconNodes.map((node) => {\n const { filename, subdir } = generateVariantFilename(\n node.name,\n variantFormat,\n options.prefix,\n imageFormat\n );\n return {\n id: node.id,\n name: node.name,\n url: imageUrls[node.id] ?? null,\n filename: subdir ? path.join(subdir, filename) : filename,\n };\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\";\nimport { parseFigmaInput } from \"../../internal/url/index.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(\"<url>\", \"Figma URL or 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 url: string,\n options: {\n output: string;\n formats: string;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\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 { Command } from \"commander\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { createFrameListCommand } from \"./list.js\";\n\nexport function createFrameCommand(factory: Factory): Command {\n const cmd = new Command(\"frame\").description(\"Work with Figma frames\");\n\n cmd.addCommand(createFrameListCommand(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\";\nimport { parseFigmaInput } from \"../../internal/url/index.js\";\nimport type * as Figma from \"@figma/rest-api-spec\";\n\nexport interface FrameInfo {\n id: string;\n name: string;\n type: string;\n page: string;\n pageId: string;\n width?: number;\n height?: number;\n}\n\nconst FRAME_TYPES = [\n \"FRAME\",\n \"COMPONENT\",\n \"COMPONENT_SET\",\n \"SECTION\",\n \"GROUP\",\n \"INSTANCE\",\n] as const;\ntype FrameType = (typeof FRAME_TYPES)[number];\n\nfunction extractFrames(\n file: Figma.GetFileResponse,\n options: {\n page?: string;\n types?: FrameType[];\n topLevel: boolean;\n }\n): FrameInfo[] {\n const frames: FrameInfo[] = [];\n const allowedTypes = options.types || FRAME_TYPES;\n\n if (!file.document || !(\"children\" in file.document)) {\n return frames;\n }\n\n const doc = file.document as { children?: Figma.Node[] };\n\n for (const pageNode of doc.children || []) {\n if (pageNode.type !== \"CANVAS\") continue;\n\n // Filter by page name if specified\n if (options.page && pageNode.name !== options.page) continue;\n\n if (!(\"children\" in pageNode)) continue;\n const page = pageNode as { children?: Figma.Node[] };\n\n function traverseNode(node: Figma.Node, isTopLevel: boolean): void {\n const nodeWithBounds = node as Figma.Node & {\n absoluteBoundingBox?: { width: number; height: number };\n visible?: boolean;\n };\n\n // Check if this node type is in our allowed types\n if (allowedTypes.includes(node.type as FrameType)) {\n // If top-level only, only include nodes directly under the page\n if (!options.topLevel || isTopLevel) {\n const frame: FrameInfo = {\n id: node.id,\n name: node.name,\n type: node.type,\n page: pageNode.name,\n pageId: pageNode.id,\n };\n\n if (nodeWithBounds.absoluteBoundingBox) {\n frame.width = Math.round(nodeWithBounds.absoluteBoundingBox.width);\n frame.height = Math.round(\n nodeWithBounds.absoluteBoundingBox.height\n );\n }\n\n frames.push(frame);\n }\n }\n\n // If not top-level only, recurse into children\n if (!options.topLevel && \"children\" in node) {\n const parent = node as { children?: Figma.Node[] };\n for (const child of parent.children || []) {\n traverseNode(child, false);\n }\n }\n }\n\n for (const child of page.children || []) {\n traverseNode(child, true);\n }\n }\n\n return frames;\n}\n\nfunction formatTable(frames: FrameInfo[]): string {\n if (frames.length === 0) {\n return \"No frames found.\";\n }\n\n // Calculate column widths\n const headers = [\"ID\", \"Name\", \"Type\", \"Page\", \"Size\"];\n const rows = frames.map((f) => [\n f.id,\n f.name,\n f.type,\n f.page,\n f.width && f.height ? `${f.width}×${f.height}` : \"-\",\n ]);\n\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => r[i].length))\n );\n\n const separator = widths.map((w) => \"-\".repeat(w)).join(\"-+-\");\n const headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(\" | \");\n const rowLines = rows.map((r) =>\n r.map((cell, i) => cell.padEnd(widths[i])).join(\" | \")\n );\n\n return [headerLine, separator, ...rowLines].join(\"\\n\");\n}\n\nexport function createFrameListCommand(factory: Factory): Command {\n const cmd = new Command(\"list\")\n .description(\"List frames in a file\")\n .requiredOption(\"--file <url>\", \"Figma URL or file key\")\n .option(\"--page <name>\", \"Filter to specific page\")\n .option(\n \"--type <types>\",\n \"Comma-separated types: frame,component,component_set,section,group,instance\"\n )\n .option(\"--top-level\", \"Only top-level frames\", false)\n .option(\"-f, --format <format>\", \"Output format (json, table)\", \"json\")\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (options: {\n file: string;\n page?: string;\n type?: string;\n topLevel: boolean;\n format: string;\n token?: string;\n }) => {\n const { io } = factory;\n\n // Validate format\n const validFormats = [\"json\", \"table\"] as const;\n if (\n !validFormats.includes(\n options.format as (typeof validFormats)[number]\n )\n ) {\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\n try {\n const parsed = parseFigmaInput(options.file);\n const fileKey = parsed.fileKey;\n\n // Parse type filter\n let types: FrameType[] | undefined;\n if (options.type) {\n const typeMap: Record<string, FrameType> = {\n frame: \"FRAME\",\n component: \"COMPONENT\",\n component_set: \"COMPONENT_SET\",\n section: \"SECTION\",\n group: \"GROUP\",\n instance: \"INSTANCE\",\n };\n types = options.type.split(\",\").map((t) => {\n const mapped = typeMap[t.trim().toLowerCase()];\n if (!mapped) {\n throw new Error(\n `Invalid type \"${t}\". Valid types: ${Object.keys(typeMap).join(\", \")}`\n );\n }\n return mapped;\n });\n }\n\n const client = await factory.getClient();\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: options.token });\n }\n\n const file = await activeClient.getFile(fileKey, {\n depth: options.topLevel ? 2 : undefined,\n });\n\n const frames = extractFrames(file, {\n page: options.page,\n types,\n topLevel: options.topLevel,\n });\n\n if (options.format === \"table\") {\n io.out.write(formatTable(frames) + \"\\n\");\n } else {\n io.out.write(\n formatOutput(frames, { format: options.format as OutputFormat })\n );\n io.out.write(\"\\n\");\n }\n } catch (error) {\n io.err.write(chalk.red(\"Error listing frames.\\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 \"fs\";\nimport * as path from \"path\";\nimport type { Factory } from \"../../pkg/cmdutil/index.js\";\nimport { parseFigmaInput } from \"../../internal/url/index.js\";\nimport {\n extractStylesFromFile,\n tokensToCss,\n tokensToScss,\n toKebabCase,\n type TokenCollection,\n} from \"../../internal/transform/tokens.js\";\nimport {\n downloadFiles,\n sanitizeFilename,\n} from \"../../internal/download/index.js\";\nimport type * as Figma from \"@figma/rest-api-spec\";\n\ninterface ComponentInfo {\n id: string;\n name: string;\n type: string;\n asset?: string;\n}\n\ninterface HandoffSummary {\n name: string;\n url: string;\n generatedAt: string;\n tokens: {\n colors: number;\n typography: number;\n shadows: number;\n radii: number;\n spacing: number;\n };\n components: ComponentInfo[];\n pages: number;\n frames: number;\n}\n\nfunction countTokens(tokens: TokenCollection): HandoffSummary[\"tokens\"] {\n return {\n colors: Object.keys(tokens.colors || {}).length,\n typography: Object.keys(tokens.typography || {}).length,\n shadows: Object.keys(tokens.shadows || {}).length,\n radii: Object.keys(tokens.radii || {}).length,\n spacing: Object.keys(tokens.spacing || {}).length,\n };\n}\n\nfunction extractComponents(file: Figma.GetFileResponse): ComponentInfo[] {\n const components: ComponentInfo[] = [];\n\n function traverseNode(node: Figma.Node): void {\n if (node.type === \"COMPONENT\" || node.type === \"COMPONENT_SET\") {\n components.push({\n id: node.id,\n name: node.name,\n type: node.type,\n });\n }\n\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 components;\n}\n\nfunction countPagesAndFrames(file: Figma.GetFileResponse): {\n pages: number;\n frames: number;\n} {\n let pages = 0;\n let frames = 0;\n\n if (file.document && \"children\" in file.document) {\n const doc = file.document as { children?: Figma.Node[] };\n for (const pageNode of doc.children || []) {\n if (pageNode.type === \"CANVAS\") {\n pages++;\n if (\"children\" in pageNode) {\n const page = pageNode as { children?: Figma.Node[] };\n frames += (page.children || []).length;\n }\n }\n }\n }\n\n return { pages, frames };\n}\n\nfunction generateHandoffReadme(\n summary: HandoffSummary,\n tokenFormats: string[]\n): string {\n const lines: string[] = [];\n\n lines.push(`# Design Handoff: ${summary.name}`);\n lines.push(\"\");\n lines.push(`Source: ${summary.url}`);\n lines.push(`Generated: ${summary.generatedAt}`);\n lines.push(\"\");\n\n lines.push(\"## Tokens Summary\");\n lines.push(`- Colors: ${summary.tokens.colors} tokens`);\n lines.push(`- Typography: ${summary.tokens.typography} tokens`);\n lines.push(`- Shadows: ${summary.tokens.shadows} tokens`);\n lines.push(`- Radii: ${summary.tokens.radii} tokens`);\n lines.push(`- Spacing: ${summary.tokens.spacing} tokens`);\n lines.push(\"\");\n\n if (summary.components.length > 0) {\n lines.push(\"## Component Inventory\");\n lines.push(\"| ID | Name | Type | Asset |\");\n lines.push(\"|----|------|------|-------|\");\n for (const comp of summary.components) {\n lines.push(\n `| ${comp.id} | ${comp.name} | ${comp.type} | ${comp.asset || \"-\"} |`\n );\n }\n lines.push(\"\");\n }\n\n lines.push(\"## File Structure\");\n lines.push(\n `${summary.pages} pages, ${summary.frames} frames, ${summary.components.length} components`\n );\n lines.push(\"\");\n\n lines.push(\"## Implementation Notes\");\n if (tokenFormats.includes(\"css\")) {\n lines.push(\"- Import tokens: `@import './tokens/tokens.css'`\");\n }\n if (tokenFormats.includes(\"scss\")) {\n lines.push(\"- SCSS import: `@import './tokens/tokens.scss'`\");\n }\n if (summary.components.some((c) => c.asset)) {\n lines.push(\"- Asset path: `./assets/{name}.svg`\");\n }\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction extractSimplifiedStructure(\n file: Figma.GetFileResponse\n): Record<string, unknown> {\n const structure: Record<string, unknown> = {\n name: file.name,\n lastModified: file.lastModified,\n pages: [] as Array<{\n id: string;\n name: string;\n frames: Array<{\n id: string;\n name: string;\n type: string;\n width?: number;\n height?: number;\n }>;\n }>,\n };\n\n if (file.document && \"children\" in file.document) {\n const doc = file.document as { children?: Figma.Node[] };\n for (const pageNode of doc.children || []) {\n if (pageNode.type !== \"CANVAS\") continue;\n\n const page = {\n id: pageNode.id,\n name: pageNode.name,\n frames: [] as Array<{\n id: string;\n name: string;\n type: string;\n width?: number;\n height?: number;\n }>,\n };\n\n if (\"children\" in pageNode) {\n const pageWithChildren = pageNode as { children?: Figma.Node[] };\n for (const child of pageWithChildren.children || []) {\n const childWithBounds = child as Figma.Node & {\n absoluteBoundingBox?: { width: number; height: number };\n };\n\n const frame: {\n id: string;\n name: string;\n type: string;\n width?: number;\n height?: number;\n } = {\n id: child.id,\n name: child.name,\n type: child.type,\n };\n\n if (childWithBounds.absoluteBoundingBox) {\n frame.width = Math.round(childWithBounds.absoluteBoundingBox.width);\n frame.height = Math.round(\n childWithBounds.absoluteBoundingBox.height\n );\n }\n\n page.frames.push(frame);\n }\n }\n\n (structure.pages as (typeof page)[]).push(page);\n }\n }\n\n return structure;\n}\n\nexport function createHandoffCommand(factory: Factory): Command {\n const cmd = new Command(\"handoff\")\n .description(\"Export complete design handoff package\")\n .argument(\"<url>\", \"Figma URL or file key\")\n .option(\"-o, --output <dir>\", \"Output directory\", \"./figma-handoff\")\n .option(\n \"--tokens <formats>\",\n \"Token formats to export (comma-separated: css,json,scss)\",\n \"css,json\"\n )\n .option(\"--assets\", \"Export component assets\", false)\n .option(\"--asset-format <format>\", \"Asset format (svg, png)\", \"svg\")\n .option(\"--structure\", \"Include structure.json\", false)\n .option(\"--readme\", \"Generate HANDOFF.md\", false)\n .option(\"--all\", \"Export all (tokens, assets, structure, readme)\", false)\n .option(\"-t, --token <token>\", \"Override authentication token\")\n .action(\n async (\n url: string,\n options: {\n output: string;\n tokens: string;\n assets: boolean;\n assetFormat: string;\n structure: boolean;\n readme: boolean;\n all: boolean;\n token?: string;\n }\n ) => {\n const { io } = factory;\n\n try {\n const parsed = parseFigmaInput(url);\n const fileKey = parsed.fileKey;\n\n // Handle --all flag\n const exportAssets = options.all || options.assets;\n const exportStructure = options.all || options.structure;\n const exportReadme = options.all || options.readme;\n\n const tokenFormats = options.tokens.split(\",\").map((f) => f.trim());\n\n // Validate token formats\n const validTokenFormats = [\"css\", \"scss\", \"json\"] as const;\n for (const format of tokenFormats) {\n if (\n !validTokenFormats.includes(\n format as (typeof validTokenFormats)[number]\n )\n ) {\n io.err.write(\n chalk.red(\n `Invalid token format \"${format}\". Valid formats: ${validTokenFormats.join(\", \")}\\n`\n )\n );\n process.exit(1);\n }\n }\n\n // Validate asset format\n const validAssetFormats = [\"svg\", \"png\"] as const;\n if (\n !validAssetFormats.includes(\n options.assetFormat as (typeof validAssetFormats)[number]\n )\n ) {\n io.err.write(\n chalk.red(\n `Invalid asset format \"${options.assetFormat}\". Valid formats: ${validAssetFormats.join(\", \")}\\n`\n )\n );\n process.exit(1);\n }\n const assetFormat = options.assetFormat as \"svg\" | \"png\";\n\n // Create output directories\n const outputDir = path.resolve(options.output);\n\n // Security: Only allow writes within cwd or user's home directory\n const cwd = process.cwd();\n const homeDir = process.env.HOME || \"\";\n if (!outputDir.startsWith(cwd) && !outputDir.startsWith(homeDir)) {\n io.err.write(\n chalk.red(\n `Error: Output directory \"${outputDir}\" is outside your project and home directory. ` +\n `Use a relative path or a path within your home directory.\\n`\n )\n );\n process.exit(1);\n }\n\n const tokensDir = path.join(outputDir, \"tokens\");\n const assetsDir = path.join(outputDir, \"assets\");\n\n fs.mkdirSync(tokensDir, { recursive: true });\n if (exportAssets) {\n fs.mkdirSync(assetsDir, { recursive: true });\n }\n\n io.err.write(chalk.dim(\"Fetching Figma file...\\n\"));\n\n const client = await factory.getClient();\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: options.token });\n }\n\n // Fetch file and styles\n const [file, stylesResponse] = await Promise.all([\n activeClient.getFile(fileKey),\n activeClient.getFileStyles(fileKey),\n ]);\n\n const styles = stylesResponse.meta?.styles || [];\n\n // Extract tokens\n io.err.write(chalk.dim(\"Extracting design tokens...\\n\"));\n const tokens = extractStylesFromFile(file, styles);\n\n // Export tokens in requested formats\n for (const format of tokenFormats) {\n let content: string;\n let filename: string;\n\n switch (format) {\n case \"css\":\n content = tokensToCss(tokens);\n filename = \"tokens.css\";\n break;\n case \"scss\":\n content = tokensToScss(tokens);\n filename = \"tokens.scss\";\n break;\n case \"json\":\n default:\n content = JSON.stringify(tokens, null, 2);\n filename = \"tokens.json\";\n break;\n }\n\n fs.writeFileSync(path.join(tokensDir, filename), content + \"\\n\");\n io.err.write(chalk.green(` ✓ ${filename}\\n`));\n }\n\n // Extract components for summary\n const components = extractComponents(file);\n const { pages, frames } = countPagesAndFrames(file);\n\n // Export assets\n if (exportAssets && components.length > 0) {\n io.err.write(chalk.dim(\"Exporting component assets...\\n\"));\n\n const componentIds = components.map((c) => c.id);\n const images = await activeClient.getImages(fileKey, componentIds, {\n format: assetFormat,\n });\n\n const imageUrls = images.images || {};\n\n if (Object.keys(imageUrls).length === 0) {\n io.err.write(\n chalk.yellow(\n \" Warning: No image URLs returned from Figma API.\\n\"\n )\n );\n }\n const downloadItems = Object.entries(imageUrls).map(\n ([nodeId, imageUrl]) => {\n const component = components.find((c) => c.id === nodeId);\n const filename = component\n ? `${toKebabCase(component.name)}.${assetFormat}`\n : `${sanitizeFilename(nodeId)}.${assetFormat}`;\n\n // Update component with asset filename\n if (component) {\n component.asset = filename;\n }\n\n return {\n id: nodeId,\n url: imageUrl ?? null,\n filename,\n };\n }\n );\n\n const downloadResults = await downloadFiles(\n downloadItems,\n assetsDir\n );\n\n // Report download results\n const successCount = downloadResults.filter(\n (r) => r.status === \"success\"\n ).length;\n const failures = downloadResults.filter(\n (r) => r.status === \"error\"\n );\n\n io.err.write(chalk.green(` ✓ ${successCount} assets exported\\n`));\n\n if (failures.length > 0) {\n io.err.write(\n chalk.yellow(\n ` Warning: ${failures.length} asset(s) failed to download:\\n`\n )\n );\n for (const failure of failures) {\n io.err.write(\n chalk.dim(\n ` - ${failure.name ?? failure.id}: ${failure.error}\\n`\n )\n );\n }\n process.exit(1);\n }\n }\n\n // Export structure\n if (exportStructure) {\n io.err.write(chalk.dim(\"Generating structure.json...\\n\"));\n const structure = extractSimplifiedStructure(file);\n fs.writeFileSync(\n path.join(outputDir, \"structure.json\"),\n JSON.stringify(structure, null, 2) + \"\\n\"\n );\n io.err.write(chalk.green(\" ✓ structure.json\\n\"));\n }\n\n // Generate README\n if (exportReadme) {\n io.err.write(chalk.dim(\"Generating HANDOFF.md...\\n\"));\n\n const summary: HandoffSummary = {\n name: file.name,\n url: `https://www.figma.com/file/${fileKey}`,\n generatedAt: new Date().toISOString(),\n tokens: countTokens(tokens),\n components,\n pages,\n frames,\n };\n\n const readme = generateHandoffReadme(summary, tokenFormats);\n fs.writeFileSync(path.join(outputDir, \"HANDOFF.md\"), readme);\n io.err.write(chalk.green(\" ✓ HANDOFF.md\\n\"));\n }\n\n io.out.write(\n chalk.bold.green(`\\n✓ Handoff package created at ${outputDir}\\n`)\n );\n } catch (error) {\n io.err.write(chalk.red(\"Error creating handoff package.\\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 { 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","resolve","fs","path","os","URL","resolve","Command","Command","chalk","chalk","Command","chalk","Command","chalk","Command","Command","Command","chalk","Command","FigmaClient","file","chalk","Command","chalk","Command","chalk","FigmaClient","nodes","Command","chalk","fs","path","DEFAULT_TIMEOUT_MS","Command","chalk","FigmaClient","url","Command","chalk","fs","path","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","Command","chalk","FigmaClient","Command","Command","Command","chalk","fs","Command","chalk","FigmaClient","Command","chalk","path","fs","Command","chalk","findIcons","hasDeepChildren","FigmaClient","Command","chalk","fs","path","Command","FigmaClient","chalk","Command","Command","chalk","Command","Command","chalk","traverseNode","formatTable","Command","chalk","FigmaClient","Command","Command","chalk","fs","path","Command","chalk","FigmaClient","Command"]}
|