@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.
Files changed (104) hide show
  1. package/dist/automated-config/dist/mapTextVariantFixtureToValue.cjs +12 -1
  2. package/dist/automated-config/dist/mapTextVariantFixtureToValue.js +12 -1
  3. package/dist/automated-config/dist/properties.cjs +1 -1
  4. package/dist/automated-config/dist/properties.js +1 -1
  5. package/dist/automated-config/dist/utils/getConfigVariantProperties.d.cts +2 -2
  6. package/dist/automated-config/dist/utils/getConfigVariantProperties.d.ts +2 -2
  7. package/dist/cli/commands/sync.cjs +1 -3
  8. package/dist/cli/commands/sync.d.cts +1 -1
  9. package/dist/cli/commands/sync.d.ts +1 -1
  10. package/dist/cli/commands/sync.js +1 -3
  11. package/dist/cli/commands/version.cjs +0 -2
  12. package/dist/cli/commands/version.d.cts +1 -1
  13. package/dist/cli/commands/version.d.ts +1 -1
  14. package/dist/cli/commands/version.js +0 -2
  15. package/dist/cli/dist/cli.cjs +1 -1
  16. package/dist/cli/dist/cli.js +1 -1
  17. package/dist/cli/dist/commands/editor-rules.cjs +2 -2
  18. package/dist/cli/dist/commands/editor-rules.js +2 -2
  19. package/dist/cli/dist/lib/logger.cjs +66 -0
  20. package/dist/cli/dist/lib/logger.js +66 -0
  21. package/dist/cli/dist/utils/rules/config.cjs +1 -1
  22. package/dist/cli/dist/utils/rules/config.js +1 -1
  23. package/dist/cli/runner.cjs +11 -2
  24. package/dist/cli/runner.js +11 -2
  25. package/dist/components/client/Menu/Menu.ItemCheckbox.d.cts +1 -1
  26. package/dist/components/client/Menu/Menu.ItemCheckbox.d.ts +1 -1
  27. package/dist/index.cjs +2 -0
  28. package/dist/index.d.cts +3 -1
  29. package/dist/index.d.ts +3 -1
  30. package/dist/index.js +2 -1
  31. package/dist/styles/styler.d.cts +41 -41
  32. package/dist/styles/styler.d.ts +41 -41
  33. package/dist/styles/variants.cjs +278 -278
  34. package/dist/styles/variants.js +278 -278
  35. package/dist/tailwind/dist/commands/css.cjs +79 -0
  36. package/dist/tailwind/dist/commands/css.d.ts +3 -0
  37. package/dist/tailwind/dist/commands/css.helpers.cjs +32 -0
  38. package/dist/tailwind/dist/commands/css.helpers.js +28 -0
  39. package/dist/tailwind/dist/commands/css.js +79 -0
  40. package/dist/tailwind/dist/commands/generateComponentData.cjs +33 -31
  41. package/dist/tailwind/dist/commands/generateComponentData.d.ts +1 -1
  42. package/dist/tailwind/dist/commands/generateComponentData.js +33 -31
  43. package/dist/tailwind/dist/commands/generatePurgeCSSData.d.ts +1 -1
  44. package/dist/tailwind/dist/commands/purge.cjs +3 -4
  45. package/dist/tailwind/dist/commands/purge.d.ts +1 -1
  46. package/dist/tailwind/dist/commands/purge.js +3 -4
  47. package/dist/tailwind/dist/css/generate.cjs +120 -0
  48. package/dist/tailwind/dist/css/generate.d.cts +30 -0
  49. package/dist/tailwind/dist/css/generate.d.ts +31 -0
  50. package/dist/tailwind/dist/css/generate.helpers.cjs +112 -0
  51. package/dist/tailwind/dist/css/generate.helpers.js +100 -0
  52. package/dist/tailwind/dist/css/generate.js +115 -0
  53. package/dist/tailwind/dist/css/postcss.cjs +35 -0
  54. package/dist/tailwind/dist/css/postcss.helpers.cjs +27 -0
  55. package/dist/tailwind/dist/css/postcss.helpers.js +26 -0
  56. package/dist/tailwind/dist/css/postcss.js +35 -0
  57. package/dist/tailwind/dist/css/runner.cjs +278 -0
  58. package/dist/tailwind/dist/css/runner.helpers.cjs +26 -0
  59. package/dist/tailwind/dist/css/runner.helpers.js +23 -0
  60. package/dist/tailwind/dist/css/runner.js +275 -0
  61. package/dist/tailwind/dist/css/theme.cjs +12 -0
  62. package/dist/tailwind/dist/css/theme.d.cts +66 -0
  63. package/dist/tailwind/dist/css/theme.d.ts +66 -0
  64. package/dist/tailwind/dist/css/theme.js +11 -0
  65. package/dist/tailwind/dist/css/utils.cjs +234 -0
  66. package/dist/tailwind/dist/css/utils.js +223 -0
  67. package/dist/tailwind/dist/index.d.cts +1 -0
  68. package/dist/tailwind/dist/index.d.ts +5 -3
  69. package/dist/tailwind/dist/purger/legacy/purgeCSS.cjs +4 -3
  70. package/dist/tailwind/dist/purger/legacy/purgeCSS.js +4 -3
  71. package/dist/tailwind/dist/purger/optimized/ast/expressions.cjs +122 -125
  72. package/dist/tailwind/dist/purger/optimized/ast/expressions.js +122 -125
  73. package/dist/tailwind/dist/purger/optimized/ast/jsx.cjs +1 -8
  74. package/dist/tailwind/dist/purger/optimized/ast/jsx.js +1 -8
  75. package/dist/tailwind/dist/purger/optimized/purge.cjs +11 -10
  76. package/dist/tailwind/dist/purger/optimized/purge.js +10 -9
  77. package/dist/tailwind/dist/purger/optimized/purgeFromCode.cjs +232 -127
  78. package/dist/tailwind/dist/purger/optimized/purgeFromCode.js +232 -127
  79. package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.cjs +330 -262
  80. package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.js +329 -262
  81. package/dist/tailwind/dist/purger/optimized/utils/files.cjs +4 -3
  82. package/dist/tailwind/dist/purger/optimized/utils/files.js +4 -3
  83. package/dist/tailwind/dist/purger/optimized/utils/safelist.cjs +13 -21
  84. package/dist/tailwind/dist/purger/optimized/utils/safelist.js +13 -21
  85. package/dist/tailwind/dist/tailwind/plugins/typography.cjs +41 -13
  86. package/dist/tailwind/dist/tailwind/plugins/typography.js +41 -13
  87. package/dist/tailwind/dist/tailwind/utils/composeTailwindPlugins.cjs +4 -2
  88. package/dist/tailwind/dist/tailwind/utils/composeTailwindPlugins.d.cts +10 -1
  89. package/dist/tailwind/dist/tailwind/utils/composeTailwindPlugins.d.ts +10 -1
  90. package/dist/tailwind/dist/tailwind/utils/composeTailwindPlugins.js +4 -2
  91. package/dist/tailwind/dist/tailwind/utils/getFontStyles.d.cts +1 -1
  92. package/dist/tailwind/dist/tailwind/utils/getFontStyles.d.ts +1 -1
  93. package/dist/tailwind/dist/utils/optimizeCSS.cjs +405 -0
  94. package/dist/tailwind/dist/utils/optimizeCSS.js +403 -0
  95. package/dist/tailwind/dist/utils/postcssPreserveVars.cjs +67 -0
  96. package/dist/tailwind/dist/utils/postcssPreserveVars.js +65 -0
  97. package/dist/tailwind/dist/utils/tsMorph.cjs +1 -1
  98. package/dist/uds/generated/componentData.cjs +943 -928
  99. package/dist/uds/generated/componentData.js +943 -928
  100. package/dist/uds/package.cjs +10 -4
  101. package/dist/uds/package.js +10 -4
  102. package/generated/componentData.json +2397 -0
  103. package/generated/tailwindPurge.ts +4560 -0
  104. package/package.json +7 -4
@@ -8,20 +8,20 @@ import { Node, Project, SyntaxKind, ts } from "ts-morph";
8
8
  /**
9
9
  * Get component info with all its dependencies (using pre-generated data)
10
10
  */
11
- function getComponentWithDeps(componentName) {
11
+ const getComponentWithDeps = (componentName) => {
12
12
  const visited = /* @__PURE__ */ new Set();
13
13
  const result = [];
14
- function collect(name) {
14
+ const collect = (name) => {
15
15
  if (visited.has(name)) return;
16
16
  visited.add(name);
17
- const info = componentCache[name];
17
+ const info = resolveComponentInfo(name);
18
18
  if (!info) return;
19
19
  result.push(info);
20
- for (const depName of info.internalComponents) collect(depName);
21
- }
20
+ info.internalComponents.forEach((depName) => collect(depName));
21
+ };
22
22
  collect(componentName);
23
23
  return result;
24
- }
24
+ };
25
25
  /**
26
26
  * Auto-variants lookup (loaded at module init)
27
27
  */
@@ -30,10 +30,96 @@ let autoVariantsCache = null;
30
30
  * Pre-generated component data (loaded at module init)
31
31
  */
32
32
  let componentCache = null;
33
- async function purgeFromCodeOptimized(code, options) {
33
+ /**
34
+ * Map of normalized component name -> actual component cache key
35
+ * Useful when internal components are imported without namespace separators
36
+ * (e.g., MenuItemBase vs Menu.ItemBase).
37
+ */
38
+ let componentNameLookup = null;
39
+ const buildComponentNameLookup = (data) => {
40
+ const lookup = {};
41
+ Object.keys(data).forEach((key) => {
42
+ const normalized = normalizeComponentName(key);
43
+ if (!lookup[normalized]) lookup[normalized] = key;
44
+ });
45
+ return lookup;
46
+ };
47
+ const resolveComponentInfo = (name) => {
48
+ if (componentCache && componentCache[name]) return componentCache[name];
49
+ const normalized = normalizeComponentName(name);
50
+ const mappedName = componentNameLookup?.[normalized];
51
+ if (mappedName && componentCache) return componentCache[mappedName];
52
+ };
53
+ const getModuleSpecifierValue = (importDecl) => {
54
+ return importDecl.getModuleSpecifierValue() ?? importDecl.getModuleSpecifier().getText().replace(/^['"]|['"]$/g, "");
55
+ };
56
+ const isUdsComponentModule = (moduleSpecifier) => {
57
+ const cleaned = moduleSpecifier.replace(/^['"]|['"]$/g, "");
58
+ return cleaned === "@yahoo/uds" || cleaned.startsWith("@yahoo/uds/");
59
+ };
60
+ /**
61
+ * Normalize component name to match autoVariants keys (lower camel, no punctuation).
62
+ */
63
+ const normalizeComponentName = (name) => {
64
+ const cleaned = name.replace(/\W/g, "");
65
+ return cleaned.charAt(0).toLowerCase() + cleaned.slice(1);
66
+ };
67
+ /**
68
+ * Fallback: infer prop -> variant key mapping from autoVariants when the
69
+ * generated component data misses it (e.g., helpers like buildAvatarRootClasses).
70
+ */
71
+ const getAutoVariantKeysForProp = (componentName, propName) => {
72
+ if (!autoVariantsCache) return [];
73
+ const segments = componentName.match(/[A-Z][a-z0-9]*/g) ?? [];
74
+ const candidates = new Set([normalizeComponentName(componentName)]);
75
+ if (segments.length > 0) Array.from({ length: segments.length }, (_, index) => index + 1).forEach((i) => {
76
+ const partial = segments.slice(0, i).join("");
77
+ candidates.add(normalizeComponentName(partial));
78
+ });
79
+ const propLower = propName.toLowerCase();
80
+ return Object.keys(autoVariantsCache).filter((key) => {
81
+ const keyLower = key.toLowerCase();
82
+ return Array.from(candidates).some((candidate) => keyLower.startsWith(candidate) && keyLower.includes(propLower));
83
+ });
84
+ };
85
+ const getVariantKeysForProp = (componentInfo, propName) => {
86
+ const keys = new Set(componentInfo.propToVariantKeys?.[propName] ?? []);
87
+ getAutoVariantKeysForProp(componentInfo.name, propName).forEach((inferred) => keys.add(inferred));
88
+ return [...keys];
89
+ };
90
+ const extractClassNamePrimitives = (sourceFile) => {
91
+ const classes = [];
92
+ sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((attr) => {
93
+ if (attr.getNameNode().getText() !== "className") return;
94
+ const initializer = attr.getInitializer();
95
+ if (!initializer) return;
96
+ const values = [];
97
+ if (Node.isStringLiteral(initializer)) values.push(initializer.getLiteralText());
98
+ else if (Node.isJsxExpression(initializer)) {
99
+ const expr = initializer.getExpression();
100
+ if (expr) values.push(...extractStringLiterals(expr));
101
+ }
102
+ values.forEach((raw) => {
103
+ classes.push(...raw.split(/\s+/).filter(Boolean));
104
+ });
105
+ });
106
+ sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAssignment).forEach((prop) => {
107
+ if (prop.getName() !== "className") return;
108
+ const initializer = prop.getInitializer();
109
+ if (!initializer) return;
110
+ extractStringLiterals(initializer).forEach((raw) => {
111
+ classes.push(...raw.split(/\s+/).filter(Boolean));
112
+ });
113
+ });
114
+ return classes;
115
+ };
116
+ const purgeFromCodeOptimized = async (code, options) => {
34
117
  const { variants, autoVariants, componentData } = options;
35
118
  if (!autoVariantsCache) autoVariantsCache = autoVariants;
36
- if (!componentCache) componentCache = componentData;
119
+ if (!componentCache) {
120
+ componentCache = componentData;
121
+ componentNameLookup = buildComponentNameLookup(componentData);
122
+ }
37
123
  const startTime = performance.now();
38
124
  const sourceFile = new Project({ useInMemoryFileSystem: true }).createSourceFile("input.tsx", code);
39
125
  const stats = {
@@ -44,105 +130,120 @@ async function purgeFromCodeOptimized(code, options) {
44
130
  expressionsResolved: 0
45
131
  };
46
132
  const imports = [];
47
- for (const importDecl of sourceFile.getImportDeclarations()) if (importDecl.getModuleSpecifier().getText().includes("@yahoo/uds")) for (const namedImport of importDecl.getNamedImports()) imports.push(namedImport.getName());
133
+ sourceFile.getImportDeclarations().forEach((importDecl) => {
134
+ if (isUdsComponentModule(getModuleSpecifierValue(importDecl))) importDecl.getNamedImports().forEach((namedImport) => imports.push(namedImport.getName()));
135
+ });
48
136
  const componentProps = /* @__PURE__ */ new Map();
137
+ const referencedComponents = /* @__PURE__ */ new Set();
49
138
  const getStylesProps = extractGetStylesCalls(sourceFile, stats, variants);
50
- for (const imp of imports) {
51
- const references = findComponentReferences(sourceFile, imp);
52
- const propsMap = componentProps.get(imp) ?? /* @__PURE__ */ new Map();
53
- for (const reference of references) {
54
- const props = extractPropsFromReference(reference, stats, sourceFile);
55
- for (const [propName, values] of props) if (values.length > 0) {
56
- const existing = propsMap.get(propName) ?? /* @__PURE__ */ new Set();
57
- for (const val of values) existing.add(val);
58
- propsMap.set(propName, existing);
59
- }
60
- }
61
- componentProps.set(imp, propsMap);
62
- }
139
+ imports.forEach((imp) => {
140
+ findComponentReferences(sourceFile, imp).forEach((reference) => {
141
+ const componentName = reference.getTagNameNode().getText() || imp;
142
+ referencedComponents.add(componentName);
143
+ const propsMap = componentProps.get(componentName) ?? /* @__PURE__ */ new Map();
144
+ extractPropsFromReference(reference, stats, sourceFile).forEach(([propName, values]) => {
145
+ if (values.length > 0) {
146
+ const existing = propsMap.get(propName) ?? /* @__PURE__ */ new Set();
147
+ values.forEach((val) => existing.add(val));
148
+ propsMap.set(propName, existing);
149
+ }
150
+ });
151
+ componentProps.set(componentName, propsMap);
152
+ });
153
+ if (!componentProps.has(imp)) componentProps.set(imp, /* @__PURE__ */ new Map());
154
+ });
63
155
  const allComponents = [];
64
156
  const seenComponents = /* @__PURE__ */ new Set();
65
- for (const componentName of imports) {
66
- const componentsWithDeps = getComponentWithDeps(componentName);
67
- for (const comp of componentsWithDeps) if (!seenComponents.has(comp.name)) {
68
- seenComponents.add(comp.name);
69
- allComponents.push(comp);
70
- }
71
- }
157
+ new Set([...imports, ...referencedComponents]).forEach((componentName) => {
158
+ getComponentWithDeps(componentName).forEach((comp) => {
159
+ if (!seenComponents.has(comp.name)) {
160
+ seenComponents.add(comp.name);
161
+ allComponents.push(comp);
162
+ }
163
+ });
164
+ });
72
165
  const safelist = [];
73
- for (const [propName, values] of getStylesProps) {
166
+ [...getStylesProps.entries()].forEach(([propName, values]) => {
74
167
  const variantGroup = variants[propName];
75
- if (variantGroup) for (const value of values) {
168
+ if (variantGroup) values.forEach((value) => {
76
169
  const cls = variantGroup[value];
77
170
  if (cls) safelist.push(cls.replaceAll("\\", ""));
78
- }
79
- }
80
- for (const componentInfo of allComponents) {
171
+ });
172
+ });
173
+ allComponents.forEach((componentInfo) => {
81
174
  const userProps = componentProps.get(componentInfo.name) ?? /* @__PURE__ */ new Map();
82
- for (const [propName, propValue] of Object.entries(componentInfo.defaultProps)) {
83
- if (userProps.has(propName)) continue;
175
+ Object.entries(componentInfo.defaultProps).forEach(([propName, propValue]) => {
176
+ if (userProps.has(propName)) return;
84
177
  const variantGroup = variants[propName];
85
178
  if (variantGroup) {
86
179
  const cls = variantGroup[propValue];
87
180
  if (cls) safelist.push(cls.replaceAll("\\", ""));
88
181
  }
89
- const variantKeys = componentInfo.propToVariantKeys?.[propName];
90
- if (variantKeys) for (const variantKey of variantKeys) {
91
- const mappedVariantGroup = variants[variantKey];
182
+ const variantKeys = getVariantKeysForProp(componentInfo, propName);
183
+ if (variantKeys.length > 0) variantKeys.forEach((variantKey) => {
184
+ const mappedVariantGroup = variants[variantKey] ?? autoVariantsCache[variantKey];
92
185
  if (mappedVariantGroup) {
93
186
  const cls = mappedVariantGroup[propValue];
94
187
  if (cls) safelist.push(cls.replaceAll("\\", ""));
95
188
  }
96
- }
97
- }
98
- for (const [propName, propValue] of Object.entries(componentInfo.getStylesLiterals)) {
189
+ });
190
+ });
191
+ Object.entries(componentInfo.getStylesLiterals).forEach(([propName, propValue]) => {
99
192
  const variantGroup = variants[propName.replace(/:\d+$/, "")];
100
193
  if (variantGroup) {
101
194
  const cls = variantGroup[propValue];
102
195
  if (cls) safelist.push(cls.replaceAll("\\", ""));
103
196
  }
104
- }
105
- if (componentInfo.cxLiterals) for (const cls of componentInfo.cxLiterals) safelist.push(cls);
197
+ });
198
+ if (componentInfo.cxLiterals) componentInfo.cxLiterals.forEach((cls) => safelist.push(cls));
106
199
  if (componentInfo.propToVariantKeys) {
107
200
  const componentDefaults = options.variantDefaults?.[componentInfo.name] ?? {};
108
- for (const [propName, variantKeys] of Object.entries(componentInfo.propToVariantKeys)) {
109
- if (userProps.has(propName)) continue;
201
+ Object.keys(componentInfo.propToVariantKeys).forEach((propName) => {
202
+ if (userProps.has(propName)) return;
110
203
  const defaultValue = componentDefaults[propName];
111
- for (const variantKey of variantKeys) {
204
+ getVariantKeysForProp(componentInfo, propName).forEach((variantKey) => {
112
205
  const variantGroup = autoVariantsCache[variantKey];
113
206
  if (variantGroup) {
114
207
  if (variantGroup["default"]) safelist.push(variantGroup["default"]);
115
208
  if (defaultValue && variantGroup[defaultValue]) safelist.push(variantGroup[defaultValue]);
116
209
  }
117
- }
118
- }
210
+ });
211
+ });
119
212
  }
120
- for (const [_internalCompName, propsRecord] of Object.entries(componentInfo.internalComponentProps)) for (const [propName, propValues] of Object.entries(propsRecord)) {
121
- const variantGroup = variants[propName];
122
- if (variantGroup) for (const propValue of propValues) {
123
- const cls = variantGroup[propValue];
124
- if (cls) safelist.push(cls.replaceAll("\\", ""));
213
+ Object.entries(componentInfo.internalComponentProps).forEach(([_internalCompName, propsRecord]) => {
214
+ Object.entries(propsRecord).forEach(([propName, propValues]) => {
215
+ const variantGroup = variants[propName];
216
+ if (variantGroup) propValues.forEach((propValue) => {
217
+ const cls = variantGroup[propValue];
218
+ if (cls) safelist.push(cls.replaceAll("\\", ""));
219
+ });
220
+ });
221
+ });
222
+ [...userProps.entries()].forEach(([propName, usedValues]) => {
223
+ if (propName === "className") {
224
+ [...usedValues].forEach((value) => {
225
+ value.split(/\s+/).filter(Boolean).forEach((cls) => safelist.push(cls));
226
+ });
227
+ return;
125
228
  }
126
- }
127
- for (const [propName, usedValues] of userProps) {
128
229
  const variantGroup = variants[propName];
129
- if (variantGroup) for (const value of usedValues) {
230
+ if (variantGroup) [...usedValues].forEach((value) => {
130
231
  const cls = variantGroup[value];
131
232
  if (cls) safelist.push(cls.replaceAll("\\", ""));
132
- }
133
- const componentsToCheck = [componentInfo, ...getComponentWithDeps(componentInfo.name).slice(1)];
134
- for (const comp of componentsToCheck) {
135
- const variantKeys = comp.propToVariantKeys?.[propName];
136
- if (variantKeys) for (const variantKey of variantKeys) {
233
+ });
234
+ [componentInfo, ...getComponentWithDeps(componentInfo.name).slice(1)].forEach((comp) => {
235
+ const variantKeys = getVariantKeysForProp(comp, propName);
236
+ if (variantKeys.length > 0) variantKeys.forEach((variantKey) => {
137
237
  const mappedVariantGroup = variants[variantKey];
138
- if (mappedVariantGroup) for (const value of usedValues) {
238
+ if (mappedVariantGroup) [...usedValues].forEach((value) => {
139
239
  const cls = mappedVariantGroup[value];
140
240
  if (cls) safelist.push(cls.replaceAll("\\", ""));
141
- }
142
- }
143
- }
144
- }
145
- }
241
+ });
242
+ });
243
+ });
244
+ });
245
+ });
246
+ if (options.includeAllClassNamePrimitives) safelist.push(...extractClassNamePrimitives(sourceFile));
146
247
  const finalSafelist = [...new Set(safelist)];
147
248
  stats.timeMs = Math.round(performance.now() - startTime);
148
249
  stats.classesGenerated = finalSafelist.length;
@@ -152,28 +253,29 @@ async function purgeFromCodeOptimized(code, options) {
152
253
  components: [...seenComponents],
153
254
  stats
154
255
  };
155
- }
256
+ };
156
257
  /**
157
258
  * Find JSX references for a component in the source file
158
259
  */
159
- function findComponentReferences(sourceFile, componentName) {
260
+ const findComponentReferences = (sourceFile, componentName) => {
160
261
  const references = [];
161
- for (const importDecl of sourceFile.getImportDeclarations()) {
162
- if (!importDecl.getModuleSpecifier().getText().includes("@yahoo/uds")) continue;
163
- for (const namedImport of importDecl.getNamedImports()) if (namedImport.getName() === componentName) {
164
- const identifier = namedImport.getFirstDescendantByKindOrThrow(ts.SyntaxKind.Identifier);
165
- references.push(...findJsxReferences(identifier));
166
- }
167
- }
262
+ sourceFile.getImportDeclarations().forEach((importDecl) => {
263
+ if (!isUdsComponentModule(getModuleSpecifierValue(importDecl))) return;
264
+ importDecl.getNamedImports().forEach((namedImport) => {
265
+ if (namedImport.getName() === componentName) {
266
+ const identifier = namedImport.getFirstDescendantByKindOrThrow(ts.SyntaxKind.Identifier);
267
+ references.push(...findJsxReferences(identifier));
268
+ }
269
+ });
270
+ });
168
271
  return references;
169
- }
272
+ };
170
273
  /**
171
274
  * Extract props from a JSX reference.
172
275
  */
173
- function extractPropsFromReference(reference, stats, sourceFile) {
276
+ const extractPropsFromReference = (reference, stats, sourceFile) => {
174
277
  const props = [];
175
- const attributes = reference.getAttributes();
176
- for (const attr of attributes) {
278
+ reference.getAttributes().forEach((attr) => {
177
279
  if (attr.asKind(SyntaxKind.JsxAttribute)) {
178
280
  const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute);
179
281
  const propName = jsxAttr.getNameNode().getText();
@@ -194,16 +296,17 @@ function extractPropsFromReference(reference, stats, sourceFile) {
194
296
  }
195
297
  if (attr.asKind(SyntaxKind.JsxSpreadAttribute)) {
196
298
  stats.spreadsTraced++;
197
- const resolvedSpreadProps = traceSpreadInFile(attr.asKindOrThrow(SyntaxKind.JsxSpreadAttribute).getExpression().getText(), sourceFile);
198
- for (const [propName, values] of resolvedSpreadProps) if (values.length > 0) props.push([propName, values]);
299
+ traceSpreadInFile(attr.asKindOrThrow(SyntaxKind.JsxSpreadAttribute).getExpression().getText(), sourceFile).forEach(([propName, values]) => {
300
+ if (values.length > 0) props.push([propName, values]);
301
+ });
199
302
  }
200
- }
303
+ });
201
304
  return props;
202
- }
305
+ };
203
306
  /**
204
307
  * Trace spread props to their source within the same file.
205
308
  */
206
- function traceSpreadInFile(spreadName, sourceFile) {
309
+ const traceSpreadInFile = (spreadName, sourceFile) => {
207
310
  const props = [];
208
311
  const varDecl = sourceFile.getVariableDeclaration(spreadName);
209
312
  if (!varDecl) return props;
@@ -211,62 +314,64 @@ function traceSpreadInFile(spreadName, sourceFile) {
211
314
  if (!initializer) return props;
212
315
  const objLiteral = initializer.asKind(SyntaxKind.ObjectLiteralExpression) ? initializer.asKindOrThrow(SyntaxKind.ObjectLiteralExpression) : initializer.asKind(SyntaxKind.AsExpression) ? initializer.asKindOrThrow(SyntaxKind.AsExpression).getExpression().asKind(SyntaxKind.ObjectLiteralExpression) ? initializer.asKindOrThrow(SyntaxKind.AsExpression).getExpression().asKindOrThrow(SyntaxKind.ObjectLiteralExpression) : null : null;
213
316
  if (!objLiteral) return props;
214
- for (const prop of objLiteral.getProperties()) if (prop.asKind(SyntaxKind.PropertyAssignment)) {
215
- const propAssign = prop.asKindOrThrow(SyntaxKind.PropertyAssignment);
216
- const propName = propAssign.getName();
217
- const propInit = propAssign.getInitializer();
218
- if (propInit) {
219
- const values = extractStringLiterals(propInit);
220
- if (values.length > 0) props.push([propName, values]);
317
+ objLiteral.getProperties().forEach((prop) => {
318
+ if (prop.asKind(SyntaxKind.PropertyAssignment)) {
319
+ const propAssign = prop.asKindOrThrow(SyntaxKind.PropertyAssignment);
320
+ const propName = propAssign.getName();
321
+ const propInit = propAssign.getInitializer();
322
+ if (propInit) {
323
+ const values = extractStringLiterals(propInit);
324
+ if (values.length > 0) props.push([propName, values]);
325
+ }
221
326
  }
222
- }
327
+ });
223
328
  return props;
224
- }
329
+ };
225
330
  /**
226
331
  * Extract props from getStyles() calls in user code.
227
332
  * This handles cases like:
228
333
  * const styles = getStyles({ backgroundColor: 'brand', spacing: '4' });
229
334
  */
230
- function extractGetStylesCalls(sourceFile, stats, variants) {
335
+ const extractGetStylesCalls = (sourceFile, stats, variants) => {
231
336
  const props = /* @__PURE__ */ new Map();
232
337
  const VALID_VARIANTS = new Set(Object.keys(variants));
233
- const callExpressions = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression);
234
- for (const call of callExpressions) {
235
- if (call.getExpression().getText() !== "getStyles") continue;
338
+ sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression).forEach((call) => {
339
+ if (call.getExpression().getText() !== "getStyles") return;
236
340
  const args = call.getArguments();
237
- if (args.length === 0) continue;
341
+ if (args.length === 0) return;
238
342
  const firstArg = args[0];
239
- if (!firstArg.asKind(SyntaxKind.ObjectLiteralExpression)) continue;
240
- const objLiteral = firstArg.asKindOrThrow(SyntaxKind.ObjectLiteralExpression);
241
- for (const prop of objLiteral.getProperties()) if (prop.asKind(SyntaxKind.PropertyAssignment)) {
242
- const propAssign = prop.asKindOrThrow(SyntaxKind.PropertyAssignment);
243
- const propName = propAssign.getName();
244
- const propInit = propAssign.getInitializer();
245
- if (propInit && VALID_VARIANTS.has(propName)) {
246
- const values = extractStringLiterals(propInit);
247
- if (values.length > 0) {
248
- const existing = props.get(propName) ?? /* @__PURE__ */ new Set();
249
- for (const v of values) existing.add(v);
250
- props.set(propName, existing);
251
- stats.expressionsResolved++;
343
+ if (!firstArg.asKind(SyntaxKind.ObjectLiteralExpression)) return;
344
+ firstArg.asKindOrThrow(SyntaxKind.ObjectLiteralExpression).getProperties().forEach((prop) => {
345
+ if (prop.asKind(SyntaxKind.PropertyAssignment)) {
346
+ const propAssign = prop.asKindOrThrow(SyntaxKind.PropertyAssignment);
347
+ const propName = propAssign.getName();
348
+ const propInit = propAssign.getInitializer();
349
+ if (propInit && VALID_VARIANTS.has(propName)) {
350
+ const values = extractStringLiterals(propInit);
351
+ if (values.length > 0) {
352
+ const existing = props.get(propName) ?? /* @__PURE__ */ new Set();
353
+ values.forEach((v) => existing.add(v));
354
+ props.set(propName, existing);
355
+ stats.expressionsResolved++;
356
+ }
252
357
  }
253
- }
254
- } else if (prop.asKind(SyntaxKind.ShorthandPropertyAssignment)) {
255
- const shorthand = prop.asKindOrThrow(SyntaxKind.ShorthandPropertyAssignment);
256
- const propName = shorthand.getName();
257
- if (VALID_VARIANTS.has(propName)) {
258
- const values = extractStringLiterals(shorthand.getNameNode());
259
- if (values.length > 0) {
260
- const existing = props.get(propName) ?? /* @__PURE__ */ new Set();
261
- for (const v of values) existing.add(v);
262
- props.set(propName, existing);
263
- stats.expressionsResolved++;
358
+ } else if (prop.asKind(SyntaxKind.ShorthandPropertyAssignment)) {
359
+ const shorthand = prop.asKindOrThrow(SyntaxKind.ShorthandPropertyAssignment);
360
+ const propName = shorthand.getName();
361
+ if (VALID_VARIANTS.has(propName)) {
362
+ const values = extractStringLiterals(shorthand.getNameNode());
363
+ if (values.length > 0) {
364
+ const existing = props.get(propName) ?? /* @__PURE__ */ new Set();
365
+ values.forEach((v) => existing.add(v));
366
+ props.set(propName, existing);
367
+ stats.expressionsResolved++;
368
+ }
264
369
  }
265
370
  }
266
- }
267
- }
371
+ });
372
+ });
268
373
  return props;
269
- }
374
+ };
270
375
 
271
376
  //#endregion
272
377
  export { purgeFromCodeOptimized };