@yahoo/uds 3.113.0 → 3.114.0-beta.2
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/automated-config/dist/mapTextVariantFixtureToValue.cjs +12 -1
- package/dist/automated-config/dist/mapTextVariantFixtureToValue.js +12 -1
- package/dist/automated-config/dist/properties.cjs +1 -1
- package/dist/automated-config/dist/properties.js +1 -1
- package/dist/automated-config/dist/utils/getConfigVariantProperties.d.cts +2 -2
- package/dist/automated-config/dist/utils/getConfigVariantProperties.d.ts +2 -2
- package/dist/cli/commands/sync.cjs +1 -3
- package/dist/cli/commands/sync.d.cts +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.js +1 -3
- package/dist/cli/commands/version.cjs +0 -2
- package/dist/cli/commands/version.d.cts +1 -1
- package/dist/cli/commands/version.d.ts +1 -1
- package/dist/cli/commands/version.js +0 -2
- package/dist/cli/dist/cli.cjs +1 -1
- package/dist/cli/dist/cli.js +1 -1
- package/dist/cli/dist/commands/editor-rules.cjs +2 -2
- package/dist/cli/dist/commands/editor-rules.js +2 -2
- package/dist/cli/dist/lib/logger.cjs +66 -0
- package/dist/cli/dist/lib/logger.js +66 -0
- package/dist/cli/dist/utils/rules/config.cjs +1 -1
- package/dist/cli/dist/utils/rules/config.js +1 -1
- package/dist/cli/runner.cjs +11 -2
- package/dist/cli/runner.js +11 -2
- package/dist/components/client/Menu/Menu.ItemCheckbox.d.cts +1 -1
- package/dist/components/client/Menu/Menu.ItemCheckbox.d.ts +1 -1
- package/dist/index.cjs +2 -0
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -1
- package/dist/styles/styler.d.cts +41 -41
- package/dist/styles/styler.d.ts +41 -41
- package/dist/styles/variants.cjs +278 -278
- package/dist/styles/variants.js +278 -278
- package/dist/tailwind/dist/commands/css.cjs +79 -0
- package/dist/tailwind/dist/commands/css.d.ts +3 -0
- package/dist/tailwind/dist/commands/css.helpers.cjs +32 -0
- package/dist/tailwind/dist/commands/css.helpers.js +28 -0
- package/dist/tailwind/dist/commands/css.js +79 -0
- package/dist/tailwind/dist/commands/generateComponentData.cjs +33 -31
- package/dist/tailwind/dist/commands/generateComponentData.d.ts +1 -1
- package/dist/tailwind/dist/commands/generateComponentData.js +33 -31
- package/dist/tailwind/dist/commands/generatePurgeCSSData.d.ts +1 -1
- package/dist/tailwind/dist/commands/purge.cjs +3 -4
- package/dist/tailwind/dist/commands/purge.d.ts +1 -1
- package/dist/tailwind/dist/commands/purge.js +3 -4
- package/dist/tailwind/dist/css/generate.cjs +120 -0
- package/dist/tailwind/dist/css/generate.d.cts +30 -0
- package/dist/tailwind/dist/css/generate.d.ts +31 -0
- package/dist/tailwind/dist/css/generate.helpers.cjs +112 -0
- package/dist/tailwind/dist/css/generate.helpers.js +100 -0
- package/dist/tailwind/dist/css/generate.js +115 -0
- package/dist/tailwind/dist/css/postcss.cjs +35 -0
- package/dist/tailwind/dist/css/postcss.helpers.cjs +27 -0
- package/dist/tailwind/dist/css/postcss.helpers.js +26 -0
- package/dist/tailwind/dist/css/postcss.js +35 -0
- package/dist/tailwind/dist/css/runner.cjs +278 -0
- package/dist/tailwind/dist/css/runner.helpers.cjs +26 -0
- package/dist/tailwind/dist/css/runner.helpers.js +23 -0
- package/dist/tailwind/dist/css/runner.js +275 -0
- package/dist/tailwind/dist/css/theme.cjs +12 -0
- package/dist/tailwind/dist/css/theme.d.cts +66 -0
- package/dist/tailwind/dist/css/theme.d.ts +66 -0
- package/dist/tailwind/dist/css/theme.js +11 -0
- package/dist/tailwind/dist/css/utils.cjs +234 -0
- package/dist/tailwind/dist/css/utils.js +223 -0
- package/dist/tailwind/dist/index.d.cts +1 -0
- package/dist/tailwind/dist/index.d.ts +5 -3
- package/dist/tailwind/dist/purger/legacy/purgeCSS.cjs +4 -3
- package/dist/tailwind/dist/purger/legacy/purgeCSS.js +4 -3
- package/dist/tailwind/dist/purger/optimized/ast/expressions.cjs +122 -125
- package/dist/tailwind/dist/purger/optimized/ast/expressions.js +122 -125
- package/dist/tailwind/dist/purger/optimized/ast/jsx.cjs +1 -8
- package/dist/tailwind/dist/purger/optimized/ast/jsx.js +1 -8
- package/dist/tailwind/dist/purger/optimized/purge.cjs +11 -10
- package/dist/tailwind/dist/purger/optimized/purge.js +10 -9
- package/dist/tailwind/dist/purger/optimized/purgeFromCode.cjs +232 -127
- package/dist/tailwind/dist/purger/optimized/purgeFromCode.js +232 -127
- package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.cjs +330 -262
- package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.js +329 -262
- package/dist/tailwind/dist/purger/optimized/utils/files.cjs +4 -3
- package/dist/tailwind/dist/purger/optimized/utils/files.js +4 -3
- package/dist/tailwind/dist/purger/optimized/utils/safelist.cjs +13 -21
- package/dist/tailwind/dist/purger/optimized/utils/safelist.js +13 -21
- package/dist/tailwind/dist/tailwind/plugins/typography.cjs +41 -13
- package/dist/tailwind/dist/tailwind/plugins/typography.js +41 -13
- package/dist/tailwind/dist/tailwind/utils/composeTailwindPlugins.cjs +4 -2
- package/dist/tailwind/dist/tailwind/utils/composeTailwindPlugins.d.cts +10 -1
- package/dist/tailwind/dist/tailwind/utils/composeTailwindPlugins.d.ts +10 -1
- package/dist/tailwind/dist/tailwind/utils/composeTailwindPlugins.js +4 -2
- package/dist/tailwind/dist/tailwind/utils/getFontStyles.d.cts +1 -1
- package/dist/tailwind/dist/tailwind/utils/getFontStyles.d.ts +1 -1
- package/dist/tailwind/dist/utils/optimizeCSS.cjs +405 -0
- package/dist/tailwind/dist/utils/optimizeCSS.js +403 -0
- package/dist/tailwind/dist/utils/postcssPreserveVars.cjs +67 -0
- package/dist/tailwind/dist/utils/postcssPreserveVars.js +65 -0
- package/dist/tailwind/dist/utils/tsMorph.cjs +1 -1
- package/dist/uds/generated/componentData.cjs +943 -928
- package/dist/uds/generated/componentData.js +943 -928
- package/dist/uds/package.cjs +10 -4
- package/dist/uds/package.js +10 -4
- package/generated/componentData.json +2397 -0
- package/generated/tailwindPurge.ts +4560 -0
- package/package.json +7 -4
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/*! © 2026 Yahoo, Inc. UDS v0.0.0-development */
|
|
2
2
|
import { SPRING_MOTION_DEFAULTS } from "../../../../../motion-tokens/dist/index.js";
|
|
3
|
-
import path from "node:path";
|
|
4
3
|
import { Node, SyntaxKind } from "ts-morph";
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import fg from "fast-glob";
|
|
5
7
|
|
|
6
8
|
//#region ../tailwind/dist/purger/optimized/utils/componentAnalyzer.js
|
|
7
9
|
/*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
|
|
@@ -13,27 +15,31 @@ let knownComponents = null;
|
|
|
13
15
|
* Map of component name -> file path
|
|
14
16
|
*/
|
|
15
17
|
let componentPaths = null;
|
|
18
|
+
let scannedComponentsDir = null;
|
|
19
|
+
const scanComponentFilePaths = async (componentsDir) => fg("**/*.tsx", {
|
|
20
|
+
cwd: componentsDir,
|
|
21
|
+
absolute: true
|
|
22
|
+
});
|
|
16
23
|
/**
|
|
17
24
|
* Scan src/components to build a map of all component files
|
|
18
25
|
*/
|
|
19
|
-
async
|
|
20
|
-
if (componentPaths) return componentPaths;
|
|
26
|
+
const scanComponentFiles = async (componentsDir) => {
|
|
27
|
+
if (componentPaths && scannedComponentsDir === componentsDir) return componentPaths;
|
|
21
28
|
componentPaths = /* @__PURE__ */ new Map();
|
|
22
29
|
knownComponents = /* @__PURE__ */ new Set();
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if (file.includes(".test.") || file.endsWith("index.tsx")) continue;
|
|
30
|
+
scannedComponentsDir = componentsDir;
|
|
31
|
+
const nextComponentPaths = componentPaths;
|
|
32
|
+
const nextKnownComponents = knownComponents;
|
|
33
|
+
(await scanComponentFilePaths(componentsDir)).forEach((file) => {
|
|
34
|
+
if (file.includes(".test.") || file.endsWith("index.tsx")) return;
|
|
29
35
|
const fileName = path.basename(file, ".tsx");
|
|
30
36
|
if (/^[A-Z]/.test(fileName)) {
|
|
31
|
-
|
|
32
|
-
|
|
37
|
+
nextComponentPaths.set(fileName, file);
|
|
38
|
+
nextKnownComponents.add(fileName);
|
|
33
39
|
}
|
|
34
|
-
}
|
|
35
|
-
return
|
|
36
|
-
}
|
|
40
|
+
});
|
|
41
|
+
return nextComponentPaths;
|
|
42
|
+
};
|
|
37
43
|
/**
|
|
38
44
|
* Analyze an object literal for variant key mappings.
|
|
39
45
|
* Handles:
|
|
@@ -41,60 +47,64 @@ async function scanComponentFiles(componentsDir) {
|
|
|
41
47
|
* - Nullish coalescing: { fontSize: fontSize ?? variant } -> variant maps to fontSize
|
|
42
48
|
* - Conditional spreads: ...(condition ? { props } : {}) -> recursively analyze props
|
|
43
49
|
*/
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (initializer && Node.isStringLiteral(initializer)) getStylesLiterals.set(variantKey, initializer.getLiteralValue());
|
|
50
|
-
if (initializer && Node.isIdentifier(initializer)) {
|
|
51
|
-
const propName = initializer.getText();
|
|
52
|
-
const existing = propToVariantKeys.get(propName) ?? [];
|
|
53
|
-
if (!existing.includes(variantKey)) {
|
|
54
|
-
existing.push(variantKey);
|
|
55
|
-
propToVariantKeys.set(propName, existing);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (initializer && Node.isBinaryExpression(initializer)) {
|
|
59
|
-
const operatorToken = initializer.getOperatorToken();
|
|
60
|
-
if (operatorToken.getKind() === SyntaxKind.QuestionQuestionToken || operatorToken.getKind() === SyntaxKind.BarBarToken) {
|
|
61
|
-
const rightSide = initializer.getRight();
|
|
62
|
-
if (Node.isIdentifier(rightSide)) {
|
|
63
|
-
const fallbackPropName = rightSide.getText();
|
|
64
|
-
const existing = propToVariantKeys.get(fallbackPropName) ?? [];
|
|
65
|
-
if (!existing.includes(variantKey)) {
|
|
66
|
-
existing.push(variantKey);
|
|
67
|
-
propToVariantKeys.set(fallbackPropName, existing);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
50
|
+
const analyzeObjectForVariantMappings = (objLiteral, styleProps, getStylesLiterals, propToVariantKeys, sourceFile) => {
|
|
51
|
+
objLiteral.getProperties().forEach((prop) => {
|
|
52
|
+
if (Node.isPropertyAssignment(prop)) {
|
|
53
|
+
analyzeVariantPropertyAssignment(prop, styleProps, getStylesLiterals, propToVariantKeys);
|
|
54
|
+
return;
|
|
71
55
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
56
|
+
if (Node.isSpreadAssignment(prop)) analyzeVariantSpreadAssignment(prop, styleProps, getStylesLiterals, propToVariantKeys, sourceFile);
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
const addStyleProp = (styleProps, variantKey) => {
|
|
60
|
+
if (!styleProps.includes(variantKey)) styleProps.push(variantKey);
|
|
61
|
+
};
|
|
62
|
+
const addPropToVariantKeyMapping = (propToVariantKeys, propName, variantKey) => {
|
|
63
|
+
const existing = propToVariantKeys.get(propName) ?? [];
|
|
64
|
+
if (!existing.includes(variantKey)) propToVariantKeys.set(propName, [...existing, variantKey]);
|
|
65
|
+
};
|
|
66
|
+
const extractFallbackIdentifier = (initializer) => {
|
|
67
|
+
if (!Node.isBinaryExpression(initializer)) return null;
|
|
68
|
+
const operatorKind = initializer.getOperatorToken().getKind();
|
|
69
|
+
if (!(operatorKind === SyntaxKind.QuestionQuestionToken || operatorKind === SyntaxKind.BarBarToken) || !Node.isIdentifier(initializer.getRight())) return null;
|
|
70
|
+
return initializer.getRight().getText();
|
|
71
|
+
};
|
|
72
|
+
const analyzeVariantPropertyAssignment = (prop, styleProps, getStylesLiterals, propToVariantKeys) => {
|
|
73
|
+
const variantKey = prop.getName();
|
|
74
|
+
addStyleProp(styleProps, variantKey);
|
|
75
|
+
const initializer = prop.getInitializer();
|
|
76
|
+
if (!initializer) return;
|
|
77
|
+
if (Node.isStringLiteral(initializer)) getStylesLiterals.set(variantKey, initializer.getLiteralValue());
|
|
78
|
+
if (Node.isIdentifier(initializer)) addPropToVariantKeyMapping(propToVariantKeys, initializer.getText(), variantKey);
|
|
79
|
+
const fallbackIdentifier = extractFallbackIdentifier(initializer);
|
|
80
|
+
if (fallbackIdentifier) addPropToVariantKeyMapping(propToVariantKeys, fallbackIdentifier, variantKey);
|
|
81
|
+
};
|
|
82
|
+
const findVariableObjectLiteral = (sourceFile, variableName) => {
|
|
83
|
+
const initializer = sourceFile.getDescendantsOfKind(SyntaxKind.VariableDeclaration).find((candidate) => candidate.getName() === variableName)?.getInitializer();
|
|
84
|
+
return initializer && Node.isObjectLiteralExpression(initializer) ? initializer : null;
|
|
85
|
+
};
|
|
86
|
+
const analyzeVariantSpreadAssignment = (prop, styleProps, getStylesLiterals, propToVariantKeys, sourceFile) => {
|
|
87
|
+
const spreadExpr = prop.getExpression();
|
|
88
|
+
if (Node.isParenthesizedExpression(spreadExpr)) {
|
|
89
|
+
const conditionalExpr = spreadExpr.getExpression();
|
|
90
|
+
if (Node.isConditionalExpression(conditionalExpr)) {
|
|
91
|
+
const whenTrue = conditionalExpr.getWhenTrue();
|
|
92
|
+
if (!Node.isObjectLiteralExpression(whenTrue)) return;
|
|
93
|
+
analyzeObjectForVariantMappings(whenTrue, styleProps, getStylesLiterals, propToVariantKeys, sourceFile);
|
|
88
94
|
}
|
|
89
95
|
}
|
|
90
|
-
|
|
96
|
+
if (Node.isIdentifier(spreadExpr)) {
|
|
97
|
+
const objectLiteral = findVariableObjectLiteral(sourceFile, spreadExpr.getText());
|
|
98
|
+
if (objectLiteral) analyzeObjectForVariantMappings(objectLiteral, styleProps, getStylesLiterals, propToVariantKeys, sourceFile);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
91
101
|
/**
|
|
92
102
|
* Analyzes a UDS component file to extract:
|
|
93
103
|
* 1. Default prop values (e.g., display = 'flex')
|
|
94
104
|
* 2. Props passed to getStyles()
|
|
95
105
|
* 3. Internal UDS component usage
|
|
96
106
|
*/
|
|
97
|
-
|
|
107
|
+
const analyzeComponent = (project, componentPath) => {
|
|
98
108
|
const sourceFile = project.getSourceFile(componentPath);
|
|
99
109
|
if (!sourceFile) return null;
|
|
100
110
|
const componentName = path.basename(componentPath, ".tsx");
|
|
@@ -106,98 +116,9 @@ function analyzeComponent(project, componentPath) {
|
|
|
106
116
|
const internalComponents = [];
|
|
107
117
|
const internalComponentProps = /* @__PURE__ */ new Map();
|
|
108
118
|
const propToVariantKeys = /* @__PURE__ */ new Map();
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
})];
|
|
113
|
-
for (const fn of functions) {
|
|
114
|
-
if (Node.isVariableDeclaration(fn)) {
|
|
115
|
-
const init = fn.getInitializer();
|
|
116
|
-
if (!init) continue;
|
|
117
|
-
if (Node.isCallExpression(init)) {
|
|
118
|
-
const args = init.getArguments();
|
|
119
|
-
for (const arg of args) if (Node.isFunctionExpression(arg) || Node.isArrowFunction(arg)) {
|
|
120
|
-
extractDefaultsFromFunction(arg, defaultProps);
|
|
121
|
-
extractAllPropNames(arg, componentPropNames);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
if (Node.isArrowFunction(init)) {
|
|
125
|
-
extractDefaultsFromFunction(init, defaultProps);
|
|
126
|
-
extractAllPropNames(init, componentPropNames);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
if (Node.isFunctionDeclaration(fn)) {
|
|
130
|
-
extractDefaultsFromFunction(fn, defaultProps);
|
|
131
|
-
extractAllPropNames(fn, componentPropNames);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
const getStylesCalls = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression).filter((call) => call.getExpression().getText() === "getStyles");
|
|
135
|
-
for (const call of getStylesCalls) {
|
|
136
|
-
const args = call.getArguments();
|
|
137
|
-
if (args.length > 0 && Node.isObjectLiteralExpression(args[0])) {
|
|
138
|
-
const objLiteral = args[0];
|
|
139
|
-
for (const prop of objLiteral.getProperties()) if (Node.isPropertyAssignment(prop)) {
|
|
140
|
-
const variantKey = prop.getName();
|
|
141
|
-
if (variantKey && !styleProps.includes(variantKey)) styleProps.push(variantKey);
|
|
142
|
-
const initializer = prop.getInitializer();
|
|
143
|
-
if (initializer && Node.isStringLiteral(initializer)) getStylesLiterals.set(variantKey, initializer.getLiteralValue());
|
|
144
|
-
if (initializer && Node.isIdentifier(initializer)) {
|
|
145
|
-
const propName = initializer.getText();
|
|
146
|
-
const existing = propToVariantKeys.get(propName) ?? [];
|
|
147
|
-
if (!existing.includes(variantKey)) {
|
|
148
|
-
existing.push(variantKey);
|
|
149
|
-
propToVariantKeys.set(propName, existing);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
if (initializer && Node.isBinaryExpression(initializer)) {
|
|
153
|
-
const operatorToken = initializer.getOperatorToken();
|
|
154
|
-
if (operatorToken.getKind() === SyntaxKind.QuestionQuestionToken || operatorToken.getKind() === SyntaxKind.BarBarToken) {
|
|
155
|
-
const rightSide = initializer.getRight();
|
|
156
|
-
if (Node.isIdentifier(rightSide)) {
|
|
157
|
-
const fallbackPropName = rightSide.getText();
|
|
158
|
-
const existing = propToVariantKeys.get(fallbackPropName) ?? [];
|
|
159
|
-
if (!existing.includes(variantKey)) {
|
|
160
|
-
existing.push(variantKey);
|
|
161
|
-
propToVariantKeys.set(fallbackPropName, existing);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
if (initializer && Node.isConditionalExpression(initializer)) {
|
|
167
|
-
const whenTrue = initializer.getWhenTrue();
|
|
168
|
-
const whenFalse = initializer.getWhenFalse();
|
|
169
|
-
const extractLiterals = (node) => {
|
|
170
|
-
const literals = [];
|
|
171
|
-
if (Node.isStringLiteral(node)) literals.push(node.getLiteralValue());
|
|
172
|
-
else if (Node.isConditionalExpression(node)) {
|
|
173
|
-
literals.push(...extractLiterals(node.getWhenTrue()));
|
|
174
|
-
literals.push(...extractLiterals(node.getWhenFalse()));
|
|
175
|
-
}
|
|
176
|
-
return literals;
|
|
177
|
-
};
|
|
178
|
-
[...extractLiterals(whenTrue), ...extractLiterals(whenFalse)].forEach((value, index) => {
|
|
179
|
-
const literalKey = index === 0 ? variantKey : `${variantKey}:${index}`;
|
|
180
|
-
getStylesLiterals.set(literalKey, value);
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
} else if (Node.isShorthandPropertyAssignment(prop)) {
|
|
184
|
-
const propName = prop.getName();
|
|
185
|
-
if (propName && !styleProps.includes(propName)) styleProps.push(propName);
|
|
186
|
-
} else if (Node.isSpreadAssignment(prop)) {
|
|
187
|
-
const spreadExpr = prop.getExpression();
|
|
188
|
-
if (Node.isIdentifier(spreadExpr)) {
|
|
189
|
-
const varName = spreadExpr.getText();
|
|
190
|
-
const varDecl = sourceFile.getDescendantsOfKind(SyntaxKind.VariableDeclaration).find((v) => v.getName() === varName);
|
|
191
|
-
if (varDecl) {
|
|
192
|
-
const varInit = varDecl.getInitializer();
|
|
193
|
-
if (varInit && Node.isObjectLiteralExpression(varInit)) analyzeObjectForVariantMappings(varInit, styleProps, getStylesLiterals, propToVariantKeys, sourceFile);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
const cxCalls = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression).filter((call) => call.getExpression().getText() === "cx");
|
|
200
|
-
for (const call of cxCalls) for (const arg of call.getArguments()) extractCxStringLiterals(arg, cxLiterals);
|
|
119
|
+
collectComponentDefaultsAndProps(sourceFile, defaultProps, componentPropNames);
|
|
120
|
+
collectGetStylesMetadata(sourceFile, styleProps, getStylesLiterals, propToVariantKeys);
|
|
121
|
+
collectCxLiterals(sourceFile, cxLiterals);
|
|
201
122
|
extractInternalComponents(sourceFile, internalComponents, internalComponentProps, propToVariantKeys, componentPropNames);
|
|
202
123
|
return {
|
|
203
124
|
name: componentName,
|
|
@@ -211,96 +132,194 @@ function analyzeComponent(project, componentPath) {
|
|
|
211
132
|
propToVariantKeys,
|
|
212
133
|
motionVarPrefixes: extractMotionVarPrefixes(sourceFile)
|
|
213
134
|
};
|
|
214
|
-
}
|
|
135
|
+
};
|
|
136
|
+
const getComponentFunctionNodes = (sourceFile) => [...sourceFile.getFunctions(), ...sourceFile.getVariableDeclarations().filter((declaration) => {
|
|
137
|
+
const initializer = declaration.getInitializer();
|
|
138
|
+
return initializer && (Node.isArrowFunction(initializer) || Node.isCallExpression(initializer));
|
|
139
|
+
})];
|
|
140
|
+
const collectComponentDefaultsAndProps = (sourceFile, defaultProps, componentPropNames) => {
|
|
141
|
+
getComponentFunctionNodes(sourceFile).forEach((fn) => {
|
|
142
|
+
if (Node.isFunctionDeclaration(fn)) {
|
|
143
|
+
extractDefaultsFromFunction(fn, defaultProps);
|
|
144
|
+
extractAllPropNames(fn, componentPropNames);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (!Node.isVariableDeclaration(fn)) return;
|
|
148
|
+
const initializer = fn.getInitializer();
|
|
149
|
+
if (!initializer) return;
|
|
150
|
+
if (Node.isCallExpression(initializer)) initializer.getArguments().forEach((arg) => {
|
|
151
|
+
if (Node.isFunctionExpression(arg) || Node.isArrowFunction(arg)) {
|
|
152
|
+
extractDefaultsFromFunction(arg, defaultProps);
|
|
153
|
+
extractAllPropNames(arg, componentPropNames);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
if (Node.isArrowFunction(initializer)) {
|
|
157
|
+
extractDefaultsFromFunction(initializer, defaultProps);
|
|
158
|
+
extractAllPropNames(initializer, componentPropNames);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
const extractConditionalStringLiterals = (node) => {
|
|
163
|
+
if (Node.isStringLiteral(node)) return [node.getLiteralValue()];
|
|
164
|
+
if (Node.isConditionalExpression(node)) return [...extractConditionalStringLiterals(node.getWhenTrue()), ...extractConditionalStringLiterals(node.getWhenFalse())];
|
|
165
|
+
return [];
|
|
166
|
+
};
|
|
167
|
+
const storeVariantLiteralValues = (variantKey, literalValues, getStylesLiterals) => {
|
|
168
|
+
literalValues.forEach((value, index) => {
|
|
169
|
+
const literalKey = index === 0 ? variantKey : `${variantKey}:${index}`;
|
|
170
|
+
getStylesLiterals.set(literalKey, value);
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
const handleGetStylesPropertyAssignment = (prop, styleProps, getStylesLiterals, propToVariantKeys) => {
|
|
174
|
+
const variantKey = prop.getName();
|
|
175
|
+
addStyleProp(styleProps, variantKey);
|
|
176
|
+
const initializer = prop.getInitializer();
|
|
177
|
+
if (!initializer) return;
|
|
178
|
+
if (Node.isStringLiteral(initializer)) getStylesLiterals.set(variantKey, initializer.getLiteralValue());
|
|
179
|
+
if (Node.isIdentifier(initializer)) addPropToVariantKeyMapping(propToVariantKeys, initializer.getText(), variantKey);
|
|
180
|
+
const fallbackIdentifier = extractFallbackIdentifier(initializer);
|
|
181
|
+
if (fallbackIdentifier) addPropToVariantKeyMapping(propToVariantKeys, fallbackIdentifier, variantKey);
|
|
182
|
+
if (Node.isConditionalExpression(initializer)) storeVariantLiteralValues(variantKey, [...extractConditionalStringLiterals(initializer.getWhenTrue()), ...extractConditionalStringLiterals(initializer.getWhenFalse())], getStylesLiterals);
|
|
183
|
+
};
|
|
184
|
+
const handleGetStylesObjectProperty = (prop, styleProps, getStylesLiterals, propToVariantKeys, sourceFile) => {
|
|
185
|
+
if (Node.isPropertyAssignment(prop)) {
|
|
186
|
+
handleGetStylesPropertyAssignment(prop, styleProps, getStylesLiterals, propToVariantKeys);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (Node.isShorthandPropertyAssignment(prop)) {
|
|
190
|
+
addStyleProp(styleProps, prop.getName());
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (Node.isSpreadAssignment(prop) && Node.isIdentifier(prop.getExpression())) {
|
|
194
|
+
const objectLiteral = findVariableObjectLiteral(sourceFile, prop.getExpression().getText());
|
|
195
|
+
if (objectLiteral) analyzeObjectForVariantMappings(objectLiteral, styleProps, getStylesLiterals, propToVariantKeys, sourceFile);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
const collectGetStylesMetadata = (sourceFile, styleProps, getStylesLiterals, propToVariantKeys) => {
|
|
199
|
+
sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression).filter((call) => call.getExpression().getText() === "getStyles").forEach((call) => {
|
|
200
|
+
const args = call.getArguments();
|
|
201
|
+
if (args.length === 0 || !Node.isObjectLiteralExpression(args[0])) return;
|
|
202
|
+
args[0].getProperties().forEach((prop) => {
|
|
203
|
+
handleGetStylesObjectProperty(prop, styleProps, getStylesLiterals, propToVariantKeys, sourceFile);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
};
|
|
207
|
+
const collectCxLiterals = (sourceFile, cxLiterals) => {
|
|
208
|
+
sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression).filter((call) => call.getExpression().getText() === "cx").forEach((call) => {
|
|
209
|
+
call.getArguments().forEach((arg) => extractCxStringLiterals(arg, cxLiterals));
|
|
210
|
+
});
|
|
211
|
+
};
|
|
215
212
|
/**
|
|
216
213
|
* Extract UDS components used internally in the file and their prop values.
|
|
217
214
|
* Also detects prop aliasing (e.g., columnGap={gap} means gap -> columnGap).
|
|
218
215
|
*/
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
216
|
+
const extractInternalComponents = (sourceFile, internalComponents, internalComponentProps, propToVariantKeys, componentProps) => {
|
|
217
|
+
collectImportedInternalComponents(sourceFile, internalComponents);
|
|
218
|
+
collectInternalComponentUsages(sourceFile, internalComponents, internalComponentProps, propToVariantKeys, componentProps);
|
|
219
|
+
};
|
|
220
|
+
const isInternalUdsModule = (moduleSpec) => {
|
|
221
|
+
return (moduleSpec.startsWith("@yahoo/uds") || moduleSpec.startsWith("../") || moduleSpec.startsWith("./")) && (moduleSpec.includes("/components/") || moduleSpec === "@yahoo/uds");
|
|
222
|
+
};
|
|
223
|
+
const pushUniqueComponentName = (components, name) => {
|
|
224
|
+
if (/^[A-Z]/.test(name) && !components.includes(name)) components.push(name);
|
|
225
|
+
};
|
|
226
|
+
const collectImportedInternalComponents = (sourceFile, internalComponents) => {
|
|
227
|
+
sourceFile.getImportDeclarations().forEach((importDecl) => {
|
|
228
|
+
if (!isInternalUdsModule(importDecl.getModuleSpecifierValue())) return;
|
|
229
|
+
importDecl.getNamedImports().forEach((namedImport) => pushUniqueComponentName(internalComponents, namedImport.getName()));
|
|
230
|
+
});
|
|
231
|
+
};
|
|
232
|
+
const getOrCreateComponentPropsMap = (internalComponentProps, componentName) => {
|
|
233
|
+
const existing = internalComponentProps.get(componentName);
|
|
234
|
+
if (existing) return existing;
|
|
235
|
+
const created = /* @__PURE__ */ new Map();
|
|
236
|
+
internalComponentProps.set(componentName, created);
|
|
237
|
+
return created;
|
|
238
|
+
};
|
|
239
|
+
const extractJsxAttributeLiteralValues = (attr, componentProps, propToVariantKeys) => {
|
|
240
|
+
if (!Node.isJsxAttribute(attr)) return null;
|
|
241
|
+
const propName = attr.getNameNode().getText();
|
|
242
|
+
const initializer = attr.getInitializer();
|
|
243
|
+
if (!initializer) return {
|
|
244
|
+
propName,
|
|
245
|
+
values: []
|
|
246
|
+
};
|
|
247
|
+
if (Node.isStringLiteral(initializer)) return {
|
|
248
|
+
propName,
|
|
249
|
+
values: [initializer.getLiteralValue()]
|
|
250
|
+
};
|
|
251
|
+
if (!Node.isJsxExpression(initializer)) return {
|
|
252
|
+
propName,
|
|
253
|
+
values: []
|
|
254
|
+
};
|
|
255
|
+
const expr = initializer.getExpression();
|
|
256
|
+
if (expr && Node.isStringLiteral(expr)) return {
|
|
257
|
+
propName,
|
|
258
|
+
values: [expr.getLiteralValue()]
|
|
259
|
+
};
|
|
260
|
+
if (expr && Node.isIdentifier(expr)) {
|
|
261
|
+
const identifierName = expr.getText();
|
|
262
|
+
if (componentProps.has(identifierName) && identifierName !== propName) addPropToVariantKeyMapping(propToVariantKeys, identifierName, propName);
|
|
228
263
|
}
|
|
229
|
-
|
|
230
|
-
|
|
264
|
+
return {
|
|
265
|
+
propName,
|
|
266
|
+
values: []
|
|
267
|
+
};
|
|
268
|
+
};
|
|
269
|
+
const collectInternalComponentUsages = (sourceFile, internalComponents, internalComponentProps, propToVariantKeys, componentProps) => {
|
|
270
|
+
[...sourceFile.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement), ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxOpeningElement)].forEach((element) => {
|
|
231
271
|
const tagName = element.getTagNameNode().getText();
|
|
232
|
-
if (!/^[A-Z]/.test(tagName))
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
const
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
else if (expr && Node.isIdentifier(expr)) {
|
|
245
|
-
const identifierName = expr.getText();
|
|
246
|
-
if (componentProps.has(identifierName) && identifierName !== propName) {
|
|
247
|
-
const existing = propToVariantKeys.get(identifierName) ?? [];
|
|
248
|
-
if (!existing.includes(propName)) {
|
|
249
|
-
existing.push(propName);
|
|
250
|
-
propToVariantKeys.set(identifierName, existing);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
if (values.length > 0) {
|
|
257
|
-
let componentPropsMap = internalComponentProps.get(tagName);
|
|
258
|
-
if (!componentPropsMap) {
|
|
259
|
-
componentPropsMap = /* @__PURE__ */ new Map();
|
|
260
|
-
internalComponentProps.set(tagName, componentPropsMap);
|
|
261
|
-
}
|
|
262
|
-
const existingValues = componentPropsMap.get(propName) ?? [];
|
|
263
|
-
for (const v of values) if (!existingValues.includes(v)) existingValues.push(v);
|
|
264
|
-
componentPropsMap.set(propName, existingValues);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
272
|
+
if (!/^[A-Z]/.test(tagName)) return;
|
|
273
|
+
pushUniqueComponentName(internalComponents, tagName);
|
|
274
|
+
element.getAttributes().forEach((attr) => {
|
|
275
|
+
const extracted = extractJsxAttributeLiteralValues(attr, componentProps, propToVariantKeys);
|
|
276
|
+
if (!extracted || extracted.values.length === 0) return;
|
|
277
|
+
const componentPropsMap = getOrCreateComponentPropsMap(internalComponentProps, tagName);
|
|
278
|
+
const existingValues = componentPropsMap.get(extracted.propName) ?? [];
|
|
279
|
+
const mergedValues = [...new Set([...existingValues, ...extracted.values])];
|
|
280
|
+
componentPropsMap.set(extracted.propName, mergedValues);
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
};
|
|
269
284
|
/**
|
|
270
285
|
* Extract default prop values from a function's parameter destructuring
|
|
271
286
|
*/
|
|
272
|
-
|
|
287
|
+
const extractDefaultsFromFunction = (fn, defaults) => {
|
|
273
288
|
let params = [];
|
|
274
289
|
if (Node.isFunctionDeclaration(fn) || Node.isFunctionExpression(fn)) params = fn.getParameters();
|
|
275
290
|
else if (Node.isArrowFunction(fn)) params = fn.getParameters();
|
|
276
|
-
|
|
277
|
-
if (!Node.isParameterDeclaration(param))
|
|
291
|
+
params.forEach((param) => {
|
|
292
|
+
if (!Node.isParameterDeclaration(param)) return;
|
|
278
293
|
const nameNode = param.getNameNode();
|
|
279
|
-
if (!nameNode || !Node.isObjectBindingPattern(nameNode))
|
|
280
|
-
|
|
294
|
+
if (!nameNode || !Node.isObjectBindingPattern(nameNode)) return;
|
|
295
|
+
nameNode.getElements().forEach((element) => {
|
|
281
296
|
const propName = element.getPropertyNameNode()?.getText() || element.getName();
|
|
282
297
|
const initializer = element.getInitializer();
|
|
283
298
|
if (initializer && Node.isStringLiteral(initializer)) defaults.set(propName, initializer.getLiteralValue());
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
299
|
+
else if (initializer && Node.isIdentifier(initializer)) {
|
|
300
|
+
const resolved = resolveIdentifierToStringLiteral(initializer);
|
|
301
|
+
if (resolved) defaults.set(propName, resolved);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
};
|
|
287
306
|
/**
|
|
288
307
|
* Extract ALL prop names from a function's parameter destructuring (not just defaults)
|
|
289
308
|
*/
|
|
290
|
-
|
|
309
|
+
const extractAllPropNames = (fn, propNames) => {
|
|
291
310
|
let params = [];
|
|
292
311
|
if (Node.isFunctionDeclaration(fn) || Node.isFunctionExpression(fn)) params = fn.getParameters();
|
|
293
312
|
else if (Node.isArrowFunction(fn)) params = fn.getParameters();
|
|
294
|
-
|
|
295
|
-
if (!Node.isParameterDeclaration(param))
|
|
313
|
+
params.forEach((param) => {
|
|
314
|
+
if (!Node.isParameterDeclaration(param)) return;
|
|
296
315
|
const nameNode = param.getNameNode();
|
|
297
|
-
if (!nameNode || !Node.isObjectBindingPattern(nameNode))
|
|
298
|
-
|
|
316
|
+
if (!nameNode || !Node.isObjectBindingPattern(nameNode)) return;
|
|
317
|
+
nameNode.getElements().forEach((element) => {
|
|
299
318
|
const propName = element.getPropertyNameNode()?.getText() || element.getName();
|
|
300
319
|
propNames.add(propName);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
};
|
|
304
323
|
/**
|
|
305
324
|
* Extract string literals from cx() call arguments.
|
|
306
325
|
* Handles:
|
|
@@ -308,22 +327,25 @@ function extractAllPropNames(fn, propNames) {
|
|
|
308
327
|
* - Object keys: cx({ 'class1': condition, 'class2': true })
|
|
309
328
|
* - Nested calls and arrays
|
|
310
329
|
*/
|
|
311
|
-
|
|
312
|
-
if (Node.isStringLiteral(node)) {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
330
|
+
const extractCxStringLiterals = (node, literals) => {
|
|
331
|
+
if (Node.isStringLiteral(node)) node.getLiteralValue().split(/\s+/).filter(Boolean).forEach((cls) => {
|
|
332
|
+
if (!literals.includes(cls)) literals.push(cls);
|
|
333
|
+
});
|
|
334
|
+
else if (Node.isObjectLiteralExpression(node)) node.getProperties().forEach((prop) => {
|
|
335
|
+
if (Node.isPropertyAssignment(prop)) {
|
|
317
336
|
const nameNode = prop.getNameNode();
|
|
318
|
-
if (Node.isStringLiteral(nameNode)) {
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
337
|
+
if (Node.isStringLiteral(nameNode)) nameNode.getLiteralValue().split(/\s+/).filter(Boolean).forEach((cls) => {
|
|
338
|
+
if (!literals.includes(cls)) literals.push(cls);
|
|
339
|
+
});
|
|
340
|
+
else if (Node.isIdentifier(nameNode)) {
|
|
322
341
|
const cls = nameNode.getText();
|
|
323
342
|
if (!literals.includes(cls)) literals.push(cls);
|
|
324
343
|
}
|
|
325
344
|
}
|
|
326
|
-
}
|
|
345
|
+
});
|
|
346
|
+
else if (Node.isArrayLiteralExpression(node)) node.getElements().forEach((element) => {
|
|
347
|
+
extractCxStringLiterals(element, literals);
|
|
348
|
+
});
|
|
327
349
|
else if (Node.isConditionalExpression(node)) {
|
|
328
350
|
extractCxStringLiterals(node.getWhenTrue(), literals);
|
|
329
351
|
extractCxStringLiterals(node.getWhenFalse(), literals);
|
|
@@ -331,59 +353,54 @@ function extractCxStringLiterals(node, literals) {
|
|
|
331
353
|
extractCxStringLiterals(node.getLeft(), literals);
|
|
332
354
|
extractCxStringLiterals(node.getRight(), literals);
|
|
333
355
|
}
|
|
334
|
-
}
|
|
356
|
+
};
|
|
335
357
|
/**
|
|
336
358
|
* Try to resolve an identifier to its initializer value (for const declarations)
|
|
337
359
|
*/
|
|
338
|
-
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
}
|
|
355
|
-
return null;
|
|
356
|
-
}
|
|
360
|
+
const resolveIdentifierToObject = (sourceFile, identifier) => {
|
|
361
|
+
const decl = sourceFile.getDescendantsOfKind(SyntaxKind.VariableDeclaration).find((candidate) => candidate.getName() === identifier);
|
|
362
|
+
if (!decl) return null;
|
|
363
|
+
let initializer = decl.getInitializer();
|
|
364
|
+
if (!initializer) return null;
|
|
365
|
+
if (Node.isAsExpression(initializer)) initializer = initializer.getExpression();
|
|
366
|
+
if (!Node.isObjectLiteralExpression(initializer)) return null;
|
|
367
|
+
const result = {};
|
|
368
|
+
initializer.getProperties().forEach((prop) => {
|
|
369
|
+
if (!Node.isPropertyAssignment(prop)) return;
|
|
370
|
+
const propName = prop.getName();
|
|
371
|
+
const propInit = prop.getInitializer();
|
|
372
|
+
if (propInit && Node.isStringLiteral(propInit)) result[propName] = propInit.getLiteralValue();
|
|
373
|
+
});
|
|
374
|
+
return result;
|
|
375
|
+
};
|
|
357
376
|
/**
|
|
358
377
|
* Extract motion CSS variable prefixes from SpringMotionConfig usage.
|
|
359
378
|
* Returns prefixes like ['--uds-motion-bouncy-4-', '--uds-motion-smooth-3-']
|
|
360
379
|
*/
|
|
361
|
-
|
|
380
|
+
const extractMotionVarPrefixes = (sourceFile) => {
|
|
362
381
|
const prefixes = [];
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
if (element.getTagNameNode().getText() !== "SpringMotionConfig") continue;
|
|
382
|
+
[...sourceFile.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement), ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxOpeningElement)].forEach((element) => {
|
|
383
|
+
if (element.getTagNameNode().getText() !== "SpringMotionConfig") return;
|
|
366
384
|
const props = {
|
|
367
385
|
layoutVariant: null,
|
|
368
386
|
layoutSpeed: null,
|
|
369
387
|
colorVariant: null,
|
|
370
388
|
colorSpeed: null
|
|
371
389
|
};
|
|
372
|
-
|
|
373
|
-
for (const attr of attrs) {
|
|
390
|
+
element.getAttributes().forEach((attr) => {
|
|
374
391
|
if (Node.isJsxSpreadAttribute(attr)) {
|
|
375
392
|
const expr = attr.getExpression();
|
|
376
393
|
if (Node.isIdentifier(expr)) {
|
|
377
394
|
const spreadObj = resolveIdentifierToObject(sourceFile, expr.getText());
|
|
378
|
-
if (spreadObj) {
|
|
379
|
-
|
|
380
|
-
}
|
|
395
|
+
if (spreadObj) Object.keys(props).forEach((key) => {
|
|
396
|
+
if (key in spreadObj) props[key] = spreadObj[key];
|
|
397
|
+
});
|
|
381
398
|
}
|
|
382
|
-
|
|
399
|
+
return;
|
|
383
400
|
}
|
|
384
|
-
if (!Node.isJsxAttribute(attr))
|
|
401
|
+
if (!Node.isJsxAttribute(attr)) return;
|
|
385
402
|
const propName = attr.getNameNode().getText();
|
|
386
|
-
if (!(propName in props))
|
|
403
|
+
if (!(propName in props)) return;
|
|
387
404
|
const initializer = attr.getInitializer();
|
|
388
405
|
if (initializer) {
|
|
389
406
|
if (Node.isStringLiteral(initializer)) props[propName] = initializer.getLiteralValue();
|
|
@@ -392,14 +409,64 @@ function extractMotionVarPrefixes(sourceFile) {
|
|
|
392
409
|
if (expr && Node.isStringLiteral(expr)) props[propName] = expr.getLiteralValue();
|
|
393
410
|
}
|
|
394
411
|
}
|
|
395
|
-
}
|
|
412
|
+
});
|
|
396
413
|
const layoutPrefix = `--uds-motion-${props.layoutVariant ?? SPRING_MOTION_DEFAULTS.layoutVariant}-${props.layoutSpeed ?? SPRING_MOTION_DEFAULTS.layoutSpeed}-`;
|
|
397
414
|
if (!prefixes.includes(layoutPrefix)) prefixes.push(layoutPrefix);
|
|
398
415
|
const colorPrefix = `--uds-motion-${props.colorVariant ?? SPRING_MOTION_DEFAULTS.colorVariant}-${props.colorSpeed ?? SPRING_MOTION_DEFAULTS.colorSpeed}-`;
|
|
399
416
|
if (!prefixes.includes(colorPrefix)) prefixes.push(colorPrefix);
|
|
400
|
-
}
|
|
417
|
+
});
|
|
401
418
|
return prefixes;
|
|
402
|
-
}
|
|
419
|
+
};
|
|
420
|
+
const resolveIdentifierToStringLiteral = (identifier) => {
|
|
421
|
+
if (!Node.isIdentifier(identifier)) return null;
|
|
422
|
+
const symbol = identifier.getSymbol();
|
|
423
|
+
if (!symbol) return resolveImportedIdentifier(identifier);
|
|
424
|
+
const resolvedDeclarationValue = symbol.getDeclarations().reduce((resolved, declaration) => {
|
|
425
|
+
if (resolved) return resolved;
|
|
426
|
+
if (Node.isVariableDeclaration(declaration)) {
|
|
427
|
+
let initializer = declaration.getInitializer();
|
|
428
|
+
if (initializer && Node.isAsExpression(initializer)) initializer = initializer.getExpression();
|
|
429
|
+
if (initializer && Node.isStringLiteral(initializer)) return initializer.getLiteralValue();
|
|
430
|
+
}
|
|
431
|
+
if (Node.isEnumMember(declaration)) {
|
|
432
|
+
const initializer = declaration.getInitializer();
|
|
433
|
+
if (initializer && Node.isStringLiteral(initializer)) return initializer.getLiteralValue();
|
|
434
|
+
}
|
|
435
|
+
}, void 0);
|
|
436
|
+
if (resolvedDeclarationValue) return resolvedDeclarationValue;
|
|
437
|
+
return resolveImportedIdentifier(identifier);
|
|
438
|
+
};
|
|
439
|
+
const resolveImportedIdentifier = (identifier) => {
|
|
440
|
+
if (!Node.isIdentifier(identifier)) return null;
|
|
441
|
+
const name = identifier.getText();
|
|
442
|
+
const sourceFile = identifier.getSourceFile();
|
|
443
|
+
const project = sourceFile.getProject();
|
|
444
|
+
const baseDir = path.dirname(sourceFile.getFilePath());
|
|
445
|
+
const importResolution = sourceFile.getImportDeclarations().reduce((resolvedImport, importDecl) => {
|
|
446
|
+
if (resolvedImport) return resolvedImport;
|
|
447
|
+
if (!importDecl.getNamedImports().find((n) => n.getName() === name)) return;
|
|
448
|
+
const moduleSpec = importDecl.getModuleSpecifierValue();
|
|
449
|
+
if (!moduleSpec.startsWith(".")) return;
|
|
450
|
+
const resolvedBase = path.resolve(baseDir, moduleSpec);
|
|
451
|
+
return [
|
|
452
|
+
resolvedBase,
|
|
453
|
+
`${resolvedBase}.ts`,
|
|
454
|
+
`${resolvedBase}.tsx`
|
|
455
|
+
].reduce((resolvedCandidate, candidate) => {
|
|
456
|
+
if (resolvedCandidate) return resolvedCandidate;
|
|
457
|
+
if (!existsSync(candidate)) return;
|
|
458
|
+
const importedFile = project.addSourceFileAtPathIfExists(candidate);
|
|
459
|
+
if (!importedFile) return;
|
|
460
|
+
const varDecl = importedFile.getVariableDeclaration(name);
|
|
461
|
+
if (!varDecl) return;
|
|
462
|
+
let initializer = varDecl.getInitializer();
|
|
463
|
+
if (initializer && Node.isAsExpression(initializer)) initializer = initializer.getExpression();
|
|
464
|
+
return initializer && Node.isStringLiteral(initializer) ? initializer.getLiteralValue() : void 0;
|
|
465
|
+
}, void 0);
|
|
466
|
+
}, void 0);
|
|
467
|
+
if (importResolution) return importResolution;
|
|
468
|
+
return null;
|
|
469
|
+
};
|
|
403
470
|
|
|
404
471
|
//#endregion
|
|
405
472
|
export { analyzeComponent, scanComponentFiles };
|