@figma/code-connect 1.4.8 → 1.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +39 -16
- package/dist/commands/connect.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/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/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/parser_scripts/get_swift_parser_dir.js +5 -5
- package/dist/parser_scripts/get_swift_parser_dir.js.map +1 -1
- package/figma-types-no-require.d.ts +229 -0
- package/figma-types.d.ts +11 -2
- package/package.json +7 -3
|
@@ -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":"parser_executables.d.ts","sourceRoot":"","sources":["../../src/connect/parser_executables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAEL,iCAAiC,EAGlC,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EAGrB,MAAM,2BAA2B,CAAA;AA+
|
|
1
|
+
{"version":3,"file":"parser_executables.d.ts","sourceRoot":"","sources":["../../src/connect/parser_executables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAEL,iCAAiC,EAGlC,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EAGrB,MAAM,2BAA2B,CAAA;AA+FlC,wBAAsB,UAAU,CAC9B,MAAM,EAAE,iCAAiC,EACzC,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,MAAM,mBA0LZ;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC;;EAsBhF"}
|
|
@@ -17,20 +17,28 @@ const temporaryOutputDirectoryPath = 'tmp/parser-output';
|
|
|
17
17
|
const FIRST_PARTY_PARSERS = {
|
|
18
18
|
swift: {
|
|
19
19
|
command: async (cwd, config) => {
|
|
20
|
-
|
|
20
|
+
const packagePath = await (0, get_swift_parser_dir_1.getSwiftParserDir)(cwd, config.xcodeprojPath, config.swiftPackagePath, config.sourcePackagesPath);
|
|
21
|
+
return {
|
|
22
|
+
cmd: 'swift',
|
|
23
|
+
args: ['run', '--package-path', packagePath, 'figma-swift'],
|
|
24
|
+
};
|
|
21
25
|
},
|
|
22
26
|
},
|
|
23
27
|
compose: {
|
|
24
28
|
command: async (cwd, config, mode) => {
|
|
25
29
|
const gradlewPath = await (0, get_gradlew_path_1.getGradleWrapperPath)(cwd, config.gradleWrapperPath);
|
|
26
30
|
const gradleExecutableInvocation = (0, get_gradlew_path_1.getGradleWrapperExecutablePath)(gradlewPath);
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const verbose = Boolean(config.verbose);
|
|
32
|
+
const task = mode === 'CREATE' ? 'createCodeConnect' : 'parseCodeConnect';
|
|
33
|
+
const args = [
|
|
34
|
+
'-p',
|
|
35
|
+
gradlewPath,
|
|
36
|
+
task,
|
|
37
|
+
`-PfilePath=${temporaryInputFilePath}`,
|
|
38
|
+
...(verbose ? ['--stacktrace'] : []),
|
|
39
|
+
`-PoutputDir=${temporaryOutputDirectoryPath}`,
|
|
40
|
+
];
|
|
41
|
+
return { cmd: gradleExecutableInvocation, args };
|
|
34
42
|
},
|
|
35
43
|
temporaryInputFilePath: temporaryInputFilePath,
|
|
36
44
|
temporaryOutputDirectoryPath: temporaryOutputDirectoryPath,
|
|
@@ -41,11 +49,15 @@ const FIRST_PARTY_PARSERS = {
|
|
|
41
49
|
(0, logging_1.exitWithError)('No `parserCommand` specified in config. A command is required when using the `custom` parser.');
|
|
42
50
|
}
|
|
43
51
|
logging_1.logger.info('Using custom parser command: ' + config.parserCommand);
|
|
44
|
-
|
|
52
|
+
// Keep user quoting intact for free-form custom commands.
|
|
53
|
+
return { cmd: config.parserCommand, args: [], shell: true };
|
|
45
54
|
},
|
|
46
55
|
},
|
|
47
56
|
__unit_test__: {
|
|
48
|
-
command: async () =>
|
|
57
|
+
command: async () => ({
|
|
58
|
+
cmd: 'node',
|
|
59
|
+
args: ['parser/unit_test_parser.js'],
|
|
60
|
+
}),
|
|
49
61
|
},
|
|
50
62
|
};
|
|
51
63
|
function getParser(config) {
|
|
@@ -73,10 +85,10 @@ async function callParser(config, payload, cwd) {
|
|
|
73
85
|
if (parser.temporaryOutputDirectoryPath) {
|
|
74
86
|
fs_1.default.mkdirSync(parser.temporaryOutputDirectoryPath, { recursive: true });
|
|
75
87
|
}
|
|
76
|
-
logging_1.logger.debug(`Running parser: ${command}`);
|
|
77
|
-
const
|
|
78
|
-
const child = (0, cross_spawn_1.spawn)(commandSplit[0], commandSplit.slice(1), {
|
|
88
|
+
logging_1.logger.debug(`Running parser: ${command.cmd} ${command.args.join(' ')}`);
|
|
89
|
+
const child = (0, cross_spawn_1.spawn)(command.cmd, command.args, {
|
|
79
90
|
cwd,
|
|
91
|
+
shell: command.shell,
|
|
80
92
|
});
|
|
81
93
|
let stdout = '';
|
|
82
94
|
let stderr = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser_executables.js","sourceRoot":"","sources":["../../src/connect/parser_executables.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { exitWithError, logger } from '../common/logging'\nimport {\n CodeConnectCustomExecutableParserConfig,\n CodeConnectExecutableParserConfig,\n CodeConnectExecutableParser,\n CodeConnectParser,\n} from './project'\nimport {\n ParserExecutableMessages,\n ParserRequestPayload,\n ParseResponsePayload,\n CreateResponsePayload,\n} from './parser_executable_types'\nimport { spawn } from 'cross-spawn'\nimport { getSwiftParserDir } from '../parser_scripts/get_swift_parser_dir'\nimport fs from 'fs'\nimport path from 'path'\nimport {\n getGradleWrapperExecutablePath,\n getGradleWrapperPath,\n} from '../parser_scripts/get_gradlew_path'\nimport { getComposeErrorSuggestion } from '../parser_scripts/compose_errors'\n\nconst temporaryInputFilePath = 'tmp/figma-code-connect-parser-io.json.tmp'\nconst temporaryOutputDirectoryPath = 'tmp/parser-output'\n\ntype ParserInfo = {\n command: (\n cwd: string,\n config: CodeConnectExecutableParserConfig | CodeConnectCustomExecutableParserConfig,\n mode: ParserRequestPayload['mode'],\n ) => Promise<string>\n temporaryInputFilePath?: string\n temporaryOutputDirectoryPath?: string\n}\n\nconst FIRST_PARTY_PARSERS: Record<CodeConnectExecutableParser, ParserInfo> = {\n swift: {\n command: async (cwd, config) => {\n return `swift run --package-path ${await getSwiftParserDir(\n cwd,\n (config as any).xcodeprojPath,\n (config as any).swiftPackagePath,\n (config as any).sourcePackagesPath,\n )} figma-swift`\n },\n },\n compose: {\n command: async (cwd, config, mode) => {\n const gradlewPath = await getGradleWrapperPath(cwd, (config as any).gradleWrapperPath)\n const gradleExecutableInvocation = getGradleWrapperExecutablePath(gradlewPath)\n const verboseFlags = (config as any).verbose ? ' --stacktrace' : ''\n if (mode === 'CREATE') {\n return `${gradleExecutableInvocation} -p ${gradlewPath} createCodeConnect -PfilePath=${temporaryInputFilePath}${verboseFlags} -PoutputDir=${temporaryOutputDirectoryPath}`\n } else {\n return `${gradleExecutableInvocation} -p ${gradlewPath} parseCodeConnect -PfilePath=${temporaryInputFilePath}${verboseFlags} -PoutputDir=${temporaryOutputDirectoryPath}`\n }\n },\n temporaryInputFilePath: temporaryInputFilePath,\n temporaryOutputDirectoryPath: temporaryOutputDirectoryPath,\n },\n custom: {\n command: async (cwd, config) => {\n if (!('parserCommand' in config)) {\n exitWithError(\n 'No `parserCommand` specified in config. A command is required when using the `custom` parser.',\n )\n }\n logger.info('Using custom parser command: ' + config.parserCommand)\n return config.parserCommand\n },\n },\n __unit_test__: {\n command: async () => 'node parser/unit_test_parser.js',\n },\n}\n\nfunction getParser(config: CodeConnectExecutableParserConfig): ParserInfo | never {\n const parser = FIRST_PARTY_PARSERS[config.parser]\n\n if (!parser) {\n exitWithError(\n `Invalid parser specified: \"${config.parser}\". Valid parsers are: ${Object.keys(\n FIRST_PARTY_PARSERS,\n ).join(', ')}.`,\n )\n }\n\n return parser\n}\n\nexport async function callParser(\n config: CodeConnectExecutableParserConfig,\n payload: ParserRequestPayload,\n cwd: string,\n) {\n return new Promise<object>(async (resolve, reject) => {\n try {\n const parser = getParser(config)\n const configWithVerbose = {\n ...config,\n verbose: (payload as any).verbose,\n }\n\n const command = await parser.command(cwd, configWithVerbose, payload.mode)\n\n // Create temporary input file if it exists\n if (parser.temporaryInputFilePath) {\n fs.mkdirSync(path.dirname(parser.temporaryInputFilePath), { recursive: true })\n fs.writeFileSync(parser.temporaryInputFilePath, JSON.stringify(payload))\n }\n\n // Create temporary output directory if it exists\n if (parser.temporaryOutputDirectoryPath) {\n fs.mkdirSync(parser.temporaryOutputDirectoryPath, { recursive: true })\n }\n\n logger.debug(`Running parser: ${command}`)\n const commandSplit = command.split(' ')\n\n const child = spawn(commandSplit[0], commandSplit.slice(1), {\n cwd,\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout.on('data', (data) => {\n stdout += data.toString()\n })\n\n // This handles any stderr output from the parser.\n //\n // Parsers should not generally write to stderr, and should instead return\n // an array of messages at the end of execution, but there are cases where\n // you might want to log output immediately rather than at the end of the\n // run - e.g. if the parser can take a while to compile first time, you\n // might want to inform the user immediately that it is compiling.\n //\n // To log output, the parser should write a JSON object to stderr with the\n // same structure as the `messages` response object, e.g. `{ \"level\":\n // \"INFO\", \"message\": \"Compiling parser...\" }`.\n //\n // Non-JSON output will be logged as debug messages, as this is likely to\n // be e.g. compiler output which the user doesn't need to see ordinarily.\n child.stderr.on('data', (data) => {\n const message = data.toString()\n const trimmedMessage = message.trim()\n try {\n const parsed = JSON.parse(trimmedMessage)\n handleMessages([parsed])\n } catch (e) {\n stderr += message\n logger.debug(trimmedMessage)\n }\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n const errorSuggestion = determineErrorSuggestionFromStderr(stderr, config.parser)\n if (errorSuggestion) {\n reject(new Error(`Parser exited with code ${code}: ${errorSuggestion}`))\n } else {\n reject(new Error(`Parser exited with code ${code}`))\n }\n } else {\n // List the files in the temporary output directory if it exists and log them\n if (parser.temporaryOutputDirectoryPath) {\n try {\n const outputDir = parser.temporaryOutputDirectoryPath\n if (fs.existsSync(outputDir)) {\n const files = fs.readdirSync(outputDir)\n logger.debug(\n `Files in temporary output directory (${outputDir}): ${files.length > 0 ? files.join(', ') : '[empty]'}`,\n )\n\n // Combine all JSON files in the output directory into a single JSON object.\n // For PARSE responses: Each file has a \"docs\" array and a \"messages\" array.\n // For CREATE responses: Each file has a \"createdFiles\" array and a \"messages\" array.\n // The combined output will have a single array of the appropriate type and a single \"messages\" array.\n\n // Filter for .json files only\n const jsonFiles = files.filter((f) => f.endsWith('.json'))\n let allMessages: z.infer<typeof ParserExecutableMessages> = []\n const uniqueDocsMap = new Map<\n string,\n z.infer<typeof ParseResponsePayload>['docs'][number]\n >()\n let allCreatedFiles: z.infer<typeof CreateResponsePayload>['createdFiles'] = []\n\n for (const file of jsonFiles) {\n const filePath = path.join(outputDir, file)\n try {\n const content = fs.readFileSync(filePath, 'utf8')\n const parsed = JSON.parse(content)\n if (Array.isArray(parsed.docs)) {\n // Deduplicate docs based on figmaNode + template\n // The template contains the actual code example and is unique per component.\n // This allows multiple different code components to map to the same Figma node,\n // while preventing the same component from being duplicated in multi-module projects.\n for (const doc of parsed.docs) {\n const dedupeKey = JSON.stringify({\n figmaNode: doc.figmaNode,\n template: doc.template,\n })\n if (!uniqueDocsMap.has(dedupeKey)) {\n uniqueDocsMap.set(dedupeKey, doc)\n }\n }\n }\n if (Array.isArray(parsed.createdFiles)) {\n allCreatedFiles = allCreatedFiles.concat(parsed.createdFiles)\n }\n if (Array.isArray(parsed.messages)) {\n allMessages = allMessages.concat(parsed.messages)\n }\n } catch (err) {\n logger.warn(`Failed to parse output file ${file}: ${err}`)\n }\n }\n\n const allDocs = Array.from(uniqueDocsMap.values())\n\n // Return the appropriate response based on the mode\n if (payload.mode === 'CREATE') {\n resolve({\n createdFiles: allCreatedFiles,\n messages: allMessages,\n })\n } else {\n resolve({\n docs: allDocs,\n messages: allMessages,\n })\n }\n } else {\n logger.debug(`Temporary output directory (${outputDir}) does not exist.`)\n }\n } catch (err) {\n logger.warn(`Failed to list files in temporary output directory: ${err}`)\n }\n } else {\n // Assume the output is in the stdout\n resolve(JSON.parse(stdout))\n }\n }\n\n if (parser.temporaryInputFilePath) {\n // Retain temp file and directory when verbose mode is enabled\n if (!(payload as any).verbose) {\n fs.unlinkSync(parser.temporaryInputFilePath)\n // Delete parent directory if empty after removing temp file\n const parentDir = path.dirname(parser.temporaryInputFilePath)\n if (fs.readdirSync(parentDir).length === 0) {\n fs.rmdirSync(parentDir)\n }\n }\n }\n })\n\n child.on('error', (e) => {\n reject(e)\n })\n if (!parser.temporaryInputFilePath) {\n child.stdin.write(JSON.stringify(payload))\n child.stdin.end()\n }\n } catch (e) {\n if ((payload as any).verbose) {\n console.trace(e)\n\n // Don't say to enable verbose if the user has already enabled it.\n exitWithError(`Error calling parser: ${e}.`)\n } else {\n exitWithError(\n `Error calling parser: ${e}. Try re-running the command with --verbose for more information.`,\n )\n }\n }\n })\n}\n\nexport function handleMessages(messages: z.infer<typeof ParserExecutableMessages>) {\n let hasErrors = false\n\n messages.forEach((message) => {\n switch (message.level) {\n case 'DEBUG':\n logger.debug(message.message)\n break\n case 'INFO':\n logger.info(message.message)\n break\n case 'WARN':\n logger.warn(message.message)\n break\n case 'ERROR':\n logger.error(message.message)\n hasErrors = true\n break\n }\n })\n\n return { hasErrors }\n}\n\n// This function is used to determine if there is a suggestion for the error based on the output\n// to stderr. Certain parsers return the same error code for different types of errors such as\n// errors from invoking the gradle wrapper for Compose.\n// In the future we should consider exposing a different API for having the parser return a suggestion directly.\nfunction determineErrorSuggestionFromStderr(\n stderr: string,\n parser: CodeConnectParser,\n): string | null {\n if (parser === 'compose') {\n return getComposeErrorSuggestion(stderr)\n }\n return null\n}\n"]}
|
|
1
|
+
{"version":3,"file":"parser_executables.js","sourceRoot":"","sources":["../../src/connect/parser_executables.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { exitWithError, logger } from '../common/logging'\nimport {\n CodeConnectCustomExecutableParserConfig,\n CodeConnectExecutableParserConfig,\n CodeConnectExecutableParser,\n CodeConnectParser,\n} from './project'\nimport {\n ParserExecutableMessages,\n ParserRequestPayload,\n ParseResponsePayload,\n CreateResponsePayload,\n} from './parser_executable_types'\nimport { spawn } from 'cross-spawn'\nimport { getSwiftParserDir } from '../parser_scripts/get_swift_parser_dir'\nimport fs from 'fs'\nimport path from 'path'\nimport {\n getGradleWrapperExecutablePath,\n getGradleWrapperPath,\n} from '../parser_scripts/get_gradlew_path'\nimport { getComposeErrorSuggestion } from '../parser_scripts/compose_errors'\n\nconst temporaryInputFilePath = 'tmp/figma-code-connect-parser-io.json.tmp'\nconst temporaryOutputDirectoryPath = 'tmp/parser-output'\n\n// Parser invocation in argv form; only custom parser uses shell.\ntype ParserCommand = { cmd: string; args: string[]; shell?: boolean }\n\ntype ParserInfo = {\n command: (\n cwd: string,\n config: CodeConnectExecutableParserConfig | CodeConnectCustomExecutableParserConfig,\n mode: ParserRequestPayload['mode'],\n ) => Promise<ParserCommand>\n temporaryInputFilePath?: string\n temporaryOutputDirectoryPath?: string\n}\n\nconst FIRST_PARTY_PARSERS: Record<CodeConnectExecutableParser, ParserInfo> = {\n swift: {\n command: async (cwd, config) => {\n const packagePath = await getSwiftParserDir(\n cwd,\n (config as any).xcodeprojPath,\n (config as any).swiftPackagePath,\n (config as any).sourcePackagesPath,\n )\n return {\n cmd: 'swift',\n args: ['run', '--package-path', packagePath, 'figma-swift'],\n }\n },\n },\n compose: {\n command: async (cwd, config, mode) => {\n const gradlewPath = await getGradleWrapperPath(cwd, (config as any).gradleWrapperPath)\n const gradleExecutableInvocation = getGradleWrapperExecutablePath(gradlewPath)\n const verbose = Boolean((config as any).verbose)\n const task = mode === 'CREATE' ? 'createCodeConnect' : 'parseCodeConnect'\n const args = [\n '-p',\n gradlewPath,\n task,\n `-PfilePath=${temporaryInputFilePath}`,\n ...(verbose ? ['--stacktrace'] : []),\n `-PoutputDir=${temporaryOutputDirectoryPath}`,\n ]\n return { cmd: gradleExecutableInvocation, args }\n },\n temporaryInputFilePath: temporaryInputFilePath,\n temporaryOutputDirectoryPath: temporaryOutputDirectoryPath,\n },\n custom: {\n command: async (cwd, config) => {\n if (!('parserCommand' in config)) {\n exitWithError(\n 'No `parserCommand` specified in config. A command is required when using the `custom` parser.',\n )\n }\n logger.info('Using custom parser command: ' + config.parserCommand)\n // Keep user quoting intact for free-form custom commands.\n return { cmd: config.parserCommand, args: [], shell: true }\n },\n },\n __unit_test__: {\n command: async () => ({\n cmd: 'node',\n args: ['parser/unit_test_parser.js'],\n }),\n },\n}\n\nfunction getParser(config: CodeConnectExecutableParserConfig): ParserInfo | never {\n const parser = FIRST_PARTY_PARSERS[config.parser]\n\n if (!parser) {\n exitWithError(\n `Invalid parser specified: \"${config.parser}\". Valid parsers are: ${Object.keys(\n FIRST_PARTY_PARSERS,\n ).join(', ')}.`,\n )\n }\n\n return parser\n}\n\nexport async function callParser(\n config: CodeConnectExecutableParserConfig,\n payload: ParserRequestPayload,\n cwd: string,\n) {\n return new Promise<object>(async (resolve, reject) => {\n try {\n const parser = getParser(config)\n const configWithVerbose = {\n ...config,\n verbose: (payload as any).verbose,\n }\n\n const command = await parser.command(cwd, configWithVerbose, payload.mode)\n\n // Create temporary input file if it exists\n if (parser.temporaryInputFilePath) {\n fs.mkdirSync(path.dirname(parser.temporaryInputFilePath), { recursive: true })\n fs.writeFileSync(parser.temporaryInputFilePath, JSON.stringify(payload))\n }\n\n // Create temporary output directory if it exists\n if (parser.temporaryOutputDirectoryPath) {\n fs.mkdirSync(parser.temporaryOutputDirectoryPath, { recursive: true })\n }\n\n logger.debug(`Running parser: ${command.cmd} ${command.args.join(' ')}`)\n\n const child = spawn(command.cmd, command.args, {\n cwd,\n shell: command.shell,\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout.on('data', (data) => {\n stdout += data.toString()\n })\n\n // This handles any stderr output from the parser.\n //\n // Parsers should not generally write to stderr, and should instead return\n // an array of messages at the end of execution, but there are cases where\n // you might want to log output immediately rather than at the end of the\n // run - e.g. if the parser can take a while to compile first time, you\n // might want to inform the user immediately that it is compiling.\n //\n // To log output, the parser should write a JSON object to stderr with the\n // same structure as the `messages` response object, e.g. `{ \"level\":\n // \"INFO\", \"message\": \"Compiling parser...\" }`.\n //\n // Non-JSON output will be logged as debug messages, as this is likely to\n // be e.g. compiler output which the user doesn't need to see ordinarily.\n child.stderr.on('data', (data) => {\n const message = data.toString()\n const trimmedMessage = message.trim()\n try {\n const parsed = JSON.parse(trimmedMessage)\n handleMessages([parsed])\n } catch (e) {\n stderr += message\n logger.debug(trimmedMessage)\n }\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n const errorSuggestion = determineErrorSuggestionFromStderr(stderr, config.parser)\n if (errorSuggestion) {\n reject(new Error(`Parser exited with code ${code}: ${errorSuggestion}`))\n } else {\n reject(new Error(`Parser exited with code ${code}`))\n }\n } else {\n // List the files in the temporary output directory if it exists and log them\n if (parser.temporaryOutputDirectoryPath) {\n try {\n const outputDir = parser.temporaryOutputDirectoryPath\n if (fs.existsSync(outputDir)) {\n const files = fs.readdirSync(outputDir)\n logger.debug(\n `Files in temporary output directory (${outputDir}): ${files.length > 0 ? files.join(', ') : '[empty]'}`,\n )\n\n // Combine all JSON files in the output directory into a single JSON object.\n // For PARSE responses: Each file has a \"docs\" array and a \"messages\" array.\n // For CREATE responses: Each file has a \"createdFiles\" array and a \"messages\" array.\n // The combined output will have a single array of the appropriate type and a single \"messages\" array.\n\n // Filter for .json files only\n const jsonFiles = files.filter((f) => f.endsWith('.json'))\n let allMessages: z.infer<typeof ParserExecutableMessages> = []\n const uniqueDocsMap = new Map<\n string,\n z.infer<typeof ParseResponsePayload>['docs'][number]\n >()\n let allCreatedFiles: z.infer<typeof CreateResponsePayload>['createdFiles'] = []\n\n for (const file of jsonFiles) {\n const filePath = path.join(outputDir, file)\n try {\n const content = fs.readFileSync(filePath, 'utf8')\n const parsed = JSON.parse(content)\n if (Array.isArray(parsed.docs)) {\n // Deduplicate docs based on figmaNode + template\n // The template contains the actual code example and is unique per component.\n // This allows multiple different code components to map to the same Figma node,\n // while preventing the same component from being duplicated in multi-module projects.\n for (const doc of parsed.docs) {\n const dedupeKey = JSON.stringify({\n figmaNode: doc.figmaNode,\n template: doc.template,\n })\n if (!uniqueDocsMap.has(dedupeKey)) {\n uniqueDocsMap.set(dedupeKey, doc)\n }\n }\n }\n if (Array.isArray(parsed.createdFiles)) {\n allCreatedFiles = allCreatedFiles.concat(parsed.createdFiles)\n }\n if (Array.isArray(parsed.messages)) {\n allMessages = allMessages.concat(parsed.messages)\n }\n } catch (err) {\n logger.warn(`Failed to parse output file ${file}: ${err}`)\n }\n }\n\n const allDocs = Array.from(uniqueDocsMap.values())\n\n // Return the appropriate response based on the mode\n if (payload.mode === 'CREATE') {\n resolve({\n createdFiles: allCreatedFiles,\n messages: allMessages,\n })\n } else {\n resolve({\n docs: allDocs,\n messages: allMessages,\n })\n }\n } else {\n logger.debug(`Temporary output directory (${outputDir}) does not exist.`)\n }\n } catch (err) {\n logger.warn(`Failed to list files in temporary output directory: ${err}`)\n }\n } else {\n // Assume the output is in the stdout\n resolve(JSON.parse(stdout))\n }\n }\n\n if (parser.temporaryInputFilePath) {\n // Retain temp file and directory when verbose mode is enabled\n if (!(payload as any).verbose) {\n fs.unlinkSync(parser.temporaryInputFilePath)\n // Delete parent directory if empty after removing temp file\n const parentDir = path.dirname(parser.temporaryInputFilePath)\n if (fs.readdirSync(parentDir).length === 0) {\n fs.rmdirSync(parentDir)\n }\n }\n }\n })\n\n child.on('error', (e) => {\n reject(e)\n })\n if (!parser.temporaryInputFilePath) {\n child.stdin.write(JSON.stringify(payload))\n child.stdin.end()\n }\n } catch (e) {\n if ((payload as any).verbose) {\n console.trace(e)\n\n // Don't say to enable verbose if the user has already enabled it.\n exitWithError(`Error calling parser: ${e}.`)\n } else {\n exitWithError(\n `Error calling parser: ${e}. Try re-running the command with --verbose for more information.`,\n )\n }\n }\n })\n}\n\nexport function handleMessages(messages: z.infer<typeof ParserExecutableMessages>) {\n let hasErrors = false\n\n messages.forEach((message) => {\n switch (message.level) {\n case 'DEBUG':\n logger.debug(message.message)\n break\n case 'INFO':\n logger.info(message.message)\n break\n case 'WARN':\n logger.warn(message.message)\n break\n case 'ERROR':\n logger.error(message.message)\n hasErrors = true\n break\n }\n })\n\n return { hasErrors }\n}\n\n// This function is used to determine if there is a suggestion for the error based on the output\n// to stderr. Certain parsers return the same error code for different types of errors such as\n// errors from invoking the gradle wrapper for Compose.\n// In the future we should consider exposing a different API for having the parser return a suggestion directly.\nfunction determineErrorSuggestionFromStderr(\n stderr: string,\n parser: CodeConnectParser,\n): string | null {\n if (parser === 'compose') {\n return getComposeErrorSuggestion(stderr)\n }\n return null\n}\n"]}
|
|
@@ -21,16 +21,16 @@ async function getSwiftParserDir(cwd, xcodeprojPath, swiftPackagePath, sourcePac
|
|
|
21
21
|
let figmaPackageDir;
|
|
22
22
|
let xcodeprojFile;
|
|
23
23
|
let packageSwiftFile;
|
|
24
|
-
//
|
|
24
|
+
// Keep raw paths; argv-form spawn handles spaces without shell escaping.
|
|
25
25
|
if (xcodeprojPath) {
|
|
26
|
-
xcodeprojFile = xcodeprojPath
|
|
26
|
+
xcodeprojFile = xcodeprojPath;
|
|
27
27
|
}
|
|
28
28
|
else if (swiftPackagePath) {
|
|
29
|
-
packageSwiftFile = path_1.default.dirname(swiftPackagePath)
|
|
29
|
+
packageSwiftFile = path_1.default.dirname(swiftPackagePath);
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
|
-
xcodeprojFile = (0, get_file_if_exists_1.getFileIfExists)(cwd, '*.xcodeproj')
|
|
33
|
-
packageSwiftFile = (0, get_file_if_exists_1.getFileIfExists)(cwd, 'Package.swift')
|
|
32
|
+
xcodeprojFile = (0, get_file_if_exists_1.getFileIfExists)(cwd, '*.xcodeproj');
|
|
33
|
+
packageSwiftFile = (0, get_file_if_exists_1.getFileIfExists)(cwd, 'Package.swift');
|
|
34
34
|
}
|
|
35
35
|
if (!(xcodeprojFile || packageSwiftFile)) {
|
|
36
36
|
(0, logging_1.exitWithError)('No supported project found. Supported project types are .xcodeproj or Package.swift. You can specify the location of your .xcodeproj file with the `xcodeprojPath` config option.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get_swift_parser_dir.js","sourceRoot":"","sources":["../../src/parser_scripts/get_swift_parser_dir.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from 'child_process'\nimport { exitWithError, logger } from '../common/logging'\nimport { getFileIfExists } from './get_file_if_exists'\nimport path from 'path'\nimport { readdirSync, existsSync } from 'fs'\n\n// Find the location of the Code Connect Swift package on disk, so that we can\n// call `swift run figma-swift` from the correct location. This requires parsing\n// the output of xcodebuild for .xcodeproj projects, or parsing Package.swift\n// for SPM projects.\n//\n// As this is a first party parser, we do this in TypeScript and call it as part\n// of our code. For third party parsers, logic like this would need to be\n// implemented in a script/binary which the user points Code Connect to.\nexport async function getSwiftParserDir(\n cwd: string,\n xcodeprojPath?: string,\n swiftPackagePath?: string,\n sourcePackagesPath?: string,\n) {\n let figmaPackageDir: string | undefined\n let xcodeprojFile: string | undefined\n let packageSwiftFile: string | undefined\n\n // // Check for the supported project types giving precedence top the user provided path\n if (xcodeprojPath) {\n xcodeprojFile = xcodeprojPath.replace(/\\s/g, '\\\\ ')\n } else if (swiftPackagePath) {\n packageSwiftFile = path.dirname(swiftPackagePath).replace(/\\s/g, '\\\\ ')\n } else {\n xcodeprojFile = getFileIfExists(cwd, '*.xcodeproj').replace(/\\s/g, '\\\\ ')\n packageSwiftFile = getFileIfExists(cwd, 'Package.swift').replace(/\\s/g, '\\\\ ')\n }\n\n if (!(xcodeprojFile || packageSwiftFile)) {\n exitWithError(\n 'No supported project found. Supported project types are .xcodeproj or Package.swift. You can specify the location of your .xcodeproj file with the `xcodeprojPath` config option.',\n )\n }\n\n if (xcodeprojFile) {\n // Use xcodebuild to get the build settings, so we can find where the Code\n // Connect Swift package is installed\n const result = spawnSync('xcodebuild', ['-project', xcodeprojFile, '-showBuildSettings'], {\n cwd,\n encoding: 'utf-8',\n })\n\n if (result.error) {\n throw result.error\n }\n\n const buildSettings = result.stdout\n\n // Extract the source and version of the Code Connect Swift package from the\n // xcodebuild output, which can be in any of the following formats depending\n // on how it is installed:\n // - Figma: https://github.com/figma/code-connect @ 0.1.2\n // - Figma: /path/to/code-connect @ local\n // - Figma: /path/to/code-connect\n const figmaPackageMatch = buildSettings.match(/\\s+Figma: ([^\\s]*)(?: @ (.*))?/)\n if (!figmaPackageMatch) {\n exitWithError(\n 'Code Connect Swift package not found. Please add a dependency to the Code Connect package at https://github.com/figma/code-connect to your project.',\n )\n }\n\n // Find the package's location on disk, to compile and run the parser binary from\n const [_, figmaPackageSource, figmaPackageVersion] = figmaPackageMatch\n // The package version is `local` if installed via the \"Add package\" dialog,\n // or undefined if installed via the \"Frameworks\" section directly (which we\n // do for our test project, because the dialog won't allow ancestors to be\n // added)\n const isLocalFigmaPackage = figmaPackageVersion === 'local' || figmaPackageVersion === undefined\n\n if (isLocalFigmaPackage) {\n // If the version is 'local', the package is installed from a local checkout,\n // and the path on disk is the source output by xcodebuild.\n figmaPackageDir = figmaPackageSource\n } else if (sourcePackagesPath) {\n logger.info(`Using custom DerivedData path: ${sourcePackagesPath}`)\n\n // If a custom path is supplied, use it.\n figmaPackageDir = `${sourcePackagesPath}/checkouts/code-connect`\n } else {\n // Otherwise the SourcePackages will typically be located in Xcode's DerivedData directory,\n // at ~/Users/{username}/Library/Developer/Xcode/DerivedData/{project}-{xxx}/SourcePackages, or in the Project's root\n // at {project}/DerivedData/{project}/SourcePackages (depending on how the user's project is configured).\n let hasFoundSourcePackagesDir = false\n\n // 1. First look in the USER_LIBRARY_DIR (e.g. /Users/{username}/Library)\n const userLibraryDirectoryMatch = buildSettings.match(/\\s+USER_LIBRARY_DIR = (.*)/)\n const userLibraryDirectory = userLibraryDirectoryMatch\n ? userLibraryDirectoryMatch[1]\n : undefined\n\n logger.info('Finding Code Connect Swift package')\n\n // Find the project's name using the build settings\n const projectNameMatch = buildSettings.match(/\\s+PROJECT_NAME = (.*)/)\n const projectName = projectNameMatch ? projectNameMatch[1] : undefined\n\n // We can't proceed without the project name (however, this should always exist)\n if (!projectName) {\n exitWithError('PROJECT_NAME not found in xcodebuild output')\n }\n\n // 1. From the folders in the user library directory use a regex to determine the folder name of the project defined by \"ProjectName-\" and a 28 character hash\n // e.g. project-fbybcbnivxfbfeefownexgukzwxd\n if (userLibraryDirectory) {\n // Default to Xcode's default Dervied Data location (e.g. ~/Users/{username}/Library/Developer/Xcode/DerivedData/project-fbybcbnivxfbfeefownexgukzwxd/SourcePackages)\n const root = `${userLibraryDirectory}/Developer/Xcode/DerivedData`\n\n const projectFolderRegex = new RegExp(`${projectName}-[a-zA-Z0-9]{28}`)\n const derivedDataFolders = readdirSync(root)\n const projectFolder = derivedDataFolders.find((folder: string) =>\n projectFolderRegex.test(folder),\n )\n\n // If the project folder is found, use it to find the Code Connect package\n if (projectFolder) {\n figmaPackageDir = `${root}/${projectFolder}/SourcePackages/checkouts/code-connect`\n hasFoundSourcePackagesDir = true\n } else {\n logger.warn('Package not found in user library directory')\n }\n }\n\n // 2. If SourcePackages couldn't be found in ~/Users/{username}/Library/Developer/Xcode/DerivedData/{project}-{xxx}/SourcePackages, attempt\n // to find it in the project root {project}/DerivedData/{project}/SourcePackages\n if (!hasFoundSourcePackagesDir) {\n const rootDir = buildSettings.match(/\\s+LOCROOT = (.*)/)\n\n if (rootDir) {\n figmaPackageDir = `${rootDir[1]}/DerivedData/${projectName}/SourcePackages/checkouts/code-connect`\n hasFoundSourcePackagesDir = true\n } else {\n logger.warn('Package not found in project root')\n }\n }\n\n // 3. Otherwise, the package may be installed to\n // <DerviedData>/SourcePackages/checkouts/code-connect. We find the\n // DerivedData location from the BUILD_DIR (which points to\n // <DerivedData>/Build/Products).\n if (!hasFoundSourcePackagesDir) {\n const buildDir = buildSettings.match(/\\s+BUILD_DIR = (.*)/)\n\n if (buildDir) {\n figmaPackageDir = `${buildDir[1]}/../../SourcePackages/checkouts/code-connect`\n } else {\n logger.warn('Package not found in build directory')\n }\n }\n }\n } else if (packageSwiftFile) {\n const swiftPackageDir = swiftPackagePath ? path.dirname(swiftPackagePath) : undefined\n const packageDir = swiftPackageDir || cwd\n // Use the Swift command to determine if the package is installed locally or from Git\n try {\n const result = spawnSync(\n 'swift',\n ['package', '--package-path', packageDir, 'describe', '--type', 'json'],\n {\n cwd,\n encoding: 'utf-8',\n },\n )\n\n if (result.error) {\n throw result.error\n }\n\n const packageInfo = JSON.parse(result.stdout)\n\n const codeConnectPackage =\n packageInfo.dependencies.find((p: any) => p.identity === 'code-connect') ??\n // Our local directory is called figmadoc, so this is what swift outputs as the identity\n packageInfo.dependencies.find((p: any) => p.identity === 'figmadoc')\n\n if (!codeConnectPackage) {\n exitWithError(\n 'Code Connect Swift package not found in Package.swift. Please add a dependency to https://github.com/figma/code-connect to your Package.swift file.',\n )\n }\n\n // We can run directly from the directory of the package swift file\n figmaPackageDir = packageDir\n } catch (e) {\n exitWithError(`Error calling Swift command: ${e}`)\n }\n }\n\n if (!figmaPackageDir) {\n exitWithError('Figma package could not be found')\n }\n\n // Check if the figmaPackageDir exists, otherwise we can't proceed,\n // as we require the code-connect package to continue\n if (!existsSync(figmaPackageDir)) {\n exitWithError(`Figma package directory not found at ${figmaPackageDir}`)\n }\n\n // We need to ensure that the directory is writable, so we can run the swift run command\n // otherwise an \"invalid access\" error will be thrown by swift.\n try {\n const packageFile = path.join(figmaPackageDir, 'Package.resolved')\n\n const accessCheck = spawnSync('test', ['-w', packageFile])\n if (accessCheck.status !== 0) {\n // Directory is not writable, attempt to make it writable\n spawnSync('chmod', ['-R', '755', packageFile])\n }\n logger.info(`Directory enabled for swift run command`)\n } catch (e) {\n logger.warn(`Unable to verify or modify directory permissions: ${e}`)\n }\n\n logger.info(\n `Found Code Connect Swift package at ${figmaPackageDir}, building parser binary. This may take a few minutes if this is the first time you've run Code Connect.`,\n )\n\n return figmaPackageDir\n}\n"]}
|
|
1
|
+
{"version":3,"file":"get_swift_parser_dir.js","sourceRoot":"","sources":["../../src/parser_scripts/get_swift_parser_dir.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from 'child_process'\nimport { exitWithError, logger } from '../common/logging'\nimport { getFileIfExists } from './get_file_if_exists'\nimport path from 'path'\nimport { readdirSync, existsSync } from 'fs'\n\n// Find the location of the Code Connect Swift package on disk, so that we can\n// call `swift run figma-swift` from the correct location. This requires parsing\n// the output of xcodebuild for .xcodeproj projects, or parsing Package.swift\n// for SPM projects.\n//\n// As this is a first party parser, we do this in TypeScript and call it as part\n// of our code. For third party parsers, logic like this would need to be\n// implemented in a script/binary which the user points Code Connect to.\nexport async function getSwiftParserDir(\n cwd: string,\n xcodeprojPath?: string,\n swiftPackagePath?: string,\n sourcePackagesPath?: string,\n) {\n let figmaPackageDir: string | undefined\n let xcodeprojFile: string | undefined\n let packageSwiftFile: string | undefined\n\n // Keep raw paths; argv-form spawn handles spaces without shell escaping.\n if (xcodeprojPath) {\n xcodeprojFile = xcodeprojPath\n } else if (swiftPackagePath) {\n packageSwiftFile = path.dirname(swiftPackagePath)\n } else {\n xcodeprojFile = getFileIfExists(cwd, '*.xcodeproj')\n packageSwiftFile = getFileIfExists(cwd, 'Package.swift')\n }\n\n if (!(xcodeprojFile || packageSwiftFile)) {\n exitWithError(\n 'No supported project found. Supported project types are .xcodeproj or Package.swift. You can specify the location of your .xcodeproj file with the `xcodeprojPath` config option.',\n )\n }\n\n if (xcodeprojFile) {\n // Use xcodebuild to get the build settings, so we can find where the Code\n // Connect Swift package is installed\n const result = spawnSync('xcodebuild', ['-project', xcodeprojFile, '-showBuildSettings'], {\n cwd,\n encoding: 'utf-8',\n })\n\n if (result.error) {\n throw result.error\n }\n\n const buildSettings = result.stdout\n\n // Extract the source and version of the Code Connect Swift package from the\n // xcodebuild output, which can be in any of the following formats depending\n // on how it is installed:\n // - Figma: https://github.com/figma/code-connect @ 0.1.2\n // - Figma: /path/to/code-connect @ local\n // - Figma: /path/to/code-connect\n const figmaPackageMatch = buildSettings.match(/\\s+Figma: ([^\\s]*)(?: @ (.*))?/)\n if (!figmaPackageMatch) {\n exitWithError(\n 'Code Connect Swift package not found. Please add a dependency to the Code Connect package at https://github.com/figma/code-connect to your project.',\n )\n }\n\n // Find the package's location on disk, to compile and run the parser binary from\n const [_, figmaPackageSource, figmaPackageVersion] = figmaPackageMatch\n // The package version is `local` if installed via the \"Add package\" dialog,\n // or undefined if installed via the \"Frameworks\" section directly (which we\n // do for our test project, because the dialog won't allow ancestors to be\n // added)\n const isLocalFigmaPackage = figmaPackageVersion === 'local' || figmaPackageVersion === undefined\n\n if (isLocalFigmaPackage) {\n // If the version is 'local', the package is installed from a local checkout,\n // and the path on disk is the source output by xcodebuild.\n figmaPackageDir = figmaPackageSource\n } else if (sourcePackagesPath) {\n logger.info(`Using custom DerivedData path: ${sourcePackagesPath}`)\n\n // If a custom path is supplied, use it.\n figmaPackageDir = `${sourcePackagesPath}/checkouts/code-connect`\n } else {\n // Otherwise the SourcePackages will typically be located in Xcode's DerivedData directory,\n // at ~/Users/{username}/Library/Developer/Xcode/DerivedData/{project}-{xxx}/SourcePackages, or in the Project's root\n // at {project}/DerivedData/{project}/SourcePackages (depending on how the user's project is configured).\n let hasFoundSourcePackagesDir = false\n\n // 1. First look in the USER_LIBRARY_DIR (e.g. /Users/{username}/Library)\n const userLibraryDirectoryMatch = buildSettings.match(/\\s+USER_LIBRARY_DIR = (.*)/)\n const userLibraryDirectory = userLibraryDirectoryMatch\n ? userLibraryDirectoryMatch[1]\n : undefined\n\n logger.info('Finding Code Connect Swift package')\n\n // Find the project's name using the build settings\n const projectNameMatch = buildSettings.match(/\\s+PROJECT_NAME = (.*)/)\n const projectName = projectNameMatch ? projectNameMatch[1] : undefined\n\n // We can't proceed without the project name (however, this should always exist)\n if (!projectName) {\n exitWithError('PROJECT_NAME not found in xcodebuild output')\n }\n\n // 1. From the folders in the user library directory use a regex to determine the folder name of the project defined by \"ProjectName-\" and a 28 character hash\n // e.g. project-fbybcbnivxfbfeefownexgukzwxd\n if (userLibraryDirectory) {\n // Default to Xcode's default Dervied Data location (e.g. ~/Users/{username}/Library/Developer/Xcode/DerivedData/project-fbybcbnivxfbfeefownexgukzwxd/SourcePackages)\n const root = `${userLibraryDirectory}/Developer/Xcode/DerivedData`\n\n const projectFolderRegex = new RegExp(`${projectName}-[a-zA-Z0-9]{28}`)\n const derivedDataFolders = readdirSync(root)\n const projectFolder = derivedDataFolders.find((folder: string) =>\n projectFolderRegex.test(folder),\n )\n\n // If the project folder is found, use it to find the Code Connect package\n if (projectFolder) {\n figmaPackageDir = `${root}/${projectFolder}/SourcePackages/checkouts/code-connect`\n hasFoundSourcePackagesDir = true\n } else {\n logger.warn('Package not found in user library directory')\n }\n }\n\n // 2. If SourcePackages couldn't be found in ~/Users/{username}/Library/Developer/Xcode/DerivedData/{project}-{xxx}/SourcePackages, attempt\n // to find it in the project root {project}/DerivedData/{project}/SourcePackages\n if (!hasFoundSourcePackagesDir) {\n const rootDir = buildSettings.match(/\\s+LOCROOT = (.*)/)\n\n if (rootDir) {\n figmaPackageDir = `${rootDir[1]}/DerivedData/${projectName}/SourcePackages/checkouts/code-connect`\n hasFoundSourcePackagesDir = true\n } else {\n logger.warn('Package not found in project root')\n }\n }\n\n // 3. Otherwise, the package may be installed to\n // <DerviedData>/SourcePackages/checkouts/code-connect. We find the\n // DerivedData location from the BUILD_DIR (which points to\n // <DerivedData>/Build/Products).\n if (!hasFoundSourcePackagesDir) {\n const buildDir = buildSettings.match(/\\s+BUILD_DIR = (.*)/)\n\n if (buildDir) {\n figmaPackageDir = `${buildDir[1]}/../../SourcePackages/checkouts/code-connect`\n } else {\n logger.warn('Package not found in build directory')\n }\n }\n }\n } else if (packageSwiftFile) {\n const swiftPackageDir = swiftPackagePath ? path.dirname(swiftPackagePath) : undefined\n const packageDir = swiftPackageDir || cwd\n // Use the Swift command to determine if the package is installed locally or from Git\n try {\n const result = spawnSync(\n 'swift',\n ['package', '--package-path', packageDir, 'describe', '--type', 'json'],\n {\n cwd,\n encoding: 'utf-8',\n },\n )\n\n if (result.error) {\n throw result.error\n }\n\n const packageInfo = JSON.parse(result.stdout)\n\n const codeConnectPackage =\n packageInfo.dependencies.find((p: any) => p.identity === 'code-connect') ??\n // Our local directory is called figmadoc, so this is what swift outputs as the identity\n packageInfo.dependencies.find((p: any) => p.identity === 'figmadoc')\n\n if (!codeConnectPackage) {\n exitWithError(\n 'Code Connect Swift package not found in Package.swift. Please add a dependency to https://github.com/figma/code-connect to your Package.swift file.',\n )\n }\n\n // We can run directly from the directory of the package swift file\n figmaPackageDir = packageDir\n } catch (e) {\n exitWithError(`Error calling Swift command: ${e}`)\n }\n }\n\n if (!figmaPackageDir) {\n exitWithError('Figma package could not be found')\n }\n\n // Check if the figmaPackageDir exists, otherwise we can't proceed,\n // as we require the code-connect package to continue\n if (!existsSync(figmaPackageDir)) {\n exitWithError(`Figma package directory not found at ${figmaPackageDir}`)\n }\n\n // We need to ensure that the directory is writable, so we can run the swift run command\n // otherwise an \"invalid access\" error will be thrown by swift.\n try {\n const packageFile = path.join(figmaPackageDir, 'Package.resolved')\n\n const accessCheck = spawnSync('test', ['-w', packageFile])\n if (accessCheck.status !== 0) {\n // Directory is not writable, attempt to make it writable\n spawnSync('chmod', ['-R', '755', packageFile])\n }\n logger.info(`Directory enabled for swift run command`)\n } catch (e) {\n logger.warn(`Unable to verify or modify directory permissions: ${e}`)\n }\n\n logger.info(\n `Found Code Connect Swift package at ${figmaPackageDir}, building parser binary. This may take a few minutes if this is the first time you've run Code Connect.`,\n )\n\n return figmaPackageDir\n}\n"]}
|