@figma/code-connect 1.5.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,8 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.flagParserBasedCodeConnect = flagParserBasedCodeConnect;
7
- exports.withVersionWarnings = withVersionWarnings;
6
+ exports.withUpdateCheck = withUpdateCheck;
8
7
  exports.exitWithUpdateCheck = exitWithUpdateCheck;
9
8
  exports.updateCli = updateCli;
10
9
  const chalk_1 = __importDefault(require("chalk"));
@@ -13,27 +12,19 @@ const compare_versions_1 = require("compare-versions");
13
12
  const fetch_1 = require("./fetch");
14
13
  let updatedVersionAvailable = undefined;
15
14
  let message = undefined;
16
- let parserBasedCodeConnectFound = false;
17
- let deprecationWarningHidden = false;
18
15
  let skipUpdateCheck = false;
19
- // Called when the native parser has actually produced Code Connect docs, which
20
- // is the only definitive signal that a project still uses the legacy parsers.
21
- function flagParserBasedCodeConnect() {
22
- parserBasedCodeConnectFound = true;
23
- }
24
16
  // Wrap action handlers to check for updates or a message, and output a message
25
17
  // after the action if any are available
26
- function withVersionWarnings(
18
+ function withUpdateCheck(
27
19
  // The second to last argument is always the command args, but I couldn't work
28
20
  // out how to model this with Typescript here
29
- fn, { hideDeprecationWarning = false } = {}) {
21
+ fn) {
30
22
  return (...args) => {
31
23
  // Get the args passed at the command line (the second to last argument)
32
24
  const commandArgs = args[args.length - 2];
33
25
  // Anything before that is a regular arg
34
26
  const restArgs = args.slice(0, -2);
35
27
  skipUpdateCheck = !!commandArgs.skipUpdateCheck;
36
- deprecationWarningHidden = hideDeprecationWarning;
37
28
  if (skipUpdateCheck) {
38
29
  return fn(...restArgs, commandArgs);
39
30
  }
@@ -92,13 +83,7 @@ function exitWithUpdateCheck(errorCode = 1) {
92
83
  function getUpdateCommand() {
93
84
  return 'npm update -g @figma/code-connect';
94
85
  }
95
- const DEPRECATION_NOTICE = `
96
- Framework-specific parsers will no longer receive updates or support from August 17th, 2026. Template files will be the only actively maintained way of using Code Connect. See our migration guide for more information and instructions on migrating parser-based Code Connect:
97
- https://developers.figma.com/docs/code-connect/templates-migration-guide/`;
98
86
  function maybeShowUpdateMessage() {
99
- if (parserBasedCodeConnectFound && !deprecationWarningHidden) {
100
- logging_1.logger.warn(DEPRECATION_NOTICE);
101
- }
102
87
  if (updatedVersionAvailable) {
103
88
  logging_1.logger.warn(`\nA new version of the Figma CLI is available. v${require('../../package.json').version} is currently installed, and the latest version available is v${updatedVersionAvailable}.
104
89
 
@@ -1 +1 @@
1
- {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/common/updates.ts"],"names":[],"mappings":";;;;;AAeA,gEAEC;AAQD,kDA4BC;AAyCD,kDAKC;AA0BD,8BAGC;AAhID,kDAAyB;AACzB,uCAAkC;AAClC,uDAAkD;AAGlD,mCAAiC;AAEjC,IAAI,uBAAuB,GAA+B,SAAS,CAAA;AACnE,IAAI,OAAO,GAAuB,SAAS,CAAA;AAC3C,IAAI,2BAA2B,GAAG,KAAK,CAAA;AACvC,IAAI,wBAAwB,GAAG,KAAK,CAAA;AACpC,IAAI,eAAe,GAAG,KAAK,CAAA;AAE3B,+EAA+E;AAC/E,8EAA8E;AAC9E,SAAgB,0BAA0B;IACxC,2BAA2B,GAAG,IAAI,CAAA;AACpC,CAAC;AAMD,+EAA+E;AAC/E,wCAAwC;AACxC,SAAgB,mBAAmB;AACjC,8EAA8E;AAC9E,6CAA6C;AAC7C,EAA4C,EAC5C,EAAE,sBAAsB,GAAG,KAAK,KAA2C,EAAE;IAE7E,OAAO,CAAC,GAAG,IAAoB,EAAE,EAAE;QACjC,wEAAwE;QACxE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACzC,wCAAwC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAElC,eAAe,GAAG,CAAC,CAAC,WAAW,CAAC,eAAe,CAAA;QAC/C,wBAAwB,GAAG,sBAAsB,CAAA;QAEjD,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,EAAE,CAAC,GAAG,QAAQ,EAAE,WAAW,CAAC,CAAA;QACrC,CAAC;QAED,gBAAgB,EAAE,CAAA;QAElB,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,WAAW,CAAC,CAAA;QAC3C,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;QACxC,CAAC;aAAM,CAAC;YACN,sBAAsB,EAAE,CAAA;QAC1B,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,4DAA4D;AAC5D,SAAS,gBAAgB;IACvB,eAAO;SACJ,GAAG,CAAuB,iEAAiE,CAAC;SAC5F,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QACjB,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAC9D,MAAM,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAA;QAE5D,IAAI,IAAA,kCAAe,EAAC,aAAa,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,uBAAuB,GAAG,aAAa,CAAA;QACzC,CAAC;aAAM,CAAC;YACN,uBAAuB,GAAG,KAAK,CAAA;QACjC,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,8CAA8C;QAC9C,uBAAuB,GAAG,KAAK,CAAA;IACjC,CAAC,CAAC,CAAA;AACN,CAAC;AAED,6EAA6E;AAC7E,0EAA0E;AAC1E,+CAA+C;AAC/C,KAAK,UAAU,sBAAsB;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,uBAAuB,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAK;QACP,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,sBAAsB,EAAE,CAAA;AAC1B,CAAC;AAED,+EAA+E;AAC/E,4EAA4E;AAC5E,4EAA4E;AAC5E,sEAAsE;AACtE,SAAgB,mBAAmB,CAAC,SAAS,GAAG,CAAC;IAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,sBAAsB,EAAE,CAAA;IAC1B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACzB,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,mCAAmC,CAAA;AAC5C,CAAC;AAED,MAAM,kBAAkB,GAAG;;0EAE+C,CAAA;AAE1E,SAAS,sBAAsB;IAC7B,IAAI,2BAA2B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC7D,gBAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IACjC,CAAC;IAED,IAAI,uBAAuB,EAAE,CAAC;QAC5B,gBAAM,CAAC,IAAI,CAAC,mDAAmD,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,iEAAiE,uBAAuB;;iBAE/K,eAAK,CAAC,WAAW,CAAC,wCAAwC,CAAC,0BAA0B,eAAK,CAAC,WAAW,CAAC,2CAA2C,CAAC,sEAAsE,CAAC,CAAA;IACzO,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,gBAAM,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAA;IAC7B,CAAC;AACH,CAAC;AAED,SAAgB,SAAS;IACvB,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAC7C,QAAQ,CAAC,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;AACpD,CAAC","sourcesContent":["import chalk from 'chalk'\nimport { logger } from './logging'\nimport { compareVersions } from 'compare-versions'\nimport { BaseCommand } from '../commands/connect'\nimport { Command } from 'commander'\nimport { request } from './fetch'\n\nlet updatedVersionAvailable: string | false | undefined = undefined\nlet message: string | undefined = undefined\nlet parserBasedCodeConnectFound = false\nlet deprecationWarningHidden = false\nlet skipUpdateCheck = false\n\n// Called when the native parser has actually produced Code Connect docs, which\n// is the only definitive signal that a project still uses the legacy parsers.\nexport function flagParserBasedCodeConnect() {\n parserBasedCodeConnectFound = true\n}\n\n// The type of the arguments passed to a command handler:\n// any arguments, then the command arguments, then the Command object\ntype CommandArgs<T extends BaseCommand> = [...any[], T, Command]\n\n// Wrap action handlers to check for updates or a message, and output a message\n// after the action if any are available\nexport function withVersionWarnings<T extends BaseCommand>(\n // The second to last argument is always the command args, but I couldn't work\n // out how to model this with Typescript here\n fn: (...args: any[]) => void | Promise<void>,\n { hideDeprecationWarning = false }: { hideDeprecationWarning?: boolean } = {},\n) {\n return (...args: CommandArgs<T>) => {\n // Get the args passed at the command line (the second to last argument)\n const commandArgs = args[args.length - 2]\n // Anything before that is a regular arg\n const restArgs = args.slice(0, -2)\n\n skipUpdateCheck = !!commandArgs.skipUpdateCheck\n deprecationWarningHidden = hideDeprecationWarning\n\n if (skipUpdateCheck) {\n return fn(...restArgs, commandArgs)\n }\n\n startUpdateCheck()\n\n const result = fn(...restArgs, commandArgs)\n if (result instanceof Promise) {\n result.finally(waitAndCheckForUpdates)\n } else {\n waitAndCheckForUpdates()\n }\n }\n}\n\n// Start checking for updates in the background. We don't wait for this before\n// running the action, as we will show the result at the end\nfunction startUpdateCheck() {\n request\n .get<{ tag_name: string }>('https://api.github.com/repos/figma/code-connect/releases/latest')\n .then((response) => {\n const latestVersion = response.data.tag_name.replace(/^v/, '')\n const currentVersion = require('../../package.json').version\n\n if (compareVersions(latestVersion, currentVersion) === 1) {\n updatedVersionAvailable = latestVersion\n } else {\n updatedVersionAvailable = false\n }\n })\n .catch(() => {\n // Silently fail if we can't check for updates\n updatedVersionAvailable = false\n })\n}\n\n// Wait for up to 1 second for the result of update checking to be available,\n// and output a message if there is an update or a message. If there is no\n// result after the timeout, the app will exit.\nasync function waitAndCheckForUpdates() {\n for (let i = 0; i < 10; i++) {\n if (updatedVersionAvailable !== undefined) {\n break\n }\n await new Promise((resolve) => setTimeout(resolve, 100))\n }\n\n maybeShowUpdateMessage()\n}\n\n// Exit the process, first checking if there is an update or message available.\n// Unlike waitAndCheckForUpdates, this will not wait for the update check to\n// complete, so if the request has not completed yet, nothing will be shown.\n// This is to avoid confusion about when the process _actually_ exits.\nexport function exitWithUpdateCheck(errorCode = 1): never {\n if (!skipUpdateCheck) {\n maybeShowUpdateMessage()\n }\n process.exit(errorCode)\n}\n\nfunction getUpdateCommand() {\n return 'npm update -g @figma/code-connect'\n}\n\nconst DEPRECATION_NOTICE = `\nFramework-specific parsers will no longer receive updates or support from August 17th, 2026. Template files will be the only actively maintained way of using Code Connect. See our migration guide for more information and instructions on migrating parser-based Code Connect:\nhttps://developers.figma.com/docs/code-connect/templates-migration-guide/`\n\nfunction maybeShowUpdateMessage() {\n if (parserBasedCodeConnectFound && !deprecationWarningHidden) {\n logger.warn(DEPRECATION_NOTICE)\n }\n\n if (updatedVersionAvailable) {\n logger.warn(`\\nA new version of the Figma CLI is available. v${require('../../package.json').version} is currently installed, and the latest version available is v${updatedVersionAvailable}.\n\nTo update, run ${chalk.whiteBright('npm install @figma/code-connect@latest')} for React or HTML, or ${chalk.whiteBright('npm install -g @figma/code-connect@latest')} for other targets (or if you have Code Connect installed globally).`)\n }\n\n if (message) {\n logger.warn(`\\n${message}`)\n }\n}\n\nexport function updateCli() {\n const { execSync } = require('child_process')\n execSync(getUpdateCommand(), { stdio: 'inherit' })\n}\n"]}
1
+ {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/common/updates.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk'\nimport { logger } from './logging'\nimport { compareVersions } from 'compare-versions'\nimport { BaseCommand } from '../commands/connect'\nimport { Command } from 'commander'\nimport { request } from './fetch'\n\nlet updatedVersionAvailable: string | false | undefined = undefined\nlet message: string | undefined = undefined\nlet skipUpdateCheck = false\n\n// The type of the arguments passed to a command handler:\n// any arguments, then the command arguments, then the Command object\ntype CommandArgs<T extends BaseCommand> = [...any[], T, Command]\n\n// Wrap action handlers to check for updates or a message, and output a message\n// after the action if any are available\nexport function withUpdateCheck<T extends BaseCommand>(\n // The second to last argument is always the command args, but I couldn't work\n // out how to model this with Typescript here\n fn: (...args: any[]) => void | Promise<void>,\n) {\n return (...args: CommandArgs<T>) => {\n // Get the args passed at the command line (the second to last argument)\n const commandArgs = args[args.length - 2]\n // Anything before that is a regular arg\n const restArgs = args.slice(0, -2)\n\n skipUpdateCheck = !!commandArgs.skipUpdateCheck\n\n if (skipUpdateCheck) {\n return fn(...restArgs, commandArgs)\n }\n\n startUpdateCheck()\n\n const result = fn(...restArgs, commandArgs)\n if (result instanceof Promise) {\n result.finally(waitAndCheckForUpdates)\n } else {\n waitAndCheckForUpdates()\n }\n }\n}\n\n// Start checking for updates in the background. We don't wait for this before\n// running the action, as we will show the result at the end\nfunction startUpdateCheck() {\n request\n .get<{ tag_name: string }>('https://api.github.com/repos/figma/code-connect/releases/latest')\n .then((response) => {\n const latestVersion = response.data.tag_name.replace(/^v/, '')\n const currentVersion = require('../../package.json').version\n\n if (compareVersions(latestVersion, currentVersion) === 1) {\n updatedVersionAvailable = latestVersion\n } else {\n updatedVersionAvailable = false\n }\n })\n .catch(() => {\n // Silently fail if we can't check for updates\n updatedVersionAvailable = false\n })\n}\n\n// Wait for up to 1 second for the result of update checking to be available,\n// and output a message if there is an update or a message. If there is no\n// result after the timeout, the app will exit.\nasync function waitAndCheckForUpdates() {\n for (let i = 0; i < 10; i++) {\n if (updatedVersionAvailable !== undefined) {\n break\n }\n await new Promise((resolve) => setTimeout(resolve, 100))\n }\n\n maybeShowUpdateMessage()\n}\n\n// Exit the process, first checking if there is an update or message available.\n// Unlike waitAndCheckForUpdates, this will not wait for the update check to\n// complete, so if the request has not completed yet, nothing will be shown.\n// This is to avoid confusion about when the process _actually_ exits.\nexport function exitWithUpdateCheck(errorCode = 1): never {\n if (!skipUpdateCheck) {\n maybeShowUpdateMessage()\n }\n process.exit(errorCode)\n}\n\nfunction getUpdateCommand() {\n return 'npm update -g @figma/code-connect'\n}\n\nfunction maybeShowUpdateMessage() {\n if (updatedVersionAvailable) {\n logger.warn(`\\nA new version of the Figma CLI is available. v${require('../../package.json').version} is currently installed, and the latest version available is v${updatedVersionAvailable}.\n\nTo update, run ${chalk.whiteBright('npm install @figma/code-connect@latest')} for React or HTML, or ${chalk.whiteBright('npm install -g @figma/code-connect@latest')} for other targets (or if you have Code Connect installed globally).`)\n }\n\n if (message) {\n logger.warn(`\\n${message}`)\n }\n}\n\nexport function updateCli() {\n const { execSync } = require('child_process')\n execSync(getUpdateCommand(), { stdio: 'inherit' })\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"run_wizard.d.ts","sourceRoot":"","sources":["../../../src/connect/wizard/run_wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiD,MAAM,wBAAwB,CAAA;AACnG,OAAO,OAAO,MAAM,SAAS,CAAA;AAG7B,OAAO,EAAE,YAAY,EAAa,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EACL,gBAAgB,EAKhB,iBAAiB,EACjB,WAAW,EAGZ,MAAM,uBAAuB,CAAA;AAI9B,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EAGzB,WAAW,EACZ,MAAM,4BAA4B,CAAA;AAuBnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAE3D,KAAK,0BAA0B,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,EAAE,CAAA;AAiGrF;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,YAAY,CAAC,SAAS,EAAE,EACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,qCA0C9B;AA+ED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,YAAY,CAAC,SAAS,EAAE,EACpC,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtD,2BAA2B,EAAE,0BAA0B,EACvD,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,EAAE,CA2ClB;AA4ND,UAAU,cAAc;IACtB,WAAW,EAAE,cAAc,GAAG,eAAe,CAAA;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,CAAC,EAAE,sBAAsB,CAAA;IAC3C,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,YAAY,CAAC,SAAS,CAAA;IAC1C,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,iBAAiB,CAAA;CAC1B;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,GAAG,oBAAoB,CAAC,EAC1E,IAAI,EAAE,cAAc,iBAwDrB;AAED,wBAAsB,sBAAsB,CAAC,EAC3C,8BAA8B,EAC9B,YAAY,EACZ,wBAAwB,EACxB,MAAM,EAAE,SAAS,EACjB,WAAW,EACX,GAAG,EACH,WAAW,EACX,KAAK,GACN,EAAE;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtD,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;IAChE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,WAAW,EAAE,WAAW,CAAA;IACxB,GAAG,EAAE,WAAW,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,OAAO,CAAA;CACf,oBAoGA;AAED,wBAAgB,kCAAkC,CAAC,EACjD,aAAa,EACb,WAAW,EACX,GAAG,GACJ,EAAE;IACD,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;CACZ,iBAYA;AAED,wBAAsB,qDAAqD,CACzE,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,YAAY,CAAC,SAAS,EAAE,EAC5C,WAAW,EAAE,WAAW,CAAC,iBAAiB,CAAC,GAAG,gBAAgB;;;GA8C/D;AAsFD,wBAAsB,SAAS,CAAC,GAAG,EAAE,WAAW,iBA2Q/C"}
1
+ {"version":3,"file":"run_wizard.d.ts","sourceRoot":"","sources":["../../../src/connect/wizard/run_wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiD,MAAM,wBAAwB,CAAA;AACnG,OAAO,OAAO,MAAM,SAAS,CAAA;AAG7B,OAAO,EAAE,YAAY,EAAa,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EACL,gBAAgB,EAKhB,iBAAiB,EACjB,WAAW,EAGZ,MAAM,uBAAuB,CAAA;AAI9B,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EAGzB,WAAW,EACZ,MAAM,4BAA4B,CAAA;AAuBnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAE3D,KAAK,0BAA0B,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,EAAE,CAAA;AAiGrF;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,YAAY,CAAC,SAAS,EAAE,EACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,qCA0C9B;AA+ED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,YAAY,CAAC,SAAS,EAAE,EACpC,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtD,2BAA2B,EAAE,0BAA0B,EACvD,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,EAAE,CA2ClB;AA4ND,UAAU,cAAc;IACtB,WAAW,EAAE,cAAc,GAAG,eAAe,CAAA;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,CAAC,EAAE,sBAAsB,CAAA;IAC3C,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,YAAY,CAAC,SAAS,CAAA;IAC1C,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,iBAAiB,CAAA;CAC1B;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,GAAG,oBAAoB,CAAC,EAC1E,IAAI,EAAE,cAAc,iBAwDrB;AAED,wBAAsB,sBAAsB,CAAC,EAC3C,8BAA8B,EAC9B,YAAY,EACZ,wBAAwB,EACxB,MAAM,EAAE,SAAS,EACjB,WAAW,EACX,GAAG,EACH,WAAW,EACX,KAAK,GACN,EAAE;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtD,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;IAChE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,WAAW,EAAE,WAAW,CAAA;IACxB,GAAG,EAAE,WAAW,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,OAAO,CAAA;CACf,oBAoGA;AAED,wBAAgB,kCAAkC,CAAC,EACjD,aAAa,EACb,WAAW,EACX,GAAG,GACJ,EAAE;IACD,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;CACZ,iBAYA;AAED,wBAAsB,qDAAqD,CACzE,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,YAAY,CAAC,SAAS,EAAE,EAC5C,WAAW,EAAE,WAAW,CAAC,iBAAiB,CAAC,GAAG,gBAAgB;;;GAiD/D;AAsFD,wBAAsB,SAAS,CAAC,GAAG,EAAE,WAAW,iBA6Q/C"}
@@ -534,7 +534,10 @@ function convertRemoteFileUrlToRelativePath({ remoteFileUrl, gitRootPath, dir, }
534
534
  async function getUnconnectedComponentsAndConnectedComponentMappings(cmd, figmaFileUrl, componentsFromFile, projectInfo) {
535
535
  const dir = (0, connect_1.getDir)(cmd);
536
536
  const fileKey = (0, helpers_1.parseFileKey)(figmaFileUrl);
537
- const codeConnectObjects = await (0, connect_1.getCodeConnectObjects)(cmd, projectInfo, true);
537
+ const codeConnectObjects = await (0, connect_1.getCodeConnectObjects)(cmd, projectInfo, {
538
+ silent: true,
539
+ parserMode: 'exempt',
540
+ });
538
541
  const connectedNodeIdsInFileToCodeConnectObjectMap = codeConnectObjects.reduce((map, codeConnectJson) => {
539
542
  const parsedNode = (0, validation_1.parseFigmaNode)(cmd.verbose, codeConnectJson, true);
540
543
  if (parsedNode && parsedNode.fileKey === fileKey) {
@@ -826,7 +829,7 @@ async function runWizard(cmd) {
826
829
  useAi,
827
830
  });
828
831
  if (success) {
829
- logging_1.logger.info(`\nUse the 'publish' command to make mappings visible in Figma Dev Mode.`);
832
+ logging_1.logger.info(`\nRun \`figma connect migrate\` to convert the generated files to templates, then run \`figma connect publish\` to make mappings visible in Figma Dev Mode.`);
830
833
  }
831
834
  }
832
835
  //# sourceMappingURL=run_wizard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run_wizard.js","sourceRoot":"","sources":["../../../src/connect/wizard/run_wizard.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseCommand, getAccessToken, getCodeConnectObjects, getDir } from '../../commands/connect'\nimport prompts from 'prompts'\nimport fs from 'fs'\nimport { exitWithFeedbackMessage, findComponentsInDocument, parseFileKey } from '../helpers'\nimport { FigmaRestApi, getApiUrl } from '../figma_rest_api'\nimport { exitWithError, logger, success } from '../../common/logging'\nimport {\n ReactProjectInfo,\n getReactProjectInfo,\n getGitRepoAbsolutePath,\n parseOrDetermineConfig,\n getProjectInfoFromConfig,\n CodeConnectConfig,\n ProjectInfo,\n CodeConnectExecutableParserConfig,\n checkForEnvAndToken,\n} from '../../connect/project'\nimport { parseFigmaNode } from '../validation'\nimport chalk from 'chalk'\nimport path from 'path'\nimport {\n CreateRequestPayload,\n CreateRequestPayloadMulti,\n CreateResponsePayload,\n FigmaConnection,\n PropMapping,\n} from '../parser_executable_types'\nimport { normalizeComponentName } from '../create'\nimport { createReactCodeConnect } from '../../react/create'\nimport { CodeConnectJSON } from '../../connect/figma_connect'\nimport boxen from 'boxen'\nimport {\n createCodeConnectConfig,\n getComponentOptionsMap,\n getFilepathExportsFromFiles,\n parseFilepathExport,\n getIncludesGlob,\n isValidFigmaUrl,\n createEnvFile,\n addTokenToEnvFile,\n} from './helpers'\nimport stripAnsi from 'strip-ansi'\nimport { callParser, handleMessages } from '../parser_executables'\nimport ora from 'ora'\nimport { z } from 'zod'\nimport { fromError } from 'zod-validation-error'\nimport { autoLinkComponents } from './autolinking'\nimport { extractDataAndGenerateAllPropsMappings } from './prop_mapping_helpers'\nimport { isFetchError, request } from '../../common/fetch'\nimport { ComponentTypeSignature } from '../../react/parser'\n\ntype ConnectedComponentMappings = { componentName: string; filepathExport: string }[]\n\nconst NONE = '(None)'\nconst MAX_COMPONENTS_TO_MAP = 40\n\nfunction clearQuestion(prompt: prompts.PromptObject<string>, answer: string) {\n const displayedAnswer =\n (Array.isArray(prompt.choices) && prompt.choices.find((c) => c.value === answer)?.title) ||\n answer\n const lengthOfDisplayedQuestion =\n stripAnsi(prompt.message as string).length + stripAnsi(displayedAnswer).length + 5 // 2 chars before, 3 chars between Q + A\n const rowsToRemove = Math.ceil(lengthOfDisplayedQuestion / process.stdout.columns)\n\n process.stdout.moveCursor(0, -rowsToRemove)\n process.stdout.clearScreenDown()\n}\n\ntype CliDataResponse = {\n document: FigmaRestApi.Node\n componentSets: string[]\n components: Record<string, { componentSetId: string }>\n}\n\nasync function fetchTopLevelComponentsFromFile({\n accessToken,\n figmaUrl,\n cmd,\n projectInfo,\n}: {\n accessToken: string\n figmaUrl: string\n cmd: BaseCommand\n projectInfo?: ProjectInfo\n}) {\n // TODO enter create flow if node-id specified\n const fileKey = parseFileKey(figmaUrl)\n\n const apiUrl =\n getApiUrl(figmaUrl ?? '', cmd.apiUrl || projectInfo?.config.apiUrl) +\n `/code_connect/${fileKey}/cli_data`\n\n try {\n const spinner = ora({\n text: `Fetching component information from ${cmd.verbose ? `${apiUrl}\\n` : 'Figma...'}`,\n color: 'green',\n }).start()\n\n const response = await (\n process.env.CODE_CONNECT_MOCK_DOC_RESPONSE\n ? Promise.resolve({\n response: { status: 200 },\n data: JSON.parse(\n fs.readFileSync(process.env.CODE_CONNECT_MOCK_DOC_RESPONSE, 'utf-8'),\n ) as CliDataResponse,\n })\n : request.get<CliDataResponse>(apiUrl, {\n headers: {\n 'X-Figma-Token': accessToken,\n 'Content-Type': 'application/json',\n },\n })\n ).finally(() => {\n if (cmd.verbose) {\n spinner.stopAndPersist()\n } else {\n spinner.stop()\n }\n })\n\n if (response.response.status === 200) {\n return findComponentsInDocument(response.data.document).filter(\n ({ id }) =>\n id in response.data.componentSets || !response.data.components[id].componentSetId,\n )\n } else {\n logger.error(`Failed to fetch components from Figma with status: ${response.response.status}`)\n logger.debug('Failed to fetch components from Figma with Body:', response.data)\n }\n } catch (err) {\n if (isFetchError(err)) {\n if (err.response) {\n logger.error(\n `Failed to fetch components from Figma (${err.response.status}): ${err.response.status} ${\n err.data?.err ?? err.data?.message\n }`,\n )\n } else {\n logger.error(`Failed to fetch components from Figma: ${err.message}`)\n }\n logger.debug(JSON.stringify(err.data))\n } else {\n logger.error(err)\n }\n exitWithFeedbackMessage(1)\n }\n}\n\n/**\n * enable selection of a subset of components per page\n * @param components to narrow down from\n * @returns components narrowed down to the selected pages\n */\nexport async function narrowDownComponentsPerPage(\n components: FigmaRestApi.Component[],\n pages: Record<string, string>,\n) {\n const createTitle = (name: string, id: string, pad: number) => {\n const componentsInPage = components.filter((c) => c.pageId === id)\n let namesPreview = componentsInPage\n .slice(0, 4)\n .map((c) => c.name)\n .join(', ')\n\n namesPreview = componentsInPage.length > 4 ? `${namesPreview}, ...` : `${namesPreview}`\n const componentWord = componentsInPage.length === 1 ? 'Component' : 'Components'\n\n return `${name.padEnd(pad, ' ')} - ${componentsInPage.length} ${componentWord} ${chalk.dim(\n `(${namesPreview})`,\n )}`\n }\n\n const longestPageName = Math.max(...Object.values(pages).map((name) => name.length))\n\n let pagesToMap: string[] = []\n console.info('')\n while (true) {\n const { pagesToMap_temp } = await askQuestion({\n type: 'multiselect',\n name: 'pagesToMap_temp',\n message: `Select the pages with the Figma components you'd like to map (Press ${chalk.green('space')} to select and ${chalk.green('enter')} to continue)`,\n instructions: false,\n choices: Object.entries(pages).map(([id, name]) => ({\n title: createTitle(name, id, longestPageName),\n value: id,\n })),\n })\n\n if (!pagesToMap_temp || pagesToMap_temp.length === 0) {\n logger.warn('Select at least one page to continue.')\n continue\n }\n pagesToMap = pagesToMap_temp\n break\n }\n\n return components.filter((c) => pagesToMap.includes(c.pageId))\n}\n\n/**\n * Asks a Prompts question and adds spacing\n * @param question Prompts question\n * @returns Prompts answer\n */\nasync function askQuestion<T extends string = string>(\n question: prompts.PromptObject<T>,\n): Promise<prompts.Answers<T>> {\n const answers = await prompts(question)\n logger.info('')\n return answers\n}\n\n/**\n * Asks a Prompts question and exits the process if user cancels\n * @param question Prompts question\n * @returns Prompts answer\n */\nasync function askQuestionOrExit<T extends string = string>(\n question: prompts.PromptObject<T>,\n): Promise<prompts.Answers<T>> {\n const answers = await askQuestion(question)\n if (!Object.keys(answers).length) {\n return process.exit(0)\n }\n return answers\n}\n\n/**\n * Asks a Prompts question and shows an exit confirmation if user cancels.\n * This should be used for questions further along in the wizard.\n * @param question Prompts question\n * @returns Prompts answer\n */\nasync function askQuestionWithExitConfirmation<T extends string = string>(\n question: prompts.PromptObject<T>,\n): Promise<prompts.Answers<T>> {\n while (true) {\n const answers = await askQuestion(question)\n\n if (Object.keys(answers).length) {\n return answers\n }\n\n const { shouldExit } = await askQuestion({\n type: 'select',\n name: 'shouldExit',\n message: 'Are you sure you want to exit?',\n choices: [\n {\n title: 'Yes',\n value: 'yes',\n },\n {\n title: 'No',\n value: 'no',\n },\n ],\n })\n // also exit if no answer provided (esc / ctrl+c)\n if (!shouldExit || shouldExit === 'yes') {\n process.exit(0)\n }\n }\n}\n\nfunction formatComponentTitle(componentName: string, filepathExport: string | null, pad: number) {\n const fileExport = filepathExport ? parseFilepathExport(filepathExport) : null\n const nameLabel = `${chalk.dim('Figma component:')} ${componentName.padEnd(pad, ' ')}`\n\n const filepathLabel = fileExport ? fileExport.filepath : '-'\n const exportNote = fileExport?.exportName ? ` (${fileExport.exportName})` : ''\n\n const linkedLabel = `↔️ ${chalk.dim('Code Definition:')} ${filepathLabel}${exportNote}`\n return `${nameLabel} ${linkedLabel}`\n}\n\nexport function getComponentChoicesForPrompt(\n components: FigmaRestApi.Component[],\n linkedNodeIdsToFilepathExports: Record<string, string>,\n connectedComponentsMappings: ConnectedComponentMappings,\n dir: string,\n): prompts.Choice[] {\n const longestNameLength = [...components, ...connectedComponentsMappings].reduce(\n (longest, component) =>\n Math.max(\n longest,\n 'name' in component ? component.name.length : component.componentName.length,\n ),\n 0,\n )\n\n const nameCompare = (a: FigmaRestApi.Component, b: FigmaRestApi.Component) =>\n a.name.localeCompare(b.name)\n\n const linkedComponents = components\n .filter((c) => !!linkedNodeIdsToFilepathExports[c.id])\n .sort(nameCompare)\n const unlinkedComponents = components\n .filter((c) => !linkedNodeIdsToFilepathExports[c.id])\n .sort(nameCompare)\n\n const formatComponentChoice = (c: FigmaRestApi.Component) => {\n const filepathExport = linkedNodeIdsToFilepathExports[c.id]\n ? path.relative(dir, linkedNodeIdsToFilepathExports[c.id])\n : null\n return {\n title: formatComponentTitle(c.name, filepathExport, longestNameLength),\n value: c.id,\n description: `${chalk.green('Edit Match')}`,\n }\n }\n\n return [\n ...linkedComponents.map(formatComponentChoice),\n ...unlinkedComponents.map(formatComponentChoice),\n ...connectedComponentsMappings.map((connectedComponent) => ({\n title: formatComponentTitle(\n connectedComponent.componentName,\n connectedComponent.filepathExport,\n longestNameLength,\n ),\n disabled: true,\n })),\n ]\n}\n\nfunction getUnconnectedComponentChoices(componentPaths: string[], dir: string) {\n return [\n {\n title: NONE,\n value: NONE,\n },\n ...componentPaths.map((absPath) => {\n return {\n title: path.relative(dir, absPath),\n value: absPath,\n }\n }),\n ]\n}\n\ntype ManualLinkingArgs = {\n unconnectedComponents: FigmaRestApi.Component[]\n connectedComponentsMappings: ConnectedComponentMappings\n linkedNodeIdsToFilepathExports: Record<string, string>\n filepathExports: string[]\n cmd: BaseCommand\n}\n\nconst escapeHandler = () => {\n let escPressed = false\n const keypressListener = (_: any, key: { name: string }) => {\n if (key.name === 'escape') {\n escPressed = true\n }\n }\n process.stdin.on('keypress', keypressListener)\n return {\n escPressed: () => escPressed,\n reset: () => {\n escPressed = false\n },\n destroy: () => {\n process.stdin.removeListener('keypress', keypressListener)\n },\n }\n}\n\nasync function runManualLinking({\n unconnectedComponents,\n linkedNodeIdsToFilepathExports,\n filepathExports,\n connectedComponentsMappings,\n cmd,\n}: ManualLinkingArgs) {\n const filesToComponentOptionsMap = getComponentOptionsMap(filepathExports)\n const dir = getDir(cmd)\n const escHandler = escapeHandler()\n while (true) {\n // Don't show exit confirmation as we're relying on esc behavior\n const { nodeId } = await prompts(\n {\n type: 'select',\n name: 'nodeId',\n message: `Select a Figma component match you'd like to edit (Press ${chalk.green(\n 'esc',\n )} when you're ready to continue on)`,\n choices: getComponentChoicesForPrompt(\n unconnectedComponents,\n linkedNodeIdsToFilepathExports,\n connectedComponentsMappings,\n dir,\n ),\n warn: 'This component already has a local Code Connect file.',\n hint: ' ',\n },\n {\n onSubmit: clearQuestion,\n },\n )\n if (!nodeId) {\n break\n }\n const pathChoices = getUnconnectedComponentChoices(Object.keys(filesToComponentOptionsMap), dir)\n const prevSelectedKey = linkedNodeIdsToFilepathExports[nodeId]\n\n const { filepath: prevSelectedFilepath, exportName: prevSelectedComponent } = prevSelectedKey\n ? parseFilepathExport(prevSelectedKey)\n : {\n filepath: null,\n exportName: null,\n }\n\n escHandler.reset()\n const { pathToComponent } = await prompts(\n {\n type: 'autocomplete',\n name: 'pathToComponent',\n message: 'Choose a path to your code component (type to filter results)',\n choices: pathChoices,\n // default suggest uses .startsWith(input) which isn't very useful for full paths\n suggest: (input, choices) =>\n Promise.resolve(\n choices.filter((i) => i.value.toUpperCase().includes(input.toUpperCase())),\n ),\n // preselect if editing an existing choice\n initial: prevSelectedFilepath\n ? pathChoices.findIndex(({ value }) => value === prevSelectedFilepath)\n : 0,\n },\n {\n onSubmit: clearQuestion,\n },\n )\n if (escHandler.escPressed()) {\n continue\n }\n if (pathToComponent) {\n if (pathToComponent === NONE) {\n delete linkedNodeIdsToFilepathExports[nodeId]\n } else {\n const fileExports = filesToComponentOptionsMap[pathToComponent]\n if (fileExports.length === 0) {\n // Not TS, default to filepath\n linkedNodeIdsToFilepathExports[nodeId] = pathToComponent\n } else {\n escHandler.reset()\n const { filepathExport } = await prompts(\n {\n type: 'autocomplete',\n name: 'filepathExport',\n message: `Choose an export of ${path.parse(pathToComponent).base} (type to filter results)`,\n choices: fileExports,\n // default suggest uses .startsWith(input)\n suggest: (input, choices) =>\n Promise.resolve(\n choices.filter((i) => i.value.toUpperCase().includes(input.toUpperCase())),\n ),\n // preselect if editing an existing choice\n initial:\n prevSelectedComponent && prevSelectedFilepath === pathToComponent\n ? fileExports.findIndex(({ title }) => title === prevSelectedComponent)\n : 0,\n },\n {\n onSubmit: clearQuestion,\n },\n )\n if (escHandler.escPressed()) {\n continue\n }\n linkedNodeIdsToFilepathExports[nodeId] = filepathExport\n }\n }\n }\n }\n escHandler.destroy()\n}\n\nasync function runManualLinkingWithConfirmation(manualLinkingArgs: ManualLinkingArgs) {\n let outDir = manualLinkingArgs.cmd.outDir || null\n\n while (true) {\n await runManualLinking(manualLinkingArgs)\n\n if (!outDir) {\n console.info(\n '\\nA Code Connect file is created for each Figma component to code definition match.',\n )\n const { outputDirectory } = await askQuestionWithExitConfirmation({\n type: 'text',\n name: 'outputDirectory',\n message: `In which directory would you like to store Code Connect files? (Press ${chalk.green('enter')} to co-locate your files alongside your component files)`,\n })\n outDir = outputDirectory\n }\n\n const linkedNodes = Object.keys(manualLinkingArgs.linkedNodeIdsToFilepathExports)\n if (!linkedNodes.length) {\n const { confirmation } = await askQuestionOrExit({\n type: 'select',\n name: 'confirmation',\n message: `No Code Connect files linked. Are you sure you want to exit?`,\n choices: [\n {\n title: 'Back to edit',\n value: 'backToEdit',\n },\n {\n title: 'Exit',\n value: 'exit',\n },\n ],\n })\n if (confirmation === 'exit') {\n process.exit(0)\n }\n } else {\n const { confirmation } = await askQuestionWithExitConfirmation({\n type: 'select',\n name: 'confirmation',\n message: `You're ready to create ${chalk.green(linkedNodes.length)} Code Connect file${\n linkedNodes.length == 1 ? '' : 's'\n }. Continue?`,\n choices: [\n {\n title: 'Create files',\n value: 'create',\n },\n {\n title: 'Back to editing',\n value: 'backToEdit',\n },\n ],\n })\n if (confirmation === 'backToEdit') {\n outDir = manualLinkingArgs.cmd.outDir || null\n } else {\n return outDir\n }\n }\n }\n}\n\ninterface AddPayloadArgs {\n payloadType: 'MULTI_EXPORT' | 'SINGLE_EXPORT'\n filepath: string\n sourceExport: string\n reactTypeSignature?: ComponentTypeSignature\n propMapping?: PropMapping\n figmaNodeUrl: string\n moreComponentProps: FigmaRestApi.Component\n destinationDir: string\n sourceFilepath: string\n normalizedName: string\n config: CodeConnectConfig\n}\n\nexport async function addPayload(\n payloads: Record<string, CreateRequestPayloadMulti | CreateRequestPayload>,\n args: AddPayloadArgs,\n) {\n const {\n payloadType,\n filepath,\n sourceExport,\n reactTypeSignature,\n propMapping,\n figmaNodeUrl,\n moreComponentProps,\n destinationDir,\n sourceFilepath,\n normalizedName,\n config,\n } = args\n\n if (payloadType === 'MULTI_EXPORT') {\n const figmaConnection: FigmaConnection = {\n sourceExport,\n reactTypeSignature,\n propMapping,\n component: {\n figmaNodeUrl,\n ...moreComponentProps,\n },\n }\n\n if (payloads[filepath]) {\n ;(payloads[filepath] as CreateRequestPayloadMulti).figmaConnections.push(figmaConnection)\n } else {\n const payload: CreateRequestPayloadMulti = {\n mode: 'CREATE',\n destinationDir,\n sourceFilepath,\n normalizedName,\n figmaConnections: [figmaConnection],\n config,\n }\n payloads[filepath] = payload\n }\n }\n\n if (payloadType === 'SINGLE_EXPORT') {\n const payload: CreateRequestPayload = {\n mode: 'CREATE',\n destinationDir,\n sourceFilepath,\n component: {\n figmaNodeUrl,\n normalizedName,\n ...moreComponentProps,\n },\n config,\n }\n payloads[filepath] = payload\n }\n}\n\nexport async function createCodeConnectFiles({\n linkedNodeIdsToFilepathExports,\n figmaFileUrl,\n unconnectedComponentsMap,\n outDir: outDirArg,\n projectInfo,\n cmd,\n accessToken,\n useAi,\n}: {\n figmaFileUrl: string\n linkedNodeIdsToFilepathExports: Record<string, string>\n unconnectedComponentsMap: Record<string, FigmaRestApi.Component>\n outDir: string | null\n projectInfo: ProjectInfo\n cmd: BaseCommand\n accessToken: string\n useAi: boolean\n}) {\n const filepathExportsToComponents = Object.entries(linkedNodeIdsToFilepathExports).reduce(\n (map, [nodeId, filepathExport]) => {\n map[filepathExport] = unconnectedComponentsMap[nodeId]\n return map\n },\n {} as Record<string, FigmaRestApi.Component>,\n )\n\n let embeddingsFetchSpinner: ora.Ora | null = null\n\n if (useAi) {\n embeddingsFetchSpinner = ora({\n text: 'Computing embeddings...',\n color: 'green',\n }).start()\n }\n\n const propMappingsAndData =\n projectInfo.config.parser === 'react'\n ? await extractDataAndGenerateAllPropsMappings({\n filepathExportsToComponents,\n projectInfo,\n cmd,\n figmaUrl: figmaFileUrl,\n accessToken,\n useAi,\n })\n : null\n\n if (embeddingsFetchSpinner) {\n embeddingsFetchSpinner.stop()\n }\n\n let allFilesCreated = true\n\n const payloads: Record<string, CreateRequestPayloadMulti | CreateRequestPayload> = {}\n\n for (const [nodeId, filepathExport] of Object.entries(linkedNodeIdsToFilepathExports)) {\n const urlObj = new URL(figmaFileUrl)\n urlObj.search = ''\n urlObj.searchParams.append('node-id', nodeId)\n const { filepath, exportName } = parseFilepathExport(filepathExport)\n\n const { name } = path.parse(filepath)\n\n const outDir = outDirArg || path.dirname(filepath)\n\n const payloadType =\n projectInfo.config.parser === 'react' || projectInfo.config.parser === 'html'\n ? 'MULTI_EXPORT'\n : 'SINGLE_EXPORT'\n\n addPayload(payloads, {\n payloadType,\n filepath,\n sourceExport: exportName || '?',\n reactTypeSignature: propMappingsAndData?.propMappingData[filepathExport]?.signature,\n propMapping: propMappingsAndData?.propMappings[filepathExport],\n figmaNodeUrl: urlObj.toString(),\n moreComponentProps: unconnectedComponentsMap[nodeId],\n destinationDir: outDir,\n sourceFilepath: filepath,\n normalizedName: normalizeComponentName(name),\n config: projectInfo.config,\n })\n }\n\n for (const payloadKey of Object.keys(payloads)) {\n const payload = payloads[payloadKey]\n let result: z.infer<typeof CreateResponsePayload>\n if (projectInfo.config.parser === 'react') {\n result = await createReactCodeConnect(payload as CreateRequestPayloadMulti)\n } else {\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 as CreateRequestPayload,\n projectInfo.absPath,\n )\n\n result = CreateResponsePayload.parse(stdout)\n } catch (e) {\n throw fromError(e)\n }\n }\n\n const { hasErrors } = handleMessages(result.messages)\n\n if (!hasErrors) {\n result.createdFiles.forEach((file) => {\n logger.info(success(`Created ${file.filePath}`))\n })\n } else {\n allFilesCreated = false\n }\n }\n return allFilesCreated\n}\n\nexport function convertRemoteFileUrlToRelativePath({\n remoteFileUrl,\n gitRootPath,\n dir,\n}: {\n remoteFileUrl: string\n gitRootPath: string\n dir: string\n}) {\n if (!gitRootPath) {\n return null\n }\n const pathWithinRepo = remoteFileUrl.replace(new RegExp(`.*?(tree|blob)/[^/]*`), '')\n\n if (!pathWithinRepo) {\n return null\n }\n const absPath = path.join(gitRootPath, pathWithinRepo)\n\n return path.relative(dir, absPath)\n}\n\nexport async function getUnconnectedComponentsAndConnectedComponentMappings(\n cmd: BaseCommand,\n figmaFileUrl: string,\n componentsFromFile: FigmaRestApi.Component[],\n projectInfo: ProjectInfo<CodeConnectConfig> | ReactProjectInfo,\n) {\n const dir = getDir(cmd)\n const fileKey = parseFileKey(figmaFileUrl)\n\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo, true)\n\n const connectedNodeIdsInFileToCodeConnectObjectMap = codeConnectObjects.reduce(\n (map, codeConnectJson) => {\n const parsedNode = parseFigmaNode(cmd.verbose, codeConnectJson, true)\n\n if (parsedNode && parsedNode.fileKey === fileKey) {\n map[parsedNode.nodeId] = codeConnectJson\n }\n\n return map\n },\n {} as Record<string, CodeConnectJSON>,\n )\n\n const unconnectedComponents: FigmaRestApi.Component[] = []\n const connectedComponentsMappings: ConnectedComponentMappings = []\n\n const gitRootPath = getGitRepoAbsolutePath(dir)\n\n componentsFromFile.map((c) => {\n if (c.id in connectedNodeIdsInFileToCodeConnectObjectMap) {\n const cc = connectedNodeIdsInFileToCodeConnectObjectMap[c.id]\n const relativePath = convertRemoteFileUrlToRelativePath({\n remoteFileUrl: cc.source!,\n gitRootPath,\n dir,\n })\n connectedComponentsMappings.push({\n componentName: c.name,\n filepathExport: relativePath ?? '(Unknown file)',\n })\n } else {\n unconnectedComponents.push(c)\n }\n })\n\n return {\n unconnectedComponents,\n connectedComponentsMappings,\n }\n}\n\nasync function askForTopLevelDirectoryOrDetermineFromConfig({\n dir,\n hasConfigFile,\n config,\n cmd,\n}: {\n dir: string\n hasConfigFile: boolean\n config: CodeConnectConfig\n cmd: BaseCommand\n}) {\n let componentDirectory: string | null = null\n\n while (true) {\n if (!hasConfigFile) {\n const { componentDirectory: componentDirectoryAnswer } = await askQuestionOrExit({\n type: 'text',\n message: `Which top-level directory contains the code to be connected to your Figma design system? (Press ${chalk.green(\n 'enter',\n )} to use current directory)`,\n name: 'componentDirectory',\n format: (val) => val || process.cwd(), // should this be || dir?\n validate: (value) => {\n if (!value) {\n return true\n }\n const isValidDir = fs.existsSync(value) && fs.lstatSync(value).isDirectory()\n\n if (!isValidDir) return 'Please enter a valid directory path.'\n return true\n },\n })\n componentDirectory = componentDirectoryAnswer\n }\n\n const configToUse: CodeConnectConfig = componentDirectory\n ? {\n ...config,\n include: getIncludesGlob({\n dir,\n componentDirectory,\n config,\n }),\n }\n : config\n\n const spinner = ora({\n text: 'Parsing local files...',\n color: 'green',\n spinner: {\n // Don't show spinner as ts.createProgram blocks thread\n frames: [''],\n },\n }).start()\n\n let projectInfo = await getProjectInfoFromConfig(dir, configToUse)\n if (projectInfo.config.parser === 'react') {\n projectInfo = getReactProjectInfo(projectInfo as ReactProjectInfo)\n }\n\n const filepathExports = getFilepathExportsFromFiles(projectInfo, cmd)\n spinner.stop()\n\n if (!filepathExports.length) {\n if (hasConfigFile) {\n logger.error(\n 'No files found. Please update the include/exclude globs in your config file and try again.',\n )\n exitWithFeedbackMessage(1)\n } else {\n logger.error(\n 'No files for your project type could be found in that directory. Please enter a different directory.',\n )\n }\n } else {\n return {\n projectInfo,\n componentDirectory,\n filepathExports,\n }\n }\n }\n}\n\nexport async function runWizard(cmd: BaseCommand) {\n logger.info(\n boxen(\n `${chalk.bold(`Welcome to ${chalk.green('Code Connect')}`)}\\n\\n` +\n `Follow a few simple steps to connect your Figma design system to your codebase.\\n` +\n `When you're done, you'll be able to see your component code while inspecting in\\n` +\n `Figma's Dev Mode.\\n\\n` +\n `Learn more at ${chalk.cyan('https://www.figma.com/developers/code-connect')}.\\n\\n` +\n `Please raise bugs or feedback at ${chalk.cyan(\n 'https://github.com/figma/code-connect/issues',\n )}.\\n\\n` +\n `${chalk.red.bold(\n 'Note: ',\n )}This process will create and modify Code Connect files. Make sure you've\\n` +\n `committed necessary changes in your codebase first.`,\n {\n padding: 1,\n margin: 1,\n textAlignment: 'center',\n },\n ),\n )\n\n const dir = getDir(cmd)\n const { hasConfigFile, config } = await parseOrDetermineConfig(dir, cmd.config)\n const { hasEnvFile, envHasFigmaToken } = await checkForEnvAndToken(dir)\n\n // This isn't ideal as you see the intro text followed by an error, but we'll\n // add support for this soon so I think it's OK\n if (config.parser === 'html') {\n exitWithError(\n 'HTML projects are currently not supported by Code Connect interactive setup. Please use the \"npx figma connect create\" command instead.',\n )\n }\n\n let accessToken = getAccessToken(cmd)\n\n if (!accessToken) {\n const { accessTokenEntered } = await askQuestionOrExit({\n type: 'text',\n message: `No access token detected. Visit https://help.figma.com/hc/en-us/articles/8085703771159-Manage-personal-access-tokens\n for instructions on how to do this, ensuring you have both the File Content and Code Connect Write scopes \\n\\n Please enter your access token:`,\n name: 'accessTokenEntered',\n validate: (value) => !!value || 'Please enter an access token.',\n })\n accessToken = accessTokenEntered\n }\n\n logger.info('')\n\n if (!hasEnvFile) {\n // If there is no .env file, we should ask the user if they want to create one\n // to store the Figma token.\n\n const { createConfigFile } = await askQuestionOrExit({\n type: 'select',\n name: 'createConfigFile',\n message:\n \"It looks like you don't have a .env file. Would you like to generate one now to store the Figma access token?\",\n choices: [\n {\n title: 'Yes',\n value: 'yes',\n },\n {\n title: 'No',\n value: 'no',\n },\n ],\n })\n\n if (createConfigFile === 'yes') {\n await createEnvFile({ dir, accessToken })\n }\n } else if (!envHasFigmaToken) {\n // If there is a .env file but no Figma token, we should ask the user if they want to add it.\n const { addFigmaToken } = await askQuestionOrExit({\n type: 'select',\n name: 'addFigmaToken',\n message: 'Would you like to add your Figma access token to your .env file?',\n choices: [\n {\n title: 'Yes',\n value: 'yes',\n },\n {\n title: 'No',\n value: 'no',\n },\n ],\n })\n\n if (addFigmaToken === 'yes') {\n addTokenToEnvFile({ dir, accessToken })\n }\n }\n\n const { componentDirectory, projectInfo, filepathExports } =\n await askForTopLevelDirectoryOrDetermineFromConfig({\n dir,\n hasConfigFile,\n config,\n cmd,\n })\n\n let figmaFileUrl: any\n if (config.interactiveSetupFigmaFileUrl) {\n logger.info(`Using Figma file URL from config: ${config.interactiveSetupFigmaFileUrl}\\n`)\n figmaFileUrl = config.interactiveSetupFigmaFileUrl\n } else {\n let { figmaFileUrl: answer } = await askQuestionOrExit({\n type: 'text',\n message:\n \"What is the URL of the Figma file containing design components you'd like to connect?\",\n name: 'figmaFileUrl',\n validate: (value: string) => isValidFigmaUrl(value) || 'Please enter a valid Figma file URL.',\n })\n\n figmaFileUrl = answer\n }\n\n let componentsFromFile = await fetchTopLevelComponentsFromFile({\n accessToken,\n figmaUrl: figmaFileUrl,\n cmd,\n projectInfo,\n })\n\n if (!componentsFromFile || componentsFromFile.length === 0) {\n logger.info('No components found in the provided Figma file.')\n exitWithFeedbackMessage(1)\n }\n\n if (!hasConfigFile) {\n const { createConfigFile } = await askQuestionOrExit({\n type: 'select',\n name: 'createConfigFile',\n message:\n \"It looks like you don't have a Code Connect config file (figma.config.json). Would you like to generate one now from your provided answers?\",\n choices: [\n {\n title: 'Yes',\n value: 'yes',\n },\n {\n title: 'No',\n value: 'no',\n },\n ],\n })\n if (createConfigFile === 'yes') {\n await createCodeConnectConfig({ dir, componentDirectory, config, figmaUrl: figmaFileUrl })\n }\n }\n\n let useAi = false\n\n if (projectInfo.config.parser === 'react') {\n const { useAi: useAiSelection } = await askQuestionOrExit({\n type: 'select',\n name: 'useAi',\n message:\n 'Code Connect offers AI support to map properties between the Figma file and components in your codebase. Data is used only for mapping and is not stored or used for AI training. To learn more, visit https://help.figma.com/hc/en-us/articles/23920389749655-Code-Connect',\n choices: [\n {\n title: 'Do not use AI for prop mapping (default)',\n value: 'no',\n },\n {\n title: 'Use AI for prop mapping',\n value: 'yes',\n },\n ],\n })\n\n useAi = useAiSelection === 'yes'\n }\n\n const pagesFromFile: Record<string, string> = componentsFromFile.reduce(\n (acc, c) => {\n acc[c.pageId] = c.pageName\n return acc\n },\n {} as Record<string, string>,\n )\n const pagesFromFileCount = Object.keys(pagesFromFile).length\n\n if (componentsFromFile.length > MAX_COMPONENTS_TO_MAP && pagesFromFileCount > 1) {\n logger.info(\n `${componentsFromFile.length} Figma components found in the Figma file across ${pagesFromFileCount} pages.`,\n )\n componentsFromFile = await narrowDownComponentsPerPage(componentsFromFile, pagesFromFile)\n }\n\n const linkedNodeIdsToFilepathExports = {}\n\n const { unconnectedComponents, connectedComponentsMappings } =\n await getUnconnectedComponentsAndConnectedComponentMappings(\n cmd,\n figmaFileUrl,\n componentsFromFile,\n projectInfo,\n )\n\n autoLinkComponents({\n unconnectedComponents,\n linkedNodeIdsToFilepathExports,\n filepathExports,\n })\n\n logger.info(\n boxen(\n `${chalk.bold(`Connecting your Figma components`)}\\n\\n` +\n `${chalk.green(\n `${chalk.bold(Object.keys(linkedNodeIdsToFilepathExports).length)} ${\n Object.keys(linkedNodeIdsToFilepathExports).length === 1\n ? 'component was automatically matched based on its name'\n : 'components were automatically matched based on their names'\n }`,\n )}\\n` +\n `${chalk.yellow(\n `${chalk.bold(unconnectedComponents.length)} ${\n unconnectedComponents.length === 1\n ? 'component has not been matched'\n : 'components have not been matched'\n }`,\n )}\\n\\n` +\n `Match up Figma components with their code definitions. When you're finished, you\\n` +\n `can specify the directory you want to create Code Connect files in.`,\n {\n padding: 1,\n margin: 1,\n textAlignment: 'center',\n },\n ),\n )\n\n const outDir = await runManualLinkingWithConfirmation({\n unconnectedComponents,\n connectedComponentsMappings,\n linkedNodeIdsToFilepathExports,\n filepathExports,\n cmd,\n })\n\n const unconnectedComponentsMap = unconnectedComponents.reduce(\n (map, component) => {\n map[component.id] = component\n return map\n },\n {} as Record<string, FigmaRestApi.Component>,\n )\n\n const success = await createCodeConnectFiles({\n linkedNodeIdsToFilepathExports,\n unconnectedComponentsMap,\n figmaFileUrl,\n outDir,\n projectInfo,\n cmd,\n accessToken,\n useAi,\n })\n\n if (success) {\n logger.info(`\\nUse the 'publish' command to make mappings visible in Figma Dev Mode.`)\n }\n}\n"]}
1
+ {"version":3,"file":"run_wizard.js","sourceRoot":"","sources":["../../../src/connect/wizard/run_wizard.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseCommand, getAccessToken, getCodeConnectObjects, getDir } from '../../commands/connect'\nimport prompts from 'prompts'\nimport fs from 'fs'\nimport { exitWithFeedbackMessage, findComponentsInDocument, parseFileKey } from '../helpers'\nimport { FigmaRestApi, getApiUrl } from '../figma_rest_api'\nimport { exitWithError, logger, success } from '../../common/logging'\nimport {\n ReactProjectInfo,\n getReactProjectInfo,\n getGitRepoAbsolutePath,\n parseOrDetermineConfig,\n getProjectInfoFromConfig,\n CodeConnectConfig,\n ProjectInfo,\n CodeConnectExecutableParserConfig,\n checkForEnvAndToken,\n} from '../../connect/project'\nimport { parseFigmaNode } from '../validation'\nimport chalk from 'chalk'\nimport path from 'path'\nimport {\n CreateRequestPayload,\n CreateRequestPayloadMulti,\n CreateResponsePayload,\n FigmaConnection,\n PropMapping,\n} from '../parser_executable_types'\nimport { normalizeComponentName } from '../create'\nimport { createReactCodeConnect } from '../../react/create'\nimport { CodeConnectJSON } from '../../connect/figma_connect'\nimport boxen from 'boxen'\nimport {\n createCodeConnectConfig,\n getComponentOptionsMap,\n getFilepathExportsFromFiles,\n parseFilepathExport,\n getIncludesGlob,\n isValidFigmaUrl,\n createEnvFile,\n addTokenToEnvFile,\n} from './helpers'\nimport stripAnsi from 'strip-ansi'\nimport { callParser, handleMessages } from '../parser_executables'\nimport ora from 'ora'\nimport { z } from 'zod'\nimport { fromError } from 'zod-validation-error'\nimport { autoLinkComponents } from './autolinking'\nimport { extractDataAndGenerateAllPropsMappings } from './prop_mapping_helpers'\nimport { isFetchError, request } from '../../common/fetch'\nimport { ComponentTypeSignature } from '../../react/parser'\n\ntype ConnectedComponentMappings = { componentName: string; filepathExport: string }[]\n\nconst NONE = '(None)'\nconst MAX_COMPONENTS_TO_MAP = 40\n\nfunction clearQuestion(prompt: prompts.PromptObject<string>, answer: string) {\n const displayedAnswer =\n (Array.isArray(prompt.choices) && prompt.choices.find((c) => c.value === answer)?.title) ||\n answer\n const lengthOfDisplayedQuestion =\n stripAnsi(prompt.message as string).length + stripAnsi(displayedAnswer).length + 5 // 2 chars before, 3 chars between Q + A\n const rowsToRemove = Math.ceil(lengthOfDisplayedQuestion / process.stdout.columns)\n\n process.stdout.moveCursor(0, -rowsToRemove)\n process.stdout.clearScreenDown()\n}\n\ntype CliDataResponse = {\n document: FigmaRestApi.Node\n componentSets: string[]\n components: Record<string, { componentSetId: string }>\n}\n\nasync function fetchTopLevelComponentsFromFile({\n accessToken,\n figmaUrl,\n cmd,\n projectInfo,\n}: {\n accessToken: string\n figmaUrl: string\n cmd: BaseCommand\n projectInfo?: ProjectInfo\n}) {\n // TODO enter create flow if node-id specified\n const fileKey = parseFileKey(figmaUrl)\n\n const apiUrl =\n getApiUrl(figmaUrl ?? '', cmd.apiUrl || projectInfo?.config.apiUrl) +\n `/code_connect/${fileKey}/cli_data`\n\n try {\n const spinner = ora({\n text: `Fetching component information from ${cmd.verbose ? `${apiUrl}\\n` : 'Figma...'}`,\n color: 'green',\n }).start()\n\n const response = await (\n process.env.CODE_CONNECT_MOCK_DOC_RESPONSE\n ? Promise.resolve({\n response: { status: 200 },\n data: JSON.parse(\n fs.readFileSync(process.env.CODE_CONNECT_MOCK_DOC_RESPONSE, 'utf-8'),\n ) as CliDataResponse,\n })\n : request.get<CliDataResponse>(apiUrl, {\n headers: {\n 'X-Figma-Token': accessToken,\n 'Content-Type': 'application/json',\n },\n })\n ).finally(() => {\n if (cmd.verbose) {\n spinner.stopAndPersist()\n } else {\n spinner.stop()\n }\n })\n\n if (response.response.status === 200) {\n return findComponentsInDocument(response.data.document).filter(\n ({ id }) =>\n id in response.data.componentSets || !response.data.components[id].componentSetId,\n )\n } else {\n logger.error(`Failed to fetch components from Figma with status: ${response.response.status}`)\n logger.debug('Failed to fetch components from Figma with Body:', response.data)\n }\n } catch (err) {\n if (isFetchError(err)) {\n if (err.response) {\n logger.error(\n `Failed to fetch components from Figma (${err.response.status}): ${err.response.status} ${\n err.data?.err ?? err.data?.message\n }`,\n )\n } else {\n logger.error(`Failed to fetch components from Figma: ${err.message}`)\n }\n logger.debug(JSON.stringify(err.data))\n } else {\n logger.error(err)\n }\n exitWithFeedbackMessage(1)\n }\n}\n\n/**\n * enable selection of a subset of components per page\n * @param components to narrow down from\n * @returns components narrowed down to the selected pages\n */\nexport async function narrowDownComponentsPerPage(\n components: FigmaRestApi.Component[],\n pages: Record<string, string>,\n) {\n const createTitle = (name: string, id: string, pad: number) => {\n const componentsInPage = components.filter((c) => c.pageId === id)\n let namesPreview = componentsInPage\n .slice(0, 4)\n .map((c) => c.name)\n .join(', ')\n\n namesPreview = componentsInPage.length > 4 ? `${namesPreview}, ...` : `${namesPreview}`\n const componentWord = componentsInPage.length === 1 ? 'Component' : 'Components'\n\n return `${name.padEnd(pad, ' ')} - ${componentsInPage.length} ${componentWord} ${chalk.dim(\n `(${namesPreview})`,\n )}`\n }\n\n const longestPageName = Math.max(...Object.values(pages).map((name) => name.length))\n\n let pagesToMap: string[] = []\n console.info('')\n while (true) {\n const { pagesToMap_temp } = await askQuestion({\n type: 'multiselect',\n name: 'pagesToMap_temp',\n message: `Select the pages with the Figma components you'd like to map (Press ${chalk.green('space')} to select and ${chalk.green('enter')} to continue)`,\n instructions: false,\n choices: Object.entries(pages).map(([id, name]) => ({\n title: createTitle(name, id, longestPageName),\n value: id,\n })),\n })\n\n if (!pagesToMap_temp || pagesToMap_temp.length === 0) {\n logger.warn('Select at least one page to continue.')\n continue\n }\n pagesToMap = pagesToMap_temp\n break\n }\n\n return components.filter((c) => pagesToMap.includes(c.pageId))\n}\n\n/**\n * Asks a Prompts question and adds spacing\n * @param question Prompts question\n * @returns Prompts answer\n */\nasync function askQuestion<T extends string = string>(\n question: prompts.PromptObject<T>,\n): Promise<prompts.Answers<T>> {\n const answers = await prompts(question)\n logger.info('')\n return answers\n}\n\n/**\n * Asks a Prompts question and exits the process if user cancels\n * @param question Prompts question\n * @returns Prompts answer\n */\nasync function askQuestionOrExit<T extends string = string>(\n question: prompts.PromptObject<T>,\n): Promise<prompts.Answers<T>> {\n const answers = await askQuestion(question)\n if (!Object.keys(answers).length) {\n return process.exit(0)\n }\n return answers\n}\n\n/**\n * Asks a Prompts question and shows an exit confirmation if user cancels.\n * This should be used for questions further along in the wizard.\n * @param question Prompts question\n * @returns Prompts answer\n */\nasync function askQuestionWithExitConfirmation<T extends string = string>(\n question: prompts.PromptObject<T>,\n): Promise<prompts.Answers<T>> {\n while (true) {\n const answers = await askQuestion(question)\n\n if (Object.keys(answers).length) {\n return answers\n }\n\n const { shouldExit } = await askQuestion({\n type: 'select',\n name: 'shouldExit',\n message: 'Are you sure you want to exit?',\n choices: [\n {\n title: 'Yes',\n value: 'yes',\n },\n {\n title: 'No',\n value: 'no',\n },\n ],\n })\n // also exit if no answer provided (esc / ctrl+c)\n if (!shouldExit || shouldExit === 'yes') {\n process.exit(0)\n }\n }\n}\n\nfunction formatComponentTitle(componentName: string, filepathExport: string | null, pad: number) {\n const fileExport = filepathExport ? parseFilepathExport(filepathExport) : null\n const nameLabel = `${chalk.dim('Figma component:')} ${componentName.padEnd(pad, ' ')}`\n\n const filepathLabel = fileExport ? fileExport.filepath : '-'\n const exportNote = fileExport?.exportName ? ` (${fileExport.exportName})` : ''\n\n const linkedLabel = `↔️ ${chalk.dim('Code Definition:')} ${filepathLabel}${exportNote}`\n return `${nameLabel} ${linkedLabel}`\n}\n\nexport function getComponentChoicesForPrompt(\n components: FigmaRestApi.Component[],\n linkedNodeIdsToFilepathExports: Record<string, string>,\n connectedComponentsMappings: ConnectedComponentMappings,\n dir: string,\n): prompts.Choice[] {\n const longestNameLength = [...components, ...connectedComponentsMappings].reduce(\n (longest, component) =>\n Math.max(\n longest,\n 'name' in component ? component.name.length : component.componentName.length,\n ),\n 0,\n )\n\n const nameCompare = (a: FigmaRestApi.Component, b: FigmaRestApi.Component) =>\n a.name.localeCompare(b.name)\n\n const linkedComponents = components\n .filter((c) => !!linkedNodeIdsToFilepathExports[c.id])\n .sort(nameCompare)\n const unlinkedComponents = components\n .filter((c) => !linkedNodeIdsToFilepathExports[c.id])\n .sort(nameCompare)\n\n const formatComponentChoice = (c: FigmaRestApi.Component) => {\n const filepathExport = linkedNodeIdsToFilepathExports[c.id]\n ? path.relative(dir, linkedNodeIdsToFilepathExports[c.id])\n : null\n return {\n title: formatComponentTitle(c.name, filepathExport, longestNameLength),\n value: c.id,\n description: `${chalk.green('Edit Match')}`,\n }\n }\n\n return [\n ...linkedComponents.map(formatComponentChoice),\n ...unlinkedComponents.map(formatComponentChoice),\n ...connectedComponentsMappings.map((connectedComponent) => ({\n title: formatComponentTitle(\n connectedComponent.componentName,\n connectedComponent.filepathExport,\n longestNameLength,\n ),\n disabled: true,\n })),\n ]\n}\n\nfunction getUnconnectedComponentChoices(componentPaths: string[], dir: string) {\n return [\n {\n title: NONE,\n value: NONE,\n },\n ...componentPaths.map((absPath) => {\n return {\n title: path.relative(dir, absPath),\n value: absPath,\n }\n }),\n ]\n}\n\ntype ManualLinkingArgs = {\n unconnectedComponents: FigmaRestApi.Component[]\n connectedComponentsMappings: ConnectedComponentMappings\n linkedNodeIdsToFilepathExports: Record<string, string>\n filepathExports: string[]\n cmd: BaseCommand\n}\n\nconst escapeHandler = () => {\n let escPressed = false\n const keypressListener = (_: any, key: { name: string }) => {\n if (key.name === 'escape') {\n escPressed = true\n }\n }\n process.stdin.on('keypress', keypressListener)\n return {\n escPressed: () => escPressed,\n reset: () => {\n escPressed = false\n },\n destroy: () => {\n process.stdin.removeListener('keypress', keypressListener)\n },\n }\n}\n\nasync function runManualLinking({\n unconnectedComponents,\n linkedNodeIdsToFilepathExports,\n filepathExports,\n connectedComponentsMappings,\n cmd,\n}: ManualLinkingArgs) {\n const filesToComponentOptionsMap = getComponentOptionsMap(filepathExports)\n const dir = getDir(cmd)\n const escHandler = escapeHandler()\n while (true) {\n // Don't show exit confirmation as we're relying on esc behavior\n const { nodeId } = await prompts(\n {\n type: 'select',\n name: 'nodeId',\n message: `Select a Figma component match you'd like to edit (Press ${chalk.green(\n 'esc',\n )} when you're ready to continue on)`,\n choices: getComponentChoicesForPrompt(\n unconnectedComponents,\n linkedNodeIdsToFilepathExports,\n connectedComponentsMappings,\n dir,\n ),\n warn: 'This component already has a local Code Connect file.',\n hint: ' ',\n },\n {\n onSubmit: clearQuestion,\n },\n )\n if (!nodeId) {\n break\n }\n const pathChoices = getUnconnectedComponentChoices(Object.keys(filesToComponentOptionsMap), dir)\n const prevSelectedKey = linkedNodeIdsToFilepathExports[nodeId]\n\n const { filepath: prevSelectedFilepath, exportName: prevSelectedComponent } = prevSelectedKey\n ? parseFilepathExport(prevSelectedKey)\n : {\n filepath: null,\n exportName: null,\n }\n\n escHandler.reset()\n const { pathToComponent } = await prompts(\n {\n type: 'autocomplete',\n name: 'pathToComponent',\n message: 'Choose a path to your code component (type to filter results)',\n choices: pathChoices,\n // default suggest uses .startsWith(input) which isn't very useful for full paths\n suggest: (input, choices) =>\n Promise.resolve(\n choices.filter((i) => i.value.toUpperCase().includes(input.toUpperCase())),\n ),\n // preselect if editing an existing choice\n initial: prevSelectedFilepath\n ? pathChoices.findIndex(({ value }) => value === prevSelectedFilepath)\n : 0,\n },\n {\n onSubmit: clearQuestion,\n },\n )\n if (escHandler.escPressed()) {\n continue\n }\n if (pathToComponent) {\n if (pathToComponent === NONE) {\n delete linkedNodeIdsToFilepathExports[nodeId]\n } else {\n const fileExports = filesToComponentOptionsMap[pathToComponent]\n if (fileExports.length === 0) {\n // Not TS, default to filepath\n linkedNodeIdsToFilepathExports[nodeId] = pathToComponent\n } else {\n escHandler.reset()\n const { filepathExport } = await prompts(\n {\n type: 'autocomplete',\n name: 'filepathExport',\n message: `Choose an export of ${path.parse(pathToComponent).base} (type to filter results)`,\n choices: fileExports,\n // default suggest uses .startsWith(input)\n suggest: (input, choices) =>\n Promise.resolve(\n choices.filter((i) => i.value.toUpperCase().includes(input.toUpperCase())),\n ),\n // preselect if editing an existing choice\n initial:\n prevSelectedComponent && prevSelectedFilepath === pathToComponent\n ? fileExports.findIndex(({ title }) => title === prevSelectedComponent)\n : 0,\n },\n {\n onSubmit: clearQuestion,\n },\n )\n if (escHandler.escPressed()) {\n continue\n }\n linkedNodeIdsToFilepathExports[nodeId] = filepathExport\n }\n }\n }\n }\n escHandler.destroy()\n}\n\nasync function runManualLinkingWithConfirmation(manualLinkingArgs: ManualLinkingArgs) {\n let outDir = manualLinkingArgs.cmd.outDir || null\n\n while (true) {\n await runManualLinking(manualLinkingArgs)\n\n if (!outDir) {\n console.info(\n '\\nA Code Connect file is created for each Figma component to code definition match.',\n )\n const { outputDirectory } = await askQuestionWithExitConfirmation({\n type: 'text',\n name: 'outputDirectory',\n message: `In which directory would you like to store Code Connect files? (Press ${chalk.green('enter')} to co-locate your files alongside your component files)`,\n })\n outDir = outputDirectory\n }\n\n const linkedNodes = Object.keys(manualLinkingArgs.linkedNodeIdsToFilepathExports)\n if (!linkedNodes.length) {\n const { confirmation } = await askQuestionOrExit({\n type: 'select',\n name: 'confirmation',\n message: `No Code Connect files linked. Are you sure you want to exit?`,\n choices: [\n {\n title: 'Back to edit',\n value: 'backToEdit',\n },\n {\n title: 'Exit',\n value: 'exit',\n },\n ],\n })\n if (confirmation === 'exit') {\n process.exit(0)\n }\n } else {\n const { confirmation } = await askQuestionWithExitConfirmation({\n type: 'select',\n name: 'confirmation',\n message: `You're ready to create ${chalk.green(linkedNodes.length)} Code Connect file${\n linkedNodes.length == 1 ? '' : 's'\n }. Continue?`,\n choices: [\n {\n title: 'Create files',\n value: 'create',\n },\n {\n title: 'Back to editing',\n value: 'backToEdit',\n },\n ],\n })\n if (confirmation === 'backToEdit') {\n outDir = manualLinkingArgs.cmd.outDir || null\n } else {\n return outDir\n }\n }\n }\n}\n\ninterface AddPayloadArgs {\n payloadType: 'MULTI_EXPORT' | 'SINGLE_EXPORT'\n filepath: string\n sourceExport: string\n reactTypeSignature?: ComponentTypeSignature\n propMapping?: PropMapping\n figmaNodeUrl: string\n moreComponentProps: FigmaRestApi.Component\n destinationDir: string\n sourceFilepath: string\n normalizedName: string\n config: CodeConnectConfig\n}\n\nexport async function addPayload(\n payloads: Record<string, CreateRequestPayloadMulti | CreateRequestPayload>,\n args: AddPayloadArgs,\n) {\n const {\n payloadType,\n filepath,\n sourceExport,\n reactTypeSignature,\n propMapping,\n figmaNodeUrl,\n moreComponentProps,\n destinationDir,\n sourceFilepath,\n normalizedName,\n config,\n } = args\n\n if (payloadType === 'MULTI_EXPORT') {\n const figmaConnection: FigmaConnection = {\n sourceExport,\n reactTypeSignature,\n propMapping,\n component: {\n figmaNodeUrl,\n ...moreComponentProps,\n },\n }\n\n if (payloads[filepath]) {\n ;(payloads[filepath] as CreateRequestPayloadMulti).figmaConnections.push(figmaConnection)\n } else {\n const payload: CreateRequestPayloadMulti = {\n mode: 'CREATE',\n destinationDir,\n sourceFilepath,\n normalizedName,\n figmaConnections: [figmaConnection],\n config,\n }\n payloads[filepath] = payload\n }\n }\n\n if (payloadType === 'SINGLE_EXPORT') {\n const payload: CreateRequestPayload = {\n mode: 'CREATE',\n destinationDir,\n sourceFilepath,\n component: {\n figmaNodeUrl,\n normalizedName,\n ...moreComponentProps,\n },\n config,\n }\n payloads[filepath] = payload\n }\n}\n\nexport async function createCodeConnectFiles({\n linkedNodeIdsToFilepathExports,\n figmaFileUrl,\n unconnectedComponentsMap,\n outDir: outDirArg,\n projectInfo,\n cmd,\n accessToken,\n useAi,\n}: {\n figmaFileUrl: string\n linkedNodeIdsToFilepathExports: Record<string, string>\n unconnectedComponentsMap: Record<string, FigmaRestApi.Component>\n outDir: string | null\n projectInfo: ProjectInfo\n cmd: BaseCommand\n accessToken: string\n useAi: boolean\n}) {\n const filepathExportsToComponents = Object.entries(linkedNodeIdsToFilepathExports).reduce(\n (map, [nodeId, filepathExport]) => {\n map[filepathExport] = unconnectedComponentsMap[nodeId]\n return map\n },\n {} as Record<string, FigmaRestApi.Component>,\n )\n\n let embeddingsFetchSpinner: ora.Ora | null = null\n\n if (useAi) {\n embeddingsFetchSpinner = ora({\n text: 'Computing embeddings...',\n color: 'green',\n }).start()\n }\n\n const propMappingsAndData =\n projectInfo.config.parser === 'react'\n ? await extractDataAndGenerateAllPropsMappings({\n filepathExportsToComponents,\n projectInfo,\n cmd,\n figmaUrl: figmaFileUrl,\n accessToken,\n useAi,\n })\n : null\n\n if (embeddingsFetchSpinner) {\n embeddingsFetchSpinner.stop()\n }\n\n let allFilesCreated = true\n\n const payloads: Record<string, CreateRequestPayloadMulti | CreateRequestPayload> = {}\n\n for (const [nodeId, filepathExport] of Object.entries(linkedNodeIdsToFilepathExports)) {\n const urlObj = new URL(figmaFileUrl)\n urlObj.search = ''\n urlObj.searchParams.append('node-id', nodeId)\n const { filepath, exportName } = parseFilepathExport(filepathExport)\n\n const { name } = path.parse(filepath)\n\n const outDir = outDirArg || path.dirname(filepath)\n\n const payloadType =\n projectInfo.config.parser === 'react' || projectInfo.config.parser === 'html'\n ? 'MULTI_EXPORT'\n : 'SINGLE_EXPORT'\n\n addPayload(payloads, {\n payloadType,\n filepath,\n sourceExport: exportName || '?',\n reactTypeSignature: propMappingsAndData?.propMappingData[filepathExport]?.signature,\n propMapping: propMappingsAndData?.propMappings[filepathExport],\n figmaNodeUrl: urlObj.toString(),\n moreComponentProps: unconnectedComponentsMap[nodeId],\n destinationDir: outDir,\n sourceFilepath: filepath,\n normalizedName: normalizeComponentName(name),\n config: projectInfo.config,\n })\n }\n\n for (const payloadKey of Object.keys(payloads)) {\n const payload = payloads[payloadKey]\n let result: z.infer<typeof CreateResponsePayload>\n if (projectInfo.config.parser === 'react') {\n result = await createReactCodeConnect(payload as CreateRequestPayloadMulti)\n } else {\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 as CreateRequestPayload,\n projectInfo.absPath,\n )\n\n result = CreateResponsePayload.parse(stdout)\n } catch (e) {\n throw fromError(e)\n }\n }\n\n const { hasErrors } = handleMessages(result.messages)\n\n if (!hasErrors) {\n result.createdFiles.forEach((file) => {\n logger.info(success(`Created ${file.filePath}`))\n })\n } else {\n allFilesCreated = false\n }\n }\n return allFilesCreated\n}\n\nexport function convertRemoteFileUrlToRelativePath({\n remoteFileUrl,\n gitRootPath,\n dir,\n}: {\n remoteFileUrl: string\n gitRootPath: string\n dir: string\n}) {\n if (!gitRootPath) {\n return null\n }\n const pathWithinRepo = remoteFileUrl.replace(new RegExp(`.*?(tree|blob)/[^/]*`), '')\n\n if (!pathWithinRepo) {\n return null\n }\n const absPath = path.join(gitRootPath, pathWithinRepo)\n\n return path.relative(dir, absPath)\n}\n\nexport async function getUnconnectedComponentsAndConnectedComponentMappings(\n cmd: BaseCommand,\n figmaFileUrl: string,\n componentsFromFile: FigmaRestApi.Component[],\n projectInfo: ProjectInfo<CodeConnectConfig> | ReactProjectInfo,\n) {\n const dir = getDir(cmd)\n const fileKey = parseFileKey(figmaFileUrl)\n\n const codeConnectObjects = await getCodeConnectObjects(cmd, projectInfo, {\n silent: true,\n parserMode: 'exempt',\n })\n\n const connectedNodeIdsInFileToCodeConnectObjectMap = codeConnectObjects.reduce(\n (map, codeConnectJson) => {\n const parsedNode = parseFigmaNode(cmd.verbose, codeConnectJson, true)\n\n if (parsedNode && parsedNode.fileKey === fileKey) {\n map[parsedNode.nodeId] = codeConnectJson\n }\n\n return map\n },\n {} as Record<string, CodeConnectJSON>,\n )\n\n const unconnectedComponents: FigmaRestApi.Component[] = []\n const connectedComponentsMappings: ConnectedComponentMappings = []\n\n const gitRootPath = getGitRepoAbsolutePath(dir)\n\n componentsFromFile.map((c) => {\n if (c.id in connectedNodeIdsInFileToCodeConnectObjectMap) {\n const cc = connectedNodeIdsInFileToCodeConnectObjectMap[c.id]\n const relativePath = convertRemoteFileUrlToRelativePath({\n remoteFileUrl: cc.source!,\n gitRootPath,\n dir,\n })\n connectedComponentsMappings.push({\n componentName: c.name,\n filepathExport: relativePath ?? '(Unknown file)',\n })\n } else {\n unconnectedComponents.push(c)\n }\n })\n\n return {\n unconnectedComponents,\n connectedComponentsMappings,\n }\n}\n\nasync function askForTopLevelDirectoryOrDetermineFromConfig({\n dir,\n hasConfigFile,\n config,\n cmd,\n}: {\n dir: string\n hasConfigFile: boolean\n config: CodeConnectConfig\n cmd: BaseCommand\n}) {\n let componentDirectory: string | null = null\n\n while (true) {\n if (!hasConfigFile) {\n const { componentDirectory: componentDirectoryAnswer } = await askQuestionOrExit({\n type: 'text',\n message: `Which top-level directory contains the code to be connected to your Figma design system? (Press ${chalk.green(\n 'enter',\n )} to use current directory)`,\n name: 'componentDirectory',\n format: (val) => val || process.cwd(), // should this be || dir?\n validate: (value) => {\n if (!value) {\n return true\n }\n const isValidDir = fs.existsSync(value) && fs.lstatSync(value).isDirectory()\n\n if (!isValidDir) return 'Please enter a valid directory path.'\n return true\n },\n })\n componentDirectory = componentDirectoryAnswer\n }\n\n const configToUse: CodeConnectConfig = componentDirectory\n ? {\n ...config,\n include: getIncludesGlob({\n dir,\n componentDirectory,\n config,\n }),\n }\n : config\n\n const spinner = ora({\n text: 'Parsing local files...',\n color: 'green',\n spinner: {\n // Don't show spinner as ts.createProgram blocks thread\n frames: [''],\n },\n }).start()\n\n let projectInfo = await getProjectInfoFromConfig(dir, configToUse)\n if (projectInfo.config.parser === 'react') {\n projectInfo = getReactProjectInfo(projectInfo as ReactProjectInfo)\n }\n\n const filepathExports = getFilepathExportsFromFiles(projectInfo, cmd)\n spinner.stop()\n\n if (!filepathExports.length) {\n if (hasConfigFile) {\n logger.error(\n 'No files found. Please update the include/exclude globs in your config file and try again.',\n )\n exitWithFeedbackMessage(1)\n } else {\n logger.error(\n 'No files for your project type could be found in that directory. Please enter a different directory.',\n )\n }\n } else {\n return {\n projectInfo,\n componentDirectory,\n filepathExports,\n }\n }\n }\n}\n\nexport async function runWizard(cmd: BaseCommand) {\n logger.info(\n boxen(\n `${chalk.bold(`Welcome to ${chalk.green('Code Connect')}`)}\\n\\n` +\n `Follow a few simple steps to connect your Figma design system to your codebase.\\n` +\n `When you're done, you'll be able to see your component code while inspecting in\\n` +\n `Figma's Dev Mode.\\n\\n` +\n `Learn more at ${chalk.cyan('https://www.figma.com/developers/code-connect')}.\\n\\n` +\n `Please raise bugs or feedback at ${chalk.cyan(\n 'https://github.com/figma/code-connect/issues',\n )}.\\n\\n` +\n `${chalk.red.bold(\n 'Note: ',\n )}This process will create and modify Code Connect files. Make sure you've\\n` +\n `committed necessary changes in your codebase first.`,\n {\n padding: 1,\n margin: 1,\n textAlignment: 'center',\n },\n ),\n )\n\n const dir = getDir(cmd)\n const { hasConfigFile, config } = await parseOrDetermineConfig(dir, cmd.config)\n const { hasEnvFile, envHasFigmaToken } = await checkForEnvAndToken(dir)\n\n // This isn't ideal as you see the intro text followed by an error, but we'll\n // add support for this soon so I think it's OK\n if (config.parser === 'html') {\n exitWithError(\n 'HTML projects are currently not supported by Code Connect interactive setup. Please use the \"npx figma connect create\" command instead.',\n )\n }\n\n let accessToken = getAccessToken(cmd)\n\n if (!accessToken) {\n const { accessTokenEntered } = await askQuestionOrExit({\n type: 'text',\n message: `No access token detected. Visit https://help.figma.com/hc/en-us/articles/8085703771159-Manage-personal-access-tokens\n for instructions on how to do this, ensuring you have both the File Content and Code Connect Write scopes \\n\\n Please enter your access token:`,\n name: 'accessTokenEntered',\n validate: (value) => !!value || 'Please enter an access token.',\n })\n accessToken = accessTokenEntered\n }\n\n logger.info('')\n\n if (!hasEnvFile) {\n // If there is no .env file, we should ask the user if they want to create one\n // to store the Figma token.\n\n const { createConfigFile } = await askQuestionOrExit({\n type: 'select',\n name: 'createConfigFile',\n message:\n \"It looks like you don't have a .env file. Would you like to generate one now to store the Figma access token?\",\n choices: [\n {\n title: 'Yes',\n value: 'yes',\n },\n {\n title: 'No',\n value: 'no',\n },\n ],\n })\n\n if (createConfigFile === 'yes') {\n await createEnvFile({ dir, accessToken })\n }\n } else if (!envHasFigmaToken) {\n // If there is a .env file but no Figma token, we should ask the user if they want to add it.\n const { addFigmaToken } = await askQuestionOrExit({\n type: 'select',\n name: 'addFigmaToken',\n message: 'Would you like to add your Figma access token to your .env file?',\n choices: [\n {\n title: 'Yes',\n value: 'yes',\n },\n {\n title: 'No',\n value: 'no',\n },\n ],\n })\n\n if (addFigmaToken === 'yes') {\n addTokenToEnvFile({ dir, accessToken })\n }\n }\n\n const { componentDirectory, projectInfo, filepathExports } =\n await askForTopLevelDirectoryOrDetermineFromConfig({\n dir,\n hasConfigFile,\n config,\n cmd,\n })\n\n let figmaFileUrl: any\n if (config.interactiveSetupFigmaFileUrl) {\n logger.info(`Using Figma file URL from config: ${config.interactiveSetupFigmaFileUrl}\\n`)\n figmaFileUrl = config.interactiveSetupFigmaFileUrl\n } else {\n let { figmaFileUrl: answer } = await askQuestionOrExit({\n type: 'text',\n message:\n \"What is the URL of the Figma file containing design components you'd like to connect?\",\n name: 'figmaFileUrl',\n validate: (value: string) => isValidFigmaUrl(value) || 'Please enter a valid Figma file URL.',\n })\n\n figmaFileUrl = answer\n }\n\n let componentsFromFile = await fetchTopLevelComponentsFromFile({\n accessToken,\n figmaUrl: figmaFileUrl,\n cmd,\n projectInfo,\n })\n\n if (!componentsFromFile || componentsFromFile.length === 0) {\n logger.info('No components found in the provided Figma file.')\n exitWithFeedbackMessage(1)\n }\n\n if (!hasConfigFile) {\n const { createConfigFile } = await askQuestionOrExit({\n type: 'select',\n name: 'createConfigFile',\n message:\n \"It looks like you don't have a Code Connect config file (figma.config.json). Would you like to generate one now from your provided answers?\",\n choices: [\n {\n title: 'Yes',\n value: 'yes',\n },\n {\n title: 'No',\n value: 'no',\n },\n ],\n })\n if (createConfigFile === 'yes') {\n await createCodeConnectConfig({ dir, componentDirectory, config, figmaUrl: figmaFileUrl })\n }\n }\n\n let useAi = false\n\n if (projectInfo.config.parser === 'react') {\n const { useAi: useAiSelection } = await askQuestionOrExit({\n type: 'select',\n name: 'useAi',\n message:\n 'Code Connect offers AI support to map properties between the Figma file and components in your codebase. Data is used only for mapping and is not stored or used for AI training. To learn more, visit https://help.figma.com/hc/en-us/articles/23920389749655-Code-Connect',\n choices: [\n {\n title: 'Do not use AI for prop mapping (default)',\n value: 'no',\n },\n {\n title: 'Use AI for prop mapping',\n value: 'yes',\n },\n ],\n })\n\n useAi = useAiSelection === 'yes'\n }\n\n const pagesFromFile: Record<string, string> = componentsFromFile.reduce(\n (acc, c) => {\n acc[c.pageId] = c.pageName\n return acc\n },\n {} as Record<string, string>,\n )\n const pagesFromFileCount = Object.keys(pagesFromFile).length\n\n if (componentsFromFile.length > MAX_COMPONENTS_TO_MAP && pagesFromFileCount > 1) {\n logger.info(\n `${componentsFromFile.length} Figma components found in the Figma file across ${pagesFromFileCount} pages.`,\n )\n componentsFromFile = await narrowDownComponentsPerPage(componentsFromFile, pagesFromFile)\n }\n\n const linkedNodeIdsToFilepathExports = {}\n\n const { unconnectedComponents, connectedComponentsMappings } =\n await getUnconnectedComponentsAndConnectedComponentMappings(\n cmd,\n figmaFileUrl,\n componentsFromFile,\n projectInfo,\n )\n\n autoLinkComponents({\n unconnectedComponents,\n linkedNodeIdsToFilepathExports,\n filepathExports,\n })\n\n logger.info(\n boxen(\n `${chalk.bold(`Connecting your Figma components`)}\\n\\n` +\n `${chalk.green(\n `${chalk.bold(Object.keys(linkedNodeIdsToFilepathExports).length)} ${\n Object.keys(linkedNodeIdsToFilepathExports).length === 1\n ? 'component was automatically matched based on its name'\n : 'components were automatically matched based on their names'\n }`,\n )}\\n` +\n `${chalk.yellow(\n `${chalk.bold(unconnectedComponents.length)} ${\n unconnectedComponents.length === 1\n ? 'component has not been matched'\n : 'components have not been matched'\n }`,\n )}\\n\\n` +\n `Match up Figma components with their code definitions. When you're finished, you\\n` +\n `can specify the directory you want to create Code Connect files in.`,\n {\n padding: 1,\n margin: 1,\n textAlignment: 'center',\n },\n ),\n )\n\n const outDir = await runManualLinkingWithConfirmation({\n unconnectedComponents,\n connectedComponentsMappings,\n linkedNodeIdsToFilepathExports,\n filepathExports,\n cmd,\n })\n\n const unconnectedComponentsMap = unconnectedComponents.reduce(\n (map, component) => {\n map[component.id] = component\n return map\n },\n {} as Record<string, FigmaRestApi.Component>,\n )\n\n const success = await createCodeConnectFiles({\n linkedNodeIdsToFilepathExports,\n unconnectedComponentsMap,\n figmaFileUrl,\n outDir,\n projectInfo,\n cmd,\n accessToken,\n useAi,\n })\n\n if (success) {\n logger.info(\n `\\nRun \\`figma connect migrate\\` to convert the generated files to templates, then run \\`figma connect publish\\` to make mappings visible in Figma Dev Mode.`,\n )\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/react/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAmB3B,OAAO,EAAsB,YAAY,EAAoB,MAAM,uBAAuB,CAAA;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,EAIL,aAAa,EAQb,YAAY,EACb,MAAM,0BAA0B,CAAA;AAEjC;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,EAAE,CAAC,IAAI,GACZ,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,qBAAqB,GAAG,EAAE,CAAC,WAAW,GAAG,SAAS,CAMvE;AAiED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,0BAanF;AA0ED,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE3D;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,EAAE,CAAC,wBAAwB,GAAG,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,EACjE,aAAa,EAAE,aAAa,EAC5B,MAAM,CAAC,EAAE,OAAO;;;;GA4GjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,mBAAmB,EACtE,aAAa,EAAE,aAAa,EAC5B,YAAY,CAAC,EAAE,YAAY;;;mBAvMd,MAAM;cACX,MAAM;yBACK,MAAM;;;;EA+X1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,mBAAmB,EACtE,aAAa,EAAE,aAAa,EAC5B,YAAY,CAAC,EAAE,YAAY,EAC3B,cAAc,CAAC,EAAE,OAAO;;;mBAjZX,MAAM;cACX,MAAM;yBACK,MAAM;;;EAyb1B;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,mBAAmB,EACtE,aAAa,EAAE,aAAa,EAC5B,YAAY,CAAC,EAAE,YAAY,EAC3B,cAAc,CAAC,EAAE,OAAO;;;mBAqCX,MAAM;cACX,MAAM;yBACK,MAAM;;;EAyB1B;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,UA+B1D;AA+LD,wBAAgB,kBAAkB,CAChC,iBAAiB,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC,UAItE;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,EAAE,CAAC,cAAc,EACvB,aAAa,EAAE,aAAa,EAC5B,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,YAAY,GAChD,OAAO,CAAC,eAAe,CAAC,CA6H1B"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/react/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAmB3B,OAAO,EAAsB,YAAY,EAAoB,MAAM,uBAAuB,CAAA;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,EAIL,aAAa,EAQb,YAAY,EACb,MAAM,0BAA0B,CAAA;AAEjC;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,EAAE,CAAC,IAAI,GACZ,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,qBAAqB,GAAG,EAAE,CAAC,WAAW,GAAG,SAAS,CAMvE;AAyDD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,0BAanF;AA0ED,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE3D;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,EAAE,CAAC,wBAAwB,GAAG,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,EACjE,aAAa,EAAE,aAAa,EAC5B,MAAM,CAAC,EAAE,OAAO;;;;GA4GjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,mBAAmB,EACtE,aAAa,EAAE,aAAa,EAC5B,YAAY,CAAC,EAAE,YAAY;;;mBAvMd,MAAM;cACX,MAAM;yBACK,MAAM;;;;EAoY1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,mBAAmB,EACtE,aAAa,EAAE,aAAa,EAC5B,YAAY,CAAC,EAAE,YAAY,EAC3B,cAAc,CAAC,EAAE,OAAO;;;mBAtZX,MAAM;cACX,MAAM;yBACK,MAAM;;;EA8b1B;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,mBAAmB,EACtE,aAAa,EAAE,aAAa,EAC5B,YAAY,CAAC,EAAE,YAAY,EAC3B,cAAc,CAAC,EAAE,OAAO;;;mBAqCX,MAAM;cACX,MAAM;yBACK,MAAM;;;EAyB1B;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,UA+B1D;AA+LD,wBAAgB,kBAAkB,CAChC,iBAAiB,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC,UAItE;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,EAAE,CAAC,cAAc,EACvB,aAAa,EAAE,aAAa,EAC5B,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,YAAY,GAChD,OAAO,CAAC,eAAe,CAAC,CA6H1B"}
@@ -34,14 +34,6 @@ function findJSXElement(node) {
34
34
  return typescript_1.default.forEachChild(node, findJSXElement);
35
35
  }
36
36
  }
37
- function findBlock(node) {
38
- if (typescript_1.default.isBlock(node)) {
39
- return node;
40
- }
41
- else {
42
- return typescript_1.default.forEachChild(node, findBlock);
43
- }
44
- }
45
37
  /**
46
38
  * Walks up the AST from an assignment to find the import declaration
47
39
  */
@@ -348,7 +340,12 @@ function parseRenderFunctionExpression(exp, parserContext, propMappings) {
348
340
  ]).transformed[0];
349
341
  }
350
342
  const printer = typescript_1.default.createPrinter();
351
- const block = findBlock(exp);
343
+ // Only consider the render function's *own* body block, not any block nested
344
+ // deeper in the tree. Using a tree-walking search here would incorrectly pick
345
+ // up blocks belonging to nested functions (e.g. an event handler passed as a
346
+ // JSX prop like `onValidateFile={file => { ... }}`), causing us to render that
347
+ // handler's body instead of the returned JSX.
348
+ const block = exp.body && typescript_1.default.isBlock(exp.body) ? exp.body : undefined;
352
349
  let nestable = false;
353
350
  let jsx = findJSXElement(exp);
354
351
  if (jsx && (!block || (block && block.statements.length <= 1))) {