@figma/code-connect 1.4.9 → 1.5.1

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 (50) hide show
  1. package/README.md +4 -0
  2. package/dist/commands/connect.d.ts +5 -0
  3. package/dist/commands/connect.d.ts.map +1 -1
  4. package/dist/commands/connect.js +55 -10
  5. package/dist/commands/connect.js.map +1 -1
  6. package/dist/commands/connect_template.d.ts.map +1 -1
  7. package/dist/commands/connect_template.js +2 -2
  8. package/dist/commands/connect_template.js.map +1 -1
  9. package/dist/commands/preview_utils.d.ts +103 -5
  10. package/dist/commands/preview_utils.d.ts.map +1 -1
  11. package/dist/commands/preview_utils.js +453 -76
  12. package/dist/commands/preview_utils.js.map +1 -1
  13. package/dist/commands/property_list_table.d.ts +11 -0
  14. package/dist/commands/property_list_table.d.ts.map +1 -0
  15. package/dist/commands/property_list_table.js +67 -0
  16. package/dist/commands/property_list_table.js.map +1 -0
  17. package/dist/common/updates.d.ts +4 -1
  18. package/dist/common/updates.d.ts.map +1 -1
  19. package/dist/common/updates.js +24 -5
  20. package/dist/common/updates.js.map +1 -1
  21. package/dist/connect/api.d.ts.map +1 -1
  22. package/dist/connect/api.js.map +1 -1
  23. package/dist/connect/batch_templates.d.ts +1 -1
  24. package/dist/connect/batch_templates.d.ts.map +1 -1
  25. package/dist/connect/batch_templates.js +2 -2
  26. package/dist/connect/batch_templates.js.map +1 -1
  27. package/dist/connect/migration_batch_helpers.d.ts.map +1 -1
  28. package/dist/connect/migration_batch_helpers.js +1 -15
  29. package/dist/connect/migration_batch_helpers.js.map +1 -1
  30. package/dist/connect/migration_helpers.d.ts +6 -0
  31. package/dist/connect/migration_helpers.d.ts.map +1 -1
  32. package/dist/connect/migration_helpers.js +66 -0
  33. package/dist/connect/migration_helpers.js.map +1 -1
  34. package/dist/connect/property_combinations.d.ts +69 -0
  35. package/dist/connect/property_combinations.d.ts.map +1 -0
  36. package/dist/connect/property_combinations.js +172 -0
  37. package/dist/connect/property_combinations.js.map +1 -0
  38. package/dist/connect/raw_template_bundler.d.ts +13 -0
  39. package/dist/connect/raw_template_bundler.d.ts.map +1 -0
  40. package/dist/connect/raw_template_bundler.js +178 -0
  41. package/dist/connect/raw_template_bundler.js.map +1 -0
  42. package/dist/connect/raw_templates.d.ts +1 -1
  43. package/dist/connect/raw_templates.d.ts.map +1 -1
  44. package/dist/connect/raw_templates.js +85 -24
  45. package/dist/connect/raw_templates.js.map +1 -1
  46. package/dist/react/parser.d.ts.map +1 -1
  47. package/dist/react/parser.js.map +1 -1
  48. package/figma-types-no-require.d.ts +8 -6
  49. package/figma-types.d.ts +8 -6
  50. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"migration_batch_helpers.d.ts","sourceRoot":"","sources":["../../src/connect/migration_batch_helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAOjD,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC,KAAK,mBAAmB,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB,CAAA;AAQD,KAAK,yBAAyB,GAC1B;IACE,EAAE,EAAE,IAAI,CAAA;IACR,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE;QACT,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,mBAAmB,EAAE,CAAA;KAClC,CAAA;CACF,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAEjC,MAAM,MAAM,4BAA4B,GAAG;IACzC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,KAAK,6BAA6B,GAAG;IACnC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAaD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,eAAe,EAAE,EACvB,EACE,QAAgB,EAChB,QAAgB,EAChB,SAAgC,GACjC,GAAE;IACD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACd,kCAwBP;AA6YD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,eAAe,EAAE,EACvB,EACE,YAAoB,EACpB,aAAoB,EACpB,YAA0C,GAC3C,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GACjF,yBAAyB,CAgD3B;AAoDD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,eAAe,EAAE,EACvB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,EACf,EACE,eAAe,EACf,gBAAgB,EAChB,YAAoB,EACpB,aAAoB,GACrB,GAAE,6BAAkC,GACpC,4BAA4B,CAqC9B"}
1
+ {"version":3,"file":"migration_batch_helpers.d.ts","sourceRoot":"","sources":["../../src/connect/migration_batch_helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAOjD,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC,KAAK,mBAAmB,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB,CAAA;AAQD,KAAK,yBAAyB,GAC1B;IACE,EAAE,EAAE,IAAI,CAAA;IACR,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE;QACT,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,mBAAmB,EAAE,CAAA;KAClC,CAAA;CACF,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAEjC,MAAM,MAAM,4BAA4B,GAAG;IACzC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,KAAK,6BAA6B,GAAG;IACnC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAaD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,eAAe,EAAE,EACvB,EACE,QAAgB,EAChB,QAAgB,EAChB,SAAgC,GACjC,GAAE;IACD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACd,kCAwBP;AA0XD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,eAAe,EAAE,EACvB,EACE,YAAoB,EACpB,aAAoB,EACpB,YAA0C,GAC3C,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GACjF,yBAAyB,CAgD3B;AAoDD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,eAAe,EAAE,EACvB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,EACf,EACE,eAAe,EACf,gBAAgB,EAChB,YAAoB,EACpB,aAAoB,GACrB,GAAE,6BAAkC,GACpC,4BAA4B,CAqC9B"}
@@ -50,20 +50,6 @@ function applyReplacements(body, replacements) {
50
50
  return result.slice(0, replacement.start) + replacement.value + result.slice(replacement.end);
51
51
  }, body);
52
52
  }
53
- function removeUnusedSimpleConsts(body) {
54
- let previous;
55
- let next = body;
56
- const simpleConstRegex = /^const\s+([A-Za-z_$][\w$]*)\s*=\s*(?:"[^"\n]*"|'[^'\n]*'|figma\.helpers\.react\.identifier\(["'][^"'\n]+["']\)|[A-Za-z_$][\w$]*|true|false|-?\d+(?:\.\d+)?)\s*\n/gm;
57
- do {
58
- previous = next;
59
- next = next.replace(simpleConstRegex, (match, name, offset) => {
60
- const rest = next.slice(offset + match.length);
61
- const isReferenced = new RegExp(`\\b${escapeRegExp(name)}\\b`).test(rest);
62
- return isReferenced ? match : '';
63
- });
64
- } while (next !== previous);
65
- return next;
66
- }
67
53
  function deriveMetadata(docs) {
68
54
  const sources = docs.map((doc) => doc.source || undefined);
69
55
  const components = docs.map((doc) => doc.component || undefined);
@@ -352,7 +338,7 @@ function buildBatchMigration(docs, { includeProps = false, useTypeScript = true,
352
338
  }
353
339
  let candidates = docs.map((doc, index) => ({
354
340
  doc,
355
- body: removeUnusedSimpleConsts((0, migration_helpers_1.prepareMigratedTemplateBody)(doc, includeProps, useTypeScript)),
341
+ body: (0, migration_helpers_1.prepareMigratedTemplateBody)(doc, includeProps, useTypeScript),
356
342
  params: metadata.entries[index],
357
343
  }));
358
344
  candidates = tryIdSwap(candidates);
@@ -1 +1 @@
1
- {"version":3,"file":"migration_batch_helpers.js","sourceRoot":"","sources":["../../src/connect/migration_batch_helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport { CodeConnectJSON } from './figma_connect'\nimport {\n formatTemplate,\n getFilenameFromComponentName,\n prepareMigratedTemplateBody,\n} from './migration_helpers'\n\nexport const AUTO_BATCH_THRESHOLD = 10\n\ntype BatchComponentEntry = {\n url: string\n source?: string\n component?: string\n [key: string]: any\n}\n\ntype Candidate = {\n doc: CodeConnectJSON\n body: string\n params: BatchComponentEntry\n}\n\ntype BatchMigrationBuildResult =\n | {\n ok: true\n template: string\n batchJson: {\n templateFile: string\n components: BatchComponentEntry[]\n }\n }\n | { ok: false; reason: string }\n\nexport type WriteBatchTemplateFileResult = {\n templatePath?: string\n batchPath?: string\n skipped: boolean\n reason?: string\n componentCount: number\n}\n\ntype WriteBatchTemplateFileOptions = {\n localSourcePath?: string\n filePathsCreated?: Set<string>\n includeProps?: boolean\n useTypeScript?: boolean\n}\n\ntype ImportInfo = {\n kind: 'named' | 'default'\n symbol: string\n importPath: string\n raw: string\n}\n\nfunction uniqueValues(values: Array<string | undefined>) {\n return new Set(values)\n}\n\nexport function getBatchMigrationGroups(\n docs: CodeConnectJSON[],\n {\n batchAll = false,\n disabled = false,\n threshold = AUTO_BATCH_THRESHOLD,\n }: {\n batchAll?: boolean\n disabled?: boolean\n threshold?: number\n } = {},\n) {\n if (disabled) {\n return new Map<string, CodeConnectJSON[]>()\n }\n\n const docsBySourcePath = new Map<string, CodeConnectJSON[]>()\n for (const doc of docs) {\n if (!doc._codeConnectFilePath) {\n continue\n }\n\n const sourcePath = path.resolve(doc._codeConnectFilePath)\n docsBySourcePath.set(sourcePath, [...(docsBySourcePath.get(sourcePath) || []), doc])\n }\n\n const batchGroups = new Map<string, CodeConnectJSON[]>()\n for (const [sourcePath, sourceDocs] of docsBySourcePath) {\n if (batchAll || sourceDocs.length >= threshold) {\n batchGroups.set(sourcePath, sourceDocs)\n }\n }\n\n return batchGroups\n}\n\nfunction allEqual(values: string[]) {\n return values.every((value) => value === values[0])\n}\n\nfunction isIdentifier(value: string | undefined): value is string {\n return !!value && /^[A-Za-z_$][\\w$]*$/.test(value)\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction applyReplacements(\n body: string,\n replacements: Array<{ start: number; end: number; value: string }>,\n) {\n return replacements\n .sort((a, b) => b.start - a.start)\n .reduce((result, replacement) => {\n return result.slice(0, replacement.start) + replacement.value + result.slice(replacement.end)\n }, body)\n}\n\nfunction removeUnusedSimpleConsts(body: string) {\n let previous: string\n let next = body\n const simpleConstRegex =\n /^const\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*(?:\"[^\"\\n]*\"|'[^'\\n]*'|figma\\.helpers\\.react\\.identifier\\([\"'][^\"'\\n]+[\"']\\)|[A-Za-z_$][\\w$]*|true|false|-?\\d+(?:\\.\\d+)?)\\s*\\n/gm\n\n do {\n previous = next\n next = next.replace(simpleConstRegex, (match, name: string, offset: number) => {\n const rest = next.slice(offset + match.length)\n const isReferenced = new RegExp(`\\\\b${escapeRegExp(name)}\\\\b`).test(rest)\n return isReferenced ? match : ''\n })\n } while (next !== previous)\n\n return next\n}\n\nfunction deriveMetadata(\n docs: CodeConnectJSON[],\n):\n | { ok: true; comments: string[]; entries: BatchComponentEntry[] }\n | { ok: false; reason: string } {\n const sources = docs.map((doc) => doc.source || undefined)\n const components = docs.map((doc) => doc.component || undefined)\n const entries: BatchComponentEntry[] = docs.map((doc) => ({ url: doc.figmaNode }))\n const comments: string[] = []\n\n const metadataFields = [\n { name: 'source' as const, values: sources },\n { name: 'component' as const, values: components },\n ]\n\n for (const field of metadataFields) {\n const hasAny = field.values.some(Boolean)\n const hasAll = field.values.every(Boolean)\n const unique = uniqueValues(field.values)\n\n if (hasAny && !hasAll) {\n return {\n ok: false,\n reason: `Cannot batch: some docs have ${field.name} metadata and others do not`,\n }\n }\n\n if (!hasAny) {\n continue\n }\n\n if (unique.size === 1) {\n comments.push(`// ${field.name}=${field.values[0]}`)\n } else {\n docs.forEach((doc, index) => {\n const value = doc[field.name]\n if (value) {\n entries[index][field.name] = value\n }\n })\n }\n }\n\n return { ok: true, comments, entries }\n}\n\nfunction parseImport(importString: string): ImportInfo | null {\n const named = importString.match(\n /^import\\s+\\{\\s*([A-Za-z_$][\\w$]*)\\s*\\}\\s+from\\s+[\"']([^\"']+)[\"']\\s*;?$/,\n )\n if (named) {\n return { kind: 'named', symbol: named[1], importPath: named[2], raw: importString }\n }\n\n const defaultImport = importString.match(\n /^import\\s+([A-Za-z_$][\\w$]*)\\s+from\\s+[\"']([^\"']+)[\"']\\s*;?$/,\n )\n if (defaultImport) {\n return {\n kind: 'default',\n symbol: defaultImport[1],\n importPath: defaultImport[2],\n raw: importString,\n }\n }\n\n return null\n}\n\nfunction tryIdSwap(candidates: Candidate[]): Candidate[] {\n const matches = candidates.map((candidate) => candidate.body.match(/\\bid:\\s*(['\"])([^'\"\\\\]+)\\1/))\n if (matches.some((match) => !match)) {\n return candidates\n }\n\n const ids = matches.map((match) => match![2])\n if (uniqueValues(ids).size <= 1) {\n return candidates\n }\n\n return candidates.map((candidate, index) => ({\n ...candidate,\n body: candidate.body.replace(matches[index]![0], 'id: figma.batch.id'),\n params: { ...candidate.params, id: ids[index] },\n }))\n}\n\nfunction tryImportSwap(candidates: Candidate[]): Candidate[] {\n const importLists = candidates.map((candidate) => candidate.doc.templateData?.imports || [])\n if (importLists.some((imports) => imports.length !== 1)) {\n return candidates\n }\n\n const importStrings = importLists.map((imports) => imports[0])\n if (uniqueValues(importStrings).size <= 1) {\n return candidates\n }\n\n const parsed = importStrings.map(parseImport)\n if (parsed.some((info) => !info)) {\n return candidates\n }\n\n const imports = parsed as ImportInfo[]\n if (!allEqual(imports.map((info) => info.kind))) {\n return candidates\n }\n\n const symbolVaries = uniqueValues(imports.map((info) => info.symbol)).size > 1\n const pathVaries = uniqueValues(imports.map((info) => info.importPath)).size > 1\n if (!symbolVaries && !pathVaries) {\n return candidates\n }\n\n return candidates.map((candidate, index) => {\n const info = imports[index]\n const symbol = symbolVaries ? '${figma.batch.componentName}' : info.symbol\n const importPath = pathVaries ? '${figma.batch.importPath}' : info.importPath\n const replacement =\n info.kind === 'named'\n ? `\\`import { ${symbol} } from \"${importPath}\"\\``\n : `\\`import ${symbol} from \"${importPath}\"\\``\n const encodedImport = JSON.stringify(info.raw)\n\n if (!candidate.body.includes(encodedImport)) {\n return candidate\n }\n\n return {\n ...candidate,\n body: candidate.body.replace(encodedImport, replacement),\n params: {\n ...candidate.params,\n ...(symbolVaries ? { componentName: info.symbol } : {}),\n ...(pathVaries ? { importPath: info.importPath } : {}),\n },\n }\n })\n}\n\nfunction templateLiteralTextRanges(content: string, contentStart: number) {\n const ranges: Array<{ start: number; end: number; text: string }> = []\n let textStart = 0\n let i = 0\n\n while (i < content.length) {\n if (content[i] === '$' && content[i + 1] === '{') {\n if (textStart < i) {\n ranges.push({\n start: contentStart + textStart,\n end: contentStart + i,\n text: content.slice(textStart, i),\n })\n }\n\n i += 2\n let depth = 1\n while (i < content.length && depth > 0) {\n if (content[i] === '{') depth++\n if (content[i] === '}') depth--\n i++\n }\n textStart = i\n continue\n }\n\n i++\n }\n\n if (textStart < content.length) {\n ranges.push({\n start: contentStart + textStart,\n end: contentStart + content.length,\n text: content.slice(textStart),\n })\n }\n\n return ranges\n}\n\nfunction figmaCodeTextRanges(body: string) {\n const ranges: Array<{ start: number; end: number; text: string }> = []\n const regex = /figma\\.code`([\\s\\S]*?)`/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(body))) {\n const contentStart = match.index + 'figma.code`'.length\n ranges.push(...templateLiteralTextRanges(match[1], contentStart))\n }\n\n return ranges\n}\n\nfunction replaceIdentifierInFigmaCode(body: string, identifier: string, replacement: string) {\n const ranges = figmaCodeTextRanges(body)\n const identifierRegex = new RegExp(\n `(^|[^A-Za-z0-9_$])${escapeRegExp(identifier)}(?=$|[^A-Za-z0-9_$])`,\n 'g',\n )\n const replacements: Array<{ start: number; end: number; value: string }> = []\n\n for (const range of ranges) {\n let match: RegExpExecArray | null\n while ((match = identifierRegex.exec(range.text))) {\n const prefixLength = match[1].length\n const start = range.start + match.index + prefixLength\n replacements.push({\n start,\n end: start + identifier.length,\n value: replacement,\n })\n }\n }\n\n return applyReplacements(body, replacements)\n}\n\nfunction tryComponentSymbolSwap(candidates: Candidate[]): Candidate[] {\n let withNames = candidates\n\n if (withNames.some((candidate) => !candidate.params.componentName)) {\n const ids = withNames.map((candidate) => candidate.params.id)\n if (ids.every(isIdentifier) && uniqueValues(ids).size > 1) {\n withNames = withNames.map((candidate) => ({\n ...candidate,\n params: { ...candidate.params, componentName: candidate.params.id },\n }))\n }\n }\n\n if (withNames.some((candidate) => !candidate.params.componentName)) {\n return candidates\n }\n\n const names = withNames.map((candidate) => candidate.params.componentName as string)\n if (uniqueValues(names).size <= 1) {\n return candidates\n }\n\n return withNames.map((candidate, index) => ({\n ...candidate,\n body: replaceIdentifierInFigmaCode(\n candidate.body,\n names[index],\n '${figma.batch.componentName}',\n ),\n }))\n}\n\ntype ScalarMatch = {\n key: string\n operator: string\n value: string\n valueStart: number\n valueEnd: number\n}\n\nfunction collectNamedScalars(body: string, kind: 'string' | 'numberBoolean') {\n const ranges = figmaCodeTextRanges(body)\n const regex =\n kind === 'string'\n ? /([A-Za-z_$][\\w$]*)\\s*(=|:)\\s*(['\"])([^'\"\\\\\\n]+)\\3/g\n : /([A-Za-z_$][\\w$]*)\\s*(=|:)\\s*(?:\\{\\s*)?(true|false|-?\\d+(?:\\.\\d+)?)(?:\\s*\\})?(?=$|[^A-Za-z0-9_$.])/g\n const matches: ScalarMatch[] = []\n\n for (const range of ranges) {\n let match: RegExpExecArray | null\n while ((match = regex.exec(range.text))) {\n const value = kind === 'string' ? match[4] : match[3]\n const valueOffset = match[0].lastIndexOf(value)\n matches.push({\n key: match[1],\n operator: match[2],\n value,\n valueStart: range.start + match.index + valueOffset,\n valueEnd: range.start + match.index + valueOffset + value.length,\n })\n }\n }\n\n return matches\n}\n\nfunction parseScalarValue(value: string, kind: 'string' | 'numberBoolean') {\n if (kind === 'string') {\n return value\n }\n\n if (value === 'true') {\n return true\n }\n if (value === 'false') {\n return false\n }\n\n return Number(value)\n}\n\nfunction tryNamedScalarSwap(\n candidates: Candidate[],\n kind: 'string' | 'numberBoolean',\n): Candidate[] {\n const matchesByCandidate = candidates.map((candidate) =>\n collectNamedScalars(candidate.body, kind),\n )\n const matchCount = matchesByCandidate[0]?.length || 0\n if (matchCount === 0 || matchesByCandidate.some((matches) => matches.length !== matchCount)) {\n return candidates\n }\n\n const replacementsByCandidate = candidates.map(\n () => [] as Array<{ start: number; end: number; value: string }>,\n )\n const fieldNames = new Set<string>()\n const nextCandidates = candidates.map((candidate) => ({\n ...candidate,\n params: { ...candidate.params },\n }))\n\n for (let matchIndex = 0; matchIndex < matchCount; matchIndex++) {\n const matches = matchesByCandidate.map((matches) => matches[matchIndex])\n const first = matches[0]\n if (\n matches.some((match) => match.key !== first.key || match.operator !== first.operator) ||\n uniqueValues(matches.map((match) => match.value)).size <= 1\n ) {\n continue\n }\n\n if (fieldNames.has(first.key) || first.key in nextCandidates[0].params) {\n return candidates\n }\n\n fieldNames.add(first.key)\n matches.forEach((match, candidateIndex) => {\n replacementsByCandidate[candidateIndex].push({\n start: match.valueStart,\n end: match.valueEnd,\n value: `\\${figma.batch.${first.key}}`,\n })\n nextCandidates[candidateIndex].params[first.key] = parseScalarValue(match.value, kind)\n })\n }\n\n if (fieldNames.size === 0) {\n return candidates\n }\n\n return nextCandidates.map((candidate, index) => ({\n ...candidate,\n body: applyReplacements(candidate.body, replacementsByCandidate[index]),\n }))\n}\n\nexport function buildBatchMigration(\n docs: CodeConnectJSON[],\n {\n includeProps = false,\n useTypeScript = true,\n templateFile = './template.figma.batch.ts',\n }: { includeProps?: boolean; useTypeScript?: boolean; templateFile?: string } = {},\n): BatchMigrationBuildResult {\n if (docs.length < 2) {\n return { ok: false, reason: 'Cannot batch: at least two docs are required' }\n }\n\n if (docs.some((doc) => doc.variant && Object.keys(doc.variant).length > 0)) {\n return { ok: false, reason: 'Cannot batch: variant Code Connect docs are not supported yet' }\n }\n\n if (docs.some((doc) => !doc.template)) {\n return { ok: false, reason: 'Cannot batch: every doc must have a generated template' }\n }\n\n const metadata = deriveMetadata(docs)\n if (!metadata.ok) {\n return metadata\n }\n\n let candidates: Candidate[] = docs.map((doc, index) => ({\n doc,\n body: removeUnusedSimpleConsts(prepareMigratedTemplateBody(doc, includeProps, useTypeScript)),\n params: metadata.entries[index],\n }))\n\n candidates = tryIdSwap(candidates)\n candidates = tryImportSwap(candidates)\n candidates = tryComponentSymbolSwap(candidates)\n candidates = tryNamedScalarSwap(candidates, 'string')\n candidates = tryNamedScalarSwap(candidates, 'numberBoolean')\n\n if (!allEqual(candidates.map((candidate) => candidate.body))) {\n return {\n ok: false,\n reason: 'Cannot batch: templates did not reduce to one compatible shape',\n }\n }\n\n const templateBody = formatTemplate(candidates[0].body)\n const comments = metadata.comments.length > 0 ? `${metadata.comments.join('\\n')}\\n\\n` : ''\n\n return {\n ok: true,\n template: `${comments}${templateBody}`,\n batchJson: {\n templateFile,\n components: candidates.map((candidate) => candidate.params),\n },\n }\n}\n\nfunction getSourceBasename(localSourcePath: string | undefined, docs: CodeConnectJSON[]) {\n if (!localSourcePath) {\n return getFilenameFromComponentName(docs[0]?.component || 'batch')\n }\n\n const sourceBasename = path.basename(localSourcePath)\n const codeConnectPattern = /\\.(figma|figmadoc)(\\.[^.]+)+$/\n return codeConnectPattern.test(sourceBasename)\n ? sourceBasename.replace(codeConnectPattern, '')\n : path.basename(localSourcePath, path.extname(localSourcePath))\n}\n\nfunction determineBatchOutputPaths(\n basename: string,\n outputDir: string | undefined,\n baseDir: string,\n localSourcePath: string | undefined,\n useTypeScript: boolean,\n filePathsCreated: Set<string> | undefined,\n): { skipped: true; reason: string } | { skipped: false; templatePath: string; batchPath: string } {\n const dir = outputDir || (localSourcePath ? path.dirname(localSourcePath) : baseDir)\n const templateSuffix = useTypeScript ? '.figma.batch.ts' : '.figma.batch.js'\n const getPaths = (name: string) => ({\n templatePath: path.join(dir, `${name}${templateSuffix}`),\n batchPath: path.join(dir, `${name}.figma.batch.json`),\n })\n const basePaths = getPaths(basename)\n\n if (\n (fs.existsSync(basePaths.templatePath) && !filePathsCreated?.has(basePaths.templatePath)) ||\n (fs.existsSync(basePaths.batchPath) && !filePathsCreated?.has(basePaths.batchPath))\n ) {\n return { skipped: true, reason: 'batch output file already exists' }\n }\n\n let paths = basePaths\n let counter = 1\n while (\n fs.existsSync(paths.templatePath) ||\n fs.existsSync(paths.batchPath) ||\n filePathsCreated?.has(paths.templatePath) ||\n filePathsCreated?.has(paths.batchPath)\n ) {\n paths = getPaths(`${basename}_${counter}`)\n counter++\n }\n\n return { skipped: false, ...paths }\n}\n\nexport function writeBatchTemplateFiles(\n docs: CodeConnectJSON[],\n outputDir: string | undefined,\n baseDir: string,\n {\n localSourcePath,\n filePathsCreated,\n includeProps = false,\n useTypeScript = true,\n }: WriteBatchTemplateFileOptions = {},\n): WriteBatchTemplateFileResult {\n const basename = getSourceBasename(localSourcePath, docs)\n const paths = determineBatchOutputPaths(\n basename,\n outputDir,\n baseDir,\n localSourcePath,\n useTypeScript,\n filePathsCreated,\n )\n\n if (paths.skipped) {\n return { skipped: true, reason: paths.reason, componentCount: docs.length }\n }\n\n const built = buildBatchMigration(docs, {\n includeProps,\n useTypeScript,\n templateFile: `./${path.basename(paths.templatePath)}`,\n })\n\n if (!built.ok) {\n return { skipped: true, reason: built.reason, componentCount: docs.length }\n }\n\n fs.mkdirSync(path.dirname(paths.templatePath), { recursive: true })\n fs.writeFileSync(paths.templatePath, built.template, 'utf-8')\n fs.writeFileSync(paths.batchPath, `${JSON.stringify(built.batchJson, null, 2)}\\n`, 'utf-8')\n filePathsCreated?.add(paths.templatePath)\n filePathsCreated?.add(paths.batchPath)\n\n return {\n skipped: false,\n templatePath: paths.templatePath,\n batchPath: paths.batchPath,\n componentCount: docs.length,\n }\n}\n"]}
1
+ {"version":3,"file":"migration_batch_helpers.js","sourceRoot":"","sources":["../../src/connect/migration_batch_helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport { CodeConnectJSON } from './figma_connect'\nimport {\n formatTemplate,\n getFilenameFromComponentName,\n prepareMigratedTemplateBody,\n} from './migration_helpers'\n\nexport const AUTO_BATCH_THRESHOLD = 10\n\ntype BatchComponentEntry = {\n url: string\n source?: string\n component?: string\n [key: string]: any\n}\n\ntype Candidate = {\n doc: CodeConnectJSON\n body: string\n params: BatchComponentEntry\n}\n\ntype BatchMigrationBuildResult =\n | {\n ok: true\n template: string\n batchJson: {\n templateFile: string\n components: BatchComponentEntry[]\n }\n }\n | { ok: false; reason: string }\n\nexport type WriteBatchTemplateFileResult = {\n templatePath?: string\n batchPath?: string\n skipped: boolean\n reason?: string\n componentCount: number\n}\n\ntype WriteBatchTemplateFileOptions = {\n localSourcePath?: string\n filePathsCreated?: Set<string>\n includeProps?: boolean\n useTypeScript?: boolean\n}\n\ntype ImportInfo = {\n kind: 'named' | 'default'\n symbol: string\n importPath: string\n raw: string\n}\n\nfunction uniqueValues(values: Array<string | undefined>) {\n return new Set(values)\n}\n\nexport function getBatchMigrationGroups(\n docs: CodeConnectJSON[],\n {\n batchAll = false,\n disabled = false,\n threshold = AUTO_BATCH_THRESHOLD,\n }: {\n batchAll?: boolean\n disabled?: boolean\n threshold?: number\n } = {},\n) {\n if (disabled) {\n return new Map<string, CodeConnectJSON[]>()\n }\n\n const docsBySourcePath = new Map<string, CodeConnectJSON[]>()\n for (const doc of docs) {\n if (!doc._codeConnectFilePath) {\n continue\n }\n\n const sourcePath = path.resolve(doc._codeConnectFilePath)\n docsBySourcePath.set(sourcePath, [...(docsBySourcePath.get(sourcePath) || []), doc])\n }\n\n const batchGroups = new Map<string, CodeConnectJSON[]>()\n for (const [sourcePath, sourceDocs] of docsBySourcePath) {\n if (batchAll || sourceDocs.length >= threshold) {\n batchGroups.set(sourcePath, sourceDocs)\n }\n }\n\n return batchGroups\n}\n\nfunction allEqual(values: string[]) {\n return values.every((value) => value === values[0])\n}\n\nfunction isIdentifier(value: string | undefined): value is string {\n return !!value && /^[A-Za-z_$][\\w$]*$/.test(value)\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction applyReplacements(\n body: string,\n replacements: Array<{ start: number; end: number; value: string }>,\n) {\n return replacements\n .sort((a, b) => b.start - a.start)\n .reduce((result, replacement) => {\n return result.slice(0, replacement.start) + replacement.value + result.slice(replacement.end)\n }, body)\n}\n\nfunction deriveMetadata(\n docs: CodeConnectJSON[],\n):\n { ok: true; comments: string[]; entries: BatchComponentEntry[] } | { ok: false; reason: string } {\n const sources = docs.map((doc) => doc.source || undefined)\n const components = docs.map((doc) => doc.component || undefined)\n const entries: BatchComponentEntry[] = docs.map((doc) => ({ url: doc.figmaNode }))\n const comments: string[] = []\n\n const metadataFields = [\n { name: 'source' as const, values: sources },\n { name: 'component' as const, values: components },\n ]\n\n for (const field of metadataFields) {\n const hasAny = field.values.some(Boolean)\n const hasAll = field.values.every(Boolean)\n const unique = uniqueValues(field.values)\n\n if (hasAny && !hasAll) {\n return {\n ok: false,\n reason: `Cannot batch: some docs have ${field.name} metadata and others do not`,\n }\n }\n\n if (!hasAny) {\n continue\n }\n\n if (unique.size === 1) {\n comments.push(`// ${field.name}=${field.values[0]}`)\n } else {\n docs.forEach((doc, index) => {\n const value = doc[field.name]\n if (value) {\n entries[index][field.name] = value\n }\n })\n }\n }\n\n return { ok: true, comments, entries }\n}\n\nfunction parseImport(importString: string): ImportInfo | null {\n const named = importString.match(\n /^import\\s+\\{\\s*([A-Za-z_$][\\w$]*)\\s*\\}\\s+from\\s+[\"']([^\"']+)[\"']\\s*;?$/,\n )\n if (named) {\n return { kind: 'named', symbol: named[1], importPath: named[2], raw: importString }\n }\n\n const defaultImport = importString.match(\n /^import\\s+([A-Za-z_$][\\w$]*)\\s+from\\s+[\"']([^\"']+)[\"']\\s*;?$/,\n )\n if (defaultImport) {\n return {\n kind: 'default',\n symbol: defaultImport[1],\n importPath: defaultImport[2],\n raw: importString,\n }\n }\n\n return null\n}\n\nfunction tryIdSwap(candidates: Candidate[]): Candidate[] {\n const matches = candidates.map((candidate) => candidate.body.match(/\\bid:\\s*(['\"])([^'\"\\\\]+)\\1/))\n if (matches.some((match) => !match)) {\n return candidates\n }\n\n const ids = matches.map((match) => match![2])\n if (uniqueValues(ids).size <= 1) {\n return candidates\n }\n\n return candidates.map((candidate, index) => ({\n ...candidate,\n body: candidate.body.replace(matches[index]![0], 'id: figma.batch.id'),\n params: { ...candidate.params, id: ids[index] },\n }))\n}\n\nfunction tryImportSwap(candidates: Candidate[]): Candidate[] {\n const importLists = candidates.map((candidate) => candidate.doc.templateData?.imports || [])\n if (importLists.some((imports) => imports.length !== 1)) {\n return candidates\n }\n\n const importStrings = importLists.map((imports) => imports[0])\n if (uniqueValues(importStrings).size <= 1) {\n return candidates\n }\n\n const parsed = importStrings.map(parseImport)\n if (parsed.some((info) => !info)) {\n return candidates\n }\n\n const imports = parsed as ImportInfo[]\n if (!allEqual(imports.map((info) => info.kind))) {\n return candidates\n }\n\n const symbolVaries = uniqueValues(imports.map((info) => info.symbol)).size > 1\n const pathVaries = uniqueValues(imports.map((info) => info.importPath)).size > 1\n if (!symbolVaries && !pathVaries) {\n return candidates\n }\n\n return candidates.map((candidate, index) => {\n const info = imports[index]\n const symbol = symbolVaries ? '${figma.batch.componentName}' : info.symbol\n const importPath = pathVaries ? '${figma.batch.importPath}' : info.importPath\n const replacement =\n info.kind === 'named'\n ? `\\`import { ${symbol} } from \"${importPath}\"\\``\n : `\\`import ${symbol} from \"${importPath}\"\\``\n const encodedImport = JSON.stringify(info.raw)\n\n if (!candidate.body.includes(encodedImport)) {\n return candidate\n }\n\n return {\n ...candidate,\n body: candidate.body.replace(encodedImport, replacement),\n params: {\n ...candidate.params,\n ...(symbolVaries ? { componentName: info.symbol } : {}),\n ...(pathVaries ? { importPath: info.importPath } : {}),\n },\n }\n })\n}\n\nfunction templateLiteralTextRanges(content: string, contentStart: number) {\n const ranges: Array<{ start: number; end: number; text: string }> = []\n let textStart = 0\n let i = 0\n\n while (i < content.length) {\n if (content[i] === '$' && content[i + 1] === '{') {\n if (textStart < i) {\n ranges.push({\n start: contentStart + textStart,\n end: contentStart + i,\n text: content.slice(textStart, i),\n })\n }\n\n i += 2\n let depth = 1\n while (i < content.length && depth > 0) {\n if (content[i] === '{') depth++\n if (content[i] === '}') depth--\n i++\n }\n textStart = i\n continue\n }\n\n i++\n }\n\n if (textStart < content.length) {\n ranges.push({\n start: contentStart + textStart,\n end: contentStart + content.length,\n text: content.slice(textStart),\n })\n }\n\n return ranges\n}\n\nfunction figmaCodeTextRanges(body: string) {\n const ranges: Array<{ start: number; end: number; text: string }> = []\n const regex = /figma\\.code`([\\s\\S]*?)`/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(body))) {\n const contentStart = match.index + 'figma.code`'.length\n ranges.push(...templateLiteralTextRanges(match[1], contentStart))\n }\n\n return ranges\n}\n\nfunction replaceIdentifierInFigmaCode(body: string, identifier: string, replacement: string) {\n const ranges = figmaCodeTextRanges(body)\n const identifierRegex = new RegExp(\n `(^|[^A-Za-z0-9_$])${escapeRegExp(identifier)}(?=$|[^A-Za-z0-9_$])`,\n 'g',\n )\n const replacements: Array<{ start: number; end: number; value: string }> = []\n\n for (const range of ranges) {\n let match: RegExpExecArray | null\n while ((match = identifierRegex.exec(range.text))) {\n const prefixLength = match[1].length\n const start = range.start + match.index + prefixLength\n replacements.push({\n start,\n end: start + identifier.length,\n value: replacement,\n })\n }\n }\n\n return applyReplacements(body, replacements)\n}\n\nfunction tryComponentSymbolSwap(candidates: Candidate[]): Candidate[] {\n let withNames = candidates\n\n if (withNames.some((candidate) => !candidate.params.componentName)) {\n const ids = withNames.map((candidate) => candidate.params.id)\n if (ids.every(isIdentifier) && uniqueValues(ids).size > 1) {\n withNames = withNames.map((candidate) => ({\n ...candidate,\n params: { ...candidate.params, componentName: candidate.params.id },\n }))\n }\n }\n\n if (withNames.some((candidate) => !candidate.params.componentName)) {\n return candidates\n }\n\n const names = withNames.map((candidate) => candidate.params.componentName as string)\n if (uniqueValues(names).size <= 1) {\n return candidates\n }\n\n return withNames.map((candidate, index) => ({\n ...candidate,\n body: replaceIdentifierInFigmaCode(\n candidate.body,\n names[index],\n '${figma.batch.componentName}',\n ),\n }))\n}\n\ntype ScalarMatch = {\n key: string\n operator: string\n value: string\n valueStart: number\n valueEnd: number\n}\n\nfunction collectNamedScalars(body: string, kind: 'string' | 'numberBoolean') {\n const ranges = figmaCodeTextRanges(body)\n const regex =\n kind === 'string'\n ? /([A-Za-z_$][\\w$]*)\\s*(=|:)\\s*(['\"])([^'\"\\\\\\n]+)\\3/g\n : /([A-Za-z_$][\\w$]*)\\s*(=|:)\\s*(?:\\{\\s*)?(true|false|-?\\d+(?:\\.\\d+)?)(?:\\s*\\})?(?=$|[^A-Za-z0-9_$.])/g\n const matches: ScalarMatch[] = []\n\n for (const range of ranges) {\n let match: RegExpExecArray | null\n while ((match = regex.exec(range.text))) {\n const value = kind === 'string' ? match[4] : match[3]\n const valueOffset = match[0].lastIndexOf(value)\n matches.push({\n key: match[1],\n operator: match[2],\n value,\n valueStart: range.start + match.index + valueOffset,\n valueEnd: range.start + match.index + valueOffset + value.length,\n })\n }\n }\n\n return matches\n}\n\nfunction parseScalarValue(value: string, kind: 'string' | 'numberBoolean') {\n if (kind === 'string') {\n return value\n }\n\n if (value === 'true') {\n return true\n }\n if (value === 'false') {\n return false\n }\n\n return Number(value)\n}\n\nfunction tryNamedScalarSwap(\n candidates: Candidate[],\n kind: 'string' | 'numberBoolean',\n): Candidate[] {\n const matchesByCandidate = candidates.map((candidate) =>\n collectNamedScalars(candidate.body, kind),\n )\n const matchCount = matchesByCandidate[0]?.length || 0\n if (matchCount === 0 || matchesByCandidate.some((matches) => matches.length !== matchCount)) {\n return candidates\n }\n\n const replacementsByCandidate = candidates.map(\n () => [] as Array<{ start: number; end: number; value: string }>,\n )\n const fieldNames = new Set<string>()\n const nextCandidates = candidates.map((candidate) => ({\n ...candidate,\n params: { ...candidate.params },\n }))\n\n for (let matchIndex = 0; matchIndex < matchCount; matchIndex++) {\n const matches = matchesByCandidate.map((matches) => matches[matchIndex])\n const first = matches[0]\n if (\n matches.some((match) => match.key !== first.key || match.operator !== first.operator) ||\n uniqueValues(matches.map((match) => match.value)).size <= 1\n ) {\n continue\n }\n\n if (fieldNames.has(first.key) || first.key in nextCandidates[0].params) {\n return candidates\n }\n\n fieldNames.add(first.key)\n matches.forEach((match, candidateIndex) => {\n replacementsByCandidate[candidateIndex].push({\n start: match.valueStart,\n end: match.valueEnd,\n value: `\\${figma.batch.${first.key}}`,\n })\n nextCandidates[candidateIndex].params[first.key] = parseScalarValue(match.value, kind)\n })\n }\n\n if (fieldNames.size === 0) {\n return candidates\n }\n\n return nextCandidates.map((candidate, index) => ({\n ...candidate,\n body: applyReplacements(candidate.body, replacementsByCandidate[index]),\n }))\n}\n\nexport function buildBatchMigration(\n docs: CodeConnectJSON[],\n {\n includeProps = false,\n useTypeScript = true,\n templateFile = './template.figma.batch.ts',\n }: { includeProps?: boolean; useTypeScript?: boolean; templateFile?: string } = {},\n): BatchMigrationBuildResult {\n if (docs.length < 2) {\n return { ok: false, reason: 'Cannot batch: at least two docs are required' }\n }\n\n if (docs.some((doc) => doc.variant && Object.keys(doc.variant).length > 0)) {\n return { ok: false, reason: 'Cannot batch: variant Code Connect docs are not supported yet' }\n }\n\n if (docs.some((doc) => !doc.template)) {\n return { ok: false, reason: 'Cannot batch: every doc must have a generated template' }\n }\n\n const metadata = deriveMetadata(docs)\n if (!metadata.ok) {\n return metadata\n }\n\n let candidates: Candidate[] = docs.map((doc, index) => ({\n doc,\n body: prepareMigratedTemplateBody(doc, includeProps, useTypeScript),\n params: metadata.entries[index],\n }))\n\n candidates = tryIdSwap(candidates)\n candidates = tryImportSwap(candidates)\n candidates = tryComponentSymbolSwap(candidates)\n candidates = tryNamedScalarSwap(candidates, 'string')\n candidates = tryNamedScalarSwap(candidates, 'numberBoolean')\n\n if (!allEqual(candidates.map((candidate) => candidate.body))) {\n return {\n ok: false,\n reason: 'Cannot batch: templates did not reduce to one compatible shape',\n }\n }\n\n const templateBody = formatTemplate(candidates[0].body)\n const comments = metadata.comments.length > 0 ? `${metadata.comments.join('\\n')}\\n\\n` : ''\n\n return {\n ok: true,\n template: `${comments}${templateBody}`,\n batchJson: {\n templateFile,\n components: candidates.map((candidate) => candidate.params),\n },\n }\n}\n\nfunction getSourceBasename(localSourcePath: string | undefined, docs: CodeConnectJSON[]) {\n if (!localSourcePath) {\n return getFilenameFromComponentName(docs[0]?.component || 'batch')\n }\n\n const sourceBasename = path.basename(localSourcePath)\n const codeConnectPattern = /\\.(figma|figmadoc)(\\.[^.]+)+$/\n return codeConnectPattern.test(sourceBasename)\n ? sourceBasename.replace(codeConnectPattern, '')\n : path.basename(localSourcePath, path.extname(localSourcePath))\n}\n\nfunction determineBatchOutputPaths(\n basename: string,\n outputDir: string | undefined,\n baseDir: string,\n localSourcePath: string | undefined,\n useTypeScript: boolean,\n filePathsCreated: Set<string> | undefined,\n): { skipped: true; reason: string } | { skipped: false; templatePath: string; batchPath: string } {\n const dir = outputDir || (localSourcePath ? path.dirname(localSourcePath) : baseDir)\n const templateSuffix = useTypeScript ? '.figma.batch.ts' : '.figma.batch.js'\n const getPaths = (name: string) => ({\n templatePath: path.join(dir, `${name}${templateSuffix}`),\n batchPath: path.join(dir, `${name}.figma.batch.json`),\n })\n const basePaths = getPaths(basename)\n\n if (\n (fs.existsSync(basePaths.templatePath) && !filePathsCreated?.has(basePaths.templatePath)) ||\n (fs.existsSync(basePaths.batchPath) && !filePathsCreated?.has(basePaths.batchPath))\n ) {\n return { skipped: true, reason: 'batch output file already exists' }\n }\n\n let paths = basePaths\n let counter = 1\n while (\n fs.existsSync(paths.templatePath) ||\n fs.existsSync(paths.batchPath) ||\n filePathsCreated?.has(paths.templatePath) ||\n filePathsCreated?.has(paths.batchPath)\n ) {\n paths = getPaths(`${basename}_${counter}`)\n counter++\n }\n\n return { skipped: false, ...paths }\n}\n\nexport function writeBatchTemplateFiles(\n docs: CodeConnectJSON[],\n outputDir: string | undefined,\n baseDir: string,\n {\n localSourcePath,\n filePathsCreated,\n includeProps = false,\n useTypeScript = true,\n }: WriteBatchTemplateFileOptions = {},\n): WriteBatchTemplateFileResult {\n const basename = getSourceBasename(localSourcePath, docs)\n const paths = determineBatchOutputPaths(\n basename,\n outputDir,\n baseDir,\n localSourcePath,\n useTypeScript,\n filePathsCreated,\n )\n\n if (paths.skipped) {\n return { skipped: true, reason: paths.reason, componentCount: docs.length }\n }\n\n const built = buildBatchMigration(docs, {\n includeProps,\n useTypeScript,\n templateFile: `./${path.basename(paths.templatePath)}`,\n })\n\n if (!built.ok) {\n return { skipped: true, reason: built.reason, componentCount: docs.length }\n }\n\n fs.mkdirSync(path.dirname(paths.templatePath), { recursive: true })\n fs.writeFileSync(paths.templatePath, built.template, 'utf-8')\n fs.writeFileSync(paths.batchPath, `${JSON.stringify(built.batchJson, null, 2)}\\n`, 'utf-8')\n filePathsCreated?.add(paths.templatePath)\n filePathsCreated?.add(paths.batchPath)\n\n return {\n skipped: false,\n templatePath: paths.templatePath,\n batchPath: paths.batchPath,\n componentCount: docs.length,\n }\n}\n"]}
@@ -1,6 +1,12 @@
1
1
  import { CodeConnectJSON } from '../connect/figma_connect';
2
2
  /** Formats template code with consistent prettier configuration */
3
3
  export declare function formatTemplate(code: string): string;
4
+ /**
5
+ * Removes unused top-level const declarations generated from parser prop mappings.
6
+ * If the template cannot be safely analyzed, leave it unchanged so cleanup never
7
+ * prevents an otherwise valid migration.
8
+ */
9
+ export declare function removeUnusedGeneratedPropDeclarations(template: string, props: CodeConnectJSON['templateData']['props']): string;
4
10
  export declare function getFilenameFromComponentName(componentName: string): string;
5
11
  /** Migrates a doc's template (Swift helpers, server helpers, V2, id, imports, nestable) without formatting. */
6
12
  export declare function prepareMigratedTemplateBody(doc: CodeConnectJSON, includeProps?: boolean, useTypeScript?: boolean): string;
@@ -1 +1 @@
1
- {"version":3,"file":"migration_helpers.d.ts","sourceRoot":"","sources":["../../src/connect/migration_helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAU1D,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AA0BD,wBAAgB,4BAA4B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAsGD,+GAA+G;AAC/G,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,eAAe,EACpB,YAAY,UAAQ,EACpB,aAAa,CAAC,EAAE,OAAO,GACtB,MAAM,CAeR;AAED,6HAA6H;AAC7H,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,eAAe,EACpB,YAAY,UAAQ,EACpB,aAAa,CAAC,EAAE,OAAO,GACtB,MAAM,CAGR;AAqCD,MAAM,MAAM,wBAAwB,GAAG;IACrC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,EACf,EACE,eAAe,EACf,gBAAgB,EAChB,YAAoB,EACpB,aAAoB,GACrB,GAAE,wBAA6B,GAC/B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAyB1C;AAGD,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,UAqBrE;AAED,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAsBlF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAGjF;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,MAAM,KAAG,MAgHxD,CAAA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBzE;AAED,KAAK,6BAA6B,GAAG;IACnC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAA;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAA;CAC5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iCAAiC,GAAI,oBAAoB,eAAe,EAAE,kDAkBtF,CAAA;AAED,mIAAmI;AACnI,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,6BAA6B,EACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,EACf,EACE,eAAe,EACf,gBAAgB,EAChB,aAAoB,EACpB,YAAoB,GACrB,GAAE,wBAA6B,GAC/B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAiG1C"}
1
+ {"version":3,"file":"migration_helpers.d.ts","sourceRoot":"","sources":["../../src/connect/migration_helpers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAU1D,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAiBD;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,GAC9C,MAAM,CAuDR;AA0BD,wBAAgB,4BAA4B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAsGD,+GAA+G;AAC/G,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,eAAe,EACpB,YAAY,UAAQ,EACpB,aAAa,CAAC,EAAE,OAAO,GACtB,MAAM,CAgBR;AAED,6HAA6H;AAC7H,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,eAAe,EACpB,YAAY,UAAQ,EACpB,aAAa,CAAC,EAAE,OAAO,GACtB,MAAM,CAGR;AAqCD,MAAM,MAAM,wBAAwB,GAAG;IACrC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,EACf,EACE,eAAe,EACf,gBAAgB,EAChB,YAAoB,EACpB,aAAoB,GACrB,GAAE,wBAA6B,GAC/B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAyB1C;AAGD,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,UAqBrE;AAED,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAsBlF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAGjF;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,MAAM,KAAG,MAgHxD,CAAA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBzE;AAED,KAAK,6BAA6B,GAAG;IACnC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAA;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAA;CAC5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iCAAiC,GAAI,oBAAoB,eAAe,EAAE,kDAkBtF,CAAA;AAED,mIAAmI;AACnI,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,6BAA6B,EACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,EACf,EACE,eAAe,EACf,gBAAgB,EAChB,aAAoB,EACpB,YAAoB,GACrB,GAAE,wBAA6B,GAC/B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAiG1C"}
@@ -38,6 +38,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.groupCodeConnectObjectsByFigmaUrl = exports.migrateV1TemplateToV2 = void 0;
40
40
  exports.formatTemplate = formatTemplate;
41
+ exports.removeUnusedGeneratedPropDeclarations = removeUnusedGeneratedPropDeclarations;
41
42
  exports.getFilenameFromComponentName = getFilenameFromComponentName;
42
43
  exports.prepareMigratedTemplateBody = prepareMigratedTemplateBody;
43
44
  exports.prepareMigratedTemplate = prepareMigratedTemplate;
@@ -52,6 +53,7 @@ exports.writeVariantTemplateFile = writeVariantTemplateFile;
52
53
  const fs_1 = __importDefault(require("fs"));
53
54
  const path_1 = __importDefault(require("path"));
54
55
  const prettier = __importStar(require("prettier"));
56
+ const ts_morph_1 = require("ts-morph");
55
57
  /** Prettier configuration used for all generated template files */
56
58
  const PRETTIER_OPTIONS = {
57
59
  parser: 'typescript',
@@ -63,6 +65,69 @@ const PRETTIER_OPTIONS = {
63
65
  function formatTemplate(code) {
64
66
  return prettier.format(code, PRETTIER_OPTIONS);
65
67
  }
68
+ let unusedPropCleanupProject;
69
+ let unusedPropCleanupFileId = 0;
70
+ function getUnusedPropCleanupProject() {
71
+ unusedPropCleanupProject ??= new ts_morph_1.Project({
72
+ useInMemoryFileSystem: true,
73
+ skipAddingFilesFromTsConfig: true,
74
+ compilerOptions: {
75
+ module: ts_morph_1.ModuleKind.ESNext,
76
+ target: ts_morph_1.ScriptTarget.ESNext,
77
+ },
78
+ });
79
+ return unusedPropCleanupProject;
80
+ }
81
+ /**
82
+ * Removes unused top-level const declarations generated from parser prop mappings.
83
+ * If the template cannot be safely analyzed, leave it unchanged so cleanup never
84
+ * prevents an otherwise valid migration.
85
+ */
86
+ function removeUnusedGeneratedPropDeclarations(template, props) {
87
+ const generatedPropNames = new Set(Object.keys(props || {}));
88
+ if (generatedPropNames.size === 0) {
89
+ return template;
90
+ }
91
+ let project;
92
+ let sourceFile;
93
+ try {
94
+ project = getUnusedPropCleanupProject();
95
+ sourceFile = project.createSourceFile(`migration-template-${unusedPropCleanupFileId++}.ts`, template);
96
+ if (project.getProgram().getSyntacticDiagnostics(sourceFile).length > 0) {
97
+ return template;
98
+ }
99
+ // Repeat so a generated declaration referenced only by another unused
100
+ // generated declaration can also be removed.
101
+ while (true) {
102
+ const unusedStatement = sourceFile.getVariableStatements().find((statement) => {
103
+ if (statement.getDeclarationKind() !== ts_morph_1.VariableDeclarationKind.Const) {
104
+ return false;
105
+ }
106
+ const declarations = statement.getDeclarations();
107
+ if (declarations.length !== 1) {
108
+ return false;
109
+ }
110
+ const name = declarations[0].getNameNode();
111
+ return (ts_morph_1.Node.isIdentifier(name) &&
112
+ generatedPropNames.has(name.getText()) &&
113
+ name.findReferencesAsNodes().length === 0);
114
+ });
115
+ if (!unusedStatement) {
116
+ break;
117
+ }
118
+ unusedStatement.remove();
119
+ }
120
+ return sourceFile.getFullText();
121
+ }
122
+ catch {
123
+ return template;
124
+ }
125
+ finally {
126
+ if (project && sourceFile) {
127
+ project.removeSourceFile(sourceFile);
128
+ }
129
+ }
130
+ }
66
131
  /**
67
132
  * Common wrapper that handles path determination and file writing for both
68
133
  * simple templates and variant templates.
@@ -175,6 +240,7 @@ function prepareMigratedTemplateBody(doc, includeProps = false, useTypeScript) {
175
240
  if (useTypeScript) {
176
241
  template = convertSyntaxToTypeScript(template);
177
242
  }
243
+ template = removeUnusedGeneratedPropDeclarations(template, doc.templateData?.props);
178
244
  return template;
179
245
  }
180
246
  /** Migrates a doc's template (Swift helpers, server helpers, V2, id, imports, nestable) and returns the formatted string. */
@@ -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 */\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
+ {"version":3,"file":"migration_helpers.js","sourceRoot":"","sources":["../../src/connect/migration_helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,wCAEC;AAsBD,sFA0DC;AA0BD,oEAQC;AAuGD,kEAoBC;AAGD,0DAOC;AA4CD,8CAmCC;AAGD,sFAqBC;AAED,sBAMC;AAED,gCAsBC;AAED,sDAGC;AAmID,sDAIC;AAKD,4EAgBC;AAgCD,4DA4GC;AA5rBD,4CAAmB;AACnB,gDAAuB;AACvB,mDAAoC;AACpC,uCAA2F;AAG3F,mEAAmE;AACnE,MAAM,gBAAgB,GAAG;IACvB,MAAM,EAAE,YAAqB;IAC7B,IAAI,EAAE,KAAK;IACX,aAAa,EAAE,KAAc;IAC7B,gBAAgB,EAAE,KAAc;CACjC,CAAA;AAED,mEAAmE;AACnE,SAAgB,cAAc,CAAC,IAAY;IACzC,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;AAChD,CAAC;AAED,IAAI,wBAA6C,CAAA;AACjD,IAAI,uBAAuB,GAAG,CAAC,CAAA;AAE/B,SAAS,2BAA2B;IAClC,wBAAwB,KAAK,IAAI,kBAAO,CAAC;QACvC,qBAAqB,EAAE,IAAI;QAC3B,2BAA2B,EAAE,IAAI;QACjC,eAAe,EAAE;YACf,MAAM,EAAE,qBAAU,CAAC,MAAM;YACzB,MAAM,EAAE,uBAAY,CAAC,MAAM;SAC5B;KACF,CAAC,CAAA;IACF,OAAO,wBAAwB,CAAA;AACjC,CAAC;AAED;;;;GAIG;AACH,SAAgB,qCAAqC,CACnD,QAAgB,EAChB,KAA+C;IAE/C,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAA;IAC5D,IAAI,kBAAkB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,OAA4B,CAAA;IAChC,IAAI,UAAU,CAAA;IAEd,IAAI,CAAC;QACH,OAAO,GAAG,2BAA2B,EAAE,CAAA;QACvC,UAAU,GAAG,OAAO,CAAC,gBAAgB,CACnC,sBAAsB,uBAAuB,EAAE,KAAK,EACpD,QAAQ,CACT,CAAA;QAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,sEAAsE;QACtE,6CAA6C;QAC7C,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,eAAe,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;gBAC5E,IAAI,SAAS,CAAC,kBAAkB,EAAE,KAAK,kCAAuB,CAAC,KAAK,EAAE,CAAC;oBACrE,OAAO,KAAK,CAAA;gBACd,CAAC;gBAED,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,EAAE,CAAA;gBAChD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9B,OAAO,KAAK,CAAA;gBACd,CAAC;gBAED,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;gBAC1C,OAAO,CACL,eAAI,CAAC,YAAY,CAAC,IAAI,CAAC;oBACvB,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACtC,IAAI,CAAC,qBAAqB,EAAE,CAAC,MAAM,KAAK,CAAC,CAC1C,CAAA;YACH,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,MAAK;YACP,CAAC;YACD,eAAe,CAAC,MAAM,EAAE,CAAA;QAC1B,CAAC;QAED,OAAO,UAAU,CAAC,WAAW,EAAE,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAA;IACjB,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;YAC1B,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAC9B,aAAqB,EACrB,WAAmB,EACnB,SAA6B,EAC7B,OAAe,EACf,eAAmC,EACnC,gBAAyC,EACzC,aAAa,GAAG,IAAI;IAEpB,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAA;IACxD,MAAM,cAAc,GAAG,mBAAmB,CACxC,aAAa,EACb,MAAM,EACN,SAAS,EACT,OAAO,EACP,eAAe,CAChB,CAAA;IACD,OAAO,8BAA8B,CAAC,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAA;AAC9F,CAAC;AAED,SAAgB,4BAA4B,CAAC,aAAqB;IAChE,MAAM,WAAW,GAAG,iBAAiB,CAAA;IACrC,OAAO,aAAa;SACjB,KAAK,CAAC,EAAE,CAAC;SACT,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC9C,IAAI,CAAC,EAAE,CAAC;SACR,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,gBAAwB,EACxB,MAAc,EACd,SAA6B,EAC7B,OAAe,EACf,eAAmC;IAEnC,sFAAsF;IACtF,MAAM,iBAAiB,GAAG,4BAA4B,CAAC,gBAAgB,CAAC,CAAA;IACxE,IAAI,QAAQ,GAAG,iBAAiB,CAAA;IAChC,IAAI,eAAe,EAAE,CAAC;QACpB,IAAI,cAAc,GAAG,cAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;QAEnD,kEAAkE;QAClE,yFAAyF;QACzF,qCAAqC;QACrC,MAAM,kBAAkB,GAAG,+BAA+B,CAAA;QAC1D,IAAI,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5C,yDAAyD;YACzD,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;QACjE,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,cAAc,GAAG,cAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,cAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAA;QAChF,CAAC;QAED,QAAQ,GAAG,cAAc,CAAA;IAC3B,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,wEAAwE;QACxE,OAAO,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,GAAG,MAAM,EAAE,CAAC,CAAA;IACrD,CAAC;SAAM,IAAI,eAAe,EAAE,CAAC;QAC3B,0CAA0C;QAC1C,OAAO,cAAI,CAAC,IAAI,CAAC,cAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,GAAG,QAAQ,GAAG,MAAM,EAAE,CAAC,CAAA;IACzE,CAAC;SAAM,CAAC;QACN,wCAAwC;QACxC,MAAM,QAAQ,GAAG,GAAG,iBAAiB,GAAG,MAAM,EAAE,CAAA;QAChD,OAAO,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACrC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,8BAA8B,CACrC,cAAsB,EACtB,WAAmB,EACnB,MAAc,EACd,gBAAyC;IAEzC,oFAAoF;IACpF,MAAM,YAAY,GAAG,YAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;IAClD,MAAM,gBAAgB,GAAG,gBAAgB,IAAI,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAEjF,IAAI,YAAY,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtC,sDAAsD;QACtD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACtD,CAAC;IAED,8FAA8F;IAC9F,IAAI,UAAU,GAAG,cAAc,CAAA;IAC/B,IAAI,gBAAgB,IAAI,YAAY,EAAE,CAAC;QACrC,iEAAiE;QACjE,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;QACxC,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;QAE9C,4FAA4F;QAC5F,MAAM,qBAAqB,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YACrD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YACnC,CAAC,CAAC,QAAQ,CAAA;QAEZ,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,GAAG,CAAC;YACF,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC,CAAA;YAC3E,OAAO,EAAE,CAAA;QACX,CAAC,QAAQ,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAC;IAC/F,CAAC;IAED,iCAAiC;IACjC,MAAM,aAAa,GAAG,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC9C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,YAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,iBAAiB;IACjB,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;IAElD,8BAA8B;IAC9B,IAAI,gBAAgB,EAAE,CAAC;QACrB,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IAClC,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AACvC,CAAC;AAED,+GAA+G;AAC/G,SAAgB,2BAA2B,CACzC,GAAoB,EACpB,YAAY,GAAG,KAAK,EACpB,aAAuB;IAEvB,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;IAC3B,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACvC,QAAQ,GAAG,qCAAqC,CAAC,QAAQ,CAAC,CAAA;IAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,QAAQ,GAAG,gCAAgC,CAAC,QAAQ,CAAC,CAAA;IACvD,CAAC;IACD,QAAQ,GAAG,IAAA,6BAAqB,EAAC,QAAQ,CAAC,CAAA;IAC1C,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC,CAAA;IACnD,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAC1D,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;IACxE,IAAI,aAAa,EAAE,CAAC;QAClB,QAAQ,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAA;IAChD,CAAC;IACD,QAAQ,GAAG,qCAAqC,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;IACnF,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,6HAA6H;AAC7H,SAAgB,uBAAuB,CACrC,GAAoB,EACpB,YAAY,GAAG,KAAK,EACpB,aAAuB;IAEvB,MAAM,QAAQ,GAAG,2BAA2B,CAAC,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,CAAA;IAC9E,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAA;AACjC,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,OAAO,QAAQ,CAAC,OAAO,CACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BH,EACG,EAAE,CACH,CAAA;AACH,CAAC;AASD,SAAgB,iBAAiB,CAC/B,GAAoB,EACpB,SAA6B,EAC7B,OAAe,EACf,EACE,eAAe,EACf,gBAAgB,EAChB,YAAY,GAAG,KAAK,EACpB,aAAa,GAAG,IAAI,MACQ,EAAE;IAEhC,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,IAAI,UAAU,CAAA;IACjD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,CAAA;IAE1E,6BAA6B;IAC7B,MAAM,YAAY,GAAa,CAAC,UAAU,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;IAC1D,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,YAAY,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IAC9C,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,YAAY,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;IACpD,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAErB,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAA;IAE7D,OAAO,uBAAuB,CAC5B,aAAa,EACb,WAAW,EACX,SAAS,EACT,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,aAAa,CACd,CAAA;AACH,CAAC;AAED,kEAAkE;AAClE,SAAgB,qCAAqC,CAAC,QAAgB;IACpE,OAAO,CACL,QAAQ;QACN,gBAAgB;SACf,OAAO,CAAC,uBAAuB,EAAE,gCAAgC,CAAC;SAClE,OAAO,CAAC,2BAA2B,EAAE,oCAAoC,CAAC;SAC1E,OAAO,CAAC,kBAAkB,EAAE,gCAAgC,CAAC;SAC7D,OAAO,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;SACzD,OAAO,CAAC,kBAAkB,EAAE,gCAAgC,CAAC;SAC7D,OAAO,CAAC,cAAc,EAAE,4BAA4B,CAAC;SACrD,OAAO,CAAC,sBAAsB,EAAE,oCAAoC,CAAC;SACrE,OAAO,CAAC,uBAAuB,EAAE,qCAAqC,CAAC;SACvE,OAAO,CAAC,uBAAuB,EAAE,qCAAqC,CAAC;SACvE,OAAO,CAAC,sBAAsB,EAAE,oCAAoC,CAAC;SACrE,OAAO,CAAC,aAAa,EAAE,2BAA2B,CAAC;SACnD,OAAO,CAAC,wBAAwB,EAAE,2CAA2C,CAAC;QAC/E,gBAAgB;SACf,OAAO,CAAC,4BAA4B,EAAE,oCAAoC,CAAC;QAC5E,yBAAyB;SACxB,OAAO,CAAC,8BAA8B,EAAE,qCAAqC,CAAC,CAClF,CAAA;AACH,CAAC;AAED,SAAgB,KAAK,CAAC,QAAgB,EAAE,EAAU;IAChD,0FAA0F;IAC1F,IAAI,kCAAkC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC,mBAAmB,EAAE,yBAAyB,EAAE,IAAI,CAAC,CAAA;AAC/E,CAAC;AAED,SAAgB,UAAU,CAAC,QAAgB,EAAE,OAA6B;IACxE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,4CAA4C;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAE3C,sEAAsE;IACtE,yEAAyE;IACzE,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAC7B,wCAAwC,EACxC,eAAe,WAAW,GAAG,CAC9B,CAAA;IAED,mCAAmC;IACnC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,MAAM,CAAA;IACf,CAAC;IAED,oDAAoD;IACpD,OAAO,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,6BAA6B,WAAW,GAAG,CAAC,CAAA;AAC7F,CAAC;AAED,SAAgB,qBAAqB,CAAC,QAAgB,EAAE,QAAiB;IACvE,uEAAuE;IACvE,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,yBAAyB,QAAQ,GAAG,CAAC,CAAA;AACjF,CAAC;AAED;;;;;;;;;;GAUG;AACI,MAAM,qBAAqB,GAAG,CAAC,QAAgB,EAAU,EAAE;IAChE,IAAI,QAAQ,GAAG,QAAQ,CAAA;IAEvB,wBAAwB;IACxB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,CAAA;IAE7E,4CAA4C;IAC5C,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAA;IACzD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAA;IACxD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA;IAC1D,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAA;IAE3D,+BAA+B;IAC/B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,6BAA6B,EAAE,aAAa,CAAC,CAAA;IACzE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAA;IAC3E,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,2BAA2B,EAAE,WAAW,CAAC,CAAA;IACrE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,mCAAmC,EAAE,mBAAmB,CAAC,CAAA;IACrF,wFAAwF;IACxF,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,wCAAwC,EACxC,iDAAiD,CAClD,CAAA;IAED,kDAAkD;IAClD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,4CAA4C,EAAE,mBAAmB,CAAC,CAAA;IAE9F,0BAA0B;IAC1B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,2BAA2B,EAAE,oBAAoB,CAAC,CAAA;IAE9E,iEAAiE;IACjE,oIAAoI;IACpI,EAAE;IACF,wEAAwE;IACxE,qEAAqE;IACrE,8EAA8E;IAC9E,8EAA8E;IAC9E,4EAA4E;IAC5E,6EAA6E;IAC7E,+EAA+E;IAC/E,mEAAmE;IACnE,EAAE;IACF,kFAAkF;IAClF,kEAAkE;IAClE,gFAAgF;IAChF,mEAAmE;IACnE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,+FAA+F,EAC/F,uCAAuC,CACxC,CAAA;IACD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,+FAA+F,EAC/F,uCAAuC,CACxC,CAAA;IACD,oGAAoG;IACpG,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,yFAAyF,EACzF,qBAAqB,CACtB,CAAA;IACD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,yFAAyF,EACzF,qBAAqB,CACtB,CAAA;IACD,6GAA6G;IAC7G,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,qFAAqF,EACrF,iBAAiB,CAClB,CAAA;IACD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,qFAAqF,EACrF,iBAAiB,CAClB,CAAA;IAED,4CAA4C;IAC5C,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,sCAAsC,EACtC,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE;QAC3C,MAAM,IAAI,GAAG,YAAY,IAAI,YAAY,CAAA;QACzC,OAAO,kBAAkB,IAAI,IAAI,CAAA;IACnC,CAAC,CACF,CAAA;IAED,wGAAwG;IACxG,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,mBAAmB,EAAE,4BAA4B,CAAC,CAAA;IAE9E,kEAAkE;IAClE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,mCAAmC,CAAC,CAAA;IAEvF,kCAAkC;IAClC,oFAAoF;IACpF,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,sDAAsD,EACtD,qCAAqC,CACtC,CAAA;IACD,+FAA+F;IAC/F,yFAAyF;IACzF,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,6DAA6D,EAC7D,OAAO,CACR,CAAA;IAED,2CAA2C;IAC3C,sFAAsF;IACtF,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,kDAAkD,EAClD,sBAAsB,CACvB,CAAA;IAED,8EAA8E;IAC9E,oEAAoE;IACpE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,4BAA4B,EAAE,eAAe,CAAC,CAAA;IAE1E,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAhHY,QAAA,qBAAqB,yBAgHjC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,QAAgB;IACpD,oGAAoG;IACpG,wDAAwD;IACxD,OAAO,QAAQ,CAAC,OAAO,CAAC,4DAA4D,EAAE,IAAI,CAAC,CAAA;AAC7F,CAAC;AAED;;GAEG;AACH,SAAgB,gCAAgC,CAAC,QAAgB;IAC/D,sDAAsD;IACtD,IAAI,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACnE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QACpC,MAAM,aAAa,GAAG,aAAa;aAChC,OAAO,CAAC,gCAAgC,EAAE,cAAc,CAAC,CAAC,wBAAwB;aAClF,OAAO,CAAC,+BAA+B,EAAE,aAAa,CAAC,CAAC,2BAA2B;aACnF,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,6BAA6B;aAChE,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA,CAAC,kCAAkC;QAEtE,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,aAAa,CAAA;IAC7E,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAOD;;;GAGG;AACI,MAAM,iCAAiC,GAAG,CAAC,kBAAqC,EAAE,EAAE;IACzF,OAAO,kBAAkB,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACX,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAA;QAC9B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnB,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;QAC9C,CAAC;QAED,IAAI,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,GAAG,GAAG,CAAA;QAC1B,CAAC;QAED,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAmD,CACpD,CAAA;AACH,CAAC,CAAA;AAlBY,QAAA,iCAAiC,qCAkB7C;AAED,mIAAmI;AACnI,SAAgB,wBAAwB,CACtC,KAAoC,EACpC,QAAgB,EAChB,SAA6B,EAC7B,OAAe,EACf,EACE,eAAe,EACf,gBAAgB,EAChB,aAAa,GAAG,IAAI,EACpB,YAAY,GAAG,KAAK,MACQ,EAAE;IAEhC,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAC/E,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IACzE,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,UAAU,CAAA;IAEhF,mEAAmE;IACnE,MAAM,OAAO,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACrE,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAChD,uBAAuB,CAAC,GAAG,EAAE,YAAY,EAAE,aAAa,CAAC,CAC1D,CAAA;IACD,MAAM,mBAAmB,GAAG,iBAAiB,CAAA;IAE7C,yFAAyF;IACzF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3C,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,sDAAsD,QAAQ,EAAE,CAAC,CAAA;QACnF,CAAC;QAED,6CAA6C;QAC7C,IAAI,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAA;QAE9D,uEAAuE;QACvE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAChC,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC;YAChD,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAC/C,CAAA;QAED,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,iFAAiF;IACjF,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QAE9B,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,qDAAqD;YACrD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;iBACtC,GAAG,CACF,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CACb,4CAA4C,GAAG,UAAU,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CACxG;iBACA,IAAI,CAAC,MAAM,CAAC,CAAA;YAEf,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,SAAS,QAAQ,UAAU,EAAE,CAAC,CAAA;QACtF,CAAC;IACH,CAAC;IAED,2FAA2F;IAC3F,MAAM,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEvD,OAAO,CAAC,IAAI,CAAC,aAAa,iBAAiB,KAAK,CAAC,CAAA;IAEjD,MAAM,cAAc,GAClB,KAAK,CAAC,IAAI,IAAI,IAAI;QAChB,CAAC,CAAC,oCAAoC;QACtC,CAAC,CAAC,gDAAgD,CAAA;IAEtD,MAAM,YAAY,GAAG;QACnB,aAAa,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,gCAAgC;QAC9E,EAAE;QACF,cAAc;QACd,EAAE;QACF,cAAc;QACd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAClB,EAAE;QACF,yBAAyB;KAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEZ,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;IAE9C,uDAAuD;IACvD,iFAAiF;IACjF,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IACzD,MAAM,YAAY,GAAa,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAA;IACrD,IAAI,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC9B,YAAY,CAAC,IAAI,CAAC,aAAa,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAA;IAC5D,CAAC;IACD,IAAI,iBAAiB,EAAE,SAAS,EAAE,CAAC;QACjC,YAAY,CAAC,IAAI,CAAC,gBAAgB,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAA;IAClE,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAErB,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAA;IAE9D,OAAO,uBAAuB,CAC5B,aAAa,EACb,WAAW,EACX,SAAS,EACT,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,aAAa,CACd,CAAA;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAgB;IACjD,OAAO,QAAQ;SACZ,OAAO,CAAC,wCAAwC,EAAE,2BAA2B,CAAC;SAC9E,OAAO,CAAC,oBAAoB,EAAE,6CAA6C,CAAC;SAC5E,OAAO,CACN,uCAAuC,EACvC,uDAAuD,CACxD,CAAA;AACL,CAAC","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport * as prettier from 'prettier'\nimport { ModuleKind, Node, Project, ScriptTarget, VariableDeclarationKind } from 'ts-morph'\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\nlet unusedPropCleanupProject: Project | undefined\nlet unusedPropCleanupFileId = 0\n\nfunction getUnusedPropCleanupProject() {\n unusedPropCleanupProject ??= new Project({\n useInMemoryFileSystem: true,\n skipAddingFilesFromTsConfig: true,\n compilerOptions: {\n module: ModuleKind.ESNext,\n target: ScriptTarget.ESNext,\n },\n })\n return unusedPropCleanupProject\n}\n\n/**\n * Removes unused top-level const declarations generated from parser prop mappings.\n * If the template cannot be safely analyzed, leave it unchanged so cleanup never\n * prevents an otherwise valid migration.\n */\nexport function removeUnusedGeneratedPropDeclarations(\n template: string,\n props: CodeConnectJSON['templateData']['props'],\n): string {\n const generatedPropNames = new Set(Object.keys(props || {}))\n if (generatedPropNames.size === 0) {\n return template\n }\n\n let project: Project | undefined\n let sourceFile\n\n try {\n project = getUnusedPropCleanupProject()\n sourceFile = project.createSourceFile(\n `migration-template-${unusedPropCleanupFileId++}.ts`,\n template,\n )\n\n if (project.getProgram().getSyntacticDiagnostics(sourceFile).length > 0) {\n return template\n }\n\n // Repeat so a generated declaration referenced only by another unused\n // generated declaration can also be removed.\n while (true) {\n const unusedStatement = sourceFile.getVariableStatements().find((statement) => {\n if (statement.getDeclarationKind() !== VariableDeclarationKind.Const) {\n return false\n }\n\n const declarations = statement.getDeclarations()\n if (declarations.length !== 1) {\n return false\n }\n\n const name = declarations[0].getNameNode()\n return (\n Node.isIdentifier(name) &&\n generatedPropNames.has(name.getText()) &&\n name.findReferencesAsNodes().length === 0\n )\n })\n\n if (!unusedStatement) {\n break\n }\n unusedStatement.remove()\n }\n\n return sourceFile.getFullText()\n } catch {\n return template\n } finally {\n if (project && sourceFile) {\n project.removeSourceFile(sourceFile)\n }\n }\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 template = removeUnusedGeneratedPropDeclarations(template, doc.templateData?.props)\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"]}
@@ -0,0 +1,69 @@
1
+ import { FigmaRestApi } from './figma_rest_api';
2
+ /**
3
+ * A single property value to overlay a node's `.properties`. `name` is normalized
4
+ * (no `#id` suffix) so it matches template references, e.g. `figma.boolean('Has Icon Start')`.
5
+ */
6
+ export interface PropertyCombinationValue {
7
+ name: string;
8
+ type: FigmaRestApi.ComponentPropertyType;
9
+ value: string | boolean;
10
+ }
11
+ /** One renderable property combination: a label plus the full set of property values to overlay. */
12
+ export interface PropertyCombination {
13
+ label: string;
14
+ properties: PropertyCombinationValue[];
15
+ }
16
+ /** The typed vocabulary of a component's properties, attached to failed previews for repair hints. */
17
+ export interface AvailableProperty {
18
+ name: string;
19
+ type: FigmaRestApi.ComponentPropertyType;
20
+ variantOptions?: string[];
21
+ default?: string | boolean;
22
+ }
23
+ /** The typed, normalized property vocabulary of a component. */
24
+ export declare function toAvailableProperties(defs: Record<string, FigmaRestApi.ComponentPropertyDefinition>): AvailableProperty[];
25
+ export interface EnumeratePropertyCombinationsResult {
26
+ propertyCombinations: PropertyCombination[];
27
+ availableProperties: AvailableProperty[];
28
+ /** Set only when an explicit `maxCombinations` cap truncated the full cartesian. */
29
+ truncated: {
30
+ total: number;
31
+ cap: number;
32
+ } | null;
33
+ }
34
+ /**
35
+ * Enumerate a component's renderable property combinations from its
36
+ * `componentPropertyDefinitions`: the cartesian product of VARIANT axes
37
+ * (their `variantOptions`) and BOOLEAN axes ({false, true}).
38
+ * TEXT/INSTANCE_SWAP props are held at `defaultValue` in every combination.
39
+ * Uncapped by default; pass `maxCombinations` to bound it.
40
+ */
41
+ export declare function enumeratePropertyCombinations(defs: Record<string, FigmaRestApi.ComponentPropertyDefinition>, opts?: {
42
+ maxCombinations?: number;
43
+ }): EnumeratePropertyCombinationsResult;
44
+ export interface BuildPropertyCombinationResult {
45
+ propertyCombination: PropertyCombination;
46
+ availableProperties: AvailableProperty[];
47
+ /** Supplied property names that don't exist on the component. */
48
+ unknown: string[];
49
+ /** Supplied values that aren't valid for their VARIANT property. */
50
+ invalid: Array<{
51
+ name: string;
52
+ value: string;
53
+ options: string[];
54
+ }>;
55
+ /** Supplied names that match multiple types with no `TYPE:` prefix to disambiguate. */
56
+ ambiguous: Array<{
57
+ name: string;
58
+ types: FigmaRestApi.ComponentPropertyType[];
59
+ }>;
60
+ }
61
+ /**
62
+ * Build a single property combination from an explicit set of `name=value` pairs
63
+ */
64
+ export declare function buildPropertyCombinationFromProps(defs: Record<string, FigmaRestApi.ComponentPropertyDefinition>, pairs: Array<{
65
+ name: string;
66
+ value: string;
67
+ type?: FigmaRestApi.ComponentPropertyType;
68
+ }>): BuildPropertyCombinationResult;
69
+ //# sourceMappingURL=property_combinations.d.ts.map