@yahoo/uds 3.120.0 → 3.121.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.
Files changed (66) hide show
  1. package/dist/components/client/Menu/Menu.ItemCheckbox.d.cts +1 -1
  2. package/dist/components/client/Menu/Menu.ItemCheckbox.d.ts +1 -1
  3. package/dist/components/client/Popover/Popover.cjs +1 -1
  4. package/dist/components/client/Popover/Popover.js +1 -1
  5. package/dist/components/client/Popover/PopoverContent.cjs +12 -17
  6. package/dist/components/client/Popover/PopoverContent.js +12 -17
  7. package/dist/components/client/Popover/UDSPopoverConfigProvider.cjs +13 -3
  8. package/dist/components/client/Popover/UDSPopoverConfigProvider.d.cts +13 -5
  9. package/dist/components/client/Popover/UDSPopoverConfigProvider.d.ts +13 -5
  10. package/dist/components/client/Popover/UDSPopoverConfigProvider.js +13 -3
  11. package/dist/components/client/Toast/UDSToastConfigProvider.d.cts +1 -1
  12. package/dist/components/client/Toast/UDSToastConfigProvider.d.ts +1 -1
  13. package/dist/index.d.cts +2 -2
  14. package/dist/index.d.ts +2 -2
  15. package/dist/runtime/popoverConfig.cjs +2 -0
  16. package/dist/runtime/popoverConfig.d.cts +3 -1
  17. package/dist/runtime/popoverConfig.d.ts +3 -1
  18. package/dist/runtime/popoverConfig.js +2 -0
  19. package/dist/styles/styler.d.cts +51 -51
  20. package/dist/styles/styler.d.ts +51 -51
  21. package/dist/tailwind/dist/commands/generateComponentData.cjs +5 -1
  22. package/dist/tailwind/dist/commands/generateComponentData.d.cts +3 -0
  23. package/dist/tailwind/dist/commands/generateComponentData.d.cts.map +1 -1
  24. package/dist/tailwind/dist/commands/generateComponentData.d.ts +3 -0
  25. package/dist/tailwind/dist/commands/generateComponentData.d.ts.map +1 -1
  26. package/dist/tailwind/dist/commands/generateComponentData.js +5 -1
  27. package/dist/tailwind/dist/commands/generateComponentData.js.map +1 -1
  28. package/dist/tailwind/dist/css/generate.cjs +2 -1
  29. package/dist/tailwind/dist/css/generate.d.cts.map +1 -1
  30. package/dist/tailwind/dist/css/generate.d.ts.map +1 -1
  31. package/dist/tailwind/dist/css/generate.js +3 -2
  32. package/dist/tailwind/dist/css/generate.js.map +1 -1
  33. package/dist/tailwind/dist/css/nodeUtils.cjs +7 -5
  34. package/dist/tailwind/dist/css/nodeUtils.js +7 -5
  35. package/dist/tailwind/dist/css/nodeUtils.js.map +1 -1
  36. package/dist/tailwind/dist/css/runner.cjs +4 -3
  37. package/dist/tailwind/dist/css/runner.js +5 -4
  38. package/dist/tailwind/dist/css/runner.js.map +1 -1
  39. package/dist/tailwind/dist/css/utils.cjs +62 -0
  40. package/dist/tailwind/dist/css/utils.js +62 -1
  41. package/dist/tailwind/dist/css/utils.js.map +1 -1
  42. package/dist/tailwind/dist/purger/optimized/purgeFromCode.cjs +104 -19
  43. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.cts +5 -0
  44. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.cts.map +1 -1
  45. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.ts +5 -0
  46. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.ts.map +1 -1
  47. package/dist/tailwind/dist/purger/optimized/purgeFromCode.js +104 -19
  48. package/dist/tailwind/dist/purger/optimized/purgeFromCode.js.map +1 -1
  49. package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.cjs +99 -10
  50. package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.js +99 -10
  51. package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.js.map +1 -1
  52. package/dist/tailwind/dist/runtimeConfig/hookMetadata.cjs +364 -0
  53. package/dist/tailwind/dist/runtimeConfig/hookMetadata.js +358 -0
  54. package/dist/tailwind/dist/runtimeConfig/hookMetadata.js.map +1 -0
  55. package/dist/tailwind/dist/types/dist/index.d.cts.map +1 -1
  56. package/dist/tailwind/dist/types/dist/index.d.ts.map +1 -1
  57. package/dist/tokens/index.d.cts +2 -2
  58. package/dist/tokens/index.d.ts +2 -2
  59. package/dist/tokens/types.d.cts +2 -2
  60. package/dist/tokens/types.d.ts +2 -2
  61. package/dist/types/dist/index.d.cts +2 -1
  62. package/dist/types/dist/index.d.ts +2 -1
  63. package/dist/uds/generated/componentData.cjs +858 -571
  64. package/dist/uds/generated/componentData.js +858 -571
  65. package/generated/componentData.json +1786 -1437
  66. package/package.json +1 -1
@@ -91,6 +91,38 @@ const getVariantKeysForProp = (componentInfo, propName) => {
91
91
  getAutoVariantKeysForProp(componentInfo.name, propName).forEach((inferred) => keys.add(inferred));
92
92
  return [...keys];
93
93
  };
94
+ const addVariantGroupClasses = (variantGroup, safelist) => {
95
+ if (!variantGroup) return;
96
+ Object.values(variantGroup).forEach((cls) => {
97
+ safelist.push(cls.replaceAll("\\", ""));
98
+ });
99
+ };
100
+ const getRuntimeDefaultPropValues = (componentInfo, propName, runtimeConfigValues) => {
101
+ const selector = componentInfo.runtimeConfigDefaultProps?.[propName];
102
+ if (!selector || !runtimeConfigValues) return [];
103
+ const value = runtimeConfigValues[selector];
104
+ return value === void 0 ? [] : [String(value)];
105
+ };
106
+ const getPropCandidateValues = (componentInfo, propName, userProps, options) => {
107
+ const explicitValues = userProps.get(propName);
108
+ if (explicitValues && explicitValues.size > 0) return [...explicitValues];
109
+ const configuredDefault = options.variantDefaults?.[componentInfo.name]?.[propName];
110
+ if (configuredDefault) return [configuredDefault];
111
+ if (componentInfo.defaultProps[propName]) return [componentInfo.defaultProps[propName]];
112
+ return getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);
113
+ };
114
+ const resolveRuntimeSelectorValues = (selectorTemplate, componentInfo, userProps, options) => {
115
+ const runtimeConfigValues = options.runtimeConfigValues;
116
+ if (!runtimeConfigValues) return [];
117
+ return [...selectorTemplate.matchAll(/\$\{(\w+)\}/g)].map((match) => match[1]).reduce((acc, propName) => {
118
+ const propValues = getPropCandidateValues(componentInfo, propName, userProps, options);
119
+ if (propValues.length === 0) return [];
120
+ return acc.flatMap((selector) => propValues.map((value) => selector.replaceAll("${" + propName + "}", value)));
121
+ }, [selectorTemplate]).flatMap((selector) => {
122
+ const value = runtimeConfigValues[selector];
123
+ return value === void 0 ? [] : [String(value)];
124
+ });
125
+ };
94
126
  const extractClassNamePrimitives = (sourceFile) => {
95
127
  const classes = [];
96
128
  sourceFile.getDescendantsOfKind(ts_morph.SyntaxKind.JsxAttribute).forEach((attr) => {
@@ -140,6 +172,7 @@ const purgeFromCodeOptimized = async (code, options) => {
140
172
  });
141
173
  });
142
174
  const componentProps = /* @__PURE__ */ new Map();
175
+ const componentUnresolvedSpreadProps = /* @__PURE__ */ new Map();
143
176
  const referencedComponents = /* @__PURE__ */ new Set();
144
177
  const getStylesProps = extractGetStylesCalls(sourceFile, stats, variants);
145
178
  imports.forEach((imp) => {
@@ -147,16 +180,21 @@ const purgeFromCodeOptimized = async (code, options) => {
147
180
  const componentName = reference.getTagNameNode().getText() || imp;
148
181
  referencedComponents.add(componentName);
149
182
  const propsMap = componentProps.get(componentName) ?? /* @__PURE__ */ new Map();
150
- extractPropsFromReference(reference, stats, sourceFile).forEach(([propName, values]) => {
183
+ const unresolvedSpreadProps = componentUnresolvedSpreadProps.get(componentName) ?? /* @__PURE__ */ new Set();
184
+ extractPropsFromReference(reference, stats, sourceFile).forEach(({ propName, values, fromSpread }) => {
151
185
  if (values.length > 0) {
152
186
  const existing = propsMap.get(propName) ?? /* @__PURE__ */ new Set();
153
187
  values.forEach((val) => existing.add(val));
154
188
  propsMap.set(propName, existing);
189
+ return;
155
190
  }
191
+ if (fromSpread) unresolvedSpreadProps.add(propName);
156
192
  });
157
193
  componentProps.set(componentName, propsMap);
194
+ componentUnresolvedSpreadProps.set(componentName, unresolvedSpreadProps);
158
195
  });
159
196
  if (!componentProps.has(imp)) componentProps.set(imp, /* @__PURE__ */ new Map());
197
+ if (!componentUnresolvedSpreadProps.has(imp)) componentUnresolvedSpreadProps.set(imp, /* @__PURE__ */ new Set());
160
198
  });
161
199
  const allComponents = [];
162
200
  const seenComponents = /* @__PURE__ */ new Set();
@@ -178,6 +216,7 @@ const purgeFromCodeOptimized = async (code, options) => {
178
216
  });
179
217
  allComponents.forEach((componentInfo) => {
180
218
  const userProps = componentProps.get(componentInfo.name) ?? /* @__PURE__ */ new Map();
219
+ const unresolvedSpreadProps = componentUnresolvedSpreadProps.get(componentInfo.name) ?? /* @__PURE__ */ new Set();
181
220
  Object.entries(componentInfo.defaultProps).forEach(([propName, propValue]) => {
182
221
  if (userProps.has(propName)) return;
183
222
  const variantGroup = variants[propName];
@@ -201,17 +240,29 @@ const purgeFromCodeOptimized = async (code, options) => {
201
240
  if (cls) safelist.push(cls.replaceAll("\\", ""));
202
241
  }
203
242
  });
243
+ Object.entries(componentInfo.runtimeConfigGetStyles ?? {}).forEach(([propName, selectors]) => {
244
+ const variantGroup = variants[propName] ?? autoVariantsCache[propName];
245
+ if (!variantGroup) return;
246
+ selectors.forEach((selector) => {
247
+ resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach((value) => {
248
+ const cls = variantGroup[value];
249
+ if (cls) safelist.push(cls.replaceAll("\\", ""));
250
+ });
251
+ });
252
+ });
204
253
  if (componentInfo.cxLiterals) componentInfo.cxLiterals.forEach((cls) => safelist.push(cls));
205
254
  if (componentInfo.propToVariantKeys) {
206
255
  const componentDefaults = options.variantDefaults?.[componentInfo.name] ?? {};
207
256
  Object.keys(componentInfo.propToVariantKeys).forEach((propName) => {
208
257
  if (userProps.has(propName)) return;
209
- const defaultValue = componentDefaults[propName];
258
+ const defaultValues = componentDefaults[propName] ? [componentDefaults[propName]] : getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);
210
259
  getVariantKeysForProp(componentInfo, propName).forEach((variantKey) => {
211
260
  const variantGroup = autoVariantsCache[variantKey];
212
261
  if (variantGroup) {
213
262
  if (variantGroup["default"]) safelist.push(variantGroup["default"]);
214
- if (defaultValue && variantGroup[defaultValue]) safelist.push(variantGroup[defaultValue]);
263
+ defaultValues.forEach((defaultValue) => {
264
+ if (variantGroup[defaultValue]) safelist.push(variantGroup[defaultValue]);
265
+ });
215
266
  }
216
267
  });
217
268
  });
@@ -231,6 +282,18 @@ const purgeFromCodeOptimized = async (code, options) => {
231
282
  });
232
283
  });
233
284
  });
285
+ Object.entries(componentInfo.runtimeConfigInternalComponentProps ?? {}).forEach(([_internalCompName, propsRecord]) => {
286
+ Object.entries(propsRecord).forEach(([propName, selectors]) => {
287
+ const variantGroup = variants[propName];
288
+ if (!variantGroup) return;
289
+ selectors.forEach((selector) => {
290
+ resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach((value) => {
291
+ const cls = variantGroup[value];
292
+ if (cls) safelist.push(cls.replaceAll("\\", ""));
293
+ });
294
+ });
295
+ });
296
+ });
234
297
  [...userProps.entries()].forEach(([propName, usedValues]) => {
235
298
  if (propName === "className") {
236
299
  [...usedValues].forEach((value) => {
@@ -254,6 +317,14 @@ const purgeFromCodeOptimized = async (code, options) => {
254
317
  });
255
318
  });
256
319
  });
320
+ unresolvedSpreadProps.forEach((propName) => {
321
+ addVariantGroupClasses(variants[propName] ?? autoVariantsCache[propName], safelist);
322
+ [componentInfo, ...getComponentWithDeps(componentInfo.name).slice(1)].forEach((comp) => {
323
+ getVariantKeysForProp(comp, propName).forEach((variantKey) => {
324
+ addVariantGroupClasses(variants[variantKey] ?? autoVariantsCache[variantKey], safelist);
325
+ });
326
+ });
327
+ });
257
328
  });
258
329
  if (options.includeAllClassNamePrimitives) safelist.push(...extractClassNamePrimitives(sourceFile));
259
330
  const finalSafelist = [...new Set(safelist)];
@@ -323,12 +394,20 @@ const extractPropsFromReference = (reference, stats, sourceFile) => {
323
394
  if (resolved.length > 0) stats.expressionsResolved++;
324
395
  }
325
396
  }
326
- props.push([propName, values]);
397
+ props.push({
398
+ propName,
399
+ values,
400
+ fromSpread: false
401
+ });
327
402
  }
328
403
  if (attr.asKind(ts_morph.SyntaxKind.JsxSpreadAttribute)) {
329
404
  stats.spreadsTraced++;
330
405
  traceSpreadInFile(attr.asKindOrThrow(ts_morph.SyntaxKind.JsxSpreadAttribute).getExpression().getText(), sourceFile).forEach(([propName, values]) => {
331
- if (values.length > 0) props.push([propName, values]);
406
+ props.push({
407
+ propName,
408
+ values,
409
+ fromSpread: true
410
+ });
332
411
  });
333
412
  }
334
413
  });
@@ -338,25 +417,31 @@ const extractPropsFromReference = (reference, stats, sourceFile) => {
338
417
  * Trace spread props to their source within the same file.
339
418
  */
340
419
  const traceSpreadInFile = (spreadName, sourceFile) => {
341
- const props = [];
342
- const varDecl = sourceFile.getVariableDeclaration(spreadName);
343
- if (!varDecl) return props;
420
+ const props = /* @__PURE__ */ new Map();
421
+ const varDecl = sourceFile.getDescendantsOfKind(ts_morph.SyntaxKind.VariableDeclaration).find((declaration) => declaration.getName() === spreadName);
422
+ if (!varDecl) return [];
344
423
  const initializer = varDecl.getInitializer();
345
- if (!initializer) return props;
346
- const objLiteral = initializer.asKind(ts_morph.SyntaxKind.ObjectLiteralExpression) ? initializer.asKindOrThrow(ts_morph.SyntaxKind.ObjectLiteralExpression) : initializer.asKind(ts_morph.SyntaxKind.AsExpression) ? initializer.asKindOrThrow(ts_morph.SyntaxKind.AsExpression).getExpression().asKind(ts_morph.SyntaxKind.ObjectLiteralExpression) ? initializer.asKindOrThrow(ts_morph.SyntaxKind.AsExpression).getExpression().asKindOrThrow(ts_morph.SyntaxKind.ObjectLiteralExpression) : null : null;
347
- if (!objLiteral) return props;
348
- objLiteral.getProperties().forEach((prop) => {
349
- if (prop.asKind(ts_morph.SyntaxKind.PropertyAssignment)) {
424
+ if (!initializer) return [];
425
+ getSpreadObjectLiteralCandidates(initializer).forEach((objLiteral) => {
426
+ objLiteral.getProperties().forEach((prop) => {
427
+ if (!prop.asKind(ts_morph.SyntaxKind.PropertyAssignment)) return;
350
428
  const propAssign = prop.asKindOrThrow(ts_morph.SyntaxKind.PropertyAssignment);
351
429
  const propName = propAssign.getName();
352
430
  const propInit = propAssign.getInitializer();
353
- if (propInit) {
354
- const values = require_expressions.extractStringLiterals(propInit);
355
- if (values.length > 0) props.push([propName, values]);
356
- }
357
- }
431
+ const values = propInit ? require_expressions.extractStringLiterals(propInit) : [];
432
+ const existingValues = props.get(propName) ?? /* @__PURE__ */ new Set();
433
+ values.forEach((value) => existingValues.add(value));
434
+ props.set(propName, existingValues);
435
+ });
358
436
  });
359
- return props;
437
+ return [...props.entries()].map(([propName, values]) => [propName, [...values]]);
438
+ };
439
+ const getSpreadObjectLiteralCandidates = (node) => {
440
+ if (ts_morph.Node.isObjectLiteralExpression(node)) return [node];
441
+ if (ts_morph.Node.isParenthesizedExpression(node)) return getSpreadObjectLiteralCandidates(node.getExpression());
442
+ if (ts_morph.Node.isAsExpression(node) || ts_morph.Node.isTypeAssertion(node) || ts_morph.Node.isSatisfiesExpression(node)) return getSpreadObjectLiteralCandidates(node.getExpression());
443
+ if (ts_morph.Node.isConditionalExpression(node)) return [...getSpreadObjectLiteralCandidates(node.getWhenTrue()), ...getSpreadObjectLiteralCandidates(node.getWhenFalse())];
444
+ return [];
360
445
  };
361
446
  /**
362
447
  * Extract props from getStyles() calls in user code.
@@ -8,6 +8,7 @@ interface PurgeFromCodeResult {
8
8
  components: string[];
9
9
  stats: PurgeStats;
10
10
  }
11
+ type RuntimeConfigValues = Record<string, string | number | boolean>;
11
12
  /**
12
13
  * Serialized component info from pre-generated data
13
14
  */
@@ -19,6 +20,9 @@ interface SerializedComponentInfo {
19
20
  internalComponents: string[];
20
21
  internalComponentProps: Record<string, Record<string, string[]>>;
21
22
  propToVariantKeys: Record<string, string[]>;
23
+ runtimeConfigDefaultProps?: Record<string, string>;
24
+ runtimeConfigGetStyles?: Record<string, string[]>;
25
+ runtimeConfigInternalComponentProps?: Record<string, Record<string, string[]>>;
22
26
  }
23
27
  /**
24
28
  * Optimized purge from code string.
@@ -46,6 +50,7 @@ interface PurgeFromCodeOptions {
46
50
  colorModes?: ('dark' | 'light')[];
47
51
  /** Variant defaults from consumer's config - used to include default CSS when prop not specified */
48
52
  variantDefaults?: VariantDefaults;
53
+ runtimeConfigValues?: RuntimeConfigValues;
49
54
  variants: Record<string, Record<string, string>>;
50
55
  autoVariants: Record<string, Record<string, string>>;
51
56
  componentData: Record<string, SerializedComponentInfo>;
@@ -1 +1 @@
1
- {"version":3,"file":"purgeFromCode.d.cts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAMU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;;;;UAMC,uBAAA;EACR,IAAA;EACA,YAAA,EAAc,MAAA;EACd,iBAAA,EAAmB,MAAA;EACnB,UAAA;EACA,kBAAA;EACA,sBAAA,EAAwB,MAAA,SAAe,MAAA;EACvC,iBAAA,EAAmB,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;AAAM;;KAoDtB,eAAA,GAAkB,MAAA,SAAe,MAAA;AAAA,UAE5B,oBAAA;EACR,UAAA;EADQ;EAGR,eAAA,GAAkB,eAAA;EAClB,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,YAAA,EAAc,MAAA,SAAe,MAAA;EAC7B,aAAA,EAAe,MAAA,SAAe,uBAAA;EAC9B,6BAAA;EACA,QAAA;AAAA;AAAA,cAmLI,sBAAA,GACJ,IAAA,UACA,OAAA,EAAS,oBAAA,KACR,OAAA,CAAQ,mBAAA"}
1
+ {"version":3,"file":"purgeFromCode.d.cts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAMU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;AAAA,KAGJ,mBAAA,GAAsB,MAAA;;;;UAKjB,uBAAA;EACR,IAAA;EACA,YAAA,EAAc,MAAA;EACd,iBAAA,EAAmB,MAAA;EACnB,UAAA;EACA,kBAAA;EACA,sBAAA,EAAwB,MAAA,SAAe,MAAA;EACvC,iBAAA,EAAmB,MAAA;EACnB,yBAAA,GAA4B,MAAA;EAC5B,sBAAA,GAAyB,MAAA;EACzB,mCAAA,GAAsC,MAAA,SAAe,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;KAoDlD,eAAA,GAAkB,MAAA,SAAe,MAAA;AAAA,UAE5B,oBAAA;EACR,UAAA;EAxDA;EA0DA,eAAA,GAAkB,eAAA;EAClB,mBAAA,GAAsB,mBAAA;EACtB,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,YAAA,EAAc,MAAA,SAAe,MAAA;EAC7B,aAAA,EAAe,MAAA,SAAe,uBAAA;EAC9B,6BAAA;EACA,QAAA;AAAA;AAAA,cAqQI,sBAAA,GACJ,IAAA,UACA,OAAA,EAAS,oBAAA,KACR,OAAA,CAAQ,mBAAA"}
@@ -8,6 +8,7 @@ interface PurgeFromCodeResult {
8
8
  components: string[];
9
9
  stats: PurgeStats;
10
10
  }
11
+ type RuntimeConfigValues = Record<string, string | number | boolean>;
11
12
  /**
12
13
  * Serialized component info from pre-generated data
13
14
  */
@@ -19,6 +20,9 @@ interface SerializedComponentInfo {
19
20
  internalComponents: string[];
20
21
  internalComponentProps: Record<string, Record<string, string[]>>;
21
22
  propToVariantKeys: Record<string, string[]>;
23
+ runtimeConfigDefaultProps?: Record<string, string>;
24
+ runtimeConfigGetStyles?: Record<string, string[]>;
25
+ runtimeConfigInternalComponentProps?: Record<string, Record<string, string[]>>;
22
26
  }
23
27
  /**
24
28
  * Optimized purge from code string.
@@ -46,6 +50,7 @@ interface PurgeFromCodeOptions {
46
50
  colorModes?: ('dark' | 'light')[];
47
51
  /** Variant defaults from consumer's config - used to include default CSS when prop not specified */
48
52
  variantDefaults?: VariantDefaults;
53
+ runtimeConfigValues?: RuntimeConfigValues;
49
54
  variants: Record<string, Record<string, string>>;
50
55
  autoVariants: Record<string, Record<string, string>>;
51
56
  componentData: Record<string, SerializedComponentInfo>;
@@ -1 +1 @@
1
- {"version":3,"file":"purgeFromCode.d.ts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAMU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;;;;UAMC,uBAAA;EACR,IAAA;EACA,YAAA,EAAc,MAAA;EACd,iBAAA,EAAmB,MAAA;EACnB,UAAA;EACA,kBAAA;EACA,sBAAA,EAAwB,MAAA,SAAe,MAAA;EACvC,iBAAA,EAAmB,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;AAAM;;KAoDtB,eAAA,GAAkB,MAAA,SAAe,MAAA;AAAA,UAE5B,oBAAA;EACR,UAAA;EADQ;EAGR,eAAA,GAAkB,eAAA;EAClB,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,YAAA,EAAc,MAAA,SAAe,MAAA;EAC7B,aAAA,EAAe,MAAA,SAAe,uBAAA;EAC9B,6BAAA;EACA,QAAA;AAAA;AAAA,cAmLI,sBAAA,GACJ,IAAA,UACA,OAAA,EAAS,oBAAA,KACR,OAAA,CAAQ,mBAAA"}
1
+ {"version":3,"file":"purgeFromCode.d.ts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAMU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;AAAA,KAGJ,mBAAA,GAAsB,MAAA;;;;UAKjB,uBAAA;EACR,IAAA;EACA,YAAA,EAAc,MAAA;EACd,iBAAA,EAAmB,MAAA;EACnB,UAAA;EACA,kBAAA;EACA,sBAAA,EAAwB,MAAA,SAAe,MAAA;EACvC,iBAAA,EAAmB,MAAA;EACnB,yBAAA,GAA4B,MAAA;EAC5B,sBAAA,GAAyB,MAAA;EACzB,mCAAA,GAAsC,MAAA,SAAe,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;KAoDlD,eAAA,GAAkB,MAAA,SAAe,MAAA;AAAA,UAE5B,oBAAA;EACR,UAAA;EAxDA;EA0DA,eAAA,GAAkB,eAAA;EAClB,mBAAA,GAAsB,mBAAA;EACtB,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,YAAA,EAAc,MAAA,SAAe,MAAA;EAC7B,aAAA,EAAe,MAAA,SAAe,uBAAA;EAC9B,6BAAA;EACA,QAAA;AAAA;AAAA,cAqQI,sBAAA,GACJ,IAAA,UACA,OAAA,EAAS,oBAAA,KACR,OAAA,CAAQ,mBAAA"}
@@ -90,6 +90,38 @@ const getVariantKeysForProp = (componentInfo, propName) => {
90
90
  getAutoVariantKeysForProp(componentInfo.name, propName).forEach((inferred) => keys.add(inferred));
91
91
  return [...keys];
92
92
  };
93
+ const addVariantGroupClasses = (variantGroup, safelist) => {
94
+ if (!variantGroup) return;
95
+ Object.values(variantGroup).forEach((cls) => {
96
+ safelist.push(cls.replaceAll("\\", ""));
97
+ });
98
+ };
99
+ const getRuntimeDefaultPropValues = (componentInfo, propName, runtimeConfigValues) => {
100
+ const selector = componentInfo.runtimeConfigDefaultProps?.[propName];
101
+ if (!selector || !runtimeConfigValues) return [];
102
+ const value = runtimeConfigValues[selector];
103
+ return value === void 0 ? [] : [String(value)];
104
+ };
105
+ const getPropCandidateValues = (componentInfo, propName, userProps, options) => {
106
+ const explicitValues = userProps.get(propName);
107
+ if (explicitValues && explicitValues.size > 0) return [...explicitValues];
108
+ const configuredDefault = options.variantDefaults?.[componentInfo.name]?.[propName];
109
+ if (configuredDefault) return [configuredDefault];
110
+ if (componentInfo.defaultProps[propName]) return [componentInfo.defaultProps[propName]];
111
+ return getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);
112
+ };
113
+ const resolveRuntimeSelectorValues = (selectorTemplate, componentInfo, userProps, options) => {
114
+ const runtimeConfigValues = options.runtimeConfigValues;
115
+ if (!runtimeConfigValues) return [];
116
+ return [...selectorTemplate.matchAll(/\$\{(\w+)\}/g)].map((match) => match[1]).reduce((acc, propName) => {
117
+ const propValues = getPropCandidateValues(componentInfo, propName, userProps, options);
118
+ if (propValues.length === 0) return [];
119
+ return acc.flatMap((selector) => propValues.map((value) => selector.replaceAll("${" + propName + "}", value)));
120
+ }, [selectorTemplate]).flatMap((selector) => {
121
+ const value = runtimeConfigValues[selector];
122
+ return value === void 0 ? [] : [String(value)];
123
+ });
124
+ };
93
125
  const extractClassNamePrimitives = (sourceFile) => {
94
126
  const classes = [];
95
127
  sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((attr) => {
@@ -139,6 +171,7 @@ const purgeFromCodeOptimized = async (code, options) => {
139
171
  });
140
172
  });
141
173
  const componentProps = /* @__PURE__ */ new Map();
174
+ const componentUnresolvedSpreadProps = /* @__PURE__ */ new Map();
142
175
  const referencedComponents = /* @__PURE__ */ new Set();
143
176
  const getStylesProps = extractGetStylesCalls(sourceFile, stats, variants);
144
177
  imports.forEach((imp) => {
@@ -146,16 +179,21 @@ const purgeFromCodeOptimized = async (code, options) => {
146
179
  const componentName = reference.getTagNameNode().getText() || imp;
147
180
  referencedComponents.add(componentName);
148
181
  const propsMap = componentProps.get(componentName) ?? /* @__PURE__ */ new Map();
149
- extractPropsFromReference(reference, stats, sourceFile).forEach(([propName, values]) => {
182
+ const unresolvedSpreadProps = componentUnresolvedSpreadProps.get(componentName) ?? /* @__PURE__ */ new Set();
183
+ extractPropsFromReference(reference, stats, sourceFile).forEach(({ propName, values, fromSpread }) => {
150
184
  if (values.length > 0) {
151
185
  const existing = propsMap.get(propName) ?? /* @__PURE__ */ new Set();
152
186
  values.forEach((val) => existing.add(val));
153
187
  propsMap.set(propName, existing);
188
+ return;
154
189
  }
190
+ if (fromSpread) unresolvedSpreadProps.add(propName);
155
191
  });
156
192
  componentProps.set(componentName, propsMap);
193
+ componentUnresolvedSpreadProps.set(componentName, unresolvedSpreadProps);
157
194
  });
158
195
  if (!componentProps.has(imp)) componentProps.set(imp, /* @__PURE__ */ new Map());
196
+ if (!componentUnresolvedSpreadProps.has(imp)) componentUnresolvedSpreadProps.set(imp, /* @__PURE__ */ new Set());
159
197
  });
160
198
  const allComponents = [];
161
199
  const seenComponents = /* @__PURE__ */ new Set();
@@ -177,6 +215,7 @@ const purgeFromCodeOptimized = async (code, options) => {
177
215
  });
178
216
  allComponents.forEach((componentInfo) => {
179
217
  const userProps = componentProps.get(componentInfo.name) ?? /* @__PURE__ */ new Map();
218
+ const unresolvedSpreadProps = componentUnresolvedSpreadProps.get(componentInfo.name) ?? /* @__PURE__ */ new Set();
180
219
  Object.entries(componentInfo.defaultProps).forEach(([propName, propValue]) => {
181
220
  if (userProps.has(propName)) return;
182
221
  const variantGroup = variants[propName];
@@ -200,17 +239,29 @@ const purgeFromCodeOptimized = async (code, options) => {
200
239
  if (cls) safelist.push(cls.replaceAll("\\", ""));
201
240
  }
202
241
  });
242
+ Object.entries(componentInfo.runtimeConfigGetStyles ?? {}).forEach(([propName, selectors]) => {
243
+ const variantGroup = variants[propName] ?? autoVariantsCache[propName];
244
+ if (!variantGroup) return;
245
+ selectors.forEach((selector) => {
246
+ resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach((value) => {
247
+ const cls = variantGroup[value];
248
+ if (cls) safelist.push(cls.replaceAll("\\", ""));
249
+ });
250
+ });
251
+ });
203
252
  if (componentInfo.cxLiterals) componentInfo.cxLiterals.forEach((cls) => safelist.push(cls));
204
253
  if (componentInfo.propToVariantKeys) {
205
254
  const componentDefaults = options.variantDefaults?.[componentInfo.name] ?? {};
206
255
  Object.keys(componentInfo.propToVariantKeys).forEach((propName) => {
207
256
  if (userProps.has(propName)) return;
208
- const defaultValue = componentDefaults[propName];
257
+ const defaultValues = componentDefaults[propName] ? [componentDefaults[propName]] : getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);
209
258
  getVariantKeysForProp(componentInfo, propName).forEach((variantKey) => {
210
259
  const variantGroup = autoVariantsCache[variantKey];
211
260
  if (variantGroup) {
212
261
  if (variantGroup["default"]) safelist.push(variantGroup["default"]);
213
- if (defaultValue && variantGroup[defaultValue]) safelist.push(variantGroup[defaultValue]);
262
+ defaultValues.forEach((defaultValue) => {
263
+ if (variantGroup[defaultValue]) safelist.push(variantGroup[defaultValue]);
264
+ });
214
265
  }
215
266
  });
216
267
  });
@@ -230,6 +281,18 @@ const purgeFromCodeOptimized = async (code, options) => {
230
281
  });
231
282
  });
232
283
  });
284
+ Object.entries(componentInfo.runtimeConfigInternalComponentProps ?? {}).forEach(([_internalCompName, propsRecord]) => {
285
+ Object.entries(propsRecord).forEach(([propName, selectors]) => {
286
+ const variantGroup = variants[propName];
287
+ if (!variantGroup) return;
288
+ selectors.forEach((selector) => {
289
+ resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach((value) => {
290
+ const cls = variantGroup[value];
291
+ if (cls) safelist.push(cls.replaceAll("\\", ""));
292
+ });
293
+ });
294
+ });
295
+ });
233
296
  [...userProps.entries()].forEach(([propName, usedValues]) => {
234
297
  if (propName === "className") {
235
298
  [...usedValues].forEach((value) => {
@@ -253,6 +316,14 @@ const purgeFromCodeOptimized = async (code, options) => {
253
316
  });
254
317
  });
255
318
  });
319
+ unresolvedSpreadProps.forEach((propName) => {
320
+ addVariantGroupClasses(variants[propName] ?? autoVariantsCache[propName], safelist);
321
+ [componentInfo, ...getComponentWithDeps(componentInfo.name).slice(1)].forEach((comp) => {
322
+ getVariantKeysForProp(comp, propName).forEach((variantKey) => {
323
+ addVariantGroupClasses(variants[variantKey] ?? autoVariantsCache[variantKey], safelist);
324
+ });
325
+ });
326
+ });
256
327
  });
257
328
  if (options.includeAllClassNamePrimitives) safelist.push(...extractClassNamePrimitives(sourceFile));
258
329
  const finalSafelist = [...new Set(safelist)];
@@ -322,12 +393,20 @@ const extractPropsFromReference = (reference, stats, sourceFile) => {
322
393
  if (resolved.length > 0) stats.expressionsResolved++;
323
394
  }
324
395
  }
325
- props.push([propName, values]);
396
+ props.push({
397
+ propName,
398
+ values,
399
+ fromSpread: false
400
+ });
326
401
  }
327
402
  if (attr.asKind(SyntaxKind.JsxSpreadAttribute)) {
328
403
  stats.spreadsTraced++;
329
404
  traceSpreadInFile(attr.asKindOrThrow(SyntaxKind.JsxSpreadAttribute).getExpression().getText(), sourceFile).forEach(([propName, values]) => {
330
- if (values.length > 0) props.push([propName, values]);
405
+ props.push({
406
+ propName,
407
+ values,
408
+ fromSpread: true
409
+ });
331
410
  });
332
411
  }
333
412
  });
@@ -337,25 +416,31 @@ const extractPropsFromReference = (reference, stats, sourceFile) => {
337
416
  * Trace spread props to their source within the same file.
338
417
  */
339
418
  const traceSpreadInFile = (spreadName, sourceFile) => {
340
- const props = [];
341
- const varDecl = sourceFile.getVariableDeclaration(spreadName);
342
- if (!varDecl) return props;
419
+ const props = /* @__PURE__ */ new Map();
420
+ const varDecl = sourceFile.getDescendantsOfKind(SyntaxKind.VariableDeclaration).find((declaration) => declaration.getName() === spreadName);
421
+ if (!varDecl) return [];
343
422
  const initializer = varDecl.getInitializer();
344
- if (!initializer) return props;
345
- 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;
346
- if (!objLiteral) return props;
347
- objLiteral.getProperties().forEach((prop) => {
348
- if (prop.asKind(SyntaxKind.PropertyAssignment)) {
423
+ if (!initializer) return [];
424
+ getSpreadObjectLiteralCandidates(initializer).forEach((objLiteral) => {
425
+ objLiteral.getProperties().forEach((prop) => {
426
+ if (!prop.asKind(SyntaxKind.PropertyAssignment)) return;
349
427
  const propAssign = prop.asKindOrThrow(SyntaxKind.PropertyAssignment);
350
428
  const propName = propAssign.getName();
351
429
  const propInit = propAssign.getInitializer();
352
- if (propInit) {
353
- const values = extractStringLiterals(propInit);
354
- if (values.length > 0) props.push([propName, values]);
355
- }
356
- }
430
+ const values = propInit ? extractStringLiterals(propInit) : [];
431
+ const existingValues = props.get(propName) ?? /* @__PURE__ */ new Set();
432
+ values.forEach((value) => existingValues.add(value));
433
+ props.set(propName, existingValues);
434
+ });
357
435
  });
358
- return props;
436
+ return [...props.entries()].map(([propName, values]) => [propName, [...values]]);
437
+ };
438
+ const getSpreadObjectLiteralCandidates = (node) => {
439
+ if (Node.isObjectLiteralExpression(node)) return [node];
440
+ if (Node.isParenthesizedExpression(node)) return getSpreadObjectLiteralCandidates(node.getExpression());
441
+ if (Node.isAsExpression(node) || Node.isTypeAssertion(node) || Node.isSatisfiesExpression(node)) return getSpreadObjectLiteralCandidates(node.getExpression());
442
+ if (Node.isConditionalExpression(node)) return [...getSpreadObjectLiteralCandidates(node.getWhenTrue()), ...getSpreadObjectLiteralCandidates(node.getWhenFalse())];
443
+ return [];
359
444
  };
360
445
  /**
361
446
  * Extract props from getStyles() calls in user code.