@figma/code-connect 1.4.2 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +2 -22
  2. package/dist/commands/connect.d.ts +5 -2
  3. package/dist/commands/connect.d.ts.map +1 -1
  4. package/dist/commands/connect.js +93 -29
  5. package/dist/commands/connect.js.map +1 -1
  6. package/dist/commands/connect_template.d.ts +36 -0
  7. package/dist/commands/connect_template.d.ts.map +1 -0
  8. package/dist/commands/connect_template.js +324 -0
  9. package/dist/commands/connect_template.js.map +1 -0
  10. package/dist/commands/filter_project_info.d.ts +7 -0
  11. package/dist/commands/filter_project_info.d.ts.map +1 -0
  12. package/dist/commands/filter_project_info.js +32 -0
  13. package/dist/commands/filter_project_info.js.map +1 -0
  14. package/dist/commands/preview_utils.d.ts +49 -0
  15. package/dist/commands/preview_utils.d.ts.map +1 -0
  16. package/dist/commands/preview_utils.js +390 -0
  17. package/dist/commands/preview_utils.js.map +1 -0
  18. package/dist/connect/batch_templates.d.ts +11 -0
  19. package/dist/connect/batch_templates.d.ts.map +1 -0
  20. package/dist/connect/batch_templates.js +70 -0
  21. package/dist/connect/batch_templates.js.map +1 -0
  22. package/dist/connect/create.d.ts.map +1 -1
  23. package/dist/connect/create.js +13 -0
  24. package/dist/connect/create.js.map +1 -1
  25. package/dist/connect/create_template.d.ts +22 -0
  26. package/dist/connect/create_template.d.ts.map +1 -0
  27. package/dist/connect/create_template.js +195 -0
  28. package/dist/connect/create_template.js.map +1 -0
  29. package/dist/connect/delete_docs.d.ts +2 -1
  30. package/dist/connect/delete_docs.d.ts.map +1 -1
  31. package/dist/connect/delete_docs.js +2 -2
  32. package/dist/connect/delete_docs.js.map +1 -1
  33. package/dist/connect/figma_rest_api.d.ts +1 -5
  34. package/dist/connect/figma_rest_api.d.ts.map +1 -1
  35. package/dist/connect/figma_rest_api.js +9 -3
  36. package/dist/connect/figma_rest_api.js.map +1 -1
  37. package/dist/connect/intrinsics.d.ts +3 -3
  38. package/dist/connect/intrinsics.d.ts.map +1 -1
  39. package/dist/connect/intrinsics.js +21 -10
  40. package/dist/connect/intrinsics.js.map +1 -1
  41. package/dist/connect/migration_helpers.d.ts +10 -3
  42. package/dist/connect/migration_helpers.d.ts.map +1 -1
  43. package/dist/connect/migration_helpers.js +43 -22
  44. package/dist/connect/migration_helpers.js.map +1 -1
  45. package/dist/connect/parser_common.d.ts +3 -2
  46. package/dist/connect/parser_common.d.ts.map +1 -1
  47. package/dist/connect/parser_common.js +2 -2
  48. package/dist/connect/parser_common.js.map +1 -1
  49. package/dist/connect/project.d.ts +9 -7
  50. package/dist/connect/project.d.ts.map +1 -1
  51. package/dist/connect/project.js +39 -25
  52. package/dist/connect/project.js.map +1 -1
  53. package/dist/connect/raw_templates.d.ts +8 -1
  54. package/dist/connect/raw_templates.d.ts.map +1 -1
  55. package/dist/connect/raw_templates.js +20 -7
  56. package/dist/connect/raw_templates.js.map +1 -1
  57. package/dist/connect/upload.d.ts +3 -1
  58. package/dist/connect/upload.d.ts.map +1 -1
  59. package/dist/connect/upload.js +23 -8
  60. package/dist/connect/upload.js.map +1 -1
  61. package/dist/connect/validation.d.ts +2 -2
  62. package/dist/connect/validation.d.ts.map +1 -1
  63. package/dist/connect/validation.js +4 -4
  64. package/dist/connect/validation.js.map +1 -1
  65. package/dist/connect/wizard/helpers.js.map +1 -1
  66. package/dist/html/parser.d.ts +2 -2
  67. package/dist/html/parser.d.ts.map +1 -1
  68. package/dist/html/parser.js +7 -5
  69. package/dist/html/parser.js.map +1 -1
  70. package/dist/react/parser.d.ts +3 -3
  71. package/dist/react/parser.d.ts.map +1 -1
  72. package/dist/react/parser.js +9 -7
  73. package/dist/react/parser.js.map +1 -1
  74. package/dist/storybook/convert.d.ts +7 -1
  75. package/dist/storybook/convert.d.ts.map +1 -1
  76. package/dist/storybook/convert.js +11 -4
  77. package/dist/storybook/convert.js.map +1 -1
  78. package/{figma-module.d.ts → figma-types.d.ts} +13 -3
  79. package/package.json +8 -4
@@ -22,15 +22,22 @@ const parser_common_1 = require("../connect/parser_common");
22
22
  * @param args
23
23
  * @returns An array of Code Connect objects
24
24
  */
25
- async function convertStorybookFiles({ projectInfo, storiesGlob = '**/*.stories.tsx', }) {
25
+ async function convertStorybookFiles({ projectInfo, storiesGlob = '**/*.stories.{tsx,ts,jsx,js}', isForMigration = false, }) {
26
26
  const { remoteUrl, config, files, tsProgram } = projectInfo;
27
27
  const storyFiles = files.filter((file) => (0, minimatch_1.minimatch)(file, storiesGlob, { matchBase: true }));
28
28
  logging_1.logger.debug(`Story files found:\n${storyFiles.map((f) => `- ${f}`).join('\n')}`);
29
- return Promise.all(storyFiles.map((path) => convertStorybookFile({ path, tsProgram, config, remoteUrl, absPath: projectInfo.absPath })))
29
+ return Promise.all(storyFiles.map((path) => convertStorybookFile({
30
+ path,
31
+ tsProgram,
32
+ config,
33
+ remoteUrl,
34
+ absPath: projectInfo.absPath,
35
+ isForMigration,
36
+ })))
30
37
  .then((f) => f.filter((x) => Boolean(x)))
31
38
  .then((f) => f.flat());
32
39
  }
33
- async function convertStorybookFile({ path, tsProgram, remoteUrl, config, absPath, }) {
40
+ async function convertStorybookFile({ path, tsProgram, remoteUrl, config, absPath, isForMigration = false, }) {
34
41
  const checker = tsProgram.getTypeChecker();
35
42
  const sourceFile = tsProgram.getSourceFile(path);
36
43
  if (!sourceFile) {
@@ -135,7 +142,7 @@ async function convertStorybookFile({ path, tsProgram, remoteUrl, config, absPat
135
142
  });
136
143
  }
137
144
  const exampleProps = example?.props ?? propMappings;
138
- let render = (0, parser_1.parseJSXRenderFunction)(statementToParse, parserContext, exampleProps);
145
+ let render = (0, parser_1.parseJSXRenderFunction)(statementToParse, parserContext, exampleProps, isForMigration);
139
146
  if (!render) {
140
147
  continue;
141
148
  }
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/storybook/convert.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from 'fs'\nimport {\n bfsFindNode,\n convertObjectLiteralToJs,\n getDefaultExport,\n parsePropertyOfType,\n} from '../typescript/compiler'\nimport {\n parseComponentMetadata,\n parseJSXRenderFunction,\n getDefaultTemplate,\n findAndResolveImports,\n} from '../react/parser'\nimport {\n CodeConnectReactConfig,\n ReactProjectInfo,\n getRemoteFileUrl,\n getStorybookUrl,\n} from '../connect/project'\nimport { logger } from '../common/logging'\nimport { CodeConnectJSON } from '../connect/figma_connect'\nimport { CodeConnectLabel, SyntaxHighlightLanguage } from '../connect/label_language_mapping'\nimport ts from 'typescript'\nimport { FigmaConnectLink, FigmaConnectMeta } from '../connect/api'\nimport { minimatch } from 'minimatch'\nimport { parsePropsObject } from '../connect/intrinsics'\nimport {\n InternalError,\n parseImports,\n parseLinks,\n ParserContext,\n ParserError,\n} from '../connect/parser_common'\n\ninterface ConvertStorybookFilesArgs {\n /**\n * Optionally override the glob used to find stories. This is currently not\n * exposed in the config, but is used by the tests\n */\n storiesGlob?: string\n\n /**\n * Information about the project\n */\n projectInfo: ReactProjectInfo\n}\n\n/**\n * Converts all Storyboook files in a directory into Code Connect objects. If a file\n * cannot be converted (e.g. unsupported syntax), it is ignored and an error is\n * logged.\n *\n * @param args\n * @returns An array of Code Connect objects\n */\nexport async function convertStorybookFiles({\n projectInfo,\n storiesGlob = '**/*.stories.tsx',\n}: ConvertStorybookFilesArgs): Promise<CodeConnectJSON[]> {\n const { remoteUrl, config, files, tsProgram } = projectInfo\n\n const storyFiles = files.filter((file) => minimatch(file, storiesGlob, { matchBase: true }))\n logger.debug(`Story files found:\\n${storyFiles.map((f) => `- ${f}`).join('\\n')}`)\n\n return Promise.all(\n storyFiles.map((path) =>\n convertStorybookFile({ path, tsProgram, config, remoteUrl, absPath: projectInfo.absPath }),\n ),\n )\n .then((f) => f.filter((x): x is NonNullable<typeof x> => Boolean(x)))\n .then((f) => f.flat())\n}\n\ninterface FigmaStoryMetadata {\n type: string\n url: string\n}\n\ninterface ConvertStorybookFileArgs {\n path: string\n tsProgram: ts.Program\n remoteUrl: string\n config: CodeConnectReactConfig\n absPath: string\n}\n\ntype MappedPropType = 'FigmaString' | 'FigmaBoolean' | 'Mapped'\ntype MappedProps = Map<string, { figmaName: string; type: MappedPropType }> | undefined\n\nasync function convertStorybookFile({\n path,\n tsProgram,\n remoteUrl,\n config,\n absPath,\n}: ConvertStorybookFileArgs): Promise<CodeConnectJSON[] | undefined> {\n const checker = tsProgram.getTypeChecker()\n const sourceFile = tsProgram.getSourceFile(path)\n\n if (!sourceFile) {\n throw new InternalError(`Source file not found: ${path}`)\n }\n\n const parserContext: ParserContext = {\n checker,\n config,\n sourceFile,\n absPath,\n resolvedImports: findAndResolveImports(tsProgram, sourceFile),\n }\n\n let source = readFileSync(path).toString()\n // Replace backticks with ' as csf-tools can't parse dynamic titles\n source = source.replace(/title: `(.*)`/g, (_, title) => {\n return `title: '${title}'`\n })\n\n logger.debug(`Parsing story ${path}`)\n\n try {\n // We need to get the default export, which contains the story file meta,\n // from the TS Program rather than using `babelNodeToTsSourceFile(csf._metaNode)`,\n // because we need access to the full Program to parse it for prop types etc.\n const storyFileMetaNode = getDefaultExport(sourceFile)\n if (!storyFileMetaNode) {\n return\n }\n\n const parseResult = parseStoryMetadata(storyFileMetaNode, parserContext)\n\n if (!parseResult) {\n logger.debug(`Could not parse story metadata for ${path}`)\n return\n }\n\n const { figmaStoryMetadata, componentDeclaration, propMappings, examples, imports, links } =\n parseResult\n\n const componentMetadata = await parseComponentMetadata(componentDeclaration, parserContext)\n\n const codeConnectObjects: CodeConnectJSON[] = []\n const baseCodeConnect: CodeConnectJSON = {\n figmaNode: figmaStoryMetadata.url,\n source: config?.storybook?.url\n ? getStorybookUrl(componentMetadata.source, config.storybook.url)\n : getRemoteFileUrl(componentMetadata.source, remoteUrl, config?.defaultBranch),\n sourceLocation: { line: componentMetadata.line },\n template: '',\n templateData: {\n props: propMappings,\n imports,\n },\n links,\n component: componentMetadata.component,\n label: CodeConnectLabel.Storybook,\n language: SyntaxHighlightLanguage.TypeScript,\n metadata: {\n cliVersion: require('../../package.json').version,\n },\n }\n\n // If there are no examples, just return a default Code Connect object\n if (!examples) {\n codeConnectObjects.push({\n ...baseCodeConnect,\n template: getDefaultTemplate(componentMetadata),\n })\n return codeConnectObjects\n }\n\n for (const statement of sourceFile.statements) {\n // Find any exported function or variable declarations, which correspond to stories\n if (!(ts.isFunctionDeclaration(statement) || ts.isVariableStatement(statement))) {\n continue\n }\n\n const name = ts.isFunctionDeclaration(statement)\n ? statement.name?.text\n : statement.declarationList.declarations?.[0].name.getText(sourceFile)\n\n const example = examples?.find((example) => example.example === name)\n // This story is not in the examples array, so skip it\n if (examples && !example) {\n continue\n }\n\n let statementToParse: ts.ArrowFunction | ts.FunctionDeclaration | undefined\n\n if (ts.isFunctionDeclaration(statement)) {\n statementToParse = statement\n } else {\n const initializer = statement.declarationList.declarations[0].initializer\n if (initializer && ts.isArrowFunction(initializer)) {\n statementToParse = initializer\n } else if (initializer && ts.isObjectLiteralExpression(initializer)) {\n // Handle stories like `export const Primary = { render: () => <Button /> }`\n const renderProperty = parsePropertyOfType({\n objectLiteralNode: initializer,\n propertyName: 'render',\n predicate: ts.isArrowFunction,\n parserContext,\n required: true,\n })\n\n if (renderProperty) {\n statementToParse = renderProperty\n }\n }\n }\n\n if (!statementToParse) {\n throw new ParserError(\n 'Expected function declaration, arrow function or render function in story',\n {\n sourceFile,\n node: statement,\n },\n )\n }\n\n const exampleProps = example?.props ?? propMappings\n\n let render = parseJSXRenderFunction(statementToParse, parserContext, exampleProps)\n\n if (!render) {\n continue\n }\n\n const template = render.code ?? `<${componentMetadata.component} />`\n\n // TODO handle JSDoc on stories\n codeConnectObjects.push({\n ...baseCodeConnect,\n template,\n variant: example?.variant,\n })\n }\n\n return codeConnectObjects\n } catch (e) {\n logger.error(`Error parsing story ${path}: ${e}`)\n throw e\n }\n}\n\n/**\n * Get the TS Node representing the component declaration from the story file\n *\n * @param objectLiteralNode Object literal containing the story file metadata\n * @returns TS Node representing the component declaration or undefined\n */\nfunction getComponentDeclaration(\n objectLiteralNode: ts.ObjectLiteralExpression,\n): ts.Expression | undefined {\n for (const property of objectLiteralNode.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const propertyName = property.name\n if (ts.isIdentifier(propertyName) && propertyName.text === 'component') {\n return property.initializer\n }\n }\n return undefined\n}\n\n/**\n * Validate and returns Figma metadata from the default export of the storybook\n * file\n *\n * @param storyFileMetaNode TS Node containing the story file metadata, i.e. the\n * default export of the file\n * @param sourceFile TS SourceFile representing a single story\n * @returns Figma metadata\n * @throws Error if no Figma metadata is found\n */\nfunction parseStoryMetadata(storyFileMetaNode: ts.Node, parserContext: ParserContext) {\n const { sourceFile, checker } = parserContext\n // Find the first object expression under tsSourceFile.statements[0],\n // which contains the story file metadata. We do it this way to allow syntax\n // like `export default ({ ... meta ... } as ComponentMeta<...>)`\n const objectLiteralNode = bfsFindNode(storyFileMetaNode, sourceFile, (node) =>\n ts.isObjectLiteralExpression(node),\n )\n\n if (!objectLiteralNode || !ts.isObjectLiteralExpression(objectLiteralNode)) {\n logger.debug(`No object literal found in story metadata`)\n return\n }\n\n const componentDeclaration = getComponentDeclaration(objectLiteralNode)\n if (!componentDeclaration) {\n logger.debug(`No component declaration found in story metadata`)\n return\n }\n\n const parametersNode = parsePropertyOfType({\n objectLiteralNode: objectLiteralNode,\n propertyName: 'parameters',\n predicate: ts.isObjectLiteralExpression,\n parserContext,\n required: false,\n })\n\n // If there's no parameters object, this file shouldn't be imported\n if (!parametersNode) {\n logger.debug(`No parameters object found in story metadata`)\n return\n }\n\n const designNode = parsePropertyOfType({\n objectLiteralNode: parametersNode,\n propertyName: 'design',\n predicate: ts.isObjectLiteralExpression,\n parserContext,\n required: false,\n })\n\n // If there's no design object, this file shouldn't be imported\n if (!designNode) {\n logger.debug(`No design object found in story metadata`)\n return\n }\n\n const typeNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'type',\n predicate: ts.isStringLiteral,\n parserContext,\n errorMessage: '\"type\" property not found in \"design\" object in story metadata',\n required: false,\n })\n\n // If the design is not a Figma design, this file shouldn't be imported\n if (!typeNode || typeNode.text !== 'figma') {\n logger.debug(`Design type is not figma`)\n return\n }\n\n const urlNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'url',\n predicate: ts.isStringLiteral,\n parserContext,\n errorMessage: '\"url\" property not found in \"design\" object in story metadata',\n required: true,\n })\n\n const figmaStoryMetadata: FigmaStoryMetadata = {\n type: typeNode.text,\n url: urlNode.text,\n }\n\n const propMappingNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'props',\n predicate: ts.isObjectLiteralExpression,\n parserContext,\n required: false,\n })\n\n const examplesNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'examples',\n predicate: ts.isArrayLiteralExpression,\n parserContext,\n required: false,\n })\n\n const importsNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'imports',\n predicate: ts.isArrayLiteralExpression,\n parserContext,\n required: false,\n errorMessage: `The 'imports' property must be an array literal. Example usage:\n\\`design: {\n type: 'figma',\n url: 'https://www.figma.com/file/123?node-id=1-1',\n examples: [Button],\n imports: [\n 'import { Button } from \"./Button\"'\n ],\n ...\n})\\``,\n })\n\n const linksNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'links',\n predicate: ts.isArrayLiteralExpression,\n parserContext,\n required: false,\n errorMessage: `The 'links' property must be an array literal. Example usage:\n\\`design: {\n type: 'figma',\n url: 'https://www.figma.com/file/123?node-id=1-1',\n examples: [Button],\n links: [\n { name: 'Storybook', url: 'https://storybook.com' }\n ],\n ...\n})\\``,\n })\n\n let links: FigmaConnectLink[] | undefined\n if (linksNode) {\n links = parseLinks(linksNode, parserContext)\n }\n\n let imports: string[] = []\n if (importsNode) {\n imports = parseImports(importsNode, parserContext)\n }\n\n let propMappings: {} | undefined\n let mappedProps: MappedProps\n\n if (propMappingNode) {\n mappedProps = new Map()\n propMappings = parsePropsObject(propMappingNode, parserContext)\n }\n\n type Example = {\n example: string\n variant?: FigmaConnectMeta['variant']\n props?: Record<string, any>\n }\n let examples: Example[] | undefined\n\n if (examplesNode) {\n examples = examplesNode.elements.map((exampleNode) => {\n if (ts.isStringLiteral(exampleNode) || ts.isIdentifier(exampleNode)) {\n return { example: exampleNode.text }\n }\n\n if (!ts.isObjectLiteralExpression(exampleNode)) {\n throw new ParserError(\n `Expected object literal in examples array, got: ${ts.SyntaxKind[exampleNode.kind]}`,\n {\n sourceFile,\n node: exampleNode,\n },\n )\n }\n\n return convertObjectLiteralToJs(exampleNode, sourceFile, checker, (node) => {\n if ((node.parent as ts.TypeParameterDeclaration)?.name?.escapedText === 'props') {\n if (ts.isObjectLiteralExpression(node)) {\n return parsePropsObject(node, parserContext)\n }\n }\n }) as Example\n })\n }\n\n return {\n figmaStoryMetadata,\n componentDeclaration,\n propMappings,\n mappedProps,\n examples,\n imports,\n links,\n }\n}\n"]}
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/storybook/convert.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from 'fs'\nimport {\n bfsFindNode,\n convertObjectLiteralToJs,\n getDefaultExport,\n parsePropertyOfType,\n} from '../typescript/compiler'\nimport {\n parseComponentMetadata,\n parseJSXRenderFunction,\n getDefaultTemplate,\n findAndResolveImports,\n} from '../react/parser'\nimport {\n CodeConnectReactConfig,\n ReactProjectInfo,\n getRemoteFileUrl,\n getStorybookUrl,\n} from '../connect/project'\nimport { logger } from '../common/logging'\nimport { CodeConnectJSON } from '../connect/figma_connect'\nimport { CodeConnectLabel, SyntaxHighlightLanguage } from '../connect/label_language_mapping'\nimport ts from 'typescript'\nimport { FigmaConnectLink, FigmaConnectMeta } from '../connect/api'\nimport { minimatch } from 'minimatch'\nimport { parsePropsObject } from '../connect/intrinsics'\nimport {\n InternalError,\n parseImports,\n parseLinks,\n ParserContext,\n ParserError,\n} from '../connect/parser_common'\n\ninterface ConvertStorybookFilesArgs {\n /**\n * Optionally override the glob used to find stories. This is currently not\n * exposed in the config, but is used by the tests\n */\n storiesGlob?: string\n\n /**\n * Information about the project\n */\n projectInfo: ReactProjectInfo\n\n /**\n * Whether this conversion is for the migrate command. When true, template\n * helper function definitions are omitted from the template (they will be\n * replaced by server-side helpers during migration).\n */\n isForMigration?: boolean\n}\n\n/**\n * Converts all Storyboook files in a directory into Code Connect objects. If a file\n * cannot be converted (e.g. unsupported syntax), it is ignored and an error is\n * logged.\n *\n * @param args\n * @returns An array of Code Connect objects\n */\nexport async function convertStorybookFiles({\n projectInfo,\n storiesGlob = '**/*.stories.{tsx,ts,jsx,js}',\n isForMigration = false,\n}: ConvertStorybookFilesArgs): Promise<CodeConnectJSON[]> {\n const { remoteUrl, config, files, tsProgram } = projectInfo\n\n const storyFiles = files.filter((file) => minimatch(file, storiesGlob, { matchBase: true }))\n logger.debug(`Story files found:\\n${storyFiles.map((f) => `- ${f}`).join('\\n')}`)\n\n return Promise.all(\n storyFiles.map((path) =>\n convertStorybookFile({\n path,\n tsProgram,\n config,\n remoteUrl,\n absPath: projectInfo.absPath,\n isForMigration,\n }),\n ),\n )\n .then((f) => f.filter((x): x is NonNullable<typeof x> => Boolean(x)))\n .then((f) => f.flat())\n}\n\ninterface FigmaStoryMetadata {\n type: string\n url: string\n}\n\ninterface ConvertStorybookFileArgs {\n path: string\n tsProgram: ts.Program\n remoteUrl: string\n config: CodeConnectReactConfig\n absPath: string\n isForMigration?: boolean\n}\n\ntype MappedPropType = 'FigmaString' | 'FigmaBoolean' | 'Mapped'\ntype MappedProps = Map<string, { figmaName: string; type: MappedPropType }> | undefined\n\nasync function convertStorybookFile({\n path,\n tsProgram,\n remoteUrl,\n config,\n absPath,\n isForMigration = false,\n}: ConvertStorybookFileArgs): Promise<CodeConnectJSON[] | undefined> {\n const checker = tsProgram.getTypeChecker()\n const sourceFile = tsProgram.getSourceFile(path)\n\n if (!sourceFile) {\n throw new InternalError(`Source file not found: ${path}`)\n }\n\n const parserContext: ParserContext = {\n checker,\n config,\n sourceFile,\n absPath,\n resolvedImports: findAndResolveImports(tsProgram, sourceFile),\n }\n\n let source = readFileSync(path).toString()\n // Replace backticks with ' as csf-tools can't parse dynamic titles\n source = source.replace(/title: `(.*)`/g, (_, title) => {\n return `title: '${title}'`\n })\n\n logger.debug(`Parsing story ${path}`)\n\n try {\n // We need to get the default export, which contains the story file meta,\n // from the TS Program rather than using `babelNodeToTsSourceFile(csf._metaNode)`,\n // because we need access to the full Program to parse it for prop types etc.\n const storyFileMetaNode = getDefaultExport(sourceFile)\n if (!storyFileMetaNode) {\n return\n }\n\n const parseResult = parseStoryMetadata(storyFileMetaNode, parserContext)\n\n if (!parseResult) {\n logger.debug(`Could not parse story metadata for ${path}`)\n return\n }\n\n const { figmaStoryMetadata, componentDeclaration, propMappings, examples, imports, links } =\n parseResult\n\n const componentMetadata = await parseComponentMetadata(componentDeclaration, parserContext)\n\n const codeConnectObjects: CodeConnectJSON[] = []\n const baseCodeConnect: CodeConnectJSON = {\n figmaNode: figmaStoryMetadata.url,\n source: config?.storybook?.url\n ? getStorybookUrl(componentMetadata.source, config.storybook.url)\n : getRemoteFileUrl(componentMetadata.source, remoteUrl, config?.defaultBranch),\n sourceLocation: { line: componentMetadata.line },\n template: '',\n templateData: {\n props: propMappings,\n imports,\n },\n links,\n component: componentMetadata.component,\n label: CodeConnectLabel.Storybook,\n language: SyntaxHighlightLanguage.TypeScript,\n metadata: {\n cliVersion: require('../../package.json').version,\n },\n }\n\n // If there are no examples, just return a default Code Connect object\n if (!examples) {\n codeConnectObjects.push({\n ...baseCodeConnect,\n template: getDefaultTemplate(componentMetadata),\n })\n return codeConnectObjects\n }\n\n for (const statement of sourceFile.statements) {\n // Find any exported function or variable declarations, which correspond to stories\n if (!(ts.isFunctionDeclaration(statement) || ts.isVariableStatement(statement))) {\n continue\n }\n\n const name = ts.isFunctionDeclaration(statement)\n ? statement.name?.text\n : statement.declarationList.declarations?.[0].name.getText(sourceFile)\n\n const example = examples?.find((example) => example.example === name)\n // This story is not in the examples array, so skip it\n if (examples && !example) {\n continue\n }\n\n let statementToParse: ts.ArrowFunction | ts.FunctionDeclaration | undefined\n\n if (ts.isFunctionDeclaration(statement)) {\n statementToParse = statement\n } else {\n const initializer = statement.declarationList.declarations[0].initializer\n if (initializer && ts.isArrowFunction(initializer)) {\n statementToParse = initializer\n } else if (initializer && ts.isObjectLiteralExpression(initializer)) {\n // Handle stories like `export const Primary = { render: () => <Button /> }`\n const renderProperty = parsePropertyOfType({\n objectLiteralNode: initializer,\n propertyName: 'render',\n predicate: ts.isArrowFunction,\n parserContext,\n required: true,\n })\n\n if (renderProperty) {\n statementToParse = renderProperty\n }\n }\n }\n\n if (!statementToParse) {\n throw new ParserError(\n 'Expected function declaration, arrow function or render function in story',\n {\n sourceFile,\n node: statement,\n },\n )\n }\n\n const exampleProps = example?.props ?? propMappings\n\n let render = parseJSXRenderFunction(\n statementToParse,\n parserContext,\n exampleProps,\n isForMigration,\n )\n\n if (!render) {\n continue\n }\n\n const template = render.code ?? `<${componentMetadata.component} />`\n\n // TODO handle JSDoc on stories\n codeConnectObjects.push({\n ...baseCodeConnect,\n template,\n variant: example?.variant,\n })\n }\n\n return codeConnectObjects\n } catch (e) {\n logger.error(`Error parsing story ${path}: ${e}`)\n throw e\n }\n}\n\n/**\n * Get the TS Node representing the component declaration from the story file\n *\n * @param objectLiteralNode Object literal containing the story file metadata\n * @returns TS Node representing the component declaration or undefined\n */\nfunction getComponentDeclaration(\n objectLiteralNode: ts.ObjectLiteralExpression,\n): ts.Expression | undefined {\n for (const property of objectLiteralNode.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const propertyName = property.name\n if (ts.isIdentifier(propertyName) && propertyName.text === 'component') {\n return property.initializer\n }\n }\n return undefined\n}\n\n/**\n * Validate and returns Figma metadata from the default export of the storybook\n * file\n *\n * @param storyFileMetaNode TS Node containing the story file metadata, i.e. the\n * default export of the file\n * @param sourceFile TS SourceFile representing a single story\n * @returns Figma metadata\n * @throws Error if no Figma metadata is found\n */\nfunction parseStoryMetadata(storyFileMetaNode: ts.Node, parserContext: ParserContext) {\n const { sourceFile, checker } = parserContext\n // Find the first object expression under tsSourceFile.statements[0],\n // which contains the story file metadata. We do it this way to allow syntax\n // like `export default ({ ... meta ... } as ComponentMeta<...>)`\n const objectLiteralNode = bfsFindNode(storyFileMetaNode, sourceFile, (node) =>\n ts.isObjectLiteralExpression(node),\n )\n\n if (!objectLiteralNode || !ts.isObjectLiteralExpression(objectLiteralNode)) {\n logger.debug(`No object literal found in story metadata`)\n return\n }\n\n const componentDeclaration = getComponentDeclaration(objectLiteralNode)\n if (!componentDeclaration) {\n logger.debug(`No component declaration found in story metadata`)\n return\n }\n\n const parametersNode = parsePropertyOfType({\n objectLiteralNode: objectLiteralNode,\n propertyName: 'parameters',\n predicate: ts.isObjectLiteralExpression,\n parserContext,\n required: false,\n })\n\n // If there's no parameters object, this file shouldn't be imported\n if (!parametersNode) {\n logger.debug(`No parameters object found in story metadata`)\n return\n }\n\n const designNode = parsePropertyOfType({\n objectLiteralNode: parametersNode,\n propertyName: 'design',\n predicate: ts.isObjectLiteralExpression,\n parserContext,\n required: false,\n })\n\n // If there's no design object, this file shouldn't be imported\n if (!designNode) {\n logger.debug(`No design object found in story metadata`)\n return\n }\n\n const typeNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'type',\n predicate: ts.isStringLiteral,\n parserContext,\n errorMessage: '\"type\" property not found in \"design\" object in story metadata',\n required: false,\n })\n\n // If the design is not a Figma design, this file shouldn't be imported\n if (!typeNode || typeNode.text !== 'figma') {\n logger.debug(`Design type is not figma`)\n return\n }\n\n const urlNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'url',\n predicate: ts.isStringLiteral,\n parserContext,\n errorMessage: '\"url\" property not found in \"design\" object in story metadata',\n required: true,\n })\n\n const figmaStoryMetadata: FigmaStoryMetadata = {\n type: typeNode.text,\n url: urlNode.text,\n }\n\n const propMappingNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'props',\n predicate: ts.isObjectLiteralExpression,\n parserContext,\n required: false,\n })\n\n const examplesNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'examples',\n predicate: ts.isArrayLiteralExpression,\n parserContext,\n required: false,\n })\n\n const importsNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'imports',\n predicate: ts.isArrayLiteralExpression,\n parserContext,\n required: false,\n errorMessage: `The 'imports' property must be an array literal. Example usage:\n\\`design: {\n type: 'figma',\n url: 'https://www.figma.com/file/123?node-id=1-1',\n examples: [Button],\n imports: [\n 'import { Button } from \"./Button\"'\n ],\n ...\n})\\``,\n })\n\n const linksNode = parsePropertyOfType({\n objectLiteralNode: designNode,\n propertyName: 'links',\n predicate: ts.isArrayLiteralExpression,\n parserContext,\n required: false,\n errorMessage: `The 'links' property must be an array literal. Example usage:\n\\`design: {\n type: 'figma',\n url: 'https://www.figma.com/file/123?node-id=1-1',\n examples: [Button],\n links: [\n { name: 'Storybook', url: 'https://storybook.com' }\n ],\n ...\n})\\``,\n })\n\n let links: FigmaConnectLink[] | undefined\n if (linksNode) {\n links = parseLinks(linksNode, parserContext)\n }\n\n let imports: string[] = []\n if (importsNode) {\n imports = parseImports(importsNode, parserContext)\n }\n\n let propMappings: {} | undefined\n let mappedProps: MappedProps\n\n if (propMappingNode) {\n mappedProps = new Map()\n propMappings = parsePropsObject(propMappingNode, parserContext)\n }\n\n type Example = {\n example: string\n variant?: FigmaConnectMeta['variant']\n props?: Record<string, any>\n }\n let examples: Example[] | undefined\n\n if (examplesNode) {\n examples = examplesNode.elements.map((exampleNode) => {\n if (ts.isStringLiteral(exampleNode) || ts.isIdentifier(exampleNode)) {\n return { example: exampleNode.text }\n }\n\n if (!ts.isObjectLiteralExpression(exampleNode)) {\n throw new ParserError(\n `Expected object literal in examples array, got: ${ts.SyntaxKind[exampleNode.kind]}`,\n {\n sourceFile,\n node: exampleNode,\n },\n )\n }\n\n return convertObjectLiteralToJs(exampleNode, sourceFile, checker, (node) => {\n if ((node.parent as ts.TypeParameterDeclaration)?.name?.escapedText === 'props') {\n if (ts.isObjectLiteralExpression(node)) {\n return parsePropsObject(node, parserContext)\n }\n }\n }) as Example\n })\n }\n\n return {\n figmaStoryMetadata,\n componentDeclaration,\n propMappings,\n mappedProps,\n examples,\n imports,\n links,\n }\n}\n"]}
@@ -50,6 +50,7 @@ declare module 'figma' {
50
50
  export interface TextHandle {
51
51
  readonly type: 'TEXT'
52
52
  readonly name: string
53
+ readonly textContent: string
53
54
  __render__(): string
54
55
  }
55
56
 
@@ -117,7 +118,7 @@ declare module 'figma' {
117
118
  opts?: SelectorOptions,
118
119
  ): (InstanceHandle | ErrorHandle)[]
119
120
  findLayers(
120
- selectorFn: (node: InstanceHandle) => boolean,
121
+ selectorFn: (node: InstanceHandle | TextHandle) => boolean,
121
122
  opts?: SelectorOptions,
122
123
  ): (InstanceHandle | TextHandle | ErrorHandle)[]
123
124
  executeTemplate(): {
@@ -153,6 +154,9 @@ declare module 'figma' {
153
154
  ) => TemplateStringResult
154
155
 
155
156
  export interface Figma {
157
+ /** Per-entry data from a .figma.batch.json file. Available in batch templates. */
158
+ readonly batch: Record<string, any>
159
+
156
160
  /** The currently selected component instance */
157
161
  readonly selectedInstance: InstanceHandle & { readonly __properties__: FigmaProperties }
158
162
  /** Alias for selectedInstance */
@@ -194,10 +198,16 @@ declare module 'figma' {
194
198
  isReactComponentArray(prop: unknown): boolean
195
199
  }
196
200
  swift: {
197
- renderChildren(children: ResultSection[], prefix: string): ResultSection[]
201
+ renderChildren(
202
+ children: ResultSection[] | string | undefined,
203
+ prefix: string,
204
+ ): ResultSection[]
198
205
  }
199
206
  kotlin: {
200
- renderChildren(children: ResultSection[], prefix: string): ResultSection[]
207
+ renderChildren(
208
+ children: ResultSection[] | string | undefined,
209
+ prefix: string,
210
+ ): ResultSection[]
201
211
  }
202
212
  }
203
213
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@figma/code-connect",
3
- "version": "1.4.2",
3
+ "version": "1.4.4",
4
4
  "description": "A tool for connecting your design system components in code with your design system in Figma",
5
5
  "keywords": [],
6
6
  "author": "Figma",
@@ -11,6 +11,10 @@
11
11
  "types": "./dist/react/index_react.d.ts",
12
12
  "default": "./dist/react/index_react.js"
13
13
  },
14
+ "./cli-commands-template": {
15
+ "types": "./dist/commands/connect_template.d.ts",
16
+ "default": "./dist/commands/connect_template.js"
17
+ },
14
18
  "./html": {
15
19
  "types": "./dist/html/index_html.d.ts",
16
20
  "default": "./dist/html/index_html.js"
@@ -20,7 +24,7 @@
20
24
  "default": "./dist/react/index_react.js"
21
25
  },
22
26
  "./figma-types": {
23
- "types": "./figma-module.d.ts"
27
+ "types": "./figma-types.d.ts"
24
28
  }
25
29
  },
26
30
  "repository": {
@@ -33,7 +37,7 @@
33
37
  },
34
38
  "files": [
35
39
  "dist/**/*",
36
- "figma-module.d.ts"
40
+ "figma-types.d.ts"
37
41
  ],
38
42
  "engines": {
39
43
  "node": ">=18"
@@ -106,7 +110,7 @@
106
110
  "find-up": "^5.0.0",
107
111
  "glob": "^11.0.4",
108
112
  "jsdom": "^24.1.1",
109
- "lodash": "4.17.23",
113
+ "lodash": "4.18.1",
110
114
  "minimatch": "^9.0.3",
111
115
  "ora": "^5.4.1",
112
116
  "parse5": "^7.1.2",