@figma/code-connect 1.4.8 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/commands/connect.d.ts +5 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +94 -26
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect_template.d.ts.map +1 -1
- package/dist/commands/connect_template.js +2 -2
- package/dist/commands/connect_template.js.map +1 -1
- package/dist/commands/preview_utils.d.ts +103 -5
- package/dist/commands/preview_utils.d.ts.map +1 -1
- package/dist/commands/preview_utils.js +453 -76
- package/dist/commands/preview_utils.js.map +1 -1
- package/dist/commands/property_list_table.d.ts +11 -0
- package/dist/commands/property_list_table.d.ts.map +1 -0
- package/dist/commands/property_list_table.js +67 -0
- package/dist/commands/property_list_table.js.map +1 -0
- package/dist/common/updates.d.ts +4 -1
- package/dist/common/updates.d.ts.map +1 -1
- package/dist/common/updates.js +26 -5
- package/dist/common/updates.js.map +1 -1
- package/dist/connect/api.d.ts +34 -1
- package/dist/connect/api.d.ts.map +1 -1
- package/dist/connect/api.js.map +1 -1
- package/dist/connect/batch_templates.d.ts +1 -1
- package/dist/connect/batch_templates.d.ts.map +1 -1
- package/dist/connect/batch_templates.js +2 -2
- package/dist/connect/batch_templates.js.map +1 -1
- package/dist/connect/intrinsics.d.ts +1 -0
- package/dist/connect/intrinsics.d.ts.map +1 -1
- package/dist/connect/intrinsics.js +29 -0
- package/dist/connect/intrinsics.js.map +1 -1
- package/dist/connect/migration_batch_helpers.d.ts.map +1 -1
- package/dist/connect/migration_batch_helpers.js +1 -15
- package/dist/connect/migration_batch_helpers.js.map +1 -1
- package/dist/connect/migration_helpers.d.ts +6 -0
- package/dist/connect/migration_helpers.d.ts.map +1 -1
- package/dist/connect/migration_helpers.js +66 -0
- package/dist/connect/migration_helpers.js.map +1 -1
- package/dist/connect/parser_executables.d.ts.map +1 -1
- package/dist/connect/parser_executables.js +25 -13
- package/dist/connect/parser_executables.js.map +1 -1
- package/dist/connect/property_combinations.d.ts +69 -0
- package/dist/connect/property_combinations.d.ts.map +1 -0
- package/dist/connect/property_combinations.js +172 -0
- package/dist/connect/property_combinations.js.map +1 -0
- package/dist/connect/raw_template_bundler.d.ts +13 -0
- package/dist/connect/raw_template_bundler.d.ts.map +1 -0
- package/dist/connect/raw_template_bundler.js +178 -0
- package/dist/connect/raw_template_bundler.js.map +1 -0
- package/dist/connect/raw_templates.d.ts +1 -1
- package/dist/connect/raw_templates.d.ts.map +1 -1
- package/dist/connect/raw_templates.js +85 -24
- package/dist/connect/raw_templates.js.map +1 -1
- package/dist/parser_scripts/get_swift_parser_dir.js +5 -5
- package/dist/parser_scripts/get_swift_parser_dir.js.map +1 -1
- package/dist/react/parser.d.ts.map +1 -1
- package/dist/react/parser.js.map +1 -1
- package/figma-types-no-require.d.ts +231 -0
- package/figma-types.d.ts +19 -8
- package/package.json +8 -4
|
@@ -28,7 +28,7 @@ function validateBatchTemplatePath(templateFile, batchDir, batchFilePath) {
|
|
|
28
28
|
* that prepend `window['__FIGMA_BATCH'] = <data>` to the template. The figma
|
|
29
29
|
* runtime exposes this as `figma.batch`.
|
|
30
30
|
*/
|
|
31
|
-
function parseBatchFile(filePath, label, config, dir) {
|
|
31
|
+
async function parseBatchFile(filePath, label, config, dir) {
|
|
32
32
|
const raw = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
33
33
|
let parsed;
|
|
34
34
|
try {
|
|
@@ -55,7 +55,7 @@ function parseBatchFile(filePath, label, config, dir) {
|
|
|
55
55
|
const entryName = entry.name || entry.component || `index ${i}`;
|
|
56
56
|
throw new Error(`Missing required field "url" in entry "${entryName}" in ${filePath}`);
|
|
57
57
|
}
|
|
58
|
-
const doc = (0, raw_templates_1.parseRawFile)(templatePath, label, config, dir, {
|
|
58
|
+
const doc = await (0, raw_templates_1.parseRawFile)(templatePath, label, config, dir, {
|
|
59
59
|
url: entry.url,
|
|
60
60
|
source: entry.source,
|
|
61
61
|
component: entry.component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch_templates.js","sourceRoot":"","sources":["../../src/connect/batch_templates.ts"],"names":[],"mappings":";;;;;AAiDA,wCAmDC;AApGD,4CAAmB;AACnB,gDAAuB;AAGvB,mDAA8C;AAc9C;;;GAGG;AACH,SAAS,yBAAyB,CAChC,YAAoB,EACpB,QAAgB,EAChB,aAAqB;IAErB,MAAM,YAAY,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IAEzD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,qBAAqB,aAAa,GAAG,CAAC,CAAA;IAChG,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CACb,2EAA2E,YAAY,EAAE,CAC1F,CAAA;IACH,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;AAED;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"batch_templates.js","sourceRoot":"","sources":["../../src/connect/batch_templates.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport { CodeConnectJSON } from './figma_connect'\nimport { CodeConnectConfig } from './project'\nimport { parseRawFile } from './raw_templates'\n\ninterface BatchComponentEntry {\n url: string\n source?: string\n component?: string\n [key: string]: any\n}\n\ninterface BatchGroup {\n templateFile: string\n components: BatchComponentEntry[]\n}\n\n/**\n * Resolves and validates the template file path referenced by a batch group.\n * Returns the absolute path or throws a descriptive error.\n */\nfunction validateBatchTemplatePath(\n templateFile: string,\n batchDir: string,\n batchFilePath: string,\n): string {\n const templatePath = path.resolve(batchDir, templateFile)\n\n if (!fs.existsSync(templatePath)) {\n throw new Error(`Template file not found: ${templatePath} (referenced from ${batchFilePath})`)\n }\n\n if (!templatePath.endsWith('.figma.batch.ts') && !templatePath.endsWith('.figma.batch.js')) {\n throw new Error(\n `Template file must have a .figma.batch.ts or .figma.batch.js extension: ${templatePath}`,\n )\n }\n\n return templatePath\n}\n\n/**\n * Parses a `.figma.batch.json` file and produces CodeConnectJSON objects.\n *\n * For each component entry, delegates to `parseRawFile` with batch overrides\n * that prepend `window['__FIGMA_BATCH'] = <data>` to the template. The figma\n * runtime exposes this as `figma.batch`.\n */\nexport async function parseBatchFile(\n filePath: string,\n label: string | undefined,\n config?: CodeConnectConfig,\n dir?: string,\n): Promise<CodeConnectJSON[]> {\n const raw = fs.readFileSync(filePath, 'utf-8')\n let parsed: any\n try {\n parsed = JSON.parse(raw)\n } catch (e) {\n throw new Error(`Failed to parse JSON in ${filePath}: ${e}`)\n }\n\n // Support both single group (object) and multiple groups (array)\n const groups: BatchGroup[] = Array.isArray(parsed) ? parsed : [parsed]\n\n const results: CodeConnectJSON[] = []\n const batchDir = path.dirname(filePath)\n\n for (const group of groups) {\n if (!group.templateFile) {\n throw new Error(`Missing required field \"templateFile\" in ${filePath}`)\n }\n if (!Array.isArray(group.components) || group.components.length === 0) {\n throw new Error(`\"components\" must be a non-empty array in ${filePath}`)\n }\n\n const templatePath = validateBatchTemplatePath(group.templateFile, batchDir, filePath)\n\n for (let i = 0; i < group.components.length; i++) {\n const entry = group.components[i]\n\n if (!entry.url) {\n const entryName = entry.name || entry.component || `index ${i}`\n throw new Error(`Missing required field \"url\" in entry \"${entryName}\" in ${filePath}`)\n }\n\n const doc = await parseRawFile(templatePath, label, config, dir, {\n url: entry.url,\n source: entry.source,\n component: entry.component,\n batchData: entry,\n batchFilePath: filePath,\n })\n\n results.push(doc)\n }\n }\n\n return results\n}\n"]}
|
|
@@ -77,6 +77,7 @@ export interface FigmaSlot extends IntrinsicBase {
|
|
|
77
77
|
kind: IntrinsicKind.Slot;
|
|
78
78
|
args: {
|
|
79
79
|
figmaPropName: string;
|
|
80
|
+
connectedInstances?: boolean;
|
|
80
81
|
};
|
|
81
82
|
}
|
|
82
83
|
export type Intrinsic = FigmaBoolean | FigmaEnum | FigmaString | FigmaInstance | FigmaSlot | FigmaChildren | FigmaNestedProps | FigmaClassName | FigmaTextContent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intrinsics.d.ts","sourceRoot":"","sources":["../../src/connect/intrinsics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAA;AAChC,OAAO,EAAiB,aAAa,EAAe,MAAM,iBAAiB,CAAA;AAW3E,OAAO,EACL,QAAQ,EAOT,MAAM,kCAAkC,CAAA;AAGzC,OAAO,EAAE,QAAQ,EAAmC,MAAM,aAAa,CAAA;AAEvE,eAAO,MAAM,UAAU,UAAU,CAAA;AACjC,eAAO,MAAM,kBAAkB,kBAA0B,CAAA;AAEzD,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,QAAQ,aAAa;IACrB,WAAW,iBAAiB;IAC5B,SAAS,cAAc;IACvB,WAAW,iBAAiB;IAC5B,IAAI,SAAS;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,EAAE,CAAA;IACR,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;CACvB;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEnD,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,IAAI,EAAE,aAAa,CAAC,OAAO,CAAA;IAC3B,IAAI,EAAE;QACJ,aAAa,EAAE,MAAM,CAAA;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,gBAAgB,CAAC,CAAA;KAC1D,CAAA;CACF;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;AAE3D,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,IAAI,EAAE,aAAa,CAAC,IAAI,CAAA;IACxB,IAAI,EAAE;QACJ,aAAa,EAAE,MAAM,CAAA;QACrB,YAAY,EAAE,YAAY,CAAA;KAC3B,CAAA;CACF;AAED,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,IAAI,EAAE,aAAa,CAAC,MAAM,CAAA;IAC1B,IAAI,EAAE;QACJ,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;CACF;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAA;IAC5B,IAAI,EAAE;QACJ,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;CACF;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAA;IAC5B,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,EAAE,CAAA;KACjB,CAAA;CACF;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,IAAI,EAAE,aAAa,CAAC,WAAW,CAAA;IAC/B,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;KACjC,CAAA;CACF;AAED,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,IAAI,EAAE,aAAa,CAAC,SAAS,CAAA;IAC7B,IAAI,EAAE;QACJ,SAAS,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAA;KAClC,CAAA;CACF;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,IAAI,EAAE,aAAa,CAAC,WAAW,CAAA;IAC/B,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,IAAI,EAAE,aAAa,CAAC,IAAI,CAAA;IACxB,IAAI,EAAE;QACJ,aAAa,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"intrinsics.d.ts","sourceRoot":"","sources":["../../src/connect/intrinsics.ts"],"names":[],"mappings":"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"}
|
|
@@ -399,6 +399,13 @@ function intrinsicToString({ kind, args, modifiers = [] }, childLayer, isForMigr
|
|
|
399
399
|
return `${selector}.__properties__.enum('${args.figmaPropName}', ${mappingString})`;
|
|
400
400
|
}
|
|
401
401
|
case IntrinsicKind.Slot: {
|
|
402
|
+
if (args.connectedInstances) {
|
|
403
|
+
// `slot()` is undefined when the slot has no value, so guard before reading connectedInstances.
|
|
404
|
+
return `(function () {
|
|
405
|
+
const slot = ${selector}.__properties__.slot('${args.figmaPropName}')
|
|
406
|
+
return slot ? slot.connectedInstances.map((instance) => instance.__render__()).flat() : []
|
|
407
|
+
})()`;
|
|
408
|
+
}
|
|
402
409
|
return `${selector}.__properties__.slot('${args.figmaPropName}')`;
|
|
403
410
|
}
|
|
404
411
|
case IntrinsicKind.Children: {
|
|
@@ -503,7 +510,29 @@ function parsePropsObject(objectLiteral, parserContext) {
|
|
|
503
510
|
if (ts.isCallExpression(valueNode)) {
|
|
504
511
|
return parseIntrinsic(valueNode, parserContext);
|
|
505
512
|
}
|
|
513
|
+
const slotConnectedInstances = parseSlotConnectedInstances(valueNode, parserContext);
|
|
514
|
+
if (slotConnectedInstances) {
|
|
515
|
+
return slotConnectedInstances;
|
|
516
|
+
}
|
|
506
517
|
return expressionToFccEnumValue(valueNode, parserContext);
|
|
507
518
|
});
|
|
508
519
|
}
|
|
520
|
+
// Matches `figma.slot('Prop').connectedInstances` (a property access, so it never reaches parseIntrinsic) and parses it as a Slot intrinsic flagged to render the connected instances.
|
|
521
|
+
function parseSlotConnectedInstances(valueNode, parserContext) {
|
|
522
|
+
if (!ts.isPropertyAccessExpression(valueNode) ||
|
|
523
|
+
valueNode.name.text !== 'connectedInstances' ||
|
|
524
|
+
!ts.isCallExpression(valueNode.expression)) {
|
|
525
|
+
return undefined;
|
|
526
|
+
}
|
|
527
|
+
const slotCall = valueNode.expression;
|
|
528
|
+
const slotIntrinsic = Intrinsics[`${exports.API_PREFIX}.slot`];
|
|
529
|
+
if (!slotIntrinsic || !slotIntrinsic.match(slotCall)) {
|
|
530
|
+
return undefined;
|
|
531
|
+
}
|
|
532
|
+
const intrinsic = slotIntrinsic.parse(slotCall, parserContext);
|
|
533
|
+
return {
|
|
534
|
+
...intrinsic,
|
|
535
|
+
args: { ...intrinsic.args, connectedInstances: true },
|
|
536
|
+
};
|
|
537
|
+
}
|
|
509
538
|
//# sourceMappingURL=intrinsics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intrinsics.js","sourceRoot":"","sources":["../../src/connect/intrinsics.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript'\nimport { InternalError, ParserContext, ParserError } from './parser_common'\nimport {\n assertIsArrayLiteralExpression,\n assertIsStringLiteral,\n convertArrayLiteralToJs,\n isUndefinedType,\n stripQuotesFromNode,\n} from '../typescript/compiler'\nimport { convertObjectLiteralToJs } from '../typescript/compiler'\nimport { assertIsObjectLiteralExpression } from '../typescript/compiler'\nimport { FigmaConnectAPI } from './api'\nimport {\n FCCValue,\n _fcc_array,\n _fcc_function,\n _fcc_identifier,\n _fcc_jsxElement,\n _fcc_object,\n _fcc_templateString,\n} from '../react/parser_template_helpers'\nimport htmlApi from '../html/index_html'\nimport reactApi from '../react/index_react'\nimport { Modifier, modifierToString, parseModifier } from './modifiers'\n\nexport const API_PREFIX = 'figma'\nexport const FIGMA_CONNECT_CALL = `${API_PREFIX}.connect`\n\nexport enum IntrinsicKind {\n Enum = 'enum',\n String = 'string',\n Boolean = 'boolean',\n Instance = 'instance',\n Children = 'children',\n NestedProps = 'nested-props',\n ClassName = 'className',\n TextContent = 'text-content',\n Slot = 'slot',\n}\n\nexport interface IntrinsicBase {\n kind: IntrinsicKind\n args: {}\n modifiers?: Modifier[]\n}\n\nexport type ValueMappingKind = FCCValue | Intrinsic\n\nexport interface FigmaBoolean extends IntrinsicBase {\n kind: IntrinsicKind.Boolean\n args: {\n figmaPropName: string\n valueMapping?: Record<'true' | 'false', ValueMappingKind>\n }\n}\n\nexport type ValueMapping = Record<string, ValueMappingKind>\n\nexport interface FigmaEnum extends IntrinsicBase {\n kind: IntrinsicKind.Enum\n args: {\n figmaPropName: string\n valueMapping: ValueMapping\n }\n}\n\nexport interface FigmaString extends IntrinsicBase {\n kind: IntrinsicKind.String\n args: {\n figmaPropName: string\n }\n}\n\nexport interface FigmaInstance extends IntrinsicBase {\n kind: IntrinsicKind.Instance\n args: {\n figmaPropName: string\n }\n}\n\nexport interface FigmaChildren extends IntrinsicBase {\n kind: IntrinsicKind.Children\n args: {\n layers: string[]\n }\n}\n\nexport interface FigmaNestedProps extends IntrinsicBase {\n kind: IntrinsicKind.NestedProps\n args: {\n layer: string\n props: Record<string, Intrinsic>\n }\n}\n\nexport interface FigmaClassName extends IntrinsicBase {\n kind: IntrinsicKind.ClassName\n args: {\n className: (string | Intrinsic)[]\n }\n}\n\nexport interface FigmaTextContent extends IntrinsicBase {\n kind: IntrinsicKind.TextContent\n args: {\n layer: string\n }\n}\n\nexport interface FigmaSlot extends IntrinsicBase {\n kind: IntrinsicKind.Slot\n args: {\n figmaPropName: string\n }\n}\n\nexport type Intrinsic =\n | FigmaBoolean\n | FigmaEnum\n | FigmaString\n | FigmaInstance\n | FigmaSlot\n | FigmaChildren\n | FigmaNestedProps\n | FigmaClassName\n | FigmaTextContent\n\nconst Intrinsics: {\n [key: string]: {\n match: (exp: ts.CallExpression) => exp is ts.CallExpression\n parse: (exp: ts.CallExpression, parser: ParserContext) => Intrinsic\n }\n} = {}\n\n/**\n * These functions are used to convert \"intrinsic\" parser types (which are calls to helper functions\n * like `Figma.boolean() in code)` to an object representing that intrinsic that we can serialize to JSON.\n *\n * Each call to `makeIntrinsic` should take a function from the {@link FigmaConnectAPI},\n * ensuring that the name of the intrinsic that we're parsing matches the name of the function\n *\n * @param staticFunctionMember\n * @param obj\n */\nfunction makeIntrinsic<K extends keyof typeof htmlApi | typeof reactApi>(\n intrinsicName: K,\n obj: (name: string) => any,\n) {\n const name = `${API_PREFIX}.${intrinsicName}`\n Intrinsics[name] = {\n match: (exp: ts.CallExpression) => {\n return ts.isCallExpression(exp) && exp.getText().replace(/\\s/g, '').startsWith(name)\n },\n ...obj(name),\n }\n}\n\nmakeIntrinsic('boolean', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaBoolean => {\n const figmaPropNameIdentifier = exp.arguments?.[0]\n assertIsStringLiteral(\n figmaPropNameIdentifier,\n ctx.sourceFile,\n `${name} takes at least one argument, which is the Figma property name`,\n )\n const valueMappingArg = exp.arguments?.[1]\n let valueMapping\n if (valueMappingArg) {\n assertIsObjectLiteralExpression(\n valueMappingArg,\n ctx.sourceFile,\n `${name} second argument should be an object literal, that sets values for 'true' and 'false'`,\n )\n valueMapping = parsePropsObject(valueMappingArg, ctx) as Record<\n 'true' | 'false',\n ValueMappingKind\n >\n }\n return {\n kind: IntrinsicKind.Boolean,\n args: {\n figmaPropName: stripQuotesFromNode(figmaPropNameIdentifier),\n valueMapping,\n },\n }\n },\n }\n})\n\nmakeIntrinsic('enum', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaEnum => {\n const { sourceFile } = ctx\n const figmaPropNameIdentifier = exp.arguments?.[0]\n assertIsStringLiteral(\n figmaPropNameIdentifier,\n sourceFile,\n `${name} takes at least one argument, which is the Figma property name`,\n )\n const valueMapping = exp.arguments?.[1]\n assertIsObjectLiteralExpression(\n valueMapping,\n sourceFile,\n `${name} second argument should be an object literal, that maps Figma prop values to code`,\n )\n return {\n kind: IntrinsicKind.Enum,\n args: {\n figmaPropName: stripQuotesFromNode(figmaPropNameIdentifier),\n valueMapping: parsePropsObject(valueMapping, ctx),\n },\n }\n },\n }\n})\n\nmakeIntrinsic('string', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaString => {\n const { sourceFile } = ctx\n const figmaPropNameIdentifier = exp.arguments?.[0]\n assertIsStringLiteral(\n figmaPropNameIdentifier,\n sourceFile,\n `${name} takes at least one argument, which is the Figma property name`,\n )\n return {\n kind: IntrinsicKind.String,\n args: {\n figmaPropName: stripQuotesFromNode(figmaPropNameIdentifier),\n },\n }\n },\n }\n})\n\nmakeIntrinsic('instance', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaInstance => {\n const { sourceFile } = ctx\n const figmaPropNameIdentifier = exp.arguments?.[0]\n\n assertIsStringLiteral(\n figmaPropNameIdentifier,\n sourceFile,\n `${name} takes at least one argument, which is the Figma property name`,\n )\n\n return {\n kind: IntrinsicKind.Instance,\n args: {\n figmaPropName: stripQuotesFromNode(figmaPropNameIdentifier),\n },\n }\n },\n }\n})\n\nmakeIntrinsic('slot', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaSlot => {\n const { sourceFile } = ctx\n const figmaPropNameIdentifier = exp.arguments?.[0]\n\n assertIsStringLiteral(\n figmaPropNameIdentifier,\n sourceFile,\n `${name} takes a single argument which is the Figma property name`,\n )\n\n return {\n kind: IntrinsicKind.Slot,\n args: {\n figmaPropName: stripQuotesFromNode(figmaPropNameIdentifier),\n },\n }\n },\n }\n})\n\nmakeIntrinsic('children', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaChildren => {\n const { sourceFile } = ctx\n const layerName = exp.arguments?.[0]\n const layers: string[] = []\n if (ts.isStringLiteral(layerName)) {\n layers.push(stripQuotesFromNode(layerName))\n } else if (ts.isArrayLiteralExpression(layerName) && layerName.elements.length > 0) {\n layerName.elements.forEach((el) => {\n assertIsStringLiteral(el, sourceFile)\n const name = stripQuotesFromNode(el)\n if (name.includes('*')) {\n throw new ParserError(\n `Wildcards can not be used with an array of strings. Use a single string literal instead.`,\n {\n node: layerName,\n sourceFile,\n },\n )\n }\n layers.push(stripQuotesFromNode(el))\n })\n } else {\n throw new ParserError(\n `Invalid argument to ${name}, should be a string literal or an array of strings`,\n {\n node: layerName,\n sourceFile,\n },\n )\n }\n\n return {\n kind: IntrinsicKind.Children,\n args: {\n layers,\n },\n }\n },\n }\n})\n\nmakeIntrinsic('nestedProps', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaNestedProps => {\n const { sourceFile } = ctx\n const layerName = exp.arguments?.[0]\n const mapping = exp.arguments?.[1]\n\n assertIsStringLiteral(\n layerName,\n sourceFile,\n `Invalid argument to ${name}, \\`layerName\\` should be a string literal`,\n )\n assertIsObjectLiteralExpression(\n mapping,\n sourceFile,\n `Invalid argument to ${name}, \\`props\\` should be an object literal`,\n )\n\n ts.forEachChild(mapping, (node) => {\n if (\n ts.isPropertyAssignment(node) &&\n ts.isCallExpression(node.initializer) &&\n node.initializer.getText().startsWith('figma.nestedProps')\n ) {\n throw new ParserError(\n `nestedProps can not be nested inside another nestedProps call, instead, pass the deeply nested layer name at the top level`,\n )\n }\n })\n\n return {\n kind: IntrinsicKind.NestedProps,\n args: {\n layer: stripQuotesFromNode(layerName),\n props: parsePropsObject(mapping, ctx),\n },\n }\n },\n }\n})\n\nmakeIntrinsic('className', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaClassName => {\n const { sourceFile } = ctx\n const classNameArg = exp.arguments?.[0]\n const className: (string | Intrinsic)[] = []\n assertIsArrayLiteralExpression(classNameArg, sourceFile, `${name} takes an array of strings`)\n\n classNameArg.elements.forEach((el) => {\n if (ts.isStringLiteral(el)) {\n className.push(stripQuotesFromNode(el))\n } else if (ts.isCallExpression(el)) {\n className.push(parseIntrinsic(el, ctx))\n }\n })\n\n return {\n kind: IntrinsicKind.ClassName,\n args: {\n className,\n },\n }\n },\n }\n})\n\nmakeIntrinsic('textContent', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaTextContent => {\n const { sourceFile } = ctx\n const layerNameArg = exp.arguments?.[0]\n assertIsStringLiteral(\n layerNameArg,\n sourceFile,\n `${name} takes a single argument which is the Figma layer name`,\n )\n\n return {\n kind: IntrinsicKind.TextContent,\n args: {\n layer: stripQuotesFromNode(layerNameArg),\n },\n }\n },\n }\n})\n\n/**\n * Parses a call expression to an intrinsic\n *\n * @param exp Expression to parse\n * @param parserContext parser context\n * @returns\n */\nexport function parseIntrinsic(exp: ts.CallExpression, parserContext: ParserContext): Intrinsic {\n for (const key in Intrinsics) {\n if (Intrinsics[key].match(exp)) {\n // Chained call expressions in TS are nested with the innermost call expression\n // being the first in the chain. We need to reverse the chain so that the intrinsic\n // is the first element in the array. The TS AST looks like this for a().b():\n // CallExpression [a().b()] ->\n // PropertyAccessExpression [a().b] ->\n // CallExpression [a()]\n\n let callChain = []\n let current: any = exp\n while (current) {\n if (ts.isCallExpression(current)) {\n callChain.push(current)\n current = current.expression\n } else if (ts.isPropertyAccessExpression(current)) {\n current = current.expression\n } else {\n current = null\n }\n }\n\n // If there's only one call expression just return the matching intrinsic\n callChain = callChain.reverse()\n if (callChain.length <= 1) {\n return Intrinsics[key].parse(exp, parserContext)\n }\n\n // The first call expression is the intrinsic itself, and any following call\n // expressions are modifiers\n const intrinsic = Intrinsics[key].parse(callChain.shift()!, parserContext)\n const modifiers = callChain.map((modifier) => parseModifier(modifier, parserContext))\n\n return {\n ...intrinsic,\n modifiers,\n }\n }\n }\n\n throw new ParserError(`Unknown intrinsic: ${exp.getText()}`, {\n node: exp,\n sourceFile: parserContext.sourceFile,\n })\n}\n\n/**\n * Replace newlines in enum values with \\\\n so that we don't output\n * broken JS with newlines inside the string\n */\nfunction replaceNewlines(str: string) {\n return str.toString().replaceAll('\\n', '\\\\n').replaceAll(\"'\", \"\\\\'\")\n}\n\nexport function valueToString(\n value: ValueMappingKind,\n childLayer?: string,\n isForMigration?: boolean,\n) {\n if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'undefined') {\n return `${value}`\n }\n\n if (typeof value === 'string') {\n return `'${replaceNewlines(value)}'`\n }\n\n if ('kind' in value) {\n // Mappings can be nested, e.g. an enum value can be figma.instance(...)\n return `${intrinsicToString(value as Intrinsic, childLayer, isForMigration)}`\n }\n\n // Convert objects to strings\n const str = typeof value.$value === 'string' ? value.$value : `${JSON.stringify(value.$value)}`\n const v = replaceNewlines(str)\n\n switch (value.$type) {\n case 'function':\n return `_fcc_function('${v}')`\n case 'identifier':\n return `_fcc_identifier('${v}')`\n case 'object':\n // Don't pass the object itself wrapped in quotes - this helper needs to instantiate the actual\n // object, as it may be used in the snippet code\n return `_fcc_object(${v})`\n case 'template-string':\n return `_fcc_templateString('${v}')`\n case 'jsx-element':\n return `_fcc_jsxElement('${v}')`\n case 'array':\n return `_fcc_array(${v})`\n default:\n throw new InternalError(`Unknown helper type: ${value}`)\n }\n}\n\nexport function valueMappingToString(\n valueMapping: ValueMapping,\n childLayer?: string,\n isForMigration?: boolean,\n): string {\n // For enums (and booleans with a valueMapping provided), convert the\n // value mapping to an object.\n return (\n '{\\n' +\n Object.entries(valueMapping)\n .map(([key, value]) => {\n return `\"${key}\": ${valueToString(value, childLayer, isForMigration)}`\n })\n .join(',\\n') +\n '}'\n )\n}\n\nlet nestedLayerCount = 0\n\nexport function intrinsicToString(\n { kind, args, modifiers = [] }: Intrinsic,\n childLayer?: string,\n isForMigration?: boolean,\n): string {\n const selector = childLayer ?? `figma.currentLayer`\n switch (kind) {\n case IntrinsicKind.String:\n return `${selector}.__properties__.string('${args.figmaPropName}')`\n case IntrinsicKind.Instance: {\n // Outputs:\n // `const propName = figma.properties.string('propName')`, or\n // `const propName = figma.properties.boolean('propName')`, or\n // `const propName = figma.properties.instance('propName')`\n if (modifiers.length > 0) {\n const instance = `${selector}.__properties__.__instance__('${args.figmaPropName}')`\n let body = `const instance = ${instance}\\n`\n body += `return instance && instance.type !== \"ERROR\" ? ${['instance', ...modifiers.map(modifierToString)].join('.')} : instance`\n return `(function () {${body}})()`\n }\n return `${selector}.__properties__.instance('${args.figmaPropName}')`\n }\n case IntrinsicKind.Boolean: {\n if (args.valueMapping) {\n const mappingString = valueMappingToString(args.valueMapping, childLayer, isForMigration)\n // Outputs: `const propName = figma.properties.boolean('propName', { ... mapping object from above ... })`\n return `${selector}.__properties__.boolean('${args.figmaPropName}', ${mappingString})`\n }\n return `${selector}.__properties__.boolean('${args.figmaPropName}')`\n }\n case IntrinsicKind.Enum: {\n const mappingString = valueMappingToString(args.valueMapping, childLayer, isForMigration)\n\n // Outputs: `const propName = figma.properties.enum('propName', { ... mapping object from above ... })`\n return `${selector}.__properties__.enum('${args.figmaPropName}', ${mappingString})`\n }\n case IntrinsicKind.Slot: {\n return `${selector}.__properties__.slot('${args.figmaPropName}')`\n }\n case IntrinsicKind.Children: {\n // Outputs: `const propName = figma.properties.children([\"Layer 1\", \"Layer 2\"])`\n return `${selector}.__properties__.children([${args.layers.map((layerName) => `\"${layerName}\"`).join(',')}])`\n }\n case IntrinsicKind.ClassName: {\n // Outputs: `const propName = ['btn-base', figma.currentLayer.__properties__.enum('Size, { Large: 'btn-large' })].join(\" \")`\n return `[${args.className.map((className) => (typeof className === 'string' ? `\"${className}\"` : `${intrinsicToString(className, childLayer, isForMigration)}`)).join(', ')}].filter(v => !!v).join(' ')`\n }\n case IntrinsicKind.TextContent: {\n return `${selector}.__findChildWithCriteria__({ name: '${args.layer}', type: \"TEXT\" }).__render__()`\n }\n case IntrinsicKind.NestedProps: {\n let body: string = ''\n // the actual layer name in figma could have a bunch of special characters in it,\n // and if we try to normalize it to a valid JS identifier, it could conflict with\n // other variables in the template code. So we generate a unique variable name\n // for each nested layer reference instead. The only reason it's wrapped in a funciton\n // currently is to keep the error checking out of global scope\n const nestedLayerRef = `nestedLayer${nestedLayerCount++}`\n body += `const ${nestedLayerRef} = figma.currentLayer.__find__(\"${args.layer}\")\\n`\n if (isForMigration) {\n // Generate a TypeScript-safe pattern that always returns the object shape.\n // The error case uses `undefined` per-property so the result is always\n // `{ key: T | undefined }`, avoiding the `ErrorHandle | { key: T }` union\n // that would require optional chaining at every call site.\n body += `return {\\n${Object.entries(args.props)\n .map(\n ([key, intrinsic]) =>\n `${key}: ${nestedLayerRef}.type !== \"ERROR\" ? ${intrinsicToString(intrinsic, nestedLayerRef, isForMigration)} : undefined,\\n`,\n )\n .join('')}\\n }\\n`\n } else {\n body += `return ${nestedLayerRef}.type === \"ERROR\" ? ${nestedLayerRef} : {\n${Object.entries(args.props).map(\n ([key, intrinsic]) => `${key}: ${intrinsicToString(intrinsic, nestedLayerRef, isForMigration)}\\n`,\n)}\n }\\n`\n }\n return `(function () {${body}})()`\n }\n default:\n throw new InternalError(`Unknown intrinsic: ${kind}`)\n }\n}\n\n/**\n * Converts an expression to an FCC value, which is a wrapper around the actual value that\n * includes the type information. This is used to serialize the value to JSON and then\n * deserialize it back to the correct type in the generated code.\n *\n * @param valueNode\n * @param parserContext\n * @returns\n */\nfunction expressionToFccEnumValue(\n valueNode: ts.Expression,\n parserContext: ParserContext,\n): FCCValue {\n const { sourceFile, checker } = parserContext\n\n if (ts.isParenthesizedExpression(valueNode)) {\n return expressionToFccEnumValue(valueNode.expression, parserContext)\n }\n\n if (ts.isJsxElement(valueNode) || ts.isJsxSelfClosingElement(valueNode)) {\n return _fcc_jsxElement(valueNode.getText())\n }\n\n if (ts.isArrowFunction(valueNode) || ts.isFunctionExpression(valueNode)) {\n return _fcc_function(valueNode.getText())\n }\n\n if (ts.isObjectLiteralExpression(valueNode)) {\n // should recursively convert to FCC\n return _fcc_object(parsePropsObject(valueNode, parserContext))\n }\n\n if (ts.isArrayLiteralExpression(valueNode)) {\n return _fcc_array(\n convertArrayLiteralToJs(valueNode, sourceFile, checker, (valueNode) => {\n if (ts.isCallExpression(valueNode)) {\n return parseIntrinsic(valueNode, parserContext)\n }\n return expressionToFccEnumValue(valueNode, parserContext)\n }),\n )\n }\n\n if (ts.isTemplateLiteral(valueNode)) {\n const str = valueNode.getText().replaceAll('`', '')\n return _fcc_templateString(str)\n }\n\n // Handles enums, for example `MyEnum.Value`\n if (ts.isPropertyAccessExpression(valueNode)) {\n return _fcc_identifier(valueNode.getText())\n }\n\n // Any other identifiers (except undefined) are treated as React components, for example `MyComponent`.\n // We don't support referencing other variables in props object so this should be fine.\n if (ts.isIdentifier(valueNode) && !isUndefinedType(valueNode, parserContext.checker)) {\n return _fcc_identifier(valueNode.getText())\n }\n\n // Fall back to the default conversion in `convertObjectLiteralToJs`\n return undefined\n}\n\n/**\n * Parses the `props` field in a `figma.connect()` call, returning a mapping of\n * prop names to their respective intrinsic types\n *\n * @param objectLiteral An object literal expression\n * @param parserContext Parser context\n * @returns\n */\nexport function parsePropsObject(\n objectLiteral: ts.ObjectLiteralExpression,\n parserContext: ParserContext,\n): PropMappings {\n const { sourceFile, checker } = parserContext\n return convertObjectLiteralToJs(objectLiteral, sourceFile, checker, (valueNode) => {\n if (ts.isCallExpression(valueNode)) {\n return parseIntrinsic(valueNode, parserContext)\n }\n return expressionToFccEnumValue(valueNode, parserContext)\n }) as PropMappings\n}\n\nexport type PropMappings = Record<string, Intrinsic>\n"]}
|
|
1
|
+
{"version":3,"file":"intrinsics.js","sourceRoot":"","sources":["../../src/connect/intrinsics.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript'\nimport { InternalError, ParserContext, ParserError } from './parser_common'\nimport {\n assertIsArrayLiteralExpression,\n assertIsStringLiteral,\n convertArrayLiteralToJs,\n isUndefinedType,\n stripQuotesFromNode,\n} from '../typescript/compiler'\nimport { convertObjectLiteralToJs } from '../typescript/compiler'\nimport { assertIsObjectLiteralExpression } from '../typescript/compiler'\nimport { FigmaConnectAPI } from './api'\nimport {\n FCCValue,\n _fcc_array,\n _fcc_function,\n _fcc_identifier,\n _fcc_jsxElement,\n _fcc_object,\n _fcc_templateString,\n} from '../react/parser_template_helpers'\nimport htmlApi from '../html/index_html'\nimport reactApi from '../react/index_react'\nimport { Modifier, modifierToString, parseModifier } from './modifiers'\n\nexport const API_PREFIX = 'figma'\nexport const FIGMA_CONNECT_CALL = `${API_PREFIX}.connect`\n\nexport enum IntrinsicKind {\n Enum = 'enum',\n String = 'string',\n Boolean = 'boolean',\n Instance = 'instance',\n Children = 'children',\n NestedProps = 'nested-props',\n ClassName = 'className',\n TextContent = 'text-content',\n Slot = 'slot',\n}\n\nexport interface IntrinsicBase {\n kind: IntrinsicKind\n args: {}\n modifiers?: Modifier[]\n}\n\nexport type ValueMappingKind = FCCValue | Intrinsic\n\nexport interface FigmaBoolean extends IntrinsicBase {\n kind: IntrinsicKind.Boolean\n args: {\n figmaPropName: string\n valueMapping?: Record<'true' | 'false', ValueMappingKind>\n }\n}\n\nexport type ValueMapping = Record<string, ValueMappingKind>\n\nexport interface FigmaEnum extends IntrinsicBase {\n kind: IntrinsicKind.Enum\n args: {\n figmaPropName: string\n valueMapping: ValueMapping\n }\n}\n\nexport interface FigmaString extends IntrinsicBase {\n kind: IntrinsicKind.String\n args: {\n figmaPropName: string\n }\n}\n\nexport interface FigmaInstance extends IntrinsicBase {\n kind: IntrinsicKind.Instance\n args: {\n figmaPropName: string\n }\n}\n\nexport interface FigmaChildren extends IntrinsicBase {\n kind: IntrinsicKind.Children\n args: {\n layers: string[]\n }\n}\n\nexport interface FigmaNestedProps extends IntrinsicBase {\n kind: IntrinsicKind.NestedProps\n args: {\n layer: string\n props: Record<string, Intrinsic>\n }\n}\n\nexport interface FigmaClassName extends IntrinsicBase {\n kind: IntrinsicKind.ClassName\n args: {\n className: (string | Intrinsic)[]\n }\n}\n\nexport interface FigmaTextContent extends IntrinsicBase {\n kind: IntrinsicKind.TextContent\n args: {\n layer: string\n }\n}\n\nexport interface FigmaSlot extends IntrinsicBase {\n kind: IntrinsicKind.Slot\n args: {\n figmaPropName: string\n // When true (authored as `figma.slot('Prop').connectedInstances`), render the slot's connected instances instead of the slot placeholder.\n connectedInstances?: boolean\n }\n}\n\nexport type Intrinsic =\n | FigmaBoolean\n | FigmaEnum\n | FigmaString\n | FigmaInstance\n | FigmaSlot\n | FigmaChildren\n | FigmaNestedProps\n | FigmaClassName\n | FigmaTextContent\n\nconst Intrinsics: {\n [key: string]: {\n match: (exp: ts.CallExpression) => exp is ts.CallExpression\n parse: (exp: ts.CallExpression, parser: ParserContext) => Intrinsic\n }\n} = {}\n\n/**\n * These functions are used to convert \"intrinsic\" parser types (which are calls to helper functions\n * like `Figma.boolean() in code)` to an object representing that intrinsic that we can serialize to JSON.\n *\n * Each call to `makeIntrinsic` should take a function from the {@link FigmaConnectAPI},\n * ensuring that the name of the intrinsic that we're parsing matches the name of the function\n *\n * @param staticFunctionMember\n * @param obj\n */\nfunction makeIntrinsic<K extends keyof typeof htmlApi | typeof reactApi>(\n intrinsicName: K,\n obj: (name: string) => any,\n) {\n const name = `${API_PREFIX}.${intrinsicName}`\n Intrinsics[name] = {\n match: (exp: ts.CallExpression) => {\n return ts.isCallExpression(exp) && exp.getText().replace(/\\s/g, '').startsWith(name)\n },\n ...obj(name),\n }\n}\n\nmakeIntrinsic('boolean', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaBoolean => {\n const figmaPropNameIdentifier = exp.arguments?.[0]\n assertIsStringLiteral(\n figmaPropNameIdentifier,\n ctx.sourceFile,\n `${name} takes at least one argument, which is the Figma property name`,\n )\n const valueMappingArg = exp.arguments?.[1]\n let valueMapping\n if (valueMappingArg) {\n assertIsObjectLiteralExpression(\n valueMappingArg,\n ctx.sourceFile,\n `${name} second argument should be an object literal, that sets values for 'true' and 'false'`,\n )\n valueMapping = parsePropsObject(valueMappingArg, ctx) as Record<\n 'true' | 'false',\n ValueMappingKind\n >\n }\n return {\n kind: IntrinsicKind.Boolean,\n args: {\n figmaPropName: stripQuotesFromNode(figmaPropNameIdentifier),\n valueMapping,\n },\n }\n },\n }\n})\n\nmakeIntrinsic('enum', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaEnum => {\n const { sourceFile } = ctx\n const figmaPropNameIdentifier = exp.arguments?.[0]\n assertIsStringLiteral(\n figmaPropNameIdentifier,\n sourceFile,\n `${name} takes at least one argument, which is the Figma property name`,\n )\n const valueMapping = exp.arguments?.[1]\n assertIsObjectLiteralExpression(\n valueMapping,\n sourceFile,\n `${name} second argument should be an object literal, that maps Figma prop values to code`,\n )\n return {\n kind: IntrinsicKind.Enum,\n args: {\n figmaPropName: stripQuotesFromNode(figmaPropNameIdentifier),\n valueMapping: parsePropsObject(valueMapping, ctx),\n },\n }\n },\n }\n})\n\nmakeIntrinsic('string', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaString => {\n const { sourceFile } = ctx\n const figmaPropNameIdentifier = exp.arguments?.[0]\n assertIsStringLiteral(\n figmaPropNameIdentifier,\n sourceFile,\n `${name} takes at least one argument, which is the Figma property name`,\n )\n return {\n kind: IntrinsicKind.String,\n args: {\n figmaPropName: stripQuotesFromNode(figmaPropNameIdentifier),\n },\n }\n },\n }\n})\n\nmakeIntrinsic('instance', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaInstance => {\n const { sourceFile } = ctx\n const figmaPropNameIdentifier = exp.arguments?.[0]\n\n assertIsStringLiteral(\n figmaPropNameIdentifier,\n sourceFile,\n `${name} takes at least one argument, which is the Figma property name`,\n )\n\n return {\n kind: IntrinsicKind.Instance,\n args: {\n figmaPropName: stripQuotesFromNode(figmaPropNameIdentifier),\n },\n }\n },\n }\n})\n\nmakeIntrinsic('slot', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaSlot => {\n const { sourceFile } = ctx\n const figmaPropNameIdentifier = exp.arguments?.[0]\n\n assertIsStringLiteral(\n figmaPropNameIdentifier,\n sourceFile,\n `${name} takes a single argument which is the Figma property name`,\n )\n\n return {\n kind: IntrinsicKind.Slot,\n args: {\n figmaPropName: stripQuotesFromNode(figmaPropNameIdentifier),\n },\n }\n },\n }\n})\n\nmakeIntrinsic('children', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaChildren => {\n const { sourceFile } = ctx\n const layerName = exp.arguments?.[0]\n const layers: string[] = []\n if (ts.isStringLiteral(layerName)) {\n layers.push(stripQuotesFromNode(layerName))\n } else if (ts.isArrayLiteralExpression(layerName) && layerName.elements.length > 0) {\n layerName.elements.forEach((el) => {\n assertIsStringLiteral(el, sourceFile)\n const name = stripQuotesFromNode(el)\n if (name.includes('*')) {\n throw new ParserError(\n `Wildcards can not be used with an array of strings. Use a single string literal instead.`,\n {\n node: layerName,\n sourceFile,\n },\n )\n }\n layers.push(stripQuotesFromNode(el))\n })\n } else {\n throw new ParserError(\n `Invalid argument to ${name}, should be a string literal or an array of strings`,\n {\n node: layerName,\n sourceFile,\n },\n )\n }\n\n return {\n kind: IntrinsicKind.Children,\n args: {\n layers,\n },\n }\n },\n }\n})\n\nmakeIntrinsic('nestedProps', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaNestedProps => {\n const { sourceFile } = ctx\n const layerName = exp.arguments?.[0]\n const mapping = exp.arguments?.[1]\n\n assertIsStringLiteral(\n layerName,\n sourceFile,\n `Invalid argument to ${name}, \\`layerName\\` should be a string literal`,\n )\n assertIsObjectLiteralExpression(\n mapping,\n sourceFile,\n `Invalid argument to ${name}, \\`props\\` should be an object literal`,\n )\n\n ts.forEachChild(mapping, (node) => {\n if (\n ts.isPropertyAssignment(node) &&\n ts.isCallExpression(node.initializer) &&\n node.initializer.getText().startsWith('figma.nestedProps')\n ) {\n throw new ParserError(\n `nestedProps can not be nested inside another nestedProps call, instead, pass the deeply nested layer name at the top level`,\n )\n }\n })\n\n return {\n kind: IntrinsicKind.NestedProps,\n args: {\n layer: stripQuotesFromNode(layerName),\n props: parsePropsObject(mapping, ctx),\n },\n }\n },\n }\n})\n\nmakeIntrinsic('className', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaClassName => {\n const { sourceFile } = ctx\n const classNameArg = exp.arguments?.[0]\n const className: (string | Intrinsic)[] = []\n assertIsArrayLiteralExpression(classNameArg, sourceFile, `${name} takes an array of strings`)\n\n classNameArg.elements.forEach((el) => {\n if (ts.isStringLiteral(el)) {\n className.push(stripQuotesFromNode(el))\n } else if (ts.isCallExpression(el)) {\n className.push(parseIntrinsic(el, ctx))\n }\n })\n\n return {\n kind: IntrinsicKind.ClassName,\n args: {\n className,\n },\n }\n },\n }\n})\n\nmakeIntrinsic('textContent', (name) => {\n return {\n parse: (exp: ts.CallExpression, ctx: ParserContext): FigmaTextContent => {\n const { sourceFile } = ctx\n const layerNameArg = exp.arguments?.[0]\n assertIsStringLiteral(\n layerNameArg,\n sourceFile,\n `${name} takes a single argument which is the Figma layer name`,\n )\n\n return {\n kind: IntrinsicKind.TextContent,\n args: {\n layer: stripQuotesFromNode(layerNameArg),\n },\n }\n },\n }\n})\n\n/**\n * Parses a call expression to an intrinsic\n *\n * @param exp Expression to parse\n * @param parserContext parser context\n * @returns\n */\nexport function parseIntrinsic(exp: ts.CallExpression, parserContext: ParserContext): Intrinsic {\n for (const key in Intrinsics) {\n if (Intrinsics[key].match(exp)) {\n // Chained call expressions in TS are nested with the innermost call expression\n // being the first in the chain. We need to reverse the chain so that the intrinsic\n // is the first element in the array. The TS AST looks like this for a().b():\n // CallExpression [a().b()] ->\n // PropertyAccessExpression [a().b] ->\n // CallExpression [a()]\n\n let callChain = []\n let current: any = exp\n while (current) {\n if (ts.isCallExpression(current)) {\n callChain.push(current)\n current = current.expression\n } else if (ts.isPropertyAccessExpression(current)) {\n current = current.expression\n } else {\n current = null\n }\n }\n\n // If there's only one call expression just return the matching intrinsic\n callChain = callChain.reverse()\n if (callChain.length <= 1) {\n return Intrinsics[key].parse(exp, parserContext)\n }\n\n // The first call expression is the intrinsic itself, and any following call\n // expressions are modifiers\n const intrinsic = Intrinsics[key].parse(callChain.shift()!, parserContext)\n const modifiers = callChain.map((modifier) => parseModifier(modifier, parserContext))\n\n return {\n ...intrinsic,\n modifiers,\n }\n }\n }\n\n throw new ParserError(`Unknown intrinsic: ${exp.getText()}`, {\n node: exp,\n sourceFile: parserContext.sourceFile,\n })\n}\n\n/**\n * Replace newlines in enum values with \\\\n so that we don't output\n * broken JS with newlines inside the string\n */\nfunction replaceNewlines(str: string) {\n return str.toString().replaceAll('\\n', '\\\\n').replaceAll(\"'\", \"\\\\'\")\n}\n\nexport function valueToString(\n value: ValueMappingKind,\n childLayer?: string,\n isForMigration?: boolean,\n) {\n if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'undefined') {\n return `${value}`\n }\n\n if (typeof value === 'string') {\n return `'${replaceNewlines(value)}'`\n }\n\n if ('kind' in value) {\n // Mappings can be nested, e.g. an enum value can be figma.instance(...)\n return `${intrinsicToString(value as Intrinsic, childLayer, isForMigration)}`\n }\n\n // Convert objects to strings\n const str = typeof value.$value === 'string' ? value.$value : `${JSON.stringify(value.$value)}`\n const v = replaceNewlines(str)\n\n switch (value.$type) {\n case 'function':\n return `_fcc_function('${v}')`\n case 'identifier':\n return `_fcc_identifier('${v}')`\n case 'object':\n // Don't pass the object itself wrapped in quotes - this helper needs to instantiate the actual\n // object, as it may be used in the snippet code\n return `_fcc_object(${v})`\n case 'template-string':\n return `_fcc_templateString('${v}')`\n case 'jsx-element':\n return `_fcc_jsxElement('${v}')`\n case 'array':\n return `_fcc_array(${v})`\n default:\n throw new InternalError(`Unknown helper type: ${value}`)\n }\n}\n\nexport function valueMappingToString(\n valueMapping: ValueMapping,\n childLayer?: string,\n isForMigration?: boolean,\n): string {\n // For enums (and booleans with a valueMapping provided), convert the\n // value mapping to an object.\n return (\n '{\\n' +\n Object.entries(valueMapping)\n .map(([key, value]) => {\n return `\"${key}\": ${valueToString(value, childLayer, isForMigration)}`\n })\n .join(',\\n') +\n '}'\n )\n}\n\nlet nestedLayerCount = 0\n\nexport function intrinsicToString(\n { kind, args, modifiers = [] }: Intrinsic,\n childLayer?: string,\n isForMigration?: boolean,\n): string {\n const selector = childLayer ?? `figma.currentLayer`\n switch (kind) {\n case IntrinsicKind.String:\n return `${selector}.__properties__.string('${args.figmaPropName}')`\n case IntrinsicKind.Instance: {\n // Outputs:\n // `const propName = figma.properties.string('propName')`, or\n // `const propName = figma.properties.boolean('propName')`, or\n // `const propName = figma.properties.instance('propName')`\n if (modifiers.length > 0) {\n const instance = `${selector}.__properties__.__instance__('${args.figmaPropName}')`\n let body = `const instance = ${instance}\\n`\n body += `return instance && instance.type !== \"ERROR\" ? ${['instance', ...modifiers.map(modifierToString)].join('.')} : instance`\n return `(function () {${body}})()`\n }\n return `${selector}.__properties__.instance('${args.figmaPropName}')`\n }\n case IntrinsicKind.Boolean: {\n if (args.valueMapping) {\n const mappingString = valueMappingToString(args.valueMapping, childLayer, isForMigration)\n // Outputs: `const propName = figma.properties.boolean('propName', { ... mapping object from above ... })`\n return `${selector}.__properties__.boolean('${args.figmaPropName}', ${mappingString})`\n }\n return `${selector}.__properties__.boolean('${args.figmaPropName}')`\n }\n case IntrinsicKind.Enum: {\n const mappingString = valueMappingToString(args.valueMapping, childLayer, isForMigration)\n\n // Outputs: `const propName = figma.properties.enum('propName', { ... mapping object from above ... })`\n return `${selector}.__properties__.enum('${args.figmaPropName}', ${mappingString})`\n }\n case IntrinsicKind.Slot: {\n if (args.connectedInstances) {\n // `slot()` is undefined when the slot has no value, so guard before reading connectedInstances.\n return `(function () {\n const slot = ${selector}.__properties__.slot('${args.figmaPropName}')\n return slot ? slot.connectedInstances.map((instance) => instance.__render__()).flat() : []\n })()`\n }\n return `${selector}.__properties__.slot('${args.figmaPropName}')`\n }\n case IntrinsicKind.Children: {\n // Outputs: `const propName = figma.properties.children([\"Layer 1\", \"Layer 2\"])`\n return `${selector}.__properties__.children([${args.layers.map((layerName) => `\"${layerName}\"`).join(',')}])`\n }\n case IntrinsicKind.ClassName: {\n // Outputs: `const propName = ['btn-base', figma.currentLayer.__properties__.enum('Size, { Large: 'btn-large' })].join(\" \")`\n return `[${args.className.map((className) => (typeof className === 'string' ? `\"${className}\"` : `${intrinsicToString(className, childLayer, isForMigration)}`)).join(', ')}].filter(v => !!v).join(' ')`\n }\n case IntrinsicKind.TextContent: {\n return `${selector}.__findChildWithCriteria__({ name: '${args.layer}', type: \"TEXT\" }).__render__()`\n }\n case IntrinsicKind.NestedProps: {\n let body: string = ''\n // the actual layer name in figma could have a bunch of special characters in it,\n // and if we try to normalize it to a valid JS identifier, it could conflict with\n // other variables in the template code. So we generate a unique variable name\n // for each nested layer reference instead. The only reason it's wrapped in a funciton\n // currently is to keep the error checking out of global scope\n const nestedLayerRef = `nestedLayer${nestedLayerCount++}`\n body += `const ${nestedLayerRef} = figma.currentLayer.__find__(\"${args.layer}\")\\n`\n if (isForMigration) {\n // Generate a TypeScript-safe pattern that always returns the object shape.\n // The error case uses `undefined` per-property so the result is always\n // `{ key: T | undefined }`, avoiding the `ErrorHandle | { key: T }` union\n // that would require optional chaining at every call site.\n body += `return {\\n${Object.entries(args.props)\n .map(\n ([key, intrinsic]) =>\n `${key}: ${nestedLayerRef}.type !== \"ERROR\" ? ${intrinsicToString(intrinsic, nestedLayerRef, isForMigration)} : undefined,\\n`,\n )\n .join('')}\\n }\\n`\n } else {\n body += `return ${nestedLayerRef}.type === \"ERROR\" ? ${nestedLayerRef} : {\n${Object.entries(args.props).map(\n ([key, intrinsic]) => `${key}: ${intrinsicToString(intrinsic, nestedLayerRef, isForMigration)}\\n`,\n)}\n }\\n`\n }\n return `(function () {${body}})()`\n }\n default:\n throw new InternalError(`Unknown intrinsic: ${kind}`)\n }\n}\n\n/**\n * Converts an expression to an FCC value, which is a wrapper around the actual value that\n * includes the type information. This is used to serialize the value to JSON and then\n * deserialize it back to the correct type in the generated code.\n *\n * @param valueNode\n * @param parserContext\n * @returns\n */\nfunction expressionToFccEnumValue(\n valueNode: ts.Expression,\n parserContext: ParserContext,\n): FCCValue {\n const { sourceFile, checker } = parserContext\n\n if (ts.isParenthesizedExpression(valueNode)) {\n return expressionToFccEnumValue(valueNode.expression, parserContext)\n }\n\n if (ts.isJsxElement(valueNode) || ts.isJsxSelfClosingElement(valueNode)) {\n return _fcc_jsxElement(valueNode.getText())\n }\n\n if (ts.isArrowFunction(valueNode) || ts.isFunctionExpression(valueNode)) {\n return _fcc_function(valueNode.getText())\n }\n\n if (ts.isObjectLiteralExpression(valueNode)) {\n // should recursively convert to FCC\n return _fcc_object(parsePropsObject(valueNode, parserContext))\n }\n\n if (ts.isArrayLiteralExpression(valueNode)) {\n return _fcc_array(\n convertArrayLiteralToJs(valueNode, sourceFile, checker, (valueNode) => {\n if (ts.isCallExpression(valueNode)) {\n return parseIntrinsic(valueNode, parserContext)\n }\n return expressionToFccEnumValue(valueNode, parserContext)\n }),\n )\n }\n\n if (ts.isTemplateLiteral(valueNode)) {\n const str = valueNode.getText().replaceAll('`', '')\n return _fcc_templateString(str)\n }\n\n // Handles enums, for example `MyEnum.Value`\n if (ts.isPropertyAccessExpression(valueNode)) {\n return _fcc_identifier(valueNode.getText())\n }\n\n // Any other identifiers (except undefined) are treated as React components, for example `MyComponent`.\n // We don't support referencing other variables in props object so this should be fine.\n if (ts.isIdentifier(valueNode) && !isUndefinedType(valueNode, parserContext.checker)) {\n return _fcc_identifier(valueNode.getText())\n }\n\n // Fall back to the default conversion in `convertObjectLiteralToJs`\n return undefined\n}\n\n/**\n * Parses the `props` field in a `figma.connect()` call, returning a mapping of\n * prop names to their respective intrinsic types\n *\n * @param objectLiteral An object literal expression\n * @param parserContext Parser context\n * @returns\n */\nexport function parsePropsObject(\n objectLiteral: ts.ObjectLiteralExpression,\n parserContext: ParserContext,\n): PropMappings {\n const { sourceFile, checker } = parserContext\n return convertObjectLiteralToJs(objectLiteral, sourceFile, checker, (valueNode) => {\n if (ts.isCallExpression(valueNode)) {\n return parseIntrinsic(valueNode, parserContext)\n }\n const slotConnectedInstances = parseSlotConnectedInstances(valueNode, parserContext)\n if (slotConnectedInstances) {\n return slotConnectedInstances\n }\n return expressionToFccEnumValue(valueNode, parserContext)\n }) as PropMappings\n}\n\n// Matches `figma.slot('Prop').connectedInstances` (a property access, so it never reaches parseIntrinsic) and parses it as a Slot intrinsic flagged to render the connected instances.\nfunction parseSlotConnectedInstances(\n valueNode: ts.Expression,\n parserContext: ParserContext,\n): FigmaSlot | undefined {\n if (\n !ts.isPropertyAccessExpression(valueNode) ||\n valueNode.name.text !== 'connectedInstances' ||\n !ts.isCallExpression(valueNode.expression)\n ) {\n return undefined\n }\n\n const slotCall = valueNode.expression\n const slotIntrinsic = Intrinsics[`${API_PREFIX}.slot`]\n if (!slotIntrinsic || !slotIntrinsic.match(slotCall)) {\n return undefined\n }\n\n const intrinsic = slotIntrinsic.parse(slotCall, parserContext) as FigmaSlot\n return {\n ...intrinsic,\n args: { ...intrinsic.args, connectedInstances: true },\n }\n}\n\nexport type PropMappings = Record<string, Intrinsic>\n"]}
|
|
@@ -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;
|
|
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:
|
|
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":"
|
|
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"}
|