@yahoo/uds 3.126.0 → 3.127.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 (129) hide show
  1. package/dist/automated-config/dist/generated/autoVariants.cjs +25 -0
  2. package/dist/automated-config/dist/generated/autoVariants.d.cts +7 -0
  3. package/dist/automated-config/dist/generated/autoVariants.d.ts +7 -0
  4. package/dist/automated-config/dist/generated/autoVariants.js +25 -0
  5. package/dist/automated-config/dist/generated/generatedConfigs.cjs +3181 -0
  6. package/dist/automated-config/dist/generated/generatedConfigs.d.cts +305 -1
  7. package/dist/automated-config/dist/generated/generatedConfigs.d.ts +305 -1
  8. package/dist/automated-config/dist/generated/generatedConfigs.js +3180 -1
  9. package/dist/automated-config/dist/generated/universalTokensConfigAuto.cjs +754 -0
  10. package/dist/automated-config/dist/generated/universalTokensConfigAuto.d.cts +3 -1
  11. package/dist/automated-config/dist/generated/universalTokensConfigAuto.d.ts +3 -1
  12. package/dist/automated-config/dist/generated/universalTokensConfigAuto.js +754 -0
  13. package/dist/automated-config/dist/properties.cjs +12 -0
  14. package/dist/automated-config/dist/properties.d.cts +4 -0
  15. package/dist/automated-config/dist/properties.d.ts +4 -0
  16. package/dist/automated-config/dist/properties.js +12 -0
  17. package/dist/automated-config/dist/utils/getConfigVariantProperties.d.cts +2 -2
  18. package/dist/automated-config/dist/utils/getConfigVariantProperties.d.ts +2 -2
  19. package/dist/automated-config/dist/utils/index.cjs +103 -6
  20. package/dist/automated-config/dist/utils/index.js +103 -6
  21. package/dist/components/client/Menu/Menu.ItemCheckbox.d.cts +1 -1
  22. package/dist/components/client/Menu/Menu.ItemCheckbox.d.ts +1 -1
  23. package/dist/components/client/Tabs/Tab.cjs +80 -0
  24. package/dist/components/client/Tabs/Tab.d.cts +20 -0
  25. package/dist/components/client/Tabs/Tab.d.ts +21 -0
  26. package/dist/components/client/Tabs/Tab.js +78 -0
  27. package/dist/components/client/Tabs/TabList.cjs +132 -0
  28. package/dist/components/client/Tabs/TabList.d.cts +9 -0
  29. package/dist/components/client/Tabs/TabList.d.ts +10 -0
  30. package/dist/components/client/Tabs/TabList.js +130 -0
  31. package/dist/components/client/Tabs/TabPanel.cjs +22 -0
  32. package/dist/components/client/Tabs/TabPanel.d.cts +9 -0
  33. package/dist/components/client/Tabs/TabPanel.d.ts +10 -0
  34. package/dist/components/client/Tabs/TabPanel.js +20 -0
  35. package/dist/components/client/Tabs/Tabs.cjs +53 -0
  36. package/dist/components/client/Tabs/Tabs.d.cts +45 -0
  37. package/dist/components/client/Tabs/Tabs.d.ts +46 -0
  38. package/dist/components/client/Tabs/Tabs.js +51 -0
  39. package/dist/components/client/Tabs/index.cjs +12 -0
  40. package/dist/components/client/Tabs/index.d.cts +7 -0
  41. package/dist/components/client/Tabs/index.d.ts +8 -0
  42. package/dist/components/client/Tabs/index.js +8 -0
  43. package/dist/components/client/Tabs/tabsContext.cjs +18 -0
  44. package/dist/components/client/Tabs/tabsContext.d.cts +15 -0
  45. package/dist/components/client/Tabs/tabsContext.d.ts +16 -0
  46. package/dist/components/client/Tabs/tabsContext.js +15 -0
  47. package/dist/components/client/Toast/UDSToastConfigProvider.d.cts +5 -5
  48. package/dist/components/client/Toast/UDSToastConfigProvider.d.ts +5 -5
  49. package/dist/components/client/index.cjs +8 -0
  50. package/dist/components/client/index.d.cts +7 -1
  51. package/dist/components/client/index.d.ts +7 -1
  52. package/dist/components/client/index.js +5 -1
  53. package/dist/components/experimental/client/index.cjs +0 -5
  54. package/dist/components/experimental/client/index.d.cts +1 -2
  55. package/dist/components/experimental/client/index.d.ts +1 -2
  56. package/dist/components/experimental/client/index.js +1 -2
  57. package/dist/components/experimental/index.cjs +0 -9
  58. package/dist/components/experimental/index.d.cts +1 -2
  59. package/dist/components/experimental/index.d.ts +1 -2
  60. package/dist/components/experimental/index.js +1 -6
  61. package/dist/components/index.cjs +12 -0
  62. package/dist/components/index.d.cts +6 -1
  63. package/dist/components/index.d.ts +6 -1
  64. package/dist/components/index.js +9 -1
  65. package/dist/config/dist/index.cjs +824 -2
  66. package/dist/config/dist/index.js +824 -2
  67. package/dist/index.cjs +10 -0
  68. package/dist/index.d.cts +8 -3
  69. package/dist/index.d.ts +8 -3
  70. package/dist/index.js +6 -2
  71. package/dist/styles/styler.d.cts +59 -52
  72. package/dist/styles/styler.d.ts +59 -52
  73. package/dist/styles/variants.d.cts +29 -0
  74. package/dist/styles/variants.d.ts +29 -0
  75. package/dist/tailwind/dist/automated-config/dist/generated/autoVariants.cjs +25 -0
  76. package/dist/tailwind/dist/automated-config/dist/generated/autoVariants.js +25 -0
  77. package/dist/tailwind/dist/automated-config/dist/generated/autoVariants.js.map +1 -1
  78. package/dist/tailwind/dist/automated-config/dist/generated/generatedConfigs.cjs +3181 -0
  79. package/dist/tailwind/dist/automated-config/dist/generated/generatedConfigs.js +3180 -1
  80. package/dist/tailwind/dist/automated-config/dist/generated/generatedConfigs.js.map +1 -1
  81. package/dist/tailwind/dist/automated-config/dist/properties.cjs +12 -0
  82. package/dist/tailwind/dist/automated-config/dist/properties.js +12 -0
  83. package/dist/tailwind/dist/automated-config/dist/properties.js.map +1 -1
  84. package/dist/tailwind/dist/automated-config/dist/utils/index.cjs +103 -6
  85. package/dist/tailwind/dist/automated-config/dist/utils/index.js +103 -6
  86. package/dist/tailwind/dist/automated-config/dist/utils/index.js.map +1 -1
  87. package/dist/tailwind/dist/config/dist/index.cjs +824 -2
  88. package/dist/tailwind/dist/config/dist/index.js +824 -2
  89. package/dist/tailwind/dist/config/dist/index.js.map +1 -1
  90. package/dist/tailwind/dist/css/utils.cjs +3 -1
  91. package/dist/tailwind/dist/css/utils.js +3 -1
  92. package/dist/tailwind/dist/css/utils.js.map +1 -1
  93. package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.cjs +36 -2
  94. package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.js +36 -2
  95. package/dist/tailwind/dist/purger/optimized/utils/componentAnalyzer.js.map +1 -1
  96. package/dist/tailwind/dist/tailwind/plugins/components.cjs +2 -0
  97. package/dist/tailwind/dist/tailwind/plugins/components.js +3 -1
  98. package/dist/tailwind/dist/tailwind/plugins/components.js.map +1 -1
  99. package/dist/tailwind/dist/tailwind/utils/getShadowStyles.d.cts +4 -4
  100. package/dist/tailwind/dist/tailwind/utils/getShadowStyles.d.ts +4 -4
  101. package/dist/tailwind/dist/types/dist/index.d.cts.map +1 -1
  102. package/dist/tailwind/dist/types/dist/index.d.ts.map +1 -1
  103. package/dist/tokens/automation/configs/index.cjs +2 -0
  104. package/dist/tokens/automation/configs/index.d.cts +2 -2
  105. package/dist/tokens/automation/configs/index.d.ts +2 -2
  106. package/dist/tokens/automation/configs/index.js +2 -2
  107. package/dist/tokens/automation/index.cjs +2 -0
  108. package/dist/tokens/automation/index.d.cts +2 -2
  109. package/dist/tokens/automation/index.d.ts +2 -2
  110. package/dist/tokens/automation/index.js +2 -2
  111. package/dist/tokens/index.cjs +2 -0
  112. package/dist/tokens/index.d.cts +3 -3
  113. package/dist/tokens/index.d.ts +3 -3
  114. package/dist/tokens/index.js +2 -2
  115. package/dist/tokens/types.d.cts +2 -2
  116. package/dist/tokens/types.d.ts +2 -2
  117. package/dist/types/dist/index.d.cts +52 -1
  118. package/dist/types/dist/index.d.ts +52 -1
  119. package/dist/uds/generated/componentData.cjs +1197 -1089
  120. package/dist/uds/generated/componentData.js +1180 -1090
  121. package/dist/uds/generated/tailwindPurge.cjs +22 -43
  122. package/dist/uds/generated/tailwindPurge.js +22 -43
  123. package/generated/componentData.json +1759 -1649
  124. package/generated/tailwindPurge.ts +4 -4
  125. package/package.json +1 -1
  126. package/dist/components/experimental/client/Tabs.cjs +0 -76
  127. package/dist/components/experimental/client/Tabs.d.cts +0 -31
  128. package/dist/components/experimental/client/Tabs.d.ts +0 -32
  129. package/dist/components/experimental/client/Tabs.js +0 -71
@@ -21,7 +21,9 @@ const extractVariantDefaults = (config) => {
21
21
  link: "Link",
22
22
  menu: "Menu",
23
23
  radio: "Radio",
24
- switch: "Switch"
24
+ switch: "Switch",
25
+ tab: "Tab",
26
+ tabs: "Tabs"
25
27
  };
26
28
  return Object.entries(config).reduce((acc, [configKey, componentConfig]) => {
27
29
  const pascalName = componentNameMap[configKey];
@@ -21,7 +21,9 @@ const extractVariantDefaults = (config) => {
21
21
  link: "Link",
22
22
  menu: "Menu",
23
23
  radio: "Radio",
24
- switch: "Switch"
24
+ switch: "Switch",
25
+ tab: "Tab",
26
+ tabs: "Tabs"
25
27
  };
26
28
  return Object.entries(config).reduce((acc, [configKey, componentConfig]) => {
27
29
  const pascalName = componentNameMap[configKey];
@@ -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 { 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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"}
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 tab: 'Tab',\n tabs: 'Tabs',\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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"}
@@ -197,6 +197,8 @@ const analyzeComponent = (project, componentPath) => {
197
197
  collectCxLiterals(sourceFile, cxLiterals);
198
198
  collectIntrinsicClassNameLiterals(sourceFile, cxLiterals);
199
199
  extractInternalComponents(sourceFile, internalComponents, internalComponentProps, runtimeConfigInternalComponentProps, propToVariantKeys, componentPropNames, runtimeBindings);
200
+ const motionVarPrefixes = extractMotionVarPrefixes(sourceFile);
201
+ if (new Set(["Tab", "TabList"]).has(componentName) && propToVariantKeys.has("variant") && !defaultProps.has("variant")) defaultProps.set("variant", "primary");
200
202
  return {
201
203
  name: componentName,
202
204
  filePath: componentPath,
@@ -210,7 +212,7 @@ const analyzeComponent = (project, componentPath) => {
210
212
  runtimeConfigDefaultProps,
211
213
  runtimeConfigGetStyles,
212
214
  runtimeConfigInternalComponentProps,
213
- motionVarPrefixes: extractMotionVarPrefixes(sourceFile)
215
+ motionVarPrefixes
214
216
  };
215
217
  };
216
218
  const getComponentFunctionNodes = (sourceFile) => [...sourceFile.getFunctions(), ...sourceFile.getVariableDeclarations().filter((declaration) => {
@@ -250,12 +252,44 @@ const storeVariantLiteralValues = (variantKey, literalValues, getStylesLiterals)
250
252
  getStylesLiterals.set(literalKey, value);
251
253
  });
252
254
  };
255
+ /** Values already recorded for `variantKey` (base key plus `variantKey:1`, `:2`, …). */
256
+ const getExistingLiteralValuesForVariantKey = (variantKey, getStylesLiterals) => {
257
+ const values = [];
258
+ const base = getStylesLiterals.get(variantKey);
259
+ if (base !== void 0) values.push(base);
260
+ let index = 1;
261
+ while (true) {
262
+ const key = `${variantKey}:${index}`;
263
+ const next = getStylesLiterals.get(key);
264
+ if (next === void 0) break;
265
+ values.push(next);
266
+ index++;
267
+ }
268
+ return values;
269
+ };
270
+ /**
271
+ * Record a string literal for a variant key from a getStyles() call.
272
+ * Multiple calls with the same key (e.g. Tab's active-off vs active-on classes) must
273
+ * all be kept; a plain Map set would drop earlier literals.
274
+ */
275
+ const appendGetStylesStringLiteral = (variantKey, value, getStylesLiterals) => {
276
+ if (getExistingLiteralValuesForVariantKey(variantKey, getStylesLiterals).includes(value)) return;
277
+ let nextIndex = 0;
278
+ while (true) {
279
+ const key = nextIndex === 0 ? variantKey : `${variantKey}:${nextIndex}`;
280
+ if (!getStylesLiterals.has(key)) {
281
+ getStylesLiterals.set(key, value);
282
+ return;
283
+ }
284
+ nextIndex++;
285
+ }
286
+ };
253
287
  const handleGetStylesPropertyAssignment = (prop, styleProps, getStylesLiterals, propToVariantKeys, runtimeBindings, runtimeConfigGetStyles) => {
254
288
  const variantKey = prop.getName();
255
289
  addStyleProp(styleProps, variantKey);
256
290
  const initializer = prop.getInitializer();
257
291
  if (!initializer) return;
258
- if (ts_morph.Node.isStringLiteral(initializer)) getStylesLiterals.set(variantKey, initializer.getLiteralValue());
292
+ if (ts_morph.Node.isStringLiteral(initializer)) appendGetStylesStringLiteral(variantKey, initializer.getLiteralValue(), getStylesLiterals);
259
293
  if (ts_morph.Node.isIdentifier(initializer)) addPropToVariantKeyMapping(propToVariantKeys, initializer.getText(), variantKey);
260
294
  collectRuntimeSelectorsFromExpression(initializer, runtimeBindings).forEach((selector) => {
261
295
  addRuntimeSelector(runtimeConfigGetStyles, variantKey, selector);
@@ -194,6 +194,8 @@ const analyzeComponent = (project, componentPath) => {
194
194
  collectCxLiterals(sourceFile, cxLiterals);
195
195
  collectIntrinsicClassNameLiterals(sourceFile, cxLiterals);
196
196
  extractInternalComponents(sourceFile, internalComponents, internalComponentProps, runtimeConfigInternalComponentProps, propToVariantKeys, componentPropNames, runtimeBindings);
197
+ const motionVarPrefixes = extractMotionVarPrefixes(sourceFile);
198
+ if (new Set(["Tab", "TabList"]).has(componentName) && propToVariantKeys.has("variant") && !defaultProps.has("variant")) defaultProps.set("variant", "primary");
197
199
  return {
198
200
  name: componentName,
199
201
  filePath: componentPath,
@@ -207,7 +209,7 @@ const analyzeComponent = (project, componentPath) => {
207
209
  runtimeConfigDefaultProps,
208
210
  runtimeConfigGetStyles,
209
211
  runtimeConfigInternalComponentProps,
210
- motionVarPrefixes: extractMotionVarPrefixes(sourceFile)
212
+ motionVarPrefixes
211
213
  };
212
214
  };
213
215
  const getComponentFunctionNodes = (sourceFile) => [...sourceFile.getFunctions(), ...sourceFile.getVariableDeclarations().filter((declaration) => {
@@ -247,12 +249,44 @@ const storeVariantLiteralValues = (variantKey, literalValues, getStylesLiterals)
247
249
  getStylesLiterals.set(literalKey, value);
248
250
  });
249
251
  };
252
+ /** Values already recorded for `variantKey` (base key plus `variantKey:1`, `:2`, …). */
253
+ const getExistingLiteralValuesForVariantKey = (variantKey, getStylesLiterals) => {
254
+ const values = [];
255
+ const base = getStylesLiterals.get(variantKey);
256
+ if (base !== void 0) values.push(base);
257
+ let index = 1;
258
+ while (true) {
259
+ const key = `${variantKey}:${index}`;
260
+ const next = getStylesLiterals.get(key);
261
+ if (next === void 0) break;
262
+ values.push(next);
263
+ index++;
264
+ }
265
+ return values;
266
+ };
267
+ /**
268
+ * Record a string literal for a variant key from a getStyles() call.
269
+ * Multiple calls with the same key (e.g. Tab's active-off vs active-on classes) must
270
+ * all be kept; a plain Map set would drop earlier literals.
271
+ */
272
+ const appendGetStylesStringLiteral = (variantKey, value, getStylesLiterals) => {
273
+ if (getExistingLiteralValuesForVariantKey(variantKey, getStylesLiterals).includes(value)) return;
274
+ let nextIndex = 0;
275
+ while (true) {
276
+ const key = nextIndex === 0 ? variantKey : `${variantKey}:${nextIndex}`;
277
+ if (!getStylesLiterals.has(key)) {
278
+ getStylesLiterals.set(key, value);
279
+ return;
280
+ }
281
+ nextIndex++;
282
+ }
283
+ };
250
284
  const handleGetStylesPropertyAssignment = (prop, styleProps, getStylesLiterals, propToVariantKeys, runtimeBindings, runtimeConfigGetStyles) => {
251
285
  const variantKey = prop.getName();
252
286
  addStyleProp(styleProps, variantKey);
253
287
  const initializer = prop.getInitializer();
254
288
  if (!initializer) return;
255
- if (Node.isStringLiteral(initializer)) getStylesLiterals.set(variantKey, initializer.getLiteralValue());
289
+ if (Node.isStringLiteral(initializer)) appendGetStylesStringLiteral(variantKey, initializer.getLiteralValue(), getStylesLiterals);
256
290
  if (Node.isIdentifier(initializer)) addPropToVariantKeyMapping(propToVariantKeys, initializer.getText(), variantKey);
257
291
  collectRuntimeSelectorsFromExpression(initializer, runtimeBindings).forEach((selector) => {
258
292
  addRuntimeSelector(runtimeConfigGetStyles, variantKey, selector);
@@ -1 +1 @@
1
- {"version":3,"file":"componentAnalyzer.js","names":[],"sources":["../../../../src/purger/optimized/utils/componentAnalyzer.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { SPRING_MOTION_DEFAULTS } from '@yahoo/uds-motion-tokens';\nimport fg from 'fast-glob';\nimport type { ObjectLiteralExpression, Project, SourceFile } from 'ts-morph';\nimport { Node, SyntaxKind } from 'ts-morph';\n\nimport { getRuntimeHookConfig } from '../../../runtimeConfig/hookMetadata';\nimport {\n getAllowedEntryFileGlobPatterns,\n stripAllowedEntryFileExtension,\n} from '../../../utils/entryPoints';\n\ninterface ComponentInfo {\n name: string;\n filePath: string;\n /** Default values from function parameter destructuring (e.g., display = 'flex') */\n defaultProps: Map<string, string>;\n /** Props passed to getStyles() calls */\n styleProps: string[];\n /** Hardcoded literal values passed directly to getStyles() (e.g., flex: 'none') */\n getStylesLiterals: Map<string, string>;\n /** Raw Tailwind class literals from cx() calls (e.g., 'absolute', 'opacity-0') */\n cxLiterals: string[];\n /** Other UDS components used internally */\n internalComponents: string[];\n /** Literal prop values passed to internal UDS components (e.g., <Icon color=\"current\" />) */\n internalComponentProps: Map<string, Map<string, string[]>>;\n /** Maps prop names to variant keys (e.g., variant -> [buttonVariantRoot, buttonVariantIcon]) */\n propToVariantKeys: Map<string, string[]>;\n /** Runtime-config-backed defaults for component props (e.g., size -> toast.defaultSize) */\n runtimeConfigDefaultProps: Map<string, string>;\n /** Runtime-config selectors used directly in getStyles() variant keys */\n runtimeConfigGetStyles: Map<string, string[]>;\n /** Runtime-config selectors passed to internal UDS component props */\n runtimeConfigInternalComponentProps: Map<string, Map<string, string[]>>;\n /**\n * Motion CSS variable prefixes used by this component.\n * e.g., ['--uds-motion-bouncy-4-', '--uds-motion-smooth-3-']\n * Empty array means no motion vars needed.\n */\n motionVarPrefixes: string[];\n}\n\ntype RuntimeConfigBinding = {\n selector: string;\n};\n\n/**\n * Known UDS component names (populated by scanning)\n */\nlet knownComponents: Set<string> | null = null;\n\n/**\n * Map of component name -> file path\n */\nlet componentPaths: Map<string, string> | null = null;\nlet scannedComponentsDir: string | null = null;\nconst hasImportQuery = (moduleSpecifier: string): boolean => moduleSpecifier.includes('?');\nconst scanComponentFilePaths = async (componentsDir: string): Promise<string[]> =>\n fg(getAllowedEntryFileGlobPatterns(), {\n cwd: componentsDir,\n absolute: true,\n });\n\n/**\n * Scan src/components to build a map of all component files\n */\nconst scanComponentFiles = async (componentsDir: string): Promise<Map<string, string>> => {\n if (componentPaths && scannedComponentsDir === componentsDir) {\n return componentPaths;\n }\n\n componentPaths = new Map();\n knownComponents = new Set();\n scannedComponentsDir = componentsDir;\n\n const nextComponentPaths = componentPaths;\n const nextKnownComponents = knownComponents;\n\n const files = await scanComponentFilePaths(componentsDir);\n\n files.forEach((file) => {\n // Skip test files and index files\n if (\n file.includes('.test.') ||\n path.basename(stripAllowedEntryFileExtension(file)) === 'index'\n ) {\n return;\n }\n\n const fileName = path.basename(stripAllowedEntryFileExtension(file));\n\n // Use PascalCase file names as component names\n if (/^[A-Z]/.test(fileName)) {\n nextComponentPaths.set(fileName, file);\n nextKnownComponents.add(fileName);\n }\n });\n\n return nextComponentPaths;\n};\n\n/**\n * Get the file path for a component by name\n */\nconst getComponentPath = async (\n componentName: string,\n componentsDir: string,\n): Promise<string | null> => {\n const paths = await scanComponentFiles(componentsDir);\n return paths.get(componentName) ?? null;\n};\n\n/**\n * Analyze an object literal for variant key mappings.\n * Handles:\n * - Direct property assignments: { fontSize: variant } -> variant maps to fontSize\n * - Nullish coalescing: { fontSize: fontSize ?? variant } -> variant maps to fontSize\n * - Conditional spreads: ...(condition ? { props } : {}) -> recursively analyze props\n */\nconst analyzeObjectForVariantMappings = (\n objLiteral: ObjectLiteralExpression,\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n sourceFile: SourceFile,\n): void => {\n objLiteral.getProperties().forEach((prop) => {\n if (Node.isPropertyAssignment(prop)) {\n analyzeVariantPropertyAssignment(prop, styleProps, getStylesLiterals, propToVariantKeys);\n return;\n }\n\n if (Node.isSpreadAssignment(prop)) {\n analyzeVariantSpreadAssignment(\n prop,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n sourceFile,\n );\n }\n });\n};\n\nconst addStyleProp = (styleProps: string[], variantKey: string): void => {\n if (!styleProps.includes(variantKey)) {\n styleProps.push(variantKey);\n }\n};\n\nconst addPropToVariantKeyMapping = (\n propToVariantKeys: Map<string, string[]>,\n propName: string,\n variantKey: string,\n): void => {\n const existing = propToVariantKeys.get(propName) ?? [];\n if (!existing.includes(variantKey)) {\n propToVariantKeys.set(propName, [...existing, variantKey]);\n }\n};\n\nconst addRuntimeSelector = (target: Map<string, string[]>, key: string, selector: string): void => {\n const existing = target.get(key) ?? [];\n if (!existing.includes(selector)) {\n target.set(key, [...existing, selector]);\n }\n};\n\nconst getExpressionWithoutWrappers = (node: Node): Node => {\n if (Node.isParenthesizedExpression(node)) {\n return getExpressionWithoutWrappers(node.getExpression());\n }\n\n if (Node.isAsExpression(node) || Node.isTypeAssertion(node) || Node.isSatisfiesExpression(node)) {\n return getExpressionWithoutWrappers(node.getExpression());\n }\n\n return node;\n};\n\nconst applyRuntimeSelectorIndex = (\n selector: string,\n indexKey: string,\n isIdentifierIndex = false,\n): string => {\n if (selector.includes('${')) {\n return selector;\n }\n\n return isIdentifierIndex ? selector + '.${' + indexKey + '}' : `${selector}.${indexKey}`;\n};\n\nconst resolveRuntimeBindingFromExpression = (\n expr: Node,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n): RuntimeConfigBinding | null => {\n const normalized = getExpressionWithoutWrappers(expr);\n\n if (Node.isIdentifier(normalized)) {\n return runtimeBindings.get(normalized.getText()) ?? null;\n }\n\n if (Node.isElementAccessExpression(normalized)) {\n const target = resolveRuntimeBindingFromExpression(normalized.getExpression(), runtimeBindings);\n if (!target) {\n return null;\n }\n\n const argumentExpression = normalized.getArgumentExpression();\n if (!argumentExpression) {\n return null;\n }\n\n const argument = getExpressionWithoutWrappers(argumentExpression);\n\n if (Node.isStringLiteral(argument)) {\n return {\n selector: applyRuntimeSelectorIndex(target.selector, argument.getLiteralValue()),\n };\n }\n\n if (Node.isIdentifier(argument)) {\n return {\n selector: applyRuntimeSelectorIndex(target.selector, argument.getText(), true),\n };\n }\n }\n\n if (Node.isPropertyAccessExpression(normalized)) {\n const target = resolveRuntimeBindingFromExpression(normalized.getExpression(), runtimeBindings);\n if (!target) {\n return null;\n }\n\n return { selector: applyRuntimeSelectorIndex(target.selector, normalized.getName()) };\n }\n\n return null;\n};\n\nconst collectRuntimeSelectorsFromExpression = (\n expr: Node,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n): string[] => {\n const normalized = getExpressionWithoutWrappers(expr);\n const resolvedBinding = resolveRuntimeBindingFromExpression(normalized, runtimeBindings);\n if (resolvedBinding) {\n return [resolvedBinding.selector];\n }\n\n if (Node.isConditionalExpression(normalized)) {\n return [\n ...collectRuntimeSelectorsFromExpression(normalized.getWhenTrue(), runtimeBindings),\n ...collectRuntimeSelectorsFromExpression(normalized.getWhenFalse(), runtimeBindings),\n ];\n }\n\n if (Node.isBinaryExpression(normalized)) {\n return [\n ...collectRuntimeSelectorsFromExpression(normalized.getLeft(), runtimeBindings),\n ...collectRuntimeSelectorsFromExpression(normalized.getRight(), runtimeBindings),\n ];\n }\n\n return [];\n};\n\nconst collectRuntimeConfigBindings = (\n sourceFile: SourceFile,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n runtimeConfigDefaultProps: Map<string, string>,\n): void => {\n sourceFile.getDescendantsOfKind(SyntaxKind.VariableDeclaration).forEach((declaration) => {\n const initializer = declaration.getInitializer();\n if (!initializer) {\n return;\n }\n\n const normalizedInitializer = getExpressionWithoutWrappers(initializer);\n const nameNode = declaration.getNameNode();\n\n if (Node.isObjectBindingPattern(nameNode) && Node.isCallExpression(normalizedInitializer)) {\n const hookName = normalizedInitializer.getExpression().getText();\n const hookConfig = getRuntimeHookConfig(hookName);\n if (!hookConfig) {\n return;\n }\n\n Object.entries(hookConfig.defaultProps).forEach(([propName, selector]) => {\n runtimeConfigDefaultProps.set(propName, selector);\n });\n\n nameNode.getElements().forEach((element) => {\n const fieldName = element.getPropertyNameNode()?.getText() ?? element.getName();\n const localName = element.getName();\n const fieldConfig = hookConfig.fields[fieldName as keyof typeof hookConfig.fields];\n if (!fieldConfig) {\n return;\n }\n\n runtimeBindings.set(localName, { selector: fieldConfig.bindingSelector });\n });\n\n return;\n }\n\n if (!Node.isIdentifier(nameNode)) {\n return;\n }\n\n const resolvedBinding = resolveRuntimeBindingFromExpression(\n normalizedInitializer,\n runtimeBindings,\n );\n if (resolvedBinding) {\n runtimeBindings.set(nameNode.getText(), resolvedBinding);\n }\n });\n};\n\nconst extractFallbackIdentifier = (initializer: Node): string | null => {\n if (!Node.isBinaryExpression(initializer)) {\n return null;\n }\n\n const operatorKind = initializer.getOperatorToken().getKind();\n const isFallbackOperator =\n operatorKind === SyntaxKind.QuestionQuestionToken || operatorKind === SyntaxKind.BarBarToken;\n\n if (!isFallbackOperator || !Node.isIdentifier(initializer.getRight())) {\n return null;\n }\n\n return initializer.getRight().getText();\n};\n\nconst analyzeVariantPropertyAssignment = (\n prop: Node & { getName: () => string; getInitializer: () => Node | undefined },\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n): void => {\n const variantKey = prop.getName();\n addStyleProp(styleProps, variantKey);\n\n const initializer = prop.getInitializer();\n if (!initializer) {\n return;\n }\n\n if (Node.isStringLiteral(initializer)) {\n getStylesLiterals.set(variantKey, initializer.getLiteralValue());\n }\n\n if (Node.isIdentifier(initializer)) {\n addPropToVariantKeyMapping(propToVariantKeys, initializer.getText(), variantKey);\n }\n\n const fallbackIdentifier = extractFallbackIdentifier(initializer);\n if (fallbackIdentifier) {\n addPropToVariantKeyMapping(propToVariantKeys, fallbackIdentifier, variantKey);\n }\n};\n\nconst findVariableObjectLiteral = (\n sourceFile: SourceFile,\n variableName: string,\n): ObjectLiteralExpression | null => {\n const declaration = sourceFile\n .getDescendantsOfKind(SyntaxKind.VariableDeclaration)\n .find((candidate) => candidate.getName() === variableName);\n const initializer = declaration?.getInitializer();\n\n return initializer && Node.isObjectLiteralExpression(initializer) ? initializer : null;\n};\n\nconst analyzeVariantSpreadAssignment = (\n prop: Node & { getExpression: () => Node },\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n sourceFile: SourceFile,\n): void => {\n const spreadExpr = prop.getExpression();\n\n if (Node.isParenthesizedExpression(spreadExpr)) {\n const conditionalExpr = spreadExpr.getExpression();\n if (Node.isConditionalExpression(conditionalExpr)) {\n const whenTrue = conditionalExpr.getWhenTrue();\n if (!Node.isObjectLiteralExpression(whenTrue)) {\n return;\n }\n\n analyzeObjectForVariantMappings(\n whenTrue,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n sourceFile,\n );\n }\n }\n\n if (Node.isIdentifier(spreadExpr)) {\n const objectLiteral = findVariableObjectLiteral(sourceFile, spreadExpr.getText());\n if (objectLiteral) {\n analyzeObjectForVariantMappings(\n objectLiteral,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n sourceFile,\n );\n }\n }\n};\n\n/**\n * Analyzes a UDS component file to extract:\n * 1. Default prop values (e.g., display = 'flex')\n * 2. Props passed to getStyles()\n * 3. Internal UDS component usage\n */\nconst analyzeComponent = (project: Project, componentPath: string): ComponentInfo | null => {\n const sourceFile = project.getSourceFile(componentPath);\n if (!sourceFile) {\n return null;\n }\n\n const componentName = path.basename(stripAllowedEntryFileExtension(componentPath));\n const defaultProps = new Map<string, string>();\n const componentPropNames = new Set<string>(); // All prop names (not just defaults)\n const styleProps: string[] = [];\n const getStylesLiterals = new Map<string, string>();\n const cxLiterals: string[] = [];\n const internalComponents: string[] = [];\n const internalComponentProps = new Map<string, Map<string, string[]>>();\n const propToVariantKeys = new Map<string, string[]>();\n const runtimeConfigDefaultProps = new Map<string, string>();\n const runtimeConfigGetStyles = new Map<string, string[]>();\n const runtimeConfigInternalComponentProps = new Map<string, Map<string, string[]>>();\n const runtimeBindings = new Map<string, RuntimeConfigBinding>();\n\n collectComponentDefaultsAndProps(sourceFile, defaultProps, componentPropNames);\n\n collectRuntimeConfigBindings(sourceFile, runtimeBindings, runtimeConfigDefaultProps);\n\n collectGetStylesMetadata(\n sourceFile,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n runtimeBindings,\n runtimeConfigGetStyles,\n );\n\n collectCxLiterals(sourceFile, cxLiterals);\n collectIntrinsicClassNameLiterals(sourceFile, cxLiterals);\n\n // Find internal UDS component usage and their prop values\n // Also detect prop aliasing (e.g., gap -> columnGap, rowGap in VStack)\n extractInternalComponents(\n sourceFile,\n internalComponents,\n internalComponentProps,\n runtimeConfigInternalComponentProps,\n propToVariantKeys,\n componentPropNames,\n runtimeBindings,\n );\n\n // Extract motion CSS variable prefixes from SpringMotionConfig usage\n const motionVarPrefixes = extractMotionVarPrefixes(sourceFile);\n\n return {\n name: componentName,\n filePath: componentPath,\n defaultProps,\n styleProps,\n getStylesLiterals,\n cxLiterals,\n internalComponents,\n internalComponentProps,\n propToVariantKeys,\n runtimeConfigDefaultProps,\n runtimeConfigGetStyles,\n runtimeConfigInternalComponentProps,\n motionVarPrefixes,\n };\n};\n\nconst getComponentFunctionNodes = (sourceFile: SourceFile): Node[] => [\n ...sourceFile.getFunctions(),\n ...sourceFile.getVariableDeclarations().filter((declaration) => {\n const initializer = declaration.getInitializer();\n return initializer && (Node.isArrowFunction(initializer) || Node.isCallExpression(initializer));\n }),\n];\n\nconst collectComponentDefaultsAndProps = (\n sourceFile: SourceFile,\n defaultProps: Map<string, string>,\n componentPropNames: Set<string>,\n): void => {\n getComponentFunctionNodes(sourceFile).forEach((fn) => {\n if (Node.isFunctionDeclaration(fn)) {\n extractDefaultsFromFunction(fn, defaultProps);\n extractAllPropNames(fn, componentPropNames);\n return;\n }\n\n if (!Node.isVariableDeclaration(fn)) {\n return;\n }\n\n const initializer = fn.getInitializer();\n if (!initializer) {\n return;\n }\n\n if (Node.isCallExpression(initializer)) {\n initializer.getArguments().forEach((arg) => {\n if (Node.isFunctionExpression(arg) || Node.isArrowFunction(arg)) {\n extractDefaultsFromFunction(arg, defaultProps);\n extractAllPropNames(arg, componentPropNames);\n }\n });\n }\n\n if (Node.isArrowFunction(initializer)) {\n extractDefaultsFromFunction(initializer, defaultProps);\n extractAllPropNames(initializer, componentPropNames);\n }\n });\n};\n\nconst extractConditionalStringLiterals = (node: Node): string[] => {\n if (Node.isStringLiteral(node)) {\n return [node.getLiteralValue()];\n }\n\n if (Node.isConditionalExpression(node)) {\n return [\n ...extractConditionalStringLiterals(node.getWhenTrue()),\n ...extractConditionalStringLiterals(node.getWhenFalse()),\n ];\n }\n\n return [];\n};\n\nconst storeVariantLiteralValues = (\n variantKey: string,\n literalValues: string[],\n getStylesLiterals: Map<string, string>,\n): void => {\n literalValues.forEach((value, index) => {\n const literalKey = index === 0 ? variantKey : `${variantKey}:${index}`;\n getStylesLiterals.set(literalKey, value);\n });\n};\n\nconst handleGetStylesPropertyAssignment = (\n prop: Node & { getName: () => string; getInitializer: () => Node | undefined },\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n runtimeConfigGetStyles: Map<string, string[]>,\n): void => {\n const variantKey = prop.getName();\n addStyleProp(styleProps, variantKey);\n\n const initializer = prop.getInitializer();\n if (!initializer) {\n return;\n }\n\n if (Node.isStringLiteral(initializer)) {\n getStylesLiterals.set(variantKey, initializer.getLiteralValue());\n }\n\n if (Node.isIdentifier(initializer)) {\n addPropToVariantKeyMapping(propToVariantKeys, initializer.getText(), variantKey);\n }\n\n collectRuntimeSelectorsFromExpression(initializer, runtimeBindings).forEach((selector) => {\n addRuntimeSelector(runtimeConfigGetStyles, variantKey, selector);\n });\n\n const fallbackIdentifier = extractFallbackIdentifier(initializer);\n if (fallbackIdentifier) {\n addPropToVariantKeyMapping(propToVariantKeys, fallbackIdentifier, variantKey);\n }\n\n if (Node.isConditionalExpression(initializer)) {\n const allValues = [\n ...extractConditionalStringLiterals(initializer.getWhenTrue()),\n ...extractConditionalStringLiterals(initializer.getWhenFalse()),\n ];\n storeVariantLiteralValues(variantKey, allValues, getStylesLiterals);\n }\n};\n\nconst handleGetStylesObjectProperty = (\n prop: Node,\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n sourceFile: SourceFile,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n runtimeConfigGetStyles: Map<string, string[]>,\n): void => {\n if (Node.isPropertyAssignment(prop)) {\n handleGetStylesPropertyAssignment(\n prop,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n runtimeBindings,\n runtimeConfigGetStyles,\n );\n return;\n }\n\n if (Node.isShorthandPropertyAssignment(prop)) {\n addStyleProp(styleProps, prop.getName());\n return;\n }\n\n if (Node.isSpreadAssignment(prop) && Node.isIdentifier(prop.getExpression())) {\n const objectLiteral = findVariableObjectLiteral(sourceFile, prop.getExpression().getText());\n if (objectLiteral) {\n analyzeObjectForVariantMappings(\n objectLiteral,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n sourceFile,\n );\n }\n }\n};\n\nconst collectGetStylesMetadata = (\n sourceFile: SourceFile,\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n runtimeConfigGetStyles: Map<string, string[]>,\n): void => {\n sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((call) => call.getExpression().getText() === 'getStyles')\n .forEach((call) => {\n const args = call.getArguments();\n if (args.length === 0 || !Node.isObjectLiteralExpression(args[0])) {\n return;\n }\n\n args[0].getProperties().forEach((prop) => {\n handleGetStylesObjectProperty(\n prop,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n sourceFile,\n runtimeBindings,\n runtimeConfigGetStyles,\n );\n });\n });\n};\n\nconst collectCxLiterals = (sourceFile: SourceFile, cxLiterals: string[]): void => {\n sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((call) => call.getExpression().getText() === 'cx')\n .forEach((call) => {\n call.getArguments().forEach((arg) => extractCxStringLiterals(arg, cxLiterals));\n });\n};\n\nconst pushUniqueClasses = (target: string[], rawValue: string): void => {\n rawValue\n .split(/\\s+/)\n .filter(Boolean)\n .forEach((className) => {\n if (!target.includes(className)) {\n target.push(className);\n }\n });\n};\n\nconst collectIntrinsicClassNameLiterals = (sourceFile: SourceFile, cxLiterals: string[]): void => {\n const jsxElements = [\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement),\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxOpeningElement),\n ];\n\n jsxElements.forEach((element) => {\n const tagName = element.getTagNameNode().getText();\n if (!/^[a-z]/.test(tagName)) {\n return;\n }\n\n element.getAttributes().forEach((attr) => {\n if (!Node.isJsxAttribute(attr) || attr.getNameNode().getText() !== 'className') {\n return;\n }\n\n const initializer = attr.getInitializer();\n if (!initializer) {\n return;\n }\n\n if (Node.isStringLiteral(initializer)) {\n pushUniqueClasses(cxLiterals, initializer.getLiteralValue());\n return;\n }\n\n if (!Node.isJsxExpression(initializer)) {\n return;\n }\n\n const expr = initializer.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n pushUniqueClasses(cxLiterals, expr.getLiteralValue());\n }\n });\n });\n};\n\n/**\n * Extract UDS components used internally in the file and their prop values.\n * Also detects prop aliasing (e.g., columnGap={gap} means gap -> columnGap).\n */\nconst extractInternalComponents = (\n sourceFile: SourceFile,\n internalComponents: string[],\n internalComponentProps: Map<string, Map<string, string[]>>,\n runtimeConfigInternalComponentProps: Map<string, Map<string, string[]>>,\n propToVariantKeys: Map<string, string[]>,\n componentProps: Set<string>,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n): void => {\n collectImportedInternalComponents(sourceFile, internalComponents);\n collectInternalComponentUsages(\n sourceFile,\n internalComponents,\n internalComponentProps,\n runtimeConfigInternalComponentProps,\n propToVariantKeys,\n componentProps,\n runtimeBindings,\n );\n};\n\nconst isInternalUdsModule = (moduleSpec: string): boolean => {\n const isUdsImport =\n moduleSpec.startsWith('@yahoo/uds') ||\n moduleSpec.startsWith('../') ||\n moduleSpec.startsWith('./');\n\n return isUdsImport && (moduleSpec.includes('/components/') || moduleSpec === '@yahoo/uds');\n};\n\nconst pushUniqueComponentName = (components: string[], name: string): void => {\n if (/^[A-Z]/.test(name) && !components.includes(name)) {\n components.push(name);\n }\n};\n\nconst collectImportedInternalComponents = (\n sourceFile: SourceFile,\n internalComponents: string[],\n): void => {\n sourceFile.getImportDeclarations().forEach((importDecl) => {\n if (!isInternalUdsModule(importDecl.getModuleSpecifierValue())) {\n return;\n }\n\n importDecl\n .getNamedImports()\n .forEach((namedImport) => pushUniqueComponentName(internalComponents, namedImport.getName()));\n });\n};\n\nconst getOrCreateComponentPropsMap = (\n internalComponentProps: Map<string, Map<string, string[]>>,\n componentName: string,\n): Map<string, string[]> => {\n const existing = internalComponentProps.get(componentName);\n if (existing) {\n return existing;\n }\n\n const created = new Map<string, string[]>();\n internalComponentProps.set(componentName, created);\n return created;\n};\n\nconst extractJsxAttributeLiteralValues = (\n attr: Node,\n componentProps: Set<string>,\n propToVariantKeys: Map<string, string[]>,\n): { propName: string; values: string[] } | null => {\n if (!Node.isJsxAttribute(attr)) {\n return null;\n }\n\n const propName = attr.getNameNode().getText();\n const initializer = attr.getInitializer();\n if (!initializer) {\n return { propName, values: [] };\n }\n\n if (Node.isStringLiteral(initializer)) {\n return { propName, values: [initializer.getLiteralValue()] };\n }\n\n if (!Node.isJsxExpression(initializer)) {\n return { propName, values: [] };\n }\n\n const expr = initializer.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n return { propName, values: [expr.getLiteralValue()] };\n }\n\n if (expr && Node.isIdentifier(expr)) {\n const identifierName = expr.getText();\n if (componentProps.has(identifierName) && identifierName !== propName) {\n addPropToVariantKeyMapping(propToVariantKeys, identifierName, propName);\n }\n }\n\n return { propName, values: [] };\n};\n\nconst collectInternalComponentUsages = (\n sourceFile: SourceFile,\n internalComponents: string[],\n internalComponentProps: Map<string, Map<string, string[]>>,\n runtimeConfigInternalComponentProps: Map<string, Map<string, string[]>>,\n propToVariantKeys: Map<string, string[]>,\n componentProps: Set<string>,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n): void => {\n const jsxElements = [\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement),\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxOpeningElement),\n ];\n\n jsxElements.forEach((element) => {\n const tagName = element.getTagNameNode().getText();\n if (!/^[A-Z]/.test(tagName)) {\n return;\n }\n\n pushUniqueComponentName(internalComponents, tagName);\n\n element.getAttributes().forEach((attr) => {\n if (Node.isJsxAttribute(attr)) {\n const initializer = attr.getInitializer();\n const expression =\n initializer && Node.isJsxExpression(initializer)\n ? initializer.getExpression()\n : undefined;\n const runtimeSelectors = expression\n ? collectRuntimeSelectorsFromExpression(expression, runtimeBindings)\n : [];\n\n if (runtimeSelectors.length > 0) {\n const runtimePropsMap = getOrCreateComponentPropsMap(\n runtimeConfigInternalComponentProps,\n tagName,\n );\n const runtimePropName = attr.getNameNode().getText();\n const existingRuntimeSelectors = runtimePropsMap.get(runtimePropName) ?? [];\n runtimePropsMap.set(runtimePropName, [\n ...new Set([...existingRuntimeSelectors, ...runtimeSelectors]),\n ]);\n }\n }\n\n const extracted = extractJsxAttributeLiteralValues(attr, componentProps, propToVariantKeys);\n if (!extracted || extracted.values.length === 0) {\n return;\n }\n\n const componentPropsMap = getOrCreateComponentPropsMap(internalComponentProps, tagName);\n const existingValues = componentPropsMap.get(extracted.propName) ?? [];\n const mergedValues = [...new Set([...existingValues, ...extracted.values])];\n componentPropsMap.set(extracted.propName, mergedValues);\n });\n });\n};\n\n/**\n * Extract default prop values from a function's parameter destructuring\n */\nconst extractDefaultsFromFunction = (fn: Node, defaults: Map<string, string>): void => {\n let params: Node[] = [];\n\n if (Node.isFunctionDeclaration(fn) || Node.isFunctionExpression(fn)) {\n params = fn.getParameters();\n } else if (Node.isArrowFunction(fn)) {\n params = fn.getParameters();\n }\n\n params.forEach((param) => {\n if (!Node.isParameterDeclaration(param)) {\n return;\n }\n\n const nameNode = param.getNameNode();\n if (!nameNode || !Node.isObjectBindingPattern(nameNode)) {\n return;\n }\n\n nameNode.getElements().forEach((element) => {\n const propName = element.getPropertyNameNode()?.getText() || element.getName();\n const initializer = element.getInitializer();\n\n if (initializer && Node.isStringLiteral(initializer)) {\n defaults.set(propName, initializer.getLiteralValue());\n } else if (initializer && Node.isIdentifier(initializer)) {\n const resolved = resolveIdentifierToStringLiteral(initializer);\n if (resolved) {\n defaults.set(propName, resolved);\n }\n }\n });\n });\n};\n\n/**\n * Extract ALL prop names from a function's parameter destructuring (not just defaults)\n */\nconst extractAllPropNames = (fn: Node, propNames: Set<string>): void => {\n let params: Node[] = [];\n\n if (Node.isFunctionDeclaration(fn) || Node.isFunctionExpression(fn)) {\n params = fn.getParameters();\n } else if (Node.isArrowFunction(fn)) {\n params = fn.getParameters();\n }\n\n params.forEach((param) => {\n if (!Node.isParameterDeclaration(param)) {\n return;\n }\n\n const nameNode = param.getNameNode();\n if (!nameNode || !Node.isObjectBindingPattern(nameNode)) {\n return;\n }\n\n nameNode.getElements().forEach((element) => {\n const propName = element.getPropertyNameNode()?.getText() || element.getName();\n propNames.add(propName);\n });\n });\n};\n\n/**\n * Get default classes for a component based on its default props\n */\nconst getDefaultClasses = (\n componentInfo: ComponentInfo,\n variants: Record<string, Record<string, string>>,\n): string[] => {\n const classes: string[] = [];\n\n componentInfo.defaultProps.forEach((propValue, propName) => {\n const variantGroup = variants[propName as keyof typeof variants];\n if (variantGroup && variantGroup[propValue]) {\n classes.push(variantGroup[propValue]);\n }\n });\n\n return classes;\n};\n\n/**\n * Get all components (including dependencies) for a given component\n */\nconst getComponentWithDependencies = (\n componentInfo: ComponentInfo,\n allComponents: Map<string, ComponentInfo>,\n visited: Set<string> = new Set(),\n): ComponentInfo[] => {\n if (visited.has(componentInfo.name)) {\n return [];\n }\n visited.add(componentInfo.name);\n\n const result: ComponentInfo[] = [componentInfo];\n\n componentInfo.internalComponents.forEach((depName) => {\n const depInfo = allComponents.get(depName);\n if (depInfo) {\n result.push(...getComponentWithDependencies(depInfo, allComponents, visited));\n }\n });\n\n return result;\n};\n\n/**\n * Extract string literals from cx() call arguments.\n * Handles:\n * - Direct string literals: cx('class1', 'class2')\n * - Object keys: cx({ 'class1': condition, 'class2': true })\n * - Nested calls and arrays\n */\nconst extractCxStringLiterals = (node: Node, literals: string[]): void => {\n if (Node.isStringLiteral(node)) {\n // Split by whitespace to handle multiple classes in one string\n const classes = node.getLiteralValue().split(/\\s+/).filter(Boolean);\n classes.forEach((cls) => {\n if (!literals.includes(cls)) {\n literals.push(cls);\n }\n });\n } else if (Node.isObjectLiteralExpression(node)) {\n // Extract keys from object: cx({ 'class1': condition })\n node.getProperties().forEach((prop) => {\n if (Node.isPropertyAssignment(prop)) {\n const nameNode = prop.getNameNode();\n if (Node.isStringLiteral(nameNode)) {\n const classes = nameNode.getLiteralValue().split(/\\s+/).filter(Boolean);\n classes.forEach((cls) => {\n if (!literals.includes(cls)) {\n literals.push(cls);\n }\n });\n } else if (Node.isIdentifier(nameNode)) {\n // Plain identifier key: cx({ className: condition })\n const cls = nameNode.getText();\n if (!literals.includes(cls)) {\n literals.push(cls);\n }\n }\n }\n });\n } else if (Node.isArrayLiteralExpression(node)) {\n // Recurse into array elements\n node.getElements().forEach((element) => {\n extractCxStringLiterals(element, literals);\n });\n } else if (Node.isConditionalExpression(node)) {\n // Handle ternary: condition ? 'class1' : 'class2'\n extractCxStringLiterals(node.getWhenTrue(), literals);\n extractCxStringLiterals(node.getWhenFalse(), literals);\n } else if (Node.isBinaryExpression(node)) {\n // Handle logical expressions: condition && 'class'\n extractCxStringLiterals(node.getLeft(), literals);\n extractCxStringLiterals(node.getRight(), literals);\n }\n};\n\n/**\n * Try to resolve an identifier to its initializer value (for const declarations)\n */\nconst resolveIdentifierToObject = (\n sourceFile: SourceFile,\n identifier: string,\n): Record<string, string> | null => {\n // Find variable declarations in the file\n const varDecls = sourceFile.getDescendantsOfKind(SyntaxKind.VariableDeclaration);\n\n const decl = varDecls.find((candidate) => candidate.getName() === identifier);\n if (!decl) {\n return null;\n }\n\n let initializer = decl.getInitializer();\n if (!initializer) {\n return null;\n }\n\n // Unwrap \"as const\" expressions: { ... } as const\n if (Node.isAsExpression(initializer)) {\n initializer = initializer.getExpression();\n }\n\n if (!Node.isObjectLiteralExpression(initializer)) {\n return null;\n }\n\n // Extract properties from the object literal\n const result: Record<string, string> = {};\n initializer.getProperties().forEach((prop) => {\n if (!Node.isPropertyAssignment(prop)) {\n return;\n }\n\n const propName = prop.getName();\n const propInit = prop.getInitializer();\n\n if (propInit && Node.isStringLiteral(propInit)) {\n result[propName] = propInit.getLiteralValue();\n }\n });\n\n return result;\n};\n\n/**\n * Extract motion CSS variable prefixes from SpringMotionConfig usage.\n * Returns prefixes like ['--uds-motion-bouncy-4-', '--uds-motion-smooth-3-']\n */\nconst extractMotionVarPrefixes = (sourceFile: SourceFile): string[] => {\n const prefixes: string[] = [];\n\n // Find all SpringMotionConfig JSX elements\n const jsxElements = [\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement),\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxOpeningElement),\n ];\n\n jsxElements.forEach((element) => {\n const tagName = element.getTagNameNode().getText();\n if (tagName !== 'SpringMotionConfig') {\n return;\n }\n\n // Extract prop values\n const props: Record<string, string | null> = {\n layoutVariant: null,\n layoutSpeed: null,\n colorVariant: null,\n colorSpeed: null,\n };\n\n const attrs = element.getAttributes();\n attrs.forEach((attr) => {\n // Handle spread attributes: {...toggleTransition}\n if (Node.isJsxSpreadAttribute(attr)) {\n const expr = attr.getExpression();\n if (Node.isIdentifier(expr)) {\n const spreadObj = resolveIdentifierToObject(sourceFile, expr.getText());\n if (spreadObj) {\n // Apply spread values to props\n Object.keys(props).forEach((key) => {\n if (key in spreadObj) {\n props[key] = spreadObj[key];\n }\n });\n }\n }\n return;\n }\n\n if (!Node.isJsxAttribute(attr)) {\n return;\n }\n\n const propName = attr.getNameNode().getText();\n if (!(propName in props)) {\n return;\n }\n\n const initializer = attr.getInitializer();\n if (initializer) {\n if (Node.isStringLiteral(initializer)) {\n props[propName] = initializer.getLiteralValue();\n } else if (Node.isJsxExpression(initializer)) {\n const expr = initializer.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n props[propName] = expr.getLiteralValue();\n }\n // If it's a variable/prop, we can't determine the value statically\n // Fall back to including all variants for that dimension\n }\n }\n });\n\n // Build the CSS variable prefixes\n // Layout config: --uds-motion-{variant}-{speed}-\n const layoutVariant = props.layoutVariant ?? SPRING_MOTION_DEFAULTS.layoutVariant;\n const layoutSpeed = props.layoutSpeed ?? SPRING_MOTION_DEFAULTS.layoutSpeed;\n const layoutPrefix = `--uds-motion-${layoutVariant}-${layoutSpeed}-`;\n if (!prefixes.includes(layoutPrefix)) {\n prefixes.push(layoutPrefix);\n }\n\n // Color config: --uds-motion-{variant}-{speed}-\n const colorVariant = props.colorVariant ?? SPRING_MOTION_DEFAULTS.colorVariant;\n const colorSpeed = props.colorSpeed ?? SPRING_MOTION_DEFAULTS.colorSpeed;\n const colorPrefix = `--uds-motion-${colorVariant}-${colorSpeed}-`;\n if (!prefixes.includes(colorPrefix)) {\n prefixes.push(colorPrefix);\n }\n });\n\n return prefixes;\n};\n\nconst resolveIdentifierToStringLiteral = (identifier: Node): string | null => {\n if (!Node.isIdentifier(identifier)) {\n return null;\n }\n\n const symbol = identifier.getSymbol();\n if (!symbol) {\n return resolveImportedIdentifier(identifier);\n }\n\n const resolvedDeclarationValue = symbol\n .getDeclarations()\n .reduce<string | undefined>((resolved, declaration) => {\n if (resolved) {\n return resolved;\n }\n\n if (Node.isVariableDeclaration(declaration)) {\n let initializer = declaration.getInitializer();\n\n // Unwrap \"as const\"\n if (initializer && Node.isAsExpression(initializer)) {\n initializer = initializer.getExpression();\n }\n\n if (initializer && Node.isStringLiteral(initializer)) {\n return initializer.getLiteralValue();\n }\n }\n\n if (Node.isEnumMember(declaration)) {\n const initializer = declaration.getInitializer();\n if (initializer && Node.isStringLiteral(initializer)) {\n return initializer.getLiteralValue();\n }\n }\n\n return undefined;\n }, undefined);\n\n if (resolvedDeclarationValue) {\n return resolvedDeclarationValue;\n }\n\n return resolveImportedIdentifier(identifier);\n};\n\nconst resolveImportedIdentifier = (identifier: Node): string | null => {\n if (!Node.isIdentifier(identifier)) {\n return null;\n }\n\n const name = identifier.getText();\n const sourceFile = identifier.getSourceFile();\n const project = sourceFile.getProject();\n const baseDir = path.dirname(sourceFile.getFilePath());\n\n const importResolution = sourceFile\n .getImportDeclarations()\n .reduce<string | undefined>((resolvedImport, importDecl) => {\n if (resolvedImport) {\n return resolvedImport;\n }\n\n const namedImport = importDecl.getNamedImports().find((n) => n.getName() === name);\n if (!namedImport) {\n return undefined;\n }\n\n const moduleSpec = importDecl.getModuleSpecifierValue();\n if (!moduleSpec.startsWith('.') || hasImportQuery(moduleSpec)) {\n return undefined;\n }\n\n const resolvedBase = path.resolve(baseDir, moduleSpec);\n const candidates = [resolvedBase, `${resolvedBase}.ts`, `${resolvedBase}.tsx`];\n\n return candidates.reduce<string | undefined>((resolvedCandidate, candidate) => {\n if (resolvedCandidate) {\n return resolvedCandidate;\n }\n\n if (!existsSync(candidate)) {\n return undefined;\n }\n\n const importedFile = project.addSourceFileAtPathIfExists(candidate);\n if (!importedFile) {\n return undefined;\n }\n\n const varDecl = importedFile.getVariableDeclaration(name);\n if (!varDecl) {\n return undefined;\n }\n\n let initializer = varDecl.getInitializer();\n if (initializer && Node.isAsExpression(initializer)) {\n initializer = initializer.getExpression();\n }\n\n return initializer && Node.isStringLiteral(initializer)\n ? initializer.getLiteralValue()\n : undefined;\n }, undefined);\n }, undefined);\n\n if (importResolution) {\n return importResolution;\n }\n\n return null;\n};\n\nexport type { ComponentInfo };\nexport {\n analyzeComponent,\n getComponentPath,\n getComponentWithDependencies,\n getDefaultClasses,\n scanComponentFiles,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"componentAnalyzer.js","names":[],"sources":["../../../../src/purger/optimized/utils/componentAnalyzer.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { SPRING_MOTION_DEFAULTS } from '@yahoo/uds-motion-tokens';\nimport fg from 'fast-glob';\nimport type { ObjectLiteralExpression, Project, SourceFile } from 'ts-morph';\nimport { Node, SyntaxKind } from 'ts-morph';\n\nimport { getRuntimeHookConfig } from '../../../runtimeConfig/hookMetadata';\nimport {\n getAllowedEntryFileGlobPatterns,\n stripAllowedEntryFileExtension,\n} from '../../../utils/entryPoints';\n\ninterface ComponentInfo {\n name: string;\n filePath: string;\n /** Default values from function parameter destructuring (e.g., display = 'flex') */\n defaultProps: Map<string, string>;\n /** Props passed to getStyles() calls */\n styleProps: string[];\n /** Hardcoded literal values passed directly to getStyles() (e.g., flex: 'none') */\n getStylesLiterals: Map<string, string>;\n /** Raw Tailwind class literals from cx() calls (e.g., 'absolute', 'opacity-0') */\n cxLiterals: string[];\n /** Other UDS components used internally */\n internalComponents: string[];\n /** Literal prop values passed to internal UDS components (e.g., <Icon color=\"current\" />) */\n internalComponentProps: Map<string, Map<string, string[]>>;\n /** Maps prop names to variant keys (e.g., variant -> [buttonVariantRoot, buttonVariantIcon]) */\n propToVariantKeys: Map<string, string[]>;\n /** Runtime-config-backed defaults for component props (e.g., size -> toast.defaultSize) */\n runtimeConfigDefaultProps: Map<string, string>;\n /** Runtime-config selectors used directly in getStyles() variant keys */\n runtimeConfigGetStyles: Map<string, string[]>;\n /** Runtime-config selectors passed to internal UDS component props */\n runtimeConfigInternalComponentProps: Map<string, Map<string, string[]>>;\n /**\n * Motion CSS variable prefixes used by this component.\n * e.g., ['--uds-motion-bouncy-4-', '--uds-motion-smooth-3-']\n * Empty array means no motion vars needed.\n */\n motionVarPrefixes: string[];\n}\n\ntype RuntimeConfigBinding = {\n selector: string;\n};\n\n/**\n * Known UDS component names (populated by scanning)\n */\nlet knownComponents: Set<string> | null = null;\n\n/**\n * Map of component name -> file path\n */\nlet componentPaths: Map<string, string> | null = null;\nlet scannedComponentsDir: string | null = null;\nconst hasImportQuery = (moduleSpecifier: string): boolean => moduleSpecifier.includes('?');\nconst scanComponentFilePaths = async (componentsDir: string): Promise<string[]> =>\n fg(getAllowedEntryFileGlobPatterns(), {\n cwd: componentsDir,\n absolute: true,\n });\n\n/**\n * Scan src/components to build a map of all component files\n */\nconst scanComponentFiles = async (componentsDir: string): Promise<Map<string, string>> => {\n if (componentPaths && scannedComponentsDir === componentsDir) {\n return componentPaths;\n }\n\n componentPaths = new Map();\n knownComponents = new Set();\n scannedComponentsDir = componentsDir;\n\n const nextComponentPaths = componentPaths;\n const nextKnownComponents = knownComponents;\n\n const files = await scanComponentFilePaths(componentsDir);\n\n files.forEach((file) => {\n // Skip test files and index files\n if (\n file.includes('.test.') ||\n path.basename(stripAllowedEntryFileExtension(file)) === 'index'\n ) {\n return;\n }\n\n const fileName = path.basename(stripAllowedEntryFileExtension(file));\n\n // Use PascalCase file names as component names\n if (/^[A-Z]/.test(fileName)) {\n nextComponentPaths.set(fileName, file);\n nextKnownComponents.add(fileName);\n }\n });\n\n return nextComponentPaths;\n};\n\n/**\n * Get the file path for a component by name\n */\nconst getComponentPath = async (\n componentName: string,\n componentsDir: string,\n): Promise<string | null> => {\n const paths = await scanComponentFiles(componentsDir);\n return paths.get(componentName) ?? null;\n};\n\n/**\n * Analyze an object literal for variant key mappings.\n * Handles:\n * - Direct property assignments: { fontSize: variant } -> variant maps to fontSize\n * - Nullish coalescing: { fontSize: fontSize ?? variant } -> variant maps to fontSize\n * - Conditional spreads: ...(condition ? { props } : {}) -> recursively analyze props\n */\nconst analyzeObjectForVariantMappings = (\n objLiteral: ObjectLiteralExpression,\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n sourceFile: SourceFile,\n): void => {\n objLiteral.getProperties().forEach((prop) => {\n if (Node.isPropertyAssignment(prop)) {\n analyzeVariantPropertyAssignment(prop, styleProps, getStylesLiterals, propToVariantKeys);\n return;\n }\n\n if (Node.isSpreadAssignment(prop)) {\n analyzeVariantSpreadAssignment(\n prop,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n sourceFile,\n );\n }\n });\n};\n\nconst addStyleProp = (styleProps: string[], variantKey: string): void => {\n if (!styleProps.includes(variantKey)) {\n styleProps.push(variantKey);\n }\n};\n\nconst addPropToVariantKeyMapping = (\n propToVariantKeys: Map<string, string[]>,\n propName: string,\n variantKey: string,\n): void => {\n const existing = propToVariantKeys.get(propName) ?? [];\n if (!existing.includes(variantKey)) {\n propToVariantKeys.set(propName, [...existing, variantKey]);\n }\n};\n\nconst addRuntimeSelector = (target: Map<string, string[]>, key: string, selector: string): void => {\n const existing = target.get(key) ?? [];\n if (!existing.includes(selector)) {\n target.set(key, [...existing, selector]);\n }\n};\n\nconst getExpressionWithoutWrappers = (node: Node): Node => {\n if (Node.isParenthesizedExpression(node)) {\n return getExpressionWithoutWrappers(node.getExpression());\n }\n\n if (Node.isAsExpression(node) || Node.isTypeAssertion(node) || Node.isSatisfiesExpression(node)) {\n return getExpressionWithoutWrappers(node.getExpression());\n }\n\n return node;\n};\n\nconst applyRuntimeSelectorIndex = (\n selector: string,\n indexKey: string,\n isIdentifierIndex = false,\n): string => {\n if (selector.includes('${')) {\n return selector;\n }\n\n return isIdentifierIndex ? selector + '.${' + indexKey + '}' : `${selector}.${indexKey}`;\n};\n\nconst resolveRuntimeBindingFromExpression = (\n expr: Node,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n): RuntimeConfigBinding | null => {\n const normalized = getExpressionWithoutWrappers(expr);\n\n if (Node.isIdentifier(normalized)) {\n return runtimeBindings.get(normalized.getText()) ?? null;\n }\n\n if (Node.isElementAccessExpression(normalized)) {\n const target = resolveRuntimeBindingFromExpression(normalized.getExpression(), runtimeBindings);\n if (!target) {\n return null;\n }\n\n const argumentExpression = normalized.getArgumentExpression();\n if (!argumentExpression) {\n return null;\n }\n\n const argument = getExpressionWithoutWrappers(argumentExpression);\n\n if (Node.isStringLiteral(argument)) {\n return {\n selector: applyRuntimeSelectorIndex(target.selector, argument.getLiteralValue()),\n };\n }\n\n if (Node.isIdentifier(argument)) {\n return {\n selector: applyRuntimeSelectorIndex(target.selector, argument.getText(), true),\n };\n }\n }\n\n if (Node.isPropertyAccessExpression(normalized)) {\n const target = resolveRuntimeBindingFromExpression(normalized.getExpression(), runtimeBindings);\n if (!target) {\n return null;\n }\n\n return { selector: applyRuntimeSelectorIndex(target.selector, normalized.getName()) };\n }\n\n return null;\n};\n\nconst collectRuntimeSelectorsFromExpression = (\n expr: Node,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n): string[] => {\n const normalized = getExpressionWithoutWrappers(expr);\n const resolvedBinding = resolveRuntimeBindingFromExpression(normalized, runtimeBindings);\n if (resolvedBinding) {\n return [resolvedBinding.selector];\n }\n\n if (Node.isConditionalExpression(normalized)) {\n return [\n ...collectRuntimeSelectorsFromExpression(normalized.getWhenTrue(), runtimeBindings),\n ...collectRuntimeSelectorsFromExpression(normalized.getWhenFalse(), runtimeBindings),\n ];\n }\n\n if (Node.isBinaryExpression(normalized)) {\n return [\n ...collectRuntimeSelectorsFromExpression(normalized.getLeft(), runtimeBindings),\n ...collectRuntimeSelectorsFromExpression(normalized.getRight(), runtimeBindings),\n ];\n }\n\n return [];\n};\n\nconst collectRuntimeConfigBindings = (\n sourceFile: SourceFile,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n runtimeConfigDefaultProps: Map<string, string>,\n): void => {\n sourceFile.getDescendantsOfKind(SyntaxKind.VariableDeclaration).forEach((declaration) => {\n const initializer = declaration.getInitializer();\n if (!initializer) {\n return;\n }\n\n const normalizedInitializer = getExpressionWithoutWrappers(initializer);\n const nameNode = declaration.getNameNode();\n\n if (Node.isObjectBindingPattern(nameNode) && Node.isCallExpression(normalizedInitializer)) {\n const hookName = normalizedInitializer.getExpression().getText();\n const hookConfig = getRuntimeHookConfig(hookName);\n if (!hookConfig) {\n return;\n }\n\n Object.entries(hookConfig.defaultProps).forEach(([propName, selector]) => {\n runtimeConfigDefaultProps.set(propName, selector);\n });\n\n nameNode.getElements().forEach((element) => {\n const fieldName = element.getPropertyNameNode()?.getText() ?? element.getName();\n const localName = element.getName();\n const fieldConfig = hookConfig.fields[fieldName as keyof typeof hookConfig.fields];\n if (!fieldConfig) {\n return;\n }\n\n runtimeBindings.set(localName, { selector: fieldConfig.bindingSelector });\n });\n\n return;\n }\n\n if (!Node.isIdentifier(nameNode)) {\n return;\n }\n\n const resolvedBinding = resolveRuntimeBindingFromExpression(\n normalizedInitializer,\n runtimeBindings,\n );\n if (resolvedBinding) {\n runtimeBindings.set(nameNode.getText(), resolvedBinding);\n }\n });\n};\n\nconst extractFallbackIdentifier = (initializer: Node): string | null => {\n if (!Node.isBinaryExpression(initializer)) {\n return null;\n }\n\n const operatorKind = initializer.getOperatorToken().getKind();\n const isFallbackOperator =\n operatorKind === SyntaxKind.QuestionQuestionToken || operatorKind === SyntaxKind.BarBarToken;\n\n if (!isFallbackOperator || !Node.isIdentifier(initializer.getRight())) {\n return null;\n }\n\n return initializer.getRight().getText();\n};\n\nconst analyzeVariantPropertyAssignment = (\n prop: Node & { getName: () => string; getInitializer: () => Node | undefined },\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n): void => {\n const variantKey = prop.getName();\n addStyleProp(styleProps, variantKey);\n\n const initializer = prop.getInitializer();\n if (!initializer) {\n return;\n }\n\n if (Node.isStringLiteral(initializer)) {\n getStylesLiterals.set(variantKey, initializer.getLiteralValue());\n }\n\n if (Node.isIdentifier(initializer)) {\n addPropToVariantKeyMapping(propToVariantKeys, initializer.getText(), variantKey);\n }\n\n const fallbackIdentifier = extractFallbackIdentifier(initializer);\n if (fallbackIdentifier) {\n addPropToVariantKeyMapping(propToVariantKeys, fallbackIdentifier, variantKey);\n }\n};\n\nconst findVariableObjectLiteral = (\n sourceFile: SourceFile,\n variableName: string,\n): ObjectLiteralExpression | null => {\n const declaration = sourceFile\n .getDescendantsOfKind(SyntaxKind.VariableDeclaration)\n .find((candidate) => candidate.getName() === variableName);\n const initializer = declaration?.getInitializer();\n\n return initializer && Node.isObjectLiteralExpression(initializer) ? initializer : null;\n};\n\nconst analyzeVariantSpreadAssignment = (\n prop: Node & { getExpression: () => Node },\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n sourceFile: SourceFile,\n): void => {\n const spreadExpr = prop.getExpression();\n\n if (Node.isParenthesizedExpression(spreadExpr)) {\n const conditionalExpr = spreadExpr.getExpression();\n if (Node.isConditionalExpression(conditionalExpr)) {\n const whenTrue = conditionalExpr.getWhenTrue();\n if (!Node.isObjectLiteralExpression(whenTrue)) {\n return;\n }\n\n analyzeObjectForVariantMappings(\n whenTrue,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n sourceFile,\n );\n }\n }\n\n if (Node.isIdentifier(spreadExpr)) {\n const objectLiteral = findVariableObjectLiteral(sourceFile, spreadExpr.getText());\n if (objectLiteral) {\n analyzeObjectForVariantMappings(\n objectLiteral,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n sourceFile,\n );\n }\n }\n};\n\n/**\n * Analyzes a UDS component file to extract:\n * 1. Default prop values (e.g., display = 'flex')\n * 2. Props passed to getStyles()\n * 3. Internal UDS component usage\n */\nconst analyzeComponent = (project: Project, componentPath: string): ComponentInfo | null => {\n const sourceFile = project.getSourceFile(componentPath);\n if (!sourceFile) {\n return null;\n }\n\n const componentName = path.basename(stripAllowedEntryFileExtension(componentPath));\n const defaultProps = new Map<string, string>();\n const componentPropNames = new Set<string>(); // All prop names (not just defaults)\n const styleProps: string[] = [];\n const getStylesLiterals = new Map<string, string>();\n const cxLiterals: string[] = [];\n const internalComponents: string[] = [];\n const internalComponentProps = new Map<string, Map<string, string[]>>();\n const propToVariantKeys = new Map<string, string[]>();\n const runtimeConfigDefaultProps = new Map<string, string>();\n const runtimeConfigGetStyles = new Map<string, string[]>();\n const runtimeConfigInternalComponentProps = new Map<string, Map<string, string[]>>();\n const runtimeBindings = new Map<string, RuntimeConfigBinding>();\n\n collectComponentDefaultsAndProps(sourceFile, defaultProps, componentPropNames);\n\n collectRuntimeConfigBindings(sourceFile, runtimeBindings, runtimeConfigDefaultProps);\n\n collectGetStylesMetadata(\n sourceFile,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n runtimeBindings,\n runtimeConfigGetStyles,\n );\n\n collectCxLiterals(sourceFile, cxLiterals);\n collectIntrinsicClassNameLiterals(sourceFile, cxLiterals);\n\n // Find internal UDS component usage and their prop values\n // Also detect prop aliasing (e.g., gap -> columnGap, rowGap in VStack)\n extractInternalComponents(\n sourceFile,\n internalComponents,\n internalComponentProps,\n runtimeConfigInternalComponentProps,\n propToVariantKeys,\n componentPropNames,\n runtimeBindings,\n );\n\n // Extract motion CSS variable prefixes from SpringMotionConfig usage\n const motionVarPrefixes = extractMotionVarPrefixes(sourceFile);\n\n // Tab and TabList read `variant` from Tabs context (default 'primary' in tabsContext), not from\n // component props, so destructuring defaults miss it. Record the context default for purge.\n const tabsContextVariantComponents = new Set(['Tab', 'TabList']);\n if (\n tabsContextVariantComponents.has(componentName) &&\n propToVariantKeys.has('variant') &&\n !defaultProps.has('variant')\n ) {\n defaultProps.set('variant', 'primary');\n }\n\n return {\n name: componentName,\n filePath: componentPath,\n defaultProps,\n styleProps,\n getStylesLiterals,\n cxLiterals,\n internalComponents,\n internalComponentProps,\n propToVariantKeys,\n runtimeConfigDefaultProps,\n runtimeConfigGetStyles,\n runtimeConfigInternalComponentProps,\n motionVarPrefixes,\n };\n};\n\nconst getComponentFunctionNodes = (sourceFile: SourceFile): Node[] => [\n ...sourceFile.getFunctions(),\n ...sourceFile.getVariableDeclarations().filter((declaration) => {\n const initializer = declaration.getInitializer();\n return initializer && (Node.isArrowFunction(initializer) || Node.isCallExpression(initializer));\n }),\n];\n\nconst collectComponentDefaultsAndProps = (\n sourceFile: SourceFile,\n defaultProps: Map<string, string>,\n componentPropNames: Set<string>,\n): void => {\n getComponentFunctionNodes(sourceFile).forEach((fn) => {\n if (Node.isFunctionDeclaration(fn)) {\n extractDefaultsFromFunction(fn, defaultProps);\n extractAllPropNames(fn, componentPropNames);\n return;\n }\n\n if (!Node.isVariableDeclaration(fn)) {\n return;\n }\n\n const initializer = fn.getInitializer();\n if (!initializer) {\n return;\n }\n\n if (Node.isCallExpression(initializer)) {\n initializer.getArguments().forEach((arg) => {\n if (Node.isFunctionExpression(arg) || Node.isArrowFunction(arg)) {\n extractDefaultsFromFunction(arg, defaultProps);\n extractAllPropNames(arg, componentPropNames);\n }\n });\n }\n\n if (Node.isArrowFunction(initializer)) {\n extractDefaultsFromFunction(initializer, defaultProps);\n extractAllPropNames(initializer, componentPropNames);\n }\n });\n};\n\nconst extractConditionalStringLiterals = (node: Node): string[] => {\n if (Node.isStringLiteral(node)) {\n return [node.getLiteralValue()];\n }\n\n if (Node.isConditionalExpression(node)) {\n return [\n ...extractConditionalStringLiterals(node.getWhenTrue()),\n ...extractConditionalStringLiterals(node.getWhenFalse()),\n ];\n }\n\n return [];\n};\n\nconst storeVariantLiteralValues = (\n variantKey: string,\n literalValues: string[],\n getStylesLiterals: Map<string, string>,\n): void => {\n literalValues.forEach((value, index) => {\n const literalKey = index === 0 ? variantKey : `${variantKey}:${index}`;\n getStylesLiterals.set(literalKey, value);\n });\n};\n\n/** Values already recorded for `variantKey` (base key plus `variantKey:1`, `:2`, …). */\nconst getExistingLiteralValuesForVariantKey = (\n variantKey: string,\n getStylesLiterals: Map<string, string>,\n): string[] => {\n const values: string[] = [];\n const base = getStylesLiterals.get(variantKey);\n if (base !== undefined) {\n values.push(base);\n }\n let index = 1;\n while (true) {\n const key = `${variantKey}:${index}`;\n const next = getStylesLiterals.get(key);\n if (next === undefined) {\n break;\n }\n values.push(next);\n index++;\n }\n return values;\n};\n\n/**\n * Record a string literal for a variant key from a getStyles() call.\n * Multiple calls with the same key (e.g. Tab's active-off vs active-on classes) must\n * all be kept; a plain Map set would drop earlier literals.\n */\nconst appendGetStylesStringLiteral = (\n variantKey: string,\n value: string,\n getStylesLiterals: Map<string, string>,\n): void => {\n if (getExistingLiteralValuesForVariantKey(variantKey, getStylesLiterals).includes(value)) {\n return;\n }\n\n let nextIndex = 0;\n while (true) {\n const key = nextIndex === 0 ? variantKey : `${variantKey}:${nextIndex}`;\n if (!getStylesLiterals.has(key)) {\n getStylesLiterals.set(key, value);\n return;\n }\n nextIndex++;\n }\n};\n\nconst handleGetStylesPropertyAssignment = (\n prop: Node & { getName: () => string; getInitializer: () => Node | undefined },\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n runtimeConfigGetStyles: Map<string, string[]>,\n): void => {\n const variantKey = prop.getName();\n addStyleProp(styleProps, variantKey);\n\n const initializer = prop.getInitializer();\n if (!initializer) {\n return;\n }\n\n if (Node.isStringLiteral(initializer)) {\n appendGetStylesStringLiteral(variantKey, initializer.getLiteralValue(), getStylesLiterals);\n }\n\n if (Node.isIdentifier(initializer)) {\n addPropToVariantKeyMapping(propToVariantKeys, initializer.getText(), variantKey);\n }\n\n collectRuntimeSelectorsFromExpression(initializer, runtimeBindings).forEach((selector) => {\n addRuntimeSelector(runtimeConfigGetStyles, variantKey, selector);\n });\n\n const fallbackIdentifier = extractFallbackIdentifier(initializer);\n if (fallbackIdentifier) {\n addPropToVariantKeyMapping(propToVariantKeys, fallbackIdentifier, variantKey);\n }\n\n if (Node.isConditionalExpression(initializer)) {\n const allValues = [\n ...extractConditionalStringLiterals(initializer.getWhenTrue()),\n ...extractConditionalStringLiterals(initializer.getWhenFalse()),\n ];\n storeVariantLiteralValues(variantKey, allValues, getStylesLiterals);\n }\n};\n\nconst handleGetStylesObjectProperty = (\n prop: Node,\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n sourceFile: SourceFile,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n runtimeConfigGetStyles: Map<string, string[]>,\n): void => {\n if (Node.isPropertyAssignment(prop)) {\n handleGetStylesPropertyAssignment(\n prop,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n runtimeBindings,\n runtimeConfigGetStyles,\n );\n return;\n }\n\n if (Node.isShorthandPropertyAssignment(prop)) {\n addStyleProp(styleProps, prop.getName());\n return;\n }\n\n if (Node.isSpreadAssignment(prop) && Node.isIdentifier(prop.getExpression())) {\n const objectLiteral = findVariableObjectLiteral(sourceFile, prop.getExpression().getText());\n if (objectLiteral) {\n analyzeObjectForVariantMappings(\n objectLiteral,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n sourceFile,\n );\n }\n }\n};\n\nconst collectGetStylesMetadata = (\n sourceFile: SourceFile,\n styleProps: string[],\n getStylesLiterals: Map<string, string>,\n propToVariantKeys: Map<string, string[]>,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n runtimeConfigGetStyles: Map<string, string[]>,\n): void => {\n sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((call) => call.getExpression().getText() === 'getStyles')\n .forEach((call) => {\n const args = call.getArguments();\n if (args.length === 0 || !Node.isObjectLiteralExpression(args[0])) {\n return;\n }\n\n args[0].getProperties().forEach((prop) => {\n handleGetStylesObjectProperty(\n prop,\n styleProps,\n getStylesLiterals,\n propToVariantKeys,\n sourceFile,\n runtimeBindings,\n runtimeConfigGetStyles,\n );\n });\n });\n};\n\nconst collectCxLiterals = (sourceFile: SourceFile, cxLiterals: string[]): void => {\n sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((call) => call.getExpression().getText() === 'cx')\n .forEach((call) => {\n call.getArguments().forEach((arg) => extractCxStringLiterals(arg, cxLiterals));\n });\n};\n\nconst pushUniqueClasses = (target: string[], rawValue: string): void => {\n rawValue\n .split(/\\s+/)\n .filter(Boolean)\n .forEach((className) => {\n if (!target.includes(className)) {\n target.push(className);\n }\n });\n};\n\nconst collectIntrinsicClassNameLiterals = (sourceFile: SourceFile, cxLiterals: string[]): void => {\n const jsxElements = [\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement),\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxOpeningElement),\n ];\n\n jsxElements.forEach((element) => {\n const tagName = element.getTagNameNode().getText();\n if (!/^[a-z]/.test(tagName)) {\n return;\n }\n\n element.getAttributes().forEach((attr) => {\n if (!Node.isJsxAttribute(attr) || attr.getNameNode().getText() !== 'className') {\n return;\n }\n\n const initializer = attr.getInitializer();\n if (!initializer) {\n return;\n }\n\n if (Node.isStringLiteral(initializer)) {\n pushUniqueClasses(cxLiterals, initializer.getLiteralValue());\n return;\n }\n\n if (!Node.isJsxExpression(initializer)) {\n return;\n }\n\n const expr = initializer.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n pushUniqueClasses(cxLiterals, expr.getLiteralValue());\n }\n });\n });\n};\n\n/**\n * Extract UDS components used internally in the file and their prop values.\n * Also detects prop aliasing (e.g., columnGap={gap} means gap -> columnGap).\n */\nconst extractInternalComponents = (\n sourceFile: SourceFile,\n internalComponents: string[],\n internalComponentProps: Map<string, Map<string, string[]>>,\n runtimeConfigInternalComponentProps: Map<string, Map<string, string[]>>,\n propToVariantKeys: Map<string, string[]>,\n componentProps: Set<string>,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n): void => {\n collectImportedInternalComponents(sourceFile, internalComponents);\n collectInternalComponentUsages(\n sourceFile,\n internalComponents,\n internalComponentProps,\n runtimeConfigInternalComponentProps,\n propToVariantKeys,\n componentProps,\n runtimeBindings,\n );\n};\n\nconst isInternalUdsModule = (moduleSpec: string): boolean => {\n const isUdsImport =\n moduleSpec.startsWith('@yahoo/uds') ||\n moduleSpec.startsWith('../') ||\n moduleSpec.startsWith('./');\n\n return isUdsImport && (moduleSpec.includes('/components/') || moduleSpec === '@yahoo/uds');\n};\n\nconst pushUniqueComponentName = (components: string[], name: string): void => {\n if (/^[A-Z]/.test(name) && !components.includes(name)) {\n components.push(name);\n }\n};\n\nconst collectImportedInternalComponents = (\n sourceFile: SourceFile,\n internalComponents: string[],\n): void => {\n sourceFile.getImportDeclarations().forEach((importDecl) => {\n if (!isInternalUdsModule(importDecl.getModuleSpecifierValue())) {\n return;\n }\n\n importDecl\n .getNamedImports()\n .forEach((namedImport) => pushUniqueComponentName(internalComponents, namedImport.getName()));\n });\n};\n\nconst getOrCreateComponentPropsMap = (\n internalComponentProps: Map<string, Map<string, string[]>>,\n componentName: string,\n): Map<string, string[]> => {\n const existing = internalComponentProps.get(componentName);\n if (existing) {\n return existing;\n }\n\n const created = new Map<string, string[]>();\n internalComponentProps.set(componentName, created);\n return created;\n};\n\nconst extractJsxAttributeLiteralValues = (\n attr: Node,\n componentProps: Set<string>,\n propToVariantKeys: Map<string, string[]>,\n): { propName: string; values: string[] } | null => {\n if (!Node.isJsxAttribute(attr)) {\n return null;\n }\n\n const propName = attr.getNameNode().getText();\n const initializer = attr.getInitializer();\n if (!initializer) {\n return { propName, values: [] };\n }\n\n if (Node.isStringLiteral(initializer)) {\n return { propName, values: [initializer.getLiteralValue()] };\n }\n\n if (!Node.isJsxExpression(initializer)) {\n return { propName, values: [] };\n }\n\n const expr = initializer.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n return { propName, values: [expr.getLiteralValue()] };\n }\n\n if (expr && Node.isIdentifier(expr)) {\n const identifierName = expr.getText();\n if (componentProps.has(identifierName) && identifierName !== propName) {\n addPropToVariantKeyMapping(propToVariantKeys, identifierName, propName);\n }\n }\n\n return { propName, values: [] };\n};\n\nconst collectInternalComponentUsages = (\n sourceFile: SourceFile,\n internalComponents: string[],\n internalComponentProps: Map<string, Map<string, string[]>>,\n runtimeConfigInternalComponentProps: Map<string, Map<string, string[]>>,\n propToVariantKeys: Map<string, string[]>,\n componentProps: Set<string>,\n runtimeBindings: Map<string, RuntimeConfigBinding>,\n): void => {\n const jsxElements = [\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement),\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxOpeningElement),\n ];\n\n jsxElements.forEach((element) => {\n const tagName = element.getTagNameNode().getText();\n if (!/^[A-Z]/.test(tagName)) {\n return;\n }\n\n pushUniqueComponentName(internalComponents, tagName);\n\n element.getAttributes().forEach((attr) => {\n if (Node.isJsxAttribute(attr)) {\n const initializer = attr.getInitializer();\n const expression =\n initializer && Node.isJsxExpression(initializer)\n ? initializer.getExpression()\n : undefined;\n const runtimeSelectors = expression\n ? collectRuntimeSelectorsFromExpression(expression, runtimeBindings)\n : [];\n\n if (runtimeSelectors.length > 0) {\n const runtimePropsMap = getOrCreateComponentPropsMap(\n runtimeConfigInternalComponentProps,\n tagName,\n );\n const runtimePropName = attr.getNameNode().getText();\n const existingRuntimeSelectors = runtimePropsMap.get(runtimePropName) ?? [];\n runtimePropsMap.set(runtimePropName, [\n ...new Set([...existingRuntimeSelectors, ...runtimeSelectors]),\n ]);\n }\n }\n\n const extracted = extractJsxAttributeLiteralValues(attr, componentProps, propToVariantKeys);\n if (!extracted || extracted.values.length === 0) {\n return;\n }\n\n const componentPropsMap = getOrCreateComponentPropsMap(internalComponentProps, tagName);\n const existingValues = componentPropsMap.get(extracted.propName) ?? [];\n const mergedValues = [...new Set([...existingValues, ...extracted.values])];\n componentPropsMap.set(extracted.propName, mergedValues);\n });\n });\n};\n\n/**\n * Extract default prop values from a function's parameter destructuring\n */\nconst extractDefaultsFromFunction = (fn: Node, defaults: Map<string, string>): void => {\n let params: Node[] = [];\n\n if (Node.isFunctionDeclaration(fn) || Node.isFunctionExpression(fn)) {\n params = fn.getParameters();\n } else if (Node.isArrowFunction(fn)) {\n params = fn.getParameters();\n }\n\n params.forEach((param) => {\n if (!Node.isParameterDeclaration(param)) {\n return;\n }\n\n const nameNode = param.getNameNode();\n if (!nameNode || !Node.isObjectBindingPattern(nameNode)) {\n return;\n }\n\n nameNode.getElements().forEach((element) => {\n const propName = element.getPropertyNameNode()?.getText() || element.getName();\n const initializer = element.getInitializer();\n\n if (initializer && Node.isStringLiteral(initializer)) {\n defaults.set(propName, initializer.getLiteralValue());\n } else if (initializer && Node.isIdentifier(initializer)) {\n const resolved = resolveIdentifierToStringLiteral(initializer);\n if (resolved) {\n defaults.set(propName, resolved);\n }\n }\n });\n });\n};\n\n/**\n * Extract ALL prop names from a function's parameter destructuring (not just defaults)\n */\nconst extractAllPropNames = (fn: Node, propNames: Set<string>): void => {\n let params: Node[] = [];\n\n if (Node.isFunctionDeclaration(fn) || Node.isFunctionExpression(fn)) {\n params = fn.getParameters();\n } else if (Node.isArrowFunction(fn)) {\n params = fn.getParameters();\n }\n\n params.forEach((param) => {\n if (!Node.isParameterDeclaration(param)) {\n return;\n }\n\n const nameNode = param.getNameNode();\n if (!nameNode || !Node.isObjectBindingPattern(nameNode)) {\n return;\n }\n\n nameNode.getElements().forEach((element) => {\n const propName = element.getPropertyNameNode()?.getText() || element.getName();\n propNames.add(propName);\n });\n });\n};\n\n/**\n * Get default classes for a component based on its default props\n */\nconst getDefaultClasses = (\n componentInfo: ComponentInfo,\n variants: Record<string, Record<string, string>>,\n): string[] => {\n const classes: string[] = [];\n\n componentInfo.defaultProps.forEach((propValue, propName) => {\n const variantGroup = variants[propName as keyof typeof variants];\n if (variantGroup && variantGroup[propValue]) {\n classes.push(variantGroup[propValue]);\n }\n });\n\n return classes;\n};\n\n/**\n * Get all components (including dependencies) for a given component\n */\nconst getComponentWithDependencies = (\n componentInfo: ComponentInfo,\n allComponents: Map<string, ComponentInfo>,\n visited: Set<string> = new Set(),\n): ComponentInfo[] => {\n if (visited.has(componentInfo.name)) {\n return [];\n }\n visited.add(componentInfo.name);\n\n const result: ComponentInfo[] = [componentInfo];\n\n componentInfo.internalComponents.forEach((depName) => {\n const depInfo = allComponents.get(depName);\n if (depInfo) {\n result.push(...getComponentWithDependencies(depInfo, allComponents, visited));\n }\n });\n\n return result;\n};\n\n/**\n * Extract string literals from cx() call arguments.\n * Handles:\n * - Direct string literals: cx('class1', 'class2')\n * - Object keys: cx({ 'class1': condition, 'class2': true })\n * - Nested calls and arrays\n */\nconst extractCxStringLiterals = (node: Node, literals: string[]): void => {\n if (Node.isStringLiteral(node)) {\n // Split by whitespace to handle multiple classes in one string\n const classes = node.getLiteralValue().split(/\\s+/).filter(Boolean);\n classes.forEach((cls) => {\n if (!literals.includes(cls)) {\n literals.push(cls);\n }\n });\n } else if (Node.isObjectLiteralExpression(node)) {\n // Extract keys from object: cx({ 'class1': condition })\n node.getProperties().forEach((prop) => {\n if (Node.isPropertyAssignment(prop)) {\n const nameNode = prop.getNameNode();\n if (Node.isStringLiteral(nameNode)) {\n const classes = nameNode.getLiteralValue().split(/\\s+/).filter(Boolean);\n classes.forEach((cls) => {\n if (!literals.includes(cls)) {\n literals.push(cls);\n }\n });\n } else if (Node.isIdentifier(nameNode)) {\n // Plain identifier key: cx({ className: condition })\n const cls = nameNode.getText();\n if (!literals.includes(cls)) {\n literals.push(cls);\n }\n }\n }\n });\n } else if (Node.isArrayLiteralExpression(node)) {\n // Recurse into array elements\n node.getElements().forEach((element) => {\n extractCxStringLiterals(element, literals);\n });\n } else if (Node.isConditionalExpression(node)) {\n // Handle ternary: condition ? 'class1' : 'class2'\n extractCxStringLiterals(node.getWhenTrue(), literals);\n extractCxStringLiterals(node.getWhenFalse(), literals);\n } else if (Node.isBinaryExpression(node)) {\n // Handle logical expressions: condition && 'class'\n extractCxStringLiterals(node.getLeft(), literals);\n extractCxStringLiterals(node.getRight(), literals);\n }\n};\n\n/**\n * Try to resolve an identifier to its initializer value (for const declarations)\n */\nconst resolveIdentifierToObject = (\n sourceFile: SourceFile,\n identifier: string,\n): Record<string, string> | null => {\n // Find variable declarations in the file\n const varDecls = sourceFile.getDescendantsOfKind(SyntaxKind.VariableDeclaration);\n\n const decl = varDecls.find((candidate) => candidate.getName() === identifier);\n if (!decl) {\n return null;\n }\n\n let initializer = decl.getInitializer();\n if (!initializer) {\n return null;\n }\n\n // Unwrap \"as const\" expressions: { ... } as const\n if (Node.isAsExpression(initializer)) {\n initializer = initializer.getExpression();\n }\n\n if (!Node.isObjectLiteralExpression(initializer)) {\n return null;\n }\n\n // Extract properties from the object literal\n const result: Record<string, string> = {};\n initializer.getProperties().forEach((prop) => {\n if (!Node.isPropertyAssignment(prop)) {\n return;\n }\n\n const propName = prop.getName();\n const propInit = prop.getInitializer();\n\n if (propInit && Node.isStringLiteral(propInit)) {\n result[propName] = propInit.getLiteralValue();\n }\n });\n\n return result;\n};\n\n/**\n * Extract motion CSS variable prefixes from SpringMotionConfig usage.\n * Returns prefixes like ['--uds-motion-bouncy-4-', '--uds-motion-smooth-3-']\n */\nconst extractMotionVarPrefixes = (sourceFile: SourceFile): string[] => {\n const prefixes: string[] = [];\n\n // Find all SpringMotionConfig JSX elements\n const jsxElements = [\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement),\n ...sourceFile.getDescendantsOfKind(SyntaxKind.JsxOpeningElement),\n ];\n\n jsxElements.forEach((element) => {\n const tagName = element.getTagNameNode().getText();\n if (tagName !== 'SpringMotionConfig') {\n return;\n }\n\n // Extract prop values\n const props: Record<string, string | null> = {\n layoutVariant: null,\n layoutSpeed: null,\n colorVariant: null,\n colorSpeed: null,\n };\n\n const attrs = element.getAttributes();\n attrs.forEach((attr) => {\n // Handle spread attributes: {...toggleTransition}\n if (Node.isJsxSpreadAttribute(attr)) {\n const expr = attr.getExpression();\n if (Node.isIdentifier(expr)) {\n const spreadObj = resolveIdentifierToObject(sourceFile, expr.getText());\n if (spreadObj) {\n // Apply spread values to props\n Object.keys(props).forEach((key) => {\n if (key in spreadObj) {\n props[key] = spreadObj[key];\n }\n });\n }\n }\n return;\n }\n\n if (!Node.isJsxAttribute(attr)) {\n return;\n }\n\n const propName = attr.getNameNode().getText();\n if (!(propName in props)) {\n return;\n }\n\n const initializer = attr.getInitializer();\n if (initializer) {\n if (Node.isStringLiteral(initializer)) {\n props[propName] = initializer.getLiteralValue();\n } else if (Node.isJsxExpression(initializer)) {\n const expr = initializer.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n props[propName] = expr.getLiteralValue();\n }\n // If it's a variable/prop, we can't determine the value statically\n // Fall back to including all variants for that dimension\n }\n }\n });\n\n // Build the CSS variable prefixes\n // Layout config: --uds-motion-{variant}-{speed}-\n const layoutVariant = props.layoutVariant ?? SPRING_MOTION_DEFAULTS.layoutVariant;\n const layoutSpeed = props.layoutSpeed ?? SPRING_MOTION_DEFAULTS.layoutSpeed;\n const layoutPrefix = `--uds-motion-${layoutVariant}-${layoutSpeed}-`;\n if (!prefixes.includes(layoutPrefix)) {\n prefixes.push(layoutPrefix);\n }\n\n // Color config: --uds-motion-{variant}-{speed}-\n const colorVariant = props.colorVariant ?? SPRING_MOTION_DEFAULTS.colorVariant;\n const colorSpeed = props.colorSpeed ?? SPRING_MOTION_DEFAULTS.colorSpeed;\n const colorPrefix = `--uds-motion-${colorVariant}-${colorSpeed}-`;\n if (!prefixes.includes(colorPrefix)) {\n prefixes.push(colorPrefix);\n }\n });\n\n return prefixes;\n};\n\nconst resolveIdentifierToStringLiteral = (identifier: Node): string | null => {\n if (!Node.isIdentifier(identifier)) {\n return null;\n }\n\n const symbol = identifier.getSymbol();\n if (!symbol) {\n return resolveImportedIdentifier(identifier);\n }\n\n const resolvedDeclarationValue = symbol\n .getDeclarations()\n .reduce<string | undefined>((resolved, declaration) => {\n if (resolved) {\n return resolved;\n }\n\n if (Node.isVariableDeclaration(declaration)) {\n let initializer = declaration.getInitializer();\n\n // Unwrap \"as const\"\n if (initializer && Node.isAsExpression(initializer)) {\n initializer = initializer.getExpression();\n }\n\n if (initializer && Node.isStringLiteral(initializer)) {\n return initializer.getLiteralValue();\n }\n }\n\n if (Node.isEnumMember(declaration)) {\n const initializer = declaration.getInitializer();\n if (initializer && Node.isStringLiteral(initializer)) {\n return initializer.getLiteralValue();\n }\n }\n\n return undefined;\n }, undefined);\n\n if (resolvedDeclarationValue) {\n return resolvedDeclarationValue;\n }\n\n return resolveImportedIdentifier(identifier);\n};\n\nconst resolveImportedIdentifier = (identifier: Node): string | null => {\n if (!Node.isIdentifier(identifier)) {\n return null;\n }\n\n const name = identifier.getText();\n const sourceFile = identifier.getSourceFile();\n const project = sourceFile.getProject();\n const baseDir = path.dirname(sourceFile.getFilePath());\n\n const importResolution = sourceFile\n .getImportDeclarations()\n .reduce<string | undefined>((resolvedImport, importDecl) => {\n if (resolvedImport) {\n return resolvedImport;\n }\n\n const namedImport = importDecl.getNamedImports().find((n) => n.getName() === name);\n if (!namedImport) {\n return undefined;\n }\n\n const moduleSpec = importDecl.getModuleSpecifierValue();\n if (!moduleSpec.startsWith('.') || hasImportQuery(moduleSpec)) {\n return undefined;\n }\n\n const resolvedBase = path.resolve(baseDir, moduleSpec);\n const candidates = [resolvedBase, `${resolvedBase}.ts`, `${resolvedBase}.tsx`];\n\n return candidates.reduce<string | undefined>((resolvedCandidate, candidate) => {\n if (resolvedCandidate) {\n return resolvedCandidate;\n }\n\n if (!existsSync(candidate)) {\n return undefined;\n }\n\n const importedFile = project.addSourceFileAtPathIfExists(candidate);\n if (!importedFile) {\n return undefined;\n }\n\n const varDecl = importedFile.getVariableDeclaration(name);\n if (!varDecl) {\n return undefined;\n }\n\n let initializer = varDecl.getInitializer();\n if (initializer && Node.isAsExpression(initializer)) {\n initializer = initializer.getExpression();\n }\n\n return initializer && Node.isStringLiteral(initializer)\n ? initializer.getLiteralValue()\n : undefined;\n }, undefined);\n }, undefined);\n\n if (importResolution) {\n return importResolution;\n }\n\n return null;\n};\n\nexport type { ComponentInfo };\nexport {\n analyzeComponent,\n getComponentPath,\n getComponentWithDependencies,\n getDefaultClasses,\n scanComponentFiles,\n};\n"],"mappings":"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"}
@@ -29,6 +29,8 @@ const componentsPlugin = tailwindcss_plugin_js.default.withOptions(({ config, pr
29
29
  if (config?.scrim) addComponents(require_index$1.generateStyles(require_generatedConfigs.ScrimConfig, config.scrim, theme, previewOptions));
30
30
  if (config.popover) addComponents(require_index$1.generateStyles(require_generatedConfigs.PopoverConfig, config.popover, theme, previewOptions));
31
31
  addComponents(require_index$1.generateStyles(require_generatedConfigs.BannerConfig, config.banner, theme, previewOptions));
32
+ addComponents(require_index$1.generateStyles(require_generatedConfigs.TabConfig, config.tab, theme, previewOptions));
33
+ addComponents(require_index$1.generateStyles(require_generatedConfigs.TabsConfig, config.tabs, theme, previewOptions));
32
34
  }, () => ({ theme: { extend: { opacity: require_index.opacityMap } } }));
33
35
 
34
36
  //#endregion
@@ -1,6 +1,6 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
2
  import { opacityMap } from "../../fixtures/dist/index.js";
3
- import { AvatarConfig, BadgeConfig, BannerConfig, BottomSheetConfig, ButtonConfig, CheckboxConfig, ChipConfig, DividerConfig, IconButtonConfig, InputConfig, LinkConfig, MenuContentConfig, MenuItemConfig, PopoverConfig, RadioConfig, ScrimConfig, SwitchConfig, ToastConfig, TooltipConfig } from "../../automated-config/dist/generated/generatedConfigs.js";
3
+ import { AvatarConfig, BadgeConfig, BannerConfig, BottomSheetConfig, ButtonConfig, CheckboxConfig, ChipConfig, DividerConfig, IconButtonConfig, InputConfig, LinkConfig, MenuContentConfig, MenuItemConfig, PopoverConfig, RadioConfig, ScrimConfig, SwitchConfig, TabConfig, TabsConfig, ToastConfig, TooltipConfig } from "../../automated-config/dist/generated/generatedConfigs.js";
4
4
  import { generateStyles } from "../../automated-config/dist/utils/index.js";
5
5
  import plugin from "tailwindcss/plugin.js";
6
6
 
@@ -27,6 +27,8 @@ const componentsPlugin = plugin.withOptions(({ config, previewOptions = { genera
27
27
  if (config?.scrim) addComponents(generateStyles(ScrimConfig, config.scrim, theme, previewOptions));
28
28
  if (config.popover) addComponents(generateStyles(PopoverConfig, config.popover, theme, previewOptions));
29
29
  addComponents(generateStyles(BannerConfig, config.banner, theme, previewOptions));
30
+ addComponents(generateStyles(TabConfig, config.tab, theme, previewOptions));
31
+ addComponents(generateStyles(TabsConfig, config.tabs, theme, previewOptions));
30
32
  }, () => ({ theme: { extend: { opacity: opacityMap } } }));
31
33
 
32
34
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","names":[],"sources":["../../../src/tailwind/plugins/components.ts"],"sourcesContent":["import {\n AvatarConfig,\n BadgeConfig,\n BannerConfig,\n BottomSheetConfig,\n ButtonConfig,\n CheckboxConfig,\n ChipConfig,\n DividerConfig,\n IconButtonConfig,\n InputConfig,\n LinkConfig,\n MenuContentConfig,\n MenuItemConfig,\n PopoverConfig,\n RadioConfig,\n ScrimConfig,\n SwitchConfig,\n ToastConfig,\n TooltipConfig,\n} from '@yahoo/uds-automated-config/generatedConfigs';\nimport { generateStyles } from '@yahoo/uds-automated-config/utils';\nimport { opacityMap } from '@yahoo/uds-fixtures';\nimport plugin from 'tailwindcss/plugin.js';\n\nimport type { TailwindPluginOptions } from '../utils/composeTailwindPlugins';\n\nconst componentsPlugin = plugin.withOptions<TailwindPluginOptions>(\n ({\n config,\n previewOptions = {\n generatePseudoStateClassModifier: false,\n },\n }) =>\n ({ addComponents, theme }) => {\n // IconButton inherits Button variant styles\n if (config.button || config.iconButton) {\n const buttonStyles = generateStyles(ButtonConfig, config.button, theme, previewOptions);\n addComponents(buttonStyles);\n\n if (config.iconButton) {\n const iconButtonStyles = generateStyles(\n IconButtonConfig,\n config.iconButton,\n theme,\n previewOptions,\n );\n addComponents(iconButtonStyles);\n }\n }\n\n if (config.divider) {\n const dividerStyles = generateStyles(DividerConfig, config.divider, theme, previewOptions);\n addComponents(dividerStyles);\n }\n\n if (config.link) {\n const linkStyles = generateStyles(LinkConfig, config.link, theme, previewOptions);\n addComponents(linkStyles);\n }\n\n if (config.badge) {\n const badgeStyles = generateStyles(BadgeConfig, config.badge, theme, previewOptions);\n addComponents(badgeStyles);\n }\n\n if (config.radio) {\n const radioStyles = generateStyles(RadioConfig, config.radio, theme, previewOptions);\n addComponents(radioStyles);\n }\n\n if (config.avatar) {\n const avatarStyles = generateStyles(AvatarConfig, config.avatar, theme, previewOptions);\n addComponents(avatarStyles);\n }\n\n if (config.chip) {\n const chipStyles = generateStyles(ChipConfig, config.chip, theme, previewOptions);\n addComponents(chipStyles);\n }\n\n if (config.switch) {\n const switchStyles = generateStyles(SwitchConfig, config.switch, theme, previewOptions);\n addComponents(switchStyles);\n }\n\n if (config.checkbox) {\n const checkboxStyles = generateStyles(\n CheckboxConfig,\n config.checkbox,\n theme,\n previewOptions,\n );\n addComponents(checkboxStyles);\n }\n\n // TODO: May need to ensure portal is inside a importNamespace class\n if (config.menuItem) {\n const menuStyles = generateStyles(MenuItemConfig, config.menuItem, theme, previewOptions);\n addComponents(menuStyles);\n }\n\n if (config.menuContent) {\n const menuContentStyles = generateStyles(\n MenuContentConfig,\n config.menuContent,\n theme,\n previewOptions,\n );\n addComponents(menuContentStyles);\n }\n\n if (config.input) {\n const inputStyles = generateStyles(InputConfig, config.input, theme, previewOptions);\n addComponents(inputStyles);\n }\n\n if (config?.toast) {\n const toastStyles = generateStyles(ToastConfig, config.toast, theme, previewOptions);\n addComponents(toastStyles);\n }\n\n if (config.tooltip) {\n const tooltipStyles = generateStyles(TooltipConfig, config.tooltip, theme, previewOptions);\n addComponents(tooltipStyles);\n }\n\n if (config?.bottomSheet) {\n const bottomSheetStyles = generateStyles(\n BottomSheetConfig,\n config.bottomSheet,\n theme,\n previewOptions,\n );\n addComponents(bottomSheetStyles);\n }\n\n if (config?.scrim) {\n const scrimStyles = generateStyles(ScrimConfig, config.scrim, theme, previewOptions);\n addComponents(scrimStyles);\n }\n\n if (config.popover) {\n const popoverStyles = generateStyles(PopoverConfig, config.popover, theme, previewOptions);\n addComponents(popoverStyles);\n }\n\n const bannerStyles = generateStyles(BannerConfig, config.banner, theme, previewOptions);\n addComponents(bannerStyles);\n },\n () => ({\n theme: {\n extend: {\n // Added to route configurable opacity steps through to button opacity/disabled property rendering.\n opacity: opacityMap,\n },\n },\n }),\n);\n\nexport { componentsPlugin };\n"],"mappings":";;;;;;;AA2BA,MAAM,mBAAmB,OAAO,aAC7B,EACC,QACA,iBAAiB,EACf,kCAAkC,OACnC,QAEA,EAAE,eAAe,YAAY;AAE5B,KAAI,OAAO,UAAU,OAAO,YAAY;AAEtC,gBADqB,eAAe,cAAc,OAAO,QAAQ,OAAO,eAAe,CAC5D;AAE3B,MAAI,OAAO,WAOT,eANyB,eACvB,kBACA,OAAO,YACP,OACA,eACD,CAC8B;;AAInC,KAAI,OAAO,QAET,eADsB,eAAe,eAAe,OAAO,SAAS,OAAO,eAAe,CAC9D;AAG9B,KAAI,OAAO,KAET,eADmB,eAAe,YAAY,OAAO,MAAM,OAAO,eAAe,CACxD;AAG3B,KAAI,OAAO,MAET,eADoB,eAAe,aAAa,OAAO,OAAO,OAAO,eAAe,CAC1D;AAG5B,KAAI,OAAO,MAET,eADoB,eAAe,aAAa,OAAO,OAAO,OAAO,eAAe,CAC1D;AAG5B,KAAI,OAAO,OAET,eADqB,eAAe,cAAc,OAAO,QAAQ,OAAO,eAAe,CAC5D;AAG7B,KAAI,OAAO,KAET,eADmB,eAAe,YAAY,OAAO,MAAM,OAAO,eAAe,CACxD;AAG3B,KAAI,OAAO,OAET,eADqB,eAAe,cAAc,OAAO,QAAQ,OAAO,eAAe,CAC5D;AAG7B,KAAI,OAAO,SAOT,eANuB,eACrB,gBACA,OAAO,UACP,OACA,eACD,CAC4B;AAI/B,KAAI,OAAO,SAET,eADmB,eAAe,gBAAgB,OAAO,UAAU,OAAO,eAAe,CAChE;AAG3B,KAAI,OAAO,YAOT,eAN0B,eACxB,mBACA,OAAO,aACP,OACA,eACD,CAC+B;AAGlC,KAAI,OAAO,MAET,eADoB,eAAe,aAAa,OAAO,OAAO,OAAO,eAAe,CAC1D;AAG5B,KAAI,QAAQ,MAEV,eADoB,eAAe,aAAa,OAAO,OAAO,OAAO,eAAe,CAC1D;AAG5B,KAAI,OAAO,QAET,eADsB,eAAe,eAAe,OAAO,SAAS,OAAO,eAAe,CAC9D;AAG9B,KAAI,QAAQ,YAOV,eAN0B,eACxB,mBACA,OAAO,aACP,OACA,eACD,CAC+B;AAGlC,KAAI,QAAQ,MAEV,eADoB,eAAe,aAAa,OAAO,OAAO,OAAO,eAAe,CAC1D;AAG5B,KAAI,OAAO,QAET,eADsB,eAAe,eAAe,OAAO,SAAS,OAAO,eAAe,CAC9D;AAI9B,eADqB,eAAe,cAAc,OAAO,QAAQ,OAAO,eAAe,CAC5D;UAExB,EACL,OAAO,EACL,QAAQ,EAEN,SAAS,YACV,EACF,EACF,EACF"}
1
+ {"version":3,"file":"components.js","names":[],"sources":["../../../src/tailwind/plugins/components.ts"],"sourcesContent":["import {\n AvatarConfig,\n BadgeConfig,\n BannerConfig,\n BottomSheetConfig,\n ButtonConfig,\n CheckboxConfig,\n ChipConfig,\n DividerConfig,\n IconButtonConfig,\n InputConfig,\n LinkConfig,\n MenuContentConfig,\n MenuItemConfig,\n PopoverConfig,\n RadioConfig,\n ScrimConfig,\n SwitchConfig,\n TabConfig,\n TabsConfig,\n ToastConfig,\n TooltipConfig,\n} from '@yahoo/uds-automated-config/generatedConfigs';\nimport { generateStyles } from '@yahoo/uds-automated-config/utils';\nimport { opacityMap } from '@yahoo/uds-fixtures';\nimport plugin from 'tailwindcss/plugin.js';\n\nimport type { TailwindPluginOptions } from '../utils/composeTailwindPlugins';\n\nconst componentsPlugin = plugin.withOptions<TailwindPluginOptions>(\n ({\n config,\n previewOptions = {\n generatePseudoStateClassModifier: false,\n },\n }) =>\n ({ addComponents, theme }) => {\n // IconButton inherits Button variant styles\n if (config.button || config.iconButton) {\n const buttonStyles = generateStyles(ButtonConfig, config.button, theme, previewOptions);\n addComponents(buttonStyles);\n\n if (config.iconButton) {\n const iconButtonStyles = generateStyles(\n IconButtonConfig,\n config.iconButton,\n theme,\n previewOptions,\n );\n addComponents(iconButtonStyles);\n }\n }\n\n if (config.divider) {\n const dividerStyles = generateStyles(DividerConfig, config.divider, theme, previewOptions);\n addComponents(dividerStyles);\n }\n\n if (config.link) {\n const linkStyles = generateStyles(LinkConfig, config.link, theme, previewOptions);\n addComponents(linkStyles);\n }\n\n if (config.badge) {\n const badgeStyles = generateStyles(BadgeConfig, config.badge, theme, previewOptions);\n addComponents(badgeStyles);\n }\n\n if (config.radio) {\n const radioStyles = generateStyles(RadioConfig, config.radio, theme, previewOptions);\n addComponents(radioStyles);\n }\n\n if (config.avatar) {\n const avatarStyles = generateStyles(AvatarConfig, config.avatar, theme, previewOptions);\n addComponents(avatarStyles);\n }\n\n if (config.chip) {\n const chipStyles = generateStyles(ChipConfig, config.chip, theme, previewOptions);\n addComponents(chipStyles);\n }\n\n if (config.switch) {\n const switchStyles = generateStyles(SwitchConfig, config.switch, theme, previewOptions);\n addComponents(switchStyles);\n }\n\n if (config.checkbox) {\n const checkboxStyles = generateStyles(\n CheckboxConfig,\n config.checkbox,\n theme,\n previewOptions,\n );\n addComponents(checkboxStyles);\n }\n\n // TODO: May need to ensure portal is inside a importNamespace class\n if (config.menuItem) {\n const menuStyles = generateStyles(MenuItemConfig, config.menuItem, theme, previewOptions);\n addComponents(menuStyles);\n }\n\n if (config.menuContent) {\n const menuContentStyles = generateStyles(\n MenuContentConfig,\n config.menuContent,\n theme,\n previewOptions,\n );\n addComponents(menuContentStyles);\n }\n\n if (config.input) {\n const inputStyles = generateStyles(InputConfig, config.input, theme, previewOptions);\n addComponents(inputStyles);\n }\n\n if (config?.toast) {\n const toastStyles = generateStyles(ToastConfig, config.toast, theme, previewOptions);\n addComponents(toastStyles);\n }\n\n if (config.tooltip) {\n const tooltipStyles = generateStyles(TooltipConfig, config.tooltip, theme, previewOptions);\n addComponents(tooltipStyles);\n }\n\n if (config?.bottomSheet) {\n const bottomSheetStyles = generateStyles(\n BottomSheetConfig,\n config.bottomSheet,\n theme,\n previewOptions,\n );\n addComponents(bottomSheetStyles);\n }\n\n if (config?.scrim) {\n const scrimStyles = generateStyles(ScrimConfig, config.scrim, theme, previewOptions);\n addComponents(scrimStyles);\n }\n\n if (config.popover) {\n const popoverStyles = generateStyles(PopoverConfig, config.popover, theme, previewOptions);\n addComponents(popoverStyles);\n }\n\n const bannerStyles = generateStyles(BannerConfig, config.banner, theme, previewOptions);\n addComponents(bannerStyles);\n\n const tabStyles = generateStyles(TabConfig, config.tab, theme, previewOptions);\n addComponents(tabStyles);\n\n const tabsStyles = generateStyles(TabsConfig, config.tabs, theme, previewOptions);\n addComponents(tabsStyles);\n },\n () => ({\n theme: {\n extend: {\n // Added to route configurable opacity steps through to button opacity/disabled property rendering.\n opacity: opacityMap,\n },\n },\n }),\n);\n\nexport { componentsPlugin };\n"],"mappings":";;;;;;;AA6BA,MAAM,mBAAmB,OAAO,aAC7B,EACC,QACA,iBAAiB,EACf,kCAAkC,OACnC,QAEA,EAAE,eAAe,YAAY;AAE5B,KAAI,OAAO,UAAU,OAAO,YAAY;AAEtC,gBADqB,eAAe,cAAc,OAAO,QAAQ,OAAO,eAAe,CAC5D;AAE3B,MAAI,OAAO,WAOT,eANyB,eACvB,kBACA,OAAO,YACP,OACA,eACD,CAC8B;;AAInC,KAAI,OAAO,QAET,eADsB,eAAe,eAAe,OAAO,SAAS,OAAO,eAAe,CAC9D;AAG9B,KAAI,OAAO,KAET,eADmB,eAAe,YAAY,OAAO,MAAM,OAAO,eAAe,CACxD;AAG3B,KAAI,OAAO,MAET,eADoB,eAAe,aAAa,OAAO,OAAO,OAAO,eAAe,CAC1D;AAG5B,KAAI,OAAO,MAET,eADoB,eAAe,aAAa,OAAO,OAAO,OAAO,eAAe,CAC1D;AAG5B,KAAI,OAAO,OAET,eADqB,eAAe,cAAc,OAAO,QAAQ,OAAO,eAAe,CAC5D;AAG7B,KAAI,OAAO,KAET,eADmB,eAAe,YAAY,OAAO,MAAM,OAAO,eAAe,CACxD;AAG3B,KAAI,OAAO,OAET,eADqB,eAAe,cAAc,OAAO,QAAQ,OAAO,eAAe,CAC5D;AAG7B,KAAI,OAAO,SAOT,eANuB,eACrB,gBACA,OAAO,UACP,OACA,eACD,CAC4B;AAI/B,KAAI,OAAO,SAET,eADmB,eAAe,gBAAgB,OAAO,UAAU,OAAO,eAAe,CAChE;AAG3B,KAAI,OAAO,YAOT,eAN0B,eACxB,mBACA,OAAO,aACP,OACA,eACD,CAC+B;AAGlC,KAAI,OAAO,MAET,eADoB,eAAe,aAAa,OAAO,OAAO,OAAO,eAAe,CAC1D;AAG5B,KAAI,QAAQ,MAEV,eADoB,eAAe,aAAa,OAAO,OAAO,OAAO,eAAe,CAC1D;AAG5B,KAAI,OAAO,QAET,eADsB,eAAe,eAAe,OAAO,SAAS,OAAO,eAAe,CAC9D;AAG9B,KAAI,QAAQ,YAOV,eAN0B,eACxB,mBACA,OAAO,aACP,OACA,eACD,CAC+B;AAGlC,KAAI,QAAQ,MAEV,eADoB,eAAe,aAAa,OAAO,OAAO,OAAO,eAAe,CAC1D;AAG5B,KAAI,OAAO,QAET,eADsB,eAAe,eAAe,OAAO,SAAS,OAAO,eAAe,CAC9D;AAI9B,eADqB,eAAe,cAAc,OAAO,QAAQ,OAAO,eAAe,CAC5D;AAG3B,eADkB,eAAe,WAAW,OAAO,KAAK,OAAO,eAAe,CACtD;AAGxB,eADmB,eAAe,YAAY,OAAO,MAAM,OAAO,eAAe,CACxD;UAEtB,EACL,OAAO,EACL,QAAQ,EAEN,SAAS,YACV,EACF,EACF,EACF"}