@figma/code-connect 1.5.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -37,6 +37,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.collectNodesToPreview = collectNodesToPreview;
40
+ exports.fetchComponentPropertyDefinitionsBatch = fetchComponentPropertyDefinitionsBatch;
40
41
  exports.fetchComponentPropertyDefinitions = fetchComponentPropertyDefinitions;
41
42
  exports.parsePropsArg = parsePropsArg;
42
43
  exports.filterTemplatesForNodes = filterTemplatesForNodes;
@@ -142,48 +143,83 @@ async function collectNodesToPreview(files, allCodeConnectObjects, dir, cmd) {
142
143
  }
143
144
  return nodesToPreview;
144
145
  }
146
+ // Keep the comma-separated `ids` query comfortably below common URL limits while still
147
+ // loading a few hundred components from the same design-system file together.
148
+ const PROPERTY_SCHEMA_BATCH_SIZE = 200;
145
149
  /**
146
- * Fetch one node's property definitions from the REST `files/:key/nodes` endpoint.
150
+ * Fetch property definitions for several nodes in one REST `files/:key/nodes` request.
151
+ * That endpoint accepts comma-separated IDs, and loading the same file once per node is
152
+ * especially expensive for large design-system files.
147
153
  */
148
- async function fetchNodeSchema(baseApiUrl, fileKey, nodeId, accessToken) {
154
+ async function fetchNodeSchemaBatch(baseApiUrl, fileKey, nodeIds, accessToken) {
149
155
  try {
150
- const nodesUrl = `${baseApiUrl}/files/${fileKey}/nodes?ids=${nodeId}`;
156
+ const nodesUrl = `${baseApiUrl}/files/${fileKey}/nodes?ids=${nodeIds.join(',')}`;
151
157
  const resp = await fetch_1.request.get(nodesUrl, { headers: (0, figma_rest_api_1.getHeaders)(accessToken) });
152
158
  if (resp.response.status !== 200) {
153
- logging_1.logger.debug(`files/nodes returned ${resp.response.status} for ${nodeId}`);
154
- return { status: 'error' };
159
+ logging_1.logger.debug(`files/nodes returned ${resp.response.status} for ${nodeIds.length} node(s)`);
160
+ return Object.fromEntries(nodeIds.map((nodeId) => [nodeId, { status: 'error' }]));
155
161
  }
156
- const node = resp.data.nodes?.[nodeId];
157
- const componentSetId = node?.components?.[nodeId]?.componentSetId || undefined;
158
- const defs = node?.document?.componentPropertyDefinitions;
159
- if (defs && Object.keys(defs).length > 0)
160
- return { status: 'ok', defs, componentSetId };
161
- logging_1.logger.debug(`files/nodes returned no componentPropertyDefinitions for ${nodeId}`);
162
- return { status: 'empty', componentSetId };
162
+ return Object.fromEntries(nodeIds.map((nodeId) => {
163
+ const node = resp.data.nodes?.[nodeId];
164
+ const componentSetId = node?.components?.[nodeId]?.componentSetId || undefined;
165
+ const defs = node?.document?.componentPropertyDefinitions;
166
+ if (defs && Object.keys(defs).length > 0) {
167
+ return [nodeId, { status: 'ok', defs, componentSetId }];
168
+ }
169
+ logging_1.logger.debug(`files/nodes returned no componentPropertyDefinitions for ${nodeId}`);
170
+ return [nodeId, { status: 'empty', componentSetId }];
171
+ }));
163
172
  }
164
173
  catch (err) {
165
174
  const detail = (0, fetch_1.isFetchError)(err) ? `status ${err.response?.status}` : String(err);
166
- logging_1.logger.debug(`files/nodes fetch failed for ${nodeId} (${detail})`);
167
- return { status: 'error' };
175
+ logging_1.logger.debug(`files/nodes fetch failed for ${nodeIds.length} node(s) (${detail})`);
176
+ return Object.fromEntries(nodeIds.map((nodeId) => [nodeId, { status: 'error' }]));
177
+ }
178
+ }
179
+ async function fetchNodeSchemas(baseApiUrl, fileKey, nodeIds, accessToken) {
180
+ const results = {};
181
+ for (const batch of chunkArray([...new Set(nodeIds)], PROPERTY_SCHEMA_BATCH_SIZE)) {
182
+ Object.assign(results, await fetchNodeSchemaBatch(baseApiUrl, fileKey, batch, accessToken));
168
183
  }
184
+ return results;
169
185
  }
170
186
  /**
171
- * Fetch a component's property definitions from the REST `files/:key/nodes` endpoint.
187
+ * Fetch components' property definitions in batches: first the requested nodes, then
188
+ * any parent component sets discovered in those responses.
172
189
  */
190
+ async function fetchComponentPropertyDefinitionsBatch(baseApiUrl, fileKey, nodeIds, accessToken) {
191
+ const uniqueNodeIds = [...new Set(nodeIds)];
192
+ const nodeSchemas = await fetchNodeSchemas(baseApiUrl, fileKey, uniqueNodeIds, accessToken);
193
+ const requestedNodeIds = new Set(uniqueNodeIds);
194
+ const componentSetIds = [
195
+ ...new Set(Object.values(nodeSchemas)
196
+ .map((node) => (node.status === 'error' ? undefined : node.componentSetId))
197
+ .filter((id) => !!id && !requestedNodeIds.has(id))),
198
+ ];
199
+ const componentSetSchemas = await fetchNodeSchemas(baseApiUrl, fileKey, componentSetIds, accessToken);
200
+ return Object.fromEntries(uniqueNodeIds.map((nodeId) => {
201
+ const node = nodeSchemas[nodeId] ?? { status: 'error' };
202
+ if (node.status === 'error')
203
+ return [nodeId, { status: 'error' }];
204
+ // Variant child → resolve to the parent COMPONENT_SET (whose schema carries the
205
+ // variant axes). Fall back to the variant's own defs if the set can't be fetched.
206
+ if (node.componentSetId) {
207
+ const set = nodeSchemas[node.componentSetId] ?? componentSetSchemas[node.componentSetId];
208
+ if (set?.status === 'ok')
209
+ return [nodeId, { status: 'ok', defs: set.defs }];
210
+ logging_1.logger.debug(`Component set ${node.componentSetId} for variant ${nodeId} had no usable schema ` +
211
+ `(${set?.status ?? 'error'}); using the variant's own definitions`);
212
+ }
213
+ return [
214
+ nodeId,
215
+ node.status === 'ok' ? { status: 'ok', defs: node.defs } : { status: 'empty' },
216
+ ];
217
+ }));
218
+ }
219
+ /** Fetch one component's property definitions. */
173
220
  async function fetchComponentPropertyDefinitions(baseApiUrl, fileKey, nodeId, accessToken) {
174
- const node = await fetchNodeSchema(baseApiUrl, fileKey, nodeId, accessToken);
175
- if (node.status === 'error')
176
- return { status: 'error' };
177
- // Variant child → resolve to the parent COMPONENT_SET (whose schema carries the
178
- // variant axes). Fall back to the variant's own defs if the set can't be fetched.
179
- if (node.componentSetId) {
180
- const set = await fetchNodeSchema(baseApiUrl, fileKey, node.componentSetId, accessToken);
181
- if (set.status === 'ok')
182
- return { status: 'ok', defs: set.defs };
183
- logging_1.logger.debug(`Component set ${node.componentSetId} for variant ${nodeId} had no usable schema ` +
184
- `(${set.status}); using the variant's own definitions`);
185
- }
186
- return node.status === 'ok' ? { status: 'ok', defs: node.defs } : { status: 'empty' };
221
+ const results = await fetchComponentPropertyDefinitionsBatch(baseApiUrl, fileKey, [nodeId], accessToken);
222
+ return results[nodeId] ?? { status: 'error' };
187
223
  }
188
224
  /** Case-insensitive lookup of a `ComponentPropertyType` from a `--props` prefix token. */
189
225
  function parsePropertyTypePrefix(token) {
@@ -681,8 +717,10 @@ async function buildPropertyPreviewInputs({ enabled, baseApiUrl, fileKey, nodes,
681
717
  return {};
682
718
  const propertyCombinationsByNodeId = {};
683
719
  const availablePropsByNodeId = {};
684
- for (const nodeId of [...new Set(nodes.map((n) => n.nodeId))]) {
685
- const result = await fetchComponentPropertyDefinitions(baseApiUrl, fileKey, nodeId, accessToken);
720
+ const uniqueNodeIds = [...new Set(nodes.map((n) => n.nodeId))];
721
+ const definitionsByNodeId = await fetchComponentPropertyDefinitionsBatch(baseApiUrl, fileKey, uniqueNodeIds, accessToken);
722
+ for (const nodeId of uniqueNodeIds) {
723
+ const result = definitionsByNodeId[nodeId] ?? { status: 'error' };
686
724
  if (result.status === 'error') {
687
725
  logging_1.logger.warn(`Couldn't fetch property definitions for node ${nodeId} (ensure your token has the ` +
688
726
  `Code Connect: Write and File content: Read scopes); rendering its default property combination only`);
@@ -795,7 +833,7 @@ async function handlePreview(files, cmd) {
795
833
  const flag = expandFlagName(cmd);
796
834
  (0, logging_1.exitWithError)(`${flag} requires a specific component, e.g. \`figma connect preview Button.figma.ts ${flag}\``);
797
835
  }
798
- const allCodeConnectObjects = await (0, connect_1.getCodeConnectObjects)(cmd, projectInfo, true);
836
+ const allCodeConnectObjects = await (0, connect_1.getCodeConnectObjects)(cmd, projectInfo, { silent: true });
799
837
  const nodesToCheck = files && files.length > 0
800
838
  ? await collectNodesToPreview(files, allCodeConnectObjects, dir, cmd)
801
839
  : collectAllLocalNodesToPreview(allCodeConnectObjects, dir, cmd);
@@ -1 +1 @@
1
- {"version":3,"file":"preview_utils.js","sourceRoot":"","sources":["../../src/commands/preview_utils.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport chalk from 'chalk'\nimport * as prettier from 'prettier'\nimport { BaseCommand, getCodeConnectObjects, getAccessTokenOrExit, setupHandler } from './connect'\nimport { exitWithError, logger } from '../common/logging'\nimport { CodeConnectJSON } from '../connect/figma_connect'\nimport { parseFigmaNode } from '../connect/validation'\nimport { getProjectInfo } from '../connect/project'\nimport { getApiUrl, getHeaders, FigmaRestApi } from '../connect/figma_rest_api'\nimport { request, isFetchError } from '../common/fetch'\nimport { displayPropertyList, type PropertyListItem } from './property_list_table'\nimport {\n enumeratePropertyCombinations,\n buildPropertyCombinationFromProps,\n toAvailableProperties,\n type PropertyCombination,\n type AvailableProperty,\n} from '../connect/property_combinations'\nimport { collapsePreviewResults } from './preview_collapse'\n\ntype PreviewCommand = BaseCommand & { output?: string }\n\nexport interface NodeToPreview {\n fileKey: string\n nodeId: string\n url: string\n filePath: string\n}\n\nexport interface PreviewResult {\n url: string\n nodeId: string\n filePath: string\n success: boolean\n snippet?: string\n language?: string\n component?: string\n error?: string\n /** Present when this result is one property combination of an expanded (--all) render. */\n propertyCombinationLabel?: string\n /**\n * With `--unique`, the labels of all property combinations that produced this\n * identical output (the full `--all` cartesian often collapses to far fewer\n * distinct snippets).\n */\n propertyCombinationLabels?: string[]\n /** With `--unique`, how many property combinations produced this identical output. */\n propertyCombinationCount?: number\n /** `kind: \"transport\"` marks a server/network failure, in which case no property vocabulary is attached. */\n errorDetails?: {\n kind?: string\n missingProperty?: string\n availableProperties?: AvailableProperty[]\n }\n /** Nested instances/slots that rendered as placeholders. Not an error — the snippet still rendered. */\n unresolvedInstances?: Array<{ guid: string; name?: string; kind: 'instance' | 'slot' }>\n}\n\ntype NodesByFileKey = Record<string, NodeToPreview[]>\n\n/**\n * Collect nodes to preview from file arguments.\n * Matches by exact path first, then by basename.\n */\nexport async function collectNodesToPreview(\n files: string[],\n allCodeConnectObjects: CodeConnectJSON[],\n dir: string,\n cmd: BaseCommand,\n): Promise<NodeToPreview[]> {\n const nodesToPreview: NodeToPreview[] = []\n\n for (const filePath of files) {\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(dir, filePath)\n\n // Try exact path first\n if (fs.existsSync(resolvedPath) && fs.statSync(resolvedPath).isFile()) {\n const docs = allCodeConnectObjects.filter(\n (d) => path.resolve(d._codeConnectFilePath || '') === resolvedPath,\n )\n if (docs.length > 0) {\n if (docs.length === 1) {\n logger.info(`Found: ${filePath}`)\n } else {\n logger.info(`Found ${docs.length} component definition(s) in ${filePath}`)\n }\n for (const doc of docs) {\n const parsed = parseFigmaNode(cmd.verbose, doc, true)\n if (parsed) {\n nodesToPreview.push({\n fileKey: parsed.fileKey,\n nodeId: parsed.nodeId,\n url: doc.figmaNode,\n filePath: path.relative(dir, doc._codeConnectFilePath || ''),\n })\n } else {\n logger.error(`Failed to parse figmaNode from file: ${filePath}`)\n }\n }\n } else {\n logger.error(`Not a valid Code Connect file: ${filePath}`)\n }\n continue\n }\n\n // Fall back to basename matching\n const fileName = path.basename(filePath)\n if (cmd.verbose) {\n logger.debug(`Searching for files matching: ${fileName}`)\n logger.debug(`Total Code Connect objects: ${allCodeConnectObjects.length}`)\n }\n\n const matches = allCodeConnectObjects.filter(\n (d) => path.basename(d._codeConnectFilePath || '') === fileName,\n )\n\n if (matches.length === 0) {\n logger.error(`No files found matching: ${filePath}`)\n continue\n }\n\n if (matches.length === 1) {\n logger.info(`Found: ${matches[0]._codeConnectFilePath}`)\n } else {\n const uniqueFiles = new Set(matches.map((d) => d._codeConnectFilePath))\n if (uniqueFiles.size === 1) {\n logger.info(\n `Found ${matches.length} component definition(s) in ${path.relative(dir, Array.from(uniqueFiles)[0] || '')}`,\n )\n } else {\n logger.info(`Found ${matches.length} component definition(s) in ${uniqueFiles.size} files:`)\n for (const fp of uniqueFiles) {\n const count = matches.filter((d) => d._codeConnectFilePath === fp).length\n logger.info(\n ` - ${path.relative(dir, fp || '')} (${count} definition${count > 1 ? 's' : ''})`,\n )\n }\n }\n }\n\n for (const doc of matches) {\n const parsed = parseFigmaNode(cmd.verbose, doc, true)\n if (parsed) {\n nodesToPreview.push({\n fileKey: parsed.fileKey,\n nodeId: parsed.nodeId,\n url: doc.figmaNode,\n filePath: path.relative(dir, doc._codeConnectFilePath || ''),\n })\n }\n }\n }\n\n return nodesToPreview\n}\n\n/**\n * Outcome of fetching a component's property definitions.\n * - `ok`: definitions were found (includes VARIANT axes).\n * - `empty`: the node was fetched successfully but exposes no properties/variants\n * (e.g. a component with no variant axes or component properties, or a plain\n * frame). This is not an error — there is simply nothing to vary.\n * - `error`: the fetch failed (network / non-200), e.g. the token is missing a\n * required scope (Code Connect: Write and File content: Read).\n */\nexport type ComponentPropertyDefinitionsResult =\n | { status: 'ok'; defs: Record<string, FigmaRestApi.ComponentPropertyDefinition> }\n | { status: 'empty' }\n | { status: 'error' }\n\n/** A single node's schema plus its parent COMPONENT_SET id (set only for a variant child). */\ntype NodeSchemaResult =\n | {\n status: 'ok'\n defs: Record<string, FigmaRestApi.ComponentPropertyDefinition>\n componentSetId?: string\n }\n | { status: 'empty'; componentSetId?: string }\n | { status: 'error' }\n\n/**\n * Fetch one node's property definitions from the REST `files/:key/nodes` endpoint.\n */\nasync function fetchNodeSchema(\n baseApiUrl: string,\n fileKey: string,\n nodeId: string,\n accessToken: string,\n): Promise<NodeSchemaResult> {\n try {\n const nodesUrl = `${baseApiUrl}/files/${fileKey}/nodes?ids=${nodeId}`\n const resp = await request.get<{\n nodes: Record<\n string,\n {\n document?: {\n componentPropertyDefinitions?: Record<string, FigmaRestApi.ComponentPropertyDefinition>\n }\n // Per-node component metadata; a variant member carries its parent set id here.\n components?: Record<string, { componentSetId?: string }>\n }\n >\n }>(nodesUrl, { headers: getHeaders(accessToken) })\n if (resp.response.status !== 200) {\n logger.debug(`files/nodes returned ${resp.response.status} for ${nodeId}`)\n return { status: 'error' }\n }\n const node = resp.data.nodes?.[nodeId]\n const componentSetId = node?.components?.[nodeId]?.componentSetId || undefined\n const defs = node?.document?.componentPropertyDefinitions\n if (defs && Object.keys(defs).length > 0) return { status: 'ok', defs, componentSetId }\n logger.debug(`files/nodes returned no componentPropertyDefinitions for ${nodeId}`)\n return { status: 'empty', componentSetId }\n } catch (err) {\n const detail = isFetchError(err) ? `status ${err.response?.status}` : String(err)\n logger.debug(`files/nodes fetch failed for ${nodeId} (${detail})`)\n return { status: 'error' }\n }\n}\n\n/**\n * Fetch a component's property definitions from the REST `files/:key/nodes` endpoint.\n */\nexport async function fetchComponentPropertyDefinitions(\n baseApiUrl: string,\n fileKey: string,\n nodeId: string,\n accessToken: string,\n): Promise<ComponentPropertyDefinitionsResult> {\n const node = await fetchNodeSchema(baseApiUrl, fileKey, nodeId, accessToken)\n if (node.status === 'error') return { status: 'error' }\n\n // Variant child → resolve to the parent COMPONENT_SET (whose schema carries the\n // variant axes). Fall back to the variant's own defs if the set can't be fetched.\n if (node.componentSetId) {\n const set = await fetchNodeSchema(baseApiUrl, fileKey, node.componentSetId, accessToken)\n if (set.status === 'ok') return { status: 'ok', defs: set.defs }\n logger.debug(\n `Component set ${node.componentSetId} for variant ${nodeId} had no usable schema ` +\n `(${set.status}); using the variant's own definitions`,\n )\n }\n\n return node.status === 'ok' ? { status: 'ok', defs: node.defs } : { status: 'empty' }\n}\n\n/** Case-insensitive lookup of a `ComponentPropertyType` from a `--props` prefix token. */\nfunction parsePropertyTypePrefix(token: string): FigmaRestApi.ComponentPropertyType | undefined {\n const upper = token.trim().toUpperCase()\n return (Object.values(FigmaRestApi.ComponentPropertyType) as string[]).includes(upper)\n ? (upper as FigmaRestApi.ComponentPropertyType)\n : undefined\n}\n\ntype ParsedPropertyPair = {\n name: string\n value: string\n type?: FigmaRestApi.ComponentPropertyType\n}\n\n/**\n * Parse a single `--props` argument into a name/value pair, with an optional\n * `TYPE:` prefix to disambiguate properties that share a name but differ in\n * type (e.g. a BOOLEAN and a TEXT property both named `textMsg`).\n * Example: --props Variant=Primary \"Has Icon=true\" \"BOOLEAN:textMsg=false\"\n *\n * The prefix is only recognized when the token before the first `:` matches a\n * known property type (case-insensitive); otherwise the whole name-part is kept\n * as the property name, so real names containing `:` are preserved.\n */\nexport function parsePropsArg(props: string[]): ParsedPropertyPair[] {\n return props\n .flatMap((arg) => arg.split(','))\n .map((pair) => pair.trim())\n .filter((pair) => pair.length > 0)\n .map((pair) => {\n const eq = pair.indexOf('=')\n const namePart = (eq === -1 ? pair : pair.slice(0, eq)).trim()\n const value = eq === -1 ? '' : pair.slice(eq + 1).trim()\n\n const colon = namePart.indexOf(':')\n if (colon !== -1) {\n const type = parsePropertyTypePrefix(namePart.slice(0, colon))\n if (type) {\n return { name: namePart.slice(colon + 1).trim(), value, type }\n }\n }\n return { name: namePart, value }\n })\n}\n\n/**\n * Filter templates to only those matching the requested node IDs.\n */\nexport function filterTemplatesForNodes(\n nodeIds: string[],\n allTemplates: CodeConnectJSON[],\n): CodeConnectJSON[] {\n return allTemplates.filter((template) => {\n if (!template.figmaNode) return false\n const nodeIdMatch = template.figmaNode.match(/node-id=([^&\\s]+)/)\n if (!nodeIdMatch?.[1]) return false\n const templateNodeId = nodeIdMatch[1].replace(/-/g, ':')\n return nodeIds.includes(templateNodeId)\n })\n}\n\n/**\n * Aliases for Code Connect labels that don't directly match a Prettier language name.\n */\nconst CC_LABEL_ALIASES: Record<string, string> = {\n react: 'typescript',\n code: 'typescript',\n}\n\n/**\n * Map from Code Connect language labels to Prettier parser names,\n * built lazily from Prettier's getSupportInfo() on first access.\n * Lazy to avoid triggering plugin loading at module import time.\n */\nlet _prettierParserMap: Record<string, string> | null = null\n\nexport function getPrettierParserMap(): Record<string, string> {\n if (_prettierParserMap) return _prettierParserMap\n\n const info = prettier.getSupportInfo() as {\n languages: Array<{ name: string; parsers?: string[] }>\n }\n _prettierParserMap = {}\n\n for (const lang of info.languages) {\n if (lang.parsers?.[0]) {\n _prettierParserMap[lang.name.toLowerCase()] = lang.parsers[0]\n }\n }\n\n for (const [alias, target] of Object.entries(CC_LABEL_ALIASES)) {\n if (_prettierParserMap[target]) {\n _prettierParserMap[alias] = _prettierParserMap[target]\n }\n }\n\n return _prettierParserMap\n}\n\n/**\n * Check if a snippet can be parsed by Prettier.\n * Returns true for languages without a Prettier parser (nothing to validate).\n */\nexport async function isPrettierParseable(snippet: string, language?: string): Promise<boolean> {\n const lang = language?.toLowerCase()\n const parser = lang ? getPrettierParserMap()[lang] : 'typescript'\n\n if (!parser) {\n return true\n }\n\n try {\n await prettier.format(snippet, { parser })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Format snippet with Prettier.\n * Returns the snippet unmodified for languages Prettier doesn't support.\n */\nexport async function formatSnippet(snippet: string, language?: string): Promise<string> {\n const lang = language?.toLowerCase()\n const parser = lang ? getPrettierParserMap()[lang] : 'typescript'\n\n if (!parser) {\n return snippet\n }\n\n try {\n let formatted = await prettier.format(snippet, {\n parser,\n semi: false,\n singleQuote: true,\n printWidth: 80,\n tabWidth: 2,\n })\n formatted = formatted.replace(/^;\\s*/, '')\n return formatted\n } catch {\n logger.info(`Autoformatting couldn't be applied: language not supported or code is malformed`)\n return snippet\n }\n}\n\n/**\n * Display results with terminal colors\n */\nconst purple = chalk.ansi256(93)\nconst red = chalk.ansi256(196)\nconst gray = chalk.ansi256(243)\nconst yellow = chalk.ansi256(179)\n\nexport function displayResults(results: PreviewResult[]): void {\n console.log('')\n const successCount = results.filter((r) => r.success).length\n const errorCount = results.filter((r) => !r.success).length\n\n // A muted note when nested children rendered as placeholders (not an error).\n const printUnresolved = (result: PreviewResult) => {\n if (!result.unresolvedInstances?.length) return\n const names = result.unresolvedInstances.map((u) => u.name || u.guid).join(', ')\n console.log(\n ` ${yellow(`⚠ ${result.unresolvedInstances.length} nested instance(s) not Code Connected: ${names}`)}`,\n )\n }\n\n for (const result of results) {\n const otherCombinations = (result.propertyCombinationCount ?? 1) - 1\n const moreCombinations =\n otherCombinations > 0\n ? ` (+${otherCombinations} more property combination${otherCombinations > 1 ? 's' : ''})`\n : ''\n const combinationSuffix = result.propertyCombinationLabel\n ? ` ${gray(`— ${result.propertyCombinationLabel}${moreCombinations}`)}`\n : ''\n if (result.success && result.snippet) {\n const componentInfo = result.component ? ` ${gray(`→ ${result.component}`)}` : ''\n console.log(\n `${purple('●')} ${chalk.bold(result.filePath)}${componentInfo}${combinationSuffix}`,\n )\n console.log(` ${gray(result.url)}`)\n console.log('')\n\n const indentedSnippet = result.snippet\n .trim()\n .split('\\n')\n .map((line) => ' ' + line)\n .join('\\n')\n console.log(indentedSnippet)\n printUnresolved(result)\n console.log('')\n } else {\n const componentInfo = result.component ? ` ${gray(`(${result.component})`)}` : ''\n console.log(`${red('✕')} ${chalk.bold(result.filePath)}${componentInfo}${combinationSuffix}`)\n console.log(` ${gray(result.url)}`)\n console.log(` ${red('Error:')} ${result.error}`)\n // One-line repair hint: the offending property and the real vocabulary.\n // (Transport errors carry no vocabulary — nothing to hint.)\n const available = result.errorDetails?.availableProperties?.map((p) => p.name).join(', ')\n const missingProperty = result.errorDetails?.missingProperty\n if (missingProperty && available) {\n console.log(\n ` ${gray(`property \"${missingProperty}\" not found — available: ${available}`)}`,\n )\n } else if (available) {\n console.log(` ${gray(`available properties: ${available}`)}`)\n }\n printUnresolved(result)\n console.log('')\n }\n }\n\n const failed = errorCount > 0 ? red(`${errorCount} failed`) : gray(`${errorCount} failed`)\n console.log(`${chalk.bold('Summary:')} ${purple(`${successCount} succeeded`)}, ${failed}`)\n}\n\n// The server caps inbound request bodies at 5MB. The figmaDocs payload\n// (one Code Connect template per requested component) dominates the body size,\n// so for projects with many components we split into smaller chunks and send\n// them in parallel rather than risking a 413.\nconst PREVIEW_CHUNK_SIZE = 50\n// Bound the number of chunks in flight at once. Without this cap, large\n// libraries (~1k+ components) trigger N parallel preview requests, which\n// overwhelms upstream token validation and causes spurious 403 \"Invalid\n// token\" responses for the chunks that queue up too long.\nconst PREVIEW_MAX_CONCURRENCY = 5\n// Mirrors MAX_PROPERTY_COMBINATIONS_PER_REQUEST in pixie/code_connect_preview_handler.ts.\n// `--all` caps enumeration here and warns rather than sending a request that fails wholesale.\nconst MAX_PROPERTY_COMBINATIONS = 500\n\nexport function parseMaxCombinationsArg(value: string | undefined): number {\n if (value === undefined) {\n return MAX_PROPERTY_COMBINATIONS\n }\n const parsed = Number(value)\n if (!Number.isInteger(parsed) || parsed < 1) {\n exitWithError('--max-combinations must be a positive integer')\n }\n if (parsed > MAX_PROPERTY_COMBINATIONS) {\n exitWithError(`--max-combinations cannot exceed ${MAX_PROPERTY_COMBINATIONS}`)\n }\n return parsed\n}\n\ntype PreviewResponseData = {\n status: number\n error: boolean\n meta: {\n results: Array<{\n nodeId: string\n nodeUrl: string\n snippet?: string\n language?: string\n component?: string\n error?: string\n propertyCombinationLabel?: string\n errorKind?: string\n unresolvedInstances?: Array<{ guid: string; name?: string; kind: 'instance' | 'slot' }>\n }>\n }\n}\n\ntype ChunkOutcome = {\n chunkNodeIds: string[]\n response: Awaited<ReturnType<typeof request.post<PreviewResponseData>>> | null\n error: unknown\n}\n\nfunction chunkArray<T>(arr: T[], size: number): T[][] {\n const chunks: T[][] = []\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size))\n }\n return chunks\n}\n\n/**\n * Split node IDs into request chunks that respect BOTH the node-count cap\n * (PREVIEW_CHUNK_SIZE) and, when rendering property combinations, the server's\n * per-request combination cap (MAX_PROPERTY_COMBINATIONS).\n *\n * The server sums combinations across every node in a request and rejects the\n * whole request if the total exceeds the cap, so bundling by node count alone\n * can push several individually-valid nodes over the limit and fail them all.\n * Each node is already truncated to <= MAX_PROPERTY_COMBINATIONS upstream, so a\n * single node always fits (worst case: one node per chunk).\n */\nexport function chunkNodeIdsForPreview(\n nodeIds: string[],\n propertyCombinationsByNodeId?: Record<string, PropertyCombination[]>,\n): string[][] {\n if (!propertyCombinationsByNodeId) {\n return chunkArray(nodeIds, PREVIEW_CHUNK_SIZE)\n }\n\n const chunks: string[][] = []\n let current: string[] = []\n let currentCombinations = 0\n for (const nodeId of nodeIds) {\n const count = propertyCombinationsByNodeId[nodeId]?.length ?? 0\n // Close the current chunk before adding this node would breach either cap.\n if (\n current.length > 0 &&\n (current.length >= PREVIEW_CHUNK_SIZE ||\n currentCombinations + count > MAX_PROPERTY_COMBINATIONS)\n ) {\n chunks.push(current)\n current = []\n currentCombinations = 0\n }\n current.push(nodeId)\n currentCombinations += count\n }\n if (current.length > 0) chunks.push(current)\n return chunks\n}\n\nasync function runInWaves<T, R>(\n items: T[],\n fn: (item: T) => Promise<R>,\n maxConcurrency: number,\n): Promise<R[]> {\n const out: R[] = []\n for (let i = 0; i < items.length; i += maxConcurrency) {\n const wave = items.slice(i, i + maxConcurrency)\n const settled = await Promise.all(wave.map(fn))\n out.push(...settled)\n }\n return out\n}\n\nfunction sendPreviewChunk({\n chunkNodeIds,\n requiredTemplates,\n baseApiUrl,\n fileKey,\n accessToken,\n propertyCombinationsByNodeId,\n}: {\n chunkNodeIds: string[]\n requiredTemplates: CodeConnectJSON[]\n baseApiUrl: string\n fileKey: string\n accessToken: string\n propertyCombinationsByNodeId?: Record<string, PropertyCombination[]>\n}): Promise<ChunkOutcome> {\n const chunkTemplates = filterTemplatesForNodes(chunkNodeIds, requiredTemplates)\n // Only include property combinations for the node IDs in this chunk.\n let renderCombinations: Record<string, PropertyCombination[]> | undefined\n if (propertyCombinationsByNodeId) {\n renderCombinations = {}\n for (const nodeId of chunkNodeIds) {\n if (propertyCombinationsByNodeId[nodeId]) {\n renderCombinations[nodeId] = propertyCombinationsByNodeId[nodeId]\n }\n }\n }\n return request\n .post<PreviewResponseData>(\n `${baseApiUrl}/code_connect/preview_snippets?file_key=${fileKey}`,\n {\n nodeIds: chunkNodeIds,\n figmaDocs: { all: chunkTemplates },\n ...(renderCombinations && Object.keys(renderCombinations).length > 0\n ? { renderCombinations }\n : {}),\n },\n { headers: getHeaders(accessToken) },\n )\n .then((response) => ({ chunkNodeIds, response, error: null as unknown }))\n .catch((err: unknown) => ({ chunkNodeIds, response: null, error: err }))\n}\n\n/**\n * Parse the offending property name out of a \"property not found\" render error,\n * e.g. `PropertyNotFoundError: property 'Varient' not found` -> `Varient`.\n */\nexport function parseMissingProperty(error?: string): string | undefined {\n if (!error) return undefined\n const match =\n error.match(/propert(?:y|ies)[^'\"`]*['\"`]([^'\"`]+)['\"`]/i) ?? error.match(/['\"`]([^'\"`]+)['\"`]/)\n return match?.[1]\n}\n\n/** Build `errorDetails` for a failed result. Undefined when there's no property context (not --all). */\nfunction buildErrorDetails(\n error: string | undefined,\n errorKind: string | undefined,\n availableProperties: AvailableProperty[] | undefined,\n): PreviewResult['errorDetails'] {\n // Transport failure: network/backend problem, not a bad property — carry only the kind.\n if (errorKind === 'transport') return { kind: 'transport' }\n if (!availableProperties) return undefined\n const details: NonNullable<PreviewResult['errorDetails']> = { availableProperties }\n if (errorKind) details.kind = errorKind\n const missingProperty = parseMissingProperty(error)\n if (missingProperty) details.missingProperty = missingProperty\n return details\n}\n\nexport function chunkOutcomeToResults(\n outcome: ChunkOutcome,\n nodes: NodeToPreview[],\n fileKey: string,\n availablePropsByNodeId?: Record<string, AvailableProperty[]>,\n): PreviewResult[] {\n const { chunkNodeIds, response, error } = outcome\n const results: PreviewResult[] = []\n\n if (error) {\n const errorMsg = isFetchError(error)\n ? error.data?.message || error.response.statusText\n : String(error)\n // 503 means the server-side killswitch is on — surface the server's\n // message directly without the per-file/per-node noise so the user\n // sees a single clear line during an incident.\n if (isFetchError(error) && error.response.status === 503) {\n exitWithError(errorMsg)\n } else {\n logger.error(`Failed to preview components in file ${fileKey}: ${errorMsg}`)\n for (const nodeId of chunkNodeIds) {\n for (const node of nodes.filter((n) => n.nodeId === nodeId)) {\n results.push({\n url: node.url,\n nodeId: node.nodeId,\n filePath: node.filePath,\n success: false,\n error: errorMsg,\n // Chunk-level failure is a server/network error, not a template problem.\n errorDetails: { kind: 'transport' },\n })\n }\n }\n }\n return results\n }\n\n if (response!.response.status === 200 && response!.data.meta?.results) {\n // Track match index per nodeId so duplicate node IDs get the correct file attribution.\n // The server returns results in the same order as the templates we sent. Each chunk's\n // nodeIds are disjoint (we dedupe before chunking), so per-chunk indexing is correct.\n // Property-combination results are expanded renders of one node, not one result per\n // matching template, so they should not consume this per-template index.\n const nodeMatchIndex: Record<string, number> = {}\n for (const result of response!.data.meta.results) {\n const idx = nodeMatchIndex[result.nodeId] ?? 0\n const matchingNodes = nodes.filter((n) => n.nodeId === result.nodeId)\n const node = result.propertyCombinationLabel\n ? matchingNodes[0]\n : matchingNodes[idx] || matchingNodes[0]\n if (!result.propertyCombinationLabel) {\n nodeMatchIndex[result.nodeId] = idx + 1\n }\n const error = result.error || (!result.snippet ? 'No snippet returned by server' : undefined)\n const success = !result.error && !!result.snippet\n results.push({\n url: node?.url || result.nodeUrl,\n nodeId: result.nodeId,\n filePath: node?.filePath || '',\n success,\n snippet: result.snippet,\n language: result.language,\n component: result.component,\n error,\n ...(result.propertyCombinationLabel\n ? { propertyCombinationLabel: result.propertyCombinationLabel }\n : {}),\n ...(result.unresolvedInstances?.length\n ? { unresolvedInstances: result.unresolvedInstances }\n : {}),\n ...(success\n ? {}\n : {\n errorDetails: buildErrorDetails(\n error,\n result.errorKind,\n availablePropsByNodeId?.[result.nodeId],\n ),\n }),\n })\n }\n return results\n }\n\n for (const nodeId of chunkNodeIds) {\n for (const node of nodes.filter((n) => n.nodeId === nodeId)) {\n const error = `API request failed with status ${response!.response.status}`\n results.push({\n url: node.url,\n nodeId: node.nodeId,\n filePath: node.filePath,\n success: false,\n error,\n // Non-2xx from the endpoint is a transport-level failure, not a template problem.\n errorDetails: { kind: 'transport' },\n })\n }\n }\n return results\n}\n\nasync function previewFile({\n fileKey,\n nodes,\n baseApiUrl,\n accessToken,\n dir,\n allCodeConnectObjects,\n propertyCombinationsByNodeId,\n availablePropsByNodeId,\n}: {\n fileKey: string\n nodes: NodeToPreview[]\n baseApiUrl: string\n accessToken: string\n dir: string\n allCodeConnectObjects: CodeConnectJSON[]\n propertyCombinationsByNodeId?: Record<string, PropertyCombination[]>\n availablePropsByNodeId?: Record<string, AvailableProperty[]>\n}): Promise<PreviewResult[]> {\n const allNodeIds = nodes.map((n) => n.nodeId)\n // Deduplicate — multiple figma.connect() calls may share the same nodeId;\n // the individual templates are sent in figmaDocs and the server iterates per-template.\n const nodeIds = [...new Set(allNodeIds)]\n\n // Only send templates from the requested files — other files' templates\n // for the same nodeId exist on the server and shouldn't be rendered individually.\n const requestedFilePaths = new Set(nodes.map((n) => path.resolve(dir, n.filePath)))\n const requiredTemplates = filterTemplatesForNodes(allNodeIds, allCodeConnectObjects).filter((t) =>\n requestedFilePaths.has(path.resolve(t._codeConnectFilePath || '')),\n )\n\n const chunks = chunkNodeIdsForPreview(nodeIds, propertyCombinationsByNodeId)\n const outcomes = await runInWaves(\n chunks,\n (chunkNodeIds) =>\n sendPreviewChunk({\n chunkNodeIds,\n requiredTemplates,\n baseApiUrl,\n fileKey,\n accessToken,\n propertyCombinationsByNodeId,\n }),\n PREVIEW_MAX_CONCURRENCY,\n )\n\n return outcomes.flatMap((outcome) =>\n chunkOutcomeToResults(outcome, nodes, fileKey, availablePropsByNodeId),\n )\n}\n\nfunction collectAllLocalNodesToPreview(\n allCodeConnectObjects: CodeConnectJSON[],\n dir: string,\n cmd: BaseCommand,\n): NodeToPreview[] {\n const nodesToCheck: NodeToPreview[] = []\n for (const doc of allCodeConnectObjects) {\n const parsed = parseFigmaNode(cmd.verbose, doc, true)\n if (parsed) {\n nodesToCheck.push({\n fileKey: parsed.fileKey,\n nodeId: parsed.nodeId,\n url: doc.figmaNode,\n filePath: path.relative(dir, doc._codeConnectFilePath || ''),\n })\n }\n }\n return nodesToCheck\n}\n\nfunction groupNodesByFileKey(nodes: NodeToPreview[]): NodesByFileKey {\n const nodesByFileKey: NodesByFileKey = {}\n for (const node of nodes) {\n nodesByFileKey[node.fileKey] ??= []\n nodesByFileKey[node.fileKey].push(node)\n }\n return nodesByFileKey\n}\n\nasync function handleInspect({\n nodesByFileKey,\n configuredApiUrl,\n accessToken,\n outputFormat,\n}: {\n nodesByFileKey: NodesByFileKey\n configuredApiUrl?: string\n accessToken: string\n outputFormat: string\n}): Promise<void> {\n const items: PropertyListItem[] = []\n const seen = new Set<string>()\n for (const [fileKey, nodes] of Object.entries(nodesByFileKey)) {\n const baseApiUrl = getApiUrl(nodes[0].url, configuredApiUrl)\n for (const node of nodes) {\n const dedupeKey = `${node.filePath}::${node.nodeId}`\n if (seen.has(dedupeKey)) continue\n seen.add(dedupeKey)\n const result = await fetchComponentPropertyDefinitions(\n baseApiUrl,\n fileKey,\n node.nodeId,\n accessToken,\n )\n if (result.status === 'error') {\n logger.warn(`Couldn't fetch property definitions for node ${node.nodeId}`)\n } else if (result.status === 'empty') {\n logger.info(`Node ${node.nodeId} has no component properties or variants.`)\n }\n items.push({\n filePath: node.filePath,\n nodeId: node.nodeId,\n availableProperties: result.status === 'ok' ? toAvailableProperties(result.defs) : [],\n })\n }\n }\n\n if (outputFormat === 'json') {\n console.log(JSON.stringify(items, null, 2))\n } else {\n displayPropertyList(items)\n }\n}\n\n/**\n * `--unique` implies `--all`, so errors about combination expansion should name\n * the flag the user actually typed rather than the one commander set on their\n * behalf.\n */\nfunction expandFlagName(cmd: PreviewCommand): '--all' | '--unique' {\n return cmd.unique ? '--unique' : '--all'\n}\n\nexport function validatePreviewOptions(cmd: PreviewCommand): void {\n if (cmd.all && cmd.props) {\n const implied = cmd.unique ? ' (which implies --all)' : ''\n exitWithError(\n `Cannot combine --props and ${expandFlagName(cmd)}${implied}; use one or the other`,\n )\n }\n\n if (cmd.maxCombinations !== undefined && !cmd.all) {\n exitWithError('--max-combinations can only be used with --all or --unique')\n }\n}\n\nasync function buildPropertyPreviewInputs({\n enabled,\n baseApiUrl,\n fileKey,\n nodes,\n accessToken,\n propsPairs,\n maxCombinations,\n}: {\n enabled: boolean\n baseApiUrl: string\n fileKey: string\n nodes: NodeToPreview[]\n accessToken: string\n propsPairs?: ParsedPropertyPair[]\n maxCombinations: number\n}): Promise<{\n propertyCombinationsByNodeId?: Record<string, PropertyCombination[]>\n availablePropsByNodeId?: Record<string, AvailableProperty[]>\n}> {\n if (!enabled) return {}\n\n const propertyCombinationsByNodeId: Record<string, PropertyCombination[]> = {}\n const availablePropsByNodeId: Record<string, AvailableProperty[]> = {}\n for (const nodeId of [...new Set(nodes.map((n) => n.nodeId))]) {\n const result = await fetchComponentPropertyDefinitions(baseApiUrl, fileKey, nodeId, accessToken)\n if (result.status === 'error') {\n logger.warn(\n `Couldn't fetch property definitions for node ${nodeId} (ensure your token has the ` +\n `Code Connect: Write and File content: Read scopes); rendering its default property combination only`,\n )\n continue\n }\n if (result.status === 'empty') {\n // Not an error: the component simply has no properties or variants to vary.\n if (propsPairs) {\n logger.warn(\n `Node ${nodeId} has no component properties or variants, so --props ` +\n `(${propsPairs.map((p) => p.name).join(', ')}) has no effect; rendering its only property combination.`,\n )\n } else {\n logger.info(\n `Node ${nodeId} has no component properties or variants to vary; rendering its only property combination.`,\n )\n }\n continue\n }\n\n const defs = result.defs\n if (propsPairs) {\n const { propertyCombination, availableProperties, unknown, invalid, ambiguous } =\n buildPropertyCombinationFromProps(defs, propsPairs)\n if (unknown.length > 0) {\n logger.warn(\n `Unknown propert${unknown.length > 1 ? 'ies' : 'y'} for node ${nodeId}: ${unknown.join(', ')}. ` +\n `Available: ${availableProperties.map((p) => p.name).join(', ')}`,\n )\n }\n for (const { name, value, options } of invalid) {\n logger.warn(\n `\"${value}\" is not a valid value for ${name} on node ${nodeId}. Options: ${options.join(', ')}`,\n )\n }\n for (const { name, types } of ambiguous) {\n logger.warn(\n `Property \"${name}\" on node ${nodeId} matches multiple types (${types.join(', ')}); ` +\n `prefix the value with a type to disambiguate, e.g. ${types[0]}:${name}=... . Skipping.`,\n )\n }\n availablePropsByNodeId[nodeId] = availableProperties\n propertyCombinationsByNodeId[nodeId] = [propertyCombination]\n } else {\n const { propertyCombinations, availableProperties, truncated } =\n enumeratePropertyCombinations(defs, {\n maxCombinations,\n })\n availablePropsByNodeId[nodeId] = availableProperties\n if (truncated) {\n logger.warn(\n `Node ${nodeId} has ${truncated.total} property combinations, exceeding the ${truncated.cap}-combination ` +\n `preview limit; rendering the first ${truncated.cap}. Use --props to preview a ` +\n `specific property combination.`,\n )\n }\n if (propertyCombinations.length > 0) {\n propertyCombinationsByNodeId[nodeId] = propertyCombinations\n }\n }\n }\n\n return { propertyCombinationsByNodeId, availablePropsByNodeId }\n}\n\nasync function previewNodesForFile({\n fileKey,\n nodes,\n configuredApiUrl,\n accessToken,\n dir,\n allCodeConnectObjects,\n renderPropertyCombinations,\n propsPairs,\n maxCombinations,\n}: {\n fileKey: string\n nodes: NodeToPreview[]\n configuredApiUrl?: string\n accessToken: string\n dir: string\n allCodeConnectObjects: CodeConnectJSON[]\n renderPropertyCombinations: boolean\n propsPairs?: ParsedPropertyPair[]\n maxCombinations: number\n}): Promise<PreviewResult[]> {\n const baseApiUrl = getApiUrl(nodes[0].url, configuredApiUrl)\n const { propertyCombinationsByNodeId, availablePropsByNodeId } = await buildPropertyPreviewInputs(\n {\n enabled: renderPropertyCombinations,\n baseApiUrl,\n fileKey,\n nodes,\n accessToken,\n propsPairs,\n maxCombinations,\n },\n )\n\n return previewFile({\n fileKey,\n nodes,\n baseApiUrl,\n accessToken,\n dir,\n allCodeConnectObjects,\n propertyCombinationsByNodeId,\n availablePropsByNodeId,\n })\n}\n\nasync function validateRenderedSnippets(results: PreviewResult[]): Promise<void> {\n for (const result of results) {\n if (result.success && result.snippet) {\n const prettierValid = await isPrettierParseable(result.snippet, result.language)\n if (!prettierValid) {\n // Prettier can parse this language but failed — mark as error\n result.success = false\n result.error = 'Snippet has syntax errors and may not be valid code'\n }\n }\n }\n}\n\nasync function outputPreviewResults(results: PreviewResult[], outputFormat: string): Promise<void> {\n if (outputFormat === 'json') {\n console.log(JSON.stringify(results, null, 2))\n return\n }\n\n const formattedResults: PreviewResult[] = await Promise.all(\n results.map(async (result) => {\n if (result.success && result.snippet) {\n const formattedSnippet = await formatSnippet(result.snippet, result.language)\n return { ...result, snippet: formattedSnippet }\n }\n return result\n }),\n )\n displayResults(formattedResults)\n}\n\n/**\n * Handle the preview command\n */\nexport async function handlePreview(files: string[], cmd: PreviewCommand) {\n setupHandler(cmd)\n\n const dir = cmd.dir ?? process.cwd()\n const projectInfo = await getProjectInfo(dir, cmd.config)\n const accessToken = getAccessTokenOrExit(cmd)\n const outputFormat = cmd.output || 'table'\n const configuredApiUrl = cmd.apiUrl || projectInfo.config.apiUrl\n\n if (cmd.all && (!files || files.length === 0)) {\n const flag = expandFlagName(cmd)\n exitWithError(\n `${flag} requires a specific component, e.g. \\`figma connect preview Button.figma.ts ${flag}\\``,\n )\n }\n\n const allCodeConnectObjects = await getCodeConnectObjects(cmd, projectInfo, true)\n\n const nodesToCheck =\n files && files.length > 0\n ? await collectNodesToPreview(files, allCodeConnectObjects, dir, cmd)\n : collectAllLocalNodesToPreview(allCodeConnectObjects, dir, cmd)\n if (!files || files.length === 0) {\n logger.info('Previewing all local Code Connect files...')\n }\n\n if (nodesToCheck.length === 0) {\n exitWithError('No valid Code Connect files found to preview')\n }\n\n logger.info(`Previewing ${nodesToCheck.length} component(s)...`)\n const nodesByFileKey = groupNodesByFileKey(nodesToCheck)\n\n if (cmd.inspect) {\n await handleInspect({\n nodesByFileKey,\n configuredApiUrl,\n accessToken,\n outputFormat,\n })\n return\n }\n\n validatePreviewOptions(cmd)\n const maxCombinations = parseMaxCombinationsArg(cmd.maxCombinations)\n const propsPairs = cmd.props ? parsePropsArg(cmd.props) : undefined\n\n const results: PreviewResult[] = []\n for (const [fileKey, nodes] of Object.entries(nodesByFileKey)) {\n const fileResults = await previewNodesForFile({\n fileKey,\n nodes,\n configuredApiUrl,\n accessToken,\n dir,\n allCodeConnectObjects,\n renderPropertyCombinations: cmd.all || !!propsPairs,\n propsPairs,\n maxCombinations,\n })\n results.push(...fileResults)\n }\n\n await validateRenderedSnippets(results)\n\n const outputResults = cmd.unique ? collapsePreviewResults(results) : results\n if (cmd.unique && outputResults.length !== results.length) {\n logger.info(\n `${outputResults.length} distinct of ${results.length} rendered property combinations`,\n )\n }\n\n await outputPreviewResults(outputResults, outputFormat)\n\n if (outputResults.every((r) => !r.success)) {\n process.exit(1)\n }\n}\n"]}
1
+ {"version":3,"file":"preview_utils.js","sourceRoot":"","sources":["../../src/commands/preview_utils.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport chalk from 'chalk'\nimport * as prettier from 'prettier'\nimport { BaseCommand, getCodeConnectObjects, getAccessTokenOrExit, setupHandler } from './connect'\nimport { exitWithError, logger } from '../common/logging'\nimport { CodeConnectJSON } from '../connect/figma_connect'\nimport { parseFigmaNode } from '../connect/validation'\nimport { getProjectInfo } from '../connect/project'\nimport { getApiUrl, getHeaders, FigmaRestApi } from '../connect/figma_rest_api'\nimport { request, isFetchError } from '../common/fetch'\nimport { displayPropertyList, type PropertyListItem } from './property_list_table'\nimport {\n enumeratePropertyCombinations,\n buildPropertyCombinationFromProps,\n toAvailableProperties,\n type PropertyCombination,\n type AvailableProperty,\n} from '../connect/property_combinations'\nimport { collapsePreviewResults } from './preview_collapse'\n\ntype PreviewCommand = BaseCommand & { output?: string }\n\nexport interface NodeToPreview {\n fileKey: string\n nodeId: string\n url: string\n filePath: string\n}\n\nexport interface PreviewResult {\n url: string\n nodeId: string\n filePath: string\n success: boolean\n snippet?: string\n language?: string\n component?: string\n error?: string\n /** Present when this result is one property combination of an expanded (--all) render. */\n propertyCombinationLabel?: string\n /**\n * With `--unique`, the labels of all property combinations that produced this\n * identical output (the full `--all` cartesian often collapses to far fewer\n * distinct snippets).\n */\n propertyCombinationLabels?: string[]\n /** With `--unique`, how many property combinations produced this identical output. */\n propertyCombinationCount?: number\n /** `kind: \"transport\"` marks a server/network failure, in which case no property vocabulary is attached. */\n errorDetails?: {\n kind?: string\n missingProperty?: string\n availableProperties?: AvailableProperty[]\n }\n /** Nested instances/slots that rendered as placeholders. Not an error — the snippet still rendered. */\n unresolvedInstances?: Array<{ guid: string; name?: string; kind: 'instance' | 'slot' }>\n}\n\ntype NodesByFileKey = Record<string, NodeToPreview[]>\n\n/**\n * Collect nodes to preview from file arguments.\n * Matches by exact path first, then by basename.\n */\nexport async function collectNodesToPreview(\n files: string[],\n allCodeConnectObjects: CodeConnectJSON[],\n dir: string,\n cmd: BaseCommand,\n): Promise<NodeToPreview[]> {\n const nodesToPreview: NodeToPreview[] = []\n\n for (const filePath of files) {\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(dir, filePath)\n\n // Try exact path first\n if (fs.existsSync(resolvedPath) && fs.statSync(resolvedPath).isFile()) {\n const docs = allCodeConnectObjects.filter(\n (d) => path.resolve(d._codeConnectFilePath || '') === resolvedPath,\n )\n if (docs.length > 0) {\n if (docs.length === 1) {\n logger.info(`Found: ${filePath}`)\n } else {\n logger.info(`Found ${docs.length} component definition(s) in ${filePath}`)\n }\n for (const doc of docs) {\n const parsed = parseFigmaNode(cmd.verbose, doc, true)\n if (parsed) {\n nodesToPreview.push({\n fileKey: parsed.fileKey,\n nodeId: parsed.nodeId,\n url: doc.figmaNode,\n filePath: path.relative(dir, doc._codeConnectFilePath || ''),\n })\n } else {\n logger.error(`Failed to parse figmaNode from file: ${filePath}`)\n }\n }\n } else {\n logger.error(`Not a valid Code Connect file: ${filePath}`)\n }\n continue\n }\n\n // Fall back to basename matching\n const fileName = path.basename(filePath)\n if (cmd.verbose) {\n logger.debug(`Searching for files matching: ${fileName}`)\n logger.debug(`Total Code Connect objects: ${allCodeConnectObjects.length}`)\n }\n\n const matches = allCodeConnectObjects.filter(\n (d) => path.basename(d._codeConnectFilePath || '') === fileName,\n )\n\n if (matches.length === 0) {\n logger.error(`No files found matching: ${filePath}`)\n continue\n }\n\n if (matches.length === 1) {\n logger.info(`Found: ${matches[0]._codeConnectFilePath}`)\n } else {\n const uniqueFiles = new Set(matches.map((d) => d._codeConnectFilePath))\n if (uniqueFiles.size === 1) {\n logger.info(\n `Found ${matches.length} component definition(s) in ${path.relative(dir, Array.from(uniqueFiles)[0] || '')}`,\n )\n } else {\n logger.info(`Found ${matches.length} component definition(s) in ${uniqueFiles.size} files:`)\n for (const fp of uniqueFiles) {\n const count = matches.filter((d) => d._codeConnectFilePath === fp).length\n logger.info(\n ` - ${path.relative(dir, fp || '')} (${count} definition${count > 1 ? 's' : ''})`,\n )\n }\n }\n }\n\n for (const doc of matches) {\n const parsed = parseFigmaNode(cmd.verbose, doc, true)\n if (parsed) {\n nodesToPreview.push({\n fileKey: parsed.fileKey,\n nodeId: parsed.nodeId,\n url: doc.figmaNode,\n filePath: path.relative(dir, doc._codeConnectFilePath || ''),\n })\n }\n }\n }\n\n return nodesToPreview\n}\n\n/**\n * Outcome of fetching a component's property definitions.\n * - `ok`: definitions were found (includes VARIANT axes).\n * - `empty`: the node was fetched successfully but exposes no properties/variants\n * (e.g. a component with no variant axes or component properties, or a plain\n * frame). This is not an error — there is simply nothing to vary.\n * - `error`: the fetch failed (network / non-200), e.g. the token is missing a\n * required scope (Code Connect: Write and File content: Read).\n */\nexport type ComponentPropertyDefinitionsResult =\n | { status: 'ok'; defs: Record<string, FigmaRestApi.ComponentPropertyDefinition> }\n | { status: 'empty' }\n | { status: 'error' }\n\n/** A single node's schema plus its parent COMPONENT_SET id (set only for a variant child). */\ntype NodeSchemaResult =\n | {\n status: 'ok'\n defs: Record<string, FigmaRestApi.ComponentPropertyDefinition>\n componentSetId?: string\n }\n | { status: 'empty'; componentSetId?: string }\n | { status: 'error' }\n\n// Keep the comma-separated `ids` query comfortably below common URL limits while still\n// loading a few hundred components from the same design-system file together.\nconst PROPERTY_SCHEMA_BATCH_SIZE = 200\n\ntype FetchedNode = {\n document?: {\n componentPropertyDefinitions?: Record<string, FigmaRestApi.ComponentPropertyDefinition>\n }\n // Per-node component metadata; a variant member carries its parent set id here.\n components?: Record<string, { componentSetId?: string }>\n}\n\n/**\n * Fetch property definitions for several nodes in one REST `files/:key/nodes` request.\n * That endpoint accepts comma-separated IDs, and loading the same file once per node is\n * especially expensive for large design-system files.\n */\nasync function fetchNodeSchemaBatch(\n baseApiUrl: string,\n fileKey: string,\n nodeIds: string[],\n accessToken: string,\n): Promise<Record<string, NodeSchemaResult>> {\n try {\n const nodesUrl = `${baseApiUrl}/files/${fileKey}/nodes?ids=${nodeIds.join(',')}`\n const resp = await request.get<{\n nodes: Record<string, FetchedNode>\n }>(nodesUrl, { headers: getHeaders(accessToken) })\n if (resp.response.status !== 200) {\n logger.debug(`files/nodes returned ${resp.response.status} for ${nodeIds.length} node(s)`)\n return Object.fromEntries(nodeIds.map((nodeId) => [nodeId, { status: 'error' }]))\n }\n\n return Object.fromEntries(\n nodeIds.map((nodeId): [string, NodeSchemaResult] => {\n const node = resp.data.nodes?.[nodeId]\n const componentSetId = node?.components?.[nodeId]?.componentSetId || undefined\n const defs = node?.document?.componentPropertyDefinitions\n if (defs && Object.keys(defs).length > 0) {\n return [nodeId, { status: 'ok', defs, componentSetId }]\n }\n logger.debug(`files/nodes returned no componentPropertyDefinitions for ${nodeId}`)\n return [nodeId, { status: 'empty', componentSetId }]\n }),\n )\n } catch (err) {\n const detail = isFetchError(err) ? `status ${err.response?.status}` : String(err)\n logger.debug(`files/nodes fetch failed for ${nodeIds.length} node(s) (${detail})`)\n return Object.fromEntries(nodeIds.map((nodeId) => [nodeId, { status: 'error' }]))\n }\n}\n\nasync function fetchNodeSchemas(\n baseApiUrl: string,\n fileKey: string,\n nodeIds: string[],\n accessToken: string,\n): Promise<Record<string, NodeSchemaResult>> {\n const results: Record<string, NodeSchemaResult> = {}\n for (const batch of chunkArray([...new Set(nodeIds)], PROPERTY_SCHEMA_BATCH_SIZE)) {\n Object.assign(results, await fetchNodeSchemaBatch(baseApiUrl, fileKey, batch, accessToken))\n }\n return results\n}\n\n/**\n * Fetch components' property definitions in batches: first the requested nodes, then\n * any parent component sets discovered in those responses.\n */\nexport async function fetchComponentPropertyDefinitionsBatch(\n baseApiUrl: string,\n fileKey: string,\n nodeIds: string[],\n accessToken: string,\n): Promise<Record<string, ComponentPropertyDefinitionsResult>> {\n const uniqueNodeIds = [...new Set(nodeIds)]\n const nodeSchemas = await fetchNodeSchemas(baseApiUrl, fileKey, uniqueNodeIds, accessToken)\n const requestedNodeIds = new Set(uniqueNodeIds)\n const componentSetIds = [\n ...new Set(\n Object.values(nodeSchemas)\n .map((node) => (node.status === 'error' ? undefined : node.componentSetId))\n .filter((id): id is string => !!id && !requestedNodeIds.has(id)),\n ),\n ]\n const componentSetSchemas = await fetchNodeSchemas(\n baseApiUrl,\n fileKey,\n componentSetIds,\n accessToken,\n )\n\n return Object.fromEntries(\n uniqueNodeIds.map((nodeId): [string, ComponentPropertyDefinitionsResult] => {\n const node = nodeSchemas[nodeId] ?? { status: 'error' }\n if (node.status === 'error') return [nodeId, { status: 'error' }]\n\n // Variant child → resolve to the parent COMPONENT_SET (whose schema carries the\n // variant axes). Fall back to the variant's own defs if the set can't be fetched.\n if (node.componentSetId) {\n const set = nodeSchemas[node.componentSetId] ?? componentSetSchemas[node.componentSetId]\n if (set?.status === 'ok') return [nodeId, { status: 'ok', defs: set.defs }]\n logger.debug(\n `Component set ${node.componentSetId} for variant ${nodeId} had no usable schema ` +\n `(${set?.status ?? 'error'}); using the variant's own definitions`,\n )\n }\n\n return [\n nodeId,\n node.status === 'ok' ? { status: 'ok', defs: node.defs } : { status: 'empty' },\n ]\n }),\n )\n}\n\n/** Fetch one component's property definitions. */\nexport async function fetchComponentPropertyDefinitions(\n baseApiUrl: string,\n fileKey: string,\n nodeId: string,\n accessToken: string,\n): Promise<ComponentPropertyDefinitionsResult> {\n const results = await fetchComponentPropertyDefinitionsBatch(\n baseApiUrl,\n fileKey,\n [nodeId],\n accessToken,\n )\n\n return results[nodeId] ?? { status: 'error' }\n}\n\n/** Case-insensitive lookup of a `ComponentPropertyType` from a `--props` prefix token. */\nfunction parsePropertyTypePrefix(token: string): FigmaRestApi.ComponentPropertyType | undefined {\n const upper = token.trim().toUpperCase()\n return (Object.values(FigmaRestApi.ComponentPropertyType) as string[]).includes(upper)\n ? (upper as FigmaRestApi.ComponentPropertyType)\n : undefined\n}\n\ntype ParsedPropertyPair = {\n name: string\n value: string\n type?: FigmaRestApi.ComponentPropertyType\n}\n\n/**\n * Parse a single `--props` argument into a name/value pair, with an optional\n * `TYPE:` prefix to disambiguate properties that share a name but differ in\n * type (e.g. a BOOLEAN and a TEXT property both named `textMsg`).\n * Example: --props Variant=Primary \"Has Icon=true\" \"BOOLEAN:textMsg=false\"\n *\n * The prefix is only recognized when the token before the first `:` matches a\n * known property type (case-insensitive); otherwise the whole name-part is kept\n * as the property name, so real names containing `:` are preserved.\n */\nexport function parsePropsArg(props: string[]): ParsedPropertyPair[] {\n return props\n .flatMap((arg) => arg.split(','))\n .map((pair) => pair.trim())\n .filter((pair) => pair.length > 0)\n .map((pair) => {\n const eq = pair.indexOf('=')\n const namePart = (eq === -1 ? pair : pair.slice(0, eq)).trim()\n const value = eq === -1 ? '' : pair.slice(eq + 1).trim()\n\n const colon = namePart.indexOf(':')\n if (colon !== -1) {\n const type = parsePropertyTypePrefix(namePart.slice(0, colon))\n if (type) {\n return { name: namePart.slice(colon + 1).trim(), value, type }\n }\n }\n return { name: namePart, value }\n })\n}\n\n/**\n * Filter templates to only those matching the requested node IDs.\n */\nexport function filterTemplatesForNodes(\n nodeIds: string[],\n allTemplates: CodeConnectJSON[],\n): CodeConnectJSON[] {\n return allTemplates.filter((template) => {\n if (!template.figmaNode) return false\n const nodeIdMatch = template.figmaNode.match(/node-id=([^&\\s]+)/)\n if (!nodeIdMatch?.[1]) return false\n const templateNodeId = nodeIdMatch[1].replace(/-/g, ':')\n return nodeIds.includes(templateNodeId)\n })\n}\n\n/**\n * Aliases for Code Connect labels that don't directly match a Prettier language name.\n */\nconst CC_LABEL_ALIASES: Record<string, string> = {\n react: 'typescript',\n code: 'typescript',\n}\n\n/**\n * Map from Code Connect language labels to Prettier parser names,\n * built lazily from Prettier's getSupportInfo() on first access.\n * Lazy to avoid triggering plugin loading at module import time.\n */\nlet _prettierParserMap: Record<string, string> | null = null\n\nexport function getPrettierParserMap(): Record<string, string> {\n if (_prettierParserMap) return _prettierParserMap\n\n const info = prettier.getSupportInfo() as {\n languages: Array<{ name: string; parsers?: string[] }>\n }\n _prettierParserMap = {}\n\n for (const lang of info.languages) {\n if (lang.parsers?.[0]) {\n _prettierParserMap[lang.name.toLowerCase()] = lang.parsers[0]\n }\n }\n\n for (const [alias, target] of Object.entries(CC_LABEL_ALIASES)) {\n if (_prettierParserMap[target]) {\n _prettierParserMap[alias] = _prettierParserMap[target]\n }\n }\n\n return _prettierParserMap\n}\n\n/**\n * Check if a snippet can be parsed by Prettier.\n * Returns true for languages without a Prettier parser (nothing to validate).\n */\nexport async function isPrettierParseable(snippet: string, language?: string): Promise<boolean> {\n const lang = language?.toLowerCase()\n const parser = lang ? getPrettierParserMap()[lang] : 'typescript'\n\n if (!parser) {\n return true\n }\n\n try {\n await prettier.format(snippet, { parser })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Format snippet with Prettier.\n * Returns the snippet unmodified for languages Prettier doesn't support.\n */\nexport async function formatSnippet(snippet: string, language?: string): Promise<string> {\n const lang = language?.toLowerCase()\n const parser = lang ? getPrettierParserMap()[lang] : 'typescript'\n\n if (!parser) {\n return snippet\n }\n\n try {\n let formatted = await prettier.format(snippet, {\n parser,\n semi: false,\n singleQuote: true,\n printWidth: 80,\n tabWidth: 2,\n })\n formatted = formatted.replace(/^;\\s*/, '')\n return formatted\n } catch {\n logger.info(`Autoformatting couldn't be applied: language not supported or code is malformed`)\n return snippet\n }\n}\n\n/**\n * Display results with terminal colors\n */\nconst purple = chalk.ansi256(93)\nconst red = chalk.ansi256(196)\nconst gray = chalk.ansi256(243)\nconst yellow = chalk.ansi256(179)\n\nexport function displayResults(results: PreviewResult[]): void {\n console.log('')\n const successCount = results.filter((r) => r.success).length\n const errorCount = results.filter((r) => !r.success).length\n\n // A muted note when nested children rendered as placeholders (not an error).\n const printUnresolved = (result: PreviewResult) => {\n if (!result.unresolvedInstances?.length) return\n const names = result.unresolvedInstances.map((u) => u.name || u.guid).join(', ')\n console.log(\n ` ${yellow(`⚠ ${result.unresolvedInstances.length} nested instance(s) not Code Connected: ${names}`)}`,\n )\n }\n\n for (const result of results) {\n const otherCombinations = (result.propertyCombinationCount ?? 1) - 1\n const moreCombinations =\n otherCombinations > 0\n ? ` (+${otherCombinations} more property combination${otherCombinations > 1 ? 's' : ''})`\n : ''\n const combinationSuffix = result.propertyCombinationLabel\n ? ` ${gray(`— ${result.propertyCombinationLabel}${moreCombinations}`)}`\n : ''\n if (result.success && result.snippet) {\n const componentInfo = result.component ? ` ${gray(`→ ${result.component}`)}` : ''\n console.log(\n `${purple('●')} ${chalk.bold(result.filePath)}${componentInfo}${combinationSuffix}`,\n )\n console.log(` ${gray(result.url)}`)\n console.log('')\n\n const indentedSnippet = result.snippet\n .trim()\n .split('\\n')\n .map((line) => ' ' + line)\n .join('\\n')\n console.log(indentedSnippet)\n printUnresolved(result)\n console.log('')\n } else {\n const componentInfo = result.component ? ` ${gray(`(${result.component})`)}` : ''\n console.log(`${red('✕')} ${chalk.bold(result.filePath)}${componentInfo}${combinationSuffix}`)\n console.log(` ${gray(result.url)}`)\n console.log(` ${red('Error:')} ${result.error}`)\n // One-line repair hint: the offending property and the real vocabulary.\n // (Transport errors carry no vocabulary — nothing to hint.)\n const available = result.errorDetails?.availableProperties?.map((p) => p.name).join(', ')\n const missingProperty = result.errorDetails?.missingProperty\n if (missingProperty && available) {\n console.log(\n ` ${gray(`property \"${missingProperty}\" not found — available: ${available}`)}`,\n )\n } else if (available) {\n console.log(` ${gray(`available properties: ${available}`)}`)\n }\n printUnresolved(result)\n console.log('')\n }\n }\n\n const failed = errorCount > 0 ? red(`${errorCount} failed`) : gray(`${errorCount} failed`)\n console.log(`${chalk.bold('Summary:')} ${purple(`${successCount} succeeded`)}, ${failed}`)\n}\n\n// The server caps inbound request bodies at 5MB. The figmaDocs payload\n// (one Code Connect template per requested component) dominates the body size,\n// so for projects with many components we split into smaller chunks and send\n// them in parallel rather than risking a 413.\nconst PREVIEW_CHUNK_SIZE = 50\n// Bound the number of chunks in flight at once. Without this cap, large\n// libraries (~1k+ components) trigger N parallel preview requests, which\n// overwhelms upstream token validation and causes spurious 403 \"Invalid\n// token\" responses for the chunks that queue up too long.\nconst PREVIEW_MAX_CONCURRENCY = 5\n// Mirrors MAX_PROPERTY_COMBINATIONS_PER_REQUEST in pixie/code_connect_preview_handler.ts.\n// `--all` caps enumeration here and warns rather than sending a request that fails wholesale.\nconst MAX_PROPERTY_COMBINATIONS = 500\n\nexport function parseMaxCombinationsArg(value: string | undefined): number {\n if (value === undefined) {\n return MAX_PROPERTY_COMBINATIONS\n }\n const parsed = Number(value)\n if (!Number.isInteger(parsed) || parsed < 1) {\n exitWithError('--max-combinations must be a positive integer')\n }\n if (parsed > MAX_PROPERTY_COMBINATIONS) {\n exitWithError(`--max-combinations cannot exceed ${MAX_PROPERTY_COMBINATIONS}`)\n }\n return parsed\n}\n\ntype PreviewResponseData = {\n status: number\n error: boolean\n meta: {\n results: Array<{\n nodeId: string\n nodeUrl: string\n snippet?: string\n language?: string\n component?: string\n error?: string\n propertyCombinationLabel?: string\n errorKind?: string\n unresolvedInstances?: Array<{ guid: string; name?: string; kind: 'instance' | 'slot' }>\n }>\n }\n}\n\ntype ChunkOutcome = {\n chunkNodeIds: string[]\n response: Awaited<ReturnType<typeof request.post<PreviewResponseData>>> | null\n error: unknown\n}\n\nfunction chunkArray<T>(arr: T[], size: number): T[][] {\n const chunks: T[][] = []\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size))\n }\n return chunks\n}\n\n/**\n * Split node IDs into request chunks that respect BOTH the node-count cap\n * (PREVIEW_CHUNK_SIZE) and, when rendering property combinations, the server's\n * per-request combination cap (MAX_PROPERTY_COMBINATIONS).\n *\n * The server sums combinations across every node in a request and rejects the\n * whole request if the total exceeds the cap, so bundling by node count alone\n * can push several individually-valid nodes over the limit and fail them all.\n * Each node is already truncated to <= MAX_PROPERTY_COMBINATIONS upstream, so a\n * single node always fits (worst case: one node per chunk).\n */\nexport function chunkNodeIdsForPreview(\n nodeIds: string[],\n propertyCombinationsByNodeId?: Record<string, PropertyCombination[]>,\n): string[][] {\n if (!propertyCombinationsByNodeId) {\n return chunkArray(nodeIds, PREVIEW_CHUNK_SIZE)\n }\n\n const chunks: string[][] = []\n let current: string[] = []\n let currentCombinations = 0\n for (const nodeId of nodeIds) {\n const count = propertyCombinationsByNodeId[nodeId]?.length ?? 0\n // Close the current chunk before adding this node would breach either cap.\n if (\n current.length > 0 &&\n (current.length >= PREVIEW_CHUNK_SIZE ||\n currentCombinations + count > MAX_PROPERTY_COMBINATIONS)\n ) {\n chunks.push(current)\n current = []\n currentCombinations = 0\n }\n current.push(nodeId)\n currentCombinations += count\n }\n if (current.length > 0) chunks.push(current)\n return chunks\n}\n\nasync function runInWaves<T, R>(\n items: T[],\n fn: (item: T) => Promise<R>,\n maxConcurrency: number,\n): Promise<R[]> {\n const out: R[] = []\n for (let i = 0; i < items.length; i += maxConcurrency) {\n const wave = items.slice(i, i + maxConcurrency)\n const settled = await Promise.all(wave.map(fn))\n out.push(...settled)\n }\n return out\n}\n\nfunction sendPreviewChunk({\n chunkNodeIds,\n requiredTemplates,\n baseApiUrl,\n fileKey,\n accessToken,\n propertyCombinationsByNodeId,\n}: {\n chunkNodeIds: string[]\n requiredTemplates: CodeConnectJSON[]\n baseApiUrl: string\n fileKey: string\n accessToken: string\n propertyCombinationsByNodeId?: Record<string, PropertyCombination[]>\n}): Promise<ChunkOutcome> {\n const chunkTemplates = filterTemplatesForNodes(chunkNodeIds, requiredTemplates)\n // Only include property combinations for the node IDs in this chunk.\n let renderCombinations: Record<string, PropertyCombination[]> | undefined\n if (propertyCombinationsByNodeId) {\n renderCombinations = {}\n for (const nodeId of chunkNodeIds) {\n if (propertyCombinationsByNodeId[nodeId]) {\n renderCombinations[nodeId] = propertyCombinationsByNodeId[nodeId]\n }\n }\n }\n return request\n .post<PreviewResponseData>(\n `${baseApiUrl}/code_connect/preview_snippets?file_key=${fileKey}`,\n {\n nodeIds: chunkNodeIds,\n figmaDocs: { all: chunkTemplates },\n ...(renderCombinations && Object.keys(renderCombinations).length > 0\n ? { renderCombinations }\n : {}),\n },\n { headers: getHeaders(accessToken) },\n )\n .then((response) => ({ chunkNodeIds, response, error: null as unknown }))\n .catch((err: unknown) => ({ chunkNodeIds, response: null, error: err }))\n}\n\n/**\n * Parse the offending property name out of a \"property not found\" render error,\n * e.g. `PropertyNotFoundError: property 'Varient' not found` -> `Varient`.\n */\nexport function parseMissingProperty(error?: string): string | undefined {\n if (!error) return undefined\n const match =\n error.match(/propert(?:y|ies)[^'\"`]*['\"`]([^'\"`]+)['\"`]/i) ?? error.match(/['\"`]([^'\"`]+)['\"`]/)\n return match?.[1]\n}\n\n/** Build `errorDetails` for a failed result. Undefined when there's no property context (not --all). */\nfunction buildErrorDetails(\n error: string | undefined,\n errorKind: string | undefined,\n availableProperties: AvailableProperty[] | undefined,\n): PreviewResult['errorDetails'] {\n // Transport failure: network/backend problem, not a bad property — carry only the kind.\n if (errorKind === 'transport') return { kind: 'transport' }\n if (!availableProperties) return undefined\n const details: NonNullable<PreviewResult['errorDetails']> = { availableProperties }\n if (errorKind) details.kind = errorKind\n const missingProperty = parseMissingProperty(error)\n if (missingProperty) details.missingProperty = missingProperty\n return details\n}\n\nexport function chunkOutcomeToResults(\n outcome: ChunkOutcome,\n nodes: NodeToPreview[],\n fileKey: string,\n availablePropsByNodeId?: Record<string, AvailableProperty[]>,\n): PreviewResult[] {\n const { chunkNodeIds, response, error } = outcome\n const results: PreviewResult[] = []\n\n if (error) {\n const errorMsg = isFetchError(error)\n ? error.data?.message || error.response.statusText\n : String(error)\n // 503 means the server-side killswitch is on — surface the server's\n // message directly without the per-file/per-node noise so the user\n // sees a single clear line during an incident.\n if (isFetchError(error) && error.response.status === 503) {\n exitWithError(errorMsg)\n } else {\n logger.error(`Failed to preview components in file ${fileKey}: ${errorMsg}`)\n for (const nodeId of chunkNodeIds) {\n for (const node of nodes.filter((n) => n.nodeId === nodeId)) {\n results.push({\n url: node.url,\n nodeId: node.nodeId,\n filePath: node.filePath,\n success: false,\n error: errorMsg,\n // Chunk-level failure is a server/network error, not a template problem.\n errorDetails: { kind: 'transport' },\n })\n }\n }\n }\n return results\n }\n\n if (response!.response.status === 200 && response!.data.meta?.results) {\n // Track match index per nodeId so duplicate node IDs get the correct file attribution.\n // The server returns results in the same order as the templates we sent. Each chunk's\n // nodeIds are disjoint (we dedupe before chunking), so per-chunk indexing is correct.\n // Property-combination results are expanded renders of one node, not one result per\n // matching template, so they should not consume this per-template index.\n const nodeMatchIndex: Record<string, number> = {}\n for (const result of response!.data.meta.results) {\n const idx = nodeMatchIndex[result.nodeId] ?? 0\n const matchingNodes = nodes.filter((n) => n.nodeId === result.nodeId)\n const node = result.propertyCombinationLabel\n ? matchingNodes[0]\n : matchingNodes[idx] || matchingNodes[0]\n if (!result.propertyCombinationLabel) {\n nodeMatchIndex[result.nodeId] = idx + 1\n }\n const error = result.error || (!result.snippet ? 'No snippet returned by server' : undefined)\n const success = !result.error && !!result.snippet\n results.push({\n url: node?.url || result.nodeUrl,\n nodeId: result.nodeId,\n filePath: node?.filePath || '',\n success,\n snippet: result.snippet,\n language: result.language,\n component: result.component,\n error,\n ...(result.propertyCombinationLabel\n ? { propertyCombinationLabel: result.propertyCombinationLabel }\n : {}),\n ...(result.unresolvedInstances?.length\n ? { unresolvedInstances: result.unresolvedInstances }\n : {}),\n ...(success\n ? {}\n : {\n errorDetails: buildErrorDetails(\n error,\n result.errorKind,\n availablePropsByNodeId?.[result.nodeId],\n ),\n }),\n })\n }\n return results\n }\n\n for (const nodeId of chunkNodeIds) {\n for (const node of nodes.filter((n) => n.nodeId === nodeId)) {\n const error = `API request failed with status ${response!.response.status}`\n results.push({\n url: node.url,\n nodeId: node.nodeId,\n filePath: node.filePath,\n success: false,\n error,\n // Non-2xx from the endpoint is a transport-level failure, not a template problem.\n errorDetails: { kind: 'transport' },\n })\n }\n }\n return results\n}\n\nasync function previewFile({\n fileKey,\n nodes,\n baseApiUrl,\n accessToken,\n dir,\n allCodeConnectObjects,\n propertyCombinationsByNodeId,\n availablePropsByNodeId,\n}: {\n fileKey: string\n nodes: NodeToPreview[]\n baseApiUrl: string\n accessToken: string\n dir: string\n allCodeConnectObjects: CodeConnectJSON[]\n propertyCombinationsByNodeId?: Record<string, PropertyCombination[]>\n availablePropsByNodeId?: Record<string, AvailableProperty[]>\n}): Promise<PreviewResult[]> {\n const allNodeIds = nodes.map((n) => n.nodeId)\n // Deduplicate — multiple figma.connect() calls may share the same nodeId;\n // the individual templates are sent in figmaDocs and the server iterates per-template.\n const nodeIds = [...new Set(allNodeIds)]\n\n // Only send templates from the requested files — other files' templates\n // for the same nodeId exist on the server and shouldn't be rendered individually.\n const requestedFilePaths = new Set(nodes.map((n) => path.resolve(dir, n.filePath)))\n const requiredTemplates = filterTemplatesForNodes(allNodeIds, allCodeConnectObjects).filter((t) =>\n requestedFilePaths.has(path.resolve(t._codeConnectFilePath || '')),\n )\n\n const chunks = chunkNodeIdsForPreview(nodeIds, propertyCombinationsByNodeId)\n const outcomes = await runInWaves(\n chunks,\n (chunkNodeIds) =>\n sendPreviewChunk({\n chunkNodeIds,\n requiredTemplates,\n baseApiUrl,\n fileKey,\n accessToken,\n propertyCombinationsByNodeId,\n }),\n PREVIEW_MAX_CONCURRENCY,\n )\n\n return outcomes.flatMap((outcome) =>\n chunkOutcomeToResults(outcome, nodes, fileKey, availablePropsByNodeId),\n )\n}\n\nfunction collectAllLocalNodesToPreview(\n allCodeConnectObjects: CodeConnectJSON[],\n dir: string,\n cmd: BaseCommand,\n): NodeToPreview[] {\n const nodesToCheck: NodeToPreview[] = []\n for (const doc of allCodeConnectObjects) {\n const parsed = parseFigmaNode(cmd.verbose, doc, true)\n if (parsed) {\n nodesToCheck.push({\n fileKey: parsed.fileKey,\n nodeId: parsed.nodeId,\n url: doc.figmaNode,\n filePath: path.relative(dir, doc._codeConnectFilePath || ''),\n })\n }\n }\n return nodesToCheck\n}\n\nfunction groupNodesByFileKey(nodes: NodeToPreview[]): NodesByFileKey {\n const nodesByFileKey: NodesByFileKey = {}\n for (const node of nodes) {\n nodesByFileKey[node.fileKey] ??= []\n nodesByFileKey[node.fileKey].push(node)\n }\n return nodesByFileKey\n}\n\nasync function handleInspect({\n nodesByFileKey,\n configuredApiUrl,\n accessToken,\n outputFormat,\n}: {\n nodesByFileKey: NodesByFileKey\n configuredApiUrl?: string\n accessToken: string\n outputFormat: string\n}): Promise<void> {\n const items: PropertyListItem[] = []\n const seen = new Set<string>()\n for (const [fileKey, nodes] of Object.entries(nodesByFileKey)) {\n const baseApiUrl = getApiUrl(nodes[0].url, configuredApiUrl)\n for (const node of nodes) {\n const dedupeKey = `${node.filePath}::${node.nodeId}`\n if (seen.has(dedupeKey)) continue\n seen.add(dedupeKey)\n const result = await fetchComponentPropertyDefinitions(\n baseApiUrl,\n fileKey,\n node.nodeId,\n accessToken,\n )\n if (result.status === 'error') {\n logger.warn(`Couldn't fetch property definitions for node ${node.nodeId}`)\n } else if (result.status === 'empty') {\n logger.info(`Node ${node.nodeId} has no component properties or variants.`)\n }\n items.push({\n filePath: node.filePath,\n nodeId: node.nodeId,\n availableProperties: result.status === 'ok' ? toAvailableProperties(result.defs) : [],\n })\n }\n }\n\n if (outputFormat === 'json') {\n console.log(JSON.stringify(items, null, 2))\n } else {\n displayPropertyList(items)\n }\n}\n\n/**\n * `--unique` implies `--all`, so errors about combination expansion should name\n * the flag the user actually typed rather than the one commander set on their\n * behalf.\n */\nfunction expandFlagName(cmd: PreviewCommand): '--all' | '--unique' {\n return cmd.unique ? '--unique' : '--all'\n}\n\nexport function validatePreviewOptions(cmd: PreviewCommand): void {\n if (cmd.all && cmd.props) {\n const implied = cmd.unique ? ' (which implies --all)' : ''\n exitWithError(\n `Cannot combine --props and ${expandFlagName(cmd)}${implied}; use one or the other`,\n )\n }\n\n if (cmd.maxCombinations !== undefined && !cmd.all) {\n exitWithError('--max-combinations can only be used with --all or --unique')\n }\n}\n\nasync function buildPropertyPreviewInputs({\n enabled,\n baseApiUrl,\n fileKey,\n nodes,\n accessToken,\n propsPairs,\n maxCombinations,\n}: {\n enabled: boolean\n baseApiUrl: string\n fileKey: string\n nodes: NodeToPreview[]\n accessToken: string\n propsPairs?: ParsedPropertyPair[]\n maxCombinations: number\n}): Promise<{\n propertyCombinationsByNodeId?: Record<string, PropertyCombination[]>\n availablePropsByNodeId?: Record<string, AvailableProperty[]>\n}> {\n if (!enabled) return {}\n\n const propertyCombinationsByNodeId: Record<string, PropertyCombination[]> = {}\n const availablePropsByNodeId: Record<string, AvailableProperty[]> = {}\n const uniqueNodeIds = [...new Set(nodes.map((n) => n.nodeId))]\n const definitionsByNodeId = await fetchComponentPropertyDefinitionsBatch(\n baseApiUrl,\n fileKey,\n uniqueNodeIds,\n accessToken,\n )\n for (const nodeId of uniqueNodeIds) {\n const result = definitionsByNodeId[nodeId] ?? { status: 'error' }\n if (result.status === 'error') {\n logger.warn(\n `Couldn't fetch property definitions for node ${nodeId} (ensure your token has the ` +\n `Code Connect: Write and File content: Read scopes); rendering its default property combination only`,\n )\n continue\n }\n if (result.status === 'empty') {\n // Not an error: the component simply has no properties or variants to vary.\n if (propsPairs) {\n logger.warn(\n `Node ${nodeId} has no component properties or variants, so --props ` +\n `(${propsPairs.map((p) => p.name).join(', ')}) has no effect; rendering its only property combination.`,\n )\n } else {\n logger.info(\n `Node ${nodeId} has no component properties or variants to vary; rendering its only property combination.`,\n )\n }\n continue\n }\n\n const defs = result.defs\n if (propsPairs) {\n const { propertyCombination, availableProperties, unknown, invalid, ambiguous } =\n buildPropertyCombinationFromProps(defs, propsPairs)\n if (unknown.length > 0) {\n logger.warn(\n `Unknown propert${unknown.length > 1 ? 'ies' : 'y'} for node ${nodeId}: ${unknown.join(', ')}. ` +\n `Available: ${availableProperties.map((p) => p.name).join(', ')}`,\n )\n }\n for (const { name, value, options } of invalid) {\n logger.warn(\n `\"${value}\" is not a valid value for ${name} on node ${nodeId}. Options: ${options.join(', ')}`,\n )\n }\n for (const { name, types } of ambiguous) {\n logger.warn(\n `Property \"${name}\" on node ${nodeId} matches multiple types (${types.join(', ')}); ` +\n `prefix the value with a type to disambiguate, e.g. ${types[0]}:${name}=... . Skipping.`,\n )\n }\n availablePropsByNodeId[nodeId] = availableProperties\n propertyCombinationsByNodeId[nodeId] = [propertyCombination]\n } else {\n const { propertyCombinations, availableProperties, truncated } =\n enumeratePropertyCombinations(defs, {\n maxCombinations,\n })\n availablePropsByNodeId[nodeId] = availableProperties\n if (truncated) {\n logger.warn(\n `Node ${nodeId} has ${truncated.total} property combinations, exceeding the ${truncated.cap}-combination ` +\n `preview limit; rendering the first ${truncated.cap}. Use --props to preview a ` +\n `specific property combination.`,\n )\n }\n if (propertyCombinations.length > 0) {\n propertyCombinationsByNodeId[nodeId] = propertyCombinations\n }\n }\n }\n\n return { propertyCombinationsByNodeId, availablePropsByNodeId }\n}\n\nasync function previewNodesForFile({\n fileKey,\n nodes,\n configuredApiUrl,\n accessToken,\n dir,\n allCodeConnectObjects,\n renderPropertyCombinations,\n propsPairs,\n maxCombinations,\n}: {\n fileKey: string\n nodes: NodeToPreview[]\n configuredApiUrl?: string\n accessToken: string\n dir: string\n allCodeConnectObjects: CodeConnectJSON[]\n renderPropertyCombinations: boolean\n propsPairs?: ParsedPropertyPair[]\n maxCombinations: number\n}): Promise<PreviewResult[]> {\n const baseApiUrl = getApiUrl(nodes[0].url, configuredApiUrl)\n const { propertyCombinationsByNodeId, availablePropsByNodeId } = await buildPropertyPreviewInputs(\n {\n enabled: renderPropertyCombinations,\n baseApiUrl,\n fileKey,\n nodes,\n accessToken,\n propsPairs,\n maxCombinations,\n },\n )\n\n return previewFile({\n fileKey,\n nodes,\n baseApiUrl,\n accessToken,\n dir,\n allCodeConnectObjects,\n propertyCombinationsByNodeId,\n availablePropsByNodeId,\n })\n}\n\nasync function validateRenderedSnippets(results: PreviewResult[]): Promise<void> {\n for (const result of results) {\n if (result.success && result.snippet) {\n const prettierValid = await isPrettierParseable(result.snippet, result.language)\n if (!prettierValid) {\n // Prettier can parse this language but failed — mark as error\n result.success = false\n result.error = 'Snippet has syntax errors and may not be valid code'\n }\n }\n }\n}\n\nasync function outputPreviewResults(results: PreviewResult[], outputFormat: string): Promise<void> {\n if (outputFormat === 'json') {\n console.log(JSON.stringify(results, null, 2))\n return\n }\n\n const formattedResults: PreviewResult[] = await Promise.all(\n results.map(async (result) => {\n if (result.success && result.snippet) {\n const formattedSnippet = await formatSnippet(result.snippet, result.language)\n return { ...result, snippet: formattedSnippet }\n }\n return result\n }),\n )\n displayResults(formattedResults)\n}\n\n/**\n * Handle the preview command\n */\nexport async function handlePreview(files: string[], cmd: PreviewCommand) {\n setupHandler(cmd)\n\n const dir = cmd.dir ?? process.cwd()\n const projectInfo = await getProjectInfo(dir, cmd.config)\n const accessToken = getAccessTokenOrExit(cmd)\n const outputFormat = cmd.output || 'table'\n const configuredApiUrl = cmd.apiUrl || projectInfo.config.apiUrl\n\n if (cmd.all && (!files || files.length === 0)) {\n const flag = expandFlagName(cmd)\n exitWithError(\n `${flag} requires a specific component, e.g. \\`figma connect preview Button.figma.ts ${flag}\\``,\n )\n }\n\n const allCodeConnectObjects = await getCodeConnectObjects(cmd, projectInfo, { silent: true })\n\n const nodesToCheck =\n files && files.length > 0\n ? await collectNodesToPreview(files, allCodeConnectObjects, dir, cmd)\n : collectAllLocalNodesToPreview(allCodeConnectObjects, dir, cmd)\n if (!files || files.length === 0) {\n logger.info('Previewing all local Code Connect files...')\n }\n\n if (nodesToCheck.length === 0) {\n exitWithError('No valid Code Connect files found to preview')\n }\n\n logger.info(`Previewing ${nodesToCheck.length} component(s)...`)\n const nodesByFileKey = groupNodesByFileKey(nodesToCheck)\n\n if (cmd.inspect) {\n await handleInspect({\n nodesByFileKey,\n configuredApiUrl,\n accessToken,\n outputFormat,\n })\n return\n }\n\n validatePreviewOptions(cmd)\n const maxCombinations = parseMaxCombinationsArg(cmd.maxCombinations)\n const propsPairs = cmd.props ? parsePropsArg(cmd.props) : undefined\n\n const results: PreviewResult[] = []\n for (const [fileKey, nodes] of Object.entries(nodesByFileKey)) {\n const fileResults = await previewNodesForFile({\n fileKey,\n nodes,\n configuredApiUrl,\n accessToken,\n dir,\n allCodeConnectObjects,\n renderPropertyCombinations: cmd.all || !!propsPairs,\n propsPairs,\n maxCombinations,\n })\n results.push(...fileResults)\n }\n\n await validateRenderedSnippets(results)\n\n const outputResults = cmd.unique ? collapsePreviewResults(results) : results\n if (cmd.unique && outputResults.length !== results.length) {\n logger.info(\n `${outputResults.length} distinct of ${results.length} rendered property combinations`,\n )\n }\n\n await outputPreviewResults(outputResults, outputFormat)\n\n if (outputResults.every((r) => !r.success)) {\n process.exit(1)\n }\n}\n"]}
@@ -1,10 +1,7 @@
1
1
  import { BaseCommand } from '../commands/connect';
2
2
  import { Command } from 'commander';
3
- export declare function flagParserBasedCodeConnect(): void;
4
3
  type CommandArgs<T extends BaseCommand> = [...any[], T, Command];
5
- export declare function withVersionWarnings<T extends BaseCommand>(fn: (...args: any[]) => void | Promise<void>, { hideDeprecationWarning }?: {
6
- hideDeprecationWarning?: boolean;
7
- }): (...args: CommandArgs<T>) => void | Promise<void>;
4
+ export declare function withUpdateCheck<T extends BaseCommand>(fn: (...args: any[]) => void | Promise<void>): (...args: CommandArgs<T>) => void | Promise<void>;
8
5
  export declare function exitWithUpdateCheck(errorCode?: number): never;
9
6
  export declare function updateCli(): void;
10
7
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../../src/common/updates.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWnC,wBAAgB,0BAA0B,SAEzC;AAID,KAAK,WAAW,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;AAIhE,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,EAGvD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC5C,EAAE,sBAA8B,EAAE,GAAE;IAAE,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAO,IAErE,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,0BAsBhC;AAyCD,wBAAgB,mBAAmB,CAAC,SAAS,SAAI,GAAG,KAAK,CAKxD;AA0BD,wBAAgB,SAAS,SAGxB"}
1
+ {"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../../src/common/updates.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,KAAK,WAAW,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;AAIhE,wBAAgB,eAAe,CAAC,CAAC,SAAS,WAAW,EAGnD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAEpC,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,0BAqBhC;AAyCD,wBAAgB,mBAAmB,CAAC,SAAS,SAAI,GAAG,KAAK,CAKxD;AAkBD,wBAAgB,SAAS,SAGxB"}
@@ -3,8 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.flagParserBasedCodeConnect = flagParserBasedCodeConnect;
7
- exports.withVersionWarnings = withVersionWarnings;
6
+ exports.withUpdateCheck = withUpdateCheck;
8
7
  exports.exitWithUpdateCheck = exitWithUpdateCheck;
9
8
  exports.updateCli = updateCli;
10
9
  const chalk_1 = __importDefault(require("chalk"));
@@ -13,27 +12,19 @@ const compare_versions_1 = require("compare-versions");
13
12
  const fetch_1 = require("./fetch");
14
13
  let updatedVersionAvailable = undefined;
15
14
  let message = undefined;
16
- let parserBasedCodeConnectFound = false;
17
- let deprecationWarningHidden = false;
18
15
  let skipUpdateCheck = false;
19
- // Called when the native parser has actually produced Code Connect docs, which
20
- // is the only definitive signal that a project still uses the legacy parsers.
21
- function flagParserBasedCodeConnect() {
22
- parserBasedCodeConnectFound = true;
23
- }
24
16
  // Wrap action handlers to check for updates or a message, and output a message
25
17
  // after the action if any are available
26
- function withVersionWarnings(
18
+ function withUpdateCheck(
27
19
  // The second to last argument is always the command args, but I couldn't work
28
20
  // out how to model this with Typescript here
29
- fn, { hideDeprecationWarning = false } = {}) {
21
+ fn) {
30
22
  return (...args) => {
31
23
  // Get the args passed at the command line (the second to last argument)
32
24
  const commandArgs = args[args.length - 2];
33
25
  // Anything before that is a regular arg
34
26
  const restArgs = args.slice(0, -2);
35
27
  skipUpdateCheck = !!commandArgs.skipUpdateCheck;
36
- deprecationWarningHidden = hideDeprecationWarning;
37
28
  if (skipUpdateCheck) {
38
29
  return fn(...restArgs, commandArgs);
39
30
  }
@@ -92,13 +83,7 @@ function exitWithUpdateCheck(errorCode = 1) {
92
83
  function getUpdateCommand() {
93
84
  return 'npm update -g @figma/code-connect';
94
85
  }
95
- const DEPRECATION_NOTICE = `
96
- Framework-specific parsers will no longer receive updates or support from August 17th, 2026. Template files will be the only actively maintained way of using Code Connect. See our migration guide for more information and instructions on migrating parser-based Code Connect:
97
- https://developers.figma.com/docs/code-connect/templates-migration-guide/`;
98
86
  function maybeShowUpdateMessage() {
99
- if (parserBasedCodeConnectFound && !deprecationWarningHidden) {
100
- logging_1.logger.warn(DEPRECATION_NOTICE);
101
- }
102
87
  if (updatedVersionAvailable) {
103
88
  logging_1.logger.warn(`\nA new version of the Figma CLI is available. v${require('../../package.json').version} is currently installed, and the latest version available is v${updatedVersionAvailable}.
104
89
 
@@ -1 +1 @@
1
- {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/common/updates.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk'\nimport { logger } from './logging'\nimport { compareVersions } from 'compare-versions'\nimport { BaseCommand } from '../commands/connect'\nimport { Command } from 'commander'\nimport { request } from './fetch'\n\nlet updatedVersionAvailable: string | false | undefined = undefined\nlet message: string | undefined = undefined\nlet parserBasedCodeConnectFound = false\nlet deprecationWarningHidden = false\nlet skipUpdateCheck = false\n\n// Called when the native parser has actually produced Code Connect docs, which\n// is the only definitive signal that a project still uses the legacy parsers.\nexport function flagParserBasedCodeConnect() {\n parserBasedCodeConnectFound = true\n}\n\n// The type of the arguments passed to a command handler:\n// any arguments, then the command arguments, then the Command object\ntype CommandArgs<T extends BaseCommand> = [...any[], T, Command]\n\n// Wrap action handlers to check for updates or a message, and output a message\n// after the action if any are available\nexport function withVersionWarnings<T extends BaseCommand>(\n // The second to last argument is always the command args, but I couldn't work\n // out how to model this with Typescript here\n fn: (...args: any[]) => void | Promise<void>,\n { hideDeprecationWarning = false }: { hideDeprecationWarning?: boolean } = {},\n) {\n return (...args: CommandArgs<T>) => {\n // Get the args passed at the command line (the second to last argument)\n const commandArgs = args[args.length - 2]\n // Anything before that is a regular arg\n const restArgs = args.slice(0, -2)\n\n skipUpdateCheck = !!commandArgs.skipUpdateCheck\n deprecationWarningHidden = hideDeprecationWarning\n\n if (skipUpdateCheck) {\n return fn(...restArgs, commandArgs)\n }\n\n startUpdateCheck()\n\n const result = fn(...restArgs, commandArgs)\n if (result instanceof Promise) {\n result.finally(waitAndCheckForUpdates)\n } else {\n waitAndCheckForUpdates()\n }\n }\n}\n\n// Start checking for updates in the background. We don't wait for this before\n// running the action, as we will show the result at the end\nfunction startUpdateCheck() {\n request\n .get<{ tag_name: string }>('https://api.github.com/repos/figma/code-connect/releases/latest')\n .then((response) => {\n const latestVersion = response.data.tag_name.replace(/^v/, '')\n const currentVersion = require('../../package.json').version\n\n if (compareVersions(latestVersion, currentVersion) === 1) {\n updatedVersionAvailable = latestVersion\n } else {\n updatedVersionAvailable = false\n }\n })\n .catch(() => {\n // Silently fail if we can't check for updates\n updatedVersionAvailable = false\n })\n}\n\n// Wait for up to 1 second for the result of update checking to be available,\n// and output a message if there is an update or a message. If there is no\n// result after the timeout, the app will exit.\nasync function waitAndCheckForUpdates() {\n for (let i = 0; i < 10; i++) {\n if (updatedVersionAvailable !== undefined) {\n break\n }\n await new Promise((resolve) => setTimeout(resolve, 100))\n }\n\n maybeShowUpdateMessage()\n}\n\n// Exit the process, first checking if there is an update or message available.\n// Unlike waitAndCheckForUpdates, this will not wait for the update check to\n// complete, so if the request has not completed yet, nothing will be shown.\n// This is to avoid confusion about when the process _actually_ exits.\nexport function exitWithUpdateCheck(errorCode = 1): never {\n if (!skipUpdateCheck) {\n maybeShowUpdateMessage()\n }\n process.exit(errorCode)\n}\n\nfunction getUpdateCommand() {\n return 'npm update -g @figma/code-connect'\n}\n\nconst DEPRECATION_NOTICE = `\nFramework-specific parsers will no longer receive updates or support from August 17th, 2026. Template files will be the only actively maintained way of using Code Connect. See our migration guide for more information and instructions on migrating parser-based Code Connect:\nhttps://developers.figma.com/docs/code-connect/templates-migration-guide/`\n\nfunction maybeShowUpdateMessage() {\n if (parserBasedCodeConnectFound && !deprecationWarningHidden) {\n logger.warn(DEPRECATION_NOTICE)\n }\n\n if (updatedVersionAvailable) {\n logger.warn(`\\nA new version of the Figma CLI is available. v${require('../../package.json').version} is currently installed, and the latest version available is v${updatedVersionAvailable}.\n\nTo update, run ${chalk.whiteBright('npm install @figma/code-connect@latest')} for React or HTML, or ${chalk.whiteBright('npm install -g @figma/code-connect@latest')} for other targets (or if you have Code Connect installed globally).`)\n }\n\n if (message) {\n logger.warn(`\\n${message}`)\n }\n}\n\nexport function updateCli() {\n const { execSync } = require('child_process')\n execSync(getUpdateCommand(), { stdio: 'inherit' })\n}\n"]}
1
+ {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/common/updates.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk'\nimport { logger } from './logging'\nimport { compareVersions } from 'compare-versions'\nimport { BaseCommand } from '../commands/connect'\nimport { Command } from 'commander'\nimport { request } from './fetch'\n\nlet updatedVersionAvailable: string | false | undefined = undefined\nlet message: string | undefined = undefined\nlet skipUpdateCheck = false\n\n// The type of the arguments passed to a command handler:\n// any arguments, then the command arguments, then the Command object\ntype CommandArgs<T extends BaseCommand> = [...any[], T, Command]\n\n// Wrap action handlers to check for updates or a message, and output a message\n// after the action if any are available\nexport function withUpdateCheck<T extends BaseCommand>(\n // The second to last argument is always the command args, but I couldn't work\n // out how to model this with Typescript here\n fn: (...args: any[]) => void | Promise<void>,\n) {\n return (...args: CommandArgs<T>) => {\n // Get the args passed at the command line (the second to last argument)\n const commandArgs = args[args.length - 2]\n // Anything before that is a regular arg\n const restArgs = args.slice(0, -2)\n\n skipUpdateCheck = !!commandArgs.skipUpdateCheck\n\n if (skipUpdateCheck) {\n return fn(...restArgs, commandArgs)\n }\n\n startUpdateCheck()\n\n const result = fn(...restArgs, commandArgs)\n if (result instanceof Promise) {\n result.finally(waitAndCheckForUpdates)\n } else {\n waitAndCheckForUpdates()\n }\n }\n}\n\n// Start checking for updates in the background. We don't wait for this before\n// running the action, as we will show the result at the end\nfunction startUpdateCheck() {\n request\n .get<{ tag_name: string }>('https://api.github.com/repos/figma/code-connect/releases/latest')\n .then((response) => {\n const latestVersion = response.data.tag_name.replace(/^v/, '')\n const currentVersion = require('../../package.json').version\n\n if (compareVersions(latestVersion, currentVersion) === 1) {\n updatedVersionAvailable = latestVersion\n } else {\n updatedVersionAvailable = false\n }\n })\n .catch(() => {\n // Silently fail if we can't check for updates\n updatedVersionAvailable = false\n })\n}\n\n// Wait for up to 1 second for the result of update checking to be available,\n// and output a message if there is an update or a message. If there is no\n// result after the timeout, the app will exit.\nasync function waitAndCheckForUpdates() {\n for (let i = 0; i < 10; i++) {\n if (updatedVersionAvailable !== undefined) {\n break\n }\n await new Promise((resolve) => setTimeout(resolve, 100))\n }\n\n maybeShowUpdateMessage()\n}\n\n// Exit the process, first checking if there is an update or message available.\n// Unlike waitAndCheckForUpdates, this will not wait for the update check to\n// complete, so if the request has not completed yet, nothing will be shown.\n// This is to avoid confusion about when the process _actually_ exits.\nexport function exitWithUpdateCheck(errorCode = 1): never {\n if (!skipUpdateCheck) {\n maybeShowUpdateMessage()\n }\n process.exit(errorCode)\n}\n\nfunction getUpdateCommand() {\n return 'npm update -g @figma/code-connect'\n}\n\nfunction maybeShowUpdateMessage() {\n if (updatedVersionAvailable) {\n logger.warn(`\\nA new version of the Figma CLI is available. v${require('../../package.json').version} is currently installed, and the latest version available is v${updatedVersionAvailable}.\n\nTo update, run ${chalk.whiteBright('npm install @figma/code-connect@latest')} for React or HTML, or ${chalk.whiteBright('npm install -g @figma/code-connect@latest')} for other targets (or if you have Code Connect installed globally).`)\n }\n\n if (message) {\n logger.warn(`\\n${message}`)\n }\n}\n\nexport function updateCli() {\n const { execSync } = require('child_process')\n execSync(getUpdateCommand(), { stdio: 'inherit' })\n}\n"]}