@figma/code-connect 1.4.7 → 1.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/connect.d.ts +3 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +140 -40
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect_template.d.ts.map +1 -1
- package/dist/commands/connect_template.js +9 -0
- package/dist/commands/connect_template.js.map +1 -1
- package/dist/common/logging.d.ts.map +1 -1
- package/dist/common/logging.js +13 -6
- package/dist/common/logging.js.map +1 -1
- package/dist/common/updates.d.ts.map +1 -1
- package/dist/common/updates.js +2 -2
- package/dist/common/updates.js.map +1 -1
- package/dist/connect/api.d.ts +34 -1
- package/dist/connect/api.d.ts.map +1 -1
- package/dist/connect/api.js.map +1 -1
- package/dist/connect/intrinsics.d.ts +1 -0
- package/dist/connect/intrinsics.d.ts.map +1 -1
- package/dist/connect/intrinsics.js +29 -0
- package/dist/connect/intrinsics.js.map +1 -1
- package/dist/connect/migration_batch_helpers.d.ts +45 -0
- package/dist/connect/migration_batch_helpers.d.ts.map +1 -0
- package/dist/connect/migration_batch_helpers.js +439 -0
- package/dist/connect/migration_batch_helpers.js.map +1 -0
- package/dist/connect/migration_helpers.d.ts +4 -0
- package/dist/connect/migration_helpers.d.ts.map +1 -1
- package/dist/connect/migration_helpers.js +29 -5
- package/dist/connect/migration_helpers.js.map +1 -1
- package/dist/connect/parser_executables.d.ts.map +1 -1
- package/dist/connect/parser_executables.js +25 -13
- package/dist/connect/parser_executables.js.map +1 -1
- package/dist/connect/project.d.ts +2 -1
- package/dist/connect/project.d.ts.map +1 -1
- package/dist/connect/project.js +26 -24
- package/dist/connect/project.js.map +1 -1
- package/dist/connect/raw_templates.d.ts +10 -0
- package/dist/connect/raw_templates.d.ts.map +1 -1
- package/dist/connect/raw_templates.js +48 -14
- package/dist/connect/raw_templates.js.map +1 -1
- package/dist/connect/wizard/helpers.d.ts.map +1 -1
- package/dist/connect/wizard/helpers.js +7 -2
- package/dist/connect/wizard/helpers.js.map +1 -1
- package/dist/parser_scripts/get_swift_parser_dir.js +5 -5
- package/dist/parser_scripts/get_swift_parser_dir.js.map +1 -1
- package/figma-types-no-require.d.ts +229 -0
- package/figma-types.d.ts +12 -3
- package/package.json +7 -3
|
@@ -15,7 +15,9 @@ export type BaseCommand = commander.Command & {
|
|
|
15
15
|
exitOnUnreadableFiles: boolean;
|
|
16
16
|
apiUrl?: string;
|
|
17
17
|
includeProps?: boolean;
|
|
18
|
+
batch?: BatchMigrationMode;
|
|
18
19
|
};
|
|
20
|
+
type BatchMigrationMode = 'auto' | 'all' | 'none';
|
|
19
21
|
export declare function addConnectCommandToProgram(program: commander.Command): void;
|
|
20
22
|
export declare function getAccessToken(cmd: BaseCommand): string;
|
|
21
23
|
export declare function getAccessTokenOrExit(cmd: BaseCommand): string;
|
|
@@ -24,4 +26,5 @@ export declare function setupHandler(cmd: BaseCommand): void;
|
|
|
24
26
|
export declare function getCodeConnectObjects(cmd: BaseCommand & {
|
|
25
27
|
label?: string;
|
|
26
28
|
}, projectInfo: ProjectInfo, silent?: boolean, isForMigration?: boolean): Promise<CodeConnectJSON[]>;
|
|
29
|
+
export {};
|
|
27
30
|
//# sourceMappingURL=connect.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;
|
|
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;AAqC1D,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;IACtB,KAAK,CAAC,EAAE,kBAAkB,CAAA;CAC3B,CAAA;AAED,KAAK,kBAAkB,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;AA8BjD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,QAyGpE;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,CAuM5B"}
|
package/dist/commands/connect.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -9,6 +42,7 @@ exports.getAccessTokenOrExit = getAccessTokenOrExit;
|
|
|
9
42
|
exports.getDir = getDir;
|
|
10
43
|
exports.setupHandler = setupHandler;
|
|
11
44
|
exports.getCodeConnectObjects = getCodeConnectObjects;
|
|
45
|
+
const commander = __importStar(require("commander"));
|
|
12
46
|
const fs_1 = __importDefault(require("fs"));
|
|
13
47
|
const preview_utils_1 = require("./preview_utils");
|
|
14
48
|
const upload_1 = require("../connect/upload");
|
|
@@ -31,6 +65,7 @@ const parser_common_1 = require("../connect/parser_common");
|
|
|
31
65
|
const parser_2 = require("../react/parser");
|
|
32
66
|
const label_language_mapping_1 = require("../connect/label_language_mapping");
|
|
33
67
|
const migration_helpers_1 = require("../connect/migration_helpers");
|
|
68
|
+
const migration_batch_helpers_1 = require("../connect/migration_batch_helpers");
|
|
34
69
|
const raw_templates_1 = require("../connect/raw_templates");
|
|
35
70
|
const batch_templates_1 = require("../connect/batch_templates");
|
|
36
71
|
const run_wizard_2 = require("../connect/wizard/run_wizard");
|
|
@@ -85,10 +120,12 @@ function addConnectCommandToProgram(program) {
|
|
|
85
120
|
addBaseCommand(connectCommand, 'create', 'Generate a Code Connect file with boilerplate in the current directory for a Figma node URL')
|
|
86
121
|
.argument('<figma-node-url>', 'Figma node URL to create the Code Connect file from')
|
|
87
122
|
.action((0, updates_1.withUpdateCheck)(handleCreate));
|
|
88
|
-
addBaseCommand(connectCommand, 'migrate', 'Parse Code Connect files and migrate their templates into .figma.js files that can be published directly without parsing.')
|
|
89
|
-
.argument('[pattern]', 'glob pattern to match files (optional, uses config if not provided)')
|
|
123
|
+
addBaseCommand(connectCommand, 'migrate', 'Parse Code Connect files and migrate their templates into .figma.ts or .figma.js files that can be published directly without parsing.')
|
|
90
124
|
.option('--include-props', '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')
|
|
91
125
|
.option('--javascript', 'output migrated templates as JavaScript (.figma.js) instead of TypeScript (.figma.ts)')
|
|
126
|
+
.addOption(new commander.Option('--batch <mode>', 'batch migration mode: auto attempts files with 10 or more Code Connect docs; all attempts every source file; none disables batch migration')
|
|
127
|
+
.choices(['auto', 'all', 'none'])
|
|
128
|
+
.default('auto'))
|
|
92
129
|
.action((0, updates_1.withUpdateCheck)(handleMigrate));
|
|
93
130
|
addBaseCommand(connectCommand, 'preview', 'Preview how Code Connect snippets will render in the Figma inspect panel')
|
|
94
131
|
.argument('[files...]', 'Code Connect files to preview (e.g., Button.figma.tsx). Leave empty to preview all files.')
|
|
@@ -152,7 +189,45 @@ async function getCodeConnectObjects(cmd, projectInfo, silent = false, isForMigr
|
|
|
152
189
|
}
|
|
153
190
|
}
|
|
154
191
|
let codeConnectObjects = [];
|
|
155
|
-
|
|
192
|
+
// Parserless template files (.figma.ts/.figma.js with a leading url/component/source
|
|
193
|
+
// directive) are handled directly below by parseRawFile and never need a native parser.
|
|
194
|
+
// Identify them up front so we can decide whether the native parser is needed at all.
|
|
195
|
+
const rawTemplateFiles = projectInfo.files.filter((f) => {
|
|
196
|
+
// Suffix may be used by HTML / custom parsers
|
|
197
|
+
const isPotentialRawTemplate = f.endsWith('.figma.js') ||
|
|
198
|
+
f.endsWith('.figma.template.js') ||
|
|
199
|
+
f.endsWith('.figma.ts') ||
|
|
200
|
+
f.endsWith('.figma.template.ts');
|
|
201
|
+
if (!isPotentialRawTemplate)
|
|
202
|
+
return false;
|
|
203
|
+
try {
|
|
204
|
+
return (0, raw_templates_1.isRawTemplate)(fs_1.default.readFileSync(f, 'utf-8'));
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// A project is "template-only" when it has at least one matched file and every
|
|
211
|
+
// matched file is a parserless template. Such projects never need the native
|
|
212
|
+
// parser, so skip invoking it. This avoids spawning a native build (e.g.
|
|
213
|
+
// `swift run figma-swift`) that does no useful work and can fail outright — for
|
|
214
|
+
// example a Swift package on macOS 12 whose `Figma` dependency requires macOS 13.
|
|
215
|
+
// The native parser only ever produces docs from native source files
|
|
216
|
+
// (.swift/.kt/.tsx etc.), which are disjoint from raw templates, so skipping it
|
|
217
|
+
// here drops no docs.
|
|
218
|
+
//
|
|
219
|
+
// An empty file set is deliberately NOT treated as template-only: we leave the
|
|
220
|
+
// existing behavior intact (the configured parser still runs), so e.g. a Swift
|
|
221
|
+
// config that matches no files surfaces the same parser output as before.
|
|
222
|
+
const rawTemplateFileSet = new Set(rawTemplateFiles);
|
|
223
|
+
const isTemplateOnlyProject = rawTemplateFiles.length > 0 && projectInfo.files.every((f) => rawTemplateFileSet.has(f));
|
|
224
|
+
if (isTemplateOnlyProject) {
|
|
225
|
+
// Verbose-only: this is a diagnostic detail and must not alter normal output.
|
|
226
|
+
if (projectInfo.config.parser && cmd.verbose) {
|
|
227
|
+
logging_1.logger.info('All Code Connect files are templates; skipping the native parser.');
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else if (projectInfo.config.parser === 'react') {
|
|
156
231
|
codeConnectObjects = await getReactCodeConnectObjects(projectInfo, cmd, silent, isForMigration);
|
|
157
232
|
}
|
|
158
233
|
else if (projectInfo.config.parser === 'html') {
|
|
@@ -200,21 +275,6 @@ async function getCodeConnectObjects(cmd, projectInfo, silent = false, isForMigr
|
|
|
200
275
|
}
|
|
201
276
|
}
|
|
202
277
|
}
|
|
203
|
-
const rawTemplateFiles = projectInfo.files.filter((f) => {
|
|
204
|
-
// Suffix may be used by HTML / custom parsers
|
|
205
|
-
const isPotentialRawTemplate = f.endsWith('.figma.js') ||
|
|
206
|
-
f.endsWith('.figma.template.js') ||
|
|
207
|
-
f.endsWith('.figma.ts') ||
|
|
208
|
-
f.endsWith('.figma.template.ts');
|
|
209
|
-
if (!isPotentialRawTemplate)
|
|
210
|
-
return false;
|
|
211
|
-
try {
|
|
212
|
-
return (0, raw_templates_1.isRawTemplate)(fs_1.default.readFileSync(f, 'utf-8'));
|
|
213
|
-
}
|
|
214
|
-
catch {
|
|
215
|
-
return false;
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
278
|
if (rawTemplateFiles.length > 0) {
|
|
219
279
|
// Resolve the label before parsing so language inference works correctly
|
|
220
280
|
const resolvedLabel = cmd.label || projectInfo.config.label;
|
|
@@ -230,6 +290,15 @@ async function getCodeConnectObjects(cmd, projectInfo, silent = false, isForMigr
|
|
|
230
290
|
rawTemplateDocs.push(doc);
|
|
231
291
|
}
|
|
232
292
|
catch (e) {
|
|
293
|
+
// A url-less file containing `codeProperties` is not Code Connect (e.g.
|
|
294
|
+
// Make's code component property definitions). Log and skip it instead
|
|
295
|
+
// of failing — never exit, not even with --exit-on-unreadable-files.
|
|
296
|
+
if (e instanceof raw_templates_1.CodePropertiesError) {
|
|
297
|
+
if (!silent || cmd.verbose) {
|
|
298
|
+
logging_1.logger.info(e.message);
|
|
299
|
+
}
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
233
302
|
if (!silent || cmd.verbose) {
|
|
234
303
|
logging_1.logger.error(`❌ ${file}`);
|
|
235
304
|
if (cmd.verbose) {
|
|
@@ -512,10 +581,10 @@ async function handleCreate(nodeUrl, cmd) {
|
|
|
512
581
|
* - Format as valid parserless file w/ url="" comment
|
|
513
582
|
* - Name collisions are skipped, unless file is from migration (in which case add "_1")
|
|
514
583
|
*/
|
|
515
|
-
async function handleMigrate(
|
|
584
|
+
async function handleMigrate(cmd) {
|
|
516
585
|
setupHandler(cmd);
|
|
517
586
|
const dir = cmd.dir ?? process.cwd();
|
|
518
|
-
let projectInfo = await (0, project_1.getProjectInfo)(dir, cmd.config);
|
|
587
|
+
let projectInfo = (0, filter_project_info_1.filterProjectInfoByFile)(await (0, project_1.getProjectInfo)(dir, cmd.config), cmd.file);
|
|
519
588
|
const documentUrlSubstitutions = projectInfo.config.documentUrlSubstitutions;
|
|
520
589
|
// Clear documentUrlSubstitutions so we preserve original URLs in migrated templates
|
|
521
590
|
projectInfo = {
|
|
@@ -525,37 +594,50 @@ async function handleMigrate(pattern, cmd) {
|
|
|
525
594
|
documentUrlSubstitutions: {},
|
|
526
595
|
},
|
|
527
596
|
};
|
|
528
|
-
// If a glob pattern is provided, override the project files
|
|
529
|
-
if (pattern) {
|
|
530
|
-
const { globSync } = require('glob');
|
|
531
|
-
const files = globSync(pattern, {
|
|
532
|
-
cwd: dir,
|
|
533
|
-
absolute: true,
|
|
534
|
-
nodir: true,
|
|
535
|
-
});
|
|
536
|
-
if (files.length === 0) {
|
|
537
|
-
(0, logging_1.exitWithError)(`No files found matching pattern: ${pattern}`);
|
|
538
|
-
}
|
|
539
|
-
logging_1.logger.info(`Found ${files.length} file(s) matching pattern: ${pattern}`);
|
|
540
|
-
projectInfo = {
|
|
541
|
-
...projectInfo,
|
|
542
|
-
files,
|
|
543
|
-
};
|
|
544
|
-
}
|
|
545
597
|
// Parse the files to get Code Connect objects
|
|
546
598
|
const allCodeConnectObjects = await getCodeConnectObjects(cmd, projectInfo, false, true);
|
|
547
|
-
const
|
|
548
|
-
const groupCount = Object.keys(
|
|
599
|
+
const allCodeConnectObjectsByFigmaUrl = (0, migration_helpers_1.groupCodeConnectObjectsByFigmaUrl)(allCodeConnectObjects);
|
|
600
|
+
const groupCount = Object.keys(allCodeConnectObjectsByFigmaUrl).length;
|
|
549
601
|
if (groupCount === 0) {
|
|
550
602
|
(0, logging_1.exitWithError)('No Code Connect objects found to migrate');
|
|
551
603
|
}
|
|
552
604
|
logging_1.logger.info(`Found ${groupCount} component(s) to migrate`);
|
|
553
605
|
let migratedCount = 0;
|
|
606
|
+
let batchMigratedCount = 0;
|
|
554
607
|
let skippedCount = 0;
|
|
555
608
|
const errors = [];
|
|
609
|
+
const batchMigrationWarnings = [];
|
|
556
610
|
const filePathsCreated = new Set();
|
|
557
611
|
const gitRootPath = (0, project_2.getGitRepoAbsolutePath)(dir);
|
|
558
612
|
const useTypeScript = !cmd.javascript;
|
|
613
|
+
const batchMigratedDocs = new Set();
|
|
614
|
+
const batchDocsByPath = (0, migration_batch_helpers_1.getBatchMigrationGroups)(allCodeConnectObjects, {
|
|
615
|
+
batchAll: cmd.batch === 'all',
|
|
616
|
+
disabled: cmd.batch === 'none',
|
|
617
|
+
});
|
|
618
|
+
for (const [batchPath, docs] of batchDocsByPath) {
|
|
619
|
+
const result = (0, migration_batch_helpers_1.writeBatchTemplateFiles)(docs, cmd.outDir, dir, {
|
|
620
|
+
localSourcePath: batchPath,
|
|
621
|
+
filePathsCreated,
|
|
622
|
+
includeProps: cmd.includeProps,
|
|
623
|
+
useTypeScript,
|
|
624
|
+
});
|
|
625
|
+
if (result.skipped) {
|
|
626
|
+
batchMigrationWarnings.push({
|
|
627
|
+
path: batchPath,
|
|
628
|
+
connectionCount: docs.length,
|
|
629
|
+
reason: result.reason || 'unable to create batch files',
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
else {
|
|
633
|
+
logging_1.logger.info(`${(0, logging_1.success)('✓')} Migrated ${result.componentCount} component(s) to batch ${(0, logging_1.highlight)(result.batchPath || batchPath)}`);
|
|
634
|
+
migratedCount += result.componentCount;
|
|
635
|
+
batchMigratedCount += result.componentCount;
|
|
636
|
+
docs.forEach((doc) => batchMigratedDocs.add(doc));
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
const regularCodeConnectObjects = allCodeConnectObjects.filter((doc) => !batchMigratedDocs.has(doc));
|
|
640
|
+
const codeConnectObjectsByFigmaUrl = (0, migration_helpers_1.groupCodeConnectObjectsByFigmaUrl)(regularCodeConnectObjects);
|
|
559
641
|
for (const [figmaUrl, group] of Object.entries(codeConnectObjectsByFigmaUrl)) {
|
|
560
642
|
try {
|
|
561
643
|
const hasVariants = group.variants.length > 0;
|
|
@@ -621,7 +703,10 @@ async function handleMigrate(pattern, cmd) {
|
|
|
621
703
|
const language = (0, label_language_mapping_1.getInferredLanguageForRaw)(label, docLanguage);
|
|
622
704
|
const config = {
|
|
623
705
|
parser: undefined,
|
|
624
|
-
include: [
|
|
706
|
+
include: [
|
|
707
|
+
useTypeScript ? '**/*.figma.ts' : '**/*.figma.js',
|
|
708
|
+
...(batchMigratedCount > 0 ? ['**/*.figma.batch.json'] : []),
|
|
709
|
+
],
|
|
625
710
|
language,
|
|
626
711
|
label,
|
|
627
712
|
...(documentUrlSubstitutions && Object.keys(documentUrlSubstitutions).length > 0
|
|
@@ -633,6 +718,15 @@ async function handleMigrate(pattern, cmd) {
|
|
|
633
718
|
}
|
|
634
719
|
}
|
|
635
720
|
}
|
|
721
|
+
if (batchMigrationWarnings.length > 0) {
|
|
722
|
+
console.log('');
|
|
723
|
+
logging_1.logger.warn('Unable to migrate the following files to batch files:');
|
|
724
|
+
batchMigrationWarnings.forEach((warning) => {
|
|
725
|
+
logging_1.logger.warn(`- ${(0, logging_1.highlight)(warning.path)} (${warning.connectionCount} connections): ${formatBatchMigrationWarningReason(warning.reason)}`);
|
|
726
|
+
});
|
|
727
|
+
console.log('');
|
|
728
|
+
logging_1.logger.warn("If you'd like to create batch files for these, we recommend using a coding agent. See example prompt: https://developers.figma.com/docs/code-connect/template-files/#migration-script");
|
|
729
|
+
}
|
|
636
730
|
// Summary
|
|
637
731
|
console.log('');
|
|
638
732
|
logging_1.logger.info(`Migration complete: ${(0, logging_1.success)(`${migratedCount} migrated`)}, ${skippedCount} skipped`);
|
|
@@ -646,4 +740,10 @@ async function handleMigrate(pattern, cmd) {
|
|
|
646
740
|
(0, logging_1.exitWithError)('No files were migrated');
|
|
647
741
|
}
|
|
648
742
|
}
|
|
743
|
+
function formatBatchMigrationWarningReason(reason) {
|
|
744
|
+
const strippedReason = reason.replace(/^Cannot batch:\s*/i, '');
|
|
745
|
+
return strippedReason.replace(/^(\s*)(\S)/, (_match, prefix, firstChar) => {
|
|
746
|
+
return `${prefix}${firstChar.toUpperCase()}`;
|
|
747
|
+
});
|
|
748
|
+
}
|
|
649
749
|
//# sourceMappingURL=connect.js.map
|
|
@@ -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(\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"]}
|
|
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 {\n getBatchMigrationGroups,\n writeBatchTemplateFiles,\n} from '../connect/migration_batch_helpers'\nimport { CodePropertiesError, 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 batch?: BatchMigrationMode\n}\n\ntype BatchMigrationMode = 'auto' | 'all' | 'none'\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.ts or .figma.js files that can be published directly without parsing.',\n )\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 .addOption(\n new commander.Option(\n '--batch <mode>',\n 'batch migration mode: auto attempts files with 10 or more Code Connect docs; all attempts every source file; none disables batch migration',\n )\n .choices(['auto', 'all', 'none'])\n .default('auto'),\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 // Parserless template files (.figma.ts/.figma.js with a leading url/component/source\n // directive) are handled directly below by parseRawFile and never need a native parser.\n // Identify them up front so we can decide whether the native parser is needed at all.\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 // A project is \"template-only\" when it has at least one matched file and every\n // matched file is a parserless template. Such projects never need the native\n // parser, so skip invoking it. This avoids spawning a native build (e.g.\n // `swift run figma-swift`) that does no useful work and can fail outright — for\n // example a Swift package on macOS 12 whose `Figma` dependency requires macOS 13.\n // The native parser only ever produces docs from native source files\n // (.swift/.kt/.tsx etc.), which are disjoint from raw templates, so skipping it\n // here drops no docs.\n //\n // An empty file set is deliberately NOT treated as template-only: we leave the\n // existing behavior intact (the configured parser still runs), so e.g. a Swift\n // config that matches no files surfaces the same parser output as before.\n const rawTemplateFileSet = new Set(rawTemplateFiles)\n const isTemplateOnlyProject =\n rawTemplateFiles.length > 0 && projectInfo.files.every((f) => rawTemplateFileSet.has(f))\n\n if (isTemplateOnlyProject) {\n // Verbose-only: this is a diagnostic detail and must not alter normal output.\n if (projectInfo.config.parser && cmd.verbose) {\n logger.info('All Code Connect files are templates; skipping the native parser.')\n }\n } else 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 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 // A url-less file containing `codeProperties` is not Code Connect (e.g.\n // Make's code component property definitions). Log and skip it instead\n // of failing — never exit, not even with --exit-on-unreadable-files.\n if (e instanceof CodePropertiesError) {\n if (!silent || cmd.verbose) {\n logger.info(e.message)\n }\n continue\n }\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(cmd: BaseCommand & { javascript?: boolean }) {\n setupHandler(cmd)\n\n const dir = cmd.dir ?? process.cwd()\n let projectInfo = filterProjectInfoByFile(await getProjectInfo(dir, cmd.config), cmd.file)\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 // Parse the files to get Code Connect objects\n const allCodeConnectObjects = await getCodeConnectObjects(cmd, projectInfo, false, true)\n\n const allCodeConnectObjectsByFigmaUrl = groupCodeConnectObjectsByFigmaUrl(allCodeConnectObjects)\n const groupCount = Object.keys(allCodeConnectObjectsByFigmaUrl).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 batchMigratedCount = 0\n let skippedCount = 0\n const errors: string[] = []\n const batchMigrationWarnings: Array<{\n path: string\n connectionCount: number\n reason: string\n }> = []\n\n const filePathsCreated = new Set<string>()\n const gitRootPath = getGitRepoAbsolutePath(dir)\n const useTypeScript = !cmd.javascript\n const batchMigratedDocs = new Set<CodeConnectJSON>()\n const batchDocsByPath = getBatchMigrationGroups(allCodeConnectObjects, {\n batchAll: cmd.batch === 'all',\n disabled: cmd.batch === 'none',\n })\n\n for (const [batchPath, docs] of batchDocsByPath) {\n const result = writeBatchTemplateFiles(docs, cmd.outDir, dir, {\n localSourcePath: batchPath,\n filePathsCreated,\n includeProps: cmd.includeProps,\n useTypeScript,\n })\n\n if (result.skipped) {\n batchMigrationWarnings.push({\n path: batchPath,\n connectionCount: docs.length,\n reason: result.reason || 'unable to create batch files',\n })\n } else {\n logger.info(\n `${success('✓')} Migrated ${result.componentCount} component(s) to batch ${highlight(result.batchPath || batchPath)}`,\n )\n migratedCount += result.componentCount\n batchMigratedCount += result.componentCount\n docs.forEach((doc) => batchMigratedDocs.add(doc))\n }\n }\n\n const regularCodeConnectObjects = allCodeConnectObjects.filter(\n (doc) => !batchMigratedDocs.has(doc),\n )\n const codeConnectObjectsByFigmaUrl = groupCodeConnectObjectsByFigmaUrl(regularCodeConnectObjects)\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: [\n useTypeScript ? '**/*.figma.ts' : '**/*.figma.js',\n ...(batchMigratedCount > 0 ? ['**/*.figma.batch.json'] : []),\n ],\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 if (batchMigrationWarnings.length > 0) {\n console.log('')\n logger.warn('Unable to migrate the following files to batch files:')\n batchMigrationWarnings.forEach((warning) => {\n logger.warn(\n `- ${highlight(warning.path)} (${warning.connectionCount} connections): ${formatBatchMigrationWarningReason(warning.reason)}`,\n )\n })\n console.log('')\n logger.warn(\n \"If you'd like to create batch files for these, we recommend using a coding agent. See example prompt: https://developers.figma.com/docs/code-connect/template-files/#migration-script\",\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\nfunction formatBatchMigrationWarningReason(reason: string) {\n const strippedReason = reason.replace(/^Cannot batch:\\s*/i, '')\n return strippedReason.replace(/^(\\s*)(\\S)/, (_match, prefix: string, firstChar: string) => {\n return `${prefix}${firstChar.toUpperCase()}`\n })\n}\n"]}
|
|
@@ -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,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;
|
|
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;AAgSD,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"}
|
|
@@ -66,6 +66,15 @@ async function getCodeConnectObjects(cmd, projectInfo, silent = false) {
|
|
|
66
66
|
rawTemplateDocs.push(doc);
|
|
67
67
|
}
|
|
68
68
|
catch (e) {
|
|
69
|
+
// A url-less file containing `codeProperties` is not Code Connect (e.g.
|
|
70
|
+
// Make's code component property definitions). Log and skip it instead
|
|
71
|
+
// of failing — never exit, not even with --exit-on-unreadable-files.
|
|
72
|
+
if (e instanceof raw_templates_1.CodePropertiesError) {
|
|
73
|
+
if (!silent || cmd.verbose) {
|
|
74
|
+
logging_1.logger.info(e.message);
|
|
75
|
+
}
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
69
78
|
if (!silent || cmd.verbose) {
|
|
70
79
|
logging_1.logger.error(`❌ ${file}`);
|
|
71
80
|
if (cmd.verbose) {
|