@yahoo/uds 3.134.0 → 3.134.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/cli/dist/lib/args.cjs +7 -3
  2. package/dist/cli/dist/lib/args.js +7 -3
  3. package/dist/components/client/Menu/Menu.ItemCheckbox.d.cts +1 -1
  4. package/dist/components/client/Menu/Menu.ItemCheckbox.d.ts +1 -1
  5. package/dist/components/client/Toast/UDSToastConfigProvider.d.cts +1 -1
  6. package/dist/components/client/Toast/UDSToastConfigProvider.d.ts +1 -1
  7. package/dist/index.d.cts +2 -2
  8. package/dist/index.d.ts +2 -2
  9. package/dist/styles/styler.d.cts +21 -21
  10. package/dist/styles/styler.d.ts +21 -21
  11. package/dist/tailwind/dist/commands/css.cjs +1 -0
  12. package/dist/tailwind/dist/commands/css.d.cts.map +1 -1
  13. package/dist/tailwind/dist/commands/css.d.ts.map +1 -1
  14. package/dist/tailwind/dist/commands/css.helpers.cjs +8 -1
  15. package/dist/tailwind/dist/commands/css.helpers.js +8 -1
  16. package/dist/tailwind/dist/commands/css.helpers.js.map +1 -1
  17. package/dist/tailwind/dist/commands/css.js +1 -0
  18. package/dist/tailwind/dist/commands/css.js.map +1 -1
  19. package/dist/tailwind/dist/css/generate.cjs +7 -4
  20. package/dist/tailwind/dist/css/generate.d.cts.map +1 -1
  21. package/dist/tailwind/dist/css/generate.d.ts.map +1 -1
  22. package/dist/tailwind/dist/css/generate.js +7 -4
  23. package/dist/tailwind/dist/css/generate.js.map +1 -1
  24. package/dist/tailwind/dist/css/nodeUtils.cjs +19 -8
  25. package/dist/tailwind/dist/css/nodeUtils.js +19 -8
  26. package/dist/tailwind/dist/css/nodeUtils.js.map +1 -1
  27. package/dist/tailwind/dist/css/perf.cjs +92 -0
  28. package/dist/tailwind/dist/css/perf.js +89 -0
  29. package/dist/tailwind/dist/css/perf.js.map +1 -0
  30. package/dist/tailwind/dist/css/purgeWorker.cjs +47 -0
  31. package/dist/tailwind/dist/css/purgeWorker.d.cts +2 -0
  32. package/dist/tailwind/dist/css/purgeWorker.d.ts +2 -0
  33. package/dist/tailwind/dist/css/purgeWorker.js +48 -0
  34. package/dist/tailwind/dist/css/purgeWorker.js.map +1 -0
  35. package/dist/tailwind/dist/css/runner.cjs +158 -145
  36. package/dist/tailwind/dist/css/runner.js +158 -145
  37. package/dist/tailwind/dist/css/runner.js.map +1 -1
  38. package/dist/tailwind/dist/css/theme.d.cts +1 -1
  39. package/dist/tailwind/dist/css/theme.d.ts +1 -1
  40. package/dist/tailwind/dist/css/workerPool.cjs +89 -0
  41. package/dist/tailwind/dist/css/workerPool.js +90 -0
  42. package/dist/tailwind/dist/css/workerPool.js.map +1 -0
  43. package/dist/tailwind/dist/index.d.cts +2 -2
  44. package/dist/tailwind/dist/index.d.ts +2 -2
  45. package/dist/tailwind/dist/purger/optimized/ast/expressions.cjs +95 -15
  46. package/dist/tailwind/dist/purger/optimized/ast/expressions.js +95 -15
  47. package/dist/tailwind/dist/purger/optimized/ast/expressions.js.map +1 -1
  48. package/dist/tailwind/dist/purger/optimized/purgeFromCode.cjs +38 -14
  49. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.cts.map +1 -1
  50. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.ts.map +1 -1
  51. package/dist/tailwind/dist/purger/optimized/purgeFromCode.js +39 -15
  52. package/dist/tailwind/dist/purger/optimized/purgeFromCode.js.map +1 -1
  53. package/dist/tailwind/dist/purger/optimized/types.d.cts +10 -0
  54. package/dist/tailwind/dist/purger/optimized/types.d.cts.map +1 -1
  55. package/dist/tailwind/dist/purger/optimized/types.d.ts +10 -0
  56. package/dist/tailwind/dist/purger/optimized/types.d.ts.map +1 -1
  57. package/dist/uds/generated/componentData.cjs +271 -271
  58. package/dist/uds/generated/componentData.js +271 -271
  59. package/generated/componentData.json +361 -361
  60. package/package.json +1 -1
  61. package/dist/tailwind/dist/purger/optimized/ast/jsx.cjs +0 -16
  62. package/dist/tailwind/dist/purger/optimized/ast/jsx.js +0 -17
  63. package/dist/tailwind/dist/purger/optimized/ast/jsx.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"purgeFromCode.js","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"sourcesContent":["import type { ImportDeclaration, ObjectLiteralExpression } from 'ts-morph';\nimport { Node, Project, SyntaxKind, ts } from 'ts-morph';\n\nimport { extractStringLiterals, findJsxReferences } from './ast';\nimport type { JsxElementWithAttributes, PurgeStats } from './types';\n\ninterface PurgeFromCodeResult {\n safelist: string[];\n imports: string[];\n components: string[];\n stats: PurgeStats;\n}\n\ntype RuntimeConfigValues = Record<string, string | number | boolean>;\n\n/**\n * Serialized component info from pre-generated data\n */\ninterface SerializedComponentInfo {\n name: string;\n defaultProps: Record<string, string>;\n getStylesLiterals: Record<string, string>;\n cxLiterals?: string[];\n internalComponents: string[];\n internalComponentProps: Record<string, Record<string, string[]>>;\n propToVariantKeys: Record<string, string[]>;\n runtimeConfigDefaultProps?: Record<string, string>;\n runtimeConfigGetStyles?: Record<string, string[]>;\n runtimeConfigInternalComponentProps?: Record<string, Record<string, string[]>>;\n}\n\n/**\n * Get component info with all its dependencies (using pre-generated data)\n */\nconst getComponentWithDeps = (componentName: string): SerializedComponentInfo[] => {\n const visited = new Set<string>();\n const result: SerializedComponentInfo[] = [];\n\n const collect = (name: string): void => {\n if (visited.has(name)) {\n return;\n }\n visited.add(name);\n\n const info = resolveComponentInfo(name);\n if (!info) {\n return;\n }\n\n result.push(info);\n\n // Recursively collect internal component dependencies\n info.internalComponents.forEach((depName) => collect(depName));\n };\n\n collect(componentName);\n return result;\n};\n\n/**\n * Optimized purge from code string.\n *\n * This is a standalone implementation that:\n * - Analyzes UDS component source files to get accurate default props\n * - Includes defaults from internally used components\n * - Only depends on variants from src/styles/variants.ts (source of truth)\n * - Uses ts-morph for AST analysis\n *\n * Key behaviors:\n * - Includes classes for component default props (analyzed from source)\n * - Includes defaults for internal component dependencies\n * - Includes classes for explicitly used prop values\n * - Resolves ternary/logical expressions to extract all possible values\n * - Traces spreads to const objects in the same file\n * - Does NOT fall back to type properties for unresolved spreads\n */\n/**\n * Variant defaults per component from consumer's config\n * e.g., { Button: { size: 'md', variant: 'primary' }, Avatar: { size: 'md' } }\n */\ntype VariantDefaults = Record<string, Record<string, string>>;\n\ninterface PurgeFromCodeOptions {\n colorModes?: ('dark' | 'light')[];\n /** Variant defaults from consumer's config - used to include default CSS when prop not specified */\n variantDefaults?: VariantDefaults;\n runtimeConfigValues?: RuntimeConfigValues;\n variants: Record<string, Record<string, string>>;\n autoVariants: Record<string, Record<string, string>>;\n componentData: Record<string, SerializedComponentInfo>;\n includeAllClassNamePrimitives?: boolean;\n filePath?: string;\n}\n\n/**\n * Auto-variants lookup (loaded at module init)\n */\nlet autoVariantsCache = null as unknown as Record<string, Record<string, string>>;\n\n/**\n * Pre-generated component data (loaded at module init)\n */\nlet componentCache = null as unknown as Record<string, SerializedComponentInfo>;\n\n/**\n * Map of normalized component name -> actual component cache key\n * Useful when internal components are imported without namespace separators\n * (e.g., MenuItemBase vs Menu.ItemBase).\n */\nlet componentNameLookup: Record<string, string> | null = null;\n\nconst buildComponentNameLookup = (\n data: Record<string, SerializedComponentInfo>,\n): Record<string, string> => {\n const lookup: Record<string, string> = {};\n\n Object.keys(data).forEach((key) => {\n const normalized = normalizeComponentName(key);\n // Keep the first match to avoid arbitrary overwrites on collisions\n if (!lookup[normalized]) {\n lookup[normalized] = key;\n }\n });\n\n return lookup;\n};\n\nconst resolveComponentInfo = (name: string): SerializedComponentInfo | undefined => {\n if (componentCache && componentCache[name]) {\n return componentCache[name];\n }\n\n const normalized = normalizeComponentName(name);\n const mappedName = componentNameLookup?.[normalized];\n if (mappedName && componentCache) {\n return componentCache[mappedName];\n }\n\n return undefined;\n};\n\nconst getModuleSpecifierValue = (importDecl: ImportDeclaration): string => {\n return (\n importDecl.getModuleSpecifierValue() ??\n importDecl\n .getModuleSpecifier()\n .getText()\n .replace(/^['\"]|['\"]$/g, '')\n );\n};\n\nconst isTypeOnlyNamedImport = (importDecl: ImportDeclaration, importName: string): boolean => {\n if (importDecl.isTypeOnly()) {\n return true;\n }\n\n return (\n importDecl\n .getNamedImports()\n .find((namedImport) => namedImport.getName() === importName)\n ?.isTypeOnly() ?? false\n );\n};\n\nconst isUdsComponentModule = (moduleSpecifier: string): boolean => {\n const cleaned = moduleSpecifier.replace(/^['\"]|['\"]$/g, '');\n return cleaned === '@yahoo/uds' || cleaned.startsWith('@yahoo/uds/');\n};\n\n/**\n * Normalize component name to match autoVariants keys (lower camel, no punctuation).\n */\nconst normalizeComponentName = (name: string): string => {\n const cleaned = name.replace(/\\W/g, '');\n return cleaned.charAt(0).toLowerCase() + cleaned.slice(1);\n};\n\n/**\n * Fallback: infer prop -> variant key mapping from autoVariants when the\n * generated component data misses it (e.g., helpers like buildAvatarRootClasses).\n */\nconst getAutoVariantKeysForProp = (componentName: string, propName: string): string[] => {\n if (!autoVariantsCache) {\n return [];\n }\n\n const segments = componentName.match(/[A-Z][a-z0-9]*/g) ?? [];\n const candidates = new Set<string>([normalizeComponentName(componentName)]);\n\n // Add progressively shorter prefixes (e.g., AvatarImage -> avatar, avatarimage)\n if (segments.length > 0) {\n Array.from({ length: segments.length }, (_, index) => index + 1).forEach((i) => {\n const partial = segments.slice(0, i).join('');\n candidates.add(normalizeComponentName(partial));\n });\n }\n\n const propLower = propName.toLowerCase();\n\n return Object.keys(autoVariantsCache).filter((key) => {\n const keyLower = key.toLowerCase();\n return Array.from(candidates).some(\n (candidate) => keyLower.startsWith(candidate) && keyLower.includes(propLower),\n );\n });\n};\n\nconst getVariantKeysForProp = (\n componentInfo: SerializedComponentInfo,\n propName: string,\n): string[] => {\n const keys = new Set(componentInfo.propToVariantKeys?.[propName] ?? []);\n\n getAutoVariantKeysForProp(componentInfo.name, propName).forEach((inferred) => keys.add(inferred));\n\n return [...keys];\n};\n\nconst addVariantGroupClasses = (\n variantGroup: Record<string, string> | undefined,\n safelist: string[],\n): void => {\n if (!variantGroup) {\n return;\n }\n\n Object.values(variantGroup).forEach((cls) => {\n safelist.push(cls.replaceAll('\\\\', ''));\n });\n};\n\nconst getRuntimeDefaultPropValues = (\n componentInfo: SerializedComponentInfo,\n propName: string,\n runtimeConfigValues?: RuntimeConfigValues,\n): string[] => {\n const selector = componentInfo.runtimeConfigDefaultProps?.[propName];\n if (!selector || !runtimeConfigValues) {\n return [];\n }\n\n const value = runtimeConfigValues[selector];\n return value === undefined ? [] : [String(value)];\n};\n\nconst getPropCandidateValues = (\n componentInfo: SerializedComponentInfo,\n propName: string,\n userProps: Map<string, Set<string>>,\n options: PurgeFromCodeOptions,\n): string[] => {\n const explicitValues = userProps.get(propName);\n if (explicitValues && explicitValues.size > 0) {\n return [...explicitValues];\n }\n\n const configuredDefault = options.variantDefaults?.[componentInfo.name]?.[propName];\n if (configuredDefault) {\n return [configuredDefault];\n }\n\n if (componentInfo.defaultProps[propName]) {\n return [componentInfo.defaultProps[propName]];\n }\n\n return getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);\n};\n\nconst resolveRuntimeSelectorValues = (\n selectorTemplate: string,\n componentInfo: SerializedComponentInfo,\n userProps: Map<string, Set<string>>,\n options: PurgeFromCodeOptions,\n): string[] => {\n const runtimeConfigValues = options.runtimeConfigValues;\n if (!runtimeConfigValues) {\n return [];\n }\n\n const placeholders = [...selectorTemplate.matchAll(/\\$\\{(\\w+)\\}/g)].map((match) => match[1]);\n const selectors = placeholders.reduce<string[]>(\n (acc, propName) => {\n const propValues = getPropCandidateValues(componentInfo, propName, userProps, options);\n if (propValues.length === 0) {\n return [];\n }\n\n return acc.flatMap((selector) =>\n propValues.map((value) => selector.replaceAll('$' + '{' + propName + '}', value)),\n );\n },\n [selectorTemplate],\n );\n\n return selectors.flatMap((selector) => {\n const value = runtimeConfigValues[selector];\n return value === undefined ? [] : [String(value)];\n });\n};\n\nconst extractClassNamePrimitives = (\n sourceFile: ReturnType<Project['createSourceFile']>,\n): string[] => {\n const classes: string[] = [];\n\n // JSX className attributes\n sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((attr) => {\n if (attr.getNameNode().getText() !== 'className') {\n return;\n }\n\n const initializer = attr.getInitializer();\n if (!initializer) {\n return;\n }\n\n const values: string[] = [];\n\n if (Node.isStringLiteral(initializer)) {\n values.push(initializer.getLiteralText());\n } else if (Node.isJsxExpression(initializer)) {\n const expr = initializer.getExpression();\n if (expr) {\n values.push(...extractStringLiterals(expr));\n }\n }\n\n values.forEach((raw) => {\n classes.push(...raw.split(/\\s+/).filter(Boolean));\n });\n });\n\n // Plain object property assignments like const props = { className: '...' }\n sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAssignment).forEach((prop) => {\n if (prop.getName() !== 'className') {\n return;\n }\n\n const initializer = prop.getInitializer();\n if (!initializer) {\n return;\n }\n\n const rawValues = extractStringLiterals(initializer);\n rawValues.forEach((raw) => {\n classes.push(...raw.split(/\\s+/).filter(Boolean));\n });\n });\n\n return classes;\n};\n\nconst purgeFromCodeOptimized = async (\n code: string,\n options: PurgeFromCodeOptions,\n): Promise<PurgeFromCodeResult> => {\n const { variants, autoVariants, componentData } = options;\n\n if (!autoVariantsCache) {\n autoVariantsCache = autoVariants;\n }\n\n if (!componentCache) {\n componentCache = componentData;\n componentNameLookup = buildComponentNameLookup(componentData);\n }\n\n const startTime = performance.now();\n\n const project = new Project({ useInMemoryFileSystem: true });\n const sourceFile = project.createSourceFile(options.filePath ?? 'input.tsx', code, {\n overwrite: true,\n });\n\n const stats: PurgeStats = {\n filesScanned: 1,\n timeMs: 0,\n classesGenerated: 0,\n spreadsTraced: 0,\n expressionsResolved: 0,\n };\n\n // Parse UDS imports\n const imports: string[] = [];\n sourceFile.getImportDeclarations().forEach((importDecl) => {\n const moduleSpec = getModuleSpecifierValue(importDecl);\n if (isUdsComponentModule(moduleSpec)) {\n importDecl.getNamedImports().forEach((namedImport) => {\n if (!namedImport.isTypeOnly() && !importDecl.isTypeOnly()) {\n imports.push(namedImport.getName());\n }\n });\n }\n });\n\n // Track all resolved prop values per component\n const componentProps = new Map<string, Map<string, Set<string>>>();\n const componentUnresolvedSpreadProps = new Map<string, Set<string>>();\n const referencedComponents = new Set<string>();\n\n // Extract props from getStyles() calls in user code\n const getStylesProps = extractGetStylesCalls(sourceFile, stats, variants);\n\n // Find all JSX elements that use UDS components\n imports.forEach((imp) => {\n const references = findComponentReferences(sourceFile, imp);\n\n references.forEach((reference) => {\n const tagName = reference.getTagNameNode().getText();\n const componentName = tagName || imp;\n\n referencedComponents.add(componentName);\n\n const propsMap = componentProps.get(componentName) ?? new Map<string, Set<string>>();\n const unresolvedSpreadProps = componentUnresolvedSpreadProps.get(componentName) ?? new Set();\n const props = extractPropsFromReference(reference, stats, sourceFile);\n\n props.forEach(({ propName, values, fromSpread }) => {\n if (values.length > 0) {\n const existing = propsMap.get(propName) ?? new Set();\n values.forEach((val) => existing.add(val));\n propsMap.set(propName, existing);\n return;\n }\n\n if (fromSpread) {\n unresolvedSpreadProps.add(propName);\n }\n });\n\n componentProps.set(componentName, propsMap);\n componentUnresolvedSpreadProps.set(componentName, unresolvedSpreadProps);\n });\n\n if (!componentProps.has(imp)) {\n componentProps.set(imp, new Map());\n }\n\n if (!componentUnresolvedSpreadProps.has(imp)) {\n componentUnresolvedSpreadProps.set(imp, new Set());\n }\n });\n\n // Collect all components (including dependencies)\n const allComponents: SerializedComponentInfo[] = [];\n const seenComponents = new Set<string>();\n\n const componentsToProcess = new Set<string>([...imports, ...referencedComponents]);\n\n componentsToProcess.forEach((componentName) => {\n const componentsWithDeps = getComponentWithDeps(componentName);\n componentsWithDeps.forEach((comp) => {\n if (!seenComponents.has(comp.name)) {\n seenComponents.add(comp.name);\n allComponents.push(comp);\n }\n });\n });\n\n // Generate safelist\n const safelist: string[] = [];\n\n // Add classes from getStyles() calls in user code\n [...getStylesProps.entries()].forEach(([propName, values]) => {\n const variantGroup = variants[propName as keyof typeof variants];\n if (variantGroup) {\n values.forEach((value) => {\n const cls = (variantGroup as Record<string, string>)[value];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n });\n }\n });\n\n // Add defaults from all components (including internal dependencies)\n allComponents.forEach((componentInfo) => {\n const userProps = componentProps.get(componentInfo.name) ?? new Map();\n const unresolvedSpreadProps =\n componentUnresolvedSpreadProps.get(componentInfo.name) ?? new Set();\n\n // Add default classes (only for props not explicitly set by user)\n Object.entries(componentInfo.defaultProps).forEach(([propName, propValue]) => {\n // Skip if user set this prop explicitly\n if (userProps.has(propName)) {\n return;\n }\n\n // Try direct lookup first\n const variantGroup = variants[propName as keyof typeof variants];\n if (variantGroup) {\n const cls = (variantGroup as Record<string, string>)[propValue];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n }\n\n // Also check propToVariantKeys mapping (e.g., Text's variant -> fontFamily, fontSize, etc.)\n const variantKeys = getVariantKeysForProp(componentInfo, propName);\n if (variantKeys.length > 0) {\n variantKeys.forEach((variantKey) => {\n const mappedVariantGroup =\n variants[variantKey as keyof typeof variants] ?? autoVariantsCache[variantKey];\n if (mappedVariantGroup) {\n const cls = (mappedVariantGroup as Record<string, string>)[propValue];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n }\n });\n }\n });\n\n // Add hardcoded literals from getStyles() calls in component source\n Object.entries(componentInfo.getStylesLiterals).forEach(([propName, propValue]) => {\n // Strip indexed suffix (e.g., \"variantKey:1\" -> \"variantKey\")\n // This handles ternary expressions that generate multiple values per key\n const basePropName = propName.replace(/:\\d+$/, '');\n const variantGroup = variants[basePropName as keyof typeof variants];\n if (variantGroup) {\n const cls = (variantGroup as Record<string, string>)[propValue];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n }\n });\n\n Object.entries(componentInfo.runtimeConfigGetStyles ?? {}).forEach(([propName, selectors]) => {\n const variantGroup =\n variants[propName as keyof typeof variants] ?? autoVariantsCache[propName];\n if (!variantGroup) {\n return;\n }\n\n selectors.forEach((selector) => {\n resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach(\n (value) => {\n const cls = (variantGroup as Record<string, string>)[value];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n },\n );\n });\n });\n\n // Add raw Tailwind classes from cx() calls in component source\n if (componentInfo.cxLiterals) {\n componentInfo.cxLiterals.forEach((cls) => safelist.push(cls));\n }\n\n // Add default-variant classes for props not explicitly set\n // The component uses \"uds-button-size-default-root\" at runtime when no size prop is specified\n // The CSS generator creates rules like: .uds-button-size-md-root, .uds-button-size-default-root { ... }\n // We need BOTH classes: the default (runtime) and the actual value (triggers CSS generation)\n if (componentInfo.propToVariantKeys) {\n // Get defaults from consumer config if provided\n const componentDefaults = options.variantDefaults?.[componentInfo.name] ?? {};\n\n Object.keys(componentInfo.propToVariantKeys).forEach((propName) => {\n // Skip if user set this prop explicitly\n if (userProps.has(propName)) {\n return;\n }\n\n // Get the default value from consumer's config\n const defaultValues = componentDefaults[propName]\n ? [componentDefaults[propName]]\n : getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);\n const variantKeys = getVariantKeysForProp(componentInfo, propName);\n\n variantKeys.forEach((variantKey) => {\n const variantGroup = autoVariantsCache[variantKey];\n if (variantGroup) {\n // Add the \"default\" class (used by component at runtime)\n if (variantGroup['default']) {\n safelist.push(variantGroup['default']);\n }\n // Add the actual value class (triggers CSS generation with the alias)\n defaultValues.forEach((defaultValue) => {\n if (variantGroup[defaultValue]) {\n safelist.push(variantGroup[defaultValue]);\n }\n });\n }\n });\n });\n }\n\n // Add classes for props passed to internal components with literal values\n Object.entries(componentInfo.internalComponentProps).forEach(\n ([_internalCompName, propsRecord]) => {\n Object.entries(propsRecord).forEach(([propName, propValues]) => {\n if (propName === 'className') {\n propValues.forEach((propValue) => {\n propValue\n .split(/\\s+/)\n .filter(Boolean)\n .forEach((cls) => safelist.push(cls));\n });\n return;\n }\n\n const variantGroup = variants[propName as keyof typeof variants];\n if (variantGroup) {\n propValues.forEach((propValue) => {\n const cls = (variantGroup as Record<string, string>)[propValue];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n });\n }\n });\n },\n );\n\n Object.entries(componentInfo.runtimeConfigInternalComponentProps ?? {}).forEach(\n ([_internalCompName, propsRecord]) => {\n Object.entries(propsRecord).forEach(([propName, selectors]) => {\n const variantGroup = variants[propName as keyof typeof variants];\n if (!variantGroup) {\n return;\n }\n\n selectors.forEach((selector) => {\n resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach(\n (value) => {\n const cls = (variantGroup as Record<string, string>)[value];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n },\n );\n });\n });\n },\n );\n\n // Add classes for explicitly used props\n [...userProps.entries()].forEach(([propName, usedValues]) => {\n if (propName === 'className') {\n [...usedValues].forEach((value) => {\n value\n .split(/\\s+/)\n .filter(Boolean)\n .forEach((cls: string) => safelist.push(cls));\n });\n return;\n }\n\n // First try direct lookup (for Box-style props like backgroundColor)\n const variantGroup = variants[propName as keyof typeof variants];\n if (variantGroup) {\n [...usedValues].forEach((value) => {\n const cls = (variantGroup as Record<string, string>)[value];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n });\n }\n\n // Check if this prop maps to variant keys in this component or its internal components\n // This handles cases like Avatar where size prop mapping is in internal AvatarIcon,\n // and Text where variant -> fontFamily, fontSize, fontWeight, lineHeight, etc.\n const componentsToCheck = [\n componentInfo,\n ...getComponentWithDeps(componentInfo.name).slice(1),\n ];\n componentsToCheck.forEach((comp) => {\n const variantKeys = getVariantKeysForProp(comp, propName);\n if (variantKeys.length > 0) {\n variantKeys.forEach((variantKey) => {\n const mappedVariantGroup =\n variants[variantKey as keyof typeof variants] ?? autoVariantsCache[variantKey];\n if (mappedVariantGroup) {\n [...usedValues].forEach((value) => {\n const cls = (mappedVariantGroup as Record<string, string>)[value];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n });\n }\n });\n }\n });\n });\n\n unresolvedSpreadProps.forEach((propName) => {\n addVariantGroupClasses(\n variants[propName as keyof typeof variants] ?? autoVariantsCache[propName],\n safelist,\n );\n\n const componentsToCheck = [\n componentInfo,\n ...getComponentWithDeps(componentInfo.name).slice(1),\n ];\n componentsToCheck.forEach((comp) => {\n const variantKeys = getVariantKeysForProp(comp, propName);\n variantKeys.forEach((variantKey) => {\n addVariantGroupClasses(\n variants[variantKey as keyof typeof variants] ?? autoVariantsCache[variantKey],\n safelist,\n );\n });\n });\n });\n });\n\n if (options.includeAllClassNamePrimitives) {\n safelist.push(...extractClassNamePrimitives(sourceFile));\n }\n\n // Deduplicate\n const finalSafelist = [...new Set(safelist)];\n\n stats.timeMs = Math.round(performance.now() - startTime);\n stats.classesGenerated = finalSafelist.length;\n\n return {\n safelist: finalSafelist,\n imports,\n components: [...seenComponents],\n stats,\n };\n};\n\n/**\n * Find JSX references for a component in the source file\n */\nconst findComponentReferences = (\n sourceFile: ReturnType<Project['createSourceFile']>,\n componentName: string,\n): JsxElementWithAttributes[] => {\n const references: JsxElementWithAttributes[] = [];\n const seenTags = new Set<string>();\n\n const collectMatchingTags = (localName: string): void => {\n sourceFile\n .getDescendants()\n .filter(\n (node): node is JsxElementWithAttributes =>\n Node.isJsxOpeningElement(node) || Node.isJsxSelfClosingElement(node),\n )\n .forEach((node) => {\n const tagName = node.getTagNameNode().getText();\n if (tagName === localName || tagName.startsWith(`${localName}.`)) {\n const key = `${tagName}:${node.getStart()}`;\n if (!seenTags.has(key)) {\n seenTags.add(key);\n references.push(node);\n }\n }\n });\n };\n\n sourceFile.getImportDeclarations().forEach((importDecl) => {\n const moduleSpec = getModuleSpecifierValue(importDecl);\n if (!isUdsComponentModule(moduleSpec)) {\n return;\n }\n\n importDecl.getNamedImports().forEach((namedImport) => {\n if (\n namedImport.getName() !== componentName ||\n isTypeOnlyNamedImport(importDecl, componentName)\n ) {\n return;\n }\n\n const localName = namedImport.getAliasNode()?.getText() ?? componentName;\n const identifier = namedImport.getFirstDescendantByKindOrThrow(ts.SyntaxKind.Identifier);\n\n findJsxReferences(identifier).forEach((reference) => {\n const key = `${reference.getTagNameNode().getText()}:${reference.getStart()}`;\n if (!seenTags.has(key)) {\n seenTags.add(key);\n references.push(reference);\n }\n });\n\n collectMatchingTags(localName);\n });\n });\n\n return references;\n};\n\n/**\n * Extract props from a JSX reference.\n */\nconst extractPropsFromReference = (\n reference: JsxElementWithAttributes,\n stats: PurgeStats,\n sourceFile: ReturnType<Project['createSourceFile']>,\n): Array<{ propName: string; values: string[]; fromSpread: boolean }> => {\n const props: Array<{ propName: string; values: string[]; fromSpread: boolean }> = [];\n const attributes = reference.getAttributes();\n\n attributes.forEach((attr) => {\n if (attr.asKind(SyntaxKind.JsxAttribute)) {\n const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute);\n const propName = jsxAttr.getNameNode().getText();\n const values: string[] = [];\n\n const initializer = jsxAttr.getInitializer();\n\n // Direct string literal: prop=\"value\"\n if (initializer && Node.isStringLiteral(initializer)) {\n values.push(initializer.getLiteralText());\n stats.expressionsResolved++;\n } else if (initializer && initializer.asKind(SyntaxKind.JsxExpression)) {\n // JSX expression: prop={expression}\n // Use extractStringLiterals to handle ternaries, nullish, OR, etc.\n const jsxExpr = initializer.asKindOrThrow(SyntaxKind.JsxExpression);\n const expression = jsxExpr.getExpression();\n if (expression) {\n const resolved = extractStringLiterals(expression);\n values.push(...resolved);\n if (resolved.length > 0) {\n stats.expressionsResolved++;\n }\n }\n }\n\n props.push({ propName, values, fromSpread: false });\n }\n\n if (attr.asKind(SyntaxKind.JsxSpreadAttribute)) {\n stats.spreadsTraced++;\n\n const spreadAttr = attr.asKindOrThrow(SyntaxKind.JsxSpreadAttribute);\n const expression = spreadAttr.getExpression();\n const spreadName = expression.getText();\n\n const resolvedSpreadProps = traceSpreadInFile(spreadName, sourceFile);\n\n resolvedSpreadProps.forEach(([propName, values]) => {\n props.push({ propName, values, fromSpread: true });\n });\n }\n });\n\n return props;\n};\n\n/**\n * Trace spread props to their source within the same file.\n */\nconst traceSpreadInFile = (\n spreadName: string,\n sourceFile: ReturnType<Project['createSourceFile']>,\n): Array<[string, string[]]> => {\n const props = new Map<string, Set<string>>();\n\n const varDecl = sourceFile\n .getDescendantsOfKind(SyntaxKind.VariableDeclaration)\n .find((declaration) => declaration.getName() === spreadName);\n if (!varDecl) {\n return [];\n }\n\n const initializer = varDecl.getInitializer();\n if (!initializer) {\n return [];\n }\n\n getSpreadObjectLiteralCandidates(initializer).forEach((objLiteral) => {\n objLiteral.getProperties().forEach((prop) => {\n if (!prop.asKind(SyntaxKind.PropertyAssignment)) {\n return;\n }\n\n const propAssign = prop.asKindOrThrow(SyntaxKind.PropertyAssignment);\n const propName = propAssign.getName();\n const propInit = propAssign.getInitializer();\n const values = propInit ? extractStringLiterals(propInit) : [];\n const existingValues = props.get(propName) ?? new Set<string>();\n\n values.forEach((value) => existingValues.add(value));\n props.set(propName, existingValues);\n });\n });\n\n return [...props.entries()].map(([propName, values]) => [propName, [...values]]);\n};\n\nconst getSpreadObjectLiteralCandidates = (node: Node): ObjectLiteralExpression[] => {\n if (Node.isObjectLiteralExpression(node)) {\n return [node];\n }\n\n if (Node.isParenthesizedExpression(node)) {\n return getSpreadObjectLiteralCandidates(node.getExpression());\n }\n\n if (Node.isAsExpression(node) || Node.isTypeAssertion(node) || Node.isSatisfiesExpression(node)) {\n return getSpreadObjectLiteralCandidates(node.getExpression());\n }\n\n if (Node.isConditionalExpression(node)) {\n return [\n ...getSpreadObjectLiteralCandidates(node.getWhenTrue()),\n ...getSpreadObjectLiteralCandidates(node.getWhenFalse()),\n ];\n }\n\n return [];\n};\n\n/**\n * Extract props from getStyles() calls in user code.\n * This handles cases like:\n * const styles = getStyles({ backgroundColor: 'brand', spacing: '4' });\n */\nconst extractGetStylesCalls = (\n sourceFile: ReturnType<Project['createSourceFile']>,\n stats: PurgeStats,\n\n variants: Record<string, Record<string, string>>,\n): Map<string, Set<string>> => {\n const props = new Map<string, Set<string>>();\n\n const VALID_VARIANTS = new Set(Object.keys(variants));\n\n // Find all getStyles() call expressions\n const callExpressions = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression);\n\n callExpressions.forEach((call) => {\n const expression = call.getExpression();\n if (expression.getText() !== 'getStyles') {\n return;\n }\n\n const args = call.getArguments();\n if (args.length === 0) {\n return;\n }\n\n const firstArg = args[0];\n if (!firstArg.asKind(SyntaxKind.ObjectLiteralExpression)) {\n return;\n }\n\n const objLiteral = firstArg.asKindOrThrow(SyntaxKind.ObjectLiteralExpression);\n\n objLiteral.getProperties().forEach((prop) => {\n if (prop.asKind(SyntaxKind.PropertyAssignment)) {\n const propAssign = prop.asKindOrThrow(SyntaxKind.PropertyAssignment);\n const propName = propAssign.getName();\n const propInit = propAssign.getInitializer();\n\n if (propInit && VALID_VARIANTS.has(propName)) {\n const values = extractStringLiterals(propInit);\n if (values.length > 0) {\n const existing = props.get(propName) ?? new Set();\n values.forEach((v) => existing.add(v));\n props.set(propName, existing);\n stats.expressionsResolved++;\n }\n }\n } else if (prop.asKind(SyntaxKind.ShorthandPropertyAssignment)) {\n // Handle shorthand like { backgroundColor } where backgroundColor is a variable\n const shorthand = prop.asKindOrThrow(SyntaxKind.ShorthandPropertyAssignment);\n const propName = shorthand.getName();\n\n if (VALID_VARIANTS.has(propName)) {\n // Try to trace the variable\n const nameNode = shorthand.getNameNode();\n const values = extractStringLiterals(nameNode);\n if (values.length > 0) {\n const existing = props.get(propName) ?? new Set();\n values.forEach((v) => existing.add(v));\n props.set(propName, existing);\n stats.expressionsResolved++;\n }\n }\n }\n });\n });\n\n return props;\n};\n\nexport type { PurgeFromCodeOptions, PurgeFromCodeResult, RuntimeConfigValues, VariantDefaults };\nexport { purgeFromCodeOptimized };\n"],"mappings":"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"}
1
+ {"version":3,"file":"purgeFromCode.js","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"sourcesContent":["import type { ImportDeclaration, ObjectLiteralExpression } from 'ts-morph';\nimport { Node, Project, SyntaxKind } from 'ts-morph';\n\nimport { isPerfEnabled } from '../../css/perf';\nimport { extractStringLiterals } from './ast';\nimport type { JsxElementWithAttributes, PurgeStats } from './types';\n\ninterface PurgeFromCodeResult {\n safelist: string[];\n imports: string[];\n components: string[];\n stats: PurgeStats;\n}\n\ntype RuntimeConfigValues = Record<string, string | number | boolean>;\n\n/**\n * Serialized component info from pre-generated data\n */\ninterface SerializedComponentInfo {\n name: string;\n defaultProps: Record<string, string>;\n getStylesLiterals: Record<string, string>;\n cxLiterals?: string[];\n internalComponents: string[];\n internalComponentProps: Record<string, Record<string, string[]>>;\n propToVariantKeys: Record<string, string[]>;\n runtimeConfigDefaultProps?: Record<string, string>;\n runtimeConfigGetStyles?: Record<string, string[]>;\n runtimeConfigInternalComponentProps?: Record<string, Record<string, string[]>>;\n}\n\n/**\n * Get component info with all its dependencies (using pre-generated data)\n */\nconst getComponentWithDeps = (componentName: string): SerializedComponentInfo[] => {\n const visited = new Set<string>();\n const result: SerializedComponentInfo[] = [];\n\n const collect = (name: string): void => {\n if (visited.has(name)) {\n return;\n }\n visited.add(name);\n\n const info = resolveComponentInfo(name);\n if (!info) {\n return;\n }\n\n result.push(info);\n\n // Recursively collect internal component dependencies\n info.internalComponents.forEach((depName) => collect(depName));\n };\n\n collect(componentName);\n return result;\n};\n\n/**\n * Optimized purge from code string.\n *\n * This is a standalone implementation that:\n * - Analyzes UDS component source files to get accurate default props\n * - Includes defaults from internally used components\n * - Only depends on variants from src/styles/variants.ts (source of truth)\n * - Uses ts-morph for AST analysis\n *\n * Key behaviors:\n * - Includes classes for component default props (analyzed from source)\n * - Includes defaults for internal component dependencies\n * - Includes classes for explicitly used prop values\n * - Resolves ternary/logical expressions to extract all possible values\n * - Traces spreads to const objects in the same file\n * - Does NOT fall back to type properties for unresolved spreads\n */\n/**\n * Variant defaults per component from consumer's config\n * e.g., { Button: { size: 'md', variant: 'primary' }, Avatar: { size: 'md' } }\n */\ntype VariantDefaults = Record<string, Record<string, string>>;\n\ninterface PurgeFromCodeOptions {\n colorModes?: ('dark' | 'light')[];\n /** Variant defaults from consumer's config - used to include default CSS when prop not specified */\n variantDefaults?: VariantDefaults;\n runtimeConfigValues?: RuntimeConfigValues;\n variants: Record<string, Record<string, string>>;\n autoVariants: Record<string, Record<string, string>>;\n componentData: Record<string, SerializedComponentInfo>;\n includeAllClassNamePrimitives?: boolean;\n filePath?: string;\n}\n\n/**\n * Auto-variants lookup (loaded at module init)\n */\nlet autoVariantsCache = null as unknown as Record<string, Record<string, string>>;\n\n/**\n * Pre-generated component data (loaded at module init)\n */\nlet componentCache = null as unknown as Record<string, SerializedComponentInfo>;\n\n/**\n * Map of normalized component name -> actual component cache key\n * Useful when internal components are imported without namespace separators\n * (e.g., MenuItemBase vs Menu.ItemBase).\n */\nlet componentNameLookup: Record<string, string> | null = null;\n\nconst buildComponentNameLookup = (\n data: Record<string, SerializedComponentInfo>,\n): Record<string, string> => {\n const lookup: Record<string, string> = {};\n\n Object.keys(data).forEach((key) => {\n const normalized = normalizeComponentName(key);\n // Keep the first match to avoid arbitrary overwrites on collisions\n if (!lookup[normalized]) {\n lookup[normalized] = key;\n }\n });\n\n return lookup;\n};\n\nconst resolveComponentInfo = (name: string): SerializedComponentInfo | undefined => {\n if (componentCache && componentCache[name]) {\n return componentCache[name];\n }\n\n const normalized = normalizeComponentName(name);\n const mappedName = componentNameLookup?.[normalized];\n if (mappedName && componentCache) {\n return componentCache[mappedName];\n }\n\n return undefined;\n};\n\nconst getModuleSpecifierValue = (importDecl: ImportDeclaration): string => {\n return (\n importDecl.getModuleSpecifierValue() ??\n importDecl\n .getModuleSpecifier()\n .getText()\n .replace(/^['\"]|['\"]$/g, '')\n );\n};\n\nconst isTypeOnlyNamedImport = (importDecl: ImportDeclaration, importName: string): boolean => {\n if (importDecl.isTypeOnly()) {\n return true;\n }\n\n return (\n importDecl\n .getNamedImports()\n .find((namedImport) => namedImport.getName() === importName)\n ?.isTypeOnly() ?? false\n );\n};\n\nconst isUdsComponentModule = (moduleSpecifier: string): boolean => {\n const cleaned = moduleSpecifier.replace(/^['\"]|['\"]$/g, '');\n return cleaned === '@yahoo/uds' || cleaned.startsWith('@yahoo/uds/');\n};\n\n/**\n * Normalize component name to match autoVariants keys (lower camel, no punctuation).\n */\nconst normalizeComponentName = (name: string): string => {\n const cleaned = name.replace(/\\W/g, '');\n return cleaned.charAt(0).toLowerCase() + cleaned.slice(1);\n};\n\n/**\n * Fallback: infer prop -> variant key mapping from autoVariants when the\n * generated component data misses it (e.g., helpers like buildAvatarRootClasses).\n */\nconst getAutoVariantKeysForProp = (componentName: string, propName: string): string[] => {\n if (!autoVariantsCache) {\n return [];\n }\n\n const segments = componentName.match(/[A-Z][a-z0-9]*/g) ?? [];\n const candidates = new Set<string>([normalizeComponentName(componentName)]);\n\n // Add progressively shorter prefixes (e.g., AvatarImage -> avatar, avatarimage)\n if (segments.length > 0) {\n Array.from({ length: segments.length }, (_, index) => index + 1).forEach((i) => {\n const partial = segments.slice(0, i).join('');\n candidates.add(normalizeComponentName(partial));\n });\n }\n\n const propLower = propName.toLowerCase();\n\n return Object.keys(autoVariantsCache).filter((key) => {\n const keyLower = key.toLowerCase();\n return Array.from(candidates).some(\n (candidate) => keyLower.startsWith(candidate) && keyLower.includes(propLower),\n );\n });\n};\n\nconst getVariantKeysForProp = (\n componentInfo: SerializedComponentInfo,\n propName: string,\n): string[] => {\n const keys = new Set(componentInfo.propToVariantKeys?.[propName] ?? []);\n\n getAutoVariantKeysForProp(componentInfo.name, propName).forEach((inferred) => keys.add(inferred));\n\n return [...keys];\n};\n\nconst addVariantGroupClasses = (\n variantGroup: Record<string, string> | undefined,\n safelist: string[],\n): void => {\n if (!variantGroup) {\n return;\n }\n\n Object.values(variantGroup).forEach((cls) => {\n safelist.push(cls.replaceAll('\\\\', ''));\n });\n};\n\nconst getRuntimeDefaultPropValues = (\n componentInfo: SerializedComponentInfo,\n propName: string,\n runtimeConfigValues?: RuntimeConfigValues,\n): string[] => {\n const selector = componentInfo.runtimeConfigDefaultProps?.[propName];\n if (!selector || !runtimeConfigValues) {\n return [];\n }\n\n const value = runtimeConfigValues[selector];\n return value === undefined ? [] : [String(value)];\n};\n\nconst getPropCandidateValues = (\n componentInfo: SerializedComponentInfo,\n propName: string,\n userProps: Map<string, Set<string>>,\n options: PurgeFromCodeOptions,\n): string[] => {\n const explicitValues = userProps.get(propName);\n if (explicitValues && explicitValues.size > 0) {\n return [...explicitValues];\n }\n\n const configuredDefault = options.variantDefaults?.[componentInfo.name]?.[propName];\n if (configuredDefault) {\n return [configuredDefault];\n }\n\n if (componentInfo.defaultProps[propName]) {\n return [componentInfo.defaultProps[propName]];\n }\n\n return getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);\n};\n\nconst resolveRuntimeSelectorValues = (\n selectorTemplate: string,\n componentInfo: SerializedComponentInfo,\n userProps: Map<string, Set<string>>,\n options: PurgeFromCodeOptions,\n): string[] => {\n const runtimeConfigValues = options.runtimeConfigValues;\n if (!runtimeConfigValues) {\n return [];\n }\n\n const placeholders = [...selectorTemplate.matchAll(/\\$\\{(\\w+)\\}/g)].map((match) => match[1]);\n const selectors = placeholders.reduce<string[]>(\n (acc, propName) => {\n const propValues = getPropCandidateValues(componentInfo, propName, userProps, options);\n if (propValues.length === 0) {\n return [];\n }\n\n return acc.flatMap((selector) =>\n propValues.map((value) => selector.replaceAll('$' + '{' + propName + '}', value)),\n );\n },\n [selectorTemplate],\n );\n\n return selectors.flatMap((selector) => {\n const value = runtimeConfigValues[selector];\n return value === undefined ? [] : [String(value)];\n });\n};\n\nconst extractClassNamePrimitives = (\n sourceFile: ReturnType<Project['createSourceFile']>,\n): string[] => {\n const classes: string[] = [];\n\n // JSX className attributes\n sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((attr) => {\n if (attr.getNameNode().getText() !== 'className') {\n return;\n }\n\n const initializer = attr.getInitializer();\n if (!initializer) {\n return;\n }\n\n const values: string[] = [];\n\n if (Node.isStringLiteral(initializer)) {\n values.push(initializer.getLiteralText());\n } else if (Node.isJsxExpression(initializer)) {\n const expr = initializer.getExpression();\n if (expr) {\n values.push(...extractStringLiterals(expr));\n }\n }\n\n values.forEach((raw) => {\n classes.push(...raw.split(/\\s+/).filter(Boolean));\n });\n });\n\n // Plain object property assignments like const props = { className: '...' }\n sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAssignment).forEach((prop) => {\n if (prop.getName() !== 'className') {\n return;\n }\n\n const initializer = prop.getInitializer();\n if (!initializer) {\n return;\n }\n\n const rawValues = extractStringLiterals(initializer);\n rawValues.forEach((raw) => {\n classes.push(...raw.split(/\\s+/).filter(Boolean));\n });\n });\n\n return classes;\n};\n\nconst purgeFromCodeOptimized = async (\n code: string,\n options: PurgeFromCodeOptions,\n): Promise<PurgeFromCodeResult> => {\n const { variants, autoVariants, componentData } = options;\n\n if (!autoVariantsCache) {\n autoVariantsCache = autoVariants;\n }\n\n if (!componentCache) {\n componentCache = componentData;\n componentNameLookup = buildComponentNameLookup(componentData);\n }\n\n const startTime = performance.now();\n const perf = isPerfEnabled();\n\n // Fast pre-check: skip AST analysis entirely for files without UDS imports\n if (!/@yahoo\\/uds\\b/.test(code) && !options.includeAllClassNamePrimitives) {\n return {\n safelist: [],\n imports: [],\n components: [],\n stats: {\n filesScanned: 1,\n timeMs: 0,\n classesGenerated: 0,\n spreadsTraced: 0,\n expressionsResolved: 0,\n },\n };\n }\n\n const projectCreateStart = performance.now();\n const project = new Project({ useInMemoryFileSystem: true });\n const sourceFile = project.createSourceFile(options.filePath ?? 'input.tsx', code, {\n overwrite: true,\n });\n const projectCreateMs = performance.now() - projectCreateStart;\n\n const stats: PurgeStats = {\n filesScanned: 1,\n timeMs: 0,\n classesGenerated: 0,\n spreadsTraced: 0,\n expressionsResolved: 0,\n };\n\n // Parse UDS imports\n const importParseStart = performance.now();\n const imports: string[] = [];\n sourceFile.getImportDeclarations().forEach((importDecl) => {\n const moduleSpec = getModuleSpecifierValue(importDecl);\n if (isUdsComponentModule(moduleSpec)) {\n importDecl.getNamedImports().forEach((namedImport) => {\n if (!namedImport.isTypeOnly() && !importDecl.isTypeOnly()) {\n imports.push(namedImport.getName());\n }\n });\n }\n });\n const importParseMs = performance.now() - importParseStart;\n\n // Track all resolved prop values per component\n const componentProps = new Map<string, Map<string, Set<string>>>();\n const componentUnresolvedSpreadProps = new Map<string, Set<string>>();\n const referencedComponents = new Set<string>();\n\n // Extract props from getStyles() calls in user code\n const getStylesExtractStart = performance.now();\n const getStylesProps = extractGetStylesCalls(sourceFile, stats, variants);\n const getStylesExtractMs = performance.now() - getStylesExtractStart;\n\n // Find all JSX elements that use UDS components\n const jsxAnalysisStart = performance.now();\n\n // Cache JSX elements once for all component lookups (avoids repeated AST traversals)\n const jsxElementsCache = sourceFile\n .getDescendants()\n .filter(\n (node): node is JsxElementWithAttributes =>\n Node.isJsxOpeningElement(node) || Node.isJsxSelfClosingElement(node),\n );\n\n imports.forEach((imp) => {\n const references = findComponentReferences(sourceFile, imp, jsxElementsCache);\n\n references.forEach((reference) => {\n const tagName = reference.getTagNameNode().getText();\n const componentName = tagName || imp;\n\n referencedComponents.add(componentName);\n\n const propsMap = componentProps.get(componentName) ?? new Map<string, Set<string>>();\n const unresolvedSpreadProps = componentUnresolvedSpreadProps.get(componentName) ?? new Set();\n const props = extractPropsFromReference(reference, stats, sourceFile);\n\n props.forEach(({ propName, values, fromSpread }) => {\n if (values.length > 0) {\n const existing = propsMap.get(propName) ?? new Set();\n values.forEach((val) => existing.add(val));\n propsMap.set(propName, existing);\n return;\n }\n\n if (fromSpread) {\n unresolvedSpreadProps.add(propName);\n }\n });\n\n componentProps.set(componentName, propsMap);\n componentUnresolvedSpreadProps.set(componentName, unresolvedSpreadProps);\n });\n\n if (!componentProps.has(imp)) {\n componentProps.set(imp, new Map());\n }\n\n if (!componentUnresolvedSpreadProps.has(imp)) {\n componentUnresolvedSpreadProps.set(imp, new Set());\n }\n });\n\n const jsxAnalysisMs = performance.now() - jsxAnalysisStart;\n\n // Collect all components (including dependencies)\n const safelistGenStart = performance.now();\n const allComponents: SerializedComponentInfo[] = [];\n const seenComponents = new Set<string>();\n\n const componentsToProcess = new Set<string>([...imports, ...referencedComponents]);\n\n componentsToProcess.forEach((componentName) => {\n const componentsWithDeps = getComponentWithDeps(componentName);\n componentsWithDeps.forEach((comp) => {\n if (!seenComponents.has(comp.name)) {\n seenComponents.add(comp.name);\n allComponents.push(comp);\n }\n });\n });\n\n // Generate safelist\n const safelist: string[] = [];\n\n // Add classes from getStyles() calls in user code\n [...getStylesProps.entries()].forEach(([propName, values]) => {\n const variantGroup = variants[propName as keyof typeof variants];\n if (variantGroup) {\n values.forEach((value) => {\n const cls = (variantGroup as Record<string, string>)[value];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n });\n }\n });\n\n // Add defaults from all components (including internal dependencies)\n allComponents.forEach((componentInfo) => {\n const userProps = componentProps.get(componentInfo.name) ?? new Map();\n const unresolvedSpreadProps =\n componentUnresolvedSpreadProps.get(componentInfo.name) ?? new Set();\n\n // Add default classes (only for props not explicitly set by user)\n Object.entries(componentInfo.defaultProps).forEach(([propName, propValue]) => {\n // Skip if user set this prop explicitly\n if (userProps.has(propName)) {\n return;\n }\n\n // Try direct lookup first\n const variantGroup = variants[propName as keyof typeof variants];\n if (variantGroup) {\n const cls = (variantGroup as Record<string, string>)[propValue];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n }\n\n // Also check propToVariantKeys mapping (e.g., Text's variant -> fontFamily, fontSize, etc.)\n const variantKeys = getVariantKeysForProp(componentInfo, propName);\n if (variantKeys.length > 0) {\n variantKeys.forEach((variantKey) => {\n const mappedVariantGroup =\n variants[variantKey as keyof typeof variants] ?? autoVariantsCache[variantKey];\n if (mappedVariantGroup) {\n const cls = (mappedVariantGroup as Record<string, string>)[propValue];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n }\n });\n }\n });\n\n // Add hardcoded literals from getStyles() calls in component source\n Object.entries(componentInfo.getStylesLiterals).forEach(([propName, propValue]) => {\n // Strip indexed suffix (e.g., \"variantKey:1\" -> \"variantKey\")\n // This handles ternary expressions that generate multiple values per key\n const basePropName = propName.replace(/:\\d+$/, '');\n const variantGroup = variants[basePropName as keyof typeof variants];\n if (variantGroup) {\n const cls = (variantGroup as Record<string, string>)[propValue];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n }\n });\n\n Object.entries(componentInfo.runtimeConfigGetStyles ?? {}).forEach(([propName, selectors]) => {\n const variantGroup =\n variants[propName as keyof typeof variants] ?? autoVariantsCache[propName];\n if (!variantGroup) {\n return;\n }\n\n selectors.forEach((selector) => {\n resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach(\n (value) => {\n const cls = (variantGroup as Record<string, string>)[value];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n },\n );\n });\n });\n\n // Add raw Tailwind classes from cx() calls in component source\n if (componentInfo.cxLiterals) {\n componentInfo.cxLiterals.forEach((cls) => safelist.push(cls));\n }\n\n // Add default-variant classes for props not explicitly set\n // The component uses \"uds-button-size-default-root\" at runtime when no size prop is specified\n // The CSS generator creates rules like: .uds-button-size-md-root, .uds-button-size-default-root { ... }\n // We need BOTH classes: the default (runtime) and the actual value (triggers CSS generation)\n if (componentInfo.propToVariantKeys) {\n // Get defaults from consumer config if provided\n const componentDefaults = options.variantDefaults?.[componentInfo.name] ?? {};\n\n Object.keys(componentInfo.propToVariantKeys).forEach((propName) => {\n // Skip if user set this prop explicitly\n if (userProps.has(propName)) {\n return;\n }\n\n // Get the default value from consumer's config\n const defaultValues = componentDefaults[propName]\n ? [componentDefaults[propName]]\n : getRuntimeDefaultPropValues(componentInfo, propName, options.runtimeConfigValues);\n const variantKeys = getVariantKeysForProp(componentInfo, propName);\n\n variantKeys.forEach((variantKey) => {\n const variantGroup = autoVariantsCache[variantKey];\n if (variantGroup) {\n // Add the \"default\" class (used by component at runtime)\n if (variantGroup['default']) {\n safelist.push(variantGroup['default']);\n }\n // Add the actual value class (triggers CSS generation with the alias)\n defaultValues.forEach((defaultValue) => {\n if (variantGroup[defaultValue]) {\n safelist.push(variantGroup[defaultValue]);\n }\n });\n }\n });\n });\n }\n\n // Add classes for props passed to internal components with literal values\n Object.entries(componentInfo.internalComponentProps).forEach(\n ([_internalCompName, propsRecord]) => {\n Object.entries(propsRecord).forEach(([propName, propValues]) => {\n if (propName === 'className') {\n propValues.forEach((propValue) => {\n propValue\n .split(/\\s+/)\n .filter(Boolean)\n .forEach((cls) => safelist.push(cls));\n });\n return;\n }\n\n const variantGroup = variants[propName as keyof typeof variants];\n if (variantGroup) {\n propValues.forEach((propValue) => {\n const cls = (variantGroup as Record<string, string>)[propValue];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n });\n }\n });\n },\n );\n\n Object.entries(componentInfo.runtimeConfigInternalComponentProps ?? {}).forEach(\n ([_internalCompName, propsRecord]) => {\n Object.entries(propsRecord).forEach(([propName, selectors]) => {\n const variantGroup = variants[propName as keyof typeof variants];\n if (!variantGroup) {\n return;\n }\n\n selectors.forEach((selector) => {\n resolveRuntimeSelectorValues(selector, componentInfo, userProps, options).forEach(\n (value) => {\n const cls = (variantGroup as Record<string, string>)[value];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n },\n );\n });\n });\n },\n );\n\n // Add classes for explicitly used props\n [...userProps.entries()].forEach(([propName, usedValues]) => {\n if (propName === 'className') {\n [...usedValues].forEach((value) => {\n value\n .split(/\\s+/)\n .filter(Boolean)\n .forEach((cls: string) => safelist.push(cls));\n });\n return;\n }\n\n // First try direct lookup (for Box-style props like backgroundColor)\n const variantGroup = variants[propName as keyof typeof variants];\n if (variantGroup) {\n [...usedValues].forEach((value) => {\n const cls = (variantGroup as Record<string, string>)[value];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n });\n }\n\n // Check if this prop maps to variant keys in this component or its internal components\n // This handles cases like Avatar where size prop mapping is in internal AvatarIcon,\n // and Text where variant -> fontFamily, fontSize, fontWeight, lineHeight, etc.\n const componentsToCheck = [\n componentInfo,\n ...getComponentWithDeps(componentInfo.name).slice(1),\n ];\n componentsToCheck.forEach((comp) => {\n const variantKeys = getVariantKeysForProp(comp, propName);\n if (variantKeys.length > 0) {\n variantKeys.forEach((variantKey) => {\n const mappedVariantGroup =\n variants[variantKey as keyof typeof variants] ?? autoVariantsCache[variantKey];\n if (mappedVariantGroup) {\n [...usedValues].forEach((value) => {\n const cls = (mappedVariantGroup as Record<string, string>)[value];\n if (cls) {\n safelist.push(cls.replaceAll('\\\\', ''));\n }\n });\n }\n });\n }\n });\n });\n\n unresolvedSpreadProps.forEach((propName) => {\n addVariantGroupClasses(\n variants[propName as keyof typeof variants] ?? autoVariantsCache[propName],\n safelist,\n );\n\n const componentsToCheck = [\n componentInfo,\n ...getComponentWithDeps(componentInfo.name).slice(1),\n ];\n componentsToCheck.forEach((comp) => {\n const variantKeys = getVariantKeysForProp(comp, propName);\n variantKeys.forEach((variantKey) => {\n addVariantGroupClasses(\n variants[variantKey as keyof typeof variants] ?? autoVariantsCache[variantKey],\n safelist,\n );\n });\n });\n });\n });\n\n if (options.includeAllClassNamePrimitives) {\n safelist.push(...extractClassNamePrimitives(sourceFile));\n }\n\n // Deduplicate\n const finalSafelist = [...new Set(safelist)];\n\n const safelistGenerationMs = performance.now() - safelistGenStart;\n\n stats.timeMs = Math.round(performance.now() - startTime);\n stats.classesGenerated = finalSafelist.length;\n\n if (perf) {\n stats.projectCreateMs = Math.round(projectCreateMs * 100) / 100;\n stats.importParseMs = Math.round(importParseMs * 100) / 100;\n stats.getStylesExtractMs = Math.round(getStylesExtractMs * 100) / 100;\n stats.jsxAnalysisMs = Math.round(jsxAnalysisMs * 100) / 100;\n stats.safelistGenerationMs = Math.round(safelistGenerationMs * 100) / 100;\n }\n\n return {\n safelist: finalSafelist,\n imports,\n components: [...seenComponents],\n stats,\n };\n};\n\n/**\n * Find JSX references for a component in the source file\n */\nconst findComponentReferences = (\n sourceFile: ReturnType<Project['createSourceFile']>,\n componentName: string,\n jsxElementsCache?: JsxElementWithAttributes[],\n): JsxElementWithAttributes[] => {\n const references: JsxElementWithAttributes[] = [];\n const seenTags = new Set<string>();\n\n // Use cached JSX elements if provided, otherwise compute them\n const allJsxElements =\n jsxElementsCache ??\n (sourceFile\n .getDescendants()\n .filter(\n (node): node is JsxElementWithAttributes =>\n Node.isJsxOpeningElement(node) || Node.isJsxSelfClosingElement(node),\n ) as JsxElementWithAttributes[]);\n\n const collectMatchingTags = (localName: string): void => {\n for (const node of allJsxElements) {\n const tagName = node.getTagNameNode().getText();\n if (tagName === localName || tagName.startsWith(`${localName}.`)) {\n const key = `${tagName}:${node.getStart()}`;\n if (!seenTags.has(key)) {\n seenTags.add(key);\n references.push(node);\n }\n }\n }\n };\n\n sourceFile.getImportDeclarations().forEach((importDecl) => {\n const moduleSpec = getModuleSpecifierValue(importDecl);\n if (!isUdsComponentModule(moduleSpec)) {\n return;\n }\n\n importDecl.getNamedImports().forEach((namedImport) => {\n if (\n namedImport.getName() !== componentName ||\n isTypeOnlyNamedImport(importDecl, componentName)\n ) {\n return;\n }\n\n const localName = namedImport.getAliasNode()?.getText() ?? componentName;\n collectMatchingTags(localName);\n });\n });\n\n return references;\n};\n\n/**\n * Extract props from a JSX reference.\n */\nconst extractPropsFromReference = (\n reference: JsxElementWithAttributes,\n stats: PurgeStats,\n sourceFile: ReturnType<Project['createSourceFile']>,\n): Array<{ propName: string; values: string[]; fromSpread: boolean }> => {\n const props: Array<{ propName: string; values: string[]; fromSpread: boolean }> = [];\n const attributes = reference.getAttributes();\n\n attributes.forEach((attr) => {\n if (attr.asKind(SyntaxKind.JsxAttribute)) {\n const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute);\n const propName = jsxAttr.getNameNode().getText();\n const values: string[] = [];\n\n const initializer = jsxAttr.getInitializer();\n\n // Direct string literal: prop=\"value\"\n if (initializer && Node.isStringLiteral(initializer)) {\n values.push(initializer.getLiteralText());\n stats.expressionsResolved++;\n } else if (initializer && initializer.asKind(SyntaxKind.JsxExpression)) {\n // JSX expression: prop={expression}\n // Use extractStringLiterals to handle ternaries, nullish, OR, etc.\n const jsxExpr = initializer.asKindOrThrow(SyntaxKind.JsxExpression);\n const expression = jsxExpr.getExpression();\n if (expression) {\n const resolved = extractStringLiterals(expression);\n values.push(...resolved);\n if (resolved.length > 0) {\n stats.expressionsResolved++;\n }\n }\n }\n\n props.push({ propName, values, fromSpread: false });\n }\n\n if (attr.asKind(SyntaxKind.JsxSpreadAttribute)) {\n stats.spreadsTraced++;\n\n const spreadAttr = attr.asKindOrThrow(SyntaxKind.JsxSpreadAttribute);\n const expression = spreadAttr.getExpression();\n const spreadName = expression.getText();\n\n const resolvedSpreadProps = traceSpreadInFile(spreadName, sourceFile);\n\n resolvedSpreadProps.forEach(([propName, values]) => {\n props.push({ propName, values, fromSpread: true });\n });\n }\n });\n\n return props;\n};\n\n/**\n * Trace spread props to their source within the same file.\n */\nconst traceSpreadInFile = (\n spreadName: string,\n sourceFile: ReturnType<Project['createSourceFile']>,\n): Array<[string, string[]]> => {\n const props = new Map<string, Set<string>>();\n\n const varDecl = sourceFile\n .getDescendantsOfKind(SyntaxKind.VariableDeclaration)\n .find((declaration) => declaration.getName() === spreadName);\n if (!varDecl) {\n return [];\n }\n\n const initializer = varDecl.getInitializer();\n if (!initializer) {\n return [];\n }\n\n getSpreadObjectLiteralCandidates(initializer).forEach((objLiteral) => {\n objLiteral.getProperties().forEach((prop) => {\n if (!prop.asKind(SyntaxKind.PropertyAssignment)) {\n return;\n }\n\n const propAssign = prop.asKindOrThrow(SyntaxKind.PropertyAssignment);\n const propName = propAssign.getName();\n const propInit = propAssign.getInitializer();\n const values = propInit ? extractStringLiterals(propInit) : [];\n const existingValues = props.get(propName) ?? new Set<string>();\n\n values.forEach((value) => existingValues.add(value));\n props.set(propName, existingValues);\n });\n });\n\n return [...props.entries()].map(([propName, values]) => [propName, [...values]]);\n};\n\nconst getSpreadObjectLiteralCandidates = (node: Node): ObjectLiteralExpression[] => {\n if (Node.isObjectLiteralExpression(node)) {\n return [node];\n }\n\n if (Node.isParenthesizedExpression(node)) {\n return getSpreadObjectLiteralCandidates(node.getExpression());\n }\n\n if (Node.isAsExpression(node) || Node.isTypeAssertion(node) || Node.isSatisfiesExpression(node)) {\n return getSpreadObjectLiteralCandidates(node.getExpression());\n }\n\n if (Node.isConditionalExpression(node)) {\n return [\n ...getSpreadObjectLiteralCandidates(node.getWhenTrue()),\n ...getSpreadObjectLiteralCandidates(node.getWhenFalse()),\n ];\n }\n\n return [];\n};\n\n/**\n * Extract props from getStyles() calls in user code.\n * This handles cases like:\n * const styles = getStyles({ backgroundColor: 'brand', spacing: '4' });\n */\nconst extractGetStylesCalls = (\n sourceFile: ReturnType<Project['createSourceFile']>,\n stats: PurgeStats,\n\n variants: Record<string, Record<string, string>>,\n): Map<string, Set<string>> => {\n const props = new Map<string, Set<string>>();\n\n const VALID_VARIANTS = new Set(Object.keys(variants));\n\n // Find all getStyles() call expressions\n const callExpressions = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression);\n\n callExpressions.forEach((call) => {\n const expression = call.getExpression();\n if (expression.getText() !== 'getStyles') {\n return;\n }\n\n const args = call.getArguments();\n if (args.length === 0) {\n return;\n }\n\n const firstArg = args[0];\n if (!firstArg.asKind(SyntaxKind.ObjectLiteralExpression)) {\n return;\n }\n\n const objLiteral = firstArg.asKindOrThrow(SyntaxKind.ObjectLiteralExpression);\n\n objLiteral.getProperties().forEach((prop) => {\n if (prop.asKind(SyntaxKind.PropertyAssignment)) {\n const propAssign = prop.asKindOrThrow(SyntaxKind.PropertyAssignment);\n const propName = propAssign.getName();\n const propInit = propAssign.getInitializer();\n\n if (propInit && VALID_VARIANTS.has(propName)) {\n const values = extractStringLiterals(propInit);\n if (values.length > 0) {\n const existing = props.get(propName) ?? new Set();\n values.forEach((v) => existing.add(v));\n props.set(propName, existing);\n stats.expressionsResolved++;\n }\n }\n } else if (prop.asKind(SyntaxKind.ShorthandPropertyAssignment)) {\n // Handle shorthand like { backgroundColor } where backgroundColor is a variable\n const shorthand = prop.asKindOrThrow(SyntaxKind.ShorthandPropertyAssignment);\n const propName = shorthand.getName();\n\n if (VALID_VARIANTS.has(propName)) {\n // Try to trace the variable\n const nameNode = shorthand.getNameNode();\n const values = extractStringLiterals(nameNode);\n if (values.length > 0) {\n const existing = props.get(propName) ?? new Set();\n values.forEach((v) => existing.add(v));\n props.set(propName, existing);\n stats.expressionsResolved++;\n }\n }\n }\n });\n });\n\n return props;\n};\n\nexport type { PurgeFromCodeOptions, PurgeFromCodeResult, RuntimeConfigValues, VariantDefaults };\nexport { purgeFromCodeOptimized };\n"],"mappings":"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"}
@@ -16,6 +16,16 @@ interface PurgeStats {
16
16
  spreadsTraced: number;
17
17
  /** Number of expressions resolved */
18
18
  expressionsResolved: number;
19
+ /** Time to create ts-morph Project + parse source (ms) */
20
+ projectCreateMs?: number;
21
+ /** Time to parse import declarations (ms) */
22
+ importParseMs?: number;
23
+ /** Time to extract getStyles() calls (ms) */
24
+ getStylesExtractMs?: number;
25
+ /** Time for JSX reference finding + prop extraction (ms) */
26
+ jsxAnalysisMs?: number;
27
+ /** Time to generate safelist from component data (ms) */
28
+ safelistGenerationMs?: number;
19
29
  }
20
30
  //#endregion
21
31
  export { PurgeStats };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/purger/optimized/types.ts"],"mappings":";;;;;;;UAoCiB,UAAA;;EAEf,YAAA;;EAEA,MAAA;;EAEA,gBAAA;;EAEA,aAAA;;EAEA,mBAAA;AAAA"}
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/purger/optimized/types.ts"],"mappings":";;;;;;;UAoCiB,UAAA;;EAEf,YAAA;;EAEA,MAAA;;EAEA,gBAAA;;EAEA,aAAA;;EAEA,mBAAA;;EAEA,eAAA;;EAEA,aAAA;;EAEA,kBAAA;;EAEA,aAAA;;EAEA,oBAAA;AAAA"}
@@ -16,6 +16,16 @@ interface PurgeStats {
16
16
  spreadsTraced: number;
17
17
  /** Number of expressions resolved */
18
18
  expressionsResolved: number;
19
+ /** Time to create ts-morph Project + parse source (ms) */
20
+ projectCreateMs?: number;
21
+ /** Time to parse import declarations (ms) */
22
+ importParseMs?: number;
23
+ /** Time to extract getStyles() calls (ms) */
24
+ getStylesExtractMs?: number;
25
+ /** Time for JSX reference finding + prop extraction (ms) */
26
+ jsxAnalysisMs?: number;
27
+ /** Time to generate safelist from component data (ms) */
28
+ safelistGenerationMs?: number;
19
29
  }
20
30
  //#endregion
21
31
  export { PurgeStats };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/purger/optimized/types.ts"],"mappings":";;;;;;;UAoCiB,UAAA;;EAEf,YAAA;;EAEA,MAAA;;EAEA,gBAAA;;EAEA,aAAA;;EAEA,mBAAA;AAAA"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/purger/optimized/types.ts"],"mappings":";;;;;;;UAoCiB,UAAA;;EAEf,YAAA;;EAEA,MAAA;;EAEA,gBAAA;;EAEA,aAAA;;EAEA,mBAAA;;EAEA,eAAA;;EAEA,aAAA;;EAEA,kBAAA;;EAEA,aAAA;;EAEA,oBAAA;AAAA"}