@figma/code-connect 1.1.3 → 1.2.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.
- package/README.md +2 -2
- package/dist/common/updates.js +1 -1
- package/dist/common/updates.js.map +1 -1
- package/dist/connect/api.d.ts +38 -6
- package/dist/connect/api.d.ts.map +1 -1
- package/dist/connect/create.d.ts.map +1 -1
- package/dist/connect/create.js +3 -0
- package/dist/connect/create.js.map +1 -1
- package/dist/connect/external_types.d.ts +2 -1
- package/dist/connect/external_types.d.ts.map +1 -1
- package/dist/connect/external_types.js +5 -1
- package/dist/connect/external_types.js.map +1 -1
- package/dist/connect/intrinsics.d.ts +4 -1
- package/dist/connect/intrinsics.d.ts.map +1 -1
- package/dist/connect/intrinsics.js +76 -36
- package/dist/connect/intrinsics.js.map +1 -1
- package/dist/connect/modifiers.d.ts +29 -0
- package/dist/connect/modifiers.d.ts.map +1 -0
- package/dist/connect/modifiers.js +109 -0
- package/dist/connect/modifiers.js.map +1 -0
- package/dist/connect/parser_common.d.ts +3 -3
- package/dist/connect/parser_common.d.ts.map +1 -1
- package/dist/connect/parser_common.js +18 -18
- package/dist/connect/parser_common.js.map +1 -1
- package/dist/connect/parser_executable_types.d.ts +21 -19
- package/dist/connect/parser_executable_types.d.ts.map +1 -1
- package/dist/connect/parser_executable_types.js.map +1 -1
- package/dist/connect/wizard/embeddings.d.ts +13 -0
- package/dist/connect/wizard/embeddings.d.ts.map +1 -0
- package/dist/connect/wizard/embeddings.js +22 -0
- package/dist/connect/wizard/embeddings.js.map +1 -0
- package/dist/connect/wizard/helpers.d.ts +2 -0
- package/dist/connect/wizard/helpers.d.ts.map +1 -1
- package/dist/connect/wizard/helpers.js +16 -1
- package/dist/connect/wizard/helpers.js.map +1 -1
- package/dist/connect/wizard/prop_mapping.d.ts +20 -10
- package/dist/connect/wizard/prop_mapping.d.ts.map +1 -1
- package/dist/connect/wizard/prop_mapping.js +156 -48
- package/dist/connect/wizard/prop_mapping.js.map +1 -1
- package/dist/connect/wizard/prop_mapping_helpers.d.ts +71 -0
- package/dist/connect/wizard/prop_mapping_helpers.d.ts.map +1 -0
- package/dist/connect/wizard/prop_mapping_helpers.js +176 -0
- package/dist/connect/wizard/prop_mapping_helpers.js.map +1 -0
- package/dist/connect/wizard/run_wizard.d.ts.map +1 -1
- package/dist/connect/wizard/run_wizard.js +48 -16
- package/dist/connect/wizard/run_wizard.js.map +1 -1
- package/dist/connect/wizard/signature_extraction.d.ts +2 -4
- package/dist/connect/wizard/signature_extraction.d.ts.map +1 -1
- package/dist/connect/wizard/signature_extraction.js +119 -33
- package/dist/connect/wizard/signature_extraction.js.map +1 -1
- package/dist/html/external.d.ts +1 -1
- package/dist/html/external.d.ts.map +1 -1
- package/dist/html/external.js +6 -5
- package/dist/html/external.js.map +1 -1
- package/dist/html/index_html.d.ts +1 -1
- package/dist/html/index_html.d.ts.map +1 -1
- package/dist/html/parser.d.ts.map +1 -1
- package/dist/html/parser.js +16 -12
- package/dist/html/parser.js.map +1 -1
- package/dist/html/parser_template_helpers.d.ts +8 -0
- package/dist/html/parser_template_helpers.d.ts.map +1 -1
- package/dist/html/parser_template_helpers.js +19 -3
- package/dist/html/parser_template_helpers.js.map +1 -1
- package/dist/html/types.d.ts +1 -1
- package/dist/html/types.d.ts.map +1 -1
- package/dist/react/create.d.ts.map +1 -1
- package/dist/react/create.js +69 -22
- package/dist/react/create.js.map +1 -1
- package/dist/react/external.d.ts +1 -2
- package/dist/react/external.d.ts.map +1 -1
- package/dist/react/external.js +1 -4
- package/dist/react/external.js.map +1 -1
- package/dist/react/index_react.d.ts +25 -2
- package/dist/react/index_react.d.ts.map +1 -1
- package/dist/react/index_react.js.map +1 -1
- package/dist/react/parser.d.ts +38 -14
- package/dist/react/parser.d.ts.map +1 -1
- package/dist/react/parser.js +128 -215
- package/dist/react/parser.js.map +1 -1
- package/dist/react/parser_template_helpers.d.ts +5 -1
- package/dist/react/parser_template_helpers.d.ts.map +1 -1
- package/dist/react/parser_template_helpers.js +20 -3
- package/dist/react/parser_template_helpers.js.map +1 -1
- package/dist/react/types.d.ts +6 -2
- package/dist/react/types.d.ts.map +1 -1
- package/dist/storybook/convert.js +1 -1
- package/dist/storybook/convert.js.map +1 -1
- package/dist/storybook/external.d.ts +2 -2
- package/dist/storybook/external.d.ts.map +1 -1
- package/package.json +12 -10
|
@@ -1,17 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.generatePropMapping = exports.buildMatchableNamesMap = exports.MatchableNameTypes = exports.generateValueMapping = exports.PROPERTY_PLACEHOLDER = void 0;
|
|
4
4
|
const figma_rest_api_1 = require("../figma_rest_api");
|
|
5
5
|
const fast_fuzzy_1 = require("fast-fuzzy");
|
|
6
|
-
const logging_1 = require("../../common/logging");
|
|
7
6
|
const intrinsics_1 = require("../../connect/intrinsics");
|
|
8
|
-
const signature_extraction_1 = require("./signature_extraction");
|
|
9
7
|
const create_1 = require("../../react/create");
|
|
8
|
+
/**
|
|
9
|
+
* These thresholds were come up with by running the benchmarking
|
|
10
|
+
* and tweaking until high positives + acceptable false positives
|
|
11
|
+
* were achieved. It's worth repeating this process whenever making
|
|
12
|
+
* changes to the mapping algorithm.
|
|
13
|
+
*/
|
|
14
|
+
const MININUM_MATCH_SCORES = {
|
|
15
|
+
fuzzy: {
|
|
16
|
+
property: 0.65,
|
|
17
|
+
variantValue: 0.8,
|
|
18
|
+
},
|
|
19
|
+
embeddings: {
|
|
20
|
+
property: 0.84,
|
|
21
|
+
variantValue: 0.87,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
10
24
|
/**
|
|
11
25
|
* Used when we should output a placeholder for an unknown value in prop mapping.
|
|
12
26
|
*/
|
|
13
27
|
exports.PROPERTY_PLACEHOLDER = 'PROPERTY_PLACEHOLDER';
|
|
14
|
-
const PROP_MINIMUM_MATCH_THRESHOLD = 0.8;
|
|
15
28
|
function generateValueMapping(propSignature, figmaPropDef) {
|
|
16
29
|
const codeEnumOptions = propSignature.split(' | ').map((str) => str.substring(1, str.length - 1)); // remove quote marks
|
|
17
30
|
const searcher = new fast_fuzzy_1.Searcher(figmaPropDef.variantOptions);
|
|
@@ -24,15 +37,18 @@ function generateValueMapping(propSignature, figmaPropDef) {
|
|
|
24
37
|
}, {});
|
|
25
38
|
}
|
|
26
39
|
exports.generateValueMapping = generateValueMapping;
|
|
40
|
+
function signatureIsJsxLike(signature) {
|
|
41
|
+
return (signature.includes('ElementType') ||
|
|
42
|
+
signature.includes('ReactElement') ||
|
|
43
|
+
signature.includes('ReactNode'));
|
|
44
|
+
}
|
|
27
45
|
/**
|
|
28
46
|
* Attempts to create a mapping between a code prop and figma prop.
|
|
29
47
|
* These props have been matched by name and aren't guaranteed to
|
|
30
48
|
* actually be related, so we return null if no suitable mapping
|
|
31
49
|
*/
|
|
32
|
-
function generateIntrinsic({ propSignature
|
|
33
|
-
const
|
|
34
|
-
? propSignatureWithOptionalModifier.substring(1)
|
|
35
|
-
: propSignatureWithOptionalModifier;
|
|
50
|
+
function generateIntrinsic({ propSignature, figmaPropName: figmaPropNameWithNodeId, figmaPropDef, }) {
|
|
51
|
+
const figmaPropName = stripNodeIdFromPropertyName(figmaPropNameWithNodeId);
|
|
36
52
|
if (propSignature === 'string' && figmaPropDef.type === figma_rest_api_1.FigmaRestApi.ComponentPropertyType.Text) {
|
|
37
53
|
return {
|
|
38
54
|
kind: intrinsics_1.IntrinsicKind.String,
|
|
@@ -55,62 +71,154 @@ function generateIntrinsic({ propSignature: propSignatureWithOptionalModifier, f
|
|
|
55
71
|
}
|
|
56
72
|
if (propSignature.includes(' | ') &&
|
|
57
73
|
figmaPropDef.type === figma_rest_api_1.FigmaRestApi.ComponentPropertyType.Variant) {
|
|
74
|
+
const valueMapping = generateValueMapping(propSignature, figmaPropDef);
|
|
75
|
+
// Only valuable if some values were mapped
|
|
76
|
+
if (Object.keys(valueMapping).length > 0) {
|
|
77
|
+
return {
|
|
78
|
+
kind: intrinsics_1.IntrinsicKind.Enum,
|
|
79
|
+
args: {
|
|
80
|
+
figmaPropName,
|
|
81
|
+
valueMapping,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (signatureIsJsxLike(propSignature) &&
|
|
87
|
+
figmaPropDef.type === figma_rest_api_1.FigmaRestApi.ComponentPropertyType.InstanceSwap) {
|
|
58
88
|
return {
|
|
59
|
-
kind: intrinsics_1.IntrinsicKind.
|
|
89
|
+
kind: intrinsics_1.IntrinsicKind.Instance,
|
|
60
90
|
args: {
|
|
61
91
|
figmaPropName,
|
|
62
|
-
valueMapping: generateValueMapping(propSignature, figmaPropDef),
|
|
63
92
|
},
|
|
64
93
|
};
|
|
65
94
|
}
|
|
66
95
|
return null;
|
|
67
96
|
}
|
|
68
|
-
function
|
|
97
|
+
function stripNodeIdFromPropertyName(propertyName) {
|
|
98
|
+
return propertyName.replace(/#\d+:\d+/, '');
|
|
99
|
+
}
|
|
100
|
+
const DELIMITERS_REGEX = /[\s-_]/g;
|
|
101
|
+
var MatchableNameTypes;
|
|
102
|
+
(function (MatchableNameTypes) {
|
|
103
|
+
MatchableNameTypes[MatchableNameTypes["Property"] = 0] = "Property";
|
|
104
|
+
MatchableNameTypes[MatchableNameTypes["VariantValue"] = 1] = "VariantValue";
|
|
105
|
+
// ChildLayer, // TODO
|
|
106
|
+
})(MatchableNameTypes || (exports.MatchableNameTypes = MatchableNameTypes = {}));
|
|
107
|
+
const MATCHABLE_NAME_TYPES_PRIORITY = [
|
|
108
|
+
MatchableNameTypes.Property,
|
|
109
|
+
MatchableNameTypes.VariantValue,
|
|
110
|
+
];
|
|
111
|
+
/**
|
|
112
|
+
* Builds a map of all properties and enum values, indexed by name.
|
|
113
|
+
* @param componentPropertyDefinitions
|
|
114
|
+
* @returns A map of {name: values[]}. Each value is an array to avoid
|
|
115
|
+
* collisions between properties / enum values
|
|
116
|
+
*/
|
|
117
|
+
function buildMatchableNamesMap(componentPropertyDefinitions) {
|
|
118
|
+
const matchableValues = {};
|
|
119
|
+
function add(name, definition) {
|
|
120
|
+
matchableValues[name] = matchableValues[name] || [];
|
|
121
|
+
matchableValues[name].push(definition);
|
|
122
|
+
}
|
|
123
|
+
Object.entries(componentPropertyDefinitions || {}).forEach(([propName, propDef]) => {
|
|
124
|
+
const name = stripNodeIdFromPropertyName(propName);
|
|
125
|
+
add(name, {
|
|
126
|
+
type: MatchableNameTypes.Property,
|
|
127
|
+
name: propName,
|
|
128
|
+
});
|
|
129
|
+
if (propDef.type === figma_rest_api_1.FigmaRestApi.ComponentPropertyType.Variant) {
|
|
130
|
+
propDef.variantOptions?.forEach((variantValue) => {
|
|
131
|
+
add(variantValue, {
|
|
132
|
+
type: MatchableNameTypes.VariantValue,
|
|
133
|
+
name: variantValue,
|
|
134
|
+
variantProperty: propName,
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return matchableValues;
|
|
140
|
+
}
|
|
141
|
+
exports.buildMatchableNamesMap = buildMatchableNamesMap;
|
|
142
|
+
function generatePropMapping({ componentPropertyDefinitions, signature, componentMatchResults, matchableNamesMap, }) {
|
|
69
143
|
const propMapping = {};
|
|
70
|
-
|
|
71
|
-
const matchableFigmaProperties = Object.keys(componentPropertyDefinitions || {}).reduce((acc, propName) => {
|
|
72
|
-
const withoutWhitespace = propName.replace(/\s/g, '');
|
|
73
|
-
acc[withoutWhitespace] = propName;
|
|
74
|
-
return acc;
|
|
75
|
-
}, {});
|
|
76
|
-
const searchSpace = Object.keys(matchableFigmaProperties);
|
|
144
|
+
const searchSpace = Object.keys(matchableNamesMap);
|
|
77
145
|
const searcher = new fast_fuzzy_1.Searcher(searchSpace);
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
146
|
+
let minimumMatchScores = MININUM_MATCH_SCORES.fuzzy;
|
|
147
|
+
const useEmbeddings = !!componentMatchResults;
|
|
148
|
+
if (useEmbeddings) {
|
|
149
|
+
minimumMatchScores = MININUM_MATCH_SCORES.embeddings;
|
|
150
|
+
}
|
|
151
|
+
function attemptGetIntrinsicForProp({ propMatch, propSignature, }) {
|
|
152
|
+
const itemsInPriorityOrder = [...matchableNamesMap[propMatch.item]].sort((a, b) => MATCHABLE_NAME_TYPES_PRIORITY.indexOf(a.type) -
|
|
153
|
+
MATCHABLE_NAME_TYPES_PRIORITY.indexOf(b.type));
|
|
154
|
+
for (const item of itemsInPriorityOrder) {
|
|
155
|
+
/**
|
|
156
|
+
* First, look for matching property names with compatible types
|
|
157
|
+
*/
|
|
158
|
+
if (item.type === MatchableNameTypes.Property &&
|
|
159
|
+
propMatch.score > minimumMatchScores.property) {
|
|
160
|
+
const intrinsic = generateIntrinsic({
|
|
161
|
+
propSignature,
|
|
162
|
+
figmaPropName: item.name,
|
|
163
|
+
figmaPropDef: componentPropertyDefinitions[item.name],
|
|
164
|
+
});
|
|
86
165
|
if (intrinsic) {
|
|
87
|
-
|
|
166
|
+
return intrinsic;
|
|
88
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* Then if no match AND a boolean prop, look for matching variant values, e.g:
|
|
170
|
+
*
|
|
171
|
+
* disabled: figma.enum('State', {
|
|
172
|
+
* Disabled: true,
|
|
173
|
+
* })
|
|
174
|
+
*/
|
|
175
|
+
}
|
|
176
|
+
else if (item.type === MatchableNameTypes.VariantValue &&
|
|
177
|
+
propSignature === 'false | true' &&
|
|
178
|
+
propMatch.score > minimumMatchScores.variantValue) {
|
|
179
|
+
return {
|
|
180
|
+
kind: intrinsics_1.IntrinsicKind.Enum,
|
|
181
|
+
args: {
|
|
182
|
+
figmaPropName: item.variantProperty,
|
|
183
|
+
valueMapping: {
|
|
184
|
+
[item.name]: true,
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
};
|
|
89
188
|
}
|
|
90
189
|
}
|
|
91
|
-
|
|
92
|
-
return propMapping;
|
|
93
|
-
}
|
|
94
|
-
exports.generatePropMapping = generatePropMapping;
|
|
95
|
-
function extractSignatureAndGeneratePropMapping({ exportName, filepath, projectInfo, componentPropertyDefinitions, cmd, }) {
|
|
96
|
-
let signature;
|
|
97
|
-
try {
|
|
98
|
-
signature = (0, signature_extraction_1.extractSignature)({
|
|
99
|
-
nameToFind: exportName,
|
|
100
|
-
sourceFilePath: filepath,
|
|
101
|
-
projectInfo,
|
|
102
|
-
});
|
|
190
|
+
return null;
|
|
103
191
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
192
|
+
/**
|
|
193
|
+
* Attempt to generate an intrinsic for a given property name by looking
|
|
194
|
+
* for name matches with a minimum threshold
|
|
195
|
+
*
|
|
196
|
+
* Embeddings are priorized over fuzzy matching if present (they
|
|
197
|
+
* may be missing if gated or missing permissions).
|
|
198
|
+
*/
|
|
199
|
+
for (const [propName, propSignatureWithOptionalModifier] of Object.entries(signature)) {
|
|
200
|
+
const propSignature = propSignatureWithOptionalModifier.startsWith('?')
|
|
201
|
+
? propSignatureWithOptionalModifier.substring(1)
|
|
202
|
+
: propSignatureWithOptionalModifier;
|
|
203
|
+
let matches = searcher.search(propName, { returnMatchData: true });
|
|
204
|
+
if (useEmbeddings) {
|
|
205
|
+
matches = componentMatchResults[propName];
|
|
206
|
+
}
|
|
207
|
+
if (matches.length === 0) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
for (const match of matches) {
|
|
211
|
+
const intrinsic = attemptGetIntrinsicForProp({
|
|
212
|
+
propMatch: match,
|
|
213
|
+
propSignature,
|
|
214
|
+
});
|
|
215
|
+
if (intrinsic) {
|
|
216
|
+
propMapping[propName] = intrinsic;
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
107
219
|
}
|
|
108
|
-
return undefined;
|
|
109
220
|
}
|
|
110
|
-
return
|
|
111
|
-
componentPropertyDefinitions,
|
|
112
|
-
signature,
|
|
113
|
-
});
|
|
221
|
+
return propMapping;
|
|
114
222
|
}
|
|
115
|
-
exports.
|
|
223
|
+
exports.generatePropMapping = generatePropMapping;
|
|
116
224
|
//# sourceMappingURL=prop_mapping.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prop_mapping.js","sourceRoot":"","sources":["../../../src/connect/wizard/prop_mapping.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"prop_mapping.js","sourceRoot":"","sources":["../../../src/connect/wizard/prop_mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { BaseCommand } from '../../commands/connect';
|
|
2
|
+
import { ComponentTypeSignature } from '../../react/parser';
|
|
3
|
+
import { FigmaRestApi } from '../figma_rest_api';
|
|
4
|
+
import { ProjectInfo } from '../project';
|
|
5
|
+
import { MatchableName } from './prop_mapping';
|
|
6
|
+
import { PropMapping } from '../parser_executable_types';
|
|
7
|
+
export type MatchableNamesMap = Record<string, MatchableName[]>;
|
|
8
|
+
export type PropMappingData = {
|
|
9
|
+
[filepathExport: string]: {
|
|
10
|
+
signature: ComponentTypeSignature;
|
|
11
|
+
matchableNamesMap: MatchableNamesMap;
|
|
12
|
+
componentPropertyDefinitions: FigmaRestApi.Component['componentPropertyDefinitions'];
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Preprocess signatures and matchable names for all components
|
|
17
|
+
*/
|
|
18
|
+
export declare function getPropMappingData({ filepathExportsToComponents, projectInfo, cmd, }: {
|
|
19
|
+
filepathExportsToComponents: Record<string, FigmaRestApi.Component>;
|
|
20
|
+
projectInfo: ProjectInfo;
|
|
21
|
+
cmd: BaseCommand;
|
|
22
|
+
}): PropMappingData;
|
|
23
|
+
export declare function getUniqueMatchableNames(propMappingData: PropMappingData): string[];
|
|
24
|
+
export type PropMatchResult = {
|
|
25
|
+
item: string;
|
|
26
|
+
score: number;
|
|
27
|
+
};
|
|
28
|
+
export type ComponentMatchResults = {
|
|
29
|
+
[propName: string]: PropMatchResult[];
|
|
30
|
+
};
|
|
31
|
+
type AllMatchResults = {
|
|
32
|
+
[filepathExport: string]: ComponentMatchResults;
|
|
33
|
+
};
|
|
34
|
+
type MatchableNameEmbeddings = {
|
|
35
|
+
[matchableName: string]: number[];
|
|
36
|
+
};
|
|
37
|
+
export declare function buildAllEmbeddingsMatchResults(propMappingData: PropMappingData, matchableNameEmbeddings: MatchableNameEmbeddings): AllMatchResults;
|
|
38
|
+
export declare function generateAllPropsMappings({ propMappingData, accessToken, figmaUrl, useAi, mockResponseName, }: {
|
|
39
|
+
propMappingData: PropMappingData;
|
|
40
|
+
accessToken: string;
|
|
41
|
+
figmaUrl: string;
|
|
42
|
+
useAi: boolean;
|
|
43
|
+
mockResponseName?: string;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
[filepathExport: string]: PropMapping;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* This is the top level function that takes a map of filepathExports to components and generates prop mappings.
|
|
49
|
+
* It does the following:
|
|
50
|
+
*
|
|
51
|
+
* 1. For each component we want to match, extract their TS signature and all figma properties
|
|
52
|
+
* 2. Make an array of all strings we want embeddings for (react props, figma properties, variant values)
|
|
53
|
+
* 3. Call embeddings endpoint with above and create a map of names => embeddings
|
|
54
|
+
* 4. For each component, build a map of code props to an list of matchable names + scores, sorted by their calculated embedding distance to the code prop
|
|
55
|
+
* 5. Finally, pass those name matches and component data to the prop mapping algorithm to generate the mapping
|
|
56
|
+
*/
|
|
57
|
+
export declare function extractDataAndGenerateAllPropsMappings({ filepathExportsToComponents, projectInfo, cmd, figmaUrl, accessToken, useAi, }: {
|
|
58
|
+
filepathExportsToComponents: Record<string, FigmaRestApi.Component>;
|
|
59
|
+
projectInfo: ProjectInfo;
|
|
60
|
+
cmd: BaseCommand;
|
|
61
|
+
figmaUrl: string;
|
|
62
|
+
accessToken: string;
|
|
63
|
+
useAi: boolean;
|
|
64
|
+
}): Promise<{
|
|
65
|
+
propMappingData: PropMappingData;
|
|
66
|
+
propMappings: {
|
|
67
|
+
[filepathExport: string]: PropMapping;
|
|
68
|
+
};
|
|
69
|
+
}>;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=prop_mapping_helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prop_mapping_helpers.d.ts","sourceRoot":"","sources":["../../../src/connect/wizard/prop_mapping_helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAA;AAE1D,OAAO,EAAE,aAAa,EAA+C,MAAM,gBAAgB,CAAA;AAE3F,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAIxD,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAA;AAE/D,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,cAAc,EAAE,MAAM,GAAG;QACxB,SAAS,EAAE,sBAAsB,CAAA;QACjC,iBAAiB,EAAE,iBAAiB,CAAA;QACpC,4BAA4B,EAAE,YAAY,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAA;KACrF,CAAA;CACF,CAAA;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,2BAA2B,EAC3B,WAAW,EACX,GAAG,GACJ,EAAE;IACD,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;IACnE,WAAW,EAAE,WAAW,CAAA;IACxB,GAAG,EAAE,WAAW,CAAA;CACjB,mBA+BA;AAED,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,eAAe,YAMvE;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7D,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAAA;CACtC,CAAA;AAED,KAAK,eAAe,GAAG;IACrB,CAAC,cAAc,EAAE,MAAM,GAAG,qBAAqB,CAAA;CAChD,CAAA;AAED,KAAK,uBAAuB,GAAG;IAC7B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAClC,CAAA;AASD,wBAAgB,8BAA8B,CAC5C,eAAe,EAAE,eAAe,EAChC,uBAAuB,EAAE,uBAAuB,mBAiBjD;AA8DD,wBAAsB,wBAAwB,CAAC,EAC7C,eAAe,EACf,WAAW,EACX,QAAQ,EACR,KAAK,EACL,gBAAgB,GACjB,EAAE;IACD,eAAe,EAAE,eAAe,CAAA;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;;GAqCA;AAED;;;;;;;;;GASG;AACH,wBAAsB,sCAAsC,CAAC,EAC3D,2BAA2B,EAC3B,WAAW,EACX,GAAG,EACH,QAAQ,EACR,WAAW,EACX,KAAK,GACN,EAAE;IACD,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;IACnE,WAAW,EAAE,WAAW,CAAA;IACxB,GAAG,EAAE,WAAW,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,OAAO,CAAA;CACf;;;;;GAeA"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.extractDataAndGenerateAllPropsMappings = exports.generateAllPropsMappings = exports.buildAllEmbeddingsMatchResults = exports.getUniqueMatchableNames = exports.getPropMappingData = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const logging_1 = require("../../common/logging");
|
|
10
|
+
const helpers_1 = require("./helpers");
|
|
11
|
+
const prop_mapping_1 = require("./prop_mapping");
|
|
12
|
+
const signature_extraction_1 = require("./signature_extraction");
|
|
13
|
+
const embeddings_1 = require("./embeddings");
|
|
14
|
+
const axios_1 = require("axios");
|
|
15
|
+
/**
|
|
16
|
+
* Preprocess signatures and matchable names for all components
|
|
17
|
+
*/
|
|
18
|
+
function getPropMappingData({ filepathExportsToComponents, projectInfo, cmd, }) {
|
|
19
|
+
const propMappingData = {};
|
|
20
|
+
for (const [filepathExport, { componentPropertyDefinitions }] of Object.entries(filepathExportsToComponents)) {
|
|
21
|
+
const { filepath, exportName } = (0, helpers_1.parseFilepathExport)(filepathExport);
|
|
22
|
+
if (projectInfo.config.parser === 'react' && filepath && exportName) {
|
|
23
|
+
try {
|
|
24
|
+
const signature = (0, signature_extraction_1.extractSignature)({
|
|
25
|
+
nameToFind: exportName,
|
|
26
|
+
sourceFilePath: filepath,
|
|
27
|
+
});
|
|
28
|
+
if (cmd.verbose && Object.keys(signature).length === 0) {
|
|
29
|
+
logging_1.logger.warn(`No TS signature found for "${exportName}" in ${filepath}`);
|
|
30
|
+
}
|
|
31
|
+
propMappingData[filepathExport] = {
|
|
32
|
+
signature,
|
|
33
|
+
componentPropertyDefinitions,
|
|
34
|
+
matchableNamesMap: (0, prop_mapping_1.buildMatchableNamesMap)(componentPropertyDefinitions),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
if (cmd.verbose) {
|
|
39
|
+
logging_1.logger.warn(`Could not extract signature for "${exportName}" in ${filepath}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return propMappingData;
|
|
45
|
+
}
|
|
46
|
+
exports.getPropMappingData = getPropMappingData;
|
|
47
|
+
function getUniqueMatchableNames(propMappingData) {
|
|
48
|
+
const allNames = Object.values(propMappingData).flatMap((d) => [
|
|
49
|
+
...Object.keys(d.signature),
|
|
50
|
+
...Object.keys(d.matchableNamesMap),
|
|
51
|
+
]);
|
|
52
|
+
return Array.from(new Set(allNames));
|
|
53
|
+
}
|
|
54
|
+
exports.getUniqueMatchableNames = getUniqueMatchableNames;
|
|
55
|
+
function cosineSimilarity(a, b) {
|
|
56
|
+
const dot_product = a.reduce((acc, val, i) => acc + val * b[i], 0);
|
|
57
|
+
const magnitude_a = Math.sqrt(a.reduce((acc, val) => acc + val * val, 0));
|
|
58
|
+
const magnitude_b = Math.sqrt(b.reduce((acc, val) => acc + val * val, 0));
|
|
59
|
+
return dot_product / (magnitude_a * magnitude_b);
|
|
60
|
+
}
|
|
61
|
+
function buildAllEmbeddingsMatchResults(propMappingData, matchableNameEmbeddings) {
|
|
62
|
+
const allMatchResults = {};
|
|
63
|
+
Object.entries(propMappingData).forEach(([filepathExport, { signature, matchableNamesMap }]) => {
|
|
64
|
+
allMatchResults[filepathExport] = {};
|
|
65
|
+
Object.keys(signature).forEach((propName) => {
|
|
66
|
+
allMatchResults[filepathExport][propName] = Object.keys(matchableNamesMap)
|
|
67
|
+
.map((item) => ({
|
|
68
|
+
item,
|
|
69
|
+
score: cosineSimilarity(matchableNameEmbeddings[propName], matchableNameEmbeddings[item]),
|
|
70
|
+
}))
|
|
71
|
+
.sort((a, b) => b.score - a.score);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
return allMatchResults;
|
|
75
|
+
}
|
|
76
|
+
exports.buildAllEmbeddingsMatchResults = buildAllEmbeddingsMatchResults;
|
|
77
|
+
async function getMockEmbeddingsResponse(uniqueMatchableNames, mockResponseName) {
|
|
78
|
+
/**
|
|
79
|
+
* Refetch and write local mock responses.
|
|
80
|
+
* This should be done whenever any upstream changes are made to e.g. TS signature extraction
|
|
81
|
+
*/
|
|
82
|
+
const updateMockFiles = false;
|
|
83
|
+
// Return mock response or update local mocks
|
|
84
|
+
const mockResponsePath = mockResponseName &&
|
|
85
|
+
path_1.default.join(__dirname, `__test__/prop_mapping/test_cases/embeddings_responses/${mockResponseName}.json`);
|
|
86
|
+
if (updateMockFiles) {
|
|
87
|
+
if (!process.env.FIGMA_ACCESS_TOKEN) {
|
|
88
|
+
throw new Error('process.env.FIGMA_ACCESS_TOKEN required to fetch embeddings');
|
|
89
|
+
}
|
|
90
|
+
if (!process.env.FILE_URL) {
|
|
91
|
+
throw new Error("process.env.FILE_URL required to fetch embeddings (note: contents of file don't matter)");
|
|
92
|
+
}
|
|
93
|
+
const res = await (0, embeddings_1.fetchEmbeddings)({
|
|
94
|
+
uniqueMatchableNames,
|
|
95
|
+
accessToken: process.env.FIGMA_ACCESS_TOKEN,
|
|
96
|
+
figmaUrl: process.env.FILE_URL,
|
|
97
|
+
});
|
|
98
|
+
fs_1.default.writeFileSync(mockResponsePath, JSON.stringify(res));
|
|
99
|
+
return res;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
return JSON.parse(fs_1.default.readFileSync(mockResponsePath, 'utf-8'));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function getEmbeddingsMatchResults({ propMappingData, accessToken, figmaUrl, mockResponseName, }) {
|
|
106
|
+
const uniqueMatchableNames = getUniqueMatchableNames(propMappingData);
|
|
107
|
+
const res = mockResponseName
|
|
108
|
+
? await getMockEmbeddingsResponse(uniqueMatchableNames, mockResponseName)
|
|
109
|
+
: await (0, embeddings_1.fetchEmbeddings)({ uniqueMatchableNames, accessToken, figmaUrl });
|
|
110
|
+
const matchableNamesEmbeddings = {};
|
|
111
|
+
res?.meta.embeddings.forEach((embedding, index) => {
|
|
112
|
+
matchableNamesEmbeddings[uniqueMatchableNames[index]] = embedding;
|
|
113
|
+
});
|
|
114
|
+
return buildAllEmbeddingsMatchResults(propMappingData, matchableNamesEmbeddings);
|
|
115
|
+
}
|
|
116
|
+
async function generateAllPropsMappings({ propMappingData, accessToken, figmaUrl, useAi, mockResponseName, }) {
|
|
117
|
+
let allMatchResults = {};
|
|
118
|
+
if (useAi) {
|
|
119
|
+
try {
|
|
120
|
+
allMatchResults = await getEmbeddingsMatchResults({
|
|
121
|
+
propMappingData,
|
|
122
|
+
accessToken,
|
|
123
|
+
figmaUrl,
|
|
124
|
+
mockResponseName,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
if ((0, axios_1.isAxiosError)(e)) {
|
|
129
|
+
logging_1.logger.error(`Failed to fetch embeddings: ${e.response?.data?.message || e.response?.status}`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
logging_1.logger.error(`Failed to compute embeddings: ${e}`);
|
|
133
|
+
}
|
|
134
|
+
logging_1.logger.info('Falling back to using fuzzy matching');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const propMappings = {};
|
|
138
|
+
Object.entries(propMappingData).forEach(([filepathExport, { signature, componentPropertyDefinitions, matchableNamesMap }]) => {
|
|
139
|
+
propMappings[filepathExport] = (0, prop_mapping_1.generatePropMapping)({
|
|
140
|
+
matchableNamesMap,
|
|
141
|
+
componentPropertyDefinitions,
|
|
142
|
+
signature,
|
|
143
|
+
componentMatchResults: allMatchResults[filepathExport],
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
return propMappings;
|
|
147
|
+
}
|
|
148
|
+
exports.generateAllPropsMappings = generateAllPropsMappings;
|
|
149
|
+
/**
|
|
150
|
+
* This is the top level function that takes a map of filepathExports to components and generates prop mappings.
|
|
151
|
+
* It does the following:
|
|
152
|
+
*
|
|
153
|
+
* 1. For each component we want to match, extract their TS signature and all figma properties
|
|
154
|
+
* 2. Make an array of all strings we want embeddings for (react props, figma properties, variant values)
|
|
155
|
+
* 3. Call embeddings endpoint with above and create a map of names => embeddings
|
|
156
|
+
* 4. For each component, build a map of code props to an list of matchable names + scores, sorted by their calculated embedding distance to the code prop
|
|
157
|
+
* 5. Finally, pass those name matches and component data to the prop mapping algorithm to generate the mapping
|
|
158
|
+
*/
|
|
159
|
+
async function extractDataAndGenerateAllPropsMappings({ filepathExportsToComponents, projectInfo, cmd, figmaUrl, accessToken, useAi, }) {
|
|
160
|
+
const propMappingData = getPropMappingData({
|
|
161
|
+
filepathExportsToComponents,
|
|
162
|
+
projectInfo,
|
|
163
|
+
cmd,
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
propMappingData,
|
|
167
|
+
propMappings: await generateAllPropsMappings({
|
|
168
|
+
propMappingData,
|
|
169
|
+
accessToken,
|
|
170
|
+
figmaUrl,
|
|
171
|
+
useAi,
|
|
172
|
+
}),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
exports.extractDataAndGenerateAllPropsMappings = extractDataAndGenerateAllPropsMappings;
|
|
176
|
+
//# sourceMappingURL=prop_mapping_helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prop_mapping_helpers.js","sourceRoot":"","sources":["../../../src/connect/wizard/prop_mapping_helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAG3D,OAAO,EACL,gBAAgB,EAKhB,iBAAiB,EACjB,WAAW,EAEZ,MAAM,uBAAuB,CAAA;
|
|
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;AAG3D,OAAO,EACL,gBAAgB,EAKhB,iBAAiB,EACjB,WAAW,EAEZ,MAAM,uBAAuB,CAAA;AAyB9B,KAAK,0BAA0B,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,EAAE,CAAA;AA0JrF,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;AAySD,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,iBAsL/C"}
|