@figma/code-connect 1.4.5 → 1.4.7
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/cli.js +0 -1
- package/dist/cli.js.map +1 -1
- package/dist/client/figma_client.d.ts +6 -6
- package/dist/commands/connect.d.ts +1 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +6 -1
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect_template.d.ts +2 -2
- package/dist/commands/connect_template.d.ts.map +1 -1
- package/dist/commands/connect_template.js +2 -2
- package/dist/commands/connect_template.js.map +1 -1
- package/dist/commands/filter_project_info.d.ts +3 -3
- package/dist/commands/filter_project_info.d.ts.map +1 -1
- package/dist/commands/filter_project_info.js +18 -12
- package/dist/commands/filter_project_info.js.map +1 -1
- package/dist/connect/parser_executable_types.d.ts +60 -60
- package/dist/connect/upload.d.ts.map +1 -1
- package/dist/connect/upload.js +24 -8
- package/dist/connect/upload.js.map +1 -1
- package/package.json +5 -5
package/dist/cli.js
CHANGED
|
@@ -41,7 +41,6 @@ require('dotenv').config();
|
|
|
41
41
|
async function run() {
|
|
42
42
|
(0, helpers_1.maybePrefillWizardQuestionsForTesting)();
|
|
43
43
|
const program = new commander.Command().version(require('./../package.json').version);
|
|
44
|
-
program.enablePositionalOptions();
|
|
45
44
|
(0, connect_1.addConnectCommandToProgram)(program);
|
|
46
45
|
// Update command is temporarily disabled until we can show the correct update
|
|
47
46
|
// command to React vs non-React users
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,qDAAsC;AACtC,gDAA+D;AAC/D,sDAAgF;AAEhF,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAA;AAE1B,KAAK,UAAU,GAAG;IAChB,IAAA,+CAAqC,GAAE,CAAA;IAEvC,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,qDAAsC;AACtC,gDAA+D;AAC/D,sDAAgF;AAEhF,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAA;AAE1B,KAAK,UAAU,GAAG;IAChB,IAAA,+CAAqC,GAAE,CAAA;IAEvC,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAA;IAErF,IAAA,oCAA0B,EAAC,OAAO,CAAC,CAAA;IAEnC,8EAA8E;IAC9E,sCAAsC;IACtC;;;;;;;MAOE;IAEF,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,UAAU,EAAE,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,GAAG,EAAE,CAAA","sourcesContent":["#!/usr/bin/env node\n\nimport * as commander from 'commander'\nimport { addConnectCommandToProgram } from './commands/connect'\nimport { maybePrefillWizardQuestionsForTesting } from './connect/wizard/helpers'\n\nrequire('dotenv').config()\n\nasync function run() {\n maybePrefillWizardQuestionsForTesting()\n\n const program = new commander.Command().version(require('./../package.json').version)\n\n addConnectCommandToProgram(program)\n\n // Update command is temporarily disabled until we can show the correct update\n // command to React vs non-React users\n /*\n program\n .command('update')\n .description('Updates to the latest version of the Figma CLI')\n .action(() => {\n updateCli()\n })\n */\n\n program.parse(process.argv)\n if (program.args.length < 1) {\n program.outputHelp()\n process.exit(1)\n }\n}\n\nrun()\n"]}
|
|
@@ -27,14 +27,14 @@ export interface FigmaConnectClient {
|
|
|
27
27
|
* @returns
|
|
28
28
|
*/
|
|
29
29
|
export declare function getComponents(fileOrNode: string): Promise<{
|
|
30
|
-
fileKey: string;
|
|
31
|
-
figmaUrl: string;
|
|
32
|
-
componentPropertyDefinitions: {} | undefined;
|
|
33
|
-
type: "COMPONENT" | "COMPONENT_SET";
|
|
34
|
-
pageId: string;
|
|
35
|
-
pageName: string;
|
|
36
30
|
name: string;
|
|
37
31
|
id: string;
|
|
38
32
|
children: FigmaRestApi.Node[];
|
|
33
|
+
pageId: string;
|
|
34
|
+
pageName: string;
|
|
35
|
+
type: "COMPONENT" | "COMPONENT_SET";
|
|
36
|
+
fileKey: string;
|
|
37
|
+
figmaUrl: string;
|
|
38
|
+
componentPropertyDefinitions: {} | undefined;
|
|
39
39
|
}[]>;
|
|
40
40
|
//# sourceMappingURL=figma_client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAMtC,OAAO,EAKL,WAAW,EAKZ,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAiC1D,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAMtC,OAAO,EAKL,WAAW,EAKZ,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAiC1D,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,OAAO,CAAA;IACxB,qBAAqB,EAAE,OAAO,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AA8BD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,QAkGpE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,UAE9C;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,UAUpD;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,WAAW,UAEtC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,QAI5C;AAkCD,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,WAAW,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACrC,WAAW,EAAE,WAAW,EACxB,MAAM,UAAQ,EACd,cAAc,UAAQ,GACrB,OAAO,CAAC,eAAe,EAAE,CAAC,CAsK5B"}
|
package/dist/commands/connect.js
CHANGED
|
@@ -41,7 +41,7 @@ function addBaseCommand(command, name, description) {
|
|
|
41
41
|
.description(description)
|
|
42
42
|
.usage('[options]')
|
|
43
43
|
.option('-r --dir <dir>', 'directory to parse')
|
|
44
|
-
.option('-f --file <file
|
|
44
|
+
.option('-f --file <file...>', 'paths to one or more Code Connect files to process (space-separated)')
|
|
45
45
|
.option('-t --token <token>', 'figma access token')
|
|
46
46
|
.option('-v --verbose', 'enable verbose logging for debugging')
|
|
47
47
|
.option('-o --outFile <file>', 'specify a file to output generated Code Connect')
|
|
@@ -56,6 +56,11 @@ function addBaseCommand(command, name, description) {
|
|
|
56
56
|
function addConnectCommandToProgram(program) {
|
|
57
57
|
// Main command, invoked with `figma connect`
|
|
58
58
|
const connectCommand = addBaseCommand(program, 'connect', 'Figma Code Connect').action((0, updates_1.withUpdateCheck)(run_wizard_1.runWizard));
|
|
59
|
+
// Make shared base flags work on either side of the subcommand name —
|
|
60
|
+
// `figma connect -v publish` and `figma connect publish -v` both honour -v.
|
|
61
|
+
connectCommand.hook('preAction', (_thisCommand, actionCommand) => {
|
|
62
|
+
Object.assign(actionCommand.opts(), actionCommand.optsWithGlobals());
|
|
63
|
+
});
|
|
59
64
|
// Sub-commands, invoked with e.g. `figma connect publish`
|
|
60
65
|
addBaseCommand(connectCommand, 'publish', 'Run Code Connect locally to find any files that have figma connections and publish them to Figma. ' +
|
|
61
66
|
'By default this looks for a config file named "figma.config.json", and uses the `include` and `exclude` fields to determine which files to parse. ' +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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","sourcesContent":["import * as commander from 'commander'\nimport fs from 'fs'\nimport { handlePreview } from './preview_utils'\nimport { upload } from '../connect/upload'\nimport { validateDocs } from '../connect/validation'\nimport { createCodeConnectFromUrl } from '../connect/create'\nimport {\n CodeConnectConfig,\n CodeConnectExecutableParserConfig,\n CodeConnectParserlessConfig,\n CodeConnectReactConfig,\n ProjectInfo,\n getProjectInfo,\n getReactProjectInfo,\n getRemoteFileUrl,\n getTsProgram,\n} from '../connect/project'\nimport { LogLevel, error, exitWithError, highlight, logger, success } from '../common/logging'\nimport { CodeConnectJSON } from '../connect/figma_connect'\nimport { convertStorybookFiles } from '../storybook/convert'\nimport { delete_docs } from '../connect/delete_docs'\nimport { runWizard } from '../connect/wizard/run_wizard'\nimport { callParser, handleMessages } from '../connect/parser_executables'\nimport { fromError } from 'zod-validation-error'\nimport { ParseRequestPayload, ParseResponsePayload } from '../connect/parser_executable_types'\nimport z from 'zod'\nimport path from 'path'\nimport { withUpdateCheck } from '../common/updates'\nimport { applyDocumentUrlSubstitutions, exitWithFeedbackMessage } from '../connect/helpers'\nimport { filterProjectInfoByFile } from './filter_project_info'\nimport { parseHtmlDoc } from '../html/parser'\nimport {\n InternalError,\n isFigmaConnectFile,\n parseCodeConnect,\n ParseFn,\n ParserError,\n ResolveImportsFn,\n} from '../connect/parser_common'\nimport { findAndResolveImports, parseReactDoc } from '../react/parser'\nimport { getInferredLanguageForRaw } from '../connect/label_language_mapping'\nimport {\n groupCodeConnectObjectsByFigmaUrl,\n writeTemplateFile,\n writeVariantTemplateFile,\n} from '../connect/migration_helpers'\nimport { isRawTemplate, parseRawFile } from '../connect/raw_templates'\nimport { parseBatchFile } from '../connect/batch_templates'\nimport { convertRemoteFileUrlToRelativePath } from '../connect/wizard/run_wizard'\nimport { getGitRepoAbsolutePath } from '../connect/project'\n\nexport type BaseCommand = commander.Command & {\n token: string\n verbose: boolean\n outFile: string\n outDir: string\n config: string\n dryRun: boolean\n dir: string\n file: string\n jsonFile: string\n skipUpdateCheck: boolean\n exitOnUnreadableFiles: boolean\n apiUrl?: string\n includeProps?: boolean\n}\n\nfunction addBaseCommand(command: commander.Command, name: string, description: string) {\n return command\n .command(name)\n .description(description)\n .usage('[options]')\n .option('-r --dir <dir>', 'directory to parse')\n .option('-f --file <file>', 'path to a single Code Connect file to process')\n .option('-t --token <token>', 'figma access token')\n .option('-v --verbose', 'enable verbose logging for debugging')\n .option('-o --outFile <file>', 'specify a file to output generated Code Connect')\n .option('-o --outDir <dir>', 'specify a directory to output generated Code Connect')\n .option('-c --config <path>', 'path to a figma config file')\n .option('-a --api-url <url>', 'custom Figma API URL to use instead of https://api.figma.com/v1')\n .option('--skip-update-check', 'skips checking for an updated version of the Figma CLI')\n .option(\n '--exit-on-unreadable-files',\n 'exit if any Code Connect files cannot be parsed. We recommend using this option for CI/CD.',\n )\n .option('--dry-run', 'tests publishing without actually publishing')\n .addHelpText(\n 'before',\n 'For feedback or bugs, please raise an issue: https://github.com/figma/code-connect/issues',\n )\n}\n\nexport function addConnectCommandToProgram(program: commander.Command) {\n // Main command, invoked with `figma connect`\n const connectCommand = addBaseCommand(program, 'connect', 'Figma Code Connect').action(\n withUpdateCheck(runWizard),\n )\n\n // Sub-commands, invoked with e.g. `figma connect publish`\n addBaseCommand(\n connectCommand,\n 'publish',\n 'Run Code Connect locally to find any files that have figma connections and publish them to Figma. ' +\n 'By default this looks for a config file named \"figma.config.json\", and uses the `include` and `exclude` fields to determine which files to parse. ' +\n 'If no config file is found, this parses the current directory. An optional `--dir` flag can be used to specify a directory to parse.',\n )\n .option('--skip-validation', 'skip validation of Code Connect docs')\n .option('-l --label <label>', 'label to apply to the published files')\n .option(\n '-b --batch-size <batch_size>',\n 'optional batch size (in number of documents) to use when uploading. Use this if you hit \"request too large\" errors. See README for more information.',\n )\n .option(\n '--include-template-files',\n '(Deprecated) No longer needed - template files are included by default. Will be removed in a future version.',\n )\n .option(\n '--force',\n 'overwrite existing UI-created Code Connect mappings if they conflict with the files being published',\n )\n .action(withUpdateCheck(handlePublish))\n\n addBaseCommand(\n connectCommand,\n 'unpublish',\n 'Run to find any files that have figma connections and unpublish them from Figma. ' +\n 'By default this looks for a config file named \"figma.config.json\", and uses the `include` and `exclude` fields to determine which files to parse. ' +\n 'If no config file is found, this parses the current directory. An optional `--dir` flag can be used to specify a directory to parse. ' +\n 'Alternatively, use `--node` and `--label` to unpublish a specific component.',\n )\n .option(\n '--node <link_to_node>',\n 'specify the node to unpublish. This will unpublish for the specified label.',\n )\n .option('-l --label <label>', 'label to unpublish for')\n .action(withUpdateCheck(handleUnpublish))\n\n addBaseCommand(\n connectCommand,\n 'parse',\n 'Run Code Connect locally to find any files that have figma connections, then converts them to JSON and outputs to stdout.',\n )\n .option('-l --label <label>', 'label to apply to the parsed files')\n .option(\n '--include-template-files',\n '(Deprecated) No longer needed - template files are included by default. Will be removed in a future version.',\n )\n .action(withUpdateCheck(handleParse))\n\n addBaseCommand(\n connectCommand,\n 'create',\n 'Generate a Code Connect file with boilerplate in the current directory for a Figma node URL',\n )\n .argument('<figma-node-url>', 'Figma node URL to create the Code Connect file from')\n .action(withUpdateCheck(handleCreate))\n\n addBaseCommand(\n connectCommand,\n 'migrate',\n 'Parse Code Connect files and migrate their templates into .figma.js files that can be published directly without parsing.',\n )\n .argument('[pattern]', 'glob pattern to match files (optional, uses config if not provided)')\n .option(\n '--include-props',\n 'preserve __props metadata blocks in migrated templates (removed by default). Use if your templates use the React .getProps() or .render() modifiers, or read executeTemplate().metadata.__props from the migrated components',\n )\n .option(\n '--javascript',\n 'output migrated templates as JavaScript (.figma.js) instead of TypeScript (.figma.ts)',\n )\n .action(withUpdateCheck(handleMigrate))\n\n addBaseCommand(\n connectCommand,\n 'preview',\n 'Preview how Code Connect snippets will render in the Figma inspect panel',\n )\n .argument(\n '[files...]',\n 'Code Connect files to preview (e.g., Button.figma.tsx). Leave empty to preview all files.',\n )\n .option('--output <format>', 'Output format: table (default) or json', 'table')\n .action(withUpdateCheck(handlePreview))\n}\n\nexport function getAccessToken(cmd: BaseCommand) {\n return cmd.token ?? process.env.FIGMA_ACCESS_TOKEN\n}\n\nexport function getAccessTokenOrExit(cmd: BaseCommand) {\n const token = getAccessToken(cmd)\n\n if (!token) {\n exitWithError(\n `Couldn't find a Figma access token. Please provide one with \\`--token <access_token>\\` or set the FIGMA_ACCESS_TOKEN environment variable`,\n )\n }\n\n return token\n}\n\nexport function getDir(cmd: BaseCommand) {\n return cmd.dir ?? process.cwd()\n}\n\nexport function setupHandler(cmd: BaseCommand) {\n if (cmd.verbose) {\n logger.setLogLevel(LogLevel.Debug)\n }\n}\n\ntype ParserDoc = z.infer<typeof ParseResponsePayload>['docs'][0]\n\nfunction transformDocFromParser(\n doc: ParserDoc,\n remoteUrl: string,\n config: CodeConnectConfig,\n): ParserDoc {\n let source = doc.source\n if (source) {\n try {\n const url = new URL(source)\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error('Invalid URL scheme')\n }\n } catch (e) {\n source = getRemoteFileUrl(source, remoteUrl, config.defaultBranch)\n }\n }\n\n // TODO This logic is duplicated in parser.ts parseDoc due to some type issues\n let figmaNode = doc.figmaNode\n if (config.documentUrlSubstitutions) {\n figmaNode = applyDocumentUrlSubstitutions(figmaNode, config.documentUrlSubstitutions)\n }\n\n return {\n ...doc,\n source,\n figmaNode,\n }\n}\n\nexport async function getCodeConnectObjects(\n cmd: BaseCommand & { label?: string },\n projectInfo: ProjectInfo,\n silent = false,\n isForMigration = false,\n): Promise<CodeConnectJSON[]> {\n if (cmd.jsonFile) {\n try {\n const docsFromJson = JSON.parse(fs.readFileSync(cmd.jsonFile, 'utf8'))\n // Strip internal fields from JSON input\n return docsFromJson.map((doc: CodeConnectJSON) => {\n const { _codeConnectFilePath, ...cleanDoc } = doc\n return cleanDoc as CodeConnectJSON\n })\n } catch (e) {\n logger.error('Failed to parse JSON file:', e)\n }\n }\n\n let codeConnectObjects: CodeConnectJSON[] = []\n\n if (projectInfo.config.parser === 'react') {\n codeConnectObjects = await getReactCodeConnectObjects(\n projectInfo as ProjectInfo<CodeConnectReactConfig>,\n cmd,\n silent,\n isForMigration,\n )\n } else if (projectInfo.config.parser === 'html') {\n codeConnectObjects = await getCodeConnectObjectsFromParseFn({\n parseFn: parseHtmlDoc,\n fileExtension: 'ts',\n projectInfo,\n cmd,\n silent,\n isForMigration,\n })\n } else if (projectInfo.config.parser) {\n const payload: ParseRequestPayload = {\n mode: 'PARSE',\n paths: projectInfo.files,\n config: { ...projectInfo.config, skipTemplateHelpers: isForMigration },\n verbose: cmd.verbose,\n }\n\n try {\n const stdout = await callParser(\n // We use `as` because the React parser makes the types difficult\n // TODO remove once React is an executable parser\n projectInfo.config as CodeConnectExecutableParserConfig,\n payload,\n projectInfo.absPath,\n )\n\n const parsed = ParseResponsePayload.parse(stdout)\n\n const { hasErrors } = handleMessages(parsed.messages)\n\n if (hasErrors) {\n exitWithError('Errors encountered calling parser, exiting')\n }\n\n codeConnectObjects = parsed.docs.map((doc) => ({\n ...transformDocFromParser(doc, projectInfo.remoteUrl, projectInfo.config),\n metadata: {\n cliVersion: require('../../package.json').version,\n },\n }))\n } catch (e) {\n if (cmd.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 returned from parser: ${fromError(e)}. Try re-running the command with --verbose for more information.`,\n )\n }\n }\n }\n\n const rawTemplateFiles = projectInfo.files.filter((f: string) => {\n // Suffix may be used by HTML / custom parsers\n const isPotentialRawTemplate =\n f.endsWith('.figma.js') ||\n f.endsWith('.figma.template.js') ||\n f.endsWith('.figma.ts') ||\n f.endsWith('.figma.template.ts')\n if (!isPotentialRawTemplate) return false\n try {\n return isRawTemplate(fs.readFileSync(f, 'utf-8'))\n } catch {\n return false\n }\n })\n\n if (rawTemplateFiles.length > 0) {\n // Resolve the label before parsing so language inference works correctly\n const resolvedLabel = cmd.label || projectInfo.config.label\n\n const rawTemplateDocs: CodeConnectJSON[] = []\n for (const file of rawTemplateFiles) {\n try {\n const doc = parseRawFile(file, resolvedLabel, projectInfo.config, projectInfo.absPath)\n // Store the Code Connect file path for migration purposes\n doc._codeConnectFilePath = file\n\n if (!silent || cmd.verbose) {\n logger.info(success(file))\n }\n rawTemplateDocs.push(doc)\n } catch (e) {\n if (!silent || cmd.verbose) {\n logger.error(`❌ ${file}`)\n if (cmd.verbose) {\n console.trace(e)\n } else {\n logger.error(e instanceof Error ? e.message : String(e))\n }\n }\n if (cmd.exitOnUnreadableFiles) {\n logger.info('Exiting due to unreadable files')\n process.exit(1)\n }\n }\n }\n\n codeConnectObjects = codeConnectObjects.concat(rawTemplateDocs)\n }\n\n // Process batch files (.figma.batch.json)\n const batchFiles = projectInfo.files.filter((f: string) => f.endsWith('.figma.batch.json'))\n\n if (batchFiles.length > 0) {\n const resolvedLabel = cmd.label || projectInfo.config.label\n\n for (const file of batchFiles) {\n try {\n const docs = parseBatchFile(file, resolvedLabel, projectInfo.config, projectInfo.absPath)\n docs.forEach((doc) => {\n doc._codeConnectFilePath = file\n })\n codeConnectObjects = codeConnectObjects.concat(docs)\n if (!silent || cmd.verbose) {\n logger.info(success(`${file} (${docs.length} components)`))\n }\n } catch (e) {\n logger.error(`${file}: ${e}`)\n if (cmd.exitOnUnreadableFiles) {\n process.exit(1)\n }\n }\n }\n }\n\n if (cmd.label || projectInfo.config.label) {\n logger.info(`Using label \"${cmd.label || projectInfo.config.label}\"`)\n codeConnectObjects.forEach((doc) => {\n doc.label = cmd.label || projectInfo.config.label || doc.label\n })\n }\n\n if (projectInfo.config.language) {\n logger.info(`Using language \"${projectInfo.config.language}\"`)\n codeConnectObjects.forEach((doc) => {\n doc.language = projectInfo.config.language || doc.language\n })\n }\n\n return codeConnectObjects\n}\n\ntype GetCodeConnectObjectsArgs = {\n parseFn: ParseFn\n resolveImportsFn?: ResolveImportsFn\n fileExtension: string | string[]\n projectInfo: ProjectInfo<CodeConnectConfig>\n cmd: BaseCommand\n silent?: boolean\n isForMigration?: boolean\n}\n\n// React/Storybook and HTML parsers are handled as special cases for now, they\n// do not use the parser executable model but instead directly call a function\n// in the code base. We may want to transition them to that model in future.\nasync function getCodeConnectObjectsFromParseFn({\n /** The function used to parse a source file into a Code Connect object */\n parseFn,\n /** Optional function used to resolve imports in a source file */\n resolveImportsFn,\n /** The file extension to filter for when checking if files should be parsed */\n fileExtension,\n /** Project info */\n projectInfo,\n /** The commander command object */\n cmd,\n /** Silences console output */\n silent = false,\n /** Whether this parse is for the migrate command */\n isForMigration = false,\n}: GetCodeConnectObjectsArgs) {\n const codeConnectObjects: CodeConnectJSON[] = []\n\n const tsProgram = getTsProgram(projectInfo)\n const { files, remoteUrl, config, absPath } = projectInfo\n\n for (const file of files.filter((f: string) => isFigmaConnectFile(tsProgram, f, fileExtension))) {\n try {\n const docs = await parseCodeConnect({\n program: tsProgram,\n file,\n config,\n parseFn,\n resolveImportsFn,\n absPath,\n parseOptions: {\n repoUrl: remoteUrl,\n debug: cmd.verbose,\n silent,\n isForMigration,\n },\n })\n\n codeConnectObjects.push(...docs)\n if (!silent || cmd.verbose) {\n logger.info(success(file))\n }\n } catch (e) {\n if (!silent || cmd.verbose) {\n logger.error(`❌ ${file}`)\n if (e instanceof ParserError) {\n if (cmd.verbose) {\n console.trace(e)\n } else {\n logger.error(e.toString())\n }\n if (cmd.exitOnUnreadableFiles) {\n logger.info('Exiting due to unreadable files')\n process.exit(1)\n }\n } else {\n if (cmd.verbose) {\n console.trace(e)\n } else {\n logger.error(new InternalError(String(e)).toString())\n }\n }\n }\n }\n }\n\n return codeConnectObjects\n}\n\nasync function getReactCodeConnectObjects(\n projectInfo: ProjectInfo<CodeConnectReactConfig>,\n cmd: BaseCommand,\n silent = false,\n isForMigration = false,\n) {\n const codeConnectObjects = await getCodeConnectObjectsFromParseFn({\n parseFn: parseReactDoc,\n resolveImportsFn: findAndResolveImports,\n fileExtension: ['tsx', 'jsx'],\n projectInfo,\n cmd,\n silent,\n isForMigration,\n })\n\n const storybookCodeConnectObjects = await convertStorybookFiles({\n projectInfo: getReactProjectInfo(projectInfo),\n isForMigration,\n })\n\n const allCodeConnectObjects = codeConnectObjects.concat(storybookCodeConnectObjects)\n\n return allCodeConnectObjects\n}\n\nasync function handlePublish(\n cmd: BaseCommand & {\n skipValidation: boolean\n label: string\n batchSize: string\n includeTemplateFiles?: boolean\n force?: boolean\n },\n) {\n setupHandler(cmd)\n\n // Show deprecation warning if the flag is used\n if (cmd.includeTemplateFiles !== undefined) {\n logger.warn(\n '[Deprecated] The --include-template-files flag is no longer needed because template files are now included by default. ' +\n \"Please don't use this flag - it will be removed in a future version.\",\n )\n }\n\n let dir = getDir(cmd)\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config), cmd.file)\n\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n if (codeConnectObjects.length === 0) {\n logger.warn(\n `No Code Connect files found in ${dir} - Make sure you have configured \\`include\\` and \\`exclude\\` in your figma.config.json file correctly, or that you are running in a directory that contains Code Connect files.`,\n )\n process.exit(0)\n }\n\n if (cmd.dryRun) {\n logger.info(`Files that would be published:`)\n logger.info(codeConnectObjects.map((o) => `- ${o.component} (${o.figmaNode})`).join('\\n'))\n }\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n if (cmd.skipValidation) {\n logger.info('Validation skipped')\n } else {\n logger.info('Validating Code Connect files...')\n var start = new Date().getTime()\n const valid = await validateDocs(\n cmd,\n accessToken,\n codeConnectObjects,\n cmd.apiUrl || projectInfo.config.apiUrl,\n )\n if (!valid) {\n exitWithFeedbackMessage(1)\n } else {\n var end = new Date().getTime()\n var time = end - start\n logger.info(`All Code Connect files are valid (${time}ms)`)\n }\n }\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n\n let batchSize\n if (cmd.batchSize) {\n batchSize = parseInt(cmd.batchSize, 10)\n if (isNaN(batchSize)) {\n logger.error('Error: failed to parse batch-size. batch-size passed must be a number')\n exitWithFeedbackMessage(1)\n }\n }\n\n upload({\n accessToken,\n docs: codeConnectObjects,\n batchSize: batchSize,\n verbose: cmd.verbose,\n apiUrl: cmd.apiUrl || projectInfo.config.apiUrl,\n force: cmd.force,\n })\n}\n\nasync function handleUnpublish(cmd: BaseCommand & { node: string; label: string }) {\n setupHandler(cmd)\n\n let dir = getDir(cmd)\n\n if (cmd.dryRun) {\n logger.info(`Files that would be unpublished:`)\n }\n\n let nodesToDeleteRelevantInfo\n\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config), cmd.file)\n\n if (cmd.node) {\n if (!cmd.label) {\n exitWithError('Label is required when specifying a node')\n }\n nodesToDeleteRelevantInfo = [{ figmaNode: cmd.node, label: cmd.label }]\n } else {\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n nodesToDeleteRelevantInfo = codeConnectObjects.map((doc) => ({\n figmaNode: doc.figmaNode,\n label: cmd.label || projectInfo.config.label || doc.label,\n }))\n\n if (cmd.label || projectInfo.config.label) {\n logger.info(`Using label ${cmd.label || projectInfo.config.label}`)\n }\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n }\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n delete_docs({\n accessToken,\n docs: nodesToDeleteRelevantInfo,\n apiUrl: cmd.apiUrl || projectInfo.config.apiUrl,\n })\n}\n\nasync function handleParse(cmd: BaseCommand & { label: string; includeTemplateFiles?: boolean }) {\n setupHandler(cmd)\n\n // Show deprecation warning if the flag is used\n if (cmd.includeTemplateFiles !== undefined) {\n logger.warn(\n '[Deprecated] The --include-template-files flag is no longer needed because template files are now included by default. ' +\n \"Please don't use this flag - it will be removed in a future version.\",\n )\n }\n\n const dir = cmd.dir ?? process.cwd()\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config), cmd.file)\n\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n\n if (cmd.outFile) {\n fs.writeFileSync(cmd.outFile, JSON.stringify(codeConnectObjects, null, 2))\n logger.info(`Wrote Code Connect JSON to ${highlight(cmd.outFile)}`)\n } else {\n // don't format the output, so it can be piped to other commands\n console.log(JSON.stringify(codeConnectObjects, undefined, 2))\n }\n}\n\nasync function handleCreate(nodeUrl: string, cmd: BaseCommand) {\n setupHandler(cmd)\n\n const dir = cmd.dir ?? process.cwd()\n const projectInfo = await getProjectInfo(dir, cmd.config)\n\n if (cmd.dryRun) {\n process.exit(0)\n }\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n return createCodeConnectFromUrl({\n accessToken,\n // We remove \\s to allow users to paste URLs inside quotes - the terminal\n // paste will add backslashes, which the quotes preserve, but expected user\n // behaviour would be to strip the quotes\n figmaNodeUrl: nodeUrl.replace(/\\\\/g, ''),\n outFile: cmd.outFile,\n outDir: cmd.outDir,\n projectInfo,\n cmd,\n })\n}\n/**\n * Migrate native parser Code Connect files to parserless. For each found doc:\n * - Replace helpers with figma.* versions\n * - Migrate v1 syntax to v2 (equivalent but more readable)\n * - Format as valid parserless file w/ url=\"\" comment\n * - Name collisions are skipped, unless file is from migration (in which case add \"_1\")\n */\nasync function handleMigrate(\n pattern: string | undefined,\n cmd: BaseCommand & { javascript?: boolean },\n) {\n setupHandler(cmd)\n\n const dir = cmd.dir ?? process.cwd()\n let projectInfo = await getProjectInfo(dir, cmd.config)\n const documentUrlSubstitutions = projectInfo.config.documentUrlSubstitutions\n\n // Clear documentUrlSubstitutions so we preserve original URLs in migrated templates\n projectInfo = {\n ...projectInfo,\n config: {\n ...projectInfo.config,\n documentUrlSubstitutions: {},\n },\n }\n\n // If a glob pattern is provided, override the project files\n if (pattern) {\n const { globSync } = require('glob')\n const files = globSync(pattern, {\n cwd: dir,\n absolute: true,\n nodir: true,\n })\n\n if (files.length === 0) {\n exitWithError(`No files found matching pattern: ${pattern}`)\n }\n\n logger.info(`Found ${files.length} file(s) matching pattern: ${pattern}`)\n projectInfo = {\n ...projectInfo,\n files,\n }\n }\n\n // Parse the files to get Code Connect objects\n const allCodeConnectObjects = await getCodeConnectObjects(cmd, projectInfo, false, true)\n\n const codeConnectObjectsByFigmaUrl = groupCodeConnectObjectsByFigmaUrl(allCodeConnectObjects)\n\n const groupCount = Object.keys(codeConnectObjectsByFigmaUrl).length\n if (groupCount === 0) {\n exitWithError('No Code Connect objects found to migrate')\n }\n\n logger.info(`Found ${groupCount} component(s) to migrate`)\n let migratedCount = 0\n let skippedCount = 0\n const errors: string[] = []\n\n const filePathsCreated = new Set<string>()\n const gitRootPath = getGitRepoAbsolutePath(dir)\n const useTypeScript = !cmd.javascript\n\n for (const [figmaUrl, group] of Object.entries(codeConnectObjectsByFigmaUrl)) {\n try {\n const hasVariants = group.variants.length > 0\n const representativeDoc = group.main ?? group.variants[0]\n if (!representativeDoc?.template) {\n logger.warn(`Skipping ${figmaUrl}: no template found`)\n skippedCount++\n continue\n }\n\n // Determine local source path for output location\n let localSourcePath: string | undefined\n\n if (representativeDoc._codeConnectFilePath) {\n // Use the Code Connect file path directly (preferred)\n localSourcePath = representativeDoc._codeConnectFilePath\n } else if (representativeDoc?.source && gitRootPath) {\n // Fallback: Convert remote file URL to local path\n const relativePath = convertRemoteFileUrlToRelativePath({\n remoteFileUrl: representativeDoc.source,\n gitRootPath,\n dir,\n })\n if (relativePath) {\n localSourcePath = path.resolve(dir, relativePath)\n }\n }\n\n const { outputPath, skipped } = hasVariants\n ? writeVariantTemplateFile(group, figmaUrl, cmd.outDir, dir, {\n localSourcePath,\n filePathsCreated,\n useTypeScript,\n includeProps: cmd.includeProps,\n })\n : writeTemplateFile(representativeDoc, cmd.outDir, dir, {\n localSourcePath,\n filePathsCreated,\n includeProps: cmd.includeProps,\n useTypeScript,\n })\n\n if (skipped) {\n logger.warn(`Skipping ${outputPath}: file already exists`)\n skippedCount++\n } else {\n logger.info(\n `${success('✓')} Migrated${hasVariants ? ' (with variants)' : ''} to ${highlight(outputPath)}`,\n )\n migratedCount++\n }\n } catch (error) {\n const errorMsg = `Failed to migrate ${figmaUrl}: ${error}`\n logger.error(errorMsg)\n errors.push(errorMsg)\n }\n }\n\n if (migratedCount > 0) {\n if (cmd.outDir) {\n const configFilePath = path.join(cmd.outDir, 'figma.config.json')\n if (fs.existsSync(configFilePath)) {\n logger.warn(`Config file already exists at ${highlight(configFilePath)}`)\n } else {\n const { language: docLanguage, label } = allCodeConnectObjects[0]\n\n const language = getInferredLanguageForRaw(label, docLanguage)\n const config: CodeConnectParserlessConfig = {\n parser: undefined,\n include: [useTypeScript ? '**/*.figma.ts' : '**/*.figma.js'],\n language,\n label,\n ...(documentUrlSubstitutions && Object.keys(documentUrlSubstitutions).length > 0\n ? { documentUrlSubstitutions }\n : {}),\n }\n fs.writeFileSync(configFilePath, JSON.stringify({ codeConnect: config }, null, 2))\n logger.info(`${success('✓')} Wrote Figma config to ${highlight(configFilePath)}`)\n }\n }\n }\n\n // Summary\n console.log('')\n logger.info(\n `Migration complete: ${success(`${migratedCount} migrated`)}, ${skippedCount} skipped`,\n )\n\n if (errors.length > 0) {\n console.log('')\n logger.error(`Encountered ${errors.length} error(s):`)\n errors.forEach((err) => logger.error(` ${err}`))\n process.exit(1)\n }\n\n if (migratedCount === 0) {\n exitWithError('No files were migrated')\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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","sourcesContent":["import * as commander from 'commander'\nimport fs from 'fs'\nimport { handlePreview } from './preview_utils'\nimport { upload } from '../connect/upload'\nimport { validateDocs } from '../connect/validation'\nimport { createCodeConnectFromUrl } from '../connect/create'\nimport {\n CodeConnectConfig,\n CodeConnectExecutableParserConfig,\n CodeConnectParserlessConfig,\n CodeConnectReactConfig,\n ProjectInfo,\n getProjectInfo,\n getReactProjectInfo,\n getRemoteFileUrl,\n getTsProgram,\n} from '../connect/project'\nimport { LogLevel, error, exitWithError, highlight, logger, success } from '../common/logging'\nimport { CodeConnectJSON } from '../connect/figma_connect'\nimport { convertStorybookFiles } from '../storybook/convert'\nimport { delete_docs } from '../connect/delete_docs'\nimport { runWizard } from '../connect/wizard/run_wizard'\nimport { callParser, handleMessages } from '../connect/parser_executables'\nimport { fromError } from 'zod-validation-error'\nimport { ParseRequestPayload, ParseResponsePayload } from '../connect/parser_executable_types'\nimport z from 'zod'\nimport path from 'path'\nimport { withUpdateCheck } from '../common/updates'\nimport { applyDocumentUrlSubstitutions, exitWithFeedbackMessage } from '../connect/helpers'\nimport { filterProjectInfoByFile } from './filter_project_info'\nimport { parseHtmlDoc } from '../html/parser'\nimport {\n InternalError,\n isFigmaConnectFile,\n parseCodeConnect,\n ParseFn,\n ParserError,\n ResolveImportsFn,\n} from '../connect/parser_common'\nimport { findAndResolveImports, parseReactDoc } from '../react/parser'\nimport { getInferredLanguageForRaw } from '../connect/label_language_mapping'\nimport {\n groupCodeConnectObjectsByFigmaUrl,\n writeTemplateFile,\n writeVariantTemplateFile,\n} from '../connect/migration_helpers'\nimport { isRawTemplate, parseRawFile } from '../connect/raw_templates'\nimport { parseBatchFile } from '../connect/batch_templates'\nimport { convertRemoteFileUrlToRelativePath } from '../connect/wizard/run_wizard'\nimport { getGitRepoAbsolutePath } from '../connect/project'\n\nexport type BaseCommand = commander.Command & {\n token: string\n verbose: boolean\n outFile: string\n outDir: string\n config: string\n dryRun: boolean\n dir: string\n file: string[]\n jsonFile: string\n skipUpdateCheck: boolean\n exitOnUnreadableFiles: boolean\n apiUrl?: string\n includeProps?: boolean\n}\n\nfunction addBaseCommand(command: commander.Command, name: string, description: string) {\n return command\n .command(name)\n .description(description)\n .usage('[options]')\n .option('-r --dir <dir>', 'directory to parse')\n .option(\n '-f --file <file...>',\n 'paths to one or more Code Connect files to process (space-separated)',\n )\n .option('-t --token <token>', 'figma access token')\n .option('-v --verbose', 'enable verbose logging for debugging')\n .option('-o --outFile <file>', 'specify a file to output generated Code Connect')\n .option('-o --outDir <dir>', 'specify a directory to output generated Code Connect')\n .option('-c --config <path>', 'path to a figma config file')\n .option('-a --api-url <url>', 'custom Figma API URL to use instead of https://api.figma.com/v1')\n .option('--skip-update-check', 'skips checking for an updated version of the Figma CLI')\n .option(\n '--exit-on-unreadable-files',\n 'exit if any Code Connect files cannot be parsed. We recommend using this option for CI/CD.',\n )\n .option('--dry-run', 'tests publishing without actually publishing')\n .addHelpText(\n 'before',\n 'For feedback or bugs, please raise an issue: https://github.com/figma/code-connect/issues',\n )\n}\n\nexport function addConnectCommandToProgram(program: commander.Command) {\n // Main command, invoked with `figma connect`\n const connectCommand = addBaseCommand(program, 'connect', 'Figma Code Connect').action(\n withUpdateCheck(runWizard),\n )\n\n // Make shared base flags work on either side of the subcommand name —\n // `figma connect -v publish` and `figma connect publish -v` both honour -v.\n connectCommand.hook('preAction', (_thisCommand, actionCommand) => {\n Object.assign(actionCommand.opts(), actionCommand.optsWithGlobals())\n })\n\n // Sub-commands, invoked with e.g. `figma connect publish`\n addBaseCommand(\n connectCommand,\n 'publish',\n 'Run Code Connect locally to find any files that have figma connections and publish them to Figma. ' +\n 'By default this looks for a config file named \"figma.config.json\", and uses the `include` and `exclude` fields to determine which files to parse. ' +\n 'If no config file is found, this parses the current directory. An optional `--dir` flag can be used to specify a directory to parse.',\n )\n .option('--skip-validation', 'skip validation of Code Connect docs')\n .option('-l --label <label>', 'label to apply to the published files')\n .option(\n '-b --batch-size <batch_size>',\n 'optional batch size (in number of documents) to use when uploading. Use this if you hit \"request too large\" errors. See README for more information.',\n )\n .option(\n '--include-template-files',\n '(Deprecated) No longer needed - template files are included by default. Will be removed in a future version.',\n )\n .option(\n '--force',\n 'overwrite existing UI-created Code Connect mappings if they conflict with the files being published',\n )\n .action(withUpdateCheck(handlePublish))\n\n addBaseCommand(\n connectCommand,\n 'unpublish',\n 'Run to find any files that have figma connections and unpublish them from Figma. ' +\n 'By default this looks for a config file named \"figma.config.json\", and uses the `include` and `exclude` fields to determine which files to parse. ' +\n 'If no config file is found, this parses the current directory. An optional `--dir` flag can be used to specify a directory to parse. ' +\n 'Alternatively, use `--node` and `--label` to unpublish a specific component.',\n )\n .option(\n '--node <link_to_node>',\n 'specify the node to unpublish. This will unpublish for the specified label.',\n )\n .option('-l --label <label>', 'label to unpublish for')\n .action(withUpdateCheck(handleUnpublish))\n\n addBaseCommand(\n connectCommand,\n 'parse',\n 'Run Code Connect locally to find any files that have figma connections, then converts them to JSON and outputs to stdout.',\n )\n .option('-l --label <label>', 'label to apply to the parsed files')\n .option(\n '--include-template-files',\n '(Deprecated) No longer needed - template files are included by default. Will be removed in a future version.',\n )\n .action(withUpdateCheck(handleParse))\n\n addBaseCommand(\n connectCommand,\n 'create',\n 'Generate a Code Connect file with boilerplate in the current directory for a Figma node URL',\n )\n .argument('<figma-node-url>', 'Figma node URL to create the Code Connect file from')\n .action(withUpdateCheck(handleCreate))\n\n addBaseCommand(\n connectCommand,\n 'migrate',\n 'Parse Code Connect files and migrate their templates into .figma.js files that can be published directly without parsing.',\n )\n .argument('[pattern]', 'glob pattern to match files (optional, uses config if not provided)')\n .option(\n '--include-props',\n 'preserve __props metadata blocks in migrated templates (removed by default). Use if your templates use the React .getProps() or .render() modifiers, or read executeTemplate().metadata.__props from the migrated components',\n )\n .option(\n '--javascript',\n 'output migrated templates as JavaScript (.figma.js) instead of TypeScript (.figma.ts)',\n )\n .action(withUpdateCheck(handleMigrate))\n\n addBaseCommand(\n connectCommand,\n 'preview',\n 'Preview how Code Connect snippets will render in the Figma inspect panel',\n )\n .argument(\n '[files...]',\n 'Code Connect files to preview (e.g., Button.figma.tsx). Leave empty to preview all files.',\n )\n .option('--output <format>', 'Output format: table (default) or json', 'table')\n .action(withUpdateCheck(handlePreview))\n}\n\nexport function getAccessToken(cmd: BaseCommand) {\n return cmd.token ?? process.env.FIGMA_ACCESS_TOKEN\n}\n\nexport function getAccessTokenOrExit(cmd: BaseCommand) {\n const token = getAccessToken(cmd)\n\n if (!token) {\n exitWithError(\n `Couldn't find a Figma access token. Please provide one with \\`--token <access_token>\\` or set the FIGMA_ACCESS_TOKEN environment variable`,\n )\n }\n\n return token\n}\n\nexport function getDir(cmd: BaseCommand) {\n return cmd.dir ?? process.cwd()\n}\n\nexport function setupHandler(cmd: BaseCommand) {\n if (cmd.verbose) {\n logger.setLogLevel(LogLevel.Debug)\n }\n}\n\ntype ParserDoc = z.infer<typeof ParseResponsePayload>['docs'][0]\n\nfunction transformDocFromParser(\n doc: ParserDoc,\n remoteUrl: string,\n config: CodeConnectConfig,\n): ParserDoc {\n let source = doc.source\n if (source) {\n try {\n const url = new URL(source)\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error('Invalid URL scheme')\n }\n } catch (e) {\n source = getRemoteFileUrl(source, remoteUrl, config.defaultBranch)\n }\n }\n\n // TODO This logic is duplicated in parser.ts parseDoc due to some type issues\n let figmaNode = doc.figmaNode\n if (config.documentUrlSubstitutions) {\n figmaNode = applyDocumentUrlSubstitutions(figmaNode, config.documentUrlSubstitutions)\n }\n\n return {\n ...doc,\n source,\n figmaNode,\n }\n}\n\nexport async function getCodeConnectObjects(\n cmd: BaseCommand & { label?: string },\n projectInfo: ProjectInfo,\n silent = false,\n isForMigration = false,\n): Promise<CodeConnectJSON[]> {\n if (cmd.jsonFile) {\n try {\n const docsFromJson = JSON.parse(fs.readFileSync(cmd.jsonFile, 'utf8'))\n // Strip internal fields from JSON input\n return docsFromJson.map((doc: CodeConnectJSON) => {\n const { _codeConnectFilePath, ...cleanDoc } = doc\n return cleanDoc as CodeConnectJSON\n })\n } catch (e) {\n logger.error('Failed to parse JSON file:', e)\n }\n }\n\n let codeConnectObjects: CodeConnectJSON[] = []\n\n if (projectInfo.config.parser === 'react') {\n codeConnectObjects = await getReactCodeConnectObjects(\n projectInfo as ProjectInfo<CodeConnectReactConfig>,\n cmd,\n silent,\n isForMigration,\n )\n } else if (projectInfo.config.parser === 'html') {\n codeConnectObjects = await getCodeConnectObjectsFromParseFn({\n parseFn: parseHtmlDoc,\n fileExtension: 'ts',\n projectInfo,\n cmd,\n silent,\n isForMigration,\n })\n } else if (projectInfo.config.parser) {\n const payload: ParseRequestPayload = {\n mode: 'PARSE',\n paths: projectInfo.files,\n config: { ...projectInfo.config, skipTemplateHelpers: isForMigration },\n verbose: cmd.verbose,\n }\n\n try {\n const stdout = await callParser(\n // We use `as` because the React parser makes the types difficult\n // TODO remove once React is an executable parser\n projectInfo.config as CodeConnectExecutableParserConfig,\n payload,\n projectInfo.absPath,\n )\n\n const parsed = ParseResponsePayload.parse(stdout)\n\n const { hasErrors } = handleMessages(parsed.messages)\n\n if (hasErrors) {\n exitWithError('Errors encountered calling parser, exiting')\n }\n\n codeConnectObjects = parsed.docs.map((doc) => ({\n ...transformDocFromParser(doc, projectInfo.remoteUrl, projectInfo.config),\n metadata: {\n cliVersion: require('../../package.json').version,\n },\n }))\n } catch (e) {\n if (cmd.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 returned from parser: ${fromError(e)}. Try re-running the command with --verbose for more information.`,\n )\n }\n }\n }\n\n const rawTemplateFiles = projectInfo.files.filter((f: string) => {\n // Suffix may be used by HTML / custom parsers\n const isPotentialRawTemplate =\n f.endsWith('.figma.js') ||\n f.endsWith('.figma.template.js') ||\n f.endsWith('.figma.ts') ||\n f.endsWith('.figma.template.ts')\n if (!isPotentialRawTemplate) return false\n try {\n return isRawTemplate(fs.readFileSync(f, 'utf-8'))\n } catch {\n return false\n }\n })\n\n if (rawTemplateFiles.length > 0) {\n // Resolve the label before parsing so language inference works correctly\n const resolvedLabel = cmd.label || projectInfo.config.label\n\n const rawTemplateDocs: CodeConnectJSON[] = []\n for (const file of rawTemplateFiles) {\n try {\n const doc = parseRawFile(file, resolvedLabel, projectInfo.config, projectInfo.absPath)\n // Store the Code Connect file path for migration purposes\n doc._codeConnectFilePath = file\n\n if (!silent || cmd.verbose) {\n logger.info(success(file))\n }\n rawTemplateDocs.push(doc)\n } catch (e) {\n if (!silent || cmd.verbose) {\n logger.error(`❌ ${file}`)\n if (cmd.verbose) {\n console.trace(e)\n } else {\n logger.error(e instanceof Error ? e.message : String(e))\n }\n }\n if (cmd.exitOnUnreadableFiles) {\n logger.info('Exiting due to unreadable files')\n process.exit(1)\n }\n }\n }\n\n codeConnectObjects = codeConnectObjects.concat(rawTemplateDocs)\n }\n\n // Process batch files (.figma.batch.json)\n const batchFiles = projectInfo.files.filter((f: string) => f.endsWith('.figma.batch.json'))\n\n if (batchFiles.length > 0) {\n const resolvedLabel = cmd.label || projectInfo.config.label\n\n for (const file of batchFiles) {\n try {\n const docs = parseBatchFile(file, resolvedLabel, projectInfo.config, projectInfo.absPath)\n docs.forEach((doc) => {\n doc._codeConnectFilePath = file\n })\n codeConnectObjects = codeConnectObjects.concat(docs)\n if (!silent || cmd.verbose) {\n logger.info(success(`${file} (${docs.length} components)`))\n }\n } catch (e) {\n logger.error(`${file}: ${e}`)\n if (cmd.exitOnUnreadableFiles) {\n process.exit(1)\n }\n }\n }\n }\n\n if (cmd.label || projectInfo.config.label) {\n logger.info(`Using label \"${cmd.label || projectInfo.config.label}\"`)\n codeConnectObjects.forEach((doc) => {\n doc.label = cmd.label || projectInfo.config.label || doc.label\n })\n }\n\n if (projectInfo.config.language) {\n logger.info(`Using language \"${projectInfo.config.language}\"`)\n codeConnectObjects.forEach((doc) => {\n doc.language = projectInfo.config.language || doc.language\n })\n }\n\n return codeConnectObjects\n}\n\ntype GetCodeConnectObjectsArgs = {\n parseFn: ParseFn\n resolveImportsFn?: ResolveImportsFn\n fileExtension: string | string[]\n projectInfo: ProjectInfo<CodeConnectConfig>\n cmd: BaseCommand\n silent?: boolean\n isForMigration?: boolean\n}\n\n// React/Storybook and HTML parsers are handled as special cases for now, they\n// do not use the parser executable model but instead directly call a function\n// in the code base. We may want to transition them to that model in future.\nasync function getCodeConnectObjectsFromParseFn({\n /** The function used to parse a source file into a Code Connect object */\n parseFn,\n /** Optional function used to resolve imports in a source file */\n resolveImportsFn,\n /** The file extension to filter for when checking if files should be parsed */\n fileExtension,\n /** Project info */\n projectInfo,\n /** The commander command object */\n cmd,\n /** Silences console output */\n silent = false,\n /** Whether this parse is for the migrate command */\n isForMigration = false,\n}: GetCodeConnectObjectsArgs) {\n const codeConnectObjects: CodeConnectJSON[] = []\n\n const tsProgram = getTsProgram(projectInfo)\n const { files, remoteUrl, config, absPath } = projectInfo\n\n for (const file of files.filter((f: string) => isFigmaConnectFile(tsProgram, f, fileExtension))) {\n try {\n const docs = await parseCodeConnect({\n program: tsProgram,\n file,\n config,\n parseFn,\n resolveImportsFn,\n absPath,\n parseOptions: {\n repoUrl: remoteUrl,\n debug: cmd.verbose,\n silent,\n isForMigration,\n },\n })\n\n codeConnectObjects.push(...docs)\n if (!silent || cmd.verbose) {\n logger.info(success(file))\n }\n } catch (e) {\n if (!silent || cmd.verbose) {\n logger.error(`❌ ${file}`)\n if (e instanceof ParserError) {\n if (cmd.verbose) {\n console.trace(e)\n } else {\n logger.error(e.toString())\n }\n if (cmd.exitOnUnreadableFiles) {\n logger.info('Exiting due to unreadable files')\n process.exit(1)\n }\n } else {\n if (cmd.verbose) {\n console.trace(e)\n } else {\n logger.error(new InternalError(String(e)).toString())\n }\n }\n }\n }\n }\n\n return codeConnectObjects\n}\n\nasync function getReactCodeConnectObjects(\n projectInfo: ProjectInfo<CodeConnectReactConfig>,\n cmd: BaseCommand,\n silent = false,\n isForMigration = false,\n) {\n const codeConnectObjects = await getCodeConnectObjectsFromParseFn({\n parseFn: parseReactDoc,\n resolveImportsFn: findAndResolveImports,\n fileExtension: ['tsx', 'jsx'],\n projectInfo,\n cmd,\n silent,\n isForMigration,\n })\n\n const storybookCodeConnectObjects = await convertStorybookFiles({\n projectInfo: getReactProjectInfo(projectInfo),\n isForMigration,\n })\n\n const allCodeConnectObjects = codeConnectObjects.concat(storybookCodeConnectObjects)\n\n return allCodeConnectObjects\n}\n\nasync function handlePublish(\n cmd: BaseCommand & {\n skipValidation: boolean\n label: string\n batchSize: string\n includeTemplateFiles?: boolean\n force?: boolean\n },\n) {\n setupHandler(cmd)\n\n // Show deprecation warning if the flag is used\n if (cmd.includeTemplateFiles !== undefined) {\n logger.warn(\n '[Deprecated] The --include-template-files flag is no longer needed because template files are now included by default. ' +\n \"Please don't use this flag - it will be removed in a future version.\",\n )\n }\n\n let dir = getDir(cmd)\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config), cmd.file)\n\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n if (codeConnectObjects.length === 0) {\n logger.warn(\n `No Code Connect files found in ${dir} - Make sure you have configured \\`include\\` and \\`exclude\\` in your figma.config.json file correctly, or that you are running in a directory that contains Code Connect files.`,\n )\n process.exit(0)\n }\n\n if (cmd.dryRun) {\n logger.info(`Files that would be published:`)\n logger.info(codeConnectObjects.map((o) => `- ${o.component} (${o.figmaNode})`).join('\\n'))\n }\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n if (cmd.skipValidation) {\n logger.info('Validation skipped')\n } else {\n logger.info('Validating Code Connect files...')\n var start = new Date().getTime()\n const valid = await validateDocs(\n cmd,\n accessToken,\n codeConnectObjects,\n cmd.apiUrl || projectInfo.config.apiUrl,\n )\n if (!valid) {\n exitWithFeedbackMessage(1)\n } else {\n var end = new Date().getTime()\n var time = end - start\n logger.info(`All Code Connect files are valid (${time}ms)`)\n }\n }\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n\n let batchSize\n if (cmd.batchSize) {\n batchSize = parseInt(cmd.batchSize, 10)\n if (isNaN(batchSize)) {\n logger.error('Error: failed to parse batch-size. batch-size passed must be a number')\n exitWithFeedbackMessage(1)\n }\n }\n\n upload({\n accessToken,\n docs: codeConnectObjects,\n batchSize: batchSize,\n verbose: cmd.verbose,\n apiUrl: cmd.apiUrl || projectInfo.config.apiUrl,\n force: cmd.force,\n })\n}\n\nasync function handleUnpublish(cmd: BaseCommand & { node: string; label: string }) {\n setupHandler(cmd)\n\n let dir = getDir(cmd)\n\n if (cmd.dryRun) {\n logger.info(`Files that would be unpublished:`)\n }\n\n let nodesToDeleteRelevantInfo\n\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config), cmd.file)\n\n if (cmd.node) {\n if (!cmd.label) {\n exitWithError('Label is required when specifying a node')\n }\n nodesToDeleteRelevantInfo = [{ figmaNode: cmd.node, label: cmd.label }]\n } else {\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n nodesToDeleteRelevantInfo = codeConnectObjects.map((doc) => ({\n figmaNode: doc.figmaNode,\n label: cmd.label || projectInfo.config.label || doc.label,\n }))\n\n if (cmd.label || projectInfo.config.label) {\n logger.info(`Using label ${cmd.label || projectInfo.config.label}`)\n }\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n }\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n delete_docs({\n accessToken,\n docs: nodesToDeleteRelevantInfo,\n apiUrl: cmd.apiUrl || projectInfo.config.apiUrl,\n })\n}\n\nasync function handleParse(cmd: BaseCommand & { label: string; includeTemplateFiles?: boolean }) {\n setupHandler(cmd)\n\n // Show deprecation warning if the flag is used\n if (cmd.includeTemplateFiles !== undefined) {\n logger.warn(\n '[Deprecated] The --include-template-files flag is no longer needed because template files are now included by default. ' +\n \"Please don't use this flag - it will be removed in a future version.\",\n )\n }\n\n const dir = cmd.dir ?? process.cwd()\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config), cmd.file)\n\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n\n if (cmd.outFile) {\n fs.writeFileSync(cmd.outFile, JSON.stringify(codeConnectObjects, null, 2))\n logger.info(`Wrote Code Connect JSON to ${highlight(cmd.outFile)}`)\n } else {\n // don't format the output, so it can be piped to other commands\n console.log(JSON.stringify(codeConnectObjects, undefined, 2))\n }\n}\n\nasync function handleCreate(nodeUrl: string, cmd: BaseCommand) {\n setupHandler(cmd)\n\n const dir = cmd.dir ?? process.cwd()\n const projectInfo = await getProjectInfo(dir, cmd.config)\n\n if (cmd.dryRun) {\n process.exit(0)\n }\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n return createCodeConnectFromUrl({\n accessToken,\n // We remove \\s to allow users to paste URLs inside quotes - the terminal\n // paste will add backslashes, which the quotes preserve, but expected user\n // behaviour would be to strip the quotes\n figmaNodeUrl: nodeUrl.replace(/\\\\/g, ''),\n outFile: cmd.outFile,\n outDir: cmd.outDir,\n projectInfo,\n cmd,\n })\n}\n/**\n * Migrate native parser Code Connect files to parserless. For each found doc:\n * - Replace helpers with figma.* versions\n * - Migrate v1 syntax to v2 (equivalent but more readable)\n * - Format as valid parserless file w/ url=\"\" comment\n * - Name collisions are skipped, unless file is from migration (in which case add \"_1\")\n */\nasync function handleMigrate(\n pattern: string | undefined,\n cmd: BaseCommand & { javascript?: boolean },\n) {\n setupHandler(cmd)\n\n const dir = cmd.dir ?? process.cwd()\n let projectInfo = await getProjectInfo(dir, cmd.config)\n const documentUrlSubstitutions = projectInfo.config.documentUrlSubstitutions\n\n // Clear documentUrlSubstitutions so we preserve original URLs in migrated templates\n projectInfo = {\n ...projectInfo,\n config: {\n ...projectInfo.config,\n documentUrlSubstitutions: {},\n },\n }\n\n // If a glob pattern is provided, override the project files\n if (pattern) {\n const { globSync } = require('glob')\n const files = globSync(pattern, {\n cwd: dir,\n absolute: true,\n nodir: true,\n })\n\n if (files.length === 0) {\n exitWithError(`No files found matching pattern: ${pattern}`)\n }\n\n logger.info(`Found ${files.length} file(s) matching pattern: ${pattern}`)\n projectInfo = {\n ...projectInfo,\n files,\n }\n }\n\n // Parse the files to get Code Connect objects\n const allCodeConnectObjects = await getCodeConnectObjects(cmd, projectInfo, false, true)\n\n const codeConnectObjectsByFigmaUrl = groupCodeConnectObjectsByFigmaUrl(allCodeConnectObjects)\n\n const groupCount = Object.keys(codeConnectObjectsByFigmaUrl).length\n if (groupCount === 0) {\n exitWithError('No Code Connect objects found to migrate')\n }\n\n logger.info(`Found ${groupCount} component(s) to migrate`)\n let migratedCount = 0\n let skippedCount = 0\n const errors: string[] = []\n\n const filePathsCreated = new Set<string>()\n const gitRootPath = getGitRepoAbsolutePath(dir)\n const useTypeScript = !cmd.javascript\n\n for (const [figmaUrl, group] of Object.entries(codeConnectObjectsByFigmaUrl)) {\n try {\n const hasVariants = group.variants.length > 0\n const representativeDoc = group.main ?? group.variants[0]\n if (!representativeDoc?.template) {\n logger.warn(`Skipping ${figmaUrl}: no template found`)\n skippedCount++\n continue\n }\n\n // Determine local source path for output location\n let localSourcePath: string | undefined\n\n if (representativeDoc._codeConnectFilePath) {\n // Use the Code Connect file path directly (preferred)\n localSourcePath = representativeDoc._codeConnectFilePath\n } else if (representativeDoc?.source && gitRootPath) {\n // Fallback: Convert remote file URL to local path\n const relativePath = convertRemoteFileUrlToRelativePath({\n remoteFileUrl: representativeDoc.source,\n gitRootPath,\n dir,\n })\n if (relativePath) {\n localSourcePath = path.resolve(dir, relativePath)\n }\n }\n\n const { outputPath, skipped } = hasVariants\n ? writeVariantTemplateFile(group, figmaUrl, cmd.outDir, dir, {\n localSourcePath,\n filePathsCreated,\n useTypeScript,\n includeProps: cmd.includeProps,\n })\n : writeTemplateFile(representativeDoc, cmd.outDir, dir, {\n localSourcePath,\n filePathsCreated,\n includeProps: cmd.includeProps,\n useTypeScript,\n })\n\n if (skipped) {\n logger.warn(`Skipping ${outputPath}: file already exists`)\n skippedCount++\n } else {\n logger.info(\n `${success('✓')} Migrated${hasVariants ? ' (with variants)' : ''} to ${highlight(outputPath)}`,\n )\n migratedCount++\n }\n } catch (error) {\n const errorMsg = `Failed to migrate ${figmaUrl}: ${error}`\n logger.error(errorMsg)\n errors.push(errorMsg)\n }\n }\n\n if (migratedCount > 0) {\n if (cmd.outDir) {\n const configFilePath = path.join(cmd.outDir, 'figma.config.json')\n if (fs.existsSync(configFilePath)) {\n logger.warn(`Config file already exists at ${highlight(configFilePath)}`)\n } else {\n const { language: docLanguage, label } = allCodeConnectObjects[0]\n\n const language = getInferredLanguageForRaw(label, docLanguage)\n const config: CodeConnectParserlessConfig = {\n parser: undefined,\n include: [useTypeScript ? '**/*.figma.ts' : '**/*.figma.js'],\n language,\n label,\n ...(documentUrlSubstitutions && Object.keys(documentUrlSubstitutions).length > 0\n ? { documentUrlSubstitutions }\n : {}),\n }\n fs.writeFileSync(configFilePath, JSON.stringify({ codeConnect: config }, null, 2))\n logger.info(`${success('✓')} Wrote Figma config to ${highlight(configFilePath)}`)\n }\n }\n }\n\n // Summary\n console.log('')\n logger.info(\n `Migration complete: ${success(`${migratedCount} migrated`)}, ${skippedCount} skipped`,\n )\n\n if (errors.length > 0) {\n console.log('')\n logger.error(`Encountered ${errors.length} error(s):`)\n errors.forEach((err) => logger.error(` ${err}`))\n process.exit(1)\n }\n\n if (migratedCount === 0) {\n exitWithError('No files were migrated')\n }\n}\n"]}
|
|
@@ -11,7 +11,7 @@ export type BaseCommand = commander.Command & {
|
|
|
11
11
|
config: string;
|
|
12
12
|
dryRun: boolean;
|
|
13
13
|
dir: string;
|
|
14
|
-
file: string;
|
|
14
|
+
file: string[];
|
|
15
15
|
jsonFile: string;
|
|
16
16
|
skipUpdateCheck: boolean;
|
|
17
17
|
exitOnUnreadableFiles: boolean;
|
|
@@ -29,7 +29,7 @@ interface ProgramOptions {
|
|
|
29
29
|
*
|
|
30
30
|
* Note: does NOT use addBaseCommand internally because that function registers
|
|
31
31
|
* both `-o --outFile` and `-o --outDir` with the same `-o` short flag.
|
|
32
|
-
* commander@12+ (used by
|
|
32
|
+
* commander@12+ (used by @figma/cli) throws a conflict error on duplicate flags.
|
|
33
33
|
*/
|
|
34
34
|
export declare function addCodeConnectCommandsToProgram(program: commander.Command, programOptions?: ProgramOptions): void;
|
|
35
35
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect_template.d.ts","sourceRoot":"","sources":["../../src/commands/connect_template.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AActC,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"connect_template.d.ts","sourceRoot":"","sources":["../../src/commands/connect_template.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AActC,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,OAAO,CAAA;IACxB,qBAAqB,EAAE,OAAO,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAuRD,UAAU,cAAc;IACtB,qGAAqG;IACrG,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,SAAS,CAAC,OAAO,EAC1B,cAAc,GAAE,cAAmB,QAuHpC"}
|
|
@@ -246,7 +246,7 @@ async function handleCreate(nodeUrl, cmd) {
|
|
|
246
246
|
*
|
|
247
247
|
* Note: does NOT use addBaseCommand internally because that function registers
|
|
248
248
|
* both `-o --outFile` and `-o --outDir` with the same `-o` short flag.
|
|
249
|
-
* commander@12+ (used by
|
|
249
|
+
* commander@12+ (used by @figma/cli) throws a conflict error on duplicate flags.
|
|
250
250
|
*/
|
|
251
251
|
function addCodeConnectCommandsToProgram(program, programOptions = {}) {
|
|
252
252
|
function addBase(parent, name, description) {
|
|
@@ -255,7 +255,7 @@ function addCodeConnectCommandsToProgram(program, programOptions = {}) {
|
|
|
255
255
|
.description(description)
|
|
256
256
|
.usage('[options]')
|
|
257
257
|
.option('-r --dir <dir>', 'directory to parse')
|
|
258
|
-
.option('-f --file <file
|
|
258
|
+
.option('-f --file <file...>', 'paths to one or more Code Connect files to process (space-separated)')
|
|
259
259
|
.option('--outFile <file>', 'specify a file to output generated Code Connect')
|
|
260
260
|
.option('--outDir <dir>', 'specify a directory to output generated Code Connect')
|
|
261
261
|
.option('-c --config <path>', 'path to a figma config file')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect_template.js","sourceRoot":"","sources":["../../src/commands/connect_template.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Slim Code Connect entry point template-files-only support.\n */\nimport * as commander from 'commander'\nimport fs from 'fs'\nimport { upload } from '../connect/upload'\nimport { validateDocs } from '../connect/validation'\nimport { ProjectInfo, getProjectInfo } from '../connect/project'\nimport { LogLevel, exitWithError, highlight, logger, success } from '../common/logging'\nimport { CodeConnectJSON } from '../connect/figma_connect'\nimport { delete_docs } from '../connect/delete_docs'\nimport { exitWithFeedbackMessage } from '../connect/helpers'\nimport { isRawTemplate, parseRawFile } from '../connect/raw_templates'\nimport { parseBatchFile } from '../connect/batch_templates'\nimport { filterProjectInfoByFile } from './filter_project_info'\nimport { createCodeConnectFromUrl } from '../connect/create_template'\n\nexport type BaseCommand = commander.Command & {\n token: string\n useOAuth: boolean\n verbose: boolean\n outFile: string\n outDir: string\n config: string\n dryRun: boolean\n dir: string\n file: string\n jsonFile: string\n skipUpdateCheck: boolean\n exitOnUnreadableFiles: boolean\n apiUrl?: string\n includeProps?: boolean\n}\n\nfunction getAccessTokenOrExit(cmd: BaseCommand): string {\n const token = cmd.token\n if (!token) {\n exitWithError(\n cmd.useOAuth\n ? `Couldn't find a Figma OAuth token. Please re-authenticate.`\n : `Couldn't find a Figma access token. Please set the FIGMA_ACCESS_TOKEN environment variable`,\n )\n }\n return token\n}\n\nfunction setupHandler(cmd: BaseCommand) {\n if (cmd.verbose) {\n logger.setLogLevel(LogLevel.Debug)\n }\n}\n\nfunction getDir(cmd: BaseCommand) {\n return cmd.dir ?? process.cwd()\n}\n\n/**\n * Returns Code Connect objects from template files (.figma.ts / .figma.js)\n * only. Native parser paths (react, html, executable) are intentionally\n * omitted — this entry point is for parserless/template-file workflows.\n */\nasync function getCodeConnectObjects(\n cmd: BaseCommand & { label?: string },\n projectInfo: ProjectInfo,\n silent = false,\n): Promise<CodeConnectJSON[]> {\n const rawTemplateFiles = projectInfo.files.filter((f: string) => {\n const isPotentialRawTemplate =\n f.endsWith('.figma.js') ||\n f.endsWith('.figma.template.js') ||\n f.endsWith('.figma.ts') ||\n f.endsWith('.figma.template.ts')\n if (!isPotentialRawTemplate) return false\n try {\n return isRawTemplate(fs.readFileSync(f, 'utf-8'))\n } catch {\n return false\n }\n })\n\n let codeConnectObjects: CodeConnectJSON[] = []\n\n if (rawTemplateFiles.length > 0) {\n const resolvedLabel = cmd.label || projectInfo.config.label\n const rawTemplateDocs: CodeConnectJSON[] = []\n for (const file of rawTemplateFiles) {\n try {\n const doc = parseRawFile(file, resolvedLabel, projectInfo.config, projectInfo.absPath)\n doc._codeConnectFilePath = file\n if (!silent || cmd.verbose) {\n logger.info(success(file))\n }\n rawTemplateDocs.push(doc)\n } catch (e) {\n if (!silent || cmd.verbose) {\n logger.error(`❌ ${file}`)\n if (cmd.verbose) {\n console.trace(e)\n } else {\n logger.error(e instanceof Error ? e.message : String(e))\n }\n }\n if (cmd.exitOnUnreadableFiles) {\n logger.info('Exiting due to unreadable files')\n process.exit(1)\n }\n }\n }\n codeConnectObjects = codeConnectObjects.concat(rawTemplateDocs)\n }\n\n // Process batch files (.figma.batch.json)\n const batchFiles = projectInfo.files.filter((f: string) => f.endsWith('.figma.batch.json'))\n\n if (batchFiles.length > 0) {\n const resolvedLabel = cmd.label || projectInfo.config.label\n\n for (const file of batchFiles) {\n try {\n const docs = parseBatchFile(file, resolvedLabel, projectInfo.config, projectInfo.absPath)\n docs.forEach((doc) => {\n doc._codeConnectFilePath = file\n })\n codeConnectObjects = codeConnectObjects.concat(docs)\n if (!silent || cmd.verbose) {\n logger.info(success(`${file} (${docs.length} components)`))\n }\n } catch (e) {\n logger.error(`${file}: ${e}`)\n if (cmd.exitOnUnreadableFiles) {\n process.exit(1)\n }\n }\n }\n }\n\n if (cmd.label || projectInfo.config.label) {\n logger.info(`Using label \"${cmd.label || projectInfo.config.label}\"`)\n codeConnectObjects.forEach((doc) => {\n doc.label = cmd.label || projectInfo.config.label || doc.label\n })\n }\n\n if (projectInfo.config.language) {\n logger.info(`Using language \"${projectInfo.config.language}\"`)\n codeConnectObjects.forEach((doc) => {\n doc.language = projectInfo.config.language || doc.language\n })\n }\n\n return codeConnectObjects\n}\n\nasync function handlePublish(\n cmd: BaseCommand & {\n skipValidation: boolean\n label: string\n batchSize: string\n force?: boolean\n },\n) {\n setupHandler(cmd)\n\n let dir = getDir(cmd)\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config, true), cmd.file)\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n if (codeConnectObjects.length === 0) {\n logger.warn(\n `No Code Connect files found in ${dir} - Make sure you have configured \\`include\\` and \\`exclude\\` in your figma.config.json file correctly, or that you are running in a directory that contains Code Connect files.`,\n )\n process.exit(0)\n }\n\n if (cmd.dryRun) {\n logger.info(`Files that would be published:`)\n logger.info(codeConnectObjects.map((o) => `- ${o.component} (${o.figmaNode})`).join('\\n'))\n }\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n if (cmd.skipValidation) {\n logger.info('Validation skipped')\n } else {\n logger.info('Validating Code Connect files...')\n const start = new Date().getTime()\n const valid = await validateDocs(\n cmd,\n accessToken,\n codeConnectObjects,\n cmd.apiUrl || projectInfo.config.apiUrl,\n cmd.useOAuth,\n )\n if (!valid) {\n exitWithFeedbackMessage(1)\n } else {\n const end = new Date().getTime()\n const time = end - start\n logger.info(`All Code Connect files are valid (${time}ms)`)\n }\n }\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n\n let batchSize\n if (cmd.batchSize) {\n batchSize = parseInt(cmd.batchSize, 10)\n if (isNaN(batchSize)) {\n logger.error('Error: failed to parse batch-size. batch-size passed must be a number')\n exitWithFeedbackMessage(1)\n }\n }\n\n upload({\n accessToken,\n useOAuth: cmd.useOAuth,\n docs: codeConnectObjects,\n batchSize,\n verbose: cmd.verbose,\n apiUrl: cmd.apiUrl || projectInfo.config.apiUrl,\n force: cmd.force,\n })\n}\n\nasync function handleUnpublish(cmd: BaseCommand & { node: string; label: string }) {\n setupHandler(cmd)\n\n let dir = getDir(cmd)\n\n if (cmd.dryRun) {\n logger.info(`Files that would be unpublished:`)\n }\n\n let nodesToDeleteRelevantInfo\n\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config, true), cmd.file)\n\n if (cmd.node) {\n if (!cmd.label) {\n exitWithError('Label is required when specifying a node')\n }\n nodesToDeleteRelevantInfo = [{ figmaNode: cmd.node, label: cmd.label }]\n } else {\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n nodesToDeleteRelevantInfo = codeConnectObjects.map((doc) => ({\n figmaNode: doc.figmaNode,\n label: cmd.label || projectInfo.config.label || doc.label,\n }))\n\n if (cmd.label || projectInfo.config.label) {\n logger.info(`Using label ${cmd.label || projectInfo.config.label}`)\n }\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n }\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n delete_docs({\n accessToken,\n useOAuth: cmd.useOAuth,\n docs: nodesToDeleteRelevantInfo,\n apiUrl: cmd.apiUrl || projectInfo.config.apiUrl,\n })\n}\n\nasync function handleParse(cmd: BaseCommand & { label: string }) {\n setupHandler(cmd)\n\n const dir = cmd.dir ?? process.cwd()\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config, true), cmd.file)\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n\n if (cmd.outFile) {\n fs.writeFileSync(cmd.outFile, JSON.stringify(codeConnectObjects, null, 2))\n logger.info(`Wrote Code Connect JSON to ${highlight(cmd.outFile)}`)\n } else {\n console.log(JSON.stringify(codeConnectObjects, undefined, 2))\n }\n}\n\nasync function handleCreate(nodeUrl: string, cmd: BaseCommand) {\n setupHandler(cmd)\n\n const dir = getDir(cmd)\n const projectInfo = await getProjectInfo(dir, cmd.config, true)\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n return createCodeConnectFromUrl({\n accessToken,\n figmaNodeUrl: nodeUrl.replace(/\\\\/g, ''),\n outFile: cmd.outFile,\n outDir: cmd.outDir,\n projectInfo,\n cmd,\n })\n}\n\ninterface ProgramOptions {\n /** Override how the auth token is retrieved. Return undefined to fall back to FIGMA_ACCESS_TOKEN. */\n getToken?: () => string | undefined\n}\n\n/**\n * Registers Code Connect commands on a commander program, restricted to\n * template-file workflows only. Intended for use by CLIs that support\n * Code Connect during a migration period but do not need native parsers.\n *\n * Note: does NOT use addBaseCommand internally because that function registers\n * both `-o --outFile` and `-o --outDir` with the same `-o` short flag.\n * commander@12+ (used by litmus-cli) throws a conflict error on duplicate flags.\n */\nexport function addCodeConnectCommandsToProgram(\n program: commander.Command,\n programOptions: ProgramOptions = {},\n) {\n function addBase(parent: commander.Command, name: string, description: string) {\n return parent\n .command(name)\n .description(description)\n .usage('[options]')\n .option('-r --dir <dir>', 'directory to parse')\n .option('-f --file <file>', 'path to a single Code Connect file to process')\n .option('--outFile <file>', 'specify a file to output generated Code Connect')\n .option('--outDir <dir>', 'specify a directory to output generated Code Connect')\n .option('-c --config <path>', 'path to a figma config file')\n .option(\n '--exit-on-unreadable-files',\n 'exit if any Code Connect files cannot be parsed. We recommend using this option for CI/CD.',\n )\n .option('--dry-run', 'tests publishing without actually publishing')\n .addHelpText(\n 'before',\n 'For feedback or bugs, please raise an issue: https://github.com/figma/code-connect/issues',\n )\n }\n\n function wrapHandler<T extends BaseCommand>(handler: (cmd: T) => Promise<void>) {\n return (options: unknown, cmd: commander.Command) => {\n const globalOpts = cmd.optsWithGlobals<{ logLevel?: string; apiBaseUrl?: string }>()\n\n // Attempt to get a token from the provided getter (e.g. OAuth store).\n // If it returns undefined or throws (e.g. no OAuth token stored in CI),\n // fall back to FIGMA_ACCESS_TOKEN and use PAT headers.\n let oauthToken: string | undefined\n try {\n oauthToken = programOptions.getToken?.()\n } catch {\n // getToken threw (e.g. no OAuth token stored); fall back to PAT below\n }\n const token = oauthToken ?? process.env.FIGMA_ACCESS_TOKEN\n const useOAuth = oauthToken !== undefined\n\n return handler({\n ...(options as object),\n token,\n useOAuth,\n verbose: globalOpts.logLevel === 'debug',\n apiUrl: globalOpts.apiBaseUrl,\n } as unknown as T).catch((err: Error) => {\n // Commander v12 catches rejected action promises internally and exits 0.\n // Commander v11 left them as unhandled rejections, and Node.js 15+ would\n // exit 1 for those — so exit code 1 on handler errors was previously\n // accidental. This catch makes it explicit and version-independent.\n logger.error(err.message)\n process.exitCode = 1\n })\n }\n }\n\n const connectCommand = program\n .command('connect')\n .description('Code Connect commands')\n .addHelpText(\n 'before',\n 'For feedback or bugs, please raise an issue: https://github.com/figma/code-connect/issues',\n )\n connectCommand.action(() => connectCommand.help())\n\n addBase(\n connectCommand,\n 'publish',\n 'Run Code Connect locally to find any files that have figma connections and publish them to Figma. ' +\n 'By default this looks for a config file named \"figma.config.json\", and uses the `include` and `exclude` fields to determine which files to parse. ' +\n 'If no config file is found, this parses the current directory. An optional `--dir` flag can be used to specify a directory to parse.',\n )\n .option('--skip-validation', 'skip validation of Code Connect docs')\n .option('-l --label <label>', 'label to apply to the published files')\n .option(\n '-b --batch-size <batch_size>',\n 'optional batch size (in number of documents) to use when uploading. Use this if you hit \"request too large\" errors. See README for more information.',\n )\n .option(\n '--force',\n 'overwrite existing UI-created Code Connect mappings if they conflict with the files being published',\n )\n .action(wrapHandler(handlePublish))\n\n addBase(\n connectCommand,\n 'unpublish',\n 'Run to find any files that have figma connections and unpublish them from Figma. ' +\n 'By default this looks for a config file named \"figma.config.json\", and uses the `include` and `exclude` fields to determine which files to parse. ' +\n 'If no config file is found, this parses the current directory. An optional `--dir` flag can be used to specify a directory to parse. ' +\n 'Alternatively, use `--node` and `--label` to unpublish a specific component.',\n )\n .option(\n '--node <link_to_node>',\n 'specify the node to unpublish. This will unpublish for the specified label.',\n )\n .option('-l --label <label>', 'label to unpublish for')\n .action(wrapHandler(handleUnpublish))\n\n addBase(\n connectCommand,\n 'parse',\n 'Run Code Connect locally to find any files that have figma connections, then converts them to JSON and outputs to stdout.',\n )\n .option('-l --label <label>', 'label to apply to the parsed files')\n .action(wrapHandler(handleParse))\n\n addBase(\n connectCommand,\n 'create',\n 'Generate a Code Connect file with boilerplate in the current directory for a Figma node URL',\n )\n .argument('<figma-node-url>', 'Figma node URL to create the Code Connect file from')\n .action((nodeUrl: string, options: unknown, cmd: commander.Command) =>\n wrapHandler<BaseCommand>((mergedCmd) => handleCreate(nodeUrl, mergedCmd))(options, cmd),\n )\n}\n"]}
|
|
1
|
+
{"version":3,"file":"connect_template.js","sourceRoot":"","sources":["../../src/commands/connect_template.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Slim Code Connect entry point template-files-only support.\n */\nimport * as commander from 'commander'\nimport fs from 'fs'\nimport { upload } from '../connect/upload'\nimport { validateDocs } from '../connect/validation'\nimport { ProjectInfo, getProjectInfo } from '../connect/project'\nimport { LogLevel, exitWithError, highlight, logger, success } from '../common/logging'\nimport { CodeConnectJSON } from '../connect/figma_connect'\nimport { delete_docs } from '../connect/delete_docs'\nimport { exitWithFeedbackMessage } from '../connect/helpers'\nimport { isRawTemplate, parseRawFile } from '../connect/raw_templates'\nimport { parseBatchFile } from '../connect/batch_templates'\nimport { filterProjectInfoByFile } from './filter_project_info'\nimport { createCodeConnectFromUrl } from '../connect/create_template'\n\nexport type BaseCommand = commander.Command & {\n token: string\n useOAuth: boolean\n verbose: boolean\n outFile: string\n outDir: string\n config: string\n dryRun: boolean\n dir: string\n file: string[]\n jsonFile: string\n skipUpdateCheck: boolean\n exitOnUnreadableFiles: boolean\n apiUrl?: string\n includeProps?: boolean\n}\n\nfunction getAccessTokenOrExit(cmd: BaseCommand): string {\n const token = cmd.token\n if (!token) {\n exitWithError(\n cmd.useOAuth\n ? `Couldn't find a Figma OAuth token. Please re-authenticate.`\n : `Couldn't find a Figma access token. Please set the FIGMA_ACCESS_TOKEN environment variable`,\n )\n }\n return token\n}\n\nfunction setupHandler(cmd: BaseCommand) {\n if (cmd.verbose) {\n logger.setLogLevel(LogLevel.Debug)\n }\n}\n\nfunction getDir(cmd: BaseCommand) {\n return cmd.dir ?? process.cwd()\n}\n\n/**\n * Returns Code Connect objects from template files (.figma.ts / .figma.js)\n * only. Native parser paths (react, html, executable) are intentionally\n * omitted — this entry point is for parserless/template-file workflows.\n */\nasync function getCodeConnectObjects(\n cmd: BaseCommand & { label?: string },\n projectInfo: ProjectInfo,\n silent = false,\n): Promise<CodeConnectJSON[]> {\n const rawTemplateFiles = projectInfo.files.filter((f: string) => {\n const isPotentialRawTemplate =\n f.endsWith('.figma.js') ||\n f.endsWith('.figma.template.js') ||\n f.endsWith('.figma.ts') ||\n f.endsWith('.figma.template.ts')\n if (!isPotentialRawTemplate) return false\n try {\n return isRawTemplate(fs.readFileSync(f, 'utf-8'))\n } catch {\n return false\n }\n })\n\n let codeConnectObjects: CodeConnectJSON[] = []\n\n if (rawTemplateFiles.length > 0) {\n const resolvedLabel = cmd.label || projectInfo.config.label\n const rawTemplateDocs: CodeConnectJSON[] = []\n for (const file of rawTemplateFiles) {\n try {\n const doc = parseRawFile(file, resolvedLabel, projectInfo.config, projectInfo.absPath)\n doc._codeConnectFilePath = file\n if (!silent || cmd.verbose) {\n logger.info(success(file))\n }\n rawTemplateDocs.push(doc)\n } catch (e) {\n if (!silent || cmd.verbose) {\n logger.error(`❌ ${file}`)\n if (cmd.verbose) {\n console.trace(e)\n } else {\n logger.error(e instanceof Error ? e.message : String(e))\n }\n }\n if (cmd.exitOnUnreadableFiles) {\n logger.info('Exiting due to unreadable files')\n process.exit(1)\n }\n }\n }\n codeConnectObjects = codeConnectObjects.concat(rawTemplateDocs)\n }\n\n // Process batch files (.figma.batch.json)\n const batchFiles = projectInfo.files.filter((f: string) => f.endsWith('.figma.batch.json'))\n\n if (batchFiles.length > 0) {\n const resolvedLabel = cmd.label || projectInfo.config.label\n\n for (const file of batchFiles) {\n try {\n const docs = parseBatchFile(file, resolvedLabel, projectInfo.config, projectInfo.absPath)\n docs.forEach((doc) => {\n doc._codeConnectFilePath = file\n })\n codeConnectObjects = codeConnectObjects.concat(docs)\n if (!silent || cmd.verbose) {\n logger.info(success(`${file} (${docs.length} components)`))\n }\n } catch (e) {\n logger.error(`${file}: ${e}`)\n if (cmd.exitOnUnreadableFiles) {\n process.exit(1)\n }\n }\n }\n }\n\n if (cmd.label || projectInfo.config.label) {\n logger.info(`Using label \"${cmd.label || projectInfo.config.label}\"`)\n codeConnectObjects.forEach((doc) => {\n doc.label = cmd.label || projectInfo.config.label || doc.label\n })\n }\n\n if (projectInfo.config.language) {\n logger.info(`Using language \"${projectInfo.config.language}\"`)\n codeConnectObjects.forEach((doc) => {\n doc.language = projectInfo.config.language || doc.language\n })\n }\n\n return codeConnectObjects\n}\n\nasync function handlePublish(\n cmd: BaseCommand & {\n skipValidation: boolean\n label: string\n batchSize: string\n force?: boolean\n },\n) {\n setupHandler(cmd)\n\n let dir = getDir(cmd)\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config, true), cmd.file)\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n if (codeConnectObjects.length === 0) {\n logger.warn(\n `No Code Connect files found in ${dir} - Make sure you have configured \\`include\\` and \\`exclude\\` in your figma.config.json file correctly, or that you are running in a directory that contains Code Connect files.`,\n )\n process.exit(0)\n }\n\n if (cmd.dryRun) {\n logger.info(`Files that would be published:`)\n logger.info(codeConnectObjects.map((o) => `- ${o.component} (${o.figmaNode})`).join('\\n'))\n }\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n if (cmd.skipValidation) {\n logger.info('Validation skipped')\n } else {\n logger.info('Validating Code Connect files...')\n const start = new Date().getTime()\n const valid = await validateDocs(\n cmd,\n accessToken,\n codeConnectObjects,\n cmd.apiUrl || projectInfo.config.apiUrl,\n cmd.useOAuth,\n )\n if (!valid) {\n exitWithFeedbackMessage(1)\n } else {\n const end = new Date().getTime()\n const time = end - start\n logger.info(`All Code Connect files are valid (${time}ms)`)\n }\n }\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n\n let batchSize\n if (cmd.batchSize) {\n batchSize = parseInt(cmd.batchSize, 10)\n if (isNaN(batchSize)) {\n logger.error('Error: failed to parse batch-size. batch-size passed must be a number')\n exitWithFeedbackMessage(1)\n }\n }\n\n upload({\n accessToken,\n useOAuth: cmd.useOAuth,\n docs: codeConnectObjects,\n batchSize,\n verbose: cmd.verbose,\n apiUrl: cmd.apiUrl || projectInfo.config.apiUrl,\n force: cmd.force,\n })\n}\n\nasync function handleUnpublish(cmd: BaseCommand & { node: string; label: string }) {\n setupHandler(cmd)\n\n let dir = getDir(cmd)\n\n if (cmd.dryRun) {\n logger.info(`Files that would be unpublished:`)\n }\n\n let nodesToDeleteRelevantInfo\n\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config, true), cmd.file)\n\n if (cmd.node) {\n if (!cmd.label) {\n exitWithError('Label is required when specifying a node')\n }\n nodesToDeleteRelevantInfo = [{ figmaNode: cmd.node, label: cmd.label }]\n } else {\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n nodesToDeleteRelevantInfo = codeConnectObjects.map((doc) => ({\n figmaNode: doc.figmaNode,\n label: cmd.label || projectInfo.config.label || doc.label,\n }))\n\n if (cmd.label || projectInfo.config.label) {\n logger.info(`Using label ${cmd.label || projectInfo.config.label}`)\n }\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n }\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n delete_docs({\n accessToken,\n useOAuth: cmd.useOAuth,\n docs: nodesToDeleteRelevantInfo,\n apiUrl: cmd.apiUrl || projectInfo.config.apiUrl,\n })\n}\n\nasync function handleParse(cmd: BaseCommand & { label: string }) {\n setupHandler(cmd)\n\n const dir = cmd.dir ?? process.cwd()\n const projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config, true), cmd.file)\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo)\n\n if (cmd.dryRun) {\n logger.info(`Dry run complete`)\n process.exit(0)\n }\n\n if (cmd.outFile) {\n fs.writeFileSync(cmd.outFile, JSON.stringify(codeConnectObjects, null, 2))\n logger.info(`Wrote Code Connect JSON to ${highlight(cmd.outFile)}`)\n } else {\n console.log(JSON.stringify(codeConnectObjects, undefined, 2))\n }\n}\n\nasync function handleCreate(nodeUrl: string, cmd: BaseCommand) {\n setupHandler(cmd)\n\n const dir = getDir(cmd)\n const projectInfo = await getProjectInfo(dir, cmd.config, true)\n\n const accessToken = getAccessTokenOrExit(cmd)\n\n return createCodeConnectFromUrl({\n accessToken,\n figmaNodeUrl: nodeUrl.replace(/\\\\/g, ''),\n outFile: cmd.outFile,\n outDir: cmd.outDir,\n projectInfo,\n cmd,\n })\n}\n\ninterface ProgramOptions {\n /** Override how the auth token is retrieved. Return undefined to fall back to FIGMA_ACCESS_TOKEN. */\n getToken?: () => string | undefined\n}\n\n/**\n * Registers Code Connect commands on a commander program, restricted to\n * template-file workflows only. Intended for use by CLIs that support\n * Code Connect during a migration period but do not need native parsers.\n *\n * Note: does NOT use addBaseCommand internally because that function registers\n * both `-o --outFile` and `-o --outDir` with the same `-o` short flag.\n * commander@12+ (used by @figma/cli) throws a conflict error on duplicate flags.\n */\nexport function addCodeConnectCommandsToProgram(\n program: commander.Command,\n programOptions: ProgramOptions = {},\n) {\n function addBase(parent: commander.Command, name: string, description: string) {\n return parent\n .command(name)\n .description(description)\n .usage('[options]')\n .option('-r --dir <dir>', 'directory to parse')\n .option(\n '-f --file <file...>',\n 'paths to one or more Code Connect files to process (space-separated)',\n )\n .option('--outFile <file>', 'specify a file to output generated Code Connect')\n .option('--outDir <dir>', 'specify a directory to output generated Code Connect')\n .option('-c --config <path>', 'path to a figma config file')\n .option(\n '--exit-on-unreadable-files',\n 'exit if any Code Connect files cannot be parsed. We recommend using this option for CI/CD.',\n )\n .option('--dry-run', 'tests publishing without actually publishing')\n .addHelpText(\n 'before',\n 'For feedback or bugs, please raise an issue: https://github.com/figma/code-connect/issues',\n )\n }\n\n function wrapHandler<T extends BaseCommand>(handler: (cmd: T) => Promise<void>) {\n return (options: unknown, cmd: commander.Command) => {\n const globalOpts = cmd.optsWithGlobals<{ logLevel?: string; apiBaseUrl?: string }>()\n\n // Attempt to get a token from the provided getter (e.g. OAuth store).\n // If it returns undefined or throws (e.g. no OAuth token stored in CI),\n // fall back to FIGMA_ACCESS_TOKEN and use PAT headers.\n let oauthToken: string | undefined\n try {\n oauthToken = programOptions.getToken?.()\n } catch {\n // getToken threw (e.g. no OAuth token stored); fall back to PAT below\n }\n const token = oauthToken ?? process.env.FIGMA_ACCESS_TOKEN\n const useOAuth = oauthToken !== undefined\n\n return handler({\n ...(options as object),\n token,\n useOAuth,\n verbose: globalOpts.logLevel === 'debug',\n apiUrl: globalOpts.apiBaseUrl,\n } as unknown as T).catch((err: Error) => {\n // Commander v12 catches rejected action promises internally and exits 0.\n // Commander v11 left them as unhandled rejections, and Node.js 15+ would\n // exit 1 for those — so exit code 1 on handler errors was previously\n // accidental. This catch makes it explicit and version-independent.\n logger.error(err.message)\n process.exitCode = 1\n })\n }\n }\n\n const connectCommand = program\n .command('connect')\n .description('Code Connect commands')\n .addHelpText(\n 'before',\n 'For feedback or bugs, please raise an issue: https://github.com/figma/code-connect/issues',\n )\n connectCommand.action(() => connectCommand.help())\n\n addBase(\n connectCommand,\n 'publish',\n 'Run Code Connect locally to find any files that have figma connections and publish them to Figma. ' +\n 'By default this looks for a config file named \"figma.config.json\", and uses the `include` and `exclude` fields to determine which files to parse. ' +\n 'If no config file is found, this parses the current directory. An optional `--dir` flag can be used to specify a directory to parse.',\n )\n .option('--skip-validation', 'skip validation of Code Connect docs')\n .option('-l --label <label>', 'label to apply to the published files')\n .option(\n '-b --batch-size <batch_size>',\n 'optional batch size (in number of documents) to use when uploading. Use this if you hit \"request too large\" errors. See README for more information.',\n )\n .option(\n '--force',\n 'overwrite existing UI-created Code Connect mappings if they conflict with the files being published',\n )\n .action(wrapHandler(handlePublish))\n\n addBase(\n connectCommand,\n 'unpublish',\n 'Run to find any files that have figma connections and unpublish them from Figma. ' +\n 'By default this looks for a config file named \"figma.config.json\", and uses the `include` and `exclude` fields to determine which files to parse. ' +\n 'If no config file is found, this parses the current directory. An optional `--dir` flag can be used to specify a directory to parse. ' +\n 'Alternatively, use `--node` and `--label` to unpublish a specific component.',\n )\n .option(\n '--node <link_to_node>',\n 'specify the node to unpublish. This will unpublish for the specified label.',\n )\n .option('-l --label <label>', 'label to unpublish for')\n .action(wrapHandler(handleUnpublish))\n\n addBase(\n connectCommand,\n 'parse',\n 'Run Code Connect locally to find any files that have figma connections, then converts them to JSON and outputs to stdout.',\n )\n .option('-l --label <label>', 'label to apply to the parsed files')\n .action(wrapHandler(handleParse))\n\n addBase(\n connectCommand,\n 'create',\n 'Generate a Code Connect file with boilerplate in the current directory for a Figma node URL',\n )\n .argument('<figma-node-url>', 'Figma node URL to create the Code Connect file from')\n .action((nodeUrl: string, options: unknown, cmd: commander.Command) =>\n wrapHandler<BaseCommand>((mergedCmd) => handleCreate(nodeUrl, mergedCmd))(options, cmd),\n )\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ProjectInfo } from '../connect/project';
|
|
2
2
|
/**
|
|
3
|
-
* If --file is specified, filter projectInfo.files to only include
|
|
4
|
-
* Exits with an error if
|
|
3
|
+
* If --file is specified, filter projectInfo.files to only include those files.
|
|
4
|
+
* Exits with an error if any file doesn't exist or isn't in the project's file list.
|
|
5
5
|
*/
|
|
6
|
-
export declare function filterProjectInfoByFile(projectInfo: ProjectInfo,
|
|
6
|
+
export declare function filterProjectInfoByFile(projectInfo: ProjectInfo, files: string[] | string | undefined): ProjectInfo;
|
|
7
7
|
//# sourceMappingURL=filter_project_info.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter_project_info.d.ts","sourceRoot":"","sources":["../../src/commands/filter_project_info.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGhD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,WAAW,EACxB,
|
|
1
|
+
{"version":3,"file":"filter_project_info.d.ts","sourceRoot":"","sources":["../../src/commands/filter_project_info.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGhD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,GACnC,WAAW,CA8Bb"}
|
|
@@ -8,25 +8,31 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const logging_1 = require("../common/logging");
|
|
10
10
|
/**
|
|
11
|
-
* If --file is specified, filter projectInfo.files to only include
|
|
12
|
-
* Exits with an error if
|
|
11
|
+
* If --file is specified, filter projectInfo.files to only include those files.
|
|
12
|
+
* Exits with an error if any file doesn't exist or isn't in the project's file list.
|
|
13
13
|
*/
|
|
14
|
-
function filterProjectInfoByFile(projectInfo,
|
|
15
|
-
if (!
|
|
14
|
+
function filterProjectInfoByFile(projectInfo, files) {
|
|
15
|
+
if (!files || (Array.isArray(files) && files.length === 0)) {
|
|
16
16
|
return projectInfo;
|
|
17
17
|
}
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const inputs = Array.isArray(files) ? files : [files];
|
|
19
|
+
const absFiles = inputs.map((f) => path_1.default.resolve(f));
|
|
20
|
+
for (const absFile of absFiles) {
|
|
21
|
+
if (!fs_1.default.existsSync(absFile)) {
|
|
22
|
+
(0, logging_1.exitWithError)(`File not found: ${absFile}`);
|
|
23
|
+
}
|
|
21
24
|
}
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
const projectFileSet = new Set(projectInfo.files);
|
|
26
|
+
const missing = absFiles.filter((f) => !projectFileSet.has(f));
|
|
27
|
+
if (missing.length > 0) {
|
|
28
|
+
(0, logging_1.exitWithError)(`The following file(s) were not found in the project's file list:\n` +
|
|
29
|
+
missing.map((f) => ` - ${f}`).join('\n') +
|
|
30
|
+
`\nMake sure they match the include/exclude globs in your config.`);
|
|
26
31
|
}
|
|
32
|
+
const requestedSet = new Set(absFiles);
|
|
27
33
|
return {
|
|
28
34
|
...projectInfo,
|
|
29
|
-
files:
|
|
35
|
+
files: projectInfo.files.filter((f) => requestedSet.has(f)),
|
|
30
36
|
};
|
|
31
37
|
}
|
|
32
38
|
//# sourceMappingURL=filter_project_info.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter_project_info.js","sourceRoot":"","sources":["../../src/commands/filter_project_info.ts"],"names":[],"mappings":";;;;;AASA,
|
|
1
|
+
{"version":3,"file":"filter_project_info.js","sourceRoot":"","sources":["../../src/commands/filter_project_info.ts"],"names":[],"mappings":";;;;;AASA,0DAiCC;AA1CD,4CAAmB;AACnB,gDAAuB;AAEvB,+CAAiD;AAEjD;;;GAGG;AACH,SAAgB,uBAAuB,CACrC,WAAwB,EACxB,KAAoC;IAEpC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAEnD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,IAAA,uBAAa,EAAC,mBAAmB,OAAO,EAAE,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAE9D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAA,uBAAa,EACX,oEAAoE;YAClE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACzC,kEAAkE,CACrE,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;IACtC,OAAO;QACL,GAAG,WAAW;QACd,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAC5D,CAAA;AACH,CAAC","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport { ProjectInfo } from '../connect/project'\nimport { exitWithError } from '../common/logging'\n\n/**\n * If --file is specified, filter projectInfo.files to only include those files.\n * Exits with an error if any file doesn't exist or isn't in the project's file list.\n */\nexport function filterProjectInfoByFile(\n projectInfo: ProjectInfo,\n files: string[] | string | undefined,\n): ProjectInfo {\n if (!files || (Array.isArray(files) && files.length === 0)) {\n return projectInfo\n }\n\n const inputs = Array.isArray(files) ? files : [files]\n const absFiles = inputs.map((f) => path.resolve(f))\n\n for (const absFile of absFiles) {\n if (!fs.existsSync(absFile)) {\n exitWithError(`File not found: ${absFile}`)\n }\n }\n\n const projectFileSet = new Set(projectInfo.files)\n const missing = absFiles.filter((f) => !projectFileSet.has(f))\n\n if (missing.length > 0) {\n exitWithError(\n `The following file(s) were not found in the project's file list:\\n` +\n missing.map((f) => ` - ${f}`).join('\\n') +\n `\\nMake sure they match the include/exclude globs in your config.`,\n )\n }\n\n const requestedSet = new Set(absFiles)\n return {\n ...projectInfo,\n files: projectInfo.files.filter((f) => requestedSet.has(f)),\n }\n}\n"]}
|
|
@@ -23,17 +23,17 @@ export declare const ParserExecutableMessages: z.ZodArray<z.ZodObject<{
|
|
|
23
23
|
line?: number | undefined;
|
|
24
24
|
}>>;
|
|
25
25
|
}, "strip", z.ZodTypeAny, {
|
|
26
|
-
|
|
27
|
-
level: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
26
|
+
level: "DEBUG" | "ERROR" | "INFO" | "WARN";
|
|
28
27
|
type?: string | undefined;
|
|
28
|
+
message: string;
|
|
29
29
|
sourceLocation?: {
|
|
30
30
|
file: string;
|
|
31
31
|
line?: number | undefined;
|
|
32
32
|
} | undefined;
|
|
33
33
|
}, {
|
|
34
|
-
|
|
35
|
-
level: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
34
|
+
level: "DEBUG" | "ERROR" | "INFO" | "WARN";
|
|
36
35
|
type?: string | undefined;
|
|
36
|
+
message: string;
|
|
37
37
|
sourceLocation?: {
|
|
38
38
|
file: string;
|
|
39
39
|
line?: number | undefined;
|
|
@@ -80,43 +80,43 @@ export declare const ParseResponsePayload: z.ZodObject<{
|
|
|
80
80
|
url: string;
|
|
81
81
|
}>, "many">>;
|
|
82
82
|
}, "strip", z.ZodTypeAny, {
|
|
83
|
-
label: string;
|
|
84
|
-
template: string;
|
|
85
83
|
figmaNode: string;
|
|
84
|
+
component?: string | undefined;
|
|
85
|
+
variant?: Record<string, any> | undefined;
|
|
86
|
+
source?: string | undefined;
|
|
87
|
+
sourceLocation?: {
|
|
88
|
+
line: number;
|
|
89
|
+
} | undefined;
|
|
90
|
+
_codeConnectFilePath?: string | undefined;
|
|
91
|
+
template: string;
|
|
86
92
|
templateData: {
|
|
87
93
|
props: Record<string, any>;
|
|
88
94
|
imports?: string[] | undefined;
|
|
89
95
|
nestable?: boolean | undefined;
|
|
90
96
|
};
|
|
91
97
|
language: SyntaxHighlightLanguage;
|
|
92
|
-
|
|
93
|
-
sourceLocation?: {
|
|
94
|
-
line: number;
|
|
95
|
-
} | undefined;
|
|
96
|
-
component?: string | undefined;
|
|
97
|
-
variant?: Record<string, any> | undefined;
|
|
98
|
-
_codeConnectFilePath?: string | undefined;
|
|
98
|
+
label: string;
|
|
99
99
|
links?: {
|
|
100
100
|
name: string;
|
|
101
101
|
url: string;
|
|
102
102
|
}[] | undefined;
|
|
103
103
|
}, {
|
|
104
|
-
label: string;
|
|
105
|
-
template: string;
|
|
106
104
|
figmaNode: string;
|
|
105
|
+
component?: string | undefined;
|
|
106
|
+
variant?: Record<string, any> | undefined;
|
|
107
|
+
source?: string | undefined;
|
|
108
|
+
sourceLocation?: {
|
|
109
|
+
line: number;
|
|
110
|
+
} | undefined;
|
|
111
|
+
_codeConnectFilePath?: string | undefined;
|
|
112
|
+
template: string;
|
|
107
113
|
templateData: {
|
|
108
114
|
props: Record<string, any>;
|
|
109
115
|
imports?: string[] | undefined;
|
|
110
116
|
nestable?: boolean | undefined;
|
|
111
117
|
};
|
|
112
118
|
language: SyntaxHighlightLanguage;
|
|
113
|
-
|
|
114
|
-
sourceLocation?: {
|
|
115
|
-
line: number;
|
|
116
|
-
} | undefined;
|
|
117
|
-
component?: string | undefined;
|
|
118
|
-
variant?: Record<string, any> | undefined;
|
|
119
|
-
_codeConnectFilePath?: string | undefined;
|
|
119
|
+
label: string;
|
|
120
120
|
links?: {
|
|
121
121
|
name: string;
|
|
122
122
|
url: string;
|
|
@@ -137,17 +137,17 @@ export declare const ParseResponsePayload: z.ZodObject<{
|
|
|
137
137
|
line?: number | undefined;
|
|
138
138
|
}>>;
|
|
139
139
|
}, "strip", z.ZodTypeAny, {
|
|
140
|
-
|
|
141
|
-
level: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
140
|
+
level: "DEBUG" | "ERROR" | "INFO" | "WARN";
|
|
142
141
|
type?: string | undefined;
|
|
142
|
+
message: string;
|
|
143
143
|
sourceLocation?: {
|
|
144
144
|
file: string;
|
|
145
145
|
line?: number | undefined;
|
|
146
146
|
} | undefined;
|
|
147
147
|
}, {
|
|
148
|
-
|
|
149
|
-
level: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
148
|
+
level: "DEBUG" | "ERROR" | "INFO" | "WARN";
|
|
150
149
|
type?: string | undefined;
|
|
150
|
+
message: string;
|
|
151
151
|
sourceLocation?: {
|
|
152
152
|
file: string;
|
|
153
153
|
line?: number | undefined;
|
|
@@ -155,31 +155,31 @@ export declare const ParseResponsePayload: z.ZodObject<{
|
|
|
155
155
|
}>, "many">;
|
|
156
156
|
}, "strip", z.ZodTypeAny, {
|
|
157
157
|
docs: {
|
|
158
|
-
label: string;
|
|
159
|
-
template: string;
|
|
160
158
|
figmaNode: string;
|
|
159
|
+
component?: string | undefined;
|
|
160
|
+
variant?: Record<string, any> | undefined;
|
|
161
|
+
source?: string | undefined;
|
|
162
|
+
sourceLocation?: {
|
|
163
|
+
line: number;
|
|
164
|
+
} | undefined;
|
|
165
|
+
_codeConnectFilePath?: string | undefined;
|
|
166
|
+
template: string;
|
|
161
167
|
templateData: {
|
|
162
168
|
props: Record<string, any>;
|
|
163
169
|
imports?: string[] | undefined;
|
|
164
170
|
nestable?: boolean | undefined;
|
|
165
171
|
};
|
|
166
172
|
language: SyntaxHighlightLanguage;
|
|
167
|
-
|
|
168
|
-
sourceLocation?: {
|
|
169
|
-
line: number;
|
|
170
|
-
} | undefined;
|
|
171
|
-
component?: string | undefined;
|
|
172
|
-
variant?: Record<string, any> | undefined;
|
|
173
|
-
_codeConnectFilePath?: string | undefined;
|
|
173
|
+
label: string;
|
|
174
174
|
links?: {
|
|
175
175
|
name: string;
|
|
176
176
|
url: string;
|
|
177
177
|
}[] | undefined;
|
|
178
178
|
}[];
|
|
179
179
|
messages: {
|
|
180
|
-
|
|
181
|
-
level: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
180
|
+
level: "DEBUG" | "ERROR" | "INFO" | "WARN";
|
|
182
181
|
type?: string | undefined;
|
|
182
|
+
message: string;
|
|
183
183
|
sourceLocation?: {
|
|
184
184
|
file: string;
|
|
185
185
|
line?: number | undefined;
|
|
@@ -187,31 +187,31 @@ export declare const ParseResponsePayload: z.ZodObject<{
|
|
|
187
187
|
}[];
|
|
188
188
|
}, {
|
|
189
189
|
docs: {
|
|
190
|
-
label: string;
|
|
191
|
-
template: string;
|
|
192
190
|
figmaNode: string;
|
|
191
|
+
component?: string | undefined;
|
|
192
|
+
variant?: Record<string, any> | undefined;
|
|
193
|
+
source?: string | undefined;
|
|
194
|
+
sourceLocation?: {
|
|
195
|
+
line: number;
|
|
196
|
+
} | undefined;
|
|
197
|
+
_codeConnectFilePath?: string | undefined;
|
|
198
|
+
template: string;
|
|
193
199
|
templateData: {
|
|
194
200
|
props: Record<string, any>;
|
|
195
201
|
imports?: string[] | undefined;
|
|
196
202
|
nestable?: boolean | undefined;
|
|
197
203
|
};
|
|
198
204
|
language: SyntaxHighlightLanguage;
|
|
199
|
-
|
|
200
|
-
sourceLocation?: {
|
|
201
|
-
line: number;
|
|
202
|
-
} | undefined;
|
|
203
|
-
component?: string | undefined;
|
|
204
|
-
variant?: Record<string, any> | undefined;
|
|
205
|
-
_codeConnectFilePath?: string | undefined;
|
|
205
|
+
label: string;
|
|
206
206
|
links?: {
|
|
207
207
|
name: string;
|
|
208
208
|
url: string;
|
|
209
209
|
}[] | undefined;
|
|
210
210
|
}[];
|
|
211
211
|
messages: {
|
|
212
|
-
|
|
213
|
-
level: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
212
|
+
level: "DEBUG" | "ERROR" | "INFO" | "WARN";
|
|
214
213
|
type?: string | undefined;
|
|
214
|
+
message: string;
|
|
215
215
|
sourceLocation?: {
|
|
216
216
|
file: string;
|
|
217
217
|
line?: number | undefined;
|
|
@@ -288,48 +288,48 @@ export declare const CreateResponsePayload: z.ZodObject<{
|
|
|
288
288
|
line?: number | undefined;
|
|
289
289
|
}>>;
|
|
290
290
|
}, "strip", z.ZodTypeAny, {
|
|
291
|
-
|
|
292
|
-
level: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
291
|
+
level: "DEBUG" | "ERROR" | "INFO" | "WARN";
|
|
293
292
|
type?: string | undefined;
|
|
293
|
+
message: string;
|
|
294
294
|
sourceLocation?: {
|
|
295
295
|
file: string;
|
|
296
296
|
line?: number | undefined;
|
|
297
297
|
} | undefined;
|
|
298
298
|
}, {
|
|
299
|
-
|
|
300
|
-
level: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
299
|
+
level: "DEBUG" | "ERROR" | "INFO" | "WARN";
|
|
301
300
|
type?: string | undefined;
|
|
301
|
+
message: string;
|
|
302
302
|
sourceLocation?: {
|
|
303
303
|
file: string;
|
|
304
304
|
line?: number | undefined;
|
|
305
305
|
} | undefined;
|
|
306
306
|
}>, "many">;
|
|
307
307
|
}, "strip", z.ZodTypeAny, {
|
|
308
|
+
createdFiles: {
|
|
309
|
+
filePath: string;
|
|
310
|
+
}[];
|
|
308
311
|
messages: {
|
|
309
|
-
|
|
310
|
-
level: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
312
|
+
level: "DEBUG" | "ERROR" | "INFO" | "WARN";
|
|
311
313
|
type?: string | undefined;
|
|
314
|
+
message: string;
|
|
312
315
|
sourceLocation?: {
|
|
313
316
|
file: string;
|
|
314
317
|
line?: number | undefined;
|
|
315
318
|
} | undefined;
|
|
316
319
|
}[];
|
|
320
|
+
}, {
|
|
317
321
|
createdFiles: {
|
|
318
322
|
filePath: string;
|
|
319
323
|
}[];
|
|
320
|
-
}, {
|
|
321
324
|
messages: {
|
|
322
|
-
|
|
323
|
-
level: "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
325
|
+
level: "DEBUG" | "ERROR" | "INFO" | "WARN";
|
|
324
326
|
type?: string | undefined;
|
|
327
|
+
message: string;
|
|
325
328
|
sourceLocation?: {
|
|
326
329
|
file: string;
|
|
327
330
|
line?: number | undefined;
|
|
328
331
|
} | undefined;
|
|
329
332
|
}[];
|
|
330
|
-
createdFiles: {
|
|
331
|
-
filePath: string;
|
|
332
|
-
}[];
|
|
333
333
|
}>;
|
|
334
334
|
export type ParserRequestPayload = ParseRequestPayload | CreateRequestPayload;
|
|
335
335
|
//# sourceMappingURL=parser_executable_types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/connect/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/connect/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAyD1D,UAAU,IAAI;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,eAAe,EAAE,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AA0CD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,eAAe,EAAE,EACvB,OAAO,EAAE,OAAO,GACf,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAkBhC;AAED,wBAAsB,MAAM,CAAC,EAC3B,WAAW,EACX,QAAgB,EAChB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,MAAM,EAAE,cAAc,EACtB,KAAK,GACN,EAAE,IAAI,iBAuNN"}
|
package/dist/connect/upload.js
CHANGED
|
@@ -8,30 +8,46 @@ const helpers_1 = require("./helpers");
|
|
|
8
8
|
const validation_1 = require("./validation");
|
|
9
9
|
const fetch_1 = require("../common/fetch");
|
|
10
10
|
const COMPONENT_BROWSER_CONFLICT_REASON = 'Code Connect UI mapping already exists';
|
|
11
|
-
|
|
11
|
+
// 429 (rate limit): extended schedule, ignore Retry-After to keep waits predictable.
|
|
12
|
+
const RETRY_DELAYS_MS_429 = [5_000, 15_000, 30_000, 45_000, 60_000, 75_000];
|
|
13
|
+
// 5xx (server error): original shorter schedule, still honoring Retry-After if provided.
|
|
14
|
+
const RETRY_DELAYS_MS_5XX = [5_000, 15_000, 30_000];
|
|
12
15
|
async function postWithRetry(apiUrl, batch, accessToken, useOAuth = false) {
|
|
13
|
-
|
|
16
|
+
let attempt429 = 0;
|
|
17
|
+
let attempt5xx = 0;
|
|
18
|
+
// eslint-disable-next-line no-constant-condition
|
|
19
|
+
while (true) {
|
|
14
20
|
try {
|
|
15
21
|
return await fetch_1.request.post(apiUrl, batch, { headers: (0, figma_rest_api_1.getHeaders)(accessToken, useOAuth) });
|
|
16
22
|
}
|
|
17
23
|
catch (err) {
|
|
18
|
-
if ((0, fetch_1.isFetchError)(err)
|
|
19
|
-
|
|
24
|
+
if (!(0, fetch_1.isFetchError)(err))
|
|
25
|
+
throw err;
|
|
26
|
+
const status = err.response.status;
|
|
27
|
+
if (status === 429) {
|
|
28
|
+
if (attempt429 === RETRY_DELAYS_MS_429.length)
|
|
29
|
+
throw err;
|
|
30
|
+
const delayMs = RETRY_DELAYS_MS_429[attempt429];
|
|
31
|
+
logging_1.logger.warn(`Received 429, retrying in ${delayMs / 1000}s (attempt ${attempt429 + 1}/${RETRY_DELAYS_MS_429.length})...`);
|
|
32
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
33
|
+
attempt429++;
|
|
34
|
+
}
|
|
35
|
+
else if (status >= 500) {
|
|
36
|
+
if (attempt5xx === RETRY_DELAYS_MS_5XX.length)
|
|
20
37
|
throw err;
|
|
21
|
-
}
|
|
22
38
|
const retryAfterSec = err.response.headers.get('Retry-After');
|
|
23
39
|
const delayMs = retryAfterSec
|
|
24
40
|
? parseInt(retryAfterSec, 10) * 1_000
|
|
25
|
-
:
|
|
26
|
-
logging_1.logger.warn(`Received ${
|
|
41
|
+
: RETRY_DELAYS_MS_5XX[attempt5xx];
|
|
42
|
+
logging_1.logger.warn(`Received ${status}, retrying in ${delayMs / 1000}s (attempt ${attempt5xx + 1}/${RETRY_DELAYS_MS_5XX.length})...`);
|
|
27
43
|
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
44
|
+
attempt5xx++;
|
|
28
45
|
}
|
|
29
46
|
else {
|
|
30
47
|
throw err;
|
|
31
48
|
}
|
|
32
49
|
}
|
|
33
50
|
}
|
|
34
|
-
throw new Error('Unreachable');
|
|
35
51
|
}
|
|
36
52
|
/**
|
|
37
53
|
* Returns a string representation of the code connect JSON
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/connect/upload.ts"],"names":[],"mappings":"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","sourcesContent":["import { CodeConnectJSON } from '../connect/figma_connect'\nimport { logger, underline, highlight, warn } from '../common/logging'\nimport { getApiUrl, getHeaders } from './figma_rest_api'\nimport { exitWithFeedbackMessage } from './helpers'\nimport { parseFigmaNode } from './validation'\nimport { isFetchError, request } from '../common/fetch'\n\nconst COMPONENT_BROWSER_CONFLICT_REASON = 'Code Connect UI mapping already exists'\n\nconst RETRY_DELAYS_MS = [5_000, 15_000, 30_000]\n\nasync function postWithRetry<T>(\n apiUrl: string,\n batch: CodeConnectJSON[],\n accessToken: string,\n useOAuth = false,\n): Promise<{ data: T }> {\n for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length; attempt++) {\n try {\n return await request.post<T>(apiUrl, batch, { headers: getHeaders(accessToken, useOAuth) })\n } catch (err) {\n if (isFetchError(err) && (err.response.status === 429 || err.response.status >= 500)) {\n if (attempt === RETRY_DELAYS_MS.length) {\n throw err\n }\n const retryAfterSec = err.response.headers.get('Retry-After')\n const delayMs = retryAfterSec\n ? parseInt(retryAfterSec, 10) * 1_000\n : RETRY_DELAYS_MS[attempt]\n logger.warn(\n `Received ${err.response.status}, retrying in ${delayMs / 1000}s (attempt ${attempt + 1}/${RETRY_DELAYS_MS.length})...`,\n )\n await new Promise((resolve) => setTimeout(resolve, delayMs))\n } else {\n throw err\n }\n }\n }\n throw new Error('Unreachable')\n}\n\ninterface Args {\n accessToken: string\n useOAuth?: boolean\n docs: CodeConnectJSON[]\n batchSize?: number\n verbose: boolean\n apiUrl?: string\n force?: boolean\n}\n\ninterface UploadResponse {\n status: number\n error: boolean\n meta: {\n success: boolean\n published_count: number\n failed_count: number\n published_nodes: Array<{ figmaNode: string; label: string }>\n failed_nodes: Array<{ figmaNode: string; label: string; reason: string }>\n }\n}\n\n/**\n * Returns a string representation of the code connect JSON\n * @param doc - The code connect JSON\n * @returns A string representation of the code connect JSON\n */\nfunction codeConnectStr(doc: CodeConnectJSON): string {\n return `${highlight(doc.component ?? '')}${doc.variant ? `(${Object.entries(doc.variant).map(([key, value]) => `${key}=${value}`)})` : ''} ${underline(doc.figmaNode)}`\n}\n\n/**\n * Extracts the fileKey and nodeId from the Figma node URL and returns a key in the format of fileKey-nodeId\n * @param figmaNode - The Figma node URL\n * @returns The key in the format of fileKey-nodeId\n */\nfunction getKeyFromFigmaNode(figmaNode: string): string {\n const url = new URL(figmaNode)\n\n // Extract fileKey from path (after /file/ or /design/)\n const pathMatch = url.pathname.match(/\\/(file|design)\\/([A-Za-z0-9]+)/)\n const fileKey = pathMatch ? pathMatch[2] : ''\n\n // Extract nodeId from query parameter and convert format (1-24 -> 1:24)\n const nodeIdParam = url.searchParams.get('node-id') || ''\n const nodeId = nodeIdParam.replace(/-/g, ':')\n\n return `${fileKey}-${nodeId}`\n}\n\n/**\n * Creates a map from fileKey-nodeId to original docs for easy lookup\n */\nexport function createDocsMap(\n docs: CodeConnectJSON[],\n verbose: boolean,\n): Map<string, CodeConnectJSON[]> {\n const docsMap = new Map<string, CodeConnectJSON[]>()\n\n for (const doc of docs) {\n const parsedData = parseFigmaNode(verbose, doc)\n if (!parsedData) {\n continue\n }\n\n const mapKey = `${parsedData.fileKey}-${parsedData.nodeId}`\n if (!docsMap.has(mapKey)) {\n docsMap.set(mapKey, [])\n }\n\n docsMap.get(mapKey)?.push(doc)\n }\n\n return docsMap\n}\n\nexport async function upload({\n accessToken,\n useOAuth = false,\n docs,\n batchSize,\n verbose,\n apiUrl: apiUrlOverride,\n force,\n}: Args) {\n const apiUrl =\n getApiUrl(docs?.[0]?.figmaNode ?? '', apiUrlOverride) +\n '/code_connect' +\n (force ? '?force=true' : '')\n\n // Strip internal fields before uploading to Figma\n const cleanedDocs = docs.map((doc) => {\n const { _codeConnectFilePath, ...cleanDoc } = doc\n return cleanDoc as CodeConnectJSON\n })\n\n try {\n logger.info(`Uploading to Figma...`)\n\n // Create a map from fileKey-nodeId to original docs for detailed output\n const docsMap = createDocsMap(cleanedDocs, verbose)\n\n let allUploadedNodes = new Set<string>()\n let allFailedNodes = new Map<string, string>() // key -> failure reason\n\n if (batchSize) {\n if (typeof batchSize !== 'number') {\n logger.error('Batch size must be a number')\n exitWithFeedbackMessage(1)\n }\n\n // batch together based on fileKey + nodeId as all variants etc of the same node should be uploaded together\n // Otherwise, the server will overwrite the previous upload\n const groupedDocs = cleanedDocs.reduce(\n (acc, doc) => {\n const parsedData = parseFigmaNode(verbose, doc)\n\n if (!parsedData) {\n exitWithFeedbackMessage(1)\n }\n\n const { fileKey, nodeId } = parsedData\n const accKey = fileKey + ',' + nodeId\n if (!acc[accKey]) {\n acc[accKey] = []\n }\n acc[accKey].push(doc)\n return acc\n },\n {} as Record<string, CodeConnectJSON[]>,\n )\n\n const batchedDocs: CodeConnectJSON[][] = []\n const nodeKeys = Object.keys(groupedDocs)\n\n for (let i = 0; i < nodeKeys.length; i += batchSize) {\n const batch: CodeConnectJSON[] = []\n for (let j = i; j < i + batchSize && j < nodeKeys.length; j++) {\n const nodeKey = nodeKeys[j]\n batch.push(...groupedDocs[nodeKey])\n }\n batchedDocs.push(batch)\n }\n\n let currentBatch = 1\n const noOfBatches = batchedDocs.length\n for (const batch of batchedDocs) {\n process.stderr.write('\\x1b[2K\\x1b[0G')\n process.stderr.write(`Uploading batch ${currentBatch}/${noOfBatches}`)\n\n var size = Buffer.byteLength(JSON.stringify(batch)) / (1024 * 1024)\n\n // Server has a limit of 5mb\n if (size > 5) {\n logger.error(\n `Failed to upload to Figma: The request is too large (${size.toFixed(2)}mb).`,\n )\n logger.error(\n 'Please try reducing the size of uploads by splitting them into smaller requests by running again and decreasing the --batch-size parameter.',\n )\n exitWithFeedbackMessage(1)\n }\n\n logger.debug(`Uploading ${size.toFixed(2)}mb to Figma`)\n\n const response = await postWithRetry<UploadResponse>(apiUrl, batch, accessToken, useOAuth)\n\n const data = response.data\n\n if (data.meta?.published_nodes) {\n data.meta.published_nodes.forEach((node) =>\n allUploadedNodes.add(getKeyFromFigmaNode(node.figmaNode)),\n )\n }\n if (data.meta?.failed_nodes) {\n data.meta.failed_nodes.forEach((node) =>\n allFailedNodes.set(getKeyFromFigmaNode(node.figmaNode), node.reason),\n )\n }\n\n currentBatch++\n }\n process.stderr.write(`\\n`)\n } else {\n var size = Buffer.byteLength(JSON.stringify(cleanedDocs)) / (1024 * 1024)\n\n // Server has a limit of 5mb\n if (size > 5) {\n logger.error(`Failed to upload to Figma: The request is too large (${size.toFixed(2)}mb).`)\n logger.error(\n 'Please try reducing the size of uploads by splitting them into smaller requests by running again with the --batch-size parameter. You can do also this by running on different subdirectories using the --dir flag or by iteratively adjusting the includes field in the configuration.',\n )\n exitWithFeedbackMessage(1)\n }\n\n logger.debug(`Uploading ${size.toFixed(2)}mb to Figma`)\n logger.info(`Uploading to ${apiUrl}`)\n\n const response = await postWithRetry<UploadResponse>(\n apiUrl,\n cleanedDocs,\n accessToken,\n useOAuth,\n )\n\n const data = response.data\n\n if (data.meta?.published_nodes) {\n data.meta.published_nodes.forEach((node) =>\n allUploadedNodes.add(getKeyFromFigmaNode(node.figmaNode)),\n )\n }\n if (data.meta?.failed_nodes) {\n data.meta.failed_nodes.forEach((node) =>\n allFailedNodes.set(getKeyFromFigmaNode(node.figmaNode), node.reason),\n )\n }\n }\n\n // Separate successful and failed uploads\n const successfulDocsByLabel: Record<string, CodeConnectJSON[]> = {}\n const failedDocsByLabel: Record<string, Array<{ doc: CodeConnectJSON; reason: string }>> = {}\n\n for (const [mapKey, nodeDocs] of docsMap.entries()) {\n for (const doc of nodeDocs) {\n const label = doc.label\n const docKey = getKeyFromFigmaNode(doc.figmaNode)\n const isUploaded = allUploadedNodes.has(docKey)\n const failureReason = allFailedNodes.get(docKey)\n\n if (isUploaded) {\n if (!successfulDocsByLabel[label]) {\n successfulDocsByLabel[label] = []\n }\n successfulDocsByLabel[label].push(doc)\n } else if (failureReason) {\n if (!failedDocsByLabel[label]) {\n failedDocsByLabel[label] = []\n }\n failedDocsByLabel[label].push({ doc, reason: failureReason })\n }\n }\n }\n\n for (const [label, docs] of Object.entries(successfulDocsByLabel)) {\n logger.info(\n `Successfully uploaded to Figma, for ${label}:\\n${docs.map((doc) => `-> ${codeConnectStr(doc)}`).join('\\n')}`,\n )\n }\n\n if (Object.keys(failedDocsByLabel).length > 0) {\n let hasComponentBrowserConflicts = false\n for (const [label, failedItems] of Object.entries(failedDocsByLabel)) {\n const conflicts = failedItems.filter((item) =>\n item.reason.includes(COMPONENT_BROWSER_CONFLICT_REASON),\n )\n const otherFailures = failedItems.filter(\n (item) => !item.reason.includes(COMPONENT_BROWSER_CONFLICT_REASON),\n )\n\n if (conflicts.length > 0) {\n hasComponentBrowserConflicts = true\n logger.warn(\n warn(\n `Warning: ${conflicts.length} node(s) already have UI-created Code Connect mappings in Figma for label \"${label}\":\\n${conflicts.map((item) => `-> ${codeConnectStr(item.doc)}`).join('\\n')}`,\n ),\n )\n }\n\n if (otherFailures.length > 0) {\n logger.error(\n `Failed to upload to Figma, for ${label}:\\n${otherFailures.map((item) => `-> ${codeConnectStr(item.doc)} (${item.reason})`).join('\\n')}`,\n )\n }\n }\n\n if (hasComponentBrowserConflicts && !force) {\n logger.warn(\n warn(\n `Re-run with --force to overwrite the existing UI-created mappings with your Code Connect files.`,\n ),\n )\n }\n }\n } catch (err) {\n if (isFetchError(err)) {\n if (err.response) {\n logger.error(\n `Failed to upload to Figma (${err.response.status}): ${err.response.status} ${err.data?.message}`,\n )\n } else {\n logger.error(`Failed to upload to Figma: ${err.message}`)\n }\n logger.debug(JSON.stringify(err?.data))\n } else {\n logger.error(`Failed to upload to Figma: ${err}`)\n }\n exitWithFeedbackMessage(1)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/connect/upload.ts"],"names":[],"mappings":"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","sourcesContent":["import { CodeConnectJSON } from '../connect/figma_connect'\nimport { logger, underline, highlight, warn } from '../common/logging'\nimport { getApiUrl, getHeaders } from './figma_rest_api'\nimport { exitWithFeedbackMessage } from './helpers'\nimport { parseFigmaNode } from './validation'\nimport { isFetchError, request } from '../common/fetch'\n\nconst COMPONENT_BROWSER_CONFLICT_REASON = 'Code Connect UI mapping already exists'\n\n// 429 (rate limit): extended schedule, ignore Retry-After to keep waits predictable.\nconst RETRY_DELAYS_MS_429 = [5_000, 15_000, 30_000, 45_000, 60_000, 75_000]\n// 5xx (server error): original shorter schedule, still honoring Retry-After if provided.\nconst RETRY_DELAYS_MS_5XX = [5_000, 15_000, 30_000]\n\nasync function postWithRetry<T>(\n apiUrl: string,\n batch: CodeConnectJSON[],\n accessToken: string,\n useOAuth = false,\n): Promise<{ data: T }> {\n let attempt429 = 0\n let attempt5xx = 0\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n return await request.post<T>(apiUrl, batch, { headers: getHeaders(accessToken, useOAuth) })\n } catch (err) {\n if (!isFetchError(err)) throw err\n\n const status = err.response.status\n\n if (status === 429) {\n if (attempt429 === RETRY_DELAYS_MS_429.length) throw err\n const delayMs = RETRY_DELAYS_MS_429[attempt429]\n logger.warn(\n `Received 429, retrying in ${delayMs / 1000}s (attempt ${attempt429 + 1}/${RETRY_DELAYS_MS_429.length})...`,\n )\n await new Promise((resolve) => setTimeout(resolve, delayMs))\n attempt429++\n } else if (status >= 500) {\n if (attempt5xx === RETRY_DELAYS_MS_5XX.length) throw err\n const retryAfterSec = err.response.headers.get('Retry-After')\n const delayMs = retryAfterSec\n ? parseInt(retryAfterSec, 10) * 1_000\n : RETRY_DELAYS_MS_5XX[attempt5xx]\n logger.warn(\n `Received ${status}, retrying in ${delayMs / 1000}s (attempt ${attempt5xx + 1}/${RETRY_DELAYS_MS_5XX.length})...`,\n )\n await new Promise((resolve) => setTimeout(resolve, delayMs))\n attempt5xx++\n } else {\n throw err\n }\n }\n }\n}\n\ninterface Args {\n accessToken: string\n useOAuth?: boolean\n docs: CodeConnectJSON[]\n batchSize?: number\n verbose: boolean\n apiUrl?: string\n force?: boolean\n}\n\ninterface UploadResponse {\n status: number\n error: boolean\n meta: {\n success: boolean\n published_count: number\n failed_count: number\n published_nodes: Array<{ figmaNode: string; label: string }>\n failed_nodes: Array<{ figmaNode: string; label: string; reason: string }>\n }\n}\n\n/**\n * Returns a string representation of the code connect JSON\n * @param doc - The code connect JSON\n * @returns A string representation of the code connect JSON\n */\nfunction codeConnectStr(doc: CodeConnectJSON): string {\n return `${highlight(doc.component ?? '')}${doc.variant ? `(${Object.entries(doc.variant).map(([key, value]) => `${key}=${value}`)})` : ''} ${underline(doc.figmaNode)}`\n}\n\n/**\n * Extracts the fileKey and nodeId from the Figma node URL and returns a key in the format of fileKey-nodeId\n * @param figmaNode - The Figma node URL\n * @returns The key in the format of fileKey-nodeId\n */\nfunction getKeyFromFigmaNode(figmaNode: string): string {\n const url = new URL(figmaNode)\n\n // Extract fileKey from path (after /file/ or /design/)\n const pathMatch = url.pathname.match(/\\/(file|design)\\/([A-Za-z0-9]+)/)\n const fileKey = pathMatch ? pathMatch[2] : ''\n\n // Extract nodeId from query parameter and convert format (1-24 -> 1:24)\n const nodeIdParam = url.searchParams.get('node-id') || ''\n const nodeId = nodeIdParam.replace(/-/g, ':')\n\n return `${fileKey}-${nodeId}`\n}\n\n/**\n * Creates a map from fileKey-nodeId to original docs for easy lookup\n */\nexport function createDocsMap(\n docs: CodeConnectJSON[],\n verbose: boolean,\n): Map<string, CodeConnectJSON[]> {\n const docsMap = new Map<string, CodeConnectJSON[]>()\n\n for (const doc of docs) {\n const parsedData = parseFigmaNode(verbose, doc)\n if (!parsedData) {\n continue\n }\n\n const mapKey = `${parsedData.fileKey}-${parsedData.nodeId}`\n if (!docsMap.has(mapKey)) {\n docsMap.set(mapKey, [])\n }\n\n docsMap.get(mapKey)?.push(doc)\n }\n\n return docsMap\n}\n\nexport async function upload({\n accessToken,\n useOAuth = false,\n docs,\n batchSize,\n verbose,\n apiUrl: apiUrlOverride,\n force,\n}: Args) {\n const apiUrl =\n getApiUrl(docs?.[0]?.figmaNode ?? '', apiUrlOverride) +\n '/code_connect' +\n (force ? '?force=true' : '')\n\n // Strip internal fields before uploading to Figma\n const cleanedDocs = docs.map((doc) => {\n const { _codeConnectFilePath, ...cleanDoc } = doc\n return cleanDoc as CodeConnectJSON\n })\n\n try {\n logger.info(`Uploading to Figma...`)\n\n // Create a map from fileKey-nodeId to original docs for detailed output\n const docsMap = createDocsMap(cleanedDocs, verbose)\n\n let allUploadedNodes = new Set<string>()\n let allFailedNodes = new Map<string, string>() // key -> failure reason\n\n if (batchSize) {\n if (typeof batchSize !== 'number') {\n logger.error('Batch size must be a number')\n exitWithFeedbackMessage(1)\n }\n\n // batch together based on fileKey + nodeId as all variants etc of the same node should be uploaded together\n // Otherwise, the server will overwrite the previous upload\n const groupedDocs = cleanedDocs.reduce(\n (acc, doc) => {\n const parsedData = parseFigmaNode(verbose, doc)\n\n if (!parsedData) {\n exitWithFeedbackMessage(1)\n }\n\n const { fileKey, nodeId } = parsedData\n const accKey = fileKey + ',' + nodeId\n if (!acc[accKey]) {\n acc[accKey] = []\n }\n acc[accKey].push(doc)\n return acc\n },\n {} as Record<string, CodeConnectJSON[]>,\n )\n\n const batchedDocs: CodeConnectJSON[][] = []\n const nodeKeys = Object.keys(groupedDocs)\n\n for (let i = 0; i < nodeKeys.length; i += batchSize) {\n const batch: CodeConnectJSON[] = []\n for (let j = i; j < i + batchSize && j < nodeKeys.length; j++) {\n const nodeKey = nodeKeys[j]\n batch.push(...groupedDocs[nodeKey])\n }\n batchedDocs.push(batch)\n }\n\n let currentBatch = 1\n const noOfBatches = batchedDocs.length\n for (const batch of batchedDocs) {\n process.stderr.write('\\x1b[2K\\x1b[0G')\n process.stderr.write(`Uploading batch ${currentBatch}/${noOfBatches}`)\n\n var size = Buffer.byteLength(JSON.stringify(batch)) / (1024 * 1024)\n\n // Server has a limit of 5mb\n if (size > 5) {\n logger.error(\n `Failed to upload to Figma: The request is too large (${size.toFixed(2)}mb).`,\n )\n logger.error(\n 'Please try reducing the size of uploads by splitting them into smaller requests by running again and decreasing the --batch-size parameter.',\n )\n exitWithFeedbackMessage(1)\n }\n\n logger.debug(`Uploading ${size.toFixed(2)}mb to Figma`)\n\n const response = await postWithRetry<UploadResponse>(apiUrl, batch, accessToken, useOAuth)\n\n const data = response.data\n\n if (data.meta?.published_nodes) {\n data.meta.published_nodes.forEach((node) =>\n allUploadedNodes.add(getKeyFromFigmaNode(node.figmaNode)),\n )\n }\n if (data.meta?.failed_nodes) {\n data.meta.failed_nodes.forEach((node) =>\n allFailedNodes.set(getKeyFromFigmaNode(node.figmaNode), node.reason),\n )\n }\n\n currentBatch++\n }\n process.stderr.write(`\\n`)\n } else {\n var size = Buffer.byteLength(JSON.stringify(cleanedDocs)) / (1024 * 1024)\n\n // Server has a limit of 5mb\n if (size > 5) {\n logger.error(`Failed to upload to Figma: The request is too large (${size.toFixed(2)}mb).`)\n logger.error(\n 'Please try reducing the size of uploads by splitting them into smaller requests by running again with the --batch-size parameter. You can do also this by running on different subdirectories using the --dir flag or by iteratively adjusting the includes field in the configuration.',\n )\n exitWithFeedbackMessage(1)\n }\n\n logger.debug(`Uploading ${size.toFixed(2)}mb to Figma`)\n logger.info(`Uploading to ${apiUrl}`)\n\n const response = await postWithRetry<UploadResponse>(\n apiUrl,\n cleanedDocs,\n accessToken,\n useOAuth,\n )\n\n const data = response.data\n\n if (data.meta?.published_nodes) {\n data.meta.published_nodes.forEach((node) =>\n allUploadedNodes.add(getKeyFromFigmaNode(node.figmaNode)),\n )\n }\n if (data.meta?.failed_nodes) {\n data.meta.failed_nodes.forEach((node) =>\n allFailedNodes.set(getKeyFromFigmaNode(node.figmaNode), node.reason),\n )\n }\n }\n\n // Separate successful and failed uploads\n const successfulDocsByLabel: Record<string, CodeConnectJSON[]> = {}\n const failedDocsByLabel: Record<string, Array<{ doc: CodeConnectJSON; reason: string }>> = {}\n\n for (const [mapKey, nodeDocs] of docsMap.entries()) {\n for (const doc of nodeDocs) {\n const label = doc.label\n const docKey = getKeyFromFigmaNode(doc.figmaNode)\n const isUploaded = allUploadedNodes.has(docKey)\n const failureReason = allFailedNodes.get(docKey)\n\n if (isUploaded) {\n if (!successfulDocsByLabel[label]) {\n successfulDocsByLabel[label] = []\n }\n successfulDocsByLabel[label].push(doc)\n } else if (failureReason) {\n if (!failedDocsByLabel[label]) {\n failedDocsByLabel[label] = []\n }\n failedDocsByLabel[label].push({ doc, reason: failureReason })\n }\n }\n }\n\n for (const [label, docs] of Object.entries(successfulDocsByLabel)) {\n logger.info(\n `Successfully uploaded to Figma, for ${label}:\\n${docs.map((doc) => `-> ${codeConnectStr(doc)}`).join('\\n')}`,\n )\n }\n\n if (Object.keys(failedDocsByLabel).length > 0) {\n let hasComponentBrowserConflicts = false\n for (const [label, failedItems] of Object.entries(failedDocsByLabel)) {\n const conflicts = failedItems.filter((item) =>\n item.reason.includes(COMPONENT_BROWSER_CONFLICT_REASON),\n )\n const otherFailures = failedItems.filter(\n (item) => !item.reason.includes(COMPONENT_BROWSER_CONFLICT_REASON),\n )\n\n if (conflicts.length > 0) {\n hasComponentBrowserConflicts = true\n logger.warn(\n warn(\n `Warning: ${conflicts.length} node(s) already have UI-created Code Connect mappings in Figma for label \"${label}\":\\n${conflicts.map((item) => `-> ${codeConnectStr(item.doc)}`).join('\\n')}`,\n ),\n )\n }\n\n if (otherFailures.length > 0) {\n logger.error(\n `Failed to upload to Figma, for ${label}:\\n${otherFailures.map((item) => `-> ${codeConnectStr(item.doc)} (${item.reason})`).join('\\n')}`,\n )\n }\n }\n\n if (hasComponentBrowserConflicts && !force) {\n logger.warn(\n warn(\n `Re-run with --force to overwrite the existing UI-created mappings with your Code Connect files.`,\n ),\n )\n }\n }\n } catch (err) {\n if (isFetchError(err)) {\n if (err.response) {\n logger.error(\n `Failed to upload to Figma (${err.response.status}): ${err.response.status} ${err.data?.message}`,\n )\n } else {\n logger.error(`Failed to upload to Figma: ${err.message}`)\n }\n logger.debug(JSON.stringify(err?.data))\n } else {\n logger.error(`Failed to upload to Figma: ${err}`)\n }\n exitWithFeedbackMessage(1)\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@figma/code-connect",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.7",
|
|
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",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"dev": "tsx src/cli.ts",
|
|
47
47
|
"build": "rm -rf dist && tsc --noCheck",
|
|
48
48
|
"build:web": "pnpm build",
|
|
49
|
-
"build:webpack": "
|
|
49
|
+
"build:webpack": "cross-env NODE_OPTIONS=\"--max-old-space-size=8196\" webpack --mode production",
|
|
50
50
|
"test": "npm run test:no-coverage -- --coverage",
|
|
51
51
|
"test:no-coverage": "cross-env NODE_OPTIONS=\"--experimental-vm-modules --no-deprecation --max-old-space-size=10240\" npx jest --logHeapUsage --workerIdleMemoryLimit=1.5G",
|
|
52
52
|
"test:fast": "npm run test -- --testPathIgnorePatterns=template_rendering.test.ts --testPathIgnorePatterns=e2e_parse_command_swift.test.ts --testPathIgnorePatterns=e2e_wizard_swift.test.ts",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"test:swift": "npm run test -- --runInBand --testPathPattern=e2e_parse_command_swift.test.ts --testPathPattern=e2e_wizard_swift.test.ts --testPathPattern=e2e_parse_command_swift_xcodeproj.test.ts",
|
|
58
58
|
"test:non-mac": "npm run test -- --testPathIgnorePatterns=e2e_parse_command_swift.test.ts --testPathIgnorePatterns=e2e_wizard_swift.test.ts --testPathIgnorePatterns=e2e_parse_command_swift_xcodeproj.test.ts",
|
|
59
59
|
"bundle": "npm run build && npm pack && mkdir -p bundle && mv figma-code-connect*.tgz bundle",
|
|
60
|
-
"bundle:local": "
|
|
60
|
+
"bundle:local": "npm run build && mkdir -p bundle-local && pnpm pack --pack-destination bundle-local",
|
|
61
61
|
"bundle:npm-readme:prepare": "mv README.md ../cli-README.md.bak && cp ../README.md . && npx tsx ../scripts/make_readme_links_absolute.ts",
|
|
62
62
|
"bundle:npm-readme:restore": "mv ../cli-README.md.bak README.md",
|
|
63
63
|
"bundle:npm": "npm run build && npm run bundle:npm-readme:prepare && npm pack && mkdir -p bundle-npm && mv figma-code-connect*.tgz bundle-npm; npm run bundle:npm-readme:restore",
|
|
@@ -76,6 +76,8 @@
|
|
|
76
76
|
"@babel/parser": "7.28.5",
|
|
77
77
|
"@babel/types": "7.28.5",
|
|
78
78
|
|
|
79
|
+
|
|
80
|
+
|
|
79
81
|
"@storybook/csf-tools": "8.5.1",
|
|
80
82
|
"@types/cross-spawn": "^6.0.6",
|
|
81
83
|
"@types/jest": "^29.5.13",
|
|
@@ -96,8 +98,6 @@
|
|
|
96
98
|
"webpack-cli": "5.1.4"
|
|
97
99
|
},
|
|
98
100
|
"dependencies": {
|
|
99
|
-
|
|
100
|
-
|
|
101
101
|
"boxen": "5.1.1",
|
|
102
102
|
|
|
103
103
|
|