@yahoo/uds 3.119.2 → 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 (70) 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 +5 -5
  12. package/dist/components/client/Toast/UDSToastConfigProvider.d.ts +5 -5
  13. package/dist/components/experimental/client/SegmentedControl.cjs +2 -2
  14. package/dist/components/experimental/client/SegmentedControl.d.cts +5 -1
  15. package/dist/components/experimental/client/SegmentedControl.d.ts +5 -1
  16. package/dist/components/experimental/client/SegmentedControl.js +2 -2
  17. package/dist/index.d.cts +2 -2
  18. package/dist/index.d.ts +2 -2
  19. package/dist/runtime/popoverConfig.cjs +2 -0
  20. package/dist/runtime/popoverConfig.d.cts +3 -1
  21. package/dist/runtime/popoverConfig.d.ts +3 -1
  22. package/dist/runtime/popoverConfig.js +2 -0
  23. package/dist/styles/styler.d.cts +45 -45
  24. package/dist/styles/styler.d.ts +45 -45
  25. package/dist/tailwind/dist/commands/generateComponentData.cjs +5 -1
  26. package/dist/tailwind/dist/commands/generateComponentData.d.cts +3 -0
  27. package/dist/tailwind/dist/commands/generateComponentData.d.cts.map +1 -1
  28. package/dist/tailwind/dist/commands/generateComponentData.d.ts +3 -0
  29. package/dist/tailwind/dist/commands/generateComponentData.d.ts.map +1 -1
  30. package/dist/tailwind/dist/commands/generateComponentData.js +5 -1
  31. package/dist/tailwind/dist/commands/generateComponentData.js.map +1 -1
  32. package/dist/tailwind/dist/css/generate.cjs +2 -1
  33. package/dist/tailwind/dist/css/generate.d.cts.map +1 -1
  34. package/dist/tailwind/dist/css/generate.d.ts.map +1 -1
  35. package/dist/tailwind/dist/css/generate.js +3 -2
  36. package/dist/tailwind/dist/css/generate.js.map +1 -1
  37. package/dist/tailwind/dist/css/nodeUtils.cjs +7 -5
  38. package/dist/tailwind/dist/css/nodeUtils.js +7 -5
  39. package/dist/tailwind/dist/css/nodeUtils.js.map +1 -1
  40. package/dist/tailwind/dist/css/runner.cjs +4 -3
  41. package/dist/tailwind/dist/css/runner.js +5 -4
  42. package/dist/tailwind/dist/css/runner.js.map +1 -1
  43. package/dist/tailwind/dist/css/utils.cjs +62 -0
  44. package/dist/tailwind/dist/css/utils.js +62 -1
  45. package/dist/tailwind/dist/css/utils.js.map +1 -1
  46. package/dist/tailwind/dist/purger/optimized/purgeFromCode.cjs +104 -19
  47. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.cts +5 -0
  48. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.cts.map +1 -1
  49. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.ts +5 -0
  50. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.ts.map +1 -1
  51. package/dist/tailwind/dist/purger/optimized/purgeFromCode.js +104 -19
  52. package/dist/tailwind/dist/purger/optimized/purgeFromCode.js.map +1 -1
  53. package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.cjs +99 -10
  54. package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.js +99 -10
  55. package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.js.map +1 -1
  56. package/dist/tailwind/dist/runtimeConfig/hookMetadata.cjs +364 -0
  57. package/dist/tailwind/dist/runtimeConfig/hookMetadata.js +358 -0
  58. package/dist/tailwind/dist/runtimeConfig/hookMetadata.js.map +1 -0
  59. package/dist/tailwind/dist/types/dist/index.d.cts.map +1 -1
  60. package/dist/tailwind/dist/types/dist/index.d.ts.map +1 -1
  61. package/dist/tokens/index.d.cts +2 -2
  62. package/dist/tokens/index.d.ts +2 -2
  63. package/dist/tokens/types.d.cts +2 -2
  64. package/dist/tokens/types.d.ts +2 -2
  65. package/dist/types/dist/index.d.cts +2 -1
  66. package/dist/types/dist/index.d.ts +2 -1
  67. package/dist/uds/generated/componentData.cjs +1474 -1188
  68. package/dist/uds/generated/componentData.js +1474 -1188
  69. package/generated/componentData.json +2013 -1661
  70. package/package.json +1 -1
@@ -1,5 +1,6 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
2
  import { configurableProperties } from "../automated-config/dist/properties.js";
3
+ import { getRuntimeDefaultPropSelector, getRuntimeDefaultPropValue, getRuntimeFieldSelector, getRuntimeFieldStaticValue, getRuntimeFieldTokenValue, getRuntimeSelectorParamValues } from "../runtimeConfig/hookMetadata.js";
3
4
 
4
5
  //#region src/css/utils.ts
5
6
  /**
@@ -32,6 +33,66 @@ const extractVariantDefaults = (config) => {
32
33
  } : acc;
33
34
  }, {});
34
35
  };
36
+ const extractRuntimeConfigValues = (config) => {
37
+ const values = {};
38
+ const setRuntimeValue = (selector, value) => {
39
+ if (!selector || value === void 0) return;
40
+ values[selector] = value;
41
+ };
42
+ const bottomSheetBackgroundColor = getRuntimeFieldTokenValue(config, "useBottomSheetConfig", "backgroundColor", { variant: "default" });
43
+ if (bottomSheetBackgroundColor !== void 0) setRuntimeValue(getRuntimeFieldSelector("useBottomSheetConfig", "backgroundColor", { variant: "default" }), bottomSheetBackgroundColor);
44
+ if (config.toast?.variables && config.toast?.defaults) {
45
+ setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "autoClose"), getRuntimeFieldStaticValue("useToastConfig", "autoClose") ?? void 0);
46
+ setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "position"), getRuntimeFieldStaticValue("useToastConfig", "position") ?? void 0);
47
+ setRuntimeValue(getRuntimeDefaultPropSelector("useToastConfig", "size"), getRuntimeDefaultPropValue(config, "useToastConfig", "size"));
48
+ setRuntimeValue(getRuntimeDefaultPropSelector("useToastConfig", "variant"), getRuntimeDefaultPropValue(config, "useToastConfig", "variant"));
49
+ getRuntimeSelectorParamValues("useToastConfig", "size").forEach((size) => {
50
+ const textVariant = getRuntimeFieldTokenValue(config, "useToastConfig", "textVariant", { size });
51
+ const iconSize = getRuntimeFieldTokenValue(config, "useToastConfig", "iconSize", { size });
52
+ const buttonSize = getRuntimeFieldTokenValue(config, "useToastConfig", "buttonSize", { size });
53
+ setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "textVariant", { size }), textVariant);
54
+ setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "iconSize", { size }), iconSize);
55
+ setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "buttonSize", { size }), buttonSize);
56
+ });
57
+ getRuntimeSelectorParamValues("useToastConfig", "variant").forEach((variant) => {
58
+ const textColor = getRuntimeFieldTokenValue(config, "useToastConfig", "textColor", { variant });
59
+ const buttonVariant = getRuntimeFieldTokenValue(config, "useToastConfig", "buttonVariant", { variant });
60
+ const iconVariant = getRuntimeFieldTokenValue(config, "useToastConfig", "iconVariant", { variant });
61
+ const backgroundColor = getRuntimeFieldTokenValue(config, "useToastConfig", "backgroundColor", { variant });
62
+ setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "textColor", { variant }), textColor);
63
+ setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "buttonVariant", { variant }), buttonVariant);
64
+ setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "iconVariant", { variant }), iconVariant);
65
+ setRuntimeValue(getRuntimeFieldSelector("useToastConfig", "backgroundColor", { variant }), backgroundColor);
66
+ });
67
+ }
68
+ const tooltipBorderRadius = getRuntimeFieldTokenValue(config, "useTooltipConfig", "borderRadius", { size: "default" });
69
+ if (tooltipBorderRadius !== void 0) {
70
+ setRuntimeValue(getRuntimeFieldSelector("useTooltipConfig", "animationDuration"), getRuntimeFieldStaticValue("useTooltipConfig", "animationDuration") ?? void 0);
71
+ setRuntimeValue(getRuntimeFieldSelector("useTooltipConfig", "placement"), getRuntimeFieldStaticValue("useTooltipConfig", "placement") ?? void 0);
72
+ setRuntimeValue(getRuntimeFieldSelector("useTooltipConfig", "borderRadius", { size: "default" }), tooltipBorderRadius);
73
+ }
74
+ if (config.popover?.variables && config.scaleMode?.medium) {
75
+ setRuntimeValue(getRuntimeDefaultPropSelector("usePopoverConfig", "size"), getRuntimeDefaultPropValue(config, "usePopoverConfig", "size") ?? void 0);
76
+ setRuntimeValue(getRuntimeDefaultPropSelector("usePopoverConfig", "variant"), getRuntimeDefaultPropValue(config, "usePopoverConfig", "variant") ?? void 0);
77
+ setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "animationDuration"), getRuntimeFieldStaticValue("usePopoverConfig", "animationDuration") ?? void 0);
78
+ setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "placement"), getRuntimeFieldStaticValue("usePopoverConfig", "placement") ?? void 0);
79
+ getRuntimeSelectorParamValues("usePopoverConfig", "size").forEach((size) => {
80
+ const borderRadius = getRuntimeFieldTokenValue(config, "usePopoverConfig", "borderRadius", { size });
81
+ const gap = getRuntimeFieldTokenValue(config, "usePopoverConfig", "gap", { size });
82
+ const spacingHorizontal = getRuntimeFieldTokenValue(config, "usePopoverConfig", "spacingHorizontal", { size });
83
+ const spacingVertical = getRuntimeFieldTokenValue(config, "usePopoverConfig", "spacingVertical", { size });
84
+ const dismissButtonSpacing = getRuntimeFieldTokenValue(config, "usePopoverConfig", "dismissButtonSpacing", { size });
85
+ const dismissIconSize = getRuntimeFieldTokenValue(config, "usePopoverConfig", "dismissIconSize", { size });
86
+ setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "borderRadius", { size }), borderRadius);
87
+ setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "gap", { size }), gap);
88
+ setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "spacingHorizontal", { size }), spacingHorizontal);
89
+ setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "spacingVertical", { size }), spacingVertical);
90
+ setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "dismissButtonSpacing", { size }), dismissButtonSpacing);
91
+ setRuntimeValue(getRuntimeFieldSelector("usePopoverConfig", "dismissIconSize", { size }), dismissIconSize);
92
+ });
93
+ }
94
+ return values;
95
+ };
35
96
  /**
36
97
  * Format bytes to human readable string
37
98
  */
@@ -65,5 +126,5 @@ const getConfigurableCssVariables = () => {
65
126
  };
66
127
 
67
128
  //#endregion
68
- export { extractVariantDefaults, formatBytes, getConfigurableCssVariables, getMotionVarPrefixes };
129
+ export { extractRuntimeConfigValues, extractVariantDefaults, formatBytes, getConfigurableCssVariables, getMotionVarPrefixes };
69
130
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../src/css/utils.ts"],"sourcesContent":["import { configurableProperties } from '@yahoo/uds-automated-config/properties';\nimport type { UniversalTokensConfig } from '@yahoo/uds-config';\n\nimport type { SerializedComponentInfo } from '../commands/generateComponentData';\nimport type { VariantDefaults } from '../purger/optimized/purgeFromCode';\n\n/**\n * Extract variant defaults from a UniversalTokensConfig.\n * Converts from config structure to a simpler lookup format.\n * e.g., { button: { defaults: { size: 'md' } } } -> { Button: { size: 'md' } }\n */\nconst extractVariantDefaults = (config: UniversalTokensConfig): VariantDefaults => {\n // Component names in config are lowercase, but we need PascalCase for matching\n const componentNameMap: Record<string, string> = {\n avatar: 'Avatar',\n badge: 'Badge',\n button: 'Button',\n checkbox: 'Checkbox',\n chip: 'Chip',\n divider: 'Divider',\n iconButton: 'IconButton',\n input: 'Input',\n link: 'Link',\n menu: 'Menu',\n radio: 'Radio',\n switch: 'Switch',\n };\n\n // Extract defaults from each component in the config\n return Object.entries(config).reduce<VariantDefaults>((acc, [configKey, componentConfig]) => {\n const pascalName = componentNameMap[configKey];\n if (!pascalName || !componentConfig || typeof componentConfig !== 'object') {\n return acc;\n }\n\n const configWithDefaults = componentConfig as { defaults?: Record<string, string> };\n return configWithDefaults.defaults\n ? { ...acc, [pascalName]: configWithDefaults.defaults }\n : acc;\n }, {});\n};\n\n/**\n * Format bytes to human readable string\n */\nconst formatBytes = (bytes: number): string => {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const kb = bytes / 1024;\n if (kb < 1024) {\n return `${kb.toFixed(1)} KB`;\n }\n const mb = kb / 1024;\n return `${mb.toFixed(2)} MB`;\n};\n\n/**\n * Get motion CSS variable prefixes needed by a set of components.\n * Looks up motionVarPrefixes from componentData.json for each component.\n */\nconst getMotionVarPrefixes = (\n componentData: Record<string, SerializedComponentInfo>,\n components: string[],\n): string[] => {\n const prefixes = components.flatMap((componentName) => {\n const info = (componentData as Record<string, { motionVarPrefixes?: string[] }>)[componentName];\n return info?.motionVarPrefixes ?? [];\n });\n\n return [...new Set(prefixes)];\n};\n\n/**\n * Collect css variable names exposed by configurable properties.\n */\nconst getConfigurableCssVariables = (): string[] => {\n const udsVarPrefix = '--uds';\n const cssVars = Object.values(configurableProperties).flatMap(({ cssProperties }) => {\n if (typeof cssProperties === 'string') {\n return cssProperties.startsWith(udsVarPrefix) ? [cssProperties] : [];\n }\n\n if (Array.isArray(cssProperties)) {\n return cssProperties.filter(\n (cssProperty): cssProperty is string =>\n typeof cssProperty === 'string' && cssProperty.startsWith(udsVarPrefix),\n );\n }\n\n return [];\n });\n\n return [...new Set(['--uds-button-gap', ...cssVars])];\n};\n\nexport { extractVariantDefaults, formatBytes, getConfigurableCssVariables, getMotionVarPrefixes };\n"],"mappings":";;;;;;;;;AAWA,MAAM,0BAA0B,WAAmD;CAEjF,MAAM,mBAA2C;EAC/C,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,UAAU;EACV,MAAM;EACN,SAAS;EACT,YAAY;EACZ,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACP,QAAQ;EACT;AAGD,QAAO,OAAO,QAAQ,OAAO,CAAC,QAAyB,KAAK,CAAC,WAAW,qBAAqB;EAC3F,MAAM,aAAa,iBAAiB;AACpC,MAAI,CAAC,cAAc,CAAC,mBAAmB,OAAO,oBAAoB,SAChE,QAAO;EAGT,MAAM,qBAAqB;AAC3B,SAAO,mBAAmB,WACtB;GAAE,GAAG;IAAM,aAAa,mBAAmB;GAAU,GACrD;IACH,EAAE,CAAC;;;;;AAMR,MAAM,eAAe,UAA0B;AAC7C,KAAI,QAAQ,KACV,QAAO,GAAG,MAAM;CAElB,MAAM,KAAK,QAAQ;AACnB,KAAI,KAAK,KACP,QAAO,GAAG,GAAG,QAAQ,EAAE,CAAC;AAG1B,QAAO,IADI,KAAK,MACH,QAAQ,EAAE,CAAC;;;;;;AAO1B,MAAM,wBACJ,eACA,eACa;CACb,MAAM,WAAW,WAAW,SAAS,kBAAkB;AAErD,SADc,cAAmE,gBACpE,qBAAqB,EAAE;GACpC;AAEF,QAAO,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;;;;;AAM/B,MAAM,oCAA8C;CAClD,MAAM,eAAe;CACrB,MAAM,UAAU,OAAO,OAAO,uBAAuB,CAAC,SAAS,EAAE,oBAAoB;AACnF,MAAI,OAAO,kBAAkB,SAC3B,QAAO,cAAc,WAAW,aAAa,GAAG,CAAC,cAAc,GAAG,EAAE;AAGtE,MAAI,MAAM,QAAQ,cAAc,CAC9B,QAAO,cAAc,QAClB,gBACC,OAAO,gBAAgB,YAAY,YAAY,WAAW,aAAa,CAC1E;AAGH,SAAO,EAAE;GACT;AAEF,QAAO,CAAC,GAAG,IAAI,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../src/css/utils.ts"],"sourcesContent":["import { configurableProperties } from '@yahoo/uds-automated-config/properties';\nimport type { UniversalTokensConfig } from '@yahoo/uds-config';\n\nimport type { SerializedComponentInfo } from '../commands/generateComponentData';\nimport type { RuntimeConfigValues, VariantDefaults } from '../purger/optimized/purgeFromCode';\nimport {\n getRuntimeDefaultPropSelector,\n getRuntimeDefaultPropValue,\n getRuntimeFieldSelector,\n getRuntimeFieldStaticValue,\n getRuntimeFieldTokenValue,\n getRuntimeSelectorParamValues,\n} from '../runtimeConfig/hookMetadata';\n\n/**\n * Extract variant defaults from a UniversalTokensConfig.\n * Converts from config structure to a simpler lookup format.\n * e.g., { button: { defaults: { size: 'md' } } } -> { Button: { size: 'md' } }\n */\nconst extractVariantDefaults = (config: UniversalTokensConfig): VariantDefaults => {\n // Component names in config are lowercase, but we need PascalCase for matching\n const componentNameMap: Record<string, string> = {\n avatar: 'Avatar',\n badge: 'Badge',\n button: 'Button',\n checkbox: 'Checkbox',\n chip: 'Chip',\n divider: 'Divider',\n iconButton: 'IconButton',\n input: 'Input',\n link: 'Link',\n menu: 'Menu',\n radio: 'Radio',\n switch: 'Switch',\n };\n\n // Extract defaults from each component in the config\n return Object.entries(config).reduce<VariantDefaults>((acc, [configKey, componentConfig]) => {\n const pascalName = componentNameMap[configKey];\n if (!pascalName || !componentConfig || typeof componentConfig !== 'object') {\n return acc;\n }\n\n const configWithDefaults = componentConfig as { defaults?: Record<string, string> };\n return configWithDefaults.defaults\n ? { ...acc, [pascalName]: configWithDefaults.defaults }\n : acc;\n }, {});\n};\n\nconst extractRuntimeConfigValues = (config: UniversalTokensConfig): RuntimeConfigValues => {\n const values: RuntimeConfigValues = {};\n\n const setRuntimeValue = (\n selector: string | null,\n value: string | number | boolean | undefined,\n ) => {\n if (!selector || value === undefined) {\n return;\n }\n\n values[selector] = value;\n };\n\n const bottomSheetBackgroundColor = getRuntimeFieldTokenValue(\n config,\n 'useBottomSheetConfig',\n 'backgroundColor',\n { variant: 'default' },\n );\n\n if (bottomSheetBackgroundColor !== undefined) {\n setRuntimeValue(\n getRuntimeFieldSelector('useBottomSheetConfig', 'backgroundColor', { variant: 'default' }),\n bottomSheetBackgroundColor,\n );\n }\n\n if (config.toast?.variables && config.toast?.defaults) {\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'autoClose'),\n getRuntimeFieldStaticValue('useToastConfig', 'autoClose') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'position'),\n getRuntimeFieldStaticValue('useToastConfig', 'position') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeDefaultPropSelector('useToastConfig', 'size'),\n getRuntimeDefaultPropValue(config, 'useToastConfig', 'size'),\n );\n setRuntimeValue(\n getRuntimeDefaultPropSelector('useToastConfig', 'variant'),\n getRuntimeDefaultPropValue(config, 'useToastConfig', 'variant'),\n );\n\n getRuntimeSelectorParamValues('useToastConfig', 'size').forEach((size) => {\n const textVariant = getRuntimeFieldTokenValue(config, 'useToastConfig', 'textVariant', {\n size,\n });\n const iconSize = getRuntimeFieldTokenValue(config, 'useToastConfig', 'iconSize', { size });\n const buttonSize = getRuntimeFieldTokenValue(config, 'useToastConfig', 'buttonSize', {\n size,\n });\n\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'textVariant', { size }),\n textVariant,\n );\n setRuntimeValue(getRuntimeFieldSelector('useToastConfig', 'iconSize', { size }), iconSize);\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'buttonSize', { size }),\n buttonSize,\n );\n });\n\n getRuntimeSelectorParamValues('useToastConfig', 'variant').forEach((variant) => {\n const textColor = getRuntimeFieldTokenValue(config, 'useToastConfig', 'textColor', {\n variant,\n });\n const buttonVariant = getRuntimeFieldTokenValue(config, 'useToastConfig', 'buttonVariant', {\n variant,\n });\n const iconVariant = getRuntimeFieldTokenValue(config, 'useToastConfig', 'iconVariant', {\n variant,\n });\n const backgroundColor = getRuntimeFieldTokenValue(\n config,\n 'useToastConfig',\n 'backgroundColor',\n { variant },\n );\n\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'textColor', { variant }),\n textColor,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'buttonVariant', { variant }),\n buttonVariant,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'iconVariant', { variant }),\n iconVariant,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useToastConfig', 'backgroundColor', { variant }),\n backgroundColor,\n );\n });\n }\n\n const tooltipBorderRadius = getRuntimeFieldTokenValue(\n config,\n 'useTooltipConfig',\n 'borderRadius',\n {\n size: 'default',\n },\n );\n\n if (tooltipBorderRadius !== undefined) {\n setRuntimeValue(\n getRuntimeFieldSelector('useTooltipConfig', 'animationDuration'),\n getRuntimeFieldStaticValue('useTooltipConfig', 'animationDuration') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useTooltipConfig', 'placement'),\n getRuntimeFieldStaticValue('useTooltipConfig', 'placement') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('useTooltipConfig', 'borderRadius', { size: 'default' }),\n tooltipBorderRadius,\n );\n }\n\n if (config.popover?.variables && config.scaleMode?.medium) {\n setRuntimeValue(\n getRuntimeDefaultPropSelector('usePopoverConfig', 'size'),\n getRuntimeDefaultPropValue(config, 'usePopoverConfig', 'size') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeDefaultPropSelector('usePopoverConfig', 'variant'),\n getRuntimeDefaultPropValue(config, 'usePopoverConfig', 'variant') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'animationDuration'),\n getRuntimeFieldStaticValue('usePopoverConfig', 'animationDuration') ?? undefined,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'placement'),\n getRuntimeFieldStaticValue('usePopoverConfig', 'placement') ?? undefined,\n );\n\n getRuntimeSelectorParamValues('usePopoverConfig', 'size').forEach((size) => {\n const borderRadius = getRuntimeFieldTokenValue(config, 'usePopoverConfig', 'borderRadius', {\n size,\n });\n const gap = getRuntimeFieldTokenValue(config, 'usePopoverConfig', 'gap', { size });\n const spacingHorizontal = getRuntimeFieldTokenValue(\n config,\n 'usePopoverConfig',\n 'spacingHorizontal',\n { size },\n );\n const spacingVertical = getRuntimeFieldTokenValue(\n config,\n 'usePopoverConfig',\n 'spacingVertical',\n { size },\n );\n const dismissButtonSpacing = getRuntimeFieldTokenValue(\n config,\n 'usePopoverConfig',\n 'dismissButtonSpacing',\n { size },\n );\n const dismissIconSize = getRuntimeFieldTokenValue(\n config,\n 'usePopoverConfig',\n 'dismissIconSize',\n { size },\n );\n\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'borderRadius', { size }),\n borderRadius,\n );\n setRuntimeValue(getRuntimeFieldSelector('usePopoverConfig', 'gap', { size }), gap);\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'spacingHorizontal', { size }),\n spacingHorizontal,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'spacingVertical', { size }),\n spacingVertical,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'dismissButtonSpacing', { size }),\n dismissButtonSpacing,\n );\n setRuntimeValue(\n getRuntimeFieldSelector('usePopoverConfig', 'dismissIconSize', { size }),\n dismissIconSize,\n );\n });\n }\n\n return values;\n};\n\n/**\n * Format bytes to human readable string\n */\nconst formatBytes = (bytes: number): string => {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const kb = bytes / 1024;\n if (kb < 1024) {\n return `${kb.toFixed(1)} KB`;\n }\n const mb = kb / 1024;\n return `${mb.toFixed(2)} MB`;\n};\n\n/**\n * Get motion CSS variable prefixes needed by a set of components.\n * Looks up motionVarPrefixes from componentData.json for each component.\n */\nconst getMotionVarPrefixes = (\n componentData: Record<string, SerializedComponentInfo>,\n components: string[],\n): string[] => {\n const prefixes = components.flatMap((componentName) => {\n const info = (componentData as Record<string, { motionVarPrefixes?: string[] }>)[componentName];\n return info?.motionVarPrefixes ?? [];\n });\n\n return [...new Set(prefixes)];\n};\n\n/**\n * Collect css variable names exposed by configurable properties.\n */\nconst getConfigurableCssVariables = (): string[] => {\n const udsVarPrefix = '--uds';\n const cssVars = Object.values(configurableProperties).flatMap(({ cssProperties }) => {\n if (typeof cssProperties === 'string') {\n return cssProperties.startsWith(udsVarPrefix) ? [cssProperties] : [];\n }\n\n if (Array.isArray(cssProperties)) {\n return cssProperties.filter(\n (cssProperty): cssProperty is string =>\n typeof cssProperty === 'string' && cssProperty.startsWith(udsVarPrefix),\n );\n }\n\n return [];\n });\n\n return [...new Set(['--uds-button-gap', ...cssVars])];\n};\n\nexport {\n extractRuntimeConfigValues,\n extractVariantDefaults,\n formatBytes,\n getConfigurableCssVariables,\n getMotionVarPrefixes,\n};\n"],"mappings":"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"}
@@ -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.