@yahoo/uds 3.133.3 → 3.134.1

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 (212) hide show
  1. package/dist/automated-config/dist/generated/autoVariants.cjs +14 -0
  2. package/dist/automated-config/dist/generated/autoVariants.d.cts +14 -0
  3. package/dist/automated-config/dist/generated/autoVariants.d.ts +14 -0
  4. package/dist/automated-config/dist/generated/autoVariants.js +14 -0
  5. package/dist/automated-config/dist/generated/generatedConfigs.cjs +2796 -1
  6. package/dist/automated-config/dist/generated/generatedConfigs.d.cts +288 -2
  7. package/dist/automated-config/dist/generated/generatedConfigs.d.ts +288 -2
  8. package/dist/automated-config/dist/generated/generatedConfigs.js +2796 -2
  9. package/dist/automated-config/dist/generated/universalTokensConfigAuto.cjs +119 -0
  10. package/dist/automated-config/dist/generated/universalTokensConfigAuto.d.cts +2 -1
  11. package/dist/automated-config/dist/generated/universalTokensConfigAuto.d.ts +2 -1
  12. package/dist/automated-config/dist/generated/universalTokensConfigAuto.js +119 -0
  13. package/dist/automated-config/dist/properties.cjs +15 -1
  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 +15 -1
  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/cli/commands/sync.cjs +4 -0
  20. package/dist/cli/commands/sync.js +4 -0
  21. package/dist/cli/dist/lib/args.cjs +7 -3
  22. package/dist/cli/dist/lib/args.js +7 -3
  23. package/dist/components/client/Menu/Menu.ItemCheckbox.d.cts +1 -1
  24. package/dist/components/client/Menu/Menu.ItemCheckbox.d.ts +1 -1
  25. package/dist/components/client/Modal/Modal.cjs +193 -0
  26. package/dist/components/client/Modal/Modal.d.cts +51 -0
  27. package/dist/components/client/Modal/Modal.d.ts +52 -0
  28. package/dist/components/client/Modal/Modal.js +191 -0
  29. package/dist/components/client/Modal/ModalActions.cjs +54 -0
  30. package/dist/components/client/Modal/ModalActions.d.cts +27 -0
  31. package/dist/components/client/Modal/ModalActions.d.ts +28 -0
  32. package/dist/components/client/Modal/ModalActions.js +52 -0
  33. package/dist/components/client/Modal/ModalContent.cjs +37 -0
  34. package/dist/components/client/Modal/ModalContent.d.cts +24 -0
  35. package/dist/components/client/Modal/ModalContent.d.ts +25 -0
  36. package/dist/components/client/Modal/ModalContent.js +35 -0
  37. package/dist/components/client/Modal/ModalContext.cjs +15 -0
  38. package/dist/components/client/Modal/ModalContext.d.cts +13 -0
  39. package/dist/components/client/Modal/ModalContext.d.ts +14 -0
  40. package/dist/components/client/Modal/ModalContext.js +12 -0
  41. package/dist/components/client/Modal/ModalDescription.cjs +29 -0
  42. package/dist/components/client/Modal/ModalDescription.d.cts +23 -0
  43. package/dist/components/client/Modal/ModalDescription.d.ts +24 -0
  44. package/dist/components/client/Modal/ModalDescription.js +27 -0
  45. package/dist/components/client/Modal/ModalTitle.cjs +29 -0
  46. package/dist/components/client/Modal/ModalTitle.d.cts +23 -0
  47. package/dist/components/client/Modal/ModalTitle.d.ts +24 -0
  48. package/dist/components/client/Modal/ModalTitle.js +27 -0
  49. package/dist/components/client/Modal/UDSModalConfigProvider.cjs +42 -0
  50. package/dist/components/client/Modal/UDSModalConfigProvider.d.cts +35 -0
  51. package/dist/components/client/Modal/UDSModalConfigProvider.d.ts +36 -0
  52. package/dist/components/client/Modal/UDSModalConfigProvider.js +39 -0
  53. package/dist/components/client/Modal/index.cjs +16 -0
  54. package/dist/components/client/Modal/index.d.cts +8 -0
  55. package/dist/components/client/Modal/index.d.ts +9 -0
  56. package/dist/components/client/Modal/index.js +9 -0
  57. package/dist/components/client/Modal/useScrollFade.cjs +38 -0
  58. package/dist/components/client/Modal/useScrollFade.d.cts +13 -0
  59. package/dist/components/client/Modal/useScrollFade.d.ts +14 -0
  60. package/dist/components/client/Modal/useScrollFade.js +36 -0
  61. package/dist/components/client/Modal/utils.cjs +32 -0
  62. package/dist/components/client/Modal/utils.d.cts +13 -0
  63. package/dist/components/client/Modal/utils.d.ts +14 -0
  64. package/dist/components/client/Modal/utils.js +30 -0
  65. package/dist/components/client/Popover/index.d.cts +1 -1
  66. package/dist/components/client/Popover/index.d.ts +1 -1
  67. package/dist/components/client/Toast/UDSToastConfigProvider.d.cts +1 -1
  68. package/dist/components/client/Toast/UDSToastConfigProvider.d.ts +1 -1
  69. package/dist/components/client/index.cjs +13 -0
  70. package/dist/components/client/index.d.cts +8 -2
  71. package/dist/components/client/index.d.ts +8 -2
  72. package/dist/components/client/index.js +7 -1
  73. package/dist/components/client/providers/UDSConfigProvider.cjs +6 -2
  74. package/dist/components/client/providers/UDSConfigProvider.d.cts +2 -1
  75. package/dist/components/client/providers/UDSConfigProvider.d.ts +2 -1
  76. package/dist/components/client/providers/UDSConfigProvider.js +6 -2
  77. package/dist/components/experimental/client/index.cjs +0 -5
  78. package/dist/components/experimental/client/index.d.cts +1 -2
  79. package/dist/components/experimental/client/index.d.ts +1 -2
  80. package/dist/components/experimental/client/index.js +1 -2
  81. package/dist/components/experimental/index.cjs +1 -10
  82. package/dist/components/experimental/index.d.cts +1 -2
  83. package/dist/components/experimental/index.d.ts +1 -2
  84. package/dist/components/experimental/index.js +2 -7
  85. package/dist/components/index.cjs +20 -0
  86. package/dist/components/index.d.cts +8 -2
  87. package/dist/components/index.d.ts +8 -2
  88. package/dist/components/index.js +14 -1
  89. package/dist/config/dist/index.cjs +129 -4
  90. package/dist/config/dist/index.js +129 -4
  91. package/dist/index.cjs +16 -0
  92. package/dist/index.d.cts +11 -4
  93. package/dist/index.d.ts +11 -4
  94. package/dist/index.js +9 -2
  95. package/dist/runtime/index.cjs +2 -0
  96. package/dist/runtime/index.d.cts +2 -1
  97. package/dist/runtime/index.d.ts +2 -1
  98. package/dist/runtime/index.js +2 -1
  99. package/dist/runtime/modalConfig.cjs +22 -0
  100. package/dist/runtime/modalConfig.d.cts +22 -0
  101. package/dist/runtime/modalConfig.d.ts +22 -0
  102. package/dist/runtime/modalConfig.js +21 -0
  103. package/dist/runtime/udsConfig.cjs +4 -2
  104. package/dist/runtime/udsConfig.d.cts +2 -0
  105. package/dist/runtime/udsConfig.d.ts +2 -0
  106. package/dist/runtime/udsConfig.js +4 -2
  107. package/dist/styles/styler.d.cts +35 -21
  108. package/dist/styles/styler.d.ts +35 -21
  109. package/dist/styles/variants.d.cts +42 -0
  110. package/dist/styles/variants.d.ts +42 -0
  111. package/dist/tailwind/dist/automated-config/dist/generated/autoVariants.cjs +14 -0
  112. package/dist/tailwind/dist/automated-config/dist/generated/autoVariants.js +14 -0
  113. package/dist/tailwind/dist/automated-config/dist/generated/autoVariants.js.map +1 -1
  114. package/dist/tailwind/dist/automated-config/dist/generated/generatedConfigs.cjs +2796 -1
  115. package/dist/tailwind/dist/automated-config/dist/generated/generatedConfigs.js +2796 -2
  116. package/dist/tailwind/dist/automated-config/dist/generated/generatedConfigs.js.map +1 -1
  117. package/dist/tailwind/dist/automated-config/dist/properties.cjs +15 -1
  118. package/dist/tailwind/dist/automated-config/dist/properties.js +15 -1
  119. package/dist/tailwind/dist/automated-config/dist/properties.js.map +1 -1
  120. package/dist/tailwind/dist/commands/css.cjs +1 -0
  121. package/dist/tailwind/dist/commands/css.d.cts.map +1 -1
  122. package/dist/tailwind/dist/commands/css.d.ts.map +1 -1
  123. package/dist/tailwind/dist/commands/css.helpers.cjs +8 -1
  124. package/dist/tailwind/dist/commands/css.helpers.js +8 -1
  125. package/dist/tailwind/dist/commands/css.helpers.js.map +1 -1
  126. package/dist/tailwind/dist/commands/css.js +1 -0
  127. package/dist/tailwind/dist/commands/css.js.map +1 -1
  128. package/dist/tailwind/dist/config/dist/index.cjs +129 -4
  129. package/dist/tailwind/dist/config/dist/index.js +129 -4
  130. package/dist/tailwind/dist/config/dist/index.js.map +1 -1
  131. package/dist/tailwind/dist/css/generate.cjs +7 -4
  132. package/dist/tailwind/dist/css/generate.d.cts.map +1 -1
  133. package/dist/tailwind/dist/css/generate.d.ts.map +1 -1
  134. package/dist/tailwind/dist/css/generate.js +7 -4
  135. package/dist/tailwind/dist/css/generate.js.map +1 -1
  136. package/dist/tailwind/dist/css/nodeUtils.cjs +19 -8
  137. package/dist/tailwind/dist/css/nodeUtils.js +19 -8
  138. package/dist/tailwind/dist/css/nodeUtils.js.map +1 -1
  139. package/dist/tailwind/dist/css/perf.cjs +92 -0
  140. package/dist/tailwind/dist/css/perf.js +89 -0
  141. package/dist/tailwind/dist/css/perf.js.map +1 -0
  142. package/dist/tailwind/dist/css/purgeWorker.cjs +47 -0
  143. package/dist/tailwind/dist/css/purgeWorker.d.cts +2 -0
  144. package/dist/tailwind/dist/css/purgeWorker.d.ts +2 -0
  145. package/dist/tailwind/dist/css/purgeWorker.js +48 -0
  146. package/dist/tailwind/dist/css/purgeWorker.js.map +1 -0
  147. package/dist/tailwind/dist/css/runner.cjs +158 -145
  148. package/dist/tailwind/dist/css/runner.js +158 -145
  149. package/dist/tailwind/dist/css/runner.js.map +1 -1
  150. package/dist/tailwind/dist/css/utils.cjs +8 -0
  151. package/dist/tailwind/dist/css/utils.js +8 -0
  152. package/dist/tailwind/dist/css/utils.js.map +1 -1
  153. package/dist/tailwind/dist/css/workerPool.cjs +89 -0
  154. package/dist/tailwind/dist/css/workerPool.js +90 -0
  155. package/dist/tailwind/dist/css/workerPool.js.map +1 -0
  156. package/dist/tailwind/dist/purger/optimized/ast/expressions.cjs +95 -15
  157. package/dist/tailwind/dist/purger/optimized/ast/expressions.js +95 -15
  158. package/dist/tailwind/dist/purger/optimized/ast/expressions.js.map +1 -1
  159. package/dist/tailwind/dist/purger/optimized/purgeFromCode.cjs +38 -14
  160. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.cts.map +1 -1
  161. package/dist/tailwind/dist/purger/optimized/purgeFromCode.d.ts.map +1 -1
  162. package/dist/tailwind/dist/purger/optimized/purgeFromCode.js +39 -15
  163. package/dist/tailwind/dist/purger/optimized/purgeFromCode.js.map +1 -1
  164. package/dist/tailwind/dist/purger/optimized/types.d.cts +10 -0
  165. package/dist/tailwind/dist/purger/optimized/types.d.cts.map +1 -1
  166. package/dist/tailwind/dist/purger/optimized/types.d.ts +10 -0
  167. package/dist/tailwind/dist/purger/optimized/types.d.ts.map +1 -1
  168. package/dist/tailwind/dist/runtimeConfig/hookMetadata.cjs +34 -0
  169. package/dist/tailwind/dist/runtimeConfig/hookMetadata.js +34 -0
  170. package/dist/tailwind/dist/runtimeConfig/hookMetadata.js.map +1 -1
  171. package/dist/tailwind/dist/tailwind/plugins/blurBgFallback.cjs +3 -0
  172. package/dist/tailwind/dist/tailwind/plugins/blurBgFallback.js +3 -0
  173. package/dist/tailwind/dist/tailwind/plugins/blurBgFallback.js.map +1 -1
  174. package/dist/tailwind/dist/tailwind/plugins/components.cjs +1 -0
  175. package/dist/tailwind/dist/tailwind/plugins/components.js +2 -1
  176. package/dist/tailwind/dist/tailwind/plugins/components.js.map +1 -1
  177. package/dist/tailwind/dist/types/dist/index.d.cts.map +1 -1
  178. package/dist/tailwind/dist/types/dist/index.d.ts.map +1 -1
  179. package/dist/tokens/automation/configs/index.cjs +1 -0
  180. package/dist/tokens/automation/configs/index.d.cts +2 -2
  181. package/dist/tokens/automation/configs/index.d.ts +2 -2
  182. package/dist/tokens/automation/configs/index.js +2 -2
  183. package/dist/tokens/automation/index.cjs +1 -0
  184. package/dist/tokens/automation/index.d.cts +2 -2
  185. package/dist/tokens/automation/index.d.ts +2 -2
  186. package/dist/tokens/automation/index.js +2 -2
  187. package/dist/tokens/index.cjs +1 -0
  188. package/dist/tokens/index.d.cts +3 -3
  189. package/dist/tokens/index.d.ts +3 -3
  190. package/dist/tokens/index.js +2 -2
  191. package/dist/tokens/types.d.cts +2 -2
  192. package/dist/tokens/types.d.ts +2 -2
  193. package/dist/types/dist/index.d.cts +68 -2
  194. package/dist/types/dist/index.d.ts +68 -2
  195. package/dist/uds/generated/componentData.cjs +1024 -833
  196. package/dist/uds/generated/componentData.js +995 -840
  197. package/dist/uds/generated/tailwindPurge.cjs +137 -96
  198. package/dist/uds/generated/tailwindPurge.js +137 -96
  199. package/dist/utils/exposeAriakitScrollbarWidth.cjs +17 -0
  200. package/dist/utils/exposeAriakitScrollbarWidth.d.cts +13 -0
  201. package/dist/utils/exposeAriakitScrollbarWidth.d.ts +13 -0
  202. package/dist/utils/exposeAriakitScrollbarWidth.js +16 -0
  203. package/generated/componentData.json +1761 -1550
  204. package/generated/tailwindPurge.ts +4 -4
  205. package/package.json +1 -1
  206. package/dist/components/experimental/client/Modal.cjs +0 -60
  207. package/dist/components/experimental/client/Modal.d.cts +0 -27
  208. package/dist/components/experimental/client/Modal.d.ts +0 -28
  209. package/dist/components/experimental/client/Modal.js +0 -55
  210. package/dist/tailwind/dist/purger/optimized/ast/jsx.cjs +0 -16
  211. package/dist/tailwind/dist/purger/optimized/ast/jsx.js +0 -17
  212. package/dist/tailwind/dist/purger/optimized/ast/jsx.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"expressions.js","names":[],"sources":["../../../../src/purger/optimized/ast/expressions.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { Identifier } from 'ts-morph';\nimport { Node, Project, SyntaxKind, ts } from 'ts-morph';\n\nconst importedSourceProject = new Project({ useInMemoryFileSystem: true });\nconst importedSourceFileCache = new Map<string, ReturnType<Project['createSourceFile']>>();\nconst tsConfigPathCache = new Map<string, string | null>();\nconst compilerOptionsCache = new Map<string, ts.CompilerOptions | null>();\nconst hasImportQuery = (moduleSpecifier: string): boolean => moduleSpecifier.includes('?');\n\nconst getLocalDefinitionNodes = (node: Node): Node[] => {\n if (!Node.isIdentifier(node)) {\n return [];\n }\n\n const name = node.getText();\n const nodeStart = node.getStart();\n const sourceFile = node.getSourceFile();\n\n const matches = [\n ...sourceFile\n .getDescendantsOfKind(SyntaxKind.VariableDeclaration)\n .filter((definition) => definition.getName() === name && definition.getStart() <= nodeStart),\n ...sourceFile\n .getDescendantsOfKind(SyntaxKind.Parameter)\n .filter((definition) => definition.getName() === name && definition.getStart() <= nodeStart),\n ...sourceFile\n .getDescendantsOfKind(SyntaxKind.BindingElement)\n .filter((definition) => definition.getName() === name && definition.getStart() <= nodeStart),\n ...sourceFile\n .getFunctions()\n .filter((definition) => definition.getName() === name && definition.getStart() <= nodeStart),\n ];\n\n return matches.sort((left, right) => right.getStart() - left.getStart()).slice(0, 1);\n};\n\nconst getDefinitionNodesSafe = (node: Identifier): Node[] => {\n try {\n return node.getDefinitionNodes();\n } catch {\n return getLocalDefinitionNodes(node);\n }\n};\n\nconst isExistingFile = (candidate: string): boolean =>\n fs.existsSync(candidate) && fs.statSync(candidate).isFile();\n\nconst resolveRelativeImportPath = (\n sourceFilePath: string,\n moduleSpecifier: string,\n): string | null => {\n if (\n !path.isAbsolute(sourceFilePath) ||\n !moduleSpecifier.startsWith('.') ||\n hasImportQuery(moduleSpecifier)\n ) {\n return null;\n }\n\n const basePath = path.resolve(path.dirname(sourceFilePath), moduleSpecifier);\n const candidates = [\n basePath,\n `${basePath}.ts`,\n `${basePath}.tsx`,\n `${basePath}.mjs`,\n `${basePath}.cjs`,\n `${basePath}.js`,\n `${basePath}.jsx`,\n path.join(basePath, 'index.ts'),\n path.join(basePath, 'index.tsx'),\n path.join(basePath, 'index.mjs'),\n path.join(basePath, 'index.cjs'),\n path.join(basePath, 'index.js'),\n path.join(basePath, 'index.jsx'),\n ];\n\n return candidates.find((candidate) => isExistingFile(candidate)) ?? null;\n};\n\nconst findNearestTypeScriptConfig = (sourceFilePath: string): string | null => {\n const sourceDir = path.dirname(sourceFilePath);\n const cached = tsConfigPathCache.get(sourceDir);\n\n if (cached !== undefined) {\n return cached;\n }\n\n let currentDir = sourceDir;\n\n while (true) {\n const tsConfigPath = path.join(currentDir, 'tsconfig.json');\n if (isExistingFile(tsConfigPath)) {\n tsConfigPathCache.set(sourceDir, tsConfigPath);\n return tsConfigPath;\n }\n\n const jsConfigPath = path.join(currentDir, 'jsconfig.json');\n if (isExistingFile(jsConfigPath)) {\n tsConfigPathCache.set(sourceDir, jsConfigPath);\n return jsConfigPath;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n tsConfigPathCache.set(sourceDir, null);\n return null;\n }\n\n currentDir = parentDir;\n }\n};\n\nconst getCompilerOptionsForSourceFile = (sourceFilePath: string): ts.CompilerOptions | null => {\n const configPath = findNearestTypeScriptConfig(sourceFilePath);\n if (!configPath) {\n return null;\n }\n\n const cached = compilerOptionsCache.get(configPath);\n if (cached !== undefined) {\n return cached;\n }\n\n const readResult = ts.readConfigFile(configPath, ts.sys.readFile);\n if (readResult.error) {\n compilerOptionsCache.set(configPath, null);\n return null;\n }\n\n const parsed = ts.parseJsonConfigFileContent(readResult.config, ts.sys, path.dirname(configPath));\n\n const compilerOptions =\n parsed.options.paths && !parsed.options.baseUrl\n ? { ...parsed.options, baseUrl: path.dirname(configPath) }\n : parsed.options;\n\n compilerOptionsCache.set(configPath, compilerOptions);\n return compilerOptions;\n};\n\nconst resolveConfigImportPath = (\n sourceFilePath: string,\n moduleSpecifier: string,\n): string | null => {\n if (hasImportQuery(moduleSpecifier)) {\n return null;\n }\n\n const compilerOptions = getCompilerOptionsForSourceFile(sourceFilePath);\n if (!compilerOptions) {\n return null;\n }\n\n const resolvedModule = ts.resolveModuleName(\n moduleSpecifier,\n sourceFilePath,\n compilerOptions,\n ts.sys,\n ).resolvedModule;\n\n if (!resolvedModule) {\n return null;\n }\n\n return isExistingFile(resolvedModule.resolvedFileName) ? resolvedModule.resolvedFileName : null;\n};\n\nconst resolveImportPath = (sourceFilePath: string, moduleSpecifier: string): string | null =>\n moduleSpecifier.startsWith('.')\n ? resolveRelativeImportPath(sourceFilePath, moduleSpecifier)\n : resolveConfigImportPath(sourceFilePath, moduleSpecifier);\n\nconst getImportedSourceFile = (filePath: string) => {\n const cached = importedSourceFileCache.get(filePath);\n if (cached) {\n return cached;\n }\n\n if (!fs.existsSync(filePath)) {\n return null;\n }\n\n const sourceFile = importedSourceProject.createSourceFile(\n filePath,\n fs.readFileSync(filePath, 'utf-8'),\n {\n overwrite: true,\n },\n );\n importedSourceFileCache.set(filePath, sourceFile);\n return sourceFile;\n};\n\nconst extractImportedIdentifierValues = (node: Node, visited: Set<Node>): string[] => {\n if (!Node.isIdentifier(node)) {\n return [];\n }\n\n const sourceFile = node.getSourceFile();\n const sourceFilePath = sourceFile.getFilePath();\n const importMatch = sourceFile\n .getImportDeclarations()\n .find((importDecl) =>\n importDecl\n .getNamedImports()\n .some(\n (namedImport) =>\n (namedImport.getAliasNode()?.getText() ?? namedImport.getName()) === node.getText(),\n ),\n );\n\n if (!importMatch) {\n return [];\n }\n\n const namedImport = importMatch\n .getNamedImports()\n .find(\n (candidate) =>\n (candidate.getAliasNode()?.getText() ?? candidate.getName()) === node.getText(),\n );\n\n if (!namedImport) {\n return [];\n }\n\n const resolvedPath = resolveImportPath(sourceFilePath, importMatch.getModuleSpecifierValue());\n if (!resolvedPath) {\n return [];\n }\n\n const importedSourceFile = getImportedSourceFile(resolvedPath);\n if (!importedSourceFile) {\n return [];\n }\n\n const declaration = importedSourceFile.getVariableDeclaration(namedImport.getName());\n const initializer = declaration?.getInitializer();\n return initializer ? extractStringLiterals(initializer, visited) : [];\n};\n\n/**\n * Extracts string literal values from an expression.\n *\n * Handles:\n * - Direct string literals: 'value'\n * - Ternary expressions: condition ? 'a' : 'b' -> ['a', 'b']\n * - Variable references: traces back to initializer\n * - Logical expressions: a || 'fallback', a ?? 'default'\n * - Function calls: traces to return statements\n * - Template literals: `value`\n * - As expressions: value as Type\n *\n * @param node The expression node to extract values from\n * @param visited Set of visited nodes to prevent infinite recursion\n * @returns Array of extracted string literal values\n */\nconst extractStringLiterals = (node: Node, visited: Set<Node> = new Set()): string[] => {\n if (visited.has(node)) {\n return [];\n }\n visited.add(node);\n\n const directValues = extractDirectLiteralValues(node);\n if (directValues) {\n return directValues;\n }\n\n const templateValues = extractTemplateExpressionValues(node, visited);\n if (templateValues) {\n return templateValues;\n }\n\n // Ternary/conditional expression: condition ? 'a' : 'b'\n if (Node.isConditionalExpression(node)) {\n return [\n ...extractStringLiterals(node.getWhenTrue(), visited),\n ...extractStringLiterals(node.getWhenFalse(), visited),\n ];\n }\n\n const binaryValues = extractBinaryExpressionValues(node, visited);\n if (binaryValues) {\n return binaryValues;\n }\n\n const wrappedExpressionValues = extractWrappedExpressionValues(node, visited);\n if (wrappedExpressionValues) {\n return wrappedExpressionValues;\n }\n\n const propertyAccessValues = extractPropertyAccessValues(node, visited);\n if (propertyAccessValues) {\n return propertyAccessValues;\n }\n\n const elementAccessValues = extractElementAccessValues(node, visited);\n if (elementAccessValues) {\n return elementAccessValues;\n }\n\n const callExpressionValues = extractCallExpressionValues(node, visited);\n if (callExpressionValues) {\n return callExpressionValues;\n }\n\n const identifierValues = extractIdentifierValues(node, visited);\n if (identifierValues) {\n return identifierValues;\n }\n\n return [];\n};\n\nconst extractDirectLiteralValues = (node: Node): string[] | null => {\n if (Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node)) {\n return [node.getLiteralValue()];\n }\n\n return null;\n};\n\nconst extractTemplateExpressionValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isTemplateExpression(node)) {\n return null;\n }\n\n const parts: string[][] = [[node.getHead().getLiteralText()]];\n\n node.getTemplateSpans().forEach((span) => {\n const exprValues = extractStringLiterals(span.getExpression(), visited);\n const literalText = span.getLiteral().getLiteralText();\n parts.push(\n exprValues.length > 0\n ? exprValues.map((value) => `${value}${literalText}`)\n : ['', literalText],\n );\n });\n\n return parts\n .reduce<\n string[]\n >((acc, segment) => acc.flatMap((base) => segment.map((frag) => `${base}${frag}`)), [''])\n .filter((value) => value.length > 0);\n};\n\nconst extractBinaryExpressionValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isBinaryExpression(node)) {\n return null;\n }\n\n const operator = node.getOperatorToken().getText();\n if (operator === '+') {\n const left = extractStringLiterals(node.getLeft(), visited);\n const right = extractStringLiterals(node.getRight(), visited);\n const combined = left.flatMap((l) => right.map((r) => `${l}${r}`));\n return combined.length > 0 ? combined : [];\n }\n\n if (operator === '||' || operator === '??') {\n return [\n ...extractStringLiterals(node.getLeft(), visited),\n ...extractStringLiterals(node.getRight(), visited),\n ];\n }\n\n return [];\n};\n\nconst extractWrappedExpressionValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (Node.isParenthesizedExpression(node) || Node.isAsExpression(node)) {\n return extractStringLiterals(node.getExpression(), visited);\n }\n\n return null;\n};\n\nconst extractPropertyAccessValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isPropertyAccessExpression(node)) {\n return null;\n }\n\n const typeValues = extractLiteralValuesFromType(node);\n if (typeValues.length > 0) {\n return typeValues;\n }\n\n const propertyName = node.getName();\n return extractObjectValues(node.getExpression(), visited)\n .filter(\n (value): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && propertyName in value,\n )\n .map((value) => value[propertyName])\n .filter((value): value is string => typeof value === 'string');\n};\n\nconst extractElementAccessValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isElementAccessExpression(node)) {\n return null;\n }\n\n const typeValues = extractLiteralValuesFromType(node);\n if (typeValues.length > 0) {\n return typeValues;\n }\n\n const expression = node.getExpression();\n return extractObjectValues(expression, visited).flatMap((value) => {\n if (typeof value === 'string') {\n return [value];\n }\n\n if (typeof value === 'object' && value !== null) {\n return Object.values(value).filter((entry): entry is string => typeof entry === 'string');\n }\n\n return [];\n });\n};\n\nconst extractCallExpressionValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isCallExpression(node)) {\n return null;\n }\n\n const expression = node.getExpression();\n\n const fromDefinitions = Node.isIdentifier(expression)\n ? getDefinitionNodesSafe(expression).flatMap((definition) => {\n if (Node.isFunctionDeclaration(definition)) {\n return definition\n .getDescendantsOfKind(SyntaxKind.ReturnStatement)\n .flatMap((returnStmt) => {\n const expression = returnStmt.getExpression();\n return expression ? extractStringLiterals(expression, visited) : [];\n });\n }\n\n if (Node.isVariableDeclaration(definition)) {\n const initializer = definition.getInitializer();\n return initializer ? extractFromFunctionLike(initializer, visited) : [];\n }\n\n return [];\n })\n : [];\n\n const fromArguments = node.getArguments().flatMap((arg) => extractStringLiterals(arg, visited));\n\n return [...fromDefinitions, ...fromArguments];\n};\n\nconst extractArrayElementValues = (node: Node, visited: Set<Node>): string[] => {\n if (Node.isArrayLiteralExpression(node)) {\n return node\n .getElements()\n .flatMap((element) => extractStringLiterals(element, visited))\n .filter((value, index, values) => values.indexOf(value) === index);\n }\n\n if (Node.isParenthesizedExpression(node)) {\n return extractArrayElementValues(node.getExpression(), visited);\n }\n\n if (Node.isAsExpression(node) || Node.isTypeAssertion(node) || Node.isSatisfiesExpression(node)) {\n return extractArrayElementValues(node.getExpression(), visited);\n }\n\n if (Node.isIdentifier(node)) {\n return node\n .getDefinitionNodes()\n .flatMap((definition) => {\n if (Node.isVariableDeclaration(definition)) {\n const initializer = definition.getInitializer();\n return initializer ? extractArrayElementValues(initializer, visited) : [];\n }\n\n return [];\n })\n .filter((value, index, values) => values.indexOf(value) === index);\n }\n\n return [];\n};\n\nconst extractMappedParameterValues = (definition: Node, visited: Set<Node>): string[] => {\n if (!Node.isParameterDeclaration(definition)) {\n return [];\n }\n\n const callback = definition.getParentIfKind(SyntaxKind.ArrowFunction);\n if (!callback) {\n return [];\n }\n\n const callExpression = callback.getParentIfKind(SyntaxKind.CallExpression);\n if (!callExpression) {\n return [];\n }\n\n const expression = callExpression.getExpression();\n if (!Node.isPropertyAccessExpression(expression)) {\n return [];\n }\n\n if (!['map', 'flatMap'].includes(expression.getName())) {\n return [];\n }\n\n const parameterIndex = callback\n .getParameters()\n .findIndex(\n (parameter) => parameter.getNameNode().getText() === definition.getNameNode().getText(),\n );\n\n if (parameterIndex !== 0) {\n return [];\n }\n\n return extractArrayElementValues(expression.getExpression(), visited);\n};\n\nconst extractIdentifierValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isIdentifier(node)) {\n return null;\n }\n\n const values = getDefinitionNodesSafe(node).flatMap((definition) => {\n const mappedParameterValues = extractMappedParameterValues(definition, visited);\n if (mappedParameterValues.length > 0) {\n return mappedParameterValues;\n }\n\n if (\n Node.isVariableDeclaration(definition) ||\n Node.isParameterDeclaration(definition) ||\n Node.isBindingElement(definition)\n ) {\n const initializer = definition.getInitializer();\n return initializer ? extractStringLiterals(initializer, visited) : [];\n }\n\n return [];\n });\n\n if (values.length > 0) {\n return values;\n }\n\n const importedValues = extractImportedIdentifierValues(node, visited);\n if (importedValues.length > 0) {\n return importedValues;\n }\n\n return extractLiteralValuesFromType(node);\n};\n\n/**\n * Extract string literals from arrow functions or function expressions\n */\nconst extractFromFunctionLike = (node: Node, visited: Set<Node>): string[] => {\n const values: string[] = [];\n\n if (Node.isArrowFunction(node)) {\n const body = node.getBody();\n if (Node.isBlock(body)) {\n body.getDescendantsOfKind(SyntaxKind.ReturnStatement).forEach((returnStmt) => {\n const returnExpr = returnStmt.getExpression();\n if (returnExpr) {\n values.push(...extractStringLiterals(returnExpr, visited));\n }\n });\n } else {\n values.push(...extractStringLiterals(body, visited));\n }\n } else if (Node.isFunctionExpression(node)) {\n node.getDescendantsOfKind(SyntaxKind.ReturnStatement).forEach((returnStmt) => {\n const returnExpr = returnStmt.getExpression();\n if (returnExpr) {\n values.push(...extractStringLiterals(returnExpr, visited));\n }\n });\n }\n\n return values;\n};\n\n/**\n * Extract object literal values from an expression.\n * Returns an array of all possible object values (for union types or indexed access).\n */\nconst extractObjectValues = (node: Node, visited: Set<Node>): unknown[] => {\n if (visited.has(node)) {\n return [];\n }\n visited.add(node);\n\n const values: unknown[] = [];\n\n // Object literal expression\n if (Node.isObjectLiteralExpression(node)) {\n const obj: Record<string, unknown> = {};\n node.getProperties().forEach((prop) => {\n if (Node.isPropertyAssignment(prop)) {\n const name = prop.getName();\n const init = prop.getInitializer();\n if (init && Node.isStringLiteral(init)) {\n obj[name] = init.getLiteralValue();\n } else if (init && Node.isObjectLiteralExpression(init)) {\n const nestedValues = extractObjectValues(init, visited);\n if (nestedValues.length > 0) {\n obj[name] = nestedValues[0];\n }\n }\n }\n });\n values.push(obj);\n return values;\n }\n\n // Identifier - trace to initializer\n if (Node.isIdentifier(node)) {\n getDefinitionNodesSafe(node).forEach((definition) => {\n if (Node.isVariableDeclaration(definition)) {\n const initializer = definition.getInitializer();\n if (initializer) {\n // Handle 'as const' assertion\n if (Node.isAsExpression(initializer)) {\n const inner = initializer.getExpression();\n values.push(...extractObjectValues(inner, visited));\n } else {\n values.push(...extractObjectValues(initializer, visited));\n }\n }\n }\n });\n return values;\n }\n\n // Element access - return all values from the object\n if (Node.isElementAccessExpression(node)) {\n const expression = node.getExpression();\n const baseObjects = extractObjectValues(expression, visited);\n\n // For indexed access, return all possible values\n baseObjects.forEach((obj) => {\n if (typeof obj === 'object' && obj !== null) {\n Object.values(obj).forEach((value) => values.push(value));\n }\n });\n return values;\n }\n\n return values;\n};\n\n/**\n * Extract literal values from a TypeScript type (for union types like 'brand' | 'secondary')\n */\nexport const extractLiteralValuesFromType = (node: Node): string[] => {\n const values: string[] = [];\n const nodeType = node.getType();\n\n if (nodeType.isUnion()) {\n nodeType.getUnionTypes().forEach((unionMember) => {\n if (unionMember.isStringLiteral()) {\n values.push(unionMember.getLiteralValue() as string);\n }\n });\n } else if (nodeType.isStringLiteral()) {\n values.push(nodeType.getLiteralValue() as string);\n }\n\n return values;\n};\n\nexport { extractStringLiterals };\n"],"mappings":"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"}
1
+ {"version":3,"file":"expressions.js","names":[],"sources":["../../../../src/purger/optimized/ast/expressions.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { Identifier } from 'ts-morph';\nimport { Node, Project, SyntaxKind, ts } from 'ts-morph';\n\nconst importedSourceProject = new Project({ useInMemoryFileSystem: true });\nconst importedSourceFileCache = new Map<string, ReturnType<Project['createSourceFile']>>();\nconst tsConfigPathCache = new Map<string, string | null>();\nconst compilerOptionsCache = new Map<string, ts.CompilerOptions | null>();\nconst hasImportQuery = (moduleSpecifier: string): boolean => moduleSpecifier.includes('?');\n\nconst getLocalDefinitionNodes = (node: Node): Node[] => {\n if (!Node.isIdentifier(node)) {\n return [];\n }\n\n const name = node.getText();\n const nodeStart = node.getStart();\n const sourceFile = node.getSourceFile();\n\n const matches = [\n ...sourceFile\n .getDescendantsOfKind(SyntaxKind.VariableDeclaration)\n .filter((definition) => definition.getName() === name && definition.getStart() <= nodeStart),\n ...sourceFile\n .getDescendantsOfKind(SyntaxKind.Parameter)\n .filter((definition) => definition.getName() === name && definition.getStart() <= nodeStart),\n ...sourceFile\n .getDescendantsOfKind(SyntaxKind.BindingElement)\n .filter((definition) => definition.getName() === name && definition.getStart() <= nodeStart),\n ...sourceFile\n .getFunctions()\n .filter((definition) => definition.getName() === name && definition.getStart() <= nodeStart),\n ];\n\n return matches.sort((left, right) => right.getStart() - left.getStart()).slice(0, 1);\n};\n\nconst getDefinitionNodesSafe = (node: Identifier): Node[] => {\n return getLocalDefinitionNodes(node);\n};\n\nconst isExistingFile = (candidate: string): boolean =>\n fs.existsSync(candidate) && fs.statSync(candidate).isFile();\n\nconst resolveRelativeImportPath = (\n sourceFilePath: string,\n moduleSpecifier: string,\n): string | null => {\n if (\n !path.isAbsolute(sourceFilePath) ||\n !moduleSpecifier.startsWith('.') ||\n hasImportQuery(moduleSpecifier)\n ) {\n return null;\n }\n\n const basePath = path.resolve(path.dirname(sourceFilePath), moduleSpecifier);\n const candidates = [\n basePath,\n `${basePath}.ts`,\n `${basePath}.tsx`,\n `${basePath}.mjs`,\n `${basePath}.cjs`,\n `${basePath}.js`,\n `${basePath}.jsx`,\n path.join(basePath, 'index.ts'),\n path.join(basePath, 'index.tsx'),\n path.join(basePath, 'index.mjs'),\n path.join(basePath, 'index.cjs'),\n path.join(basePath, 'index.js'),\n path.join(basePath, 'index.jsx'),\n ];\n\n return candidates.find((candidate) => isExistingFile(candidate)) ?? null;\n};\n\nconst findNearestTypeScriptConfig = (sourceFilePath: string): string | null => {\n const sourceDir = path.dirname(sourceFilePath);\n const cached = tsConfigPathCache.get(sourceDir);\n\n if (cached !== undefined) {\n return cached;\n }\n\n let currentDir = sourceDir;\n\n while (true) {\n const tsConfigPath = path.join(currentDir, 'tsconfig.json');\n if (isExistingFile(tsConfigPath)) {\n tsConfigPathCache.set(sourceDir, tsConfigPath);\n return tsConfigPath;\n }\n\n const jsConfigPath = path.join(currentDir, 'jsconfig.json');\n if (isExistingFile(jsConfigPath)) {\n tsConfigPathCache.set(sourceDir, jsConfigPath);\n return jsConfigPath;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n tsConfigPathCache.set(sourceDir, null);\n return null;\n }\n\n currentDir = parentDir;\n }\n};\n\nconst getCompilerOptionsForSourceFile = (sourceFilePath: string): ts.CompilerOptions | null => {\n const configPath = findNearestTypeScriptConfig(sourceFilePath);\n if (!configPath) {\n return null;\n }\n\n const cached = compilerOptionsCache.get(configPath);\n if (cached !== undefined) {\n return cached;\n }\n\n const readResult = ts.readConfigFile(configPath, ts.sys.readFile);\n if (readResult.error) {\n compilerOptionsCache.set(configPath, null);\n return null;\n }\n\n const parsed = ts.parseJsonConfigFileContent(readResult.config, ts.sys, path.dirname(configPath));\n\n const compilerOptions =\n parsed.options.paths && !parsed.options.baseUrl\n ? { ...parsed.options, baseUrl: path.dirname(configPath) }\n : parsed.options;\n\n compilerOptionsCache.set(configPath, compilerOptions);\n return compilerOptions;\n};\n\nconst resolveConfigImportPath = (\n sourceFilePath: string,\n moduleSpecifier: string,\n): string | null => {\n if (hasImportQuery(moduleSpecifier)) {\n return null;\n }\n\n const compilerOptions = getCompilerOptionsForSourceFile(sourceFilePath);\n if (!compilerOptions) {\n return null;\n }\n\n const resolvedModule = ts.resolveModuleName(\n moduleSpecifier,\n sourceFilePath,\n compilerOptions,\n ts.sys,\n ).resolvedModule;\n\n if (!resolvedModule) {\n return null;\n }\n\n return isExistingFile(resolvedModule.resolvedFileName) ? resolvedModule.resolvedFileName : null;\n};\n\nconst resolveImportPath = (sourceFilePath: string, moduleSpecifier: string): string | null =>\n moduleSpecifier.startsWith('.')\n ? resolveRelativeImportPath(sourceFilePath, moduleSpecifier)\n : resolveConfigImportPath(sourceFilePath, moduleSpecifier);\n\nconst getImportedSourceFile = (filePath: string) => {\n const cached = importedSourceFileCache.get(filePath);\n if (cached) {\n return cached;\n }\n\n if (!fs.existsSync(filePath)) {\n return null;\n }\n\n const sourceFile = importedSourceProject.createSourceFile(\n filePath,\n fs.readFileSync(filePath, 'utf-8'),\n {\n overwrite: true,\n },\n );\n importedSourceFileCache.set(filePath, sourceFile);\n return sourceFile;\n};\n\nconst extractImportedIdentifierValues = (node: Node, visited: Set<Node>): string[] => {\n if (!Node.isIdentifier(node)) {\n return [];\n }\n\n const sourceFile = node.getSourceFile();\n const sourceFilePath = sourceFile.getFilePath();\n const importMatch = sourceFile\n .getImportDeclarations()\n .find((importDecl) =>\n importDecl\n .getNamedImports()\n .some(\n (namedImport) =>\n (namedImport.getAliasNode()?.getText() ?? namedImport.getName()) === node.getText(),\n ),\n );\n\n if (!importMatch) {\n return [];\n }\n\n const namedImport = importMatch\n .getNamedImports()\n .find(\n (candidate) =>\n (candidate.getAliasNode()?.getText() ?? candidate.getName()) === node.getText(),\n );\n\n if (!namedImport) {\n return [];\n }\n\n const resolvedPath = resolveImportPath(sourceFilePath, importMatch.getModuleSpecifierValue());\n if (!resolvedPath) {\n return [];\n }\n\n const importedSourceFile = getImportedSourceFile(resolvedPath);\n if (!importedSourceFile) {\n return [];\n }\n\n const declaration = importedSourceFile.getVariableDeclaration(namedImport.getName());\n const initializer = declaration?.getInitializer();\n return initializer ? extractStringLiterals(initializer, visited) : [];\n};\n\n/**\n * Extracts string literal values from an expression.\n *\n * Handles:\n * - Direct string literals: 'value'\n * - Ternary expressions: condition ? 'a' : 'b' -> ['a', 'b']\n * - Variable references: traces back to initializer\n * - Logical expressions: a || 'fallback', a ?? 'default'\n * - Function calls: traces to return statements\n * - Template literals: `value`\n * - As expressions: value as Type\n *\n * @param node The expression node to extract values from\n * @param visited Set of visited nodes to prevent infinite recursion\n * @returns Array of extracted string literal values\n */\nconst extractStringLiterals = (node: Node, visited: Set<Node> = new Set()): string[] => {\n if (visited.has(node)) {\n return [];\n }\n visited.add(node);\n\n const directValues = extractDirectLiteralValues(node);\n if (directValues) {\n return directValues;\n }\n\n const templateValues = extractTemplateExpressionValues(node, visited);\n if (templateValues) {\n return templateValues;\n }\n\n // Ternary/conditional expression: condition ? 'a' : 'b'\n if (Node.isConditionalExpression(node)) {\n return [\n ...extractStringLiterals(node.getWhenTrue(), visited),\n ...extractStringLiterals(node.getWhenFalse(), visited),\n ];\n }\n\n const binaryValues = extractBinaryExpressionValues(node, visited);\n if (binaryValues) {\n return binaryValues;\n }\n\n const wrappedExpressionValues = extractWrappedExpressionValues(node, visited);\n if (wrappedExpressionValues) {\n return wrappedExpressionValues;\n }\n\n const propertyAccessValues = extractPropertyAccessValues(node, visited);\n if (propertyAccessValues) {\n return propertyAccessValues;\n }\n\n const elementAccessValues = extractElementAccessValues(node, visited);\n if (elementAccessValues) {\n return elementAccessValues;\n }\n\n const callExpressionValues = extractCallExpressionValues(node, visited);\n if (callExpressionValues) {\n return callExpressionValues;\n }\n\n const identifierValues = extractIdentifierValues(node, visited);\n if (identifierValues) {\n return identifierValues;\n }\n\n return [];\n};\n\nconst extractDirectLiteralValues = (node: Node): string[] | null => {\n if (Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node)) {\n return [node.getLiteralValue()];\n }\n\n return null;\n};\n\nconst extractTemplateExpressionValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isTemplateExpression(node)) {\n return null;\n }\n\n const parts: string[][] = [[node.getHead().getLiteralText()]];\n\n node.getTemplateSpans().forEach((span) => {\n const exprValues = extractStringLiterals(span.getExpression(), visited);\n const literalText = span.getLiteral().getLiteralText();\n parts.push(\n exprValues.length > 0\n ? exprValues.map((value) => `${value}${literalText}`)\n : ['', literalText],\n );\n });\n\n return parts\n .reduce<\n string[]\n >((acc, segment) => acc.flatMap((base) => segment.map((frag) => `${base}${frag}`)), [''])\n .filter((value) => value.length > 0);\n};\n\nconst extractBinaryExpressionValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isBinaryExpression(node)) {\n return null;\n }\n\n const operator = node.getOperatorToken().getText();\n if (operator === '+') {\n const left = extractStringLiterals(node.getLeft(), visited);\n const right = extractStringLiterals(node.getRight(), visited);\n const combined = left.flatMap((l) => right.map((r) => `${l}${r}`));\n return combined.length > 0 ? combined : [];\n }\n\n if (operator === '||' || operator === '??') {\n return [\n ...extractStringLiterals(node.getLeft(), visited),\n ...extractStringLiterals(node.getRight(), visited),\n ];\n }\n\n return [];\n};\n\nconst extractWrappedExpressionValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (Node.isParenthesizedExpression(node) || Node.isAsExpression(node)) {\n return extractStringLiterals(node.getExpression(), visited);\n }\n\n return null;\n};\n\nconst extractPropertyAccessValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isPropertyAccessExpression(node)) {\n return null;\n }\n\n const typeValues = extractLiteralValuesFromType(node);\n if (typeValues.length > 0) {\n return typeValues;\n }\n\n const propertyName = node.getName();\n return extractObjectValues(node.getExpression(), visited)\n .filter(\n (value): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && propertyName in value,\n )\n .map((value) => value[propertyName])\n .filter((value): value is string => typeof value === 'string');\n};\n\nconst extractElementAccessValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isElementAccessExpression(node)) {\n return null;\n }\n\n const typeValues = extractLiteralValuesFromType(node);\n if (typeValues.length > 0) {\n return typeValues;\n }\n\n const expression = node.getExpression();\n return extractObjectValues(expression, visited).flatMap((value) => {\n if (typeof value === 'string') {\n return [value];\n }\n\n if (typeof value === 'object' && value !== null) {\n return Object.values(value).filter((entry): entry is string => typeof entry === 'string');\n }\n\n return [];\n });\n};\n\nconst extractCallExpressionValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isCallExpression(node)) {\n return null;\n }\n\n const expression = node.getExpression();\n\n const fromDefinitions = Node.isIdentifier(expression)\n ? getDefinitionNodesSafe(expression).flatMap((definition) => {\n if (Node.isFunctionDeclaration(definition)) {\n return definition\n .getDescendantsOfKind(SyntaxKind.ReturnStatement)\n .flatMap((returnStmt) => {\n const expression = returnStmt.getExpression();\n return expression ? extractStringLiterals(expression, visited) : [];\n });\n }\n\n if (Node.isVariableDeclaration(definition)) {\n const initializer = definition.getInitializer();\n return initializer ? extractFromFunctionLike(initializer, visited) : [];\n }\n\n return [];\n })\n : [];\n\n const fromArguments = node.getArguments().flatMap((arg) => extractStringLiterals(arg, visited));\n\n return [...fromDefinitions, ...fromArguments];\n};\n\nconst extractArrayElementValues = (node: Node, visited: Set<Node>): string[] => {\n if (Node.isArrayLiteralExpression(node)) {\n return node\n .getElements()\n .flatMap((element) => extractStringLiterals(element, visited))\n .filter((value, index, values) => values.indexOf(value) === index);\n }\n\n if (Node.isParenthesizedExpression(node)) {\n return extractArrayElementValues(node.getExpression(), visited);\n }\n\n if (Node.isAsExpression(node) || Node.isTypeAssertion(node) || Node.isSatisfiesExpression(node)) {\n return extractArrayElementValues(node.getExpression(), visited);\n }\n\n if (Node.isIdentifier(node)) {\n return getLocalDefinitionNodes(node)\n .flatMap((definition) => {\n if (Node.isVariableDeclaration(definition)) {\n const initializer = definition.getInitializer();\n return initializer ? extractArrayElementValues(initializer, visited) : [];\n }\n\n return [];\n })\n .filter((value, index, values) => values.indexOf(value) === index);\n }\n\n return [];\n};\n\nconst extractMappedParameterValues = (definition: Node, visited: Set<Node>): string[] => {\n if (!Node.isParameterDeclaration(definition)) {\n return [];\n }\n\n const callback = definition.getParentIfKind(SyntaxKind.ArrowFunction);\n if (!callback) {\n return [];\n }\n\n const callExpression = callback.getParentIfKind(SyntaxKind.CallExpression);\n if (!callExpression) {\n return [];\n }\n\n const expression = callExpression.getExpression();\n if (!Node.isPropertyAccessExpression(expression)) {\n return [];\n }\n\n if (!['map', 'flatMap'].includes(expression.getName())) {\n return [];\n }\n\n const parameterIndex = callback\n .getParameters()\n .findIndex(\n (parameter) => parameter.getNameNode().getText() === definition.getNameNode().getText(),\n );\n\n if (parameterIndex !== 0) {\n return [];\n }\n\n return extractArrayElementValues(expression.getExpression(), visited);\n};\n\nconst extractIdentifierValues = (node: Node, visited: Set<Node>): string[] | null => {\n if (!Node.isIdentifier(node)) {\n return null;\n }\n\n const values = getDefinitionNodesSafe(node).flatMap((definition) => {\n const mappedParameterValues = extractMappedParameterValues(definition, visited);\n if (mappedParameterValues.length > 0) {\n return mappedParameterValues;\n }\n\n if (\n Node.isVariableDeclaration(definition) ||\n Node.isParameterDeclaration(definition) ||\n Node.isBindingElement(definition)\n ) {\n const initializer = definition.getInitializer();\n if (initializer) {\n return extractStringLiterals(initializer, visited);\n }\n\n // For BindingElement without initializer (e.g. `const { prop } = fn()`),\n // trace through the parent destructuring to resolve possible values.\n if (Node.isBindingElement(definition)) {\n const bindingPattern = definition.getParent();\n if (Node.isObjectBindingPattern(bindingPattern)) {\n const parentDecl = bindingPattern.getParent();\n if (Node.isVariableDeclaration(parentDecl)) {\n const parentInit = parentDecl.getInitializer();\n if (parentInit) {\n const propName = definition.getNameNode().getText();\n const objects = extractObjectValues(parentInit, new Set(visited));\n const propValues = objects\n .filter(\n (obj): obj is Record<string, unknown> =>\n typeof obj === 'object' && obj !== null && propName in obj,\n )\n .map((obj) => obj[propName])\n .filter((v): v is string => typeof v === 'string');\n if (propValues.length > 0) {\n return propValues;\n }\n }\n }\n }\n }\n\n return [];\n }\n\n return [];\n });\n\n if (values.length > 0) {\n return values;\n }\n\n const importedValues = extractImportedIdentifierValues(node, visited);\n if (importedValues.length > 0) {\n return importedValues;\n }\n\n return extractLiteralValuesFromType(node);\n};\n\n/**\n * Extract string literals from arrow functions or function expressions\n */\nconst extractFromFunctionLike = (node: Node, visited: Set<Node>): string[] => {\n const values: string[] = [];\n\n if (Node.isArrowFunction(node)) {\n const body = node.getBody();\n if (Node.isBlock(body)) {\n body.getDescendantsOfKind(SyntaxKind.ReturnStatement).forEach((returnStmt) => {\n const returnExpr = returnStmt.getExpression();\n if (returnExpr) {\n values.push(...extractStringLiterals(returnExpr, visited));\n }\n });\n } else {\n values.push(...extractStringLiterals(body, visited));\n }\n } else if (Node.isFunctionExpression(node)) {\n node.getDescendantsOfKind(SyntaxKind.ReturnStatement).forEach((returnStmt) => {\n const returnExpr = returnStmt.getExpression();\n if (returnExpr) {\n values.push(...extractStringLiterals(returnExpr, visited));\n }\n });\n }\n\n return values;\n};\n\n/**\n * Extract object literal values from an expression.\n * Returns an array of all possible object values (for union types or indexed access).\n */\nconst extractObjectValues = (node: Node, visited: Set<Node>): unknown[] => {\n if (visited.has(node)) {\n return [];\n }\n visited.add(node);\n\n const values: unknown[] = [];\n\n // Object literal expression\n if (Node.isObjectLiteralExpression(node)) {\n const obj: Record<string, unknown> = {};\n node.getProperties().forEach((prop) => {\n if (Node.isPropertyAssignment(prop)) {\n const name = prop.getName();\n const init = prop.getInitializer();\n if (init && Node.isStringLiteral(init)) {\n obj[name] = init.getLiteralValue();\n } else if (init && Node.isObjectLiteralExpression(init)) {\n const nestedValues = extractObjectValues(init, visited);\n if (nestedValues.length > 0) {\n obj[name] = nestedValues[0];\n }\n }\n }\n });\n values.push(obj);\n return values;\n }\n\n // Identifier - trace to initializer\n if (Node.isIdentifier(node)) {\n getDefinitionNodesSafe(node).forEach((definition) => {\n if (Node.isVariableDeclaration(definition)) {\n const initializer = definition.getInitializer();\n if (initializer) {\n // Handle 'as const' assertion\n if (Node.isAsExpression(initializer)) {\n const inner = initializer.getExpression();\n values.push(...extractObjectValues(inner, visited));\n } else {\n values.push(...extractObjectValues(initializer, visited));\n }\n }\n }\n });\n return values;\n }\n\n // Call expression - trace to function return statements\n if (Node.isCallExpression(node)) {\n const expression = node.getExpression();\n if (Node.isIdentifier(expression)) {\n getDefinitionNodesSafe(expression).forEach((definition) => {\n if (Node.isFunctionDeclaration(definition)) {\n definition.getDescendantsOfKind(SyntaxKind.ReturnStatement).forEach((returnStmt) => {\n const returnExpr = returnStmt.getExpression();\n if (returnExpr) {\n values.push(...extractObjectValues(returnExpr, visited));\n }\n });\n }\n if (Node.isVariableDeclaration(definition)) {\n const initializer = definition.getInitializer();\n if (initializer) {\n const extractFromFn = (fn: Node) => {\n if (Node.isArrowFunction(fn)) {\n const body = fn.getBody();\n if (Node.isBlock(body)) {\n body.getDescendantsOfKind(SyntaxKind.ReturnStatement).forEach((returnStmt) => {\n const returnExpr = returnStmt.getExpression();\n if (returnExpr) {\n values.push(...extractObjectValues(returnExpr, visited));\n }\n });\n } else {\n values.push(...extractObjectValues(body, visited));\n }\n } else if (Node.isFunctionExpression(fn)) {\n fn.getDescendantsOfKind(SyntaxKind.ReturnStatement).forEach((returnStmt) => {\n const returnExpr = returnStmt.getExpression();\n if (returnExpr) {\n values.push(...extractObjectValues(returnExpr, visited));\n }\n });\n }\n };\n extractFromFn(initializer);\n }\n }\n });\n }\n return values;\n }\n\n // Element access - return all values from the object\n if (Node.isElementAccessExpression(node)) {\n const expression = node.getExpression();\n const baseObjects = extractObjectValues(expression, visited);\n\n // For indexed access, return all possible values\n baseObjects.forEach((obj) => {\n if (typeof obj === 'object' && obj !== null) {\n Object.values(obj).forEach((value) => values.push(value));\n }\n });\n return values;\n }\n\n return values;\n};\n\n/**\n * Extract string literal values from a TypeScript type annotation AST node.\n * Pure AST traversal — avoids expensive TS Language Service `getType()` calls.\n */\nconst extractStringLiteralsFromTypeNode = (typeNode: Node): string[] => {\n if (Node.isLiteralTypeNode(typeNode)) {\n const literal = typeNode.getLiteral();\n if (Node.isStringLiteral(literal)) {\n return [literal.getLiteralValue()];\n }\n return [];\n }\n if (Node.isUnionTypeNode(typeNode)) {\n return typeNode.getTypeNodes().flatMap(extractStringLiteralsFromTypeNode);\n }\n return [];\n};\n\n/**\n * Extract literal values from a TypeScript type annotation (for union types like 'brand' | 'secondary').\n * Uses pure AST traversal instead of the TS type checker to avoid expensive LS initialization.\n */\nexport const extractLiteralValuesFromType = (node: Node): string[] => {\n // For identifiers, find the declaration and check its type annotation\n if (Node.isIdentifier(node)) {\n const definitions = getLocalDefinitionNodes(node);\n for (const def of definitions) {\n if (\n Node.isParameterDeclaration(def) ||\n Node.isVariableDeclaration(def) ||\n Node.isPropertyDeclaration(def) ||\n Node.isPropertySignature(def)\n ) {\n const typeNode = def.getTypeNode?.();\n if (typeNode) {\n const values = extractStringLiteralsFromTypeNode(typeNode);\n if (values.length > 0) {\n return values;\n }\n }\n }\n\n // For BindingElements, check the parent destructuring's type annotation\n // e.g. `const { prop }: { prop: 'a' | 'b' } = ...`\n if (Node.isBindingElement(def)) {\n const bindingPattern = def.getParent();\n if (bindingPattern) {\n const parentDecl = bindingPattern.getParent();\n if (parentDecl && Node.isVariableDeclaration(parentDecl)) {\n const parentType = parentDecl.getTypeNode();\n if (parentType && Node.isTypeLiteral(parentType)) {\n const propName = def.getNameNode().getText();\n for (const member of parentType.getMembers()) {\n if (Node.isPropertySignature(member) && member.getName() === propName) {\n const memberType = member.getTypeNode();\n if (memberType) {\n const values = extractStringLiteralsFromTypeNode(memberType);\n if (values.length > 0) {\n return values;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n // For property access and element access, check if the expression has a type annotation\n if (Node.isPropertyAccessExpression(node) || Node.isElementAccessExpression(node)) {\n // These are complex to resolve via AST alone — let the existing AST-based\n // object extraction handle them instead of calling the type checker\n return [];\n }\n\n return [];\n};\n\nexport { extractStringLiterals };\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
2
  require("../../_virtual/_rolldown/runtime.cjs");
3
+ const require_perf = require("../../css/perf.cjs");
3
4
  const require_expressions = require("./ast/expressions.cjs");
4
- const require_jsx = require("./ast/jsx.cjs");
5
5
  let ts_morph = require("ts-morph");
6
6
  //#region src/purger/optimized/purgeFromCode.ts
7
7
  /**
@@ -156,7 +156,22 @@ const purgeFromCodeOptimized = async (code, options) => {
156
156
  componentNameLookup = buildComponentNameLookup(componentData);
157
157
  }
158
158
  const startTime = performance.now();
159
+ const perf = require_perf.isPerfEnabled();
160
+ if (!/@yahoo\/uds\b/.test(code) && !options.includeAllClassNamePrimitives) return {
161
+ safelist: [],
162
+ imports: [],
163
+ components: [],
164
+ stats: {
165
+ filesScanned: 1,
166
+ timeMs: 0,
167
+ classesGenerated: 0,
168
+ spreadsTraced: 0,
169
+ expressionsResolved: 0
170
+ }
171
+ };
172
+ const projectCreateStart = performance.now();
159
173
  const sourceFile = new ts_morph.Project({ useInMemoryFileSystem: true }).createSourceFile(options.filePath ?? "input.tsx", code, { overwrite: true });
174
+ const projectCreateMs = performance.now() - projectCreateStart;
160
175
  const stats = {
161
176
  filesScanned: 1,
162
177
  timeMs: 0,
@@ -164,18 +179,24 @@ const purgeFromCodeOptimized = async (code, options) => {
164
179
  spreadsTraced: 0,
165
180
  expressionsResolved: 0
166
181
  };
182
+ const importParseStart = performance.now();
167
183
  const imports = [];
168
184
  sourceFile.getImportDeclarations().forEach((importDecl) => {
169
185
  if (isUdsComponentModule(getModuleSpecifierValue(importDecl))) importDecl.getNamedImports().forEach((namedImport) => {
170
186
  if (!namedImport.isTypeOnly() && !importDecl.isTypeOnly()) imports.push(namedImport.getName());
171
187
  });
172
188
  });
189
+ const importParseMs = performance.now() - importParseStart;
173
190
  const componentProps = /* @__PURE__ */ new Map();
174
191
  const componentUnresolvedSpreadProps = /* @__PURE__ */ new Map();
175
192
  const referencedComponents = /* @__PURE__ */ new Set();
193
+ const getStylesExtractStart = performance.now();
176
194
  const getStylesProps = extractGetStylesCalls(sourceFile, stats, variants);
195
+ const getStylesExtractMs = performance.now() - getStylesExtractStart;
196
+ const jsxAnalysisStart = performance.now();
197
+ const jsxElementsCache = sourceFile.getDescendants().filter((node) => ts_morph.Node.isJsxOpeningElement(node) || ts_morph.Node.isJsxSelfClosingElement(node));
177
198
  imports.forEach((imp) => {
178
- findComponentReferences(sourceFile, imp).forEach((reference) => {
199
+ findComponentReferences(sourceFile, imp, jsxElementsCache).forEach((reference) => {
179
200
  const componentName = reference.getTagNameNode().getText() || imp;
180
201
  referencedComponents.add(componentName);
181
202
  const propsMap = componentProps.get(componentName) ?? /* @__PURE__ */ new Map();
@@ -195,6 +216,8 @@ const purgeFromCodeOptimized = async (code, options) => {
195
216
  if (!componentProps.has(imp)) componentProps.set(imp, /* @__PURE__ */ new Map());
196
217
  if (!componentUnresolvedSpreadProps.has(imp)) componentUnresolvedSpreadProps.set(imp, /* @__PURE__ */ new Set());
197
218
  });
219
+ const jsxAnalysisMs = performance.now() - jsxAnalysisStart;
220
+ const safelistGenStart = performance.now();
198
221
  const allComponents = [];
199
222
  const seenComponents = /* @__PURE__ */ new Set();
200
223
  new Set([...imports, ...referencedComponents]).forEach((componentName) => {
@@ -327,8 +350,16 @@ const purgeFromCodeOptimized = async (code, options) => {
327
350
  });
328
351
  if (options.includeAllClassNamePrimitives) safelist.push(...extractClassNamePrimitives(sourceFile));
329
352
  const finalSafelist = [...new Set(safelist)];
353
+ const safelistGenerationMs = performance.now() - safelistGenStart;
330
354
  stats.timeMs = Math.round(performance.now() - startTime);
331
355
  stats.classesGenerated = finalSafelist.length;
356
+ if (perf) {
357
+ stats.projectCreateMs = Math.round(projectCreateMs * 100) / 100;
358
+ stats.importParseMs = Math.round(importParseMs * 100) / 100;
359
+ stats.getStylesExtractMs = Math.round(getStylesExtractMs * 100) / 100;
360
+ stats.jsxAnalysisMs = Math.round(jsxAnalysisMs * 100) / 100;
361
+ stats.safelistGenerationMs = Math.round(safelistGenerationMs * 100) / 100;
362
+ }
332
363
  return {
333
364
  safelist: finalSafelist,
334
365
  imports,
@@ -339,11 +370,12 @@ const purgeFromCodeOptimized = async (code, options) => {
339
370
  /**
340
371
  * Find JSX references for a component in the source file
341
372
  */
342
- const findComponentReferences = (sourceFile, componentName) => {
373
+ const findComponentReferences = (sourceFile, componentName, jsxElementsCache) => {
343
374
  const references = [];
344
375
  const seenTags = /* @__PURE__ */ new Set();
376
+ const allJsxElements = jsxElementsCache ?? sourceFile.getDescendants().filter((node) => ts_morph.Node.isJsxOpeningElement(node) || ts_morph.Node.isJsxSelfClosingElement(node));
345
377
  const collectMatchingTags = (localName) => {
346
- sourceFile.getDescendants().filter((node) => ts_morph.Node.isJsxOpeningElement(node) || ts_morph.Node.isJsxSelfClosingElement(node)).forEach((node) => {
378
+ for (const node of allJsxElements) {
347
379
  const tagName = node.getTagNameNode().getText();
348
380
  if (tagName === localName || tagName.startsWith(`${localName}.`)) {
349
381
  const key = `${tagName}:${node.getStart()}`;
@@ -352,21 +384,13 @@ const findComponentReferences = (sourceFile, componentName) => {
352
384
  references.push(node);
353
385
  }
354
386
  }
355
- });
387
+ }
356
388
  };
357
389
  sourceFile.getImportDeclarations().forEach((importDecl) => {
358
390
  if (!isUdsComponentModule(getModuleSpecifierValue(importDecl))) return;
359
391
  importDecl.getNamedImports().forEach((namedImport) => {
360
392
  if (namedImport.getName() !== componentName || isTypeOnlyNamedImport(importDecl, componentName)) return;
361
- const localName = namedImport.getAliasNode()?.getText() ?? componentName;
362
- require_jsx.findJsxReferences(namedImport.getFirstDescendantByKindOrThrow(ts_morph.ts.SyntaxKind.Identifier)).forEach((reference) => {
363
- const key = `${reference.getTagNameNode().getText()}:${reference.getStart()}`;
364
- if (!seenTags.has(key)) {
365
- seenTags.add(key);
366
- references.push(reference);
367
- }
368
- });
369
- collectMatchingTags(localName);
393
+ collectMatchingTags(namedImport.getAliasNode()?.getText() ?? componentName);
370
394
  });
371
395
  });
372
396
  return references;
@@ -1 +1 @@
1
- {"version":3,"file":"purgeFromCode.d.cts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAMU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;AAAA,KAGJ,mBAAA,GAAsB,MAAA;;;;UAKjB,uBAAA;EACR,IAAA;EACA,YAAA,EAAc,MAAA;EACd,iBAAA,EAAmB,MAAA;EACnB,UAAA;EACA,kBAAA;EACA,sBAAA,EAAwB,MAAA,SAAe,MAAA;EACvC,iBAAA,EAAmB,MAAA;EACnB,yBAAA,GAA4B,MAAA;EAC5B,sBAAA,GAAyB,MAAA;EACzB,mCAAA,GAAsC,MAAA,SAAe,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;KAoDlD,eAAA,GAAkB,MAAA,SAAe,MAAA;AAAA,UAE5B,oBAAA;EACR,UAAA;EAxDA;EA0DA,eAAA,GAAkB,eAAA;EAClB,mBAAA,GAAsB,mBAAA;EACtB,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,YAAA,EAAc,MAAA,SAAe,MAAA;EAC7B,aAAA,EAAe,MAAA,SAAe,uBAAA;EAC9B,6BAAA;EACA,QAAA;AAAA;AAAA,cAqQI,sBAAA,GACJ,IAAA,UACA,OAAA,EAAS,oBAAA,KACR,OAAA,CAAQ,mBAAA"}
1
+ {"version":3,"file":"purgeFromCode.d.cts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAOU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;AAAA,KAGJ,mBAAA,GAAsB,MAAA;;;;UAKjB,uBAAA;EACR,IAAA;EACA,YAAA,EAAc,MAAA;EACd,iBAAA,EAAmB,MAAA;EACnB,UAAA;EACA,kBAAA;EACA,sBAAA,EAAwB,MAAA,SAAe,MAAA;EACvC,iBAAA,EAAmB,MAAA;EACnB,yBAAA,GAA4B,MAAA;EAC5B,sBAAA,GAAyB,MAAA;EACzB,mCAAA,GAAsC,MAAA,SAAe,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;KAoDlD,eAAA,GAAkB,MAAA,SAAe,MAAA;AAAA,UAE5B,oBAAA;EACR,UAAA;EAxDA;EA0DA,eAAA,GAAkB,eAAA;EAClB,mBAAA,GAAsB,mBAAA;EACtB,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,YAAA,EAAc,MAAA,SAAe,MAAA;EAC7B,aAAA,EAAe,MAAA,SAAe,uBAAA;EAC9B,6BAAA;EACA,QAAA;AAAA;AAAA,cAqQI,sBAAA,GACJ,IAAA,UACA,OAAA,EAAS,oBAAA,KACR,OAAA,CAAQ,mBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"purgeFromCode.d.ts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAMU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;AAAA,KAGJ,mBAAA,GAAsB,MAAA;;;;UAKjB,uBAAA;EACR,IAAA;EACA,YAAA,EAAc,MAAA;EACd,iBAAA,EAAmB,MAAA;EACnB,UAAA;EACA,kBAAA;EACA,sBAAA,EAAwB,MAAA,SAAe,MAAA;EACvC,iBAAA,EAAmB,MAAA;EACnB,yBAAA,GAA4B,MAAA;EAC5B,sBAAA,GAAyB,MAAA;EACzB,mCAAA,GAAsC,MAAA,SAAe,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;KAoDlD,eAAA,GAAkB,MAAA,SAAe,MAAA;AAAA,UAE5B,oBAAA;EACR,UAAA;EAxDA;EA0DA,eAAA,GAAkB,eAAA;EAClB,mBAAA,GAAsB,mBAAA;EACtB,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,YAAA,EAAc,MAAA,SAAe,MAAA;EAC7B,aAAA,EAAe,MAAA,SAAe,uBAAA;EAC9B,6BAAA;EACA,QAAA;AAAA;AAAA,cAqQI,sBAAA,GACJ,IAAA,UACA,OAAA,EAAS,oBAAA,KACR,OAAA,CAAQ,mBAAA"}
1
+ {"version":3,"file":"purgeFromCode.d.ts","names":[],"sources":["../../../src/purger/optimized/purgeFromCode.ts"],"mappings":";;;;UAOU,mBAAA;EACR,QAAA;EACA,OAAA;EACA,UAAA;EACA,KAAA,EAAO,UAAA;AAAA;AAAA,KAGJ,mBAAA,GAAsB,MAAA;;;;UAKjB,uBAAA;EACR,IAAA;EACA,YAAA,EAAc,MAAA;EACd,iBAAA,EAAmB,MAAA;EACnB,UAAA;EACA,kBAAA;EACA,sBAAA,EAAwB,MAAA,SAAe,MAAA;EACvC,iBAAA,EAAmB,MAAA;EACnB,yBAAA,GAA4B,MAAA;EAC5B,sBAAA,GAAyB,MAAA;EACzB,mCAAA,GAAsC,MAAA,SAAe,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;KAoDlD,eAAA,GAAkB,MAAA,SAAe,MAAA;AAAA,UAE5B,oBAAA;EACR,UAAA;EAxDA;EA0DA,eAAA,GAAkB,eAAA;EAClB,mBAAA,GAAsB,mBAAA;EACtB,QAAA,EAAU,MAAA,SAAe,MAAA;EACzB,YAAA,EAAc,MAAA,SAAe,MAAA;EAC7B,aAAA,EAAe,MAAA,SAAe,uBAAA;EAC9B,6BAAA;EACA,QAAA;AAAA;AAAA,cAqQI,sBAAA,GACJ,IAAA,UACA,OAAA,EAAS,oBAAA,KACR,OAAA,CAAQ,mBAAA"}
@@ -1,7 +1,7 @@
1
1
  /*! © 2026 Yahoo, Inc. UDS Tailwind and Purger v0.0.0-development */
2
+ import { isPerfEnabled } from "../../css/perf.js";
2
3
  import { extractStringLiterals } from "./ast/expressions.js";
3
- import { findJsxReferences } from "./ast/jsx.js";
4
- import { Node, Project, SyntaxKind, ts } from "ts-morph";
4
+ import { Node, Project, SyntaxKind } from "ts-morph";
5
5
  //#region src/purger/optimized/purgeFromCode.ts
6
6
  /**
7
7
  * Get component info with all its dependencies (using pre-generated data)
@@ -155,7 +155,22 @@ const purgeFromCodeOptimized = async (code, options) => {
155
155
  componentNameLookup = buildComponentNameLookup(componentData);
156
156
  }
157
157
  const startTime = performance.now();
158
+ const perf = isPerfEnabled();
159
+ if (!/@yahoo\/uds\b/.test(code) && !options.includeAllClassNamePrimitives) return {
160
+ safelist: [],
161
+ imports: [],
162
+ components: [],
163
+ stats: {
164
+ filesScanned: 1,
165
+ timeMs: 0,
166
+ classesGenerated: 0,
167
+ spreadsTraced: 0,
168
+ expressionsResolved: 0
169
+ }
170
+ };
171
+ const projectCreateStart = performance.now();
158
172
  const sourceFile = new Project({ useInMemoryFileSystem: true }).createSourceFile(options.filePath ?? "input.tsx", code, { overwrite: true });
173
+ const projectCreateMs = performance.now() - projectCreateStart;
159
174
  const stats = {
160
175
  filesScanned: 1,
161
176
  timeMs: 0,
@@ -163,18 +178,24 @@ const purgeFromCodeOptimized = async (code, options) => {
163
178
  spreadsTraced: 0,
164
179
  expressionsResolved: 0
165
180
  };
181
+ const importParseStart = performance.now();
166
182
  const imports = [];
167
183
  sourceFile.getImportDeclarations().forEach((importDecl) => {
168
184
  if (isUdsComponentModule(getModuleSpecifierValue(importDecl))) importDecl.getNamedImports().forEach((namedImport) => {
169
185
  if (!namedImport.isTypeOnly() && !importDecl.isTypeOnly()) imports.push(namedImport.getName());
170
186
  });
171
187
  });
188
+ const importParseMs = performance.now() - importParseStart;
172
189
  const componentProps = /* @__PURE__ */ new Map();
173
190
  const componentUnresolvedSpreadProps = /* @__PURE__ */ new Map();
174
191
  const referencedComponents = /* @__PURE__ */ new Set();
192
+ const getStylesExtractStart = performance.now();
175
193
  const getStylesProps = extractGetStylesCalls(sourceFile, stats, variants);
194
+ const getStylesExtractMs = performance.now() - getStylesExtractStart;
195
+ const jsxAnalysisStart = performance.now();
196
+ const jsxElementsCache = sourceFile.getDescendants().filter((node) => Node.isJsxOpeningElement(node) || Node.isJsxSelfClosingElement(node));
176
197
  imports.forEach((imp) => {
177
- findComponentReferences(sourceFile, imp).forEach((reference) => {
198
+ findComponentReferences(sourceFile, imp, jsxElementsCache).forEach((reference) => {
178
199
  const componentName = reference.getTagNameNode().getText() || imp;
179
200
  referencedComponents.add(componentName);
180
201
  const propsMap = componentProps.get(componentName) ?? /* @__PURE__ */ new Map();
@@ -194,6 +215,8 @@ const purgeFromCodeOptimized = async (code, options) => {
194
215
  if (!componentProps.has(imp)) componentProps.set(imp, /* @__PURE__ */ new Map());
195
216
  if (!componentUnresolvedSpreadProps.has(imp)) componentUnresolvedSpreadProps.set(imp, /* @__PURE__ */ new Set());
196
217
  });
218
+ const jsxAnalysisMs = performance.now() - jsxAnalysisStart;
219
+ const safelistGenStart = performance.now();
197
220
  const allComponents = [];
198
221
  const seenComponents = /* @__PURE__ */ new Set();
199
222
  new Set([...imports, ...referencedComponents]).forEach((componentName) => {
@@ -326,8 +349,16 @@ const purgeFromCodeOptimized = async (code, options) => {
326
349
  });
327
350
  if (options.includeAllClassNamePrimitives) safelist.push(...extractClassNamePrimitives(sourceFile));
328
351
  const finalSafelist = [...new Set(safelist)];
352
+ const safelistGenerationMs = performance.now() - safelistGenStart;
329
353
  stats.timeMs = Math.round(performance.now() - startTime);
330
354
  stats.classesGenerated = finalSafelist.length;
355
+ if (perf) {
356
+ stats.projectCreateMs = Math.round(projectCreateMs * 100) / 100;
357
+ stats.importParseMs = Math.round(importParseMs * 100) / 100;
358
+ stats.getStylesExtractMs = Math.round(getStylesExtractMs * 100) / 100;
359
+ stats.jsxAnalysisMs = Math.round(jsxAnalysisMs * 100) / 100;
360
+ stats.safelistGenerationMs = Math.round(safelistGenerationMs * 100) / 100;
361
+ }
331
362
  return {
332
363
  safelist: finalSafelist,
333
364
  imports,
@@ -338,11 +369,12 @@ const purgeFromCodeOptimized = async (code, options) => {
338
369
  /**
339
370
  * Find JSX references for a component in the source file
340
371
  */
341
- const findComponentReferences = (sourceFile, componentName) => {
372
+ const findComponentReferences = (sourceFile, componentName, jsxElementsCache) => {
342
373
  const references = [];
343
374
  const seenTags = /* @__PURE__ */ new Set();
375
+ const allJsxElements = jsxElementsCache ?? sourceFile.getDescendants().filter((node) => Node.isJsxOpeningElement(node) || Node.isJsxSelfClosingElement(node));
344
376
  const collectMatchingTags = (localName) => {
345
- sourceFile.getDescendants().filter((node) => Node.isJsxOpeningElement(node) || Node.isJsxSelfClosingElement(node)).forEach((node) => {
377
+ for (const node of allJsxElements) {
346
378
  const tagName = node.getTagNameNode().getText();
347
379
  if (tagName === localName || tagName.startsWith(`${localName}.`)) {
348
380
  const key = `${tagName}:${node.getStart()}`;
@@ -351,21 +383,13 @@ const findComponentReferences = (sourceFile, componentName) => {
351
383
  references.push(node);
352
384
  }
353
385
  }
354
- });
386
+ }
355
387
  };
356
388
  sourceFile.getImportDeclarations().forEach((importDecl) => {
357
389
  if (!isUdsComponentModule(getModuleSpecifierValue(importDecl))) return;
358
390
  importDecl.getNamedImports().forEach((namedImport) => {
359
391
  if (namedImport.getName() !== componentName || isTypeOnlyNamedImport(importDecl, componentName)) return;
360
- const localName = namedImport.getAliasNode()?.getText() ?? componentName;
361
- findJsxReferences(namedImport.getFirstDescendantByKindOrThrow(ts.SyntaxKind.Identifier)).forEach((reference) => {
362
- const key = `${reference.getTagNameNode().getText()}:${reference.getStart()}`;
363
- if (!seenTags.has(key)) {
364
- seenTags.add(key);
365
- references.push(reference);
366
- }
367
- });
368
- collectMatchingTags(localName);
392
+ collectMatchingTags(namedImport.getAliasNode()?.getText() ?? componentName);
369
393
  });
370
394
  });
371
395
  return references;