@figma/code-connect 1.4.7 → 1.4.9

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.
Files changed (47) hide show
  1. package/dist/commands/connect.d.ts +3 -0
  2. package/dist/commands/connect.d.ts.map +1 -1
  3. package/dist/commands/connect.js +140 -40
  4. package/dist/commands/connect.js.map +1 -1
  5. package/dist/commands/connect_template.d.ts.map +1 -1
  6. package/dist/commands/connect_template.js +9 -0
  7. package/dist/commands/connect_template.js.map +1 -1
  8. package/dist/common/logging.d.ts.map +1 -1
  9. package/dist/common/logging.js +13 -6
  10. package/dist/common/logging.js.map +1 -1
  11. package/dist/common/updates.d.ts.map +1 -1
  12. package/dist/common/updates.js +2 -2
  13. package/dist/common/updates.js.map +1 -1
  14. package/dist/connect/api.d.ts +34 -1
  15. package/dist/connect/api.d.ts.map +1 -1
  16. package/dist/connect/api.js.map +1 -1
  17. package/dist/connect/intrinsics.d.ts +1 -0
  18. package/dist/connect/intrinsics.d.ts.map +1 -1
  19. package/dist/connect/intrinsics.js +29 -0
  20. package/dist/connect/intrinsics.js.map +1 -1
  21. package/dist/connect/migration_batch_helpers.d.ts +45 -0
  22. package/dist/connect/migration_batch_helpers.d.ts.map +1 -0
  23. package/dist/connect/migration_batch_helpers.js +439 -0
  24. package/dist/connect/migration_batch_helpers.js.map +1 -0
  25. package/dist/connect/migration_helpers.d.ts +4 -0
  26. package/dist/connect/migration_helpers.d.ts.map +1 -1
  27. package/dist/connect/migration_helpers.js +29 -5
  28. package/dist/connect/migration_helpers.js.map +1 -1
  29. package/dist/connect/parser_executables.d.ts.map +1 -1
  30. package/dist/connect/parser_executables.js +25 -13
  31. package/dist/connect/parser_executables.js.map +1 -1
  32. package/dist/connect/project.d.ts +2 -1
  33. package/dist/connect/project.d.ts.map +1 -1
  34. package/dist/connect/project.js +26 -24
  35. package/dist/connect/project.js.map +1 -1
  36. package/dist/connect/raw_templates.d.ts +10 -0
  37. package/dist/connect/raw_templates.d.ts.map +1 -1
  38. package/dist/connect/raw_templates.js +48 -14
  39. package/dist/connect/raw_templates.js.map +1 -1
  40. package/dist/connect/wizard/helpers.d.ts.map +1 -1
  41. package/dist/connect/wizard/helpers.js +7 -2
  42. package/dist/connect/wizard/helpers.js.map +1 -1
  43. package/dist/parser_scripts/get_swift_parser_dir.js +5 -5
  44. package/dist/parser_scripts/get_swift_parser_dir.js.map +1 -1
  45. package/figma-types-no-require.d.ts +229 -0
  46. package/figma-types.d.ts +12 -3
  47. package/package.json +7 -3
@@ -1 +1 @@
1
- {"version":3,"file":"migration_helpers.js","sourceRoot":"","sources":["../../src/connect/migration_helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport * as prettier from 'prettier'\nimport { CodeConnectJSON } from '../connect/figma_connect'\n\n/** Prettier configuration used for all generated template files */\nconst PRETTIER_OPTIONS = {\n parser: 'typescript' as const,\n semi: false,\n trailingComma: 'all' as const,\n pluginSearchDirs: false as const,\n}\n\n/** Formats template code with consistent prettier configuration */\nfunction formatTemplate(code: string): string {\n return prettier.format(code, PRETTIER_OPTIONS)\n}\n\n/**\n * Common wrapper that handles path determination and file writing for both\n * simple templates and variant templates.\n */\nfunction writeTemplateFileCommon(\n componentName: string,\n fileContent: string,\n outputDir: string | undefined,\n baseDir: string,\n localSourcePath: string | undefined,\n filePathsCreated: Set<string> | undefined,\n useTypeScript = true,\n): { outputPath: string; skipped: boolean } {\n const suffix = useTypeScript ? '.figma.ts' : '.figma.js'\n const baseOutputPath = determineOutputPath(\n componentName,\n suffix,\n outputDir,\n baseDir,\n localSourcePath,\n )\n return writeFileWithDuplicateHandling(baseOutputPath, fileContent, suffix, filePathsCreated)\n}\n\nexport function getFilenameFromComponentName(componentName: string): string {\n const allowlisted = /[a-zA-Z0-9\\-\\.]/\n return componentName\n .split('')\n .map((ch) => (allowlisted.test(ch) ? ch : '_'))\n .join('')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '')\n}\n\n/**\n * Determines the base output path for a template file.\n * Shared logic between writeTemplateFile and writeVariantTemplateFile.\n */\nfunction determineOutputPath(\n rawComponentName: string,\n suffix: string,\n outputDir: string | undefined,\n baseDir: string,\n localSourcePath: string | undefined,\n): string {\n // Extract basename from localSourcePath when available, falling back to componentName\n const componentFilename = getFilenameFromComponentName(rawComponentName)\n let basename = componentFilename\n if (localSourcePath) {\n let sourceBasename = path.basename(localSourcePath)\n\n // If this is a Code Connect file, extract the base component name\n // Handles patterns like: Button.figma.tsx, Button.figmadoc.tsx, Button.figma.template.js\n // Should all become: Button.figma.js\n const codeConnectPattern = /\\.(figma|figmadoc)(\\.[^.]+)+$/\n if (codeConnectPattern.test(sourceBasename)) {\n // Extract everything before the .figma/.figmadoc pattern\n sourceBasename = sourceBasename.replace(codeConnectPattern, '')\n } else {\n // For regular component files, strip extension normally\n sourceBasename = path.basename(localSourcePath, path.extname(localSourcePath))\n }\n\n basename = sourceBasename\n }\n\n if (outputDir) {\n // Use specified output directory with basename derived from source path\n return path.join(outputDir, `${basename}${suffix}`)\n } else if (localSourcePath) {\n // Use same directory as local source file\n return path.join(path.dirname(localSourcePath), `${basename}${suffix}`)\n } else {\n // No source info, use current directory\n const filename = `${componentFilename}${suffix}`\n return path.join(baseDir, filename)\n }\n}\n\n/**\n * Handles file existence checking, duplicate name resolution, and writing.\n * Shared logic between writeTemplateFile and writeVariantTemplateFile.\n */\nfunction writeFileWithDuplicateHandling(\n baseOutputPath: string,\n fileContent: string,\n suffix: string,\n filePathsCreated: Set<string> | undefined,\n): { outputPath: string; skipped: boolean } {\n // Check if file already exists on disk (pre-existing file, not created in this run)\n const existsOnDisk = fs.existsSync(baseOutputPath)\n const createdInThisRun = filePathsCreated && filePathsCreated.has(baseOutputPath)\n\n if (existsOnDisk && !createdInThisRun) {\n // This file existed before the migration run, skip it\n return { outputPath: baseOutputPath, skipped: true }\n }\n\n // Handle duplicate names (either created in this run or would conflict with an existing file)\n let outputPath = baseOutputPath\n if (createdInThisRun || existsOnDisk) {\n // Find a unique name by appending _1, _2, etc. before the suffix\n const dir = path.dirname(baseOutputPath)\n const basename = path.basename(baseOutputPath)\n\n // Remove the suffix to get the base name (works for any suffix like .figma.js or .figma.ts)\n const baseNameWithoutSuffix = basename.endsWith(suffix)\n ? basename.slice(0, -suffix.length)\n : basename\n\n let counter = 1\n do {\n outputPath = path.join(dir, `${baseNameWithoutSuffix}_${counter}${suffix}`)\n counter++\n } while ((filePathsCreated && filePathsCreated.has(outputPath)) || fs.existsSync(outputPath))\n }\n\n // Ensure output directory exists\n const outputDirPath = path.dirname(outputPath)\n if (!fs.existsSync(outputDirPath)) {\n fs.mkdirSync(outputDirPath, { recursive: true })\n }\n\n // Write the file\n fs.writeFileSync(outputPath, fileContent, 'utf-8')\n\n // Track the created file path\n if (filePathsCreated) {\n filePathsCreated.add(outputPath)\n }\n\n return { outputPath, skipped: false }\n}\n\n/** Migrates a doc's template (Swift helpers, server helpers, V2, id, imports, nestable) and returns the formatted string. */\nexport function prepareMigratedTemplate(\n doc: CodeConnectJSON,\n includeProps = false,\n useTypeScript?: boolean,\n): string {\n let template = doc.template\n template = removeSwiftHelpers(template)\n template = migrateTemplateToUseServerSideHelpers(template)\n if (!includeProps) {\n template = removePropsDefinitionAndMetadata(template)\n }\n template = migrateV1TemplateToV2(template)\n template = addId(template, doc.component || 'TODO')\n template = addImports(template, doc.templateData?.imports)\n template = addNestableToMetadata(template, !!doc.templateData?.nestable)\n if (useTypeScript) {\n template = convertSyntaxToTypeScript(template)\n }\n return formatTemplate(template)\n}\n\nfunction removeSwiftHelpers(template: string): string {\n return template.replace(\n `function __fcc_renderSwiftChildren(children, prefix) {\n if (children === undefined) {\n return children\n }\n return children.flatMap((child, index) => {\n if (child.type === 'CODE') {\n let code = child.code.split('\\\\n').map((line) => {\n return line.trim() !== '' ? \\`\\${prefix}\\${line}\\` : line;\n }).join('\\\\n')\n if (index !== children.length - 1) {\n code = code + '\\\\n'\n }\n return {\n ...child,\n code: code,\n }\n } else {\n let elements = []\n const shouldAddNewline = index > 0 && children[index - 1].type === 'CODE' && !children[index - 1].code.endsWith('\\\\n')\n elements.push({ type: 'CODE', code: \\`\\${shouldAddNewline ? '\\\\n' : ''}\\${prefix}\\` })\n elements.push(child)\n if (index !== children.length - 1) {\n elements.push({ type: 'CODE', code: '\\\\n' })\n }\n return elements\n }\n })\n}\n`,\n '',\n )\n}\n\nexport type WriteTemplateFileOptions = {\n localSourcePath?: string\n filePathsCreated?: Set<string>\n includeProps?: boolean\n useTypeScript?: boolean\n}\n\nexport function writeTemplateFile(\n doc: CodeConnectJSON,\n outputDir: string | undefined,\n baseDir: string,\n {\n localSourcePath,\n filePathsCreated,\n includeProps = false,\n useTypeScript = true,\n }: WriteTemplateFileOptions = {},\n): { outputPath: string; skipped: boolean } {\n const componentName = doc.component || 'template'\n const template = prepareMigratedTemplate(doc, includeProps, useTypeScript)\n\n // Build comment header lines\n const commentLines: string[] = [`// url=${doc.figmaNode}`]\n if (doc.source) {\n commentLines.push(`// source=${doc.source}`)\n }\n if (doc.component) {\n commentLines.push(`// component=${doc.component}`)\n }\n commentLines.push(``)\n\n const fileContent = commentLines.join('\\n') + '\\n' + template\n\n return writeTemplateFileCommon(\n componentName,\n fileContent,\n outputDir,\n baseDir,\n localSourcePath,\n filePathsCreated,\n useTypeScript,\n )\n}\n\n// Renames must match helpers in code_connect_js_api.raw_source.ts\nexport function migrateTemplateToUseServerSideHelpers(template: string) {\n return (\n template\n // React helpers\n .replace(/_fcc_renderReactProp/g, 'figma.helpers.react.renderProp')\n .replace(/_fcc_renderReactChildren/g, 'figma.helpers.react.renderChildren')\n .replace(/_fcc_jsxElement/g, 'figma.helpers.react.jsxElement')\n .replace(/_fcc_function/g, 'figma.helpers.react.function')\n .replace(/_fcc_identifier/g, 'figma.helpers.react.identifier')\n .replace(/_fcc_object/g, 'figma.helpers.react.object')\n .replace(/_fcc_templateString/g, 'figma.helpers.react.templateString')\n .replace(/_fcc_renderPropValue/g, 'figma.helpers.react.renderPropValue')\n .replace(/_fcc_stringifyObject/g, 'figma.helpers.react.stringifyObject')\n .replace(/_fcc_reactComponent/g, 'figma.helpers.react.reactComponent')\n .replace(/_fcc_array/g, 'figma.helpers.react.array')\n .replace(/isReactComponentArray/g, 'figma.helpers.react.isReactComponentArray')\n // Swift helpers\n .replace(/__fcc_renderSwiftChildren/g, 'figma.helpers.swift.renderChildren')\n // Kotlin/Compose helpers\n .replace(/__fcc_renderComposeChildren/g, 'figma.helpers.kotlin.renderChildren')\n )\n}\n\nexport function addId(template: string, id: string): string {\n // Don't add id if already present (e.g. when re-migrating a previously-migrated template)\n if (/export default\\s*\\{\\s*id:\\s*['\"]/.test(template)) {\n return template\n }\n return template.replace(/export default \\{/, `export default { id: '${id}',`)\n}\n\nexport function addImports(template: string, imports: string[] | undefined): string {\n if (!imports || imports.length === 0) {\n return template\n }\n\n // Escape imports for safe insertion into JS\n const importsJson = JSON.stringify(imports)\n\n // Add imports after the id field if it exists, otherwise at the start\n // Match: export default { id: '...', (with optional whitespace/newlines)\n const withId = template.replace(\n /(export default\\s*\\{\\s*id:\\s*'[^']*',)/,\n `$1 imports: ${importsJson},`,\n )\n\n // If id replacement worked, return\n if (withId !== template) {\n return withId\n }\n\n // Otherwise, add at the start (after opening brace)\n return template.replace(/export default\\s*\\{/, `export default { imports: ${importsJson},`)\n}\n\nexport function addNestableToMetadata(template: string, nestable: boolean): string {\n // Find \"metadata: {\" and replace with \"metadata: { nestable: <value>,\"\n return template.replace(/metadata:\\s*\\{/, `metadata: { nestable: ${nestable},`)\n}\n\n/**\n * Migrates V1 templates to V2 API.\n *\n * This performs safe, incremental transformations. The following patterns\n * are intentionally NOT migrated as they're still supported in V2:\n *\n * - __props metadata building pattern - still valid JavaScript\n * - __renderWithFn__() - complex transformation, still supported\n *\n * These may be addressed in future migrations.\n */\nexport const migrateV1TemplateToV2 = (template: string): string => {\n let migrated = template\n\n // 1. Core object rename\n migrated = migrated.replace(/figma\\.currentLayer/g, 'figma.selectedInstance')\n\n // 2. Normalize template types to figma.code\n migrated = migrated.replace(/figma\\.html/g, 'figma.code')\n migrated = migrated.replace(/figma\\.tsx/g, 'figma.code')\n migrated = migrated.replace(/figma\\.swift/g, 'figma.code')\n migrated = migrated.replace(/figma\\.kotlin/g, 'figma.code')\n\n // 3. Property accessor methods\n migrated = migrated.replace(/\\.__properties__\\.string\\(/g, '.getString(')\n migrated = migrated.replace(/\\.__properties__\\.boolean\\(/g, '.getBoolean(')\n migrated = migrated.replace(/\\.__properties__\\.enum\\(/g, '.getEnum(')\n migrated = migrated.replace(/\\.__properties__\\.__instance__\\(/g, '.getInstanceSwap(')\n // .__properties__.instance() auto-renders, so we need to add .executeTemplate().example\n migrated = migrated.replace(\n /\\.__properties__\\.instance\\(([^)]+)\\)/g,\n '.getInstanceSwap($1)?.executeTemplate().example',\n )\n\n // 4. Alias for __properties__ on selectedInstance\n migrated = migrated.replace(/figma\\.selectedInstance\\.__properties__\\./g, 'figma.properties.')\n\n // 5. Other method renames\n migrated = migrated.replace(/\\.__getPropertyValue__\\(/g, '.getPropertyValue(')\n\n // 6. __findChildWithCriteria__ - migrate based on type parameter\n // For TEXT type with __render__(): __findChildWithCriteria__({ name: 'X', type: \"TEXT\" }).__render__() → findText('X').textContent\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*name:\\s*'([^']+)',\\s*type:\\s*\"TEXT\"\\s*\\}\\)\\.__render__\\(\\)/g,\n \".findText('$1').textContent\",\n )\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*type:\\s*\"TEXT\",\\s*name:\\s*'([^']+)'\\s*\\}\\)\\.__render__\\(\\)/g,\n \".findText('$1').textContent\",\n )\n // For INSTANCE type: __findChildWithCriteria__({ type: 'INSTANCE', name: 'X' }) → findInstance('X')\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*name:\\s*'([^']+)',\\s*type:\\s*['\"]INSTANCE['\"]\\s*\\}\\)/g,\n \".findInstance('$1')\",\n )\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*type:\\s*['\"]INSTANCE['\"],\\s*name:\\s*'([^']+)'\\s*\\}\\)/g,\n \".findInstance('$1')\",\n )\n // For TEXT type without __render__(): __findChildWithCriteria__({ type: 'TEXT', name: 'X' }) → findText('X')\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*name:\\s*'([^']+)',\\s*type:\\s*['\"]TEXT['\"]\\s*\\}\\)/g,\n \".findText('$1')\",\n )\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*type:\\s*['\"]TEXT['\"],\\s*name:\\s*'([^']+)'\\s*\\}\\)/g,\n \".findText('$1')\",\n )\n\n // 7. __find__() - migrate to findInstance()\n migrated = migrated.replace(\n /\\.__find__\\((\"([^\"]+)\"|'([^']+)')\\)/g,\n (match, quote, doubleQuoted, singleQuoted) => {\n const name = doubleQuoted || singleQuoted\n return `.findInstance(\"${name}\")`\n },\n )\n\n // 8. __render__() - migrate to executeTemplate().example (but not if part of __findChildWithCriteria__)\n migrated = migrated.replace(/\\.__render__\\(\\)/g, '.executeTemplate().example')\n\n // 9. __getProps__() - migrate to executeTemplate().metadata.props\n migrated = migrated.replace(/\\.__getProps__\\(\\)/g, '.executeTemplate().metadata.props')\n\n // 10. Export format - simple case\n // Match export default figma.code` (or tsx, html, etc) and wrap in { example: ... }\n migrated = migrated.replace(\n /export default figma\\.(code|tsx|html|swift|kotlin)`/g,\n 'export default { example: figma.$1`',\n )\n // Close the template literal for simple exports (look for backtick at end, handling multiline)\n // Use a more robust approach: find the last backtick that's not followed by more content\n migrated = migrated.replace(\n /(export default \\{ example: figma\\.\\w+`[\\s\\S]*?)`(?=\\s*$)/gm,\n '$1` }',\n )\n\n // 11. Export format - spread operator case\n // { ...figma.code`...`, metadata: ... } → { example: figma.code`...`, metadata: ... }\n migrated = migrated.replace(\n /\\{\\s*\\.\\.\\.figma\\.(code|tsx|html|swift|kotlin)`/g,\n '{ example: figma.$1`',\n )\n\n return migrated\n}\n\n/**\n * Removes the __props definition and props assignments. These are only used by icons\n * helpers and significantly bloat templates.\n */\nexport function removePropsDefinition(template: string): string {\n // Match from \"const __props = {\" through everything up until (but not including) \"export default {\"\n // Uses [\\s\\S] to match any character including newlines\n return template.replace(/const\\s+__props\\s*=\\s*\\{[\\s\\S]*?(?=export\\s+default\\s*\\{)/g, '\\n')\n}\n\n/**\n * Removes the __props definition/assignments and removes __props from the default export\n */\nexport function removePropsDefinitionAndMetadata(template: string): string {\n // First remove the __props definition and assignments\n let result = removePropsDefinition(template)\n const exportMatch = result.match(/(export\\s+default\\s+\\{[\\s\\S]*$)/)\n if (exportMatch) {\n const exportSection = exportMatch[1]\n const cleanedExport = exportSection\n .replace(/metadata:\\s*\\{\\s*__props\\s*\\}/g, 'metadata: {}') // metadata: { __props }\n .replace(/metadata:\\s*\\{\\s*__props\\s*,/g, 'metadata: {') // metadata: { __props, ...\n .replace(/,\\s*__props\\s*\\}/g, ' }') // metadata: { ..., __props }\n .replace(/,\\s*__props\\s*,/g, ',') // metadata: { ..., __props, ... }\n\n result = result.substring(0, result.indexOf(exportSection)) + cleanedExport\n }\n\n return result\n}\n\ntype CodeConnectObjectsForFigmaUrl = {\n main: CodeConnectJSON | null\n variants: CodeConnectJSON[]\n}\n\n/**\n * For each figmaUrl in the given codeConnectObjects, return the main (non-variant)\n * codeConnectObject plus a list of any variants\n */\nexport const groupCodeConnectObjectsByFigmaUrl = (codeConnectObjects: CodeConnectJSON[]) => {\n return codeConnectObjects.reduce(\n (acc, obj) => {\n const figmaUrl = obj.figmaNode\n if (!acc[figmaUrl]) {\n acc[figmaUrl] = { main: null, variants: [] }\n }\n\n if (obj.variant && Object.keys(obj.variant).length > 0) {\n acc[figmaUrl].variants.push(obj)\n } else {\n acc[figmaUrl].main = obj\n }\n\n return acc\n },\n {} as Record<string, CodeConnectObjectsForFigmaUrl>,\n )\n}\n\n/** One parserless file per component: branch per variant, each with its own props and template object; export default template. */\nexport function writeVariantTemplateFile(\n group: CodeConnectObjectsForFigmaUrl,\n figmaUrl: string,\n outputDir: string | undefined,\n baseDir: string,\n {\n localSourcePath,\n filePathsCreated,\n useTypeScript = true,\n includeProps = false,\n }: WriteTemplateFileOptions = {},\n): { outputPath: string; skipped: boolean } {\n const variantDocs = group.variants.map((v) => ({ doc: v, variant: v.variant }))\n const defaultDoc = group.main ? { doc: group.main, variant: null } : null\n const componentName = (group.main ?? group.variants[0])?.component || 'template'\n\n // Migrate templates and extract their full code (no deduplication)\n const allDocs = [...variantDocs, ...(defaultDoc ? [defaultDoc] : [])]\n const migratedTemplates = allDocs.map(({ doc }) =>\n prepareMigratedTemplate(doc, includeProps, useTypeScript),\n )\n const exportDefaultPrefix = 'export default '\n\n // For each template, replace 'export default' with 'template =' and remove figma require\n const branches = migratedTemplates.map((t) => {\n if (!t.includes(exportDefaultPrefix)) {\n throw new Error(`Variant merge: no \"export default\" in template for ${figmaUrl}`)\n }\n\n // Replace 'export default' with 'template ='\n let branchCode = t.replace(exportDefaultPrefix, 'template = ')\n\n // Remove only the top-level figma require/import, keep everything else\n const lines = branchCode.split('\\n')\n const filteredLines = lines.filter(\n (line) =>\n !line.trim().startsWith('const figma = require') &&\n !line.trim().startsWith('import figma from'),\n )\n\n return filteredLines.join('\\n').trim()\n })\n\n // Build the variant switch structure using conditions for all variant properties\n const ifParts: string[] = []\n for (let i = 0; i < variantDocs.length; i++) {\n const { variant } = variantDocs[i]\n const branchCode = branches[i]\n\n if (variant && Object.keys(variant).length > 0) {\n // Build condition from all properties in the variant\n const condition = Object.entries(variant)\n .map(\n ([key, val]) =>\n `figma.selectedInstance.getPropertyValue('${key}') === ${typeof val === 'string' ? `'${val}'` : val}`,\n )\n .join(' && ')\n\n ifParts.push(`${ifParts.length ? '} else ' : ''}if (${condition}) {\\n${branchCode}`)\n }\n }\n\n // Add default/fallback branch (use the last doc: main if present, otherwise first variant)\n const defaultBranchCode = branches[branches.length - 1]\n\n ifParts.push(`} else {\\n${defaultBranchCode}\\n}`)\n\n const variantComment =\n group.main != null\n ? `// Branch per variant combination.`\n : `// Branch per variant; no default, else first.`\n\n const templateBody = [\n useTypeScript ? `import figma from \"figma\"` : `const figma = require('figma')`,\n '',\n variantComment,\n '',\n 'let template',\n ifParts.join('\\n'),\n '',\n 'export default template',\n ].join('\\n')\n\n const formatted = formatTemplate(templateBody)\n\n // Build comment header with url, source, and component\n // Use the representative doc (main or first variant) for source/component values\n const representativeDoc = group.main ?? group.variants[0]\n const commentLines: string[] = [`// url=${figmaUrl}`]\n if (representativeDoc?.source) {\n commentLines.push(`// source=${representativeDoc.source}`)\n }\n if (representativeDoc?.component) {\n commentLines.push(`// component=${representativeDoc.component}`)\n }\n commentLines.push(``)\n\n const fileContent = commentLines.join('\\n') + '\\n' + formatted\n\n return writeTemplateFileCommon(\n componentName,\n fileContent,\n outputDir,\n baseDir,\n localSourcePath,\n filePathsCreated,\n useTypeScript,\n )\n}\n\nfunction convertSyntaxToTypeScript(template: string): string {\n return template\n .replace(/const figma = require\\(['\"]figma['\"]\\)/, `import figma from \"figma\"`)\n .replace(/const __props = {}/, 'const __props: Record<string, unknown> = {}')\n .replace(\n /if \\((\\w+) && \\1\\.type !== \"ERROR\"\\)/g,\n 'if ($1 && ($1 as { type?: string }).type !== \"ERROR\")',\n )\n}\n"]}
1
+ {"version":3,"file":"migration_helpers.js","sourceRoot":"","sources":["../../src/connect/migration_helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport * as prettier from 'prettier'\nimport { CodeConnectJSON } from '../connect/figma_connect'\n\n/** Prettier configuration used for all generated template files */\nconst PRETTIER_OPTIONS = {\n parser: 'typescript' as const,\n semi: false,\n trailingComma: 'all' as const,\n pluginSearchDirs: false as const,\n}\n\n/** Formats template code with consistent prettier configuration */\nexport function formatTemplate(code: string): string {\n return prettier.format(code, PRETTIER_OPTIONS)\n}\n\n/**\n * Common wrapper that handles path determination and file writing for both\n * simple templates and variant templates.\n */\nfunction writeTemplateFileCommon(\n componentName: string,\n fileContent: string,\n outputDir: string | undefined,\n baseDir: string,\n localSourcePath: string | undefined,\n filePathsCreated: Set<string> | undefined,\n useTypeScript = true,\n): { outputPath: string; skipped: boolean } {\n const suffix = useTypeScript ? '.figma.ts' : '.figma.js'\n const baseOutputPath = determineOutputPath(\n componentName,\n suffix,\n outputDir,\n baseDir,\n localSourcePath,\n )\n return writeFileWithDuplicateHandling(baseOutputPath, fileContent, suffix, filePathsCreated)\n}\n\nexport function getFilenameFromComponentName(componentName: string): string {\n const allowlisted = /[a-zA-Z0-9\\-\\.]/\n return componentName\n .split('')\n .map((ch) => (allowlisted.test(ch) ? ch : '_'))\n .join('')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '')\n}\n\n/**\n * Determines the base output path for a template file.\n * Shared logic between writeTemplateFile and writeVariantTemplateFile.\n */\nfunction determineOutputPath(\n rawComponentName: string,\n suffix: string,\n outputDir: string | undefined,\n baseDir: string,\n localSourcePath: string | undefined,\n): string {\n // Extract basename from localSourcePath when available, falling back to componentName\n const componentFilename = getFilenameFromComponentName(rawComponentName)\n let basename = componentFilename\n if (localSourcePath) {\n let sourceBasename = path.basename(localSourcePath)\n\n // If this is a Code Connect file, extract the base component name\n // Handles patterns like: Button.figma.tsx, Button.figmadoc.tsx, Button.figma.template.js\n // Should all become: Button.figma.js\n const codeConnectPattern = /\\.(figma|figmadoc)(\\.[^.]+)+$/\n if (codeConnectPattern.test(sourceBasename)) {\n // Extract everything before the .figma/.figmadoc pattern\n sourceBasename = sourceBasename.replace(codeConnectPattern, '')\n } else {\n // For regular component files, strip extension normally\n sourceBasename = path.basename(localSourcePath, path.extname(localSourcePath))\n }\n\n basename = sourceBasename\n }\n\n if (outputDir) {\n // Use specified output directory with basename derived from source path\n return path.join(outputDir, `${basename}${suffix}`)\n } else if (localSourcePath) {\n // Use same directory as local source file\n return path.join(path.dirname(localSourcePath), `${basename}${suffix}`)\n } else {\n // No source info, use current directory\n const filename = `${componentFilename}${suffix}`\n return path.join(baseDir, filename)\n }\n}\n\n/**\n * Handles file existence checking, duplicate name resolution, and writing.\n * Shared logic between writeTemplateFile and writeVariantTemplateFile.\n */\nfunction writeFileWithDuplicateHandling(\n baseOutputPath: string,\n fileContent: string,\n suffix: string,\n filePathsCreated: Set<string> | undefined,\n): { outputPath: string; skipped: boolean } {\n // Check if file already exists on disk (pre-existing file, not created in this run)\n const existsOnDisk = fs.existsSync(baseOutputPath)\n const createdInThisRun = filePathsCreated && filePathsCreated.has(baseOutputPath)\n\n if (existsOnDisk && !createdInThisRun) {\n // This file existed before the migration run, skip it\n return { outputPath: baseOutputPath, skipped: true }\n }\n\n // Handle duplicate names (either created in this run or would conflict with an existing file)\n let outputPath = baseOutputPath\n if (createdInThisRun || existsOnDisk) {\n // Find a unique name by appending _1, _2, etc. before the suffix\n const dir = path.dirname(baseOutputPath)\n const basename = path.basename(baseOutputPath)\n\n // Remove the suffix to get the base name (works for any suffix like .figma.js or .figma.ts)\n const baseNameWithoutSuffix = basename.endsWith(suffix)\n ? basename.slice(0, -suffix.length)\n : basename\n\n let counter = 1\n do {\n outputPath = path.join(dir, `${baseNameWithoutSuffix}_${counter}${suffix}`)\n counter++\n } while ((filePathsCreated && filePathsCreated.has(outputPath)) || fs.existsSync(outputPath))\n }\n\n // Ensure output directory exists\n const outputDirPath = path.dirname(outputPath)\n if (!fs.existsSync(outputDirPath)) {\n fs.mkdirSync(outputDirPath, { recursive: true })\n }\n\n // Write the file\n fs.writeFileSync(outputPath, fileContent, 'utf-8')\n\n // Track the created file path\n if (filePathsCreated) {\n filePathsCreated.add(outputPath)\n }\n\n return { outputPath, skipped: false }\n}\n\n/** Migrates a doc's template (Swift helpers, server helpers, V2, id, imports, nestable) without formatting. */\nexport function prepareMigratedTemplateBody(\n doc: CodeConnectJSON,\n includeProps = false,\n useTypeScript?: boolean,\n): string {\n let template = doc.template\n template = removeSwiftHelpers(template)\n template = migrateTemplateToUseServerSideHelpers(template)\n if (!includeProps) {\n template = removePropsDefinitionAndMetadata(template)\n }\n template = migrateV1TemplateToV2(template)\n template = addId(template, doc.component || 'TODO')\n template = addImports(template, doc.templateData?.imports)\n template = addNestableToMetadata(template, !!doc.templateData?.nestable)\n if (useTypeScript) {\n template = convertSyntaxToTypeScript(template)\n }\n return template\n}\n\n/** Migrates a doc's template (Swift helpers, server helpers, V2, id, imports, nestable) and returns the formatted string. */\nexport function prepareMigratedTemplate(\n doc: CodeConnectJSON,\n includeProps = false,\n useTypeScript?: boolean,\n): string {\n const template = prepareMigratedTemplateBody(doc, includeProps, useTypeScript)\n return formatTemplate(template)\n}\n\nfunction removeSwiftHelpers(template: string): string {\n return template.replace(\n `function __fcc_renderSwiftChildren(children, prefix) {\n if (children === undefined) {\n return children\n }\n return children.flatMap((child, index) => {\n if (child.type === 'CODE') {\n let code = child.code.split('\\\\n').map((line) => {\n return line.trim() !== '' ? \\`\\${prefix}\\${line}\\` : line;\n }).join('\\\\n')\n if (index !== children.length - 1) {\n code = code + '\\\\n'\n }\n return {\n ...child,\n code: code,\n }\n } else {\n let elements = []\n const shouldAddNewline = index > 0 && children[index - 1].type === 'CODE' && !children[index - 1].code.endsWith('\\\\n')\n elements.push({ type: 'CODE', code: \\`\\${shouldAddNewline ? '\\\\n' : ''}\\${prefix}\\` })\n elements.push(child)\n if (index !== children.length - 1) {\n elements.push({ type: 'CODE', code: '\\\\n' })\n }\n return elements\n }\n })\n}\n`,\n '',\n )\n}\n\nexport type WriteTemplateFileOptions = {\n localSourcePath?: string\n filePathsCreated?: Set<string>\n includeProps?: boolean\n useTypeScript?: boolean\n}\n\nexport function writeTemplateFile(\n doc: CodeConnectJSON,\n outputDir: string | undefined,\n baseDir: string,\n {\n localSourcePath,\n filePathsCreated,\n includeProps = false,\n useTypeScript = true,\n }: WriteTemplateFileOptions = {},\n): { outputPath: string; skipped: boolean } {\n const componentName = doc.component || 'template'\n const template = prepareMigratedTemplate(doc, includeProps, useTypeScript)\n\n // Build comment header lines\n const commentLines: string[] = [`// url=${doc.figmaNode}`]\n if (doc.source) {\n commentLines.push(`// source=${doc.source}`)\n }\n if (doc.component) {\n commentLines.push(`// component=${doc.component}`)\n }\n commentLines.push(``)\n\n const fileContent = commentLines.join('\\n') + '\\n' + template\n\n return writeTemplateFileCommon(\n componentName,\n fileContent,\n outputDir,\n baseDir,\n localSourcePath,\n filePathsCreated,\n useTypeScript,\n )\n}\n\n// Renames must match helpers in code_connect_js_api.raw_source.ts\nexport function migrateTemplateToUseServerSideHelpers(template: string) {\n return (\n template\n // React helpers\n .replace(/_fcc_renderReactProp/g, 'figma.helpers.react.renderProp')\n .replace(/_fcc_renderReactChildren/g, 'figma.helpers.react.renderChildren')\n .replace(/_fcc_jsxElement/g, 'figma.helpers.react.jsxElement')\n .replace(/_fcc_function/g, 'figma.helpers.react.function')\n .replace(/_fcc_identifier/g, 'figma.helpers.react.identifier')\n .replace(/_fcc_object/g, 'figma.helpers.react.object')\n .replace(/_fcc_templateString/g, 'figma.helpers.react.templateString')\n .replace(/_fcc_renderPropValue/g, 'figma.helpers.react.renderPropValue')\n .replace(/_fcc_stringifyObject/g, 'figma.helpers.react.stringifyObject')\n .replace(/_fcc_reactComponent/g, 'figma.helpers.react.reactComponent')\n .replace(/_fcc_array/g, 'figma.helpers.react.array')\n .replace(/isReactComponentArray/g, 'figma.helpers.react.isReactComponentArray')\n // Swift helpers\n .replace(/__fcc_renderSwiftChildren/g, 'figma.helpers.swift.renderChildren')\n // Kotlin/Compose helpers\n .replace(/__fcc_renderComposeChildren/g, 'figma.helpers.kotlin.renderChildren')\n )\n}\n\nexport function addId(template: string, id: string): string {\n // Don't add id if already present (e.g. when re-migrating a previously-migrated template)\n if (/export default\\s*\\{\\s*id:\\s*['\"]/.test(template)) {\n return template\n }\n return template.replace(/export default \\{/, `export default { id: '${id}',`)\n}\n\nexport function addImports(template: string, imports: string[] | undefined): string {\n if (!imports || imports.length === 0) {\n return template\n }\n\n // Escape imports for safe insertion into JS\n const importsJson = JSON.stringify(imports)\n\n // Add imports after the id field if it exists, otherwise at the start\n // Match: export default { id: '...', (with optional whitespace/newlines)\n const withId = template.replace(\n /(export default\\s*\\{\\s*id:\\s*'[^']*',)/,\n `$1 imports: ${importsJson},`,\n )\n\n // If id replacement worked, return\n if (withId !== template) {\n return withId\n }\n\n // Otherwise, add at the start (after opening brace)\n return template.replace(/export default\\s*\\{/, `export default { imports: ${importsJson},`)\n}\n\nexport function addNestableToMetadata(template: string, nestable: boolean): string {\n // Find \"metadata: {\" and replace with \"metadata: { nestable: <value>,\"\n return template.replace(/metadata:\\s*\\{/, `metadata: { nestable: ${nestable},`)\n}\n\n/**\n * Migrates V1 templates to V2 API.\n *\n * This performs safe, incremental transformations. The following patterns\n * are intentionally NOT migrated as they're still supported in V2:\n *\n * - __props metadata building pattern - still valid JavaScript\n * - __renderWithFn__() - complex transformation, still supported\n *\n * These may be addressed in future migrations.\n */\nexport const migrateV1TemplateToV2 = (template: string): string => {\n let migrated = template\n\n // 1. Core object rename\n migrated = migrated.replace(/figma\\.currentLayer/g, 'figma.selectedInstance')\n\n // 2. Normalize template types to figma.code\n migrated = migrated.replace(/figma\\.html/g, 'figma.code')\n migrated = migrated.replace(/figma\\.tsx/g, 'figma.code')\n migrated = migrated.replace(/figma\\.swift/g, 'figma.code')\n migrated = migrated.replace(/figma\\.kotlin/g, 'figma.code')\n\n // 3. Property accessor methods\n migrated = migrated.replace(/\\.__properties__\\.string\\(/g, '.getString(')\n migrated = migrated.replace(/\\.__properties__\\.boolean\\(/g, '.getBoolean(')\n migrated = migrated.replace(/\\.__properties__\\.enum\\(/g, '.getEnum(')\n migrated = migrated.replace(/\\.__properties__\\.__instance__\\(/g, '.getInstanceSwap(')\n // .__properties__.instance() auto-renders, so we need to add .executeTemplate().example\n migrated = migrated.replace(\n /\\.__properties__\\.instance\\(([^)]+)\\)/g,\n '.getInstanceSwap($1)?.executeTemplate().example',\n )\n\n // 4. Alias for __properties__ on selectedInstance\n migrated = migrated.replace(/figma\\.selectedInstance\\.__properties__\\./g, 'figma.properties.')\n\n // 5. Other method renames\n migrated = migrated.replace(/\\.__getPropertyValue__\\(/g, '.getPropertyValue(')\n\n // 6. __findChildWithCriteria__ - migrate based on type parameter\n // For TEXT type with __render__(): __findChildWithCriteria__({ name: 'X', type: \"TEXT\" }).__render__() → findText('X').__render__()\n //\n // We intentionally keep `.__render__()` here rather than the friendlier\n // `.textContent`. `findText` returns `TextHandle | ErrorHandle`, and\n // `textContent` only exists on `TextHandle` - so `.findText('X').textContent`\n // (a) fails to typecheck (`textContent` does not exist on `ErrorHandle`), and\n // (b) silently evaluates to `undefined` for a missing layer, swallowing the\n // error. `__render__()` exists on both handles (returning the text string on\n // success and an error section on failure), exactly matching the pre-migration\n // runtime behavior of the React parser's `figma.textContent('X')`.\n //\n // We emit a sentinel so the blanket `__render__()` -> `executeTemplate().example`\n // rewrite below (step 8) doesn't clobber it - `TextHandle` has no\n // `executeTemplate`, so that rewrite would re-break the text case. The sentinel\n // is converted back to `__render__()` at the end of this function.\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*name:\\s*'([^']+)',\\s*type:\\s*\"TEXT\"\\s*\\}\\)\\.__render__\\(\\)/g,\n \".findText('$1').__FCC_TEXT_RENDER__()\",\n )\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*type:\\s*\"TEXT\",\\s*name:\\s*'([^']+)'\\s*\\}\\)\\.__render__\\(\\)/g,\n \".findText('$1').__FCC_TEXT_RENDER__()\",\n )\n // For INSTANCE type: __findChildWithCriteria__({ type: 'INSTANCE', name: 'X' }) → findInstance('X')\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*name:\\s*'([^']+)',\\s*type:\\s*['\"]INSTANCE['\"]\\s*\\}\\)/g,\n \".findInstance('$1')\",\n )\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*type:\\s*['\"]INSTANCE['\"],\\s*name:\\s*'([^']+)'\\s*\\}\\)/g,\n \".findInstance('$1')\",\n )\n // For TEXT type without __render__(): __findChildWithCriteria__({ type: 'TEXT', name: 'X' }) → findText('X')\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*name:\\s*'([^']+)',\\s*type:\\s*['\"]TEXT['\"]\\s*\\}\\)/g,\n \".findText('$1')\",\n )\n migrated = migrated.replace(\n /\\.__findChildWithCriteria__\\(\\{\\s*type:\\s*['\"]TEXT['\"],\\s*name:\\s*'([^']+)'\\s*\\}\\)/g,\n \".findText('$1')\",\n )\n\n // 7. __find__() - migrate to findInstance()\n migrated = migrated.replace(\n /\\.__find__\\((\"([^\"]+)\"|'([^']+)')\\)/g,\n (match, quote, doubleQuoted, singleQuoted) => {\n const name = doubleQuoted || singleQuoted\n return `.findInstance(\"${name}\")`\n },\n )\n\n // 8. __render__() - migrate to executeTemplate().example (but not if part of __findChildWithCriteria__)\n migrated = migrated.replace(/\\.__render__\\(\\)/g, '.executeTemplate().example')\n\n // 9. __getProps__() - migrate to executeTemplate().metadata.props\n migrated = migrated.replace(/\\.__getProps__\\(\\)/g, '.executeTemplate().metadata.props')\n\n // 10. Export format - simple case\n // Match export default figma.code` (or tsx, html, etc) and wrap in { example: ... }\n migrated = migrated.replace(\n /export default figma\\.(code|tsx|html|swift|kotlin)`/g,\n 'export default { example: figma.$1`',\n )\n // Close the template literal for simple exports (look for backtick at end, handling multiline)\n // Use a more robust approach: find the last backtick that's not followed by more content\n migrated = migrated.replace(\n /(export default \\{ example: figma\\.\\w+`[\\s\\S]*?)`(?=\\s*$)/gm,\n '$1` }',\n )\n\n // 11. Export format - spread operator case\n // { ...figma.code`...`, metadata: ... } → { example: figma.code`...`, metadata: ... }\n migrated = migrated.replace(\n /\\{\\s*\\.\\.\\.figma\\.(code|tsx|html|swift|kotlin)`/g,\n '{ example: figma.$1`',\n )\n\n // 12. Restore the TEXT __render__ sentinel emitted in step 6 (kept out of the\n // way of step 8's __render__ -> executeTemplate().example rewrite).\n migrated = migrated.replace(/\\.__FCC_TEXT_RENDER__\\(\\)/g, '.__render__()')\n\n return migrated\n}\n\n/**\n * Removes the __props definition and props assignments. These are only used by icons\n * helpers and significantly bloat templates.\n */\nexport function removePropsDefinition(template: string): string {\n // Match from \"const __props = {\" through everything up until (but not including) \"export default {\"\n // Uses [\\s\\S] to match any character including newlines\n return template.replace(/const\\s+__props\\s*=\\s*\\{[\\s\\S]*?(?=export\\s+default\\s*\\{)/g, '\\n')\n}\n\n/**\n * Removes the __props definition/assignments and removes __props from the default export\n */\nexport function removePropsDefinitionAndMetadata(template: string): string {\n // First remove the __props definition and assignments\n let result = removePropsDefinition(template)\n const exportMatch = result.match(/(export\\s+default\\s+\\{[\\s\\S]*$)/)\n if (exportMatch) {\n const exportSection = exportMatch[1]\n const cleanedExport = exportSection\n .replace(/metadata:\\s*\\{\\s*__props\\s*\\}/g, 'metadata: {}') // metadata: { __props }\n .replace(/metadata:\\s*\\{\\s*__props\\s*,/g, 'metadata: {') // metadata: { __props, ...\n .replace(/,\\s*__props\\s*\\}/g, ' }') // metadata: { ..., __props }\n .replace(/,\\s*__props\\s*,/g, ',') // metadata: { ..., __props, ... }\n\n result = result.substring(0, result.indexOf(exportSection)) + cleanedExport\n }\n\n return result\n}\n\ntype CodeConnectObjectsForFigmaUrl = {\n main: CodeConnectJSON | null\n variants: CodeConnectJSON[]\n}\n\n/**\n * For each figmaUrl in the given codeConnectObjects, return the main (non-variant)\n * codeConnectObject plus a list of any variants\n */\nexport const groupCodeConnectObjectsByFigmaUrl = (codeConnectObjects: CodeConnectJSON[]) => {\n return codeConnectObjects.reduce(\n (acc, obj) => {\n const figmaUrl = obj.figmaNode\n if (!acc[figmaUrl]) {\n acc[figmaUrl] = { main: null, variants: [] }\n }\n\n if (obj.variant && Object.keys(obj.variant).length > 0) {\n acc[figmaUrl].variants.push(obj)\n } else {\n acc[figmaUrl].main = obj\n }\n\n return acc\n },\n {} as Record<string, CodeConnectObjectsForFigmaUrl>,\n )\n}\n\n/** One parserless file per component: branch per variant, each with its own props and template object; export default template. */\nexport function writeVariantTemplateFile(\n group: CodeConnectObjectsForFigmaUrl,\n figmaUrl: string,\n outputDir: string | undefined,\n baseDir: string,\n {\n localSourcePath,\n filePathsCreated,\n useTypeScript = true,\n includeProps = false,\n }: WriteTemplateFileOptions = {},\n): { outputPath: string; skipped: boolean } {\n const variantDocs = group.variants.map((v) => ({ doc: v, variant: v.variant }))\n const defaultDoc = group.main ? { doc: group.main, variant: null } : null\n const componentName = (group.main ?? group.variants[0])?.component || 'template'\n\n // Migrate templates and extract their full code (no deduplication)\n const allDocs = [...variantDocs, ...(defaultDoc ? [defaultDoc] : [])]\n const migratedTemplates = allDocs.map(({ doc }) =>\n prepareMigratedTemplate(doc, includeProps, useTypeScript),\n )\n const exportDefaultPrefix = 'export default '\n\n // For each template, replace 'export default' with 'template =' and remove figma require\n const branches = migratedTemplates.map((t) => {\n if (!t.includes(exportDefaultPrefix)) {\n throw new Error(`Variant merge: no \"export default\" in template for ${figmaUrl}`)\n }\n\n // Replace 'export default' with 'template ='\n let branchCode = t.replace(exportDefaultPrefix, 'template = ')\n\n // Remove only the top-level figma require/import, keep everything else\n const lines = branchCode.split('\\n')\n const filteredLines = lines.filter(\n (line) =>\n !line.trim().startsWith('const figma = require') &&\n !line.trim().startsWith('import figma from'),\n )\n\n return filteredLines.join('\\n').trim()\n })\n\n // Build the variant switch structure using conditions for all variant properties\n const ifParts: string[] = []\n for (let i = 0; i < variantDocs.length; i++) {\n const { variant } = variantDocs[i]\n const branchCode = branches[i]\n\n if (variant && Object.keys(variant).length > 0) {\n // Build condition from all properties in the variant\n const condition = Object.entries(variant)\n .map(\n ([key, val]) =>\n `figma.selectedInstance.getPropertyValue('${key}') === ${typeof val === 'string' ? `'${val}'` : val}`,\n )\n .join(' && ')\n\n ifParts.push(`${ifParts.length ? '} else ' : ''}if (${condition}) {\\n${branchCode}`)\n }\n }\n\n // Add default/fallback branch (use the last doc: main if present, otherwise first variant)\n const defaultBranchCode = branches[branches.length - 1]\n\n ifParts.push(`} else {\\n${defaultBranchCode}\\n}`)\n\n const variantComment =\n group.main != null\n ? `// Branch per variant combination.`\n : `// Branch per variant; no default, else first.`\n\n const templateBody = [\n useTypeScript ? `import figma from \"figma\"` : `const figma = require('figma')`,\n '',\n variantComment,\n '',\n 'let template',\n ifParts.join('\\n'),\n '',\n 'export default template',\n ].join('\\n')\n\n const formatted = formatTemplate(templateBody)\n\n // Build comment header with url, source, and component\n // Use the representative doc (main or first variant) for source/component values\n const representativeDoc = group.main ?? group.variants[0]\n const commentLines: string[] = [`// url=${figmaUrl}`]\n if (representativeDoc?.source) {\n commentLines.push(`// source=${representativeDoc.source}`)\n }\n if (representativeDoc?.component) {\n commentLines.push(`// component=${representativeDoc.component}`)\n }\n commentLines.push(``)\n\n const fileContent = commentLines.join('\\n') + '\\n' + formatted\n\n return writeTemplateFileCommon(\n componentName,\n fileContent,\n outputDir,\n baseDir,\n localSourcePath,\n filePathsCreated,\n useTypeScript,\n )\n}\n\nfunction convertSyntaxToTypeScript(template: string): string {\n return template\n .replace(/const figma = require\\(['\"]figma['\"]\\)/, `import figma from \"figma\"`)\n .replace(/const __props = {}/, 'const __props: Record<string, unknown> = {}')\n .replace(\n /if \\((\\w+) && \\1\\.type !== \"ERROR\"\\)/g,\n 'if ($1 && ($1 as { type?: string }).type !== \"ERROR\")',\n )\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"parser_executables.d.ts","sourceRoot":"","sources":["../../src/connect/parser_executables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAEL,iCAAiC,EAGlC,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EAGrB,MAAM,2BAA2B,CAAA;AA+ElC,wBAAsB,UAAU,CAC9B,MAAM,EAAE,iCAAiC,EACzC,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,MAAM,mBA0LZ;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC;;EAsBhF"}
1
+ {"version":3,"file":"parser_executables.d.ts","sourceRoot":"","sources":["../../src/connect/parser_executables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAEL,iCAAiC,EAGlC,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EAGrB,MAAM,2BAA2B,CAAA;AA+FlC,wBAAsB,UAAU,CAC9B,MAAM,EAAE,iCAAiC,EACzC,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,MAAM,mBA0LZ;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC;;EAsBhF"}
@@ -17,20 +17,28 @@ const temporaryOutputDirectoryPath = 'tmp/parser-output';
17
17
  const FIRST_PARTY_PARSERS = {
18
18
  swift: {
19
19
  command: async (cwd, config) => {
20
- return `swift run --package-path ${await (0, get_swift_parser_dir_1.getSwiftParserDir)(cwd, config.xcodeprojPath, config.swiftPackagePath, config.sourcePackagesPath)} figma-swift`;
20
+ const packagePath = await (0, get_swift_parser_dir_1.getSwiftParserDir)(cwd, config.xcodeprojPath, config.swiftPackagePath, config.sourcePackagesPath);
21
+ return {
22
+ cmd: 'swift',
23
+ args: ['run', '--package-path', packagePath, 'figma-swift'],
24
+ };
21
25
  },
22
26
  },
23
27
  compose: {
24
28
  command: async (cwd, config, mode) => {
25
29
  const gradlewPath = await (0, get_gradlew_path_1.getGradleWrapperPath)(cwd, config.gradleWrapperPath);
26
30
  const gradleExecutableInvocation = (0, get_gradlew_path_1.getGradleWrapperExecutablePath)(gradlewPath);
27
- const verboseFlags = config.verbose ? ' --stacktrace' : '';
28
- if (mode === 'CREATE') {
29
- return `${gradleExecutableInvocation} -p ${gradlewPath} createCodeConnect -PfilePath=${temporaryInputFilePath}${verboseFlags} -PoutputDir=${temporaryOutputDirectoryPath}`;
30
- }
31
- else {
32
- return `${gradleExecutableInvocation} -p ${gradlewPath} parseCodeConnect -PfilePath=${temporaryInputFilePath}${verboseFlags} -PoutputDir=${temporaryOutputDirectoryPath}`;
33
- }
31
+ const verbose = Boolean(config.verbose);
32
+ const task = mode === 'CREATE' ? 'createCodeConnect' : 'parseCodeConnect';
33
+ const args = [
34
+ '-p',
35
+ gradlewPath,
36
+ task,
37
+ `-PfilePath=${temporaryInputFilePath}`,
38
+ ...(verbose ? ['--stacktrace'] : []),
39
+ `-PoutputDir=${temporaryOutputDirectoryPath}`,
40
+ ];
41
+ return { cmd: gradleExecutableInvocation, args };
34
42
  },
35
43
  temporaryInputFilePath: temporaryInputFilePath,
36
44
  temporaryOutputDirectoryPath: temporaryOutputDirectoryPath,
@@ -41,11 +49,15 @@ const FIRST_PARTY_PARSERS = {
41
49
  (0, logging_1.exitWithError)('No `parserCommand` specified in config. A command is required when using the `custom` parser.');
42
50
  }
43
51
  logging_1.logger.info('Using custom parser command: ' + config.parserCommand);
44
- return config.parserCommand;
52
+ // Keep user quoting intact for free-form custom commands.
53
+ return { cmd: config.parserCommand, args: [], shell: true };
45
54
  },
46
55
  },
47
56
  __unit_test__: {
48
- command: async () => 'node parser/unit_test_parser.js',
57
+ command: async () => ({
58
+ cmd: 'node',
59
+ args: ['parser/unit_test_parser.js'],
60
+ }),
49
61
  },
50
62
  };
51
63
  function getParser(config) {
@@ -73,10 +85,10 @@ async function callParser(config, payload, cwd) {
73
85
  if (parser.temporaryOutputDirectoryPath) {
74
86
  fs_1.default.mkdirSync(parser.temporaryOutputDirectoryPath, { recursive: true });
75
87
  }
76
- logging_1.logger.debug(`Running parser: ${command}`);
77
- const commandSplit = command.split(' ');
78
- const child = (0, cross_spawn_1.spawn)(commandSplit[0], commandSplit.slice(1), {
88
+ logging_1.logger.debug(`Running parser: ${command.cmd} ${command.args.join(' ')}`);
89
+ const child = (0, cross_spawn_1.spawn)(command.cmd, command.args, {
79
90
  cwd,
91
+ shell: command.shell,
80
92
  });
81
93
  let stdout = '';
82
94
  let stderr = '';
@@ -1 +1 @@
1
- {"version":3,"file":"parser_executables.js","sourceRoot":"","sources":["../../src/connect/parser_executables.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { exitWithError, logger } from '../common/logging'\nimport {\n CodeConnectCustomExecutableParserConfig,\n CodeConnectExecutableParserConfig,\n CodeConnectExecutableParser,\n CodeConnectParser,\n} from './project'\nimport {\n ParserExecutableMessages,\n ParserRequestPayload,\n ParseResponsePayload,\n CreateResponsePayload,\n} from './parser_executable_types'\nimport { spawn } from 'cross-spawn'\nimport { getSwiftParserDir } from '../parser_scripts/get_swift_parser_dir'\nimport fs from 'fs'\nimport path from 'path'\nimport {\n getGradleWrapperExecutablePath,\n getGradleWrapperPath,\n} from '../parser_scripts/get_gradlew_path'\nimport { getComposeErrorSuggestion } from '../parser_scripts/compose_errors'\n\nconst temporaryInputFilePath = 'tmp/figma-code-connect-parser-io.json.tmp'\nconst temporaryOutputDirectoryPath = 'tmp/parser-output'\n\ntype ParserInfo = {\n command: (\n cwd: string,\n config: CodeConnectExecutableParserConfig | CodeConnectCustomExecutableParserConfig,\n mode: ParserRequestPayload['mode'],\n ) => Promise<string>\n temporaryInputFilePath?: string\n temporaryOutputDirectoryPath?: string\n}\n\nconst FIRST_PARTY_PARSERS: Record<CodeConnectExecutableParser, ParserInfo> = {\n swift: {\n command: async (cwd, config) => {\n return `swift run --package-path ${await getSwiftParserDir(\n cwd,\n (config as any).xcodeprojPath,\n (config as any).swiftPackagePath,\n (config as any).sourcePackagesPath,\n )} figma-swift`\n },\n },\n compose: {\n command: async (cwd, config, mode) => {\n const gradlewPath = await getGradleWrapperPath(cwd, (config as any).gradleWrapperPath)\n const gradleExecutableInvocation = getGradleWrapperExecutablePath(gradlewPath)\n const verboseFlags = (config as any).verbose ? ' --stacktrace' : ''\n if (mode === 'CREATE') {\n return `${gradleExecutableInvocation} -p ${gradlewPath} createCodeConnect -PfilePath=${temporaryInputFilePath}${verboseFlags} -PoutputDir=${temporaryOutputDirectoryPath}`\n } else {\n return `${gradleExecutableInvocation} -p ${gradlewPath} parseCodeConnect -PfilePath=${temporaryInputFilePath}${verboseFlags} -PoutputDir=${temporaryOutputDirectoryPath}`\n }\n },\n temporaryInputFilePath: temporaryInputFilePath,\n temporaryOutputDirectoryPath: temporaryOutputDirectoryPath,\n },\n custom: {\n command: async (cwd, config) => {\n if (!('parserCommand' in config)) {\n exitWithError(\n 'No `parserCommand` specified in config. A command is required when using the `custom` parser.',\n )\n }\n logger.info('Using custom parser command: ' + config.parserCommand)\n return config.parserCommand\n },\n },\n __unit_test__: {\n command: async () => 'node parser/unit_test_parser.js',\n },\n}\n\nfunction getParser(config: CodeConnectExecutableParserConfig): ParserInfo | never {\n const parser = FIRST_PARTY_PARSERS[config.parser]\n\n if (!parser) {\n exitWithError(\n `Invalid parser specified: \"${config.parser}\". Valid parsers are: ${Object.keys(\n FIRST_PARTY_PARSERS,\n ).join(', ')}.`,\n )\n }\n\n return parser\n}\n\nexport async function callParser(\n config: CodeConnectExecutableParserConfig,\n payload: ParserRequestPayload,\n cwd: string,\n) {\n return new Promise<object>(async (resolve, reject) => {\n try {\n const parser = getParser(config)\n const configWithVerbose = {\n ...config,\n verbose: (payload as any).verbose,\n }\n\n const command = await parser.command(cwd, configWithVerbose, payload.mode)\n\n // Create temporary input file if it exists\n if (parser.temporaryInputFilePath) {\n fs.mkdirSync(path.dirname(parser.temporaryInputFilePath), { recursive: true })\n fs.writeFileSync(parser.temporaryInputFilePath, JSON.stringify(payload))\n }\n\n // Create temporary output directory if it exists\n if (parser.temporaryOutputDirectoryPath) {\n fs.mkdirSync(parser.temporaryOutputDirectoryPath, { recursive: true })\n }\n\n logger.debug(`Running parser: ${command}`)\n const commandSplit = command.split(' ')\n\n const child = spawn(commandSplit[0], commandSplit.slice(1), {\n cwd,\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout.on('data', (data) => {\n stdout += data.toString()\n })\n\n // This handles any stderr output from the parser.\n //\n // Parsers should not generally write to stderr, and should instead return\n // an array of messages at the end of execution, but there are cases where\n // you might want to log output immediately rather than at the end of the\n // run - e.g. if the parser can take a while to compile first time, you\n // might want to inform the user immediately that it is compiling.\n //\n // To log output, the parser should write a JSON object to stderr with the\n // same structure as the `messages` response object, e.g. `{ \"level\":\n // \"INFO\", \"message\": \"Compiling parser...\" }`.\n //\n // Non-JSON output will be logged as debug messages, as this is likely to\n // be e.g. compiler output which the user doesn't need to see ordinarily.\n child.stderr.on('data', (data) => {\n const message = data.toString()\n const trimmedMessage = message.trim()\n try {\n const parsed = JSON.parse(trimmedMessage)\n handleMessages([parsed])\n } catch (e) {\n stderr += message\n logger.debug(trimmedMessage)\n }\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n const errorSuggestion = determineErrorSuggestionFromStderr(stderr, config.parser)\n if (errorSuggestion) {\n reject(new Error(`Parser exited with code ${code}: ${errorSuggestion}`))\n } else {\n reject(new Error(`Parser exited with code ${code}`))\n }\n } else {\n // List the files in the temporary output directory if it exists and log them\n if (parser.temporaryOutputDirectoryPath) {\n try {\n const outputDir = parser.temporaryOutputDirectoryPath\n if (fs.existsSync(outputDir)) {\n const files = fs.readdirSync(outputDir)\n logger.debug(\n `Files in temporary output directory (${outputDir}): ${files.length > 0 ? files.join(', ') : '[empty]'}`,\n )\n\n // Combine all JSON files in the output directory into a single JSON object.\n // For PARSE responses: Each file has a \"docs\" array and a \"messages\" array.\n // For CREATE responses: Each file has a \"createdFiles\" array and a \"messages\" array.\n // The combined output will have a single array of the appropriate type and a single \"messages\" array.\n\n // Filter for .json files only\n const jsonFiles = files.filter((f) => f.endsWith('.json'))\n let allMessages: z.infer<typeof ParserExecutableMessages> = []\n const uniqueDocsMap = new Map<\n string,\n z.infer<typeof ParseResponsePayload>['docs'][number]\n >()\n let allCreatedFiles: z.infer<typeof CreateResponsePayload>['createdFiles'] = []\n\n for (const file of jsonFiles) {\n const filePath = path.join(outputDir, file)\n try {\n const content = fs.readFileSync(filePath, 'utf8')\n const parsed = JSON.parse(content)\n if (Array.isArray(parsed.docs)) {\n // Deduplicate docs based on figmaNode + template\n // The template contains the actual code example and is unique per component.\n // This allows multiple different code components to map to the same Figma node,\n // while preventing the same component from being duplicated in multi-module projects.\n for (const doc of parsed.docs) {\n const dedupeKey = JSON.stringify({\n figmaNode: doc.figmaNode,\n template: doc.template,\n })\n if (!uniqueDocsMap.has(dedupeKey)) {\n uniqueDocsMap.set(dedupeKey, doc)\n }\n }\n }\n if (Array.isArray(parsed.createdFiles)) {\n allCreatedFiles = allCreatedFiles.concat(parsed.createdFiles)\n }\n if (Array.isArray(parsed.messages)) {\n allMessages = allMessages.concat(parsed.messages)\n }\n } catch (err) {\n logger.warn(`Failed to parse output file ${file}: ${err}`)\n }\n }\n\n const allDocs = Array.from(uniqueDocsMap.values())\n\n // Return the appropriate response based on the mode\n if (payload.mode === 'CREATE') {\n resolve({\n createdFiles: allCreatedFiles,\n messages: allMessages,\n })\n } else {\n resolve({\n docs: allDocs,\n messages: allMessages,\n })\n }\n } else {\n logger.debug(`Temporary output directory (${outputDir}) does not exist.`)\n }\n } catch (err) {\n logger.warn(`Failed to list files in temporary output directory: ${err}`)\n }\n } else {\n // Assume the output is in the stdout\n resolve(JSON.parse(stdout))\n }\n }\n\n if (parser.temporaryInputFilePath) {\n // Retain temp file and directory when verbose mode is enabled\n if (!(payload as any).verbose) {\n fs.unlinkSync(parser.temporaryInputFilePath)\n // Delete parent directory if empty after removing temp file\n const parentDir = path.dirname(parser.temporaryInputFilePath)\n if (fs.readdirSync(parentDir).length === 0) {\n fs.rmdirSync(parentDir)\n }\n }\n }\n })\n\n child.on('error', (e) => {\n reject(e)\n })\n if (!parser.temporaryInputFilePath) {\n child.stdin.write(JSON.stringify(payload))\n child.stdin.end()\n }\n } catch (e) {\n if ((payload as any).verbose) {\n console.trace(e)\n\n // Don't say to enable verbose if the user has already enabled it.\n exitWithError(`Error calling parser: ${e}.`)\n } else {\n exitWithError(\n `Error calling parser: ${e}. Try re-running the command with --verbose for more information.`,\n )\n }\n }\n })\n}\n\nexport function handleMessages(messages: z.infer<typeof ParserExecutableMessages>) {\n let hasErrors = false\n\n messages.forEach((message) => {\n switch (message.level) {\n case 'DEBUG':\n logger.debug(message.message)\n break\n case 'INFO':\n logger.info(message.message)\n break\n case 'WARN':\n logger.warn(message.message)\n break\n case 'ERROR':\n logger.error(message.message)\n hasErrors = true\n break\n }\n })\n\n return { hasErrors }\n}\n\n// This function is used to determine if there is a suggestion for the error based on the output\n// to stderr. Certain parsers return the same error code for different types of errors such as\n// errors from invoking the gradle wrapper for Compose.\n// In the future we should consider exposing a different API for having the parser return a suggestion directly.\nfunction determineErrorSuggestionFromStderr(\n stderr: string,\n parser: CodeConnectParser,\n): string | null {\n if (parser === 'compose') {\n return getComposeErrorSuggestion(stderr)\n }\n return null\n}\n"]}
1
+ {"version":3,"file":"parser_executables.js","sourceRoot":"","sources":["../../src/connect/parser_executables.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { exitWithError, logger } from '../common/logging'\nimport {\n CodeConnectCustomExecutableParserConfig,\n CodeConnectExecutableParserConfig,\n CodeConnectExecutableParser,\n CodeConnectParser,\n} from './project'\nimport {\n ParserExecutableMessages,\n ParserRequestPayload,\n ParseResponsePayload,\n CreateResponsePayload,\n} from './parser_executable_types'\nimport { spawn } from 'cross-spawn'\nimport { getSwiftParserDir } from '../parser_scripts/get_swift_parser_dir'\nimport fs from 'fs'\nimport path from 'path'\nimport {\n getGradleWrapperExecutablePath,\n getGradleWrapperPath,\n} from '../parser_scripts/get_gradlew_path'\nimport { getComposeErrorSuggestion } from '../parser_scripts/compose_errors'\n\nconst temporaryInputFilePath = 'tmp/figma-code-connect-parser-io.json.tmp'\nconst temporaryOutputDirectoryPath = 'tmp/parser-output'\n\n// Parser invocation in argv form; only custom parser uses shell.\ntype ParserCommand = { cmd: string; args: string[]; shell?: boolean }\n\ntype ParserInfo = {\n command: (\n cwd: string,\n config: CodeConnectExecutableParserConfig | CodeConnectCustomExecutableParserConfig,\n mode: ParserRequestPayload['mode'],\n ) => Promise<ParserCommand>\n temporaryInputFilePath?: string\n temporaryOutputDirectoryPath?: string\n}\n\nconst FIRST_PARTY_PARSERS: Record<CodeConnectExecutableParser, ParserInfo> = {\n swift: {\n command: async (cwd, config) => {\n const packagePath = await getSwiftParserDir(\n cwd,\n (config as any).xcodeprojPath,\n (config as any).swiftPackagePath,\n (config as any).sourcePackagesPath,\n )\n return {\n cmd: 'swift',\n args: ['run', '--package-path', packagePath, 'figma-swift'],\n }\n },\n },\n compose: {\n command: async (cwd, config, mode) => {\n const gradlewPath = await getGradleWrapperPath(cwd, (config as any).gradleWrapperPath)\n const gradleExecutableInvocation = getGradleWrapperExecutablePath(gradlewPath)\n const verbose = Boolean((config as any).verbose)\n const task = mode === 'CREATE' ? 'createCodeConnect' : 'parseCodeConnect'\n const args = [\n '-p',\n gradlewPath,\n task,\n `-PfilePath=${temporaryInputFilePath}`,\n ...(verbose ? ['--stacktrace'] : []),\n `-PoutputDir=${temporaryOutputDirectoryPath}`,\n ]\n return { cmd: gradleExecutableInvocation, args }\n },\n temporaryInputFilePath: temporaryInputFilePath,\n temporaryOutputDirectoryPath: temporaryOutputDirectoryPath,\n },\n custom: {\n command: async (cwd, config) => {\n if (!('parserCommand' in config)) {\n exitWithError(\n 'No `parserCommand` specified in config. A command is required when using the `custom` parser.',\n )\n }\n logger.info('Using custom parser command: ' + config.parserCommand)\n // Keep user quoting intact for free-form custom commands.\n return { cmd: config.parserCommand, args: [], shell: true }\n },\n },\n __unit_test__: {\n command: async () => ({\n cmd: 'node',\n args: ['parser/unit_test_parser.js'],\n }),\n },\n}\n\nfunction getParser(config: CodeConnectExecutableParserConfig): ParserInfo | never {\n const parser = FIRST_PARTY_PARSERS[config.parser]\n\n if (!parser) {\n exitWithError(\n `Invalid parser specified: \"${config.parser}\". Valid parsers are: ${Object.keys(\n FIRST_PARTY_PARSERS,\n ).join(', ')}.`,\n )\n }\n\n return parser\n}\n\nexport async function callParser(\n config: CodeConnectExecutableParserConfig,\n payload: ParserRequestPayload,\n cwd: string,\n) {\n return new Promise<object>(async (resolve, reject) => {\n try {\n const parser = getParser(config)\n const configWithVerbose = {\n ...config,\n verbose: (payload as any).verbose,\n }\n\n const command = await parser.command(cwd, configWithVerbose, payload.mode)\n\n // Create temporary input file if it exists\n if (parser.temporaryInputFilePath) {\n fs.mkdirSync(path.dirname(parser.temporaryInputFilePath), { recursive: true })\n fs.writeFileSync(parser.temporaryInputFilePath, JSON.stringify(payload))\n }\n\n // Create temporary output directory if it exists\n if (parser.temporaryOutputDirectoryPath) {\n fs.mkdirSync(parser.temporaryOutputDirectoryPath, { recursive: true })\n }\n\n logger.debug(`Running parser: ${command.cmd} ${command.args.join(' ')}`)\n\n const child = spawn(command.cmd, command.args, {\n cwd,\n shell: command.shell,\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout.on('data', (data) => {\n stdout += data.toString()\n })\n\n // This handles any stderr output from the parser.\n //\n // Parsers should not generally write to stderr, and should instead return\n // an array of messages at the end of execution, but there are cases where\n // you might want to log output immediately rather than at the end of the\n // run - e.g. if the parser can take a while to compile first time, you\n // might want to inform the user immediately that it is compiling.\n //\n // To log output, the parser should write a JSON object to stderr with the\n // same structure as the `messages` response object, e.g. `{ \"level\":\n // \"INFO\", \"message\": \"Compiling parser...\" }`.\n //\n // Non-JSON output will be logged as debug messages, as this is likely to\n // be e.g. compiler output which the user doesn't need to see ordinarily.\n child.stderr.on('data', (data) => {\n const message = data.toString()\n const trimmedMessage = message.trim()\n try {\n const parsed = JSON.parse(trimmedMessage)\n handleMessages([parsed])\n } catch (e) {\n stderr += message\n logger.debug(trimmedMessage)\n }\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n const errorSuggestion = determineErrorSuggestionFromStderr(stderr, config.parser)\n if (errorSuggestion) {\n reject(new Error(`Parser exited with code ${code}: ${errorSuggestion}`))\n } else {\n reject(new Error(`Parser exited with code ${code}`))\n }\n } else {\n // List the files in the temporary output directory if it exists and log them\n if (parser.temporaryOutputDirectoryPath) {\n try {\n const outputDir = parser.temporaryOutputDirectoryPath\n if (fs.existsSync(outputDir)) {\n const files = fs.readdirSync(outputDir)\n logger.debug(\n `Files in temporary output directory (${outputDir}): ${files.length > 0 ? files.join(', ') : '[empty]'}`,\n )\n\n // Combine all JSON files in the output directory into a single JSON object.\n // For PARSE responses: Each file has a \"docs\" array and a \"messages\" array.\n // For CREATE responses: Each file has a \"createdFiles\" array and a \"messages\" array.\n // The combined output will have a single array of the appropriate type and a single \"messages\" array.\n\n // Filter for .json files only\n const jsonFiles = files.filter((f) => f.endsWith('.json'))\n let allMessages: z.infer<typeof ParserExecutableMessages> = []\n const uniqueDocsMap = new Map<\n string,\n z.infer<typeof ParseResponsePayload>['docs'][number]\n >()\n let allCreatedFiles: z.infer<typeof CreateResponsePayload>['createdFiles'] = []\n\n for (const file of jsonFiles) {\n const filePath = path.join(outputDir, file)\n try {\n const content = fs.readFileSync(filePath, 'utf8')\n const parsed = JSON.parse(content)\n if (Array.isArray(parsed.docs)) {\n // Deduplicate docs based on figmaNode + template\n // The template contains the actual code example and is unique per component.\n // This allows multiple different code components to map to the same Figma node,\n // while preventing the same component from being duplicated in multi-module projects.\n for (const doc of parsed.docs) {\n const dedupeKey = JSON.stringify({\n figmaNode: doc.figmaNode,\n template: doc.template,\n })\n if (!uniqueDocsMap.has(dedupeKey)) {\n uniqueDocsMap.set(dedupeKey, doc)\n }\n }\n }\n if (Array.isArray(parsed.createdFiles)) {\n allCreatedFiles = allCreatedFiles.concat(parsed.createdFiles)\n }\n if (Array.isArray(parsed.messages)) {\n allMessages = allMessages.concat(parsed.messages)\n }\n } catch (err) {\n logger.warn(`Failed to parse output file ${file}: ${err}`)\n }\n }\n\n const allDocs = Array.from(uniqueDocsMap.values())\n\n // Return the appropriate response based on the mode\n if (payload.mode === 'CREATE') {\n resolve({\n createdFiles: allCreatedFiles,\n messages: allMessages,\n })\n } else {\n resolve({\n docs: allDocs,\n messages: allMessages,\n })\n }\n } else {\n logger.debug(`Temporary output directory (${outputDir}) does not exist.`)\n }\n } catch (err) {\n logger.warn(`Failed to list files in temporary output directory: ${err}`)\n }\n } else {\n // Assume the output is in the stdout\n resolve(JSON.parse(stdout))\n }\n }\n\n if (parser.temporaryInputFilePath) {\n // Retain temp file and directory when verbose mode is enabled\n if (!(payload as any).verbose) {\n fs.unlinkSync(parser.temporaryInputFilePath)\n // Delete parent directory if empty after removing temp file\n const parentDir = path.dirname(parser.temporaryInputFilePath)\n if (fs.readdirSync(parentDir).length === 0) {\n fs.rmdirSync(parentDir)\n }\n }\n }\n })\n\n child.on('error', (e) => {\n reject(e)\n })\n if (!parser.temporaryInputFilePath) {\n child.stdin.write(JSON.stringify(payload))\n child.stdin.end()\n }\n } catch (e) {\n if ((payload as any).verbose) {\n console.trace(e)\n\n // Don't say to enable verbose if the user has already enabled it.\n exitWithError(`Error calling parser: ${e}.`)\n } else {\n exitWithError(\n `Error calling parser: ${e}. Try re-running the command with --verbose for more information.`,\n )\n }\n }\n })\n}\n\nexport function handleMessages(messages: z.infer<typeof ParserExecutableMessages>) {\n let hasErrors = false\n\n messages.forEach((message) => {\n switch (message.level) {\n case 'DEBUG':\n logger.debug(message.message)\n break\n case 'INFO':\n logger.info(message.message)\n break\n case 'WARN':\n logger.warn(message.message)\n break\n case 'ERROR':\n logger.error(message.message)\n hasErrors = true\n break\n }\n })\n\n return { hasErrors }\n}\n\n// This function is used to determine if there is a suggestion for the error based on the output\n// to stderr. Certain parsers return the same error code for different types of errors such as\n// errors from invoking the gradle wrapper for Compose.\n// In the future we should consider exposing a different API for having the parser return a suggestion directly.\nfunction determineErrorSuggestionFromStderr(\n stderr: string,\n parser: CodeConnectParser,\n): string | null {\n if (parser === 'compose') {\n return getComposeErrorSuggestion(stderr)\n }\n return null\n}\n"]}
@@ -8,6 +8,7 @@ export declare const DEFAULT_INCLUDE_GLOBS_BY_PARSER: {
8
8
  custom: undefined;
9
9
  __unit_test__: string[];
10
10
  };
11
+ export declare const DEFAULT_PARSERLESS_INCLUDE_GLOBS: string[];
11
12
  export declare const DEFAULT_LABEL_PER_PARSER: Partial<Record<CodeConnectParser, string>>;
12
13
  export type CodeConnectExecutableParser = 'swift' | 'compose' | 'custom' | '__unit_test__';
13
14
  export type CodeConnectParser = 'react' | 'html' | CodeConnectExecutableParser;
@@ -105,7 +106,7 @@ export type CodeConnectConfig = CodeConnectReactConfig | CodeConnectExecutablePa
105
106
  interface FigmaConfig {
106
107
  codeConnect?: CodeConnectConfig;
107
108
  }
108
- export declare function determineConfigFromProject(dir: string, exitOnError?: boolean, isTemplatesOnlyCLI?: boolean): FigmaConfig | undefined;
109
+ export declare function determineConfigFromProject(dir: string, isTemplatesOnlyCLI?: boolean): FigmaConfig;
109
110
  export declare function determineLabelFromProject(dir: string): string | undefined;
110
111
  export declare function getGitRemoteURL(repoPath: string): string;
111
112
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/connect/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/connect/project.ts"],"names":[],"mappings":"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"}
@@ -3,7 +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.DEFAULT_LABEL_PER_PARSER = exports.DEFAULT_INCLUDE_GLOBS_BY_PARSER = void 0;
6
+ exports.DEFAULT_LABEL_PER_PARSER = exports.DEFAULT_PARSERLESS_INCLUDE_GLOBS = exports.DEFAULT_INCLUDE_GLOBS_BY_PARSER = void 0;
7
7
  exports.determineConfigFromProject = determineConfigFromProject;
8
8
  exports.determineLabelFromProject = determineLabelFromProject;
9
9
  exports.getGitRemoteURL = getGitRemoteURL;
@@ -44,26 +44,33 @@ exports.DEFAULT_INCLUDE_GLOBS_BY_PARSER = {
44
44
  custom: undefined,
45
45
  __unit_test__: [''],
46
46
  };
47
+ exports.DEFAULT_PARSERLESS_INCLUDE_GLOBS = [
48
+ '**/*.figma.ts',
49
+ '**/*.figma.js',
50
+ '**/*.figma.template.ts',
51
+ '**/*.figma.template.js',
52
+ '**/*.figma.batch.json',
53
+ ];
54
+ const DEFAULT_PARSERLESS_EXCLUDE_GLOBS = ['node_modules/**'];
47
55
  exports.DEFAULT_LABEL_PER_PARSER = {
48
56
  react: label_language_mapping_1.CodeConnectLabel.React,
49
57
  html: label_language_mapping_1.CodeConnectLabel.WebComponents,
50
58
  };
51
- function determineConfigFromProject(dir, exitOnError = true, isTemplatesOnlyCLI = false) {
59
+ function determineConfigFromProject(dir, isTemplatesOnlyCLI = false) {
52
60
  if (isTemplatesOnlyCLI) {
53
61
  const label = determineLabelFromProject(dir);
54
62
  return { codeConnect: label ? { label } : {} };
55
63
  }
56
64
  const parser = determineParserFromProject(dir);
65
+ const label = determineLabelFromProject(dir);
57
66
  if (parser) {
58
- const label = determineLabelFromProject(dir);
59
67
  if (label) {
60
68
  return { codeConnect: { parser, label } };
61
69
  }
62
70
  return { codeConnect: { parser } };
63
71
  }
64
- if (exitOnError) {
65
- (0, logging_1.exitWithError)(`Code Connect was not able to determine your project type, and no config file was found. Please ensure you are running Code Connect from your project root. You may need to create a config file specifying which parser to use. See https://github.com/figma/code-connect/ for instructions.`);
66
- }
72
+ logging_1.logger.info(`Can't determine parser from project. Proceeding without a parser.`);
73
+ return { codeConnect: label ? { label } : {} };
67
74
  }
68
75
  function showParserMessage(message) {
69
76
  logging_1.logger.info(message +
@@ -226,15 +233,16 @@ async function parseConfig(configFilePath, dir, isTemplatesOnlyCLI = false) {
226
233
  const config = await checkForLegacyConfig(rawConfig, configFilePath);
227
234
  if (!isTemplatesOnlyCLI && !config.codeConnect?.parser) {
228
235
  const parser = determineParserFromProject(dir);
229
- if (!parser) {
230
- logging_1.logger.error(`Code Connect was not able to determine your project type, and no \`parser\` was specified. Please ensure you are running Code Connect from your project root. You may need to add a \`parser\` key to your config file, specifying which parser to use. See https://github.com/figma/code-connect/ for instructions.`);
231
- (0, helpers_1.exitWithFeedbackMessage)(1);
236
+ if (parser) {
237
+ if (!config.codeConnect) {
238
+ config.codeConnect = { parser };
239
+ }
240
+ // TS errors if this is in an else
241
+ config.codeConnect.parser = parser;
232
242
  }
233
- if (!config.codeConnect) {
234
- config.codeConnect = { parser };
243
+ else {
244
+ logging_1.logger.info(`Can't determine parser from project. Proceeding without a parser.`);
235
245
  }
236
- // TS errors if this is in an else
237
- config.codeConnect.parser = parser;
238
246
  }
239
247
  if (!config.codeConnect?.label) {
240
248
  const label = determineLabelFromProject(dir);
@@ -427,7 +435,7 @@ async function parseOrDetermineConfig(dir, configPath, isTemplatesOnlyCLI = fals
427
435
  }
428
436
  const globalConfig = hasConfigFile
429
437
  ? await parseConfig(configFilePath, dir, isTemplatesOnlyCLI)
430
- : determineConfigFromProject(dir, true, isTemplatesOnlyCLI);
438
+ : determineConfigFromProject(dir, isTemplatesOnlyCLI);
431
439
  if (!globalConfig) {
432
440
  throw new Error(`Error parsing config file: ${configFilePath}`);
433
441
  }
@@ -489,19 +497,13 @@ async function getProjectInfoFromConfig(dir, config, isTemplatesOnlyCLI = false)
489
497
  const absPath = path_1.default.resolve(dir);
490
498
  const remoteUrl = getGitRemoteURL(absPath);
491
499
  const defaultIncludeGlobs = isTemplatesOnlyCLI
492
- ? [
493
- '**/*.figma.ts',
494
- '**/*.figma.js',
495
- '**/*.figma.template.ts',
496
- '**/*.figma.template.js',
497
- '**/*.figma.batch.json',
498
- ]
500
+ ? exports.DEFAULT_PARSERLESS_INCLUDE_GLOBS
499
501
  : config.parser
500
502
  ? exports.DEFAULT_INCLUDE_GLOBS_BY_PARSER[config.parser]
501
- : undefined;
503
+ : exports.DEFAULT_PARSERLESS_INCLUDE_GLOBS;
502
504
  // always ignore node_modules; for parsers, apply parser-specific exclusions
503
505
  const defaultExcludeGlobs = isTemplatesOnlyCLI
504
- ? ['node_modules/**']
506
+ ? DEFAULT_PARSERLESS_EXCLUDE_GLOBS
505
507
  : config.parser
506
508
  ? ({
507
509
  react: ['node_modules/**'],
@@ -511,7 +513,7 @@ async function getProjectInfoFromConfig(dir, config, isTemplatesOnlyCLI = false)
511
513
  custom: [],
512
514
  __unit_test__: [],
513
515
  }[config.parser] ?? [])
514
- : [];
516
+ : DEFAULT_PARSERLESS_EXCLUDE_GLOBS;
515
517
  const includeGlobs = config.include || defaultIncludeGlobs;
516
518
  const excludeGlobs = config.exclude
517
519
  ? [...config.exclude, ...defaultExcludeGlobs]