foresthouse 1.0.0-dev.21 → 1.0.0-dev.22

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.
@@ -1 +1 @@
1
- {"version":3,"file":"react-DWxB8qZ6.mjs","names":["PNPM_WORKSPACE_FILE","PNPM_LOCKFILE","isInsideNodeModules","process","renderDependency","formatDependencyLabel","formatReactNodeFilePath"],"sources":["../src/utils/to-display-path.ts","../src/analyzers/base.ts","../src/analyzers/deps/index.ts","../src/analyzers/deps/pnpm-lock.ts","../src/analyzers/deps/diff.ts","../src/typescript/config.ts","../src/utils/is-source-code-file.ts","../src/utils/normalize-file-path.ts","../src/analyzers/import/entry.ts","../src/typescript/program.ts","../src/analyzers/import/unused.ts","../src/analyzers/import/references.ts","../src/analyzers/import/resolver.ts","../src/analyzers/import/graph.ts","../src/analyzers/import/index.ts","../src/analyzers/react/bindings.ts","../src/analyzers/react/walk.ts","../src/analyzers/react/entries.ts","../src/analyzers/react/symbols.ts","../src/analyzers/react/usage.ts","../src/analyzers/react/file.ts","../src/analyzers/react/references.ts","../src/analyzers/react/index.ts","../src/analyzers/react/queries.ts","../src/color.ts","../src/output/ascii/deps.ts","../src/output/ascii/import.ts","../src/output/ascii/react.ts","../src/output/json/deps.ts","../src/output/json/import.ts","../src/output/json/react.ts"],"sourcesContent":["import path from 'node:path'\n\nexport function toDisplayPath(filePath: string, cwd: string): string {\n const relativePath = path.relative(cwd, filePath)\n if (relativePath === '') {\n return '.'\n }\n\n const normalizedPath = relativePath.split(path.sep).join('/')\n return normalizedPath.startsWith('..') ? filePath : normalizedPath\n}\n","import type { AnalyzeOptions } from '../types/analyze-options.js'\n\nexport abstract class BaseAnalyzer<TGraph> {\n constructor(\n protected readonly entryFile: string,\n protected readonly options: AnalyzeOptions,\n ) {}\n\n analyze(): TGraph {\n return this.doAnalyze()\n }\n\n protected abstract doAnalyze(): TGraph\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport type { PackageDependencyGraph } from '../../types/package-dependency-graph.js'\nimport type { PackageDependencyNode } from '../../types/package-dependency-node.js'\nimport type {\n ExternalPackageManifestDependency,\n PackageManifestDependency,\n WorkspacePackageManifestDependency,\n} from '../../types/package-manifest-dependency.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\nimport { BaseAnalyzer } from '../base.js'\n\ninterface PackageManifest {\n readonly name?: string\n readonly workspaces?: readonly string[] | WorkspaceConfig\n readonly dependencies?: Readonly<Record<string, string>>\n}\n\ninterface WorkspaceConfig {\n readonly packages?: readonly string[]\n}\n\ninterface WorkspacePackage {\n readonly name: string\n readonly packageDir: string\n readonly label: string\n}\n\nconst PNPM_WORKSPACE_FILE = 'pnpm-workspace.yaml'\n\nexport function analyzePackageDependencies(\n directory: string,\n): PackageDependencyGraph {\n return new PackageDependencyAnalyzer(directory).analyze()\n}\n\nclass PackageDependencyAnalyzer extends BaseAnalyzer<PackageDependencyGraph> {\n private readonly inputPath: string\n\n constructor(directory: string) {\n super(directory, {})\n this.inputPath = path.resolve(process.cwd(), directory)\n }\n\n protected doAnalyze(): PackageDependencyGraph {\n const inputDirectory = resolveInputDirectory(this.inputPath)\n const rootPackageDir = findNearestPackageDirectory(inputDirectory)\n const workspaceRootDir = findWorkspaceRoot(rootPackageDir) ?? rootPackageDir\n const workspacePackages = discoverWorkspacePackages(workspaceRootDir)\n const nodes = new Map<string, PackageDependencyNode>()\n\n visitPackage(rootPackageDir, workspaceRootDir, workspacePackages, nodes)\n\n return {\n repositoryRoot: workspaceRootDir,\n rootId: rootPackageDir,\n nodes,\n }\n }\n}\n\nfunction visitPackage(\n packageDir: string,\n repositoryRoot: string,\n workspacePackages: ReadonlyMap<string, WorkspacePackage>,\n nodes: Map<string, PackageDependencyNode>,\n): void {\n if (nodes.has(packageDir)) {\n return\n }\n\n const manifest = readPackageManifest(packageDir)\n const packageName = resolvePackageName(manifest, packageDir)\n const dependencies =\n packageDir === repositoryRoot && workspacePackages.size > 0\n ? collectRepositoryRootDependencies(\n manifest,\n workspacePackages,\n repositoryRoot,\n )\n : collectManifestDependencies(manifest, workspacePackages, repositoryRoot)\n\n nodes.set(packageDir, {\n packageDir,\n packageName,\n dependencies,\n })\n\n dependencies.forEach((dependency) => {\n if (dependency.kind === 'workspace') {\n visitPackage(dependency.target, repositoryRoot, workspacePackages, nodes)\n }\n })\n}\n\nfunction resolveInputDirectory(resolvedPath: string): string {\n const stats = fs.existsSync(resolvedPath) ? fs.statSync(resolvedPath) : null\n\n if (stats === null) {\n throw new Error(`Directory does not exist: ${resolvedPath}`)\n }\n\n if (stats.isDirectory()) {\n return resolvedPath\n }\n\n if (stats.isFile() && path.basename(resolvedPath) === 'package.json') {\n return path.dirname(resolvedPath)\n }\n\n throw new Error(`Expected a package directory: ${resolvedPath}`)\n}\n\nfunction findNearestPackageDirectory(startDirectory: string): string {\n let currentDirectory = startDirectory\n\n while (true) {\n const packageJsonPath = path.join(currentDirectory, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n return currentDirectory\n }\n\n const parentDirectory = path.dirname(currentDirectory)\n if (parentDirectory === currentDirectory) {\n break\n }\n\n currentDirectory = parentDirectory\n }\n\n throw new Error(`No package.json found from ${startDirectory}`)\n}\n\nfunction findWorkspaceRoot(packageDir: string): string | undefined {\n let currentDirectory = packageDir\n\n while (true) {\n const packageJsonPath = path.join(currentDirectory, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n const manifest = readPackageManifest(currentDirectory)\n const workspacePatterns = resolveWorkspacePatterns(\n currentDirectory,\n manifest,\n )\n\n if (workspacePatterns.length > 0 && currentDirectory === packageDir) {\n return currentDirectory\n }\n\n if (\n workspacePatterns.length > 0 &&\n isWorkspaceMatch(currentDirectory, workspacePatterns, packageDir)\n ) {\n return currentDirectory\n }\n }\n\n const parentDirectory = path.dirname(currentDirectory)\n if (parentDirectory === currentDirectory) {\n return undefined\n }\n\n currentDirectory = parentDirectory\n }\n}\n\nfunction discoverWorkspacePackages(\n repositoryRoot: string,\n): ReadonlyMap<string, WorkspacePackage> {\n const manifest = readPackageManifest(repositoryRoot)\n const workspacePatterns = resolveWorkspacePatterns(repositoryRoot, manifest)\n\n if (workspacePatterns.length === 0) {\n return new Map()\n }\n\n const workspacePackageDirs = new Set<string>()\n\n workspacePatterns.forEach((pattern) => {\n expandWorkspacePattern(repositoryRoot, pattern).forEach((packageDir) => {\n workspacePackageDirs.add(packageDir)\n })\n })\n\n const workspacePackages = new Map<string, WorkspacePackage>()\n\n Array.from(workspacePackageDirs)\n .sort((left, right) => left.localeCompare(right))\n .forEach((packageDir) => {\n const workspaceManifest = readPackageManifest(packageDir)\n const workspaceName = resolvePackageName(workspaceManifest, packageDir)\n\n if (workspacePackages.has(workspaceName)) {\n throw new Error(`Duplicate workspace package name: ${workspaceName}`)\n }\n\n workspacePackages.set(workspaceName, {\n name: workspaceName,\n packageDir,\n label: toDisplayPath(packageDir, repositoryRoot),\n })\n })\n\n return workspacePackages\n}\n\nfunction collectManifestDependencies(\n manifest: PackageManifest,\n workspacePackages: ReadonlyMap<string, WorkspacePackage>,\n repositoryRoot: string,\n): readonly PackageManifestDependency[] {\n const dependencyEntries = Object.entries(manifest.dependencies ?? {})\n const workspaceDependencies: WorkspacePackageManifestDependency[] = []\n const externalDependencies: ExternalPackageManifestDependency[] = []\n\n dependencyEntries.forEach(([dependencyName, specifier]) => {\n const workspacePackage = workspacePackages.get(dependencyName)\n\n if (workspacePackage !== undefined) {\n workspaceDependencies.push({\n kind: 'workspace',\n name: dependencyName,\n specifier,\n target: workspacePackage.packageDir,\n })\n return\n }\n\n externalDependencies.push({\n kind: 'external',\n name: dependencyName,\n specifier,\n })\n })\n\n workspaceDependencies.sort((left, right) => {\n const leftLabel = toDisplayPath(left.target, repositoryRoot)\n const rightLabel = toDisplayPath(right.target, repositoryRoot)\n return leftLabel.localeCompare(rightLabel)\n })\n externalDependencies.sort((left, right) =>\n left.name.localeCompare(right.name),\n )\n\n return [...workspaceDependencies, ...externalDependencies]\n}\n\nfunction collectRepositoryRootDependencies(\n manifest: PackageManifest,\n workspacePackages: ReadonlyMap<string, WorkspacePackage>,\n _repositoryRoot: string,\n): readonly PackageManifestDependency[] {\n const topLevelWorkspaceDependencies = Array.from(workspacePackages.values())\n .sort((left, right) => left.label.localeCompare(right.label))\n .map<WorkspacePackageManifestDependency>((workspacePackage) => ({\n kind: 'workspace',\n name: workspacePackage.name,\n target: workspacePackage.packageDir,\n }))\n\n const externalDependencies = Object.entries(manifest.dependencies ?? {})\n .filter(([dependencyName]) => !workspacePackages.has(dependencyName))\n .map<ExternalPackageManifestDependency>(([dependencyName, specifier]) => ({\n kind: 'external',\n name: dependencyName,\n specifier,\n }))\n .sort((left, right) => left.name.localeCompare(right.name))\n\n return [...topLevelWorkspaceDependencies, ...externalDependencies]\n}\n\nfunction readPackageManifest(packageDir: string): PackageManifest {\n const packageJsonPath = path.join(packageDir, 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n throw new Error(`Missing package.json in ${packageDir}`)\n }\n\n const manifestText = fs.readFileSync(packageJsonPath, 'utf8')\n\n try {\n const parsed = JSON.parse(manifestText) as unknown\n\n if (!isRecord(parsed)) {\n throw new Error('package.json must contain an object')\n }\n\n return parsed as PackageManifest\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown JSON parse error'\n throw new Error(`Failed to read ${packageJsonPath}: ${message}`)\n }\n}\n\nfunction resolvePackageName(\n manifest: PackageManifest,\n packageDir: string,\n): string {\n if (typeof manifest.name === 'string' && manifest.name.trim().length > 0) {\n return manifest.name\n }\n\n throw new Error(`Package at ${packageDir} is missing a valid name`)\n}\n\nfunction getWorkspacePatterns(manifest: PackageManifest): readonly string[] {\n if (Array.isArray(manifest.workspaces)) {\n return manifest.workspaces.filter(\n (pattern): pattern is string =>\n typeof pattern === 'string' && pattern.length > 0,\n )\n }\n\n if (\n isRecord(manifest.workspaces) &&\n Array.isArray(manifest.workspaces.packages)\n ) {\n return manifest.workspaces.packages.filter(\n (pattern): pattern is string =>\n typeof pattern === 'string' && pattern.length > 0,\n )\n }\n\n return []\n}\n\nfunction resolveWorkspacePatterns(\n repositoryRoot: string,\n manifest: PackageManifest,\n): readonly string[] {\n const manifestPatterns = getWorkspacePatterns(manifest)\n if (manifestPatterns.length > 0) {\n return manifestPatterns\n }\n\n return readPnpmWorkspacePatterns(repositoryRoot)\n}\n\nfunction readPnpmWorkspacePatterns(repositoryRoot: string): readonly string[] {\n const pnpmWorkspacePath = path.join(repositoryRoot, PNPM_WORKSPACE_FILE)\n\n if (!fs.existsSync(pnpmWorkspacePath)) {\n return []\n }\n\n const fileContent = fs.readFileSync(pnpmWorkspacePath, 'utf8')\n const lines = fileContent.split(/\\r?\\n/)\n const patterns: string[] = []\n let inPackagesBlock = false\n\n for (const line of lines) {\n const trimmedLine = line.trim()\n\n if (trimmedLine.length === 0 || trimmedLine.startsWith('#')) {\n continue\n }\n\n if (!inPackagesBlock) {\n if (trimmedLine === 'packages:') {\n inPackagesBlock = true\n }\n\n continue\n }\n\n if (!line.startsWith(' ') && !line.startsWith('\\t')) {\n break\n }\n\n if (!trimmedLine.startsWith('- ')) {\n continue\n }\n\n const pattern = unquoteWorkspacePattern(trimmedLine.slice(2).trim())\n\n if (pattern.length > 0) {\n patterns.push(pattern)\n }\n }\n\n return patterns\n}\n\nfunction unquoteWorkspacePattern(pattern: string): string {\n if (\n (pattern.startsWith('\"') && pattern.endsWith('\"')) ||\n (pattern.startsWith(\"'\") && pattern.endsWith(\"'\"))\n ) {\n return pattern.slice(1, -1)\n }\n\n return pattern\n}\n\nfunction isWorkspaceMatch(\n repositoryRoot: string,\n patterns: readonly string[],\n packageDir: string,\n): boolean {\n return patterns.some((pattern) =>\n expandWorkspacePattern(repositoryRoot, pattern).includes(packageDir),\n )\n}\n\nfunction expandWorkspacePattern(\n repositoryRoot: string,\n pattern: string,\n): string[] {\n const segments = normalizeWorkspacePattern(pattern)\n const matches = matchWorkspaceSegments(repositoryRoot, segments, 0)\n\n return matches.filter((packageDir) =>\n fs.existsSync(path.join(packageDir, 'package.json')),\n )\n}\n\nfunction normalizeWorkspacePattern(pattern: string): string[] {\n return pattern\n .split(/[\\\\/]+/)\n .filter((segment) => segment.length > 0 && segment !== '.')\n}\n\nfunction matchWorkspaceSegments(\n currentDirectory: string,\n segments: readonly string[],\n index: number,\n): string[] {\n if (index >= segments.length) {\n return [currentDirectory]\n }\n\n const segment = segments[index]\n if (segment === undefined) {\n return [currentDirectory]\n }\n\n if (segment === '**') {\n const results = new Set<string>(\n matchWorkspaceSegments(currentDirectory, segments, index + 1),\n )\n\n listSubdirectories(currentDirectory).forEach((subdirectory) => {\n matchWorkspaceSegments(subdirectory, segments, index).forEach((match) => {\n results.add(match)\n })\n })\n\n return [...results]\n }\n\n const matcher = createWorkspaceSegmentMatcher(segment)\n const results: string[] = []\n\n listSubdirectories(currentDirectory).forEach((subdirectory) => {\n if (!matcher(path.basename(subdirectory))) {\n return\n }\n\n results.push(...matchWorkspaceSegments(subdirectory, segments, index + 1))\n })\n\n return results\n}\n\nfunction listSubdirectories(directory: string): string[] {\n return fs\n .readdirSync(directory, { withFileTypes: true })\n .filter(\n (entry) =>\n entry.isDirectory() &&\n entry.name !== 'node_modules' &&\n entry.name !== '.git',\n )\n .map((entry) => path.join(directory, entry.name))\n}\n\nfunction createWorkspaceSegmentMatcher(\n segment: string,\n): (name: string) => boolean {\n if (!segment.includes('*')) {\n return (name: string) => name === segment\n }\n\n const escapedSegment = escapeRegExp(segment).replaceAll('*', '[^/]*')\n const pattern = new RegExp(`^${escapedSegment}$`)\n\n return (name: string) => pattern.test(name)\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replaceAll(/[|\\\\{}()[\\]^$+?.]/g, '\\\\$&')\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport interface PnpmLockDependencyResolution {\n readonly specifier?: string\n readonly version?: string\n readonly peerSuffix?: string\n}\n\nexport type PnpmLockImporterResolutions = ReadonlyMap<\n string,\n ReadonlyMap<string, PnpmLockDependencyResolution>\n>\n\nconst PNPM_LOCKFILE = 'pnpm-lock.yaml'\nconst DEPENDENCY_SECTIONS = new Set(['dependencies', 'optionalDependencies'])\n\nexport function loadPnpmLockImporterResolutions(\n repositoryRoot: string,\n): PnpmLockImporterResolutions | undefined {\n const lockfilePath = path.join(repositoryRoot, PNPM_LOCKFILE)\n\n if (!fs.existsSync(lockfilePath)) {\n return undefined\n }\n\n return parsePnpmLockImporterResolutions(fs.readFileSync(lockfilePath, 'utf8'))\n}\n\nfunction parsePnpmLockImporterResolutions(\n source: string,\n): PnpmLockImporterResolutions {\n const importers = new Map<string, Map<string, PnpmLockDependencyResolution>>()\n const lines = source.split(/\\r?\\n/u)\n let inImporters = false\n let currentImporter: string | undefined\n let currentSection: string | undefined\n let currentDependencyName: string | undefined\n\n lines.forEach((line) => {\n const trimmedLine = line.trim()\n if (trimmedLine.length === 0 || trimmedLine.startsWith('#')) {\n return\n }\n\n const indentation = line.length - line.trimStart().length\n\n if (indentation === 0) {\n if (trimmedLine === 'importers:') {\n inImporters = true\n currentImporter = undefined\n currentSection = undefined\n currentDependencyName = undefined\n return\n }\n\n inImporters = false\n return\n }\n\n if (!inImporters) {\n return\n }\n\n if (indentation === 2 && trimmedLine.endsWith(':')) {\n currentImporter = parseYamlScalar(trimmedLine.slice(0, -1))\n currentSection = undefined\n currentDependencyName = undefined\n\n if (!importers.has(currentImporter)) {\n importers.set(currentImporter, new Map())\n }\n return\n }\n\n if (currentImporter === undefined) {\n return\n }\n\n if (indentation === 4 && trimmedLine.endsWith(':')) {\n const sectionName = parseYamlScalar(trimmedLine.slice(0, -1))\n currentSection = DEPENDENCY_SECTIONS.has(sectionName)\n ? sectionName\n : undefined\n currentDependencyName = undefined\n return\n }\n\n if (currentSection === undefined) {\n return\n }\n\n if (indentation === 6) {\n if (trimmedLine.endsWith(':')) {\n currentDependencyName = parseYamlScalar(trimmedLine.slice(0, -1))\n upsertDependency(importers, currentImporter, currentDependencyName, {})\n return\n }\n\n const pair = splitYamlKeyValue(trimmedLine)\n if (pair === undefined) {\n return\n }\n\n currentDependencyName = undefined\n upsertDependency(importers, currentImporter, parseYamlScalar(pair.key), {\n ...parsePnpmVersion(parseYamlScalar(pair.value)),\n })\n return\n }\n\n if (indentation === 8 && currentDependencyName !== undefined) {\n const pair = splitYamlKeyValue(trimmedLine)\n if (pair === undefined) {\n return\n }\n\n if (pair.key === 'specifier') {\n upsertDependency(importers, currentImporter, currentDependencyName, {\n specifier: parseYamlScalar(pair.value),\n })\n return\n }\n\n if (pair.key === 'version') {\n upsertDependency(importers, currentImporter, currentDependencyName, {\n ...parsePnpmVersion(parseYamlScalar(pair.value)),\n })\n }\n }\n })\n\n return importers\n}\n\nfunction upsertDependency(\n importers: Map<string, Map<string, PnpmLockDependencyResolution>>,\n importerPath: string,\n dependencyName: string,\n nextValue: PnpmLockDependencyResolution,\n): void {\n const importer = importers.get(importerPath)\n if (importer === undefined) {\n return\n }\n\n importer.set(dependencyName, {\n ...importer.get(dependencyName),\n ...nextValue,\n })\n}\n\nfunction splitYamlKeyValue(\n line: string,\n): { readonly key: string; readonly value: string } | undefined {\n const separatorIndex = line.indexOf(':')\n\n if (separatorIndex <= 0) {\n return undefined\n }\n\n return {\n key: line.slice(0, separatorIndex).trim(),\n value: line.slice(separatorIndex + 1).trim(),\n }\n}\n\nfunction parseYamlScalar(value: string): string {\n if (value.length >= 2) {\n const firstCharacter = value[0]\n const lastCharacter = value[value.length - 1]\n\n if (\n (firstCharacter === '\"' && lastCharacter === '\"') ||\n (firstCharacter === \"'\" && lastCharacter === \"'\")\n ) {\n return value.slice(1, -1)\n }\n }\n\n return value\n}\n\nfunction parsePnpmVersion(\n value: string,\n): Pick<PnpmLockDependencyResolution, 'version' | 'peerSuffix'> {\n const firstParenthesisIndex = value.indexOf('(')\n\n if (firstParenthesisIndex < 0) {\n return {\n version: value,\n }\n }\n\n return {\n version: value.slice(0, firstParenthesisIndex),\n peerSuffix: value.slice(firstParenthesisIndex),\n }\n}\n","import { execFileSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport type { PackageDependencyChangeKind } from '../../types/package-dependency-change-kind.js'\nimport type {\n PackageDependencyDiffDependency,\n PackageDependencyDiffState,\n} from '../../types/package-dependency-diff-dependency.js'\nimport type { PackageDependencyDiffGraph } from '../../types/package-dependency-diff-graph.js'\nimport type { PackageDependencyDiffNode } from '../../types/package-dependency-diff-node.js'\nimport type { PackageDependencyGraph } from '../../types/package-dependency-graph.js'\nimport type { PackageManifestDependency } from '../../types/package-manifest-dependency.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\nimport { analyzePackageDependencies } from './index.js'\nimport {\n loadPnpmLockImporterResolutions,\n type PnpmLockDependencyResolution,\n} from './pnpm-lock.js'\n\ninterface GitDiffComparison {\n readonly beforeTree: string\n readonly afterTree: string | undefined\n}\n\ninterface ComparablePackageDependencyGraph {\n readonly rootPath: string\n readonly nodes: ReadonlyMap<string, ComparablePackageDependencyNode>\n}\n\ninterface ComparablePackageDependencyNode {\n readonly path: string\n readonly packageName: string\n readonly dependenciesByKey: ReadonlyMap<string, ComparablePackageDependency>\n}\n\ninterface ComparableExternalPackageDependency {\n readonly kind: 'external'\n readonly key: string\n readonly name: string\n readonly specifier: string\n readonly resolvedVersion?: string\n readonly peerContext?: string\n}\n\ninterface ComparableWorkspacePackageDependency {\n readonly kind: 'workspace'\n readonly key: string\n readonly name: string\n readonly specifier: string | undefined\n readonly targetPath: string\n}\n\ntype ComparablePackageDependency =\n | ComparableExternalPackageDependency\n | ComparableWorkspacePackageDependency\n\nconst PNPM_LOCKFILE = 'pnpm-lock.yaml'\nconst PNPM_WORKSPACE_FILE = 'pnpm-workspace.yaml'\n\nexport function analyzePackageDependencyDiff(\n directory: string,\n diff: string,\n): PackageDependencyDiffGraph {\n const resolvedInputPath = path.resolve(process.cwd(), directory)\n const repositoryRoot = findGitRepositoryRoot(resolvedInputPath)\n const inputPathWithinRepository = resolveRepositoryInputPath(\n resolvedInputPath,\n repositoryRoot,\n )\n const comparison = resolveGitDiffComparison(repositoryRoot, diff)\n const beforeGraph = loadGitTreeGraph(\n repositoryRoot,\n comparison.beforeTree,\n inputPathWithinRepository,\n )\n const afterGraph =\n comparison.afterTree === undefined\n ? loadWorkingTreeGraph(repositoryRoot, inputPathWithinRepository)\n : loadGitTreeGraph(\n repositoryRoot,\n comparison.afterTree,\n inputPathWithinRepository,\n )\n\n if (beforeGraph === undefined && afterGraph === undefined) {\n throw new Error(`No package.json found from ${resolvedInputPath}`)\n }\n\n const changedPackagePaths = collectChangedPackagePaths(\n repositoryRoot,\n comparison,\n beforeGraph,\n afterGraph,\n )\n\n return {\n repositoryRoot,\n root: diffPackageNode(\n {\n beforePath: beforeGraph?.rootPath,\n afterPath: afterGraph?.rootPath,\n kind: 'root',\n },\n beforeGraph,\n afterGraph,\n changedPackagePaths,\n new Set(),\n ),\n }\n}\n\nfunction resolveRepositoryInputPath(\n resolvedInputPath: string,\n repositoryRoot: string,\n): string {\n const existingPath = findNearestExistingPath(resolvedInputPath)\n const existingRealPath = fs.realpathSync.native(existingPath)\n const repositoryRealPath = fs.realpathSync.native(repositoryRoot)\n const relativeFromExistingPath = path.relative(\n existingPath,\n resolvedInputPath,\n )\n const relativeToRepository = path.relative(\n repositoryRealPath,\n existingRealPath,\n )\n const normalizedPath = path.normalize(\n path.join(relativeToRepository, relativeFromExistingPath),\n )\n\n return normalizedPath === '.' ? '' : normalizedPath\n}\n\nfunction findGitRepositoryRoot(resolvedInputPath: string): string {\n const searchPath = findNearestExistingPath(resolvedInputPath)\n\n try {\n return runGit(searchPath, ['rev-parse', '--show-toplevel']).trim()\n } catch (error) {\n throw new Error(\n `Git diff mode requires a Git repository: ${getCommandErrorMessage(error)}`,\n )\n }\n}\n\nfunction findNearestExistingPath(resolvedInputPath: string): string {\n let currentPath = resolvedInputPath\n\n while (!fs.existsSync(currentPath)) {\n const parentPath = path.dirname(currentPath)\n\n if (parentPath === currentPath) {\n return resolvedInputPath\n }\n\n currentPath = parentPath\n }\n\n if (fs.statSync(currentPath).isFile()) {\n return path.dirname(currentPath)\n }\n\n return currentPath\n}\n\nfunction resolveGitDiffComparison(\n repositoryRoot: string,\n diff: string,\n): GitDiffComparison {\n if (diff.includes('...')) {\n const [baseRef, headRef] = splitDiffRange(diff, '...')\n\n try {\n const mergeBase = runGit(repositoryRoot, [\n 'merge-base',\n baseRef,\n headRef,\n ]).trim()\n\n return {\n beforeTree: resolveGitTree(repositoryRoot, mergeBase),\n afterTree: resolveGitTree(repositoryRoot, headRef),\n }\n } catch (error) {\n throw new Error(\n `Failed to resolve Git diff spec \\`${diff}\\`: ${getCommandErrorMessage(error)}`,\n )\n }\n }\n\n if (diff.includes('..')) {\n const [beforeRef, afterRef] = splitDiffRange(diff, '..')\n\n try {\n return {\n beforeTree: resolveGitTree(repositoryRoot, beforeRef),\n afterTree: resolveGitTree(repositoryRoot, afterRef),\n }\n } catch (error) {\n throw new Error(\n `Failed to resolve Git diff spec \\`${diff}\\`: ${getCommandErrorMessage(error)}`,\n )\n }\n }\n\n try {\n return {\n beforeTree: resolveGitTree(repositoryRoot, diff),\n afterTree: undefined,\n }\n } catch (error) {\n throw new Error(\n `Failed to resolve Git diff spec \\`${diff}\\`: ${getCommandErrorMessage(error)}`,\n )\n }\n}\n\nfunction splitDiffRange(\n diff: string,\n separator: '...' | '..',\n): readonly [string, string] {\n const [left, right, ...extra] = diff.split(separator)\n\n if (\n left === undefined ||\n right === undefined ||\n left.length === 0 ||\n right.length === 0 ||\n extra.length > 0\n ) {\n throw new Error(`Invalid Git diff spec \\`${diff}\\``)\n }\n\n return [left, right]\n}\n\nfunction resolveGitTree(repositoryRoot: string, reference: string): string {\n return runGit(repositoryRoot, [\n 'rev-parse',\n '--verify',\n `${reference}^{tree}`,\n ]).trim()\n}\n\nfunction loadWorkingTreeGraph(\n repositoryRoot: string,\n inputPathWithinRepository: string,\n): ComparablePackageDependencyGraph | undefined {\n const packageGraph = tryAnalyzePackageGraph(\n resolveSnapshotInputPath(repositoryRoot, inputPathWithinRepository),\n )\n\n return packageGraph === undefined\n ? undefined\n : toComparableGraph(packageGraph)\n}\n\nfunction loadGitTreeGraph(\n repositoryRoot: string,\n tree: string,\n inputPathWithinRepository: string,\n): ComparablePackageDependencyGraph | undefined {\n const snapshotRoot = materializeGitTreeSnapshot(repositoryRoot, tree)\n\n try {\n const packageGraph = tryAnalyzePackageGraph(\n resolveSnapshotInputPath(snapshotRoot, inputPathWithinRepository),\n )\n\n return packageGraph === undefined\n ? undefined\n : toComparableGraph(packageGraph)\n } finally {\n fs.rmSync(snapshotRoot, { recursive: true, force: true })\n }\n}\n\nfunction materializeGitTreeSnapshot(\n repositoryRoot: string,\n tree: string,\n): string {\n const snapshotRoot = fs.mkdtempSync(\n path.join(os.tmpdir(), 'foresthouse-deps-diff-'),\n )\n const trackedFiles = runGit(repositoryRoot, [\n 'ls-tree',\n '-r',\n '-z',\n '--name-only',\n tree,\n ])\n .split('\\u0000')\n .filter((filePath) => filePath.length > 0)\n\n trackedFiles.forEach((filePath) => {\n ensureSnapshotDirectory(snapshotRoot, filePath)\n })\n\n trackedFiles.filter(isManifestSnapshotFile).forEach((filePath) => {\n const fileContent = runGit(\n repositoryRoot,\n ['cat-file', '-p', `${tree}:${filePath}`],\n {\n trim: false,\n },\n )\n const absolutePath = path.join(snapshotRoot, ...filePath.split('/'))\n\n fs.writeFileSync(absolutePath, fileContent)\n })\n\n return snapshotRoot\n}\n\nfunction ensureSnapshotDirectory(snapshotRoot: string, filePath: string): void {\n const parentDirectory = path.dirname(filePath)\n\n if (parentDirectory === '.') {\n return\n }\n\n fs.mkdirSync(path.join(snapshotRoot, ...parentDirectory.split('/')), {\n recursive: true,\n })\n}\n\nfunction isManifestSnapshotFile(filePath: string): boolean {\n const fileName = path.posix.basename(filePath)\n return (\n fileName === 'package.json' ||\n fileName === PNPM_LOCKFILE ||\n fileName === PNPM_WORKSPACE_FILE\n )\n}\n\nfunction resolveSnapshotInputPath(\n snapshotRoot: string,\n inputPathWithinRepository: string,\n): string {\n if (inputPathWithinRepository === '') {\n return snapshotRoot\n }\n\n return path.join(snapshotRoot, inputPathWithinRepository)\n}\n\nfunction tryAnalyzePackageGraph(\n inputPath: string,\n): PackageDependencyGraph | undefined {\n if (!fs.existsSync(inputPath)) {\n return undefined\n }\n\n try {\n return analyzePackageDependencies(inputPath)\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.startsWith('No package.json found from ')\n ) {\n return undefined\n }\n\n throw error\n }\n}\n\nfunction toComparableGraph(\n graph: PackageDependencyGraph,\n): ComparablePackageDependencyGraph {\n const pnpmLockResolutions = loadPnpmLockImporterResolutions(\n graph.repositoryRoot,\n )\n const nodes = new Map<string, ComparablePackageDependencyNode>()\n\n graph.nodes.forEach((node, packageDir) => {\n const packagePath = toDisplayPath(packageDir, graph.repositoryRoot)\n const packageLockResolutions = pnpmLockResolutions?.get(packagePath)\n const dependenciesByKey = new Map<string, ComparablePackageDependency>()\n\n node.dependencies.forEach((dependency) => {\n dependenciesByKey.set(\n createDependencyKey(dependency),\n toComparableDependency(\n dependency,\n graph.repositoryRoot,\n packageLockResolutions?.get(dependency.name),\n ),\n )\n })\n\n nodes.set(packagePath, {\n path: packagePath,\n packageName: node.packageName,\n dependenciesByKey,\n })\n })\n\n return {\n rootPath: toDisplayPath(graph.rootId, graph.repositoryRoot),\n nodes,\n }\n}\n\nfunction createDependencyKey(dependency: PackageManifestDependency): string {\n return `${dependency.kind}:${dependency.name}`\n}\n\nfunction toComparableDependency(\n dependency: PackageManifestDependency,\n repositoryRoot: string,\n lockResolution: PnpmLockDependencyResolution | undefined,\n): ComparablePackageDependency {\n if (dependency.kind === 'external') {\n const resolvedVersion = resolveResolvedVersion(lockResolution)\n const peerContext = resolvePeerContext(lockResolution)\n\n return {\n kind: 'external',\n key: createDependencyKey(dependency),\n name: dependency.name,\n specifier: dependency.specifier,\n ...(resolvedVersion === undefined ? {} : { resolvedVersion }),\n ...(peerContext === undefined ? {} : { peerContext }),\n }\n }\n\n return {\n kind: 'workspace',\n key: createDependencyKey(dependency),\n name: dependency.name,\n specifier: dependency.specifier,\n targetPath: toDisplayPath(dependency.target, repositoryRoot),\n }\n}\n\nfunction resolveResolvedVersion(\n lockResolution: PnpmLockDependencyResolution | undefined,\n): string | undefined {\n if (lockResolution === undefined) {\n return undefined\n }\n\n const version = lockResolution.version?.trim()\n\n if (\n version === undefined ||\n version.length === 0 ||\n version.startsWith('link:') ||\n version.startsWith('file:') ||\n version.startsWith('workspace:')\n ) {\n return undefined\n }\n\n return version\n}\n\nfunction resolvePeerContext(\n lockResolution: PnpmLockDependencyResolution | undefined,\n): string | undefined {\n const peerSuffix = lockResolution?.peerSuffix?.trim()\n\n return peerSuffix === undefined || peerSuffix.length === 0\n ? undefined\n : peerSuffix\n}\n\nfunction diffPackageNode(\n location: {\n readonly beforePath: string | undefined\n readonly afterPath: string | undefined\n readonly kind: 'root' | 'workspace'\n },\n beforeGraph: ComparablePackageDependencyGraph | undefined,\n afterGraph: ComparablePackageDependencyGraph | undefined,\n changedPackagePaths: ReadonlySet<string>,\n ancestry: ReadonlySet<string>,\n): PackageDependencyDiffNode {\n const nodeKey = `${location.beforePath ?? ''}->${location.afterPath ?? ''}`\n const beforeNode =\n location.beforePath === undefined\n ? undefined\n : beforeGraph?.nodes.get(location.beforePath)\n const afterNode =\n location.afterPath === undefined\n ? undefined\n : afterGraph?.nodes.get(location.afterPath)\n\n if (beforeNode === undefined && afterNode === undefined) {\n throw new Error('Unable to resolve package diff node.')\n }\n\n const packageName =\n afterNode?.packageName ??\n beforeNode?.packageName ??\n location.afterPath ??\n location.beforePath ??\n '.'\n const packagePath = location.afterPath ?? location.beforePath ?? '.'\n\n if (ancestry.has(nodeKey)) {\n return {\n kind: 'circular',\n label: location.kind === 'root' ? packageName : packagePath,\n packageName,\n path: packagePath,\n change: 'unchanged',\n dependencies: [],\n }\n }\n\n const nextAncestry = new Set(ancestry)\n nextAncestry.add(nodeKey)\n\n const dependencies = collectDependencyDiffs(\n beforeNode,\n afterNode,\n beforeGraph,\n afterGraph,\n changedPackagePaths,\n nextAncestry,\n )\n const change = resolveNodeChange(\n location,\n beforeNode,\n afterNode,\n dependencies,\n changedPackagePaths,\n )\n\n return {\n kind: location.kind,\n label: location.kind === 'root' ? packageName : packagePath,\n packageName,\n path: packagePath,\n change,\n ...(beforeNode !== undefined &&\n afterNode !== undefined &&\n beforeNode.packageName !== afterNode.packageName\n ? {\n beforePackageName: beforeNode.packageName,\n afterPackageName: afterNode.packageName,\n }\n : {}),\n dependencies,\n }\n}\n\nfunction collectDependencyDiffs(\n beforeNode: ComparablePackageDependencyNode | undefined,\n afterNode: ComparablePackageDependencyNode | undefined,\n beforeGraph: ComparablePackageDependencyGraph | undefined,\n afterGraph: ComparablePackageDependencyGraph | undefined,\n changedPackagePaths: ReadonlySet<string>,\n ancestry: ReadonlySet<string>,\n): PackageDependencyDiffDependency[] {\n const dependencyKeys = new Set<string>([\n ...Array.from(beforeNode?.dependenciesByKey.keys() ?? []),\n ...Array.from(afterNode?.dependenciesByKey.keys() ?? []),\n ])\n\n return Array.from(dependencyKeys)\n .sort((left, right) =>\n compareDependencyLabels(\n beforeNode?.dependenciesByKey.get(left) ??\n afterNode?.dependenciesByKey.get(left),\n beforeNode?.dependenciesByKey.get(right) ??\n afterNode?.dependenciesByKey.get(right),\n ),\n )\n .flatMap((dependencyKey) => {\n const dependency = diffDependency(\n beforeNode?.dependenciesByKey.get(dependencyKey),\n afterNode?.dependenciesByKey.get(dependencyKey),\n beforeGraph,\n afterGraph,\n changedPackagePaths,\n ancestry,\n )\n\n return dependency === undefined ? [] : [dependency]\n })\n}\n\nfunction compareDependencyLabels(\n left: ComparablePackageDependency | undefined,\n right: ComparablePackageDependency | undefined,\n): number {\n const leftLabel = left === undefined ? '' : getDependencySortLabel(left)\n const rightLabel = right === undefined ? '' : getDependencySortLabel(right)\n\n return leftLabel.localeCompare(rightLabel)\n}\n\nfunction getDependencySortLabel(\n dependency: ComparablePackageDependency,\n): string {\n if (dependency.kind === 'external') {\n return `${dependency.name}@${dependency.specifier}`\n }\n\n return dependency.targetPath\n}\n\nfunction diffDependency(\n beforeDependency: ComparablePackageDependency | undefined,\n afterDependency: ComparablePackageDependency | undefined,\n beforeGraph: ComparablePackageDependencyGraph | undefined,\n afterGraph: ComparablePackageDependencyGraph | undefined,\n changedPackagePaths: ReadonlySet<string>,\n ancestry: ReadonlySet<string>,\n): PackageDependencyDiffDependency | undefined {\n const change = resolveDependencyChange(beforeDependency, afterDependency)\n\n if (\n beforeDependency?.kind === 'workspace' ||\n afterDependency?.kind === 'workspace'\n ) {\n const workspaceDependency =\n afterDependency?.kind === 'workspace'\n ? afterDependency\n : beforeDependency?.kind === 'workspace'\n ? beforeDependency\n : undefined\n\n if (workspaceDependency === undefined) {\n return undefined\n }\n\n const node = diffPackageNode(\n {\n beforePath:\n beforeDependency?.kind === 'workspace'\n ? beforeDependency.targetPath\n : undefined,\n afterPath:\n afterDependency?.kind === 'workspace'\n ? afterDependency.targetPath\n : undefined,\n kind: 'workspace',\n },\n beforeGraph,\n afterGraph,\n changedPackagePaths,\n ancestry,\n )\n\n if (change === 'unchanged' && !hasVisibleChanges(node)) {\n return undefined\n }\n\n return {\n kind: 'workspace',\n name: workspaceDependency.name,\n change,\n ...(beforeDependency === undefined\n ? {}\n : { before: toDiffState(beforeDependency) }),\n ...(afterDependency === undefined\n ? {}\n : { after: toDiffState(afterDependency) }),\n node,\n }\n }\n\n if (change === 'unchanged') {\n return undefined\n }\n\n const dependency = afterDependency ?? beforeDependency\n\n if (dependency === undefined || dependency.kind !== 'external') {\n return undefined\n }\n\n return {\n kind: 'external',\n name: dependency.name,\n change,\n specifierChanged: didExternalSpecifierChange(\n beforeDependency,\n afterDependency,\n ),\n resolvedVersionChanged: didExternalResolvedVersionChange(\n beforeDependency,\n afterDependency,\n ),\n peerContextChanged: didExternalPeerContextChange(\n beforeDependency,\n afterDependency,\n ),\n ...(beforeDependency === undefined\n ? {}\n : { before: toDiffState(beforeDependency) }),\n ...(afterDependency === undefined\n ? {}\n : { after: toDiffState(afterDependency) }),\n }\n}\n\nfunction didExternalSpecifierChange(\n beforeDependency: ComparablePackageDependency | undefined,\n afterDependency: ComparablePackageDependency | undefined,\n): boolean {\n return (\n beforeDependency?.kind === 'external' &&\n afterDependency?.kind === 'external' &&\n beforeDependency.specifier !== afterDependency.specifier\n )\n}\n\nfunction didExternalResolvedVersionChange(\n beforeDependency: ComparablePackageDependency | undefined,\n afterDependency: ComparablePackageDependency | undefined,\n): boolean {\n return (\n beforeDependency?.kind === 'external' &&\n afterDependency?.kind === 'external' &&\n beforeDependency.resolvedVersion !== afterDependency.resolvedVersion\n )\n}\n\nfunction didExternalPeerContextChange(\n beforeDependency: ComparablePackageDependency | undefined,\n afterDependency: ComparablePackageDependency | undefined,\n): boolean {\n return (\n beforeDependency?.kind === 'external' &&\n afterDependency?.kind === 'external' &&\n beforeDependency.peerContext !== afterDependency.peerContext\n )\n}\n\nfunction resolveDependencyChange(\n beforeDependency: ComparablePackageDependency | undefined,\n afterDependency: ComparablePackageDependency | undefined,\n): PackageDependencyChangeKind {\n if (beforeDependency === undefined && afterDependency !== undefined) {\n return 'added'\n }\n\n if (beforeDependency !== undefined && afterDependency === undefined) {\n return 'removed'\n }\n\n if (beforeDependency === undefined || afterDependency === undefined) {\n return 'unchanged'\n }\n\n if (beforeDependency.kind !== afterDependency.kind) {\n return 'changed'\n }\n\n if (\n beforeDependency.kind === 'external' &&\n afterDependency.kind === 'external'\n ) {\n return beforeDependency.specifier === afterDependency.specifier &&\n beforeDependency.resolvedVersion === afterDependency.resolvedVersion &&\n beforeDependency.peerContext === afterDependency.peerContext\n ? 'unchanged'\n : 'changed'\n }\n\n if (\n beforeDependency.kind === 'workspace' &&\n afterDependency.kind === 'workspace'\n ) {\n return beforeDependency.specifier === afterDependency.specifier &&\n beforeDependency.targetPath === afterDependency.targetPath\n ? 'unchanged'\n : 'changed'\n }\n\n return 'changed'\n}\n\nfunction toDiffState(\n dependency: ComparablePackageDependency,\n): PackageDependencyDiffState {\n if (dependency.kind === 'external') {\n return {\n target: `${dependency.name}@${dependency.specifier}`,\n specifier: dependency.specifier,\n ...(dependency.resolvedVersion === undefined\n ? {}\n : { resolvedVersion: dependency.resolvedVersion }),\n ...(dependency.peerContext === undefined\n ? {}\n : { peerContext: dependency.peerContext }),\n }\n }\n\n return dependency.specifier === undefined\n ? {\n target: dependency.targetPath,\n }\n : {\n target: dependency.targetPath,\n specifier: dependency.specifier,\n }\n}\n\nfunction hasVisibleChanges(node: PackageDependencyDiffNode): boolean {\n return node.change !== 'unchanged' || node.dependencies.length > 0\n}\n\nfunction resolveNodeChange(\n location: {\n readonly beforePath: string | undefined\n readonly afterPath: string | undefined\n },\n beforeNode: ComparablePackageDependencyNode | undefined,\n afterNode: ComparablePackageDependencyNode | undefined,\n dependencies: readonly PackageDependencyDiffDependency[],\n changedPackagePaths: ReadonlySet<string>,\n): PackageDependencyChangeKind {\n if (beforeNode === undefined && afterNode !== undefined) {\n return 'added'\n }\n\n if (beforeNode !== undefined && afterNode === undefined) {\n return 'removed'\n }\n\n if (beforeNode === undefined || afterNode === undefined) {\n return 'unchanged'\n }\n\n if (location.beforePath !== location.afterPath) {\n return 'changed'\n }\n\n if (beforeNode.packageName !== afterNode.packageName) {\n return 'changed'\n }\n\n const packagePath = location.afterPath ?? location.beforePath\n\n if (packagePath !== undefined && changedPackagePaths.has(packagePath)) {\n return 'changed'\n }\n\n return dependencies.length > 0 ? 'changed' : 'unchanged'\n}\n\nfunction collectChangedPackagePaths(\n repositoryRoot: string,\n comparison: GitDiffComparison,\n beforeGraph: ComparablePackageDependencyGraph | undefined,\n afterGraph: ComparablePackageDependencyGraph | undefined,\n): ReadonlySet<string> {\n const changedFiles = listChangedRepositoryPaths(repositoryRoot, comparison)\n const packagePaths = Array.from(\n new Set([\n ...Array.from(beforeGraph?.nodes.keys() ?? []),\n ...Array.from(afterGraph?.nodes.keys() ?? []),\n ]),\n ).sort((left, right) => right.length - left.length)\n const changedPackagePaths = new Set<string>()\n\n changedFiles.forEach((filePath) => {\n const ownerPackagePath = packagePaths.find((packagePath) =>\n isFileInPackage(filePath, packagePath),\n )\n\n if (ownerPackagePath !== undefined) {\n changedPackagePaths.add(ownerPackagePath)\n }\n })\n\n return changedPackagePaths\n}\n\nfunction listChangedRepositoryPaths(\n repositoryRoot: string,\n comparison: GitDiffComparison,\n): readonly string[] {\n const trackedChanges =\n comparison.afterTree === undefined\n ? runGit(repositoryRoot, [\n 'diff',\n '--name-only',\n '-z',\n comparison.beforeTree,\n '--',\n ])\n : runGit(repositoryRoot, [\n 'diff',\n '--name-only',\n '-z',\n comparison.beforeTree,\n comparison.afterTree,\n ])\n\n const changedPaths = new Set(\n trackedChanges.split('\\u0000').filter((filePath) => filePath.length > 0),\n )\n\n if (comparison.afterTree === undefined) {\n runGit(repositoryRoot, ['ls-files', '--others', '--exclude-standard', '-z'])\n .split('\\u0000')\n .filter((filePath) => filePath.length > 0)\n .forEach((filePath) => {\n changedPaths.add(filePath)\n })\n }\n\n return Array.from(changedPaths)\n}\n\nfunction isFileInPackage(filePath: string, packagePath: string): boolean {\n if (packagePath === '.') {\n return true\n }\n\n return filePath === packagePath || filePath.startsWith(`${packagePath}/`)\n}\n\nfunction runGit(\n repositoryRoot: string,\n args: readonly string[],\n options: {\n readonly trim?: boolean\n } = {},\n): string {\n const output = execFileSync('git', ['-C', repositoryRoot, ...args], {\n encoding: 'utf8',\n })\n\n return options.trim === false ? output : output.trimEnd()\n}\n\nfunction getCommandErrorMessage(error: unknown): string {\n if (!(error instanceof Error)) {\n return 'Unknown Git error'\n }\n\n const stderr = Reflect.get(error, 'stderr')\n\n if (typeof stderr === 'string' && stderr.trim().length > 0) {\n return stderr.trim()\n }\n\n if (Buffer.isBuffer(stderr) && stderr.byteLength > 0) {\n return stderr.toString('utf8').trim()\n }\n\n return error.message\n}\n","import path from 'node:path'\nimport ts from 'typescript'\n\nexport interface LoadedConfig {\n readonly path?: string\n readonly compilerOptions: ts.CompilerOptions\n}\n\nexport function loadCompilerOptions(\n searchFrom: string,\n explicitConfigPath?: string,\n): LoadedConfig {\n const configPath =\n explicitConfigPath === undefined\n ? findNearestConfig(searchFrom)\n : path.resolve(searchFrom, explicitConfigPath)\n\n if (configPath === undefined) {\n return {\n compilerOptions: defaultCompilerOptions(),\n }\n }\n\n const readResult = ts.readConfigFile(configPath, ts.sys.readFile)\n if (readResult.error !== undefined) {\n throw new Error(\n `Failed to read TypeScript config at ${configPath}: ${formatDiagnostic(\n readResult.error,\n )}`,\n )\n }\n\n const parsed = ts.parseJsonConfigFileContent(\n readResult.config,\n ts.sys,\n path.dirname(configPath),\n defaultCompilerOptions(),\n configPath,\n )\n\n if (parsed.errors.length > 0) {\n const [firstError] = parsed.errors\n if (firstError === undefined) {\n throw new Error(`Failed to parse TypeScript config at ${configPath}.`)\n }\n\n throw new Error(\n `Failed to parse TypeScript config at ${configPath}: ${formatDiagnostic(\n firstError,\n )}`,\n )\n }\n\n return {\n path: configPath,\n compilerOptions: parsed.options,\n }\n}\n\nfunction findNearestConfig(searchFrom: string): string | undefined {\n let currentDirectory = path.resolve(searchFrom)\n\n while (true) {\n if (!isInsideNodeModules(currentDirectory)) {\n const tsconfigPath = path.join(currentDirectory, 'tsconfig.json')\n if (ts.sys.fileExists(tsconfigPath)) {\n return tsconfigPath\n }\n\n const jsconfigPath = path.join(currentDirectory, 'jsconfig.json')\n if (ts.sys.fileExists(jsconfigPath)) {\n return jsconfigPath\n }\n }\n\n const parentDirectory = path.dirname(currentDirectory)\n if (parentDirectory === currentDirectory) {\n return undefined\n }\n\n currentDirectory = parentDirectory\n }\n}\n\nfunction defaultCompilerOptions(): ts.CompilerOptions {\n return {\n allowJs: true,\n jsx: ts.JsxEmit.ReactJSX,\n module: ts.ModuleKind.NodeNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n target: ts.ScriptTarget.ESNext,\n resolveJsonModule: true,\n esModuleInterop: true,\n }\n}\n\nfunction formatDiagnostic(diagnostic: ts.Diagnostic): string {\n return ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n')\n}\n\nfunction isInsideNodeModules(filePath: string): boolean {\n return filePath.includes(`${path.sep}node_modules${path.sep}`)\n}\n","import path from 'node:path'\n\nexport const SOURCE_EXTENSIONS = new Set([\n '.js',\n '.jsx',\n '.ts',\n '.tsx',\n '.mjs',\n '.cjs',\n '.mts',\n '.cts',\n])\n\nexport function isSourceCodeFile(filePath: string): boolean {\n return SOURCE_EXTENSIONS.has(path.extname(filePath).toLowerCase())\n}\n","import path from 'node:path'\n\nexport function normalizeFilePath(filePath: string): string {\n return path.normalize(filePath)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport { isSourceCodeFile } from '../../utils/is-source-code-file.js'\nimport { normalizeFilePath } from '../../utils/normalize-file-path.js'\n\nexport function resolveExistingPath(cwd: string, entryFile: string): string {\n const absolutePath = path.resolve(cwd, entryFile)\n const normalizedPath = normalizeFilePath(absolutePath)\n\n if (!fs.existsSync(normalizedPath)) {\n throw new Error(`Entry file not found: ${entryFile}`)\n }\n\n if (!isSourceCodeFile(normalizedPath)) {\n throw new Error(`Entry file must be a JS/TS source file: ${entryFile}`)\n }\n\n return normalizedPath\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport ts from 'typescript'\n\nexport function createProgram(\n entryFile: string,\n compilerOptions: ts.CompilerOptions,\n currentDirectory: string,\n): ts.Program {\n const host = ts.createCompilerHost(compilerOptions, true)\n host.getCurrentDirectory = () => currentDirectory\n\n if (ts.sys.realpath !== undefined) {\n host.realpath = ts.sys.realpath\n }\n\n return ts.createProgram({\n rootNames: [entryFile],\n options: compilerOptions,\n host,\n })\n}\n\nexport function createSourceFile(filePath: string): ts.SourceFile {\n const sourceText = fs.readFileSync(filePath, 'utf8')\n return ts.createSourceFile(\n filePath,\n sourceText,\n ts.ScriptTarget.Latest,\n true,\n getScriptKind(filePath),\n )\n}\n\nexport function createModuleResolutionHost(\n currentDirectory: string,\n): ts.ModuleResolutionHost {\n return {\n fileExists: ts.sys.fileExists,\n readFile: ts.sys.readFile,\n directoryExists: ts.sys.directoryExists,\n getCurrentDirectory: () => currentDirectory,\n getDirectories: ts.sys.getDirectories,\n ...(ts.sys.realpath === undefined ? {} : { realpath: ts.sys.realpath }),\n }\n}\n\nfunction getScriptKind(filePath: string): ts.ScriptKind {\n switch (path.extname(filePath).toLowerCase()) {\n case '.js':\n case '.mjs':\n case '.cjs':\n return ts.ScriptKind.JS\n case '.jsx':\n return ts.ScriptKind.JSX\n case '.tsx':\n return ts.ScriptKind.TSX\n case '.json':\n return ts.ScriptKind.JSON\n default:\n return ts.ScriptKind.TS\n }\n}\n","import ts from 'typescript'\n\nexport function collectUnusedImports(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n): ReadonlyMap<ts.ImportDeclaration, boolean> {\n const importUsage = new Map<\n ts.ImportDeclaration,\n {\n canTrack: boolean\n used: boolean\n }\n >()\n const symbolToImportDeclaration = new Map<ts.Symbol, ts.ImportDeclaration>()\n const importedLocalNames = new Set<string>()\n\n sourceFile.statements.forEach((statement) => {\n if (\n !ts.isImportDeclaration(statement) ||\n statement.importClause === undefined\n ) {\n return\n }\n\n const identifiers = getImportBindingIdentifiers(statement.importClause)\n if (identifiers.length === 0) {\n return\n }\n\n importUsage.set(statement, {\n canTrack: false,\n used: false,\n })\n\n identifiers.forEach((identifier) => {\n importedLocalNames.add(identifier.text)\n\n const symbol = tryGetSymbolAtLocation(checker, identifier)\n if (symbol === undefined) {\n return\n }\n\n symbolToImportDeclaration.set(symbol, statement)\n const state = importUsage.get(statement)\n if (state !== undefined) {\n state.canTrack = true\n }\n })\n })\n\n function visit(node: ts.Node): void {\n if (ts.isImportDeclaration(node)) {\n return\n }\n\n if (\n ts.isIdentifier(node) &&\n importedLocalNames.has(node.text) &&\n isReferenceIdentifier(node)\n ) {\n const symbol = tryGetSymbolAtLocation(checker, node)\n const declaration =\n symbol === undefined ? undefined : symbolToImportDeclaration.get(symbol)\n if (declaration !== undefined) {\n const state = importUsage.get(declaration)\n if (state !== undefined) {\n state.used = true\n }\n }\n }\n\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n\n return new Map(\n [...importUsage.entries()].map(([declaration, state]) => [\n declaration,\n state.canTrack && !state.used,\n ]),\n )\n}\n\nfunction getImportBindingIdentifiers(\n importClause: ts.ImportClause,\n): ts.Identifier[] {\n const identifiers: ts.Identifier[] = []\n\n if (importClause.name !== undefined) {\n identifiers.push(importClause.name)\n }\n\n const namedBindings = importClause.namedBindings\n if (namedBindings === undefined) {\n return identifiers\n }\n\n if (ts.isNamespaceImport(namedBindings)) {\n identifiers.push(namedBindings.name)\n return identifiers\n }\n\n namedBindings.elements.forEach((element) => {\n identifiers.push(element.name)\n })\n\n return identifiers\n}\n\nfunction isReferenceIdentifier(node: ts.Identifier): boolean {\n const parent = node.parent\n\n if (ts.isPropertyAccessExpression(parent) && parent.name === node) {\n return false\n }\n\n if (ts.isQualifiedName(parent) && parent.right === node) {\n return false\n }\n\n if (ts.isPropertyAssignment(parent) && parent.name === node) {\n return false\n }\n\n if (ts.isBindingElement(parent) && parent.propertyName === node) {\n return false\n }\n\n if (ts.isJsxAttribute(parent) && parent.name === node) {\n return false\n }\n\n if (ts.isExportSpecifier(parent)) {\n return parent.propertyName === node || parent.propertyName === undefined\n }\n\n return true\n}\n\nfunction tryGetSymbolAtLocation(\n checker: ts.TypeChecker,\n node: ts.Node,\n): ts.Symbol | undefined {\n try {\n return checker.getSymbolAtLocation(node)\n } catch {\n return undefined\n }\n}\n","import ts from 'typescript'\n\nimport type { ReferenceKind } from '../../types/reference-kind.js'\nimport { collectUnusedImports } from './unused.js'\n\nexport interface ModuleReference {\n readonly specifier: string\n readonly referenceKind: ReferenceKind\n readonly isTypeOnly: boolean\n readonly unused: boolean\n}\n\nexport function collectModuleReferences(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n): ModuleReference[] {\n const references = new Map<string, ModuleReference>()\n const unusedImports = collectUnusedImports(sourceFile, checker)\n\n function addReference(\n specifier: string,\n referenceKind: ReferenceKind,\n isTypeOnly: boolean,\n unused: boolean,\n ): void {\n const key = `${referenceKind}:${isTypeOnly ? 'type' : 'value'}:${specifier}`\n const existing = references.get(key)\n if (existing !== undefined) {\n if (existing.unused && !unused) {\n references.set(key, {\n ...existing,\n unused: false,\n })\n }\n return\n }\n\n references.set(key, {\n specifier,\n referenceKind,\n isTypeOnly,\n unused,\n })\n }\n\n function visit(node: ts.Node): void {\n if (\n ts.isImportDeclaration(node) &&\n ts.isStringLiteralLike(node.moduleSpecifier)\n ) {\n addReference(\n node.moduleSpecifier.text,\n 'import',\n node.importClause?.isTypeOnly ?? false,\n unusedImports.get(node) ?? false,\n )\n } else if (\n ts.isExportDeclaration(node) &&\n node.moduleSpecifier !== undefined &&\n ts.isStringLiteralLike(node.moduleSpecifier)\n ) {\n addReference(\n node.moduleSpecifier.text,\n 'export',\n node.isTypeOnly ?? false,\n false,\n )\n } else if (ts.isImportEqualsDeclaration(node)) {\n const moduleReference = node.moduleReference\n if (\n ts.isExternalModuleReference(moduleReference) &&\n moduleReference.expression !== undefined &&\n ts.isStringLiteralLike(moduleReference.expression)\n ) {\n addReference(\n moduleReference.expression.text,\n 'import-equals',\n false,\n false,\n )\n }\n } else if (ts.isCallExpression(node)) {\n if (\n node.expression.kind === ts.SyntaxKind.ImportKeyword &&\n node.arguments.length === 1\n ) {\n const [argument] = node.arguments\n if (argument !== undefined && ts.isStringLiteralLike(argument)) {\n addReference(argument.text, 'dynamic-import', false, false)\n }\n }\n\n if (\n ts.isIdentifier(node.expression) &&\n node.expression.text === 'require' &&\n node.arguments.length === 1\n ) {\n const [argument] = node.arguments\n if (argument !== undefined && ts.isStringLiteralLike(argument)) {\n addReference(argument.text, 'require', false, false)\n }\n }\n }\n\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n return [...references.values()]\n}\n","import { builtinModules } from 'node:module'\nimport path from 'node:path'\nimport type { ResolverFactory } from 'oxc-resolver'\nimport ts from 'typescript'\n\nimport type { DependencyEdge } from '../../types/dependency-edge.js'\nimport type { DependencyKind } from '../../types/dependency-kind.js'\nimport { isSourceCodeFile } from '../../utils/is-source-code-file.js'\nimport { normalizeFilePath } from '../../utils/normalize-file-path.js'\nimport type { ModuleReference } from './references.js'\n\nconst BUILTIN_MODULES = new Set(\n builtinModules.flatMap((name) => [name, `node:${name}`]),\n)\n\nexport interface ResolverConfigContext {\n readonly path?: string\n readonly compilerOptions: ts.CompilerOptions\n}\n\nexport interface ResolveDependencyOptions {\n readonly cwd: string\n readonly entryConfigPath?: string\n readonly expandWorkspaces: boolean\n readonly projectOnly: boolean\n readonly getConfigForFile: (filePath: string) => ResolverConfigContext\n readonly getResolverForFile: (filePath: string) => ResolverFactory\n}\n\nexport function resolveDependency(\n reference: ModuleReference,\n containingFile: string,\n options: ResolveDependencyOptions,\n): DependencyEdge {\n const specifier = reference.specifier\n if (BUILTIN_MODULES.has(specifier)) {\n return createEdge(reference, 'builtin', specifier)\n }\n\n const containingConfig = options.getConfigForFile(containingFile)\n const oxcResolution = resolveWithOxc(\n reference,\n specifier,\n containingFile,\n options,\n )\n if (oxcResolution !== undefined) {\n return oxcResolution\n }\n\n const host = createResolutionHost(containingConfig, options.cwd)\n const resolution = ts.resolveModuleName(\n specifier,\n containingFile,\n containingConfig.compilerOptions,\n host,\n ).resolvedModule\n\n if (resolution !== undefined) {\n const resolvedPath = normalizeFilePath(resolution.resolvedFileName)\n const realPath = resolveRealPath(resolvedPath)\n const sourcePath = pickSourcePath(resolvedPath, realPath)\n\n if (sourcePath !== undefined) {\n const boundary = classifyBoundary(specifier, sourcePath, options)\n if (boundary !== undefined) {\n return createEdge(reference, 'boundary', sourcePath, boundary)\n }\n\n if (\n !resolution.isExternalLibraryImport ||\n !isInsideNodeModules(sourcePath) ||\n (realPath !== undefined && !isInsideNodeModules(realPath))\n ) {\n return createEdge(reference, 'source', sourcePath)\n }\n }\n\n if (\n resolution.isExternalLibraryImport ||\n isInsideNodeModules(resolvedPath) ||\n (realPath !== undefined && isInsideNodeModules(realPath))\n ) {\n return createEdge(reference, 'external', specifier)\n }\n }\n\n if (!specifier.startsWith('.') && !path.isAbsolute(specifier)) {\n return createEdge(reference, 'external', specifier)\n }\n\n return createEdge(reference, 'missing', specifier)\n}\n\nfunction resolveWithOxc(\n reference: ModuleReference,\n specifier: string,\n containingFile: string,\n options: ResolveDependencyOptions,\n): DependencyEdge | undefined {\n try {\n const result = options\n .getResolverForFile(containingFile)\n .resolveFileSync(containingFile, specifier)\n\n if (result.builtin !== undefined) {\n return createEdge(reference, 'builtin', result.builtin.resolved)\n }\n\n if (result.path !== undefined) {\n return classifyResolvedPath(reference, specifier, result.path, options)\n }\n } catch {\n return undefined\n }\n\n return undefined\n}\n\nfunction createEdge(\n reference: ModuleReference,\n kind: DependencyKind,\n target: string,\n boundary?: 'workspace' | 'project',\n): DependencyEdge {\n return {\n specifier: reference.specifier,\n referenceKind: reference.referenceKind,\n isTypeOnly: reference.isTypeOnly,\n unused: reference.unused,\n kind,\n target,\n ...(boundary === undefined ? {} : { boundary }),\n }\n}\n\nfunction createResolutionHost(\n config: ResolverConfigContext,\n cwd: string,\n): ts.ModuleResolutionHost {\n return {\n fileExists: ts.sys.fileExists,\n readFile: ts.sys.readFile,\n directoryExists: ts.sys.directoryExists,\n getCurrentDirectory: () =>\n config.path === undefined ? cwd : path.dirname(config.path),\n getDirectories: ts.sys.getDirectories,\n ...(ts.sys.realpath === undefined ? {} : { realpath: ts.sys.realpath }),\n }\n}\n\nfunction resolveRealPath(resolvedPath: string): string | undefined {\n if (ts.sys.realpath === undefined) {\n return undefined\n }\n\n try {\n return normalizeFilePath(ts.sys.realpath(resolvedPath))\n } catch {\n return undefined\n }\n}\n\nfunction classifyResolvedPath(\n reference: ModuleReference,\n specifier: string,\n resolvedPathValue: string,\n options: ResolveDependencyOptions,\n): DependencyEdge {\n const resolvedPath = normalizeFilePath(resolvedPathValue)\n const realPath = resolveRealPath(resolvedPath)\n const sourcePath = pickSourcePath(resolvedPath, realPath)\n\n if (sourcePath !== undefined) {\n const boundary = classifyBoundary(specifier, sourcePath, options)\n if (boundary !== undefined) {\n return createEdge(reference, 'boundary', sourcePath, boundary)\n }\n\n if (\n !isInsideNodeModules(sourcePath) ||\n (realPath !== undefined && !isInsideNodeModules(realPath))\n ) {\n return createEdge(reference, 'source', sourcePath)\n }\n }\n\n return createEdge(reference, 'external', specifier)\n}\n\nfunction pickSourcePath(\n resolvedPath: string,\n realPath: string | undefined,\n): string | undefined {\n const candidates = [realPath, resolvedPath]\n\n for (const candidate of candidates) {\n if (\n candidate !== undefined &&\n isSourceCodeFile(candidate) &&\n !candidate.endsWith('.d.ts')\n ) {\n return candidate\n }\n }\n\n return undefined\n}\n\nfunction classifyBoundary(\n specifier: string,\n sourcePath: string,\n options: ResolveDependencyOptions,\n): 'workspace' | 'project' | undefined {\n const targetConfigPath = options.getConfigForFile(sourcePath).path\n const entryConfigPath = options.entryConfigPath\n\n if (\n options.projectOnly &&\n entryConfigPath !== undefined &&\n targetConfigPath !== entryConfigPath\n ) {\n return 'project'\n }\n\n if (\n !options.expandWorkspaces &&\n isWorkspaceLikeImport(specifier) &&\n entryConfigPath !== undefined &&\n targetConfigPath !== entryConfigPath\n ) {\n return 'workspace'\n }\n\n return undefined\n}\n\nfunction isWorkspaceLikeImport(specifier: string): boolean {\n return !specifier.startsWith('.') && !path.isAbsolute(specifier)\n}\n\nfunction isInsideNodeModules(filePath: string): boolean {\n return filePath.includes(`${path.sep}node_modules${path.sep}`)\n}\n","import path from 'node:path'\nimport { ResolverFactory } from 'oxc-resolver'\nimport type ts from 'typescript'\n\nimport type { SourceModuleNode } from '../../types/source-module-node.js'\nimport { loadCompilerOptions } from '../../typescript/config.js'\nimport { createProgram, createSourceFile } from '../../typescript/program.js'\nimport { normalizeFilePath } from '../../utils/normalize-file-path.js'\nimport { collectModuleReferences } from './references.js'\nimport { resolveDependency } from './resolver.js'\n\nexport function buildDependencyGraph(\n entryPath: string,\n options: BuildDependencyGraphOptions,\n): Map<string, SourceModuleNode> {\n return new DependencyGraphBuilder(entryPath, options).build()\n}\n\nexport interface BuildDependencyGraphOptions {\n readonly cwd: string\n readonly entryConfigPath?: string\n readonly entryCompilerOptions: ts.CompilerOptions\n readonly expandWorkspaces: boolean\n readonly projectOnly: boolean\n}\n\nclass DependencyGraphBuilder {\n private readonly nodes = new Map<string, SourceModuleNode>()\n private readonly configCache = new Map<\n string,\n import('./resolver.js').ResolverConfigContext\n >()\n private readonly programCache = new Map<string, ts.Program>()\n private readonly checkerCache = new Map<string, ts.TypeChecker>()\n private readonly resolverCache = new Map<string, ResolverFactory>()\n\n constructor(\n private readonly entryPath: string,\n private readonly options: BuildDependencyGraphOptions,\n ) {\n const entryConfig: import('./resolver.js').ResolverConfigContext = {\n compilerOptions: options.entryCompilerOptions,\n ...(options.entryConfigPath === undefined\n ? {}\n : { path: options.entryConfigPath }),\n }\n\n this.configCache.set(path.dirname(this.entryPath), entryConfig)\n }\n\n build(): Map<string, SourceModuleNode> {\n this.visitFile(this.entryPath)\n return this.nodes\n }\n\n private visitFile(filePath: string): void {\n const normalizedPath = normalizeFilePath(filePath)\n if (this.nodes.has(normalizedPath)) {\n return\n }\n\n const config = this.getConfigForFile(normalizedPath)\n const program = this.getProgramForFile(normalizedPath, config)\n const checker = this.getCheckerForFile(normalizedPath, config)\n const sourceFile =\n program.getSourceFile(normalizedPath) ?? createSourceFile(normalizedPath)\n\n const references = collectModuleReferences(sourceFile, checker)\n const dependencies = references.map((reference) =>\n resolveDependency(reference, normalizedPath, {\n cwd: this.options.cwd,\n expandWorkspaces: this.options.expandWorkspaces,\n projectOnly: this.options.projectOnly,\n getConfigForFile: (targetPath) => this.getConfigForFile(targetPath),\n getResolverForFile: (targetPath) => this.getResolverForFile(targetPath),\n ...(this.options.entryConfigPath === undefined\n ? {}\n : { entryConfigPath: this.options.entryConfigPath }),\n }),\n )\n\n this.nodes.set(normalizedPath, {\n id: normalizedPath,\n dependencies,\n })\n\n for (const dependency of dependencies) {\n if (dependency.kind === 'source') {\n this.visitFile(dependency.target)\n }\n }\n }\n\n private getConfigForFile(\n filePath: string,\n ): import('./resolver.js').ResolverConfigContext {\n const directory = path.dirname(filePath)\n const cached = this.configCache.get(directory)\n if (cached !== undefined) {\n return cached\n }\n\n const loaded = loadCompilerOptions(directory)\n this.configCache.set(directory, loaded)\n return loaded\n }\n\n private getProgramForFile(\n filePath: string,\n config: import('./resolver.js').ResolverConfigContext,\n ): ts.Program {\n const cacheKey = this.getProgramCacheKey(filePath, config)\n const cached = this.programCache.get(cacheKey)\n if (cached !== undefined) {\n return cached\n }\n\n const currentDirectory =\n config.path === undefined\n ? path.dirname(filePath)\n : path.dirname(config.path)\n const program = createProgram(\n filePath,\n config.compilerOptions,\n currentDirectory,\n )\n this.programCache.set(cacheKey, program)\n return program\n }\n\n private getCheckerForFile(\n filePath: string,\n config: import('./resolver.js').ResolverConfigContext,\n ): ts.TypeChecker {\n const cacheKey = this.getProgramCacheKey(filePath, config)\n const cached = this.checkerCache.get(cacheKey)\n if (cached !== undefined) {\n return cached\n }\n\n const checker = this.getProgramForFile(filePath, config).getTypeChecker()\n this.checkerCache.set(cacheKey, checker)\n return checker\n }\n\n private getProgramCacheKey(\n filePath: string,\n config: import('./resolver.js').ResolverConfigContext,\n ): string {\n return config.path ?? `default:${path.dirname(filePath)}`\n }\n\n private getResolverForFile(filePath: string): ResolverFactory {\n const config = this.getConfigForFile(filePath)\n const cacheKey = this.getProgramCacheKey(filePath, config)\n const cached = this.resolverCache.get(cacheKey)\n if (cached !== undefined) {\n return cached\n }\n\n const resolver = new ResolverFactory({\n builtinModules: true,\n conditionNames: ['import', 'require', 'default'],\n extensions: [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mts',\n '.cts',\n '.mjs',\n '.cjs',\n '.json',\n ],\n mainFields: ['types', 'module', 'main'],\n tsconfig:\n config.path === undefined ? 'auto' : { configFile: config.path },\n })\n this.resolverCache.set(cacheKey, resolver)\n return resolver\n }\n}\n","import path from 'node:path'\n\nimport type { AnalyzeOptions } from '../../types/analyze-options.js'\nimport type { DependencyGraph } from '../../types/dependency-graph.js'\nimport { loadCompilerOptions } from '../../typescript/config.js'\nimport { BaseAnalyzer } from '../base.js'\nimport { resolveExistingPath } from './entry.js'\nimport { buildDependencyGraph } from './graph.js'\n\nexport function analyzeDependencies(\n entryFile: string,\n options: AnalyzeOptions = {},\n): DependencyGraph {\n return new ImportAnalyzer(entryFile, options).analyze()\n}\n\nclass ImportAnalyzer extends BaseAnalyzer<DependencyGraph> {\n private readonly cwd: string\n private readonly entryPath: string\n\n constructor(entryFile: string, options: AnalyzeOptions) {\n super(entryFile, options)\n this.cwd = path.resolve(options.cwd ?? process.cwd())\n this.entryPath = resolveExistingPath(this.cwd, entryFile)\n }\n\n protected doAnalyze(): DependencyGraph {\n const { compilerOptions, path: configPath } = loadCompilerOptions(\n path.dirname(this.entryPath),\n this.options.configPath,\n )\n const nodes = buildDependencyGraph(this.entryPath, {\n cwd: this.cwd,\n entryCompilerOptions: compilerOptions,\n expandWorkspaces: this.options.expandWorkspaces ?? true,\n projectOnly: this.options.projectOnly ?? false,\n ...(configPath === undefined ? {} : { entryConfigPath: configPath }),\n })\n\n return {\n cwd: this.cwd,\n entryId: this.entryPath,\n nodes,\n ...(configPath === undefined ? {} : { configPath }),\n }\n }\n}\n","import type {\n ExportAllDeclaration,\n ExportDefaultDeclaration,\n ExportNamedDeclaration,\n ImportDeclaration,\n ImportDeclarationSpecifier,\n ModuleExportName,\n Statement,\n} from 'oxc-parser'\n\nimport type { PendingReactUsageNode } from './file.js'\n\nexport interface ImportBinding {\n readonly importedName: string\n readonly sourceSpecifier: string\n readonly sourcePath?: string\n}\n\nexport function collectImportsAndExports(\n statement: Statement,\n sourceDependencies: ReadonlyMap<string, string>,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n importsByLocalName: Map<string, ImportBinding>,\n exportsByName: Map<string, string>,\n reExportBindingsByName: Map<string, ImportBinding>,\n exportAllBindings: ImportBinding[],\n): void {\n switch (statement.type) {\n case 'ImportDeclaration':\n collectImportBindings(statement, sourceDependencies, importsByLocalName)\n return\n case 'ExportNamedDeclaration':\n collectNamedExports(\n statement,\n sourceDependencies,\n symbolsByName,\n exportsByName,\n reExportBindingsByName,\n )\n return\n case 'ExportAllDeclaration':\n collectExportAllBindings(statement, sourceDependencies, exportAllBindings)\n return\n case 'ExportDefaultDeclaration':\n collectDefaultExport(statement, symbolsByName, exportsByName)\n return\n default:\n return\n }\n}\n\nfunction collectImportBindings(\n declaration: ImportDeclaration,\n sourceDependencies: ReadonlyMap<string, string>,\n importsByLocalName: Map<string, ImportBinding>,\n): void {\n if (declaration.importKind === 'type') {\n return\n }\n\n const sourceSpecifier = declaration.source.value\n const sourcePath = sourceDependencies.get(declaration.source.value)\n\n declaration.specifiers.forEach((specifier) => {\n const binding = getImportBinding(specifier, sourceSpecifier, sourcePath)\n if (binding === undefined) {\n return\n }\n\n importsByLocalName.set(binding.localName, {\n importedName: binding.importedName,\n sourceSpecifier: binding.sourceSpecifier,\n ...(binding.sourcePath === undefined\n ? {}\n : { sourcePath: binding.sourcePath }),\n })\n })\n}\n\nfunction getImportBinding(\n specifier: ImportDeclarationSpecifier,\n sourceSpecifier: string,\n sourcePath: string | undefined,\n):\n | {\n readonly localName: string\n readonly importedName: string\n readonly sourceSpecifier: string\n readonly sourcePath?: string\n }\n | undefined {\n if (specifier.type === 'ImportSpecifier') {\n if (specifier.importKind === 'type') {\n return undefined\n }\n\n return {\n localName: specifier.local.name,\n importedName: toModuleExportName(specifier.imported),\n sourceSpecifier,\n ...(sourcePath === undefined ? {} : { sourcePath }),\n }\n }\n\n if (specifier.type === 'ImportDefaultSpecifier') {\n return {\n localName: specifier.local.name,\n importedName: 'default',\n sourceSpecifier,\n ...(sourcePath === undefined ? {} : { sourcePath }),\n }\n }\n\n return undefined\n}\n\nfunction collectNamedExports(\n declaration: ExportNamedDeclaration,\n sourceDependencies: ReadonlyMap<string, string>,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n exportsByName: Map<string, string>,\n reExportBindingsByName: Map<string, ImportBinding>,\n): void {\n if (declaration.exportKind === 'type') {\n return\n }\n\n if (declaration.declaration !== null) {\n if (declaration.declaration.type === 'FunctionDeclaration') {\n const name = declaration.declaration.id?.name\n if (name !== undefined) {\n addExportBinding(name, name, symbolsByName, exportsByName)\n }\n } else if (declaration.declaration.type === 'VariableDeclaration') {\n declaration.declaration.declarations.forEach((declarator) => {\n if (declarator.id.type === 'Identifier') {\n addExportBinding(\n declarator.id.name,\n declarator.id.name,\n symbolsByName,\n exportsByName,\n )\n }\n })\n }\n\n return\n }\n\n if (declaration.source !== null) {\n const sourceSpecifier = declaration.source.value\n const sourcePath = sourceDependencies.get(sourceSpecifier)\n\n declaration.specifiers.forEach((specifier) => {\n if (specifier.exportKind === 'type') {\n return\n }\n\n reExportBindingsByName.set(toModuleExportName(specifier.exported), {\n importedName: toModuleExportName(specifier.local),\n sourceSpecifier,\n ...(sourcePath === undefined ? {} : { sourcePath }),\n })\n })\n return\n }\n\n declaration.specifiers.forEach((specifier) => {\n if (specifier.exportKind === 'type') {\n return\n }\n\n const localName = toModuleExportName(specifier.local)\n const exportedName = toModuleExportName(specifier.exported)\n addExportBinding(localName, exportedName, symbolsByName, exportsByName)\n })\n}\n\nfunction collectExportAllBindings(\n declaration: ExportAllDeclaration,\n sourceDependencies: ReadonlyMap<string, string>,\n exportAllBindings: ImportBinding[],\n): void {\n if (declaration.exportKind === 'type') {\n return\n }\n\n const sourceSpecifier = declaration.source.value\n const sourcePath = sourceDependencies.get(sourceSpecifier)\n\n exportAllBindings.push({\n importedName: '*',\n sourceSpecifier,\n ...(sourcePath === undefined ? {} : { sourcePath }),\n })\n}\n\nfunction collectDefaultExport(\n declaration: ExportDefaultDeclaration,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n exportsByName: Map<string, string>,\n): void {\n if (\n declaration.declaration.type === 'FunctionDeclaration' ||\n declaration.declaration.type === 'FunctionExpression'\n ) {\n const localName = declaration.declaration.id?.name\n if (localName !== undefined) {\n addExportBinding(localName, 'default', symbolsByName, exportsByName)\n }\n return\n }\n\n if (declaration.declaration.type === 'Identifier') {\n addExportBinding(\n declaration.declaration.name,\n 'default',\n symbolsByName,\n exportsByName,\n )\n return\n }\n\n if (declaration.declaration.type === 'ArrowFunctionExpression') {\n addExportBinding('default', 'default', symbolsByName, exportsByName)\n }\n}\n\nfunction addExportBinding(\n localName: string,\n exportedName: string,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n exportsByName: Map<string, string>,\n): void {\n const symbol = symbolsByName.get(localName)\n if (symbol === undefined) {\n return\n }\n\n symbol.exportNames.add(exportedName)\n exportsByName.set(exportedName, symbol.id)\n}\n\nfunction toModuleExportName(name: ModuleExportName): string {\n return name.type === 'Literal' ? name.value : name.name\n}\n","import type {\n ArrowFunctionExpression,\n CallExpression,\n Expression,\n FunctionBody,\n JSXElement,\n JSXElementName,\n JSXFragment,\n Node,\n TaggedTemplateExpression,\n} from 'oxc-parser'\nimport { visitorKeys } from 'oxc-parser'\n\nexport const FUNCTION_NODE_TYPES = new Set([\n 'FunctionDeclaration',\n 'FunctionExpression',\n 'ArrowFunctionExpression',\n 'TSDeclareFunction',\n 'TSEmptyBodyFunctionExpression',\n])\n\nexport function walkReactUsageTree(\n root: FunctionBody | Expression | JSXFragment | JSXElement,\n visit: (node: Node) => void,\n): void {\n walkNode(root, visit, true)\n}\n\nexport function walkNode(\n node: Node,\n visit: (node: Node) => void,\n allowNestedFunctions = false,\n): void {\n visit(node)\n\n const keys = visitorKeys[node.type]\n if (keys === undefined) {\n return\n }\n\n keys.forEach((key) => {\n const value = (node as unknown as Record<string, unknown>)[key]\n walkChild(value, visit, allowNestedFunctions)\n })\n}\n\nfunction walkChild(\n value: unknown,\n visit: (node: Node) => void,\n allowNestedFunctions: boolean,\n): void {\n if (Array.isArray(value)) {\n value.forEach((entry) => {\n walkChild(entry, visit, allowNestedFunctions)\n })\n return\n }\n\n if (!isNode(value)) {\n return\n }\n\n if (!allowNestedFunctions && FUNCTION_NODE_TYPES.has(value.type)) {\n return\n }\n\n walkNode(value, visit, false)\n}\n\nexport function isNode(value: unknown): value is Node {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n typeof (value as { type: unknown }).type === 'string'\n )\n}\n\nexport function classifyReactSymbol(\n name: string,\n declaration:\n | ArrowFunctionExpression\n | import('oxc-parser').Function\n | Expression,\n): import('../../types/react-symbol-kind.js').ReactSymbolKind | undefined {\n if (isHookName(name) && isFunctionLikeDeclaration(declaration)) {\n return 'hook'\n }\n\n if (\n isComponentName(name) &&\n ((isFunctionLikeDeclaration(declaration) &&\n returnsReactElement(declaration)) ||\n isStyledComponentDeclaration(declaration))\n ) {\n return 'component'\n }\n\n return undefined\n}\n\nexport function containsReactElementLikeExpression(\n expression: Expression,\n): boolean {\n let found = false\n\n walkNode(expression, (node) => {\n if (\n node.type === 'JSXElement' ||\n node.type === 'JSXFragment' ||\n (node.type === 'CallExpression' && isReactCreateElementCall(node))\n ) {\n found = true\n }\n })\n\n return found\n}\n\nexport function getComponentReferenceName(\n node: JSXElement,\n): string | undefined {\n const name = getJsxName(node.openingElement.name)\n return name !== undefined && isComponentName(name) ? name : undefined\n}\n\nexport function getBuiltinReferenceName(node: JSXElement): string | undefined {\n const name = getJsxName(node.openingElement.name)\n return name !== undefined && isIntrinsicElementName(name) ? name : undefined\n}\n\nexport function getHookReferenceName(node: CallExpression): string | undefined {\n const calleeName = getIdentifierName(node.callee)\n return calleeName !== undefined && isHookName(calleeName)\n ? calleeName\n : undefined\n}\n\nexport function getCreateElementComponentReferenceName(\n node: CallExpression,\n): string | undefined {\n if (!isReactCreateElementCall(node)) {\n return undefined\n }\n\n const [firstArgument] = node.arguments\n if (firstArgument === undefined || firstArgument.type !== 'Identifier') {\n return undefined\n }\n\n return isComponentName(firstArgument.name) ? firstArgument.name : undefined\n}\n\nexport function getStyledComponentReferenceName(\n node: CallExpression | TaggedTemplateExpression,\n): string | undefined {\n const reference = getStyledFactoryReference(\n node.type === 'CallExpression' ? node.callee : node.tag,\n )\n\n return reference?.kind === 'component' ? reference.name : undefined\n}\n\nexport function getStyledBuiltinReferenceName(\n node: CallExpression | TaggedTemplateExpression,\n): string | undefined {\n const reference = getStyledFactoryReference(\n node.type === 'CallExpression' ? node.callee : node.tag,\n )\n\n return reference?.kind === 'builtin' ? reference.name : undefined\n}\n\nexport function isHookName(name: string): boolean {\n return /^use[A-Z0-9]/.test(name)\n}\n\nexport function isComponentName(name: string): boolean {\n return /^[A-Z]/.test(name)\n}\n\nfunction isIntrinsicElementName(name: string): boolean {\n return /^[a-z]/.test(name)\n}\n\nfunction isFunctionLikeDeclaration(\n declaration:\n | ArrowFunctionExpression\n | import('oxc-parser').Function\n | Expression,\n): declaration is ArrowFunctionExpression | import('oxc-parser').Function {\n return (\n declaration.type === 'ArrowFunctionExpression' ||\n declaration.type === 'FunctionDeclaration' ||\n declaration.type === 'FunctionExpression'\n )\n}\n\nfunction returnsReactElement(\n declaration: ArrowFunctionExpression | import('oxc-parser').Function,\n): boolean {\n if (\n declaration.type === 'ArrowFunctionExpression' &&\n declaration.expression\n ) {\n return containsReactElementLikeExpression(declaration.body as Expression)\n }\n\n const body = declaration.body\n if (body === null) {\n return false\n }\n\n let found = false\n walkReactUsageTree(body, (node) => {\n if (node.type !== 'ReturnStatement' || node.argument === null) {\n return\n }\n\n if (containsReactElementLikeExpression(node.argument)) {\n found = true\n }\n })\n\n return found\n}\n\nfunction isStyledComponentDeclaration(expression: Expression): boolean {\n if (expression.type === 'CallExpression') {\n return getStyledFactoryReference(expression.callee) !== undefined\n }\n\n if (expression.type === 'TaggedTemplateExpression') {\n return getStyledFactoryReference(expression.tag) !== undefined\n }\n\n return false\n}\n\nfunction getStyledFactoryReference(expression: Expression):\n | {\n readonly kind: 'builtin' | 'component'\n readonly name: string\n }\n | undefined {\n const unwrapped = unwrapExpression(expression)\n\n if (unwrapped.type === 'MemberExpression' && !unwrapped.computed) {\n if (\n unwrapped.object.type !== 'Identifier' ||\n unwrapped.object.name !== 'styled' ||\n unwrapped.property.type !== 'Identifier'\n ) {\n return undefined\n }\n\n const name = unwrapped.property.name\n if (isIntrinsicElementName(name)) {\n return {\n kind: 'builtin',\n name,\n }\n }\n\n if (isComponentName(name)) {\n return {\n kind: 'component',\n name,\n }\n }\n\n return undefined\n }\n\n if (unwrapped.type !== 'CallExpression') {\n return undefined\n }\n\n const callee = unwrapExpression(unwrapped.callee)\n if (callee.type !== 'Identifier' || callee.name !== 'styled') {\n return undefined\n }\n\n const [firstArgument] = unwrapped.arguments\n if (firstArgument?.type !== 'Identifier') {\n return undefined\n }\n\n return isComponentName(firstArgument.name)\n ? {\n kind: 'component',\n name: firstArgument.name,\n }\n : undefined\n}\n\nfunction isReactCreateElementCall(node: CallExpression): boolean {\n const callee = unwrapExpression(node.callee)\n if (callee.type !== 'MemberExpression' || callee.computed) {\n return false\n }\n\n return (\n callee.object.type === 'Identifier' &&\n callee.object.name === 'React' &&\n callee.property.name === 'createElement'\n )\n}\n\nfunction getJsxName(name: JSXElementName): string | undefined {\n if (name.type === 'JSXIdentifier') {\n return name.name\n }\n\n return undefined\n}\n\nfunction getIdentifierName(expression: Expression): string | undefined {\n const unwrapped = unwrapExpression(expression)\n return unwrapped.type === 'Identifier' ? unwrapped.name : undefined\n}\n\nfunction unwrapExpression(expression: Expression): Expression {\n let current = expression\n\n while (true) {\n if (\n current.type === 'ParenthesizedExpression' ||\n current.type === 'TSAsExpression' ||\n current.type === 'TSSatisfiesExpression' ||\n current.type === 'TSTypeAssertion' ||\n current.type === 'TSNonNullExpression'\n ) {\n current = current.expression\n continue\n }\n\n return current\n }\n}\n","import type { Node, Program, Statement } from 'oxc-parser'\nimport { visitorKeys } from 'oxc-parser'\n\nimport type { ReactSymbolKind } from '../../types/react-symbol-kind.js'\nimport type { ReactUsageLocation } from '../../types/react-usage-location.js'\nimport {\n FUNCTION_NODE_TYPES,\n getBuiltinReferenceName,\n getComponentReferenceName,\n getCreateElementComponentReferenceName,\n getHookReferenceName,\n isNode,\n} from './walk.js'\n\nexport interface PendingReactUsageEntry {\n readonly referenceName: string\n readonly kind: ReactSymbolKind\n readonly location: ReactUsageLocation\n}\n\nexport function collectEntryUsages(\n program: Program,\n filePath: string,\n sourceText: string,\n includeBuiltins: boolean,\n): PendingReactUsageEntry[] {\n const entries = new Map<string, PendingReactUsageEntry>()\n\n program.body.forEach((statement) => {\n collectStatementEntryUsages(\n statement,\n filePath,\n sourceText,\n entries,\n includeBuiltins,\n )\n })\n\n return [...entries.values()].sort(comparePendingReactUsageEntries)\n}\n\nfunction collectStatementEntryUsages(\n statement: Statement,\n filePath: string,\n sourceText: string,\n entries: Map<string, PendingReactUsageEntry>,\n includeBuiltins: boolean,\n): void {\n collectNodeEntryUsages(\n statement,\n filePath,\n sourceText,\n entries,\n includeBuiltins,\n false,\n )\n}\n\nfunction collectNodeEntryUsages(\n node: Node,\n filePath: string,\n sourceText: string,\n entries: Map<string, PendingReactUsageEntry>,\n includeBuiltins: boolean,\n hasComponentAncestor: boolean,\n): void {\n if (FUNCTION_NODE_TYPES.has(node.type)) {\n return\n }\n\n let nextHasComponentAncestor = hasComponentAncestor\n\n if (node.type === 'JSXElement') {\n const referenceName = getComponentReferenceName(node)\n if (referenceName !== undefined) {\n if (!hasComponentAncestor) {\n addPendingReactUsageEntry(\n entries,\n referenceName,\n 'component',\n createReactUsageLocation(filePath, sourceText, node.start),\n )\n }\n nextHasComponentAncestor = true\n } else if (includeBuiltins) {\n const builtinName = getBuiltinReferenceName(node)\n if (builtinName !== undefined) {\n if (!hasComponentAncestor) {\n addPendingReactUsageEntry(\n entries,\n builtinName,\n 'builtin',\n createReactUsageLocation(filePath, sourceText, node.start),\n )\n }\n nextHasComponentAncestor = true\n }\n }\n } else if (node.type === 'CallExpression') {\n const hookReference = getHookReferenceName(node)\n if (hookReference !== undefined) {\n addPendingReactUsageEntry(\n entries,\n hookReference,\n 'hook',\n createReactUsageLocation(filePath, sourceText, node.start),\n )\n }\n\n const referenceName = getCreateElementComponentReferenceName(node)\n if (referenceName !== undefined) {\n if (!hasComponentAncestor) {\n addPendingReactUsageEntry(\n entries,\n referenceName,\n 'component',\n createReactUsageLocation(filePath, sourceText, node.start),\n )\n }\n nextHasComponentAncestor = true\n }\n }\n\n const keys = visitorKeys[node.type]\n if (keys === undefined) {\n return\n }\n\n keys.forEach((key) => {\n const value = (node as unknown as Record<string, unknown>)[key]\n collectEntryUsageChild(\n value,\n filePath,\n sourceText,\n entries,\n includeBuiltins,\n nextHasComponentAncestor,\n )\n })\n}\n\nfunction collectEntryUsageChild(\n value: unknown,\n filePath: string,\n sourceText: string,\n entries: Map<string, PendingReactUsageEntry>,\n includeBuiltins: boolean,\n hasComponentAncestor: boolean,\n): void {\n if (Array.isArray(value)) {\n value.forEach((entry) => {\n collectEntryUsageChild(\n entry,\n filePath,\n sourceText,\n entries,\n includeBuiltins,\n hasComponentAncestor,\n )\n })\n return\n }\n\n if (!isNode(value)) {\n return\n }\n\n collectNodeEntryUsages(\n value,\n filePath,\n sourceText,\n entries,\n includeBuiltins,\n hasComponentAncestor,\n )\n}\n\nfunction addPendingReactUsageEntry(\n entries: Map<string, PendingReactUsageEntry>,\n referenceName: string,\n kind: ReactSymbolKind,\n location: ReactUsageLocation,\n): void {\n const key = `${location.filePath}:${location.line}:${location.column}:${kind}:${referenceName}`\n entries.set(key, {\n referenceName,\n kind,\n location,\n })\n}\n\nexport function createReactUsageLocation(\n filePath: string,\n sourceText: string,\n offset: number,\n): ReactUsageLocation {\n return {\n filePath,\n ...offsetToLineAndColumn(sourceText, offset),\n }\n}\n\nfunction offsetToLineAndColumn(\n sourceText: string,\n offset: number,\n): Pick<ReactUsageLocation, 'line' | 'column'> {\n let line = 1\n let column = 1\n\n for (let index = 0; index < offset && index < sourceText.length; index += 1) {\n if (sourceText[index] === '\\n') {\n line += 1\n column = 1\n continue\n }\n\n column += 1\n }\n\n return { line, column }\n}\n\nfunction comparePendingReactUsageEntries(\n left: PendingReactUsageEntry,\n right: PendingReactUsageEntry,\n): number {\n return (\n left.location.filePath.localeCompare(right.location.filePath) ||\n left.location.line - right.location.line ||\n left.location.column - right.location.column ||\n left.kind.localeCompare(right.kind) ||\n left.referenceName.localeCompare(right.referenceName)\n )\n}\n","import type {\n ArrowFunctionExpression,\n ExportDefaultDeclaration,\n Expression,\n FunctionBody,\n JSXElement,\n JSXFragment,\n Function as OxcFunction,\n Statement,\n VariableDeclarator,\n} from 'oxc-parser'\n\nimport type { ReactSymbolKind } from '../../types/react-symbol-kind.js'\nimport type { PendingReactUsageNode } from './file.js'\nimport { classifyReactSymbol } from './walk.js'\n\nexport function collectTopLevelReactSymbols(\n statement: Statement,\n filePath: string,\n symbolsByName: Map<string, PendingReactUsageNode>,\n): void {\n switch (statement.type) {\n case 'FunctionDeclaration':\n addFunctionSymbol(statement, filePath, symbolsByName)\n return\n case 'VariableDeclaration':\n statement.declarations.forEach((declarator) => {\n addVariableSymbol(declarator, filePath, symbolsByName)\n })\n return\n case 'ExportNamedDeclaration':\n if (statement.declaration !== null) {\n collectTopLevelReactSymbols(\n statement.declaration,\n filePath,\n symbolsByName,\n )\n }\n return\n case 'ExportDefaultDeclaration':\n addDefaultExportSymbol(statement, filePath, symbolsByName)\n return\n default:\n return\n }\n}\n\nexport function collectTopLevelDynamicComponentCandidates(\n statement: Statement,\n filePath: string,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n dynamicComponentCandidatesByName: Map<string, PendingReactUsageNode>,\n): void {\n switch (statement.type) {\n case 'VariableDeclaration':\n statement.declarations.forEach((declarator) => {\n addDynamicComponentCandidate(\n declarator,\n filePath,\n symbolsByName,\n dynamicComponentCandidatesByName,\n )\n })\n return\n case 'ExportNamedDeclaration':\n if (statement.declaration !== null) {\n collectTopLevelDynamicComponentCandidates(\n statement.declaration,\n filePath,\n symbolsByName,\n dynamicComponentCandidatesByName,\n )\n }\n return\n default:\n return\n }\n}\n\nfunction addFunctionSymbol(\n declaration: OxcFunction,\n filePath: string,\n symbolsByName: Map<string, PendingReactUsageNode>,\n): void {\n const name = declaration.id?.name\n if (name === undefined) {\n return\n }\n\n const kind = classifyReactSymbol(name, declaration)\n if (kind === undefined) {\n return\n }\n\n symbolsByName.set(\n name,\n createPendingSymbol(\n filePath,\n name,\n kind,\n declaration.id?.start ?? declaration.start,\n getAnalysisRoot(declaration),\n ),\n )\n}\n\nfunction addVariableSymbol(\n declarator: VariableDeclarator,\n filePath: string,\n symbolsByName: Map<string, PendingReactUsageNode>,\n): void {\n if (declarator.id.type !== 'Identifier' || declarator.init === null) {\n return\n }\n\n const name = declarator.id.name\n const kind = classifyReactSymbol(name, declarator.init)\n if (kind === undefined) {\n return\n }\n\n symbolsByName.set(\n name,\n createPendingSymbol(\n filePath,\n name,\n kind,\n declarator.init.start,\n getAnalysisRoot(declarator.init),\n ),\n )\n}\n\nfunction addDefaultExportSymbol(\n declaration: ExportDefaultDeclaration,\n filePath: string,\n symbolsByName: Map<string, PendingReactUsageNode>,\n): void {\n if (\n declaration.declaration.type === 'FunctionDeclaration' ||\n declaration.declaration.type === 'FunctionExpression'\n ) {\n addFunctionSymbol(declaration.declaration, filePath, symbolsByName)\n } else if (declaration.declaration.type === 'ArrowFunctionExpression') {\n const name = 'default'\n const kind = declaration.declaration.body\n ? classifyReactSymbol(name, declaration.declaration)\n : undefined\n if (kind !== undefined) {\n symbolsByName.set(\n name,\n createPendingSymbol(\n filePath,\n name,\n kind,\n declaration.declaration.start,\n getAnalysisRoot(declaration.declaration),\n ),\n )\n }\n }\n}\n\nfunction addDynamicComponentCandidate(\n declarator: VariableDeclarator,\n filePath: string,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n dynamicComponentCandidatesByName: Map<string, PendingReactUsageNode>,\n): void {\n if (declarator.id.type !== 'Identifier' || declarator.init === null) {\n return\n }\n\n const name = declarator.id.name\n if (\n !isPotentialDynamicComponentName(name) ||\n symbolsByName.has(name) ||\n !isDynamicComponentInitializer(declarator.init)\n ) {\n return\n }\n\n dynamicComponentCandidatesByName.set(\n name,\n createPendingSymbol(\n filePath,\n name,\n 'component',\n declarator.init.start,\n getAnalysisRoot(declarator.init),\n ),\n )\n}\n\nfunction createPendingSymbol(\n filePath: string,\n name: string,\n kind: ReactSymbolKind,\n declarationOffset: number,\n analysisRoot: FunctionBody | Expression | JSXFragment | JSXElement,\n): PendingReactUsageNode {\n return {\n id: `${filePath}#${kind}:${name}`,\n name,\n kind,\n filePath,\n declarationOffset,\n analysisRoot,\n exportNames: new Set<string>(),\n componentReferences: new Set<string>(),\n hookReferences: new Set<string>(),\n builtinReferences: new Set<string>(),\n }\n}\n\nfunction getAnalysisRoot(\n declaration: OxcFunction | ArrowFunctionExpression | Expression,\n): FunctionBody | Expression | JSXFragment | JSXElement {\n if (\n declaration.type === 'FunctionDeclaration' ||\n declaration.type === 'FunctionExpression'\n ) {\n if (declaration.body === null) {\n throw new Error(\n `Expected React symbol \"${declaration.id?.name ?? 'anonymous'}\" to have a body.`,\n )\n }\n\n return declaration.body\n }\n\n if (declaration.type === 'ArrowFunctionExpression') {\n return declaration.body\n }\n\n return declaration\n}\n\nfunction isDynamicComponentInitializer(expression: Expression): boolean {\n return (\n expression.type === 'CallExpression' ||\n expression.type === 'TaggedTemplateExpression'\n )\n}\n\nfunction isPotentialDynamicComponentName(name: string): boolean {\n return /^[A-Z][A-Za-z0-9]*$/.test(name)\n}\n","import type { PendingReactUsageNode } from './file.js'\nimport {\n getBuiltinReferenceName,\n getComponentReferenceName,\n getCreateElementComponentReferenceName,\n getHookReferenceName,\n getStyledBuiltinReferenceName,\n getStyledComponentReferenceName,\n walkReactUsageTree,\n} from './walk.js'\n\nexport function analyzeSymbolUsages(\n symbol: PendingReactUsageNode,\n includeBuiltins: boolean,\n): void {\n walkReactUsageTree(symbol.analysisRoot, (node) => {\n if (node.type === 'JSXElement') {\n const name = getComponentReferenceName(node)\n if (name !== undefined) {\n symbol.componentReferences.add(name)\n }\n\n if (includeBuiltins) {\n const builtinName = getBuiltinReferenceName(node)\n if (builtinName !== undefined) {\n symbol.builtinReferences.add(builtinName)\n }\n }\n return\n }\n\n if (node.type === 'CallExpression') {\n const hookReference = getHookReferenceName(node)\n if (hookReference !== undefined) {\n symbol.hookReferences.add(hookReference)\n }\n\n const componentReference = getCreateElementComponentReferenceName(node)\n if (componentReference !== undefined) {\n symbol.componentReferences.add(componentReference)\n }\n\n const styledComponentReference = getStyledComponentReferenceName(node)\n if (styledComponentReference !== undefined) {\n symbol.componentReferences.add(styledComponentReference)\n }\n\n if (includeBuiltins) {\n const styledBuiltinReference = getStyledBuiltinReferenceName(node)\n if (styledBuiltinReference !== undefined) {\n symbol.builtinReferences.add(styledBuiltinReference)\n }\n }\n }\n\n if (node.type === 'TaggedTemplateExpression') {\n const styledComponentReference = getStyledComponentReferenceName(node)\n if (styledComponentReference !== undefined) {\n symbol.componentReferences.add(styledComponentReference)\n }\n\n if (includeBuiltins) {\n const styledBuiltinReference = getStyledBuiltinReferenceName(node)\n if (styledBuiltinReference !== undefined) {\n symbol.builtinReferences.add(styledBuiltinReference)\n }\n }\n }\n })\n}\n","import type {\n Expression,\n FunctionBody,\n JSXElement,\n JSXFragment,\n Program,\n} from 'oxc-parser'\n\nimport type { ReactSymbolKind } from '../../types/react-symbol-kind.js'\nimport type { ImportBinding } from './bindings.js'\nimport { collectImportsAndExports } from './bindings.js'\nimport type { PendingReactUsageEntry } from './entries.js'\nimport { collectEntryUsages, createReactUsageLocation } from './entries.js'\nimport {\n collectTopLevelDynamicComponentCandidates,\n collectTopLevelReactSymbols,\n} from './symbols.js'\nimport { analyzeSymbolUsages } from './usage.js'\n\nexport interface PendingReactUsageNode {\n readonly id: string\n readonly name: string\n readonly kind: ReactSymbolKind\n readonly filePath: string\n readonly declarationOffset: number\n readonly analysisRoot: FunctionBody | Expression | JSXFragment | JSXElement\n readonly exportNames: Set<string>\n readonly componentReferences: Set<string>\n readonly hookReferences: Set<string>\n readonly builtinReferences: Set<string>\n}\n\nexport interface FileAnalysis {\n readonly filePath: string\n readonly importsByLocalName: Map<string, ImportBinding>\n readonly exportsByName: Map<string, string>\n readonly reExportBindingsByName: Map<string, ImportBinding>\n readonly exportAllBindings: readonly ImportBinding[]\n readonly entryUsages: readonly PendingReactUsageEntry[]\n readonly allSymbolsById: Map<string, PendingReactUsageNode>\n readonly allSymbolsByName: Map<string, PendingReactUsageNode>\n readonly symbolsById: Map<string, PendingReactUsageNode>\n readonly symbolsByName: Map<string, PendingReactUsageNode>\n}\n\nexport function analyzeReactFile(\n program: Program,\n filePath: string,\n sourceText: string,\n includeNestedRenderEntries: boolean,\n sourceDependencies: ReadonlyMap<string, string>,\n includeBuiltins: boolean,\n): FileAnalysis {\n const symbolsByName = new Map<string, PendingReactUsageNode>()\n const dynamicComponentCandidatesByName = new Map<\n string,\n PendingReactUsageNode\n >()\n\n program.body.forEach((statement) => {\n collectTopLevelReactSymbols(statement, filePath, symbolsByName)\n })\n program.body.forEach((statement) => {\n collectTopLevelDynamicComponentCandidates(\n statement,\n filePath,\n symbolsByName,\n dynamicComponentCandidatesByName,\n )\n })\n\n const allSymbolsByName = new Map<string, PendingReactUsageNode>([\n ...dynamicComponentCandidatesByName,\n ...symbolsByName,\n ])\n\n const importsByLocalName = new Map<string, ImportBinding>()\n const exportsByName = new Map<string, string>()\n const reExportBindingsByName = new Map<string, ImportBinding>()\n const exportAllBindings: ImportBinding[] = []\n const directEntryUsages = includeNestedRenderEntries\n ? collectEntryUsages(program, filePath, sourceText, includeBuiltins)\n : []\n\n program.body.forEach((statement) => {\n collectImportsAndExports(\n statement,\n sourceDependencies,\n allSymbolsByName,\n importsByLocalName,\n exportsByName,\n reExportBindingsByName,\n exportAllBindings,\n )\n })\n\n allSymbolsByName.forEach((symbol) => {\n analyzeSymbolUsages(symbol, includeBuiltins)\n })\n\n const allSymbolsById = new Map(\n [...allSymbolsByName.values()].map((symbol) => [symbol.id, symbol]),\n )\n\n const entryUsages =\n directEntryUsages.length > 0\n ? directEntryUsages\n : includeNestedRenderEntries\n ? collectComponentDeclarationEntryUsages(symbolsByName, sourceText)\n : []\n\n return {\n filePath,\n importsByLocalName,\n exportsByName,\n reExportBindingsByName,\n exportAllBindings,\n entryUsages,\n allSymbolsById,\n allSymbolsByName,\n symbolsById: new Map(\n [...symbolsByName.values()].map((symbol) => [symbol.id, symbol]),\n ),\n symbolsByName,\n }\n}\n\nfunction collectComponentDeclarationEntryUsages(\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n sourceText: string,\n): PendingReactUsageEntry[] {\n const componentSymbols = [...symbolsByName.values()].filter(\n (symbol) => symbol.kind === 'component',\n )\n if (componentSymbols.length === 0) {\n return []\n }\n\n const exportedComponentSymbols = componentSymbols.filter(\n (symbol) => symbol.exportNames.size > 0,\n )\n const fallbackSymbols =\n exportedComponentSymbols.length > 0\n ? exportedComponentSymbols\n : componentSymbols\n\n return fallbackSymbols\n .sort((left, right) => {\n return (\n left.declarationOffset - right.declarationOffset ||\n left.name.localeCompare(right.name)\n )\n })\n .map((symbol) => ({\n referenceName: symbol.name,\n kind: 'component',\n location: createReactUsageLocation(\n symbol.filePath,\n sourceText,\n symbol.declarationOffset,\n ),\n }))\n}\n","import type { ReactSymbolKind } from '../../types/react-symbol-kind.js'\nimport type { ReactUsageEntry } from '../../types/react-usage-entry.js'\nimport type { ReactUsageNode } from '../../types/react-usage-node.js'\nimport type { ImportBinding } from './bindings.js'\nimport type { FileAnalysis } from './file.js'\nimport { isHookName } from './walk.js'\n\nexport function resolveReactReference(\n fileAnalysis: FileAnalysis,\n fileAnalyses: ReadonlyMap<string, FileAnalysis>,\n name: string,\n kind: ReactSymbolKind,\n): string | undefined {\n if (kind === 'builtin') {\n return getBuiltinNodeId(name)\n }\n\n const localSymbol = fileAnalysis.allSymbolsByName.get(name)\n if (localSymbol !== undefined && localSymbol.kind === kind) {\n return localSymbol.id\n }\n\n const importBinding = fileAnalysis.importsByLocalName.get(name)\n if (importBinding === undefined) {\n return undefined\n }\n\n if (importBinding.sourcePath === undefined) {\n return kind === 'hook'\n ? getExternalHookNodeId(importBinding, name)\n : undefined\n }\n\n const sourceFileAnalysis = fileAnalyses.get(importBinding.sourcePath)\n if (sourceFileAnalysis === undefined) {\n return undefined\n }\n\n const targetId = resolveExportedSymbol(\n sourceFileAnalysis,\n importBinding.importedName,\n kind,\n fileAnalyses,\n new Set<string>(),\n )\n if (targetId === undefined) {\n return undefined\n }\n\n return targetId\n}\n\nfunction resolveExportedSymbol(\n fileAnalysis: FileAnalysis,\n exportName: string,\n kind: ReactSymbolKind,\n fileAnalyses: ReadonlyMap<string, FileAnalysis>,\n visited: Set<string>,\n): string | undefined {\n const visitKey = `${fileAnalysis.filePath}:${exportName}:${kind}`\n if (visited.has(visitKey)) {\n return undefined\n }\n\n visited.add(visitKey)\n\n const directTargetId = fileAnalysis.exportsByName.get(exportName)\n if (directTargetId !== undefined) {\n const directTargetSymbol = fileAnalysis.allSymbolsById.get(directTargetId)\n if (directTargetSymbol?.kind === kind) {\n return directTargetId\n }\n }\n\n const reExportBinding = fileAnalysis.reExportBindingsByName.get(exportName)\n if (reExportBinding?.sourcePath !== undefined) {\n const reExportSourceAnalysis = fileAnalyses.get(reExportBinding.sourcePath)\n if (reExportSourceAnalysis !== undefined) {\n const reExportTargetId = resolveExportedSymbol(\n reExportSourceAnalysis,\n reExportBinding.importedName,\n kind,\n fileAnalyses,\n visited,\n )\n if (reExportTargetId !== undefined) {\n return reExportTargetId\n }\n }\n }\n\n for (const exportAllBinding of fileAnalysis.exportAllBindings) {\n if (exportAllBinding.sourcePath === undefined) {\n continue\n }\n\n const exportAllSourceAnalysis = fileAnalyses.get(\n exportAllBinding.sourcePath,\n )\n if (exportAllSourceAnalysis === undefined) {\n continue\n }\n\n const exportAllTargetId = resolveExportedSymbol(\n exportAllSourceAnalysis,\n exportName,\n kind,\n fileAnalyses,\n visited,\n )\n if (exportAllTargetId !== undefined) {\n return exportAllTargetId\n }\n }\n\n return undefined\n}\n\nexport function addExternalHookNodes(\n fileAnalyses: ReadonlyMap<string, FileAnalysis>,\n nodes: Map<string, ReactUsageNode>,\n): void {\n for (const fileAnalysis of fileAnalyses.values()) {\n fileAnalysis.importsByLocalName.forEach((binding, localName) => {\n if (binding.sourcePath !== undefined) {\n return\n }\n\n if (!isHookName(localName) && !isHookName(binding.importedName)) {\n return\n }\n\n const externalNode = createExternalHookNode(binding, localName)\n if (!nodes.has(externalNode.id)) {\n nodes.set(externalNode.id, externalNode)\n }\n })\n }\n}\n\nexport function addBuiltinNodes(\n fileAnalyses: ReadonlyMap<string, FileAnalysis>,\n nodes: Map<string, ReactUsageNode>,\n): void {\n for (const fileAnalysis of fileAnalyses.values()) {\n fileAnalysis.entryUsages.forEach((entry) => {\n if (entry.kind !== 'builtin') {\n return\n }\n\n const builtinNode = createBuiltinNode(entry.referenceName)\n if (!nodes.has(builtinNode.id)) {\n nodes.set(builtinNode.id, builtinNode)\n }\n })\n\n fileAnalysis.allSymbolsById.forEach((symbol) => {\n symbol.builtinReferences.forEach((name) => {\n const builtinNode = createBuiltinNode(name)\n if (!nodes.has(builtinNode.id)) {\n nodes.set(builtinNode.id, builtinNode)\n }\n })\n })\n }\n}\n\nfunction createExternalHookNode(\n binding: ImportBinding,\n localName: string,\n): ReactUsageNode {\n const name = getExternalHookName(binding, localName)\n\n return {\n id: getExternalHookNodeId(binding, localName),\n name,\n kind: 'hook',\n filePath: binding.sourceSpecifier,\n exportNames: [binding.importedName],\n usages: [],\n }\n}\n\nfunction createBuiltinNode(name: string): ReactUsageNode {\n return {\n id: getBuiltinNodeId(name),\n name,\n kind: 'builtin',\n filePath: 'html',\n exportNames: [],\n usages: [],\n }\n}\n\nfunction getExternalHookNodeId(\n binding: ImportBinding,\n localName: string,\n): string {\n return `external:${binding.sourceSpecifier}#hook:${getExternalHookName(binding, localName)}`\n}\n\nexport function getBuiltinNodeId(name: string): string {\n return `builtin:${name}`\n}\n\nfunction getExternalHookName(\n binding: ImportBinding,\n localName: string,\n): string {\n return binding.importedName === 'default' ? localName : binding.importedName\n}\n\nexport function compareReactNodeIds(\n leftId: string,\n rightId: string,\n nodes: ReadonlyMap<string, ReactUsageNode>,\n): number {\n const left = nodes.get(leftId)\n const right = nodes.get(rightId)\n\n if (left === undefined || right === undefined) {\n return leftId.localeCompare(rightId)\n }\n\n return compareReactNodes(left, right)\n}\n\nexport function compareReactUsageEntries(\n left: ReactUsageEntry,\n right: ReactUsageEntry,\n nodes: ReadonlyMap<string, ReactUsageNode>,\n): number {\n return (\n left.location.filePath.localeCompare(right.location.filePath) ||\n left.location.line - right.location.line ||\n left.location.column - right.location.column ||\n left.referenceName.localeCompare(right.referenceName) ||\n compareReactNodeIds(left.target, right.target, nodes)\n )\n}\n\nfunction compareReactNodes(\n left: ReactUsageNode,\n right: ReactUsageNode,\n): number {\n return (\n left.filePath.localeCompare(right.filePath) ||\n left.name.localeCompare(right.name) ||\n left.kind.localeCompare(right.kind)\n )\n}\n","import fs from 'node:fs'\n\nimport { parseSync } from 'oxc-parser'\n\nimport type { AnalyzeOptions } from '../../types/analyze-options.js'\nimport type { DependencyGraph } from '../../types/dependency-graph.js'\nimport type { ReactUsageEdge } from '../../types/react-usage-edge.js'\nimport type { ReactUsageEntry } from '../../types/react-usage-entry.js'\nimport type { ReactUsageGraph } from '../../types/react-usage-graph.js'\nimport type { ReactUsageNode } from '../../types/react-usage-node.js'\nimport type { SourceModuleNode } from '../../types/source-module-node.js'\nimport { isSourceCodeFile } from '../../utils/is-source-code-file.js'\nimport { BaseAnalyzer } from '../base.js'\nimport { analyzeDependencies } from '../import/index.js'\nimport { analyzeReactFile } from './file.js'\nimport {\n addBuiltinNodes,\n addExternalHookNodes,\n compareReactNodeIds,\n compareReactUsageEntries,\n getBuiltinNodeId,\n resolveReactReference,\n} from './references.js'\n\nexport function analyzeReactUsage(\n entryFile: string | readonly string[],\n options: AnalyzeOptions = {},\n): ReactUsageGraph {\n return new ReactAnalyzer(normalizeEntryFiles(entryFile), options).analyze()\n}\n\nclass ReactAnalyzer extends BaseAnalyzer<ReactUsageGraph> {\n constructor(\n private readonly entryFiles: readonly string[],\n options: AnalyzeOptions,\n ) {\n const [firstEntryFile] = entryFiles\n if (firstEntryFile === undefined) {\n throw new Error('At least one React entry file is required.')\n }\n\n super(firstEntryFile, options)\n }\n\n protected doAnalyze(): ReactUsageGraph {\n const dependencyGraphs = this.entryFiles.map((entryFile) =>\n analyzeDependencies(entryFile, this.options),\n )\n const dependencyGraph = mergeDependencyGraphs(dependencyGraphs)\n const entryIds = dependencyGraphs.map((graph) => graph.entryId)\n const fileAnalyses = this.collectFileAnalyses(dependencyGraph)\n const nodes = this.createNodes(fileAnalyses)\n this.attachUsages(fileAnalyses, nodes)\n const entries = this.collectEntries(fileAnalyses, nodes)\n\n return {\n cwd: dependencyGraph.cwd,\n entryId: dependencyGraph.entryId,\n entryIds,\n nodes,\n entries,\n }\n }\n\n private collectFileAnalyses(\n dependencyGraph: MergedDependencyGraph,\n ): Map<string, import('./file.js').FileAnalysis> {\n const reachableFiles = new Set<string>([\n ...dependencyGraph.entryIds,\n ...dependencyGraph.nodes.keys(),\n ])\n const fileAnalyses = new Map<string, import('./file.js').FileAnalysis>()\n\n for (const filePath of [...reachableFiles].sort()) {\n if (!isSourceCodeFile(filePath) || filePath.endsWith('.d.ts')) {\n continue\n }\n\n const sourceText = fs.readFileSync(filePath, 'utf8')\n const parseResult = parseSync(filePath, sourceText, {\n astType: 'ts',\n sourceType: 'unambiguous',\n })\n\n const dependencyNode = dependencyGraph.nodes.get(filePath)\n const sourceDependencies = new Map<string, string>()\n dependencyNode?.dependencies.forEach((dependency) => {\n if (dependency.kind === 'source') {\n sourceDependencies.set(dependency.specifier, dependency.target)\n }\n })\n\n fileAnalyses.set(\n filePath,\n analyzeReactFile(\n parseResult.program,\n filePath,\n sourceText,\n dependencyGraph.entryIds.includes(filePath),\n sourceDependencies,\n this.options.includeBuiltins === true,\n ),\n )\n }\n\n return fileAnalyses\n }\n\n private createNodes(\n fileAnalyses: ReadonlyMap<string, import('./file.js').FileAnalysis>,\n ): Map<string, ReactUsageNode> {\n const nodes = new Map<string, ReactUsageNode>()\n\n for (const fileAnalysis of fileAnalyses.values()) {\n for (const symbol of fileAnalysis.allSymbolsById.values()) {\n nodes.set(symbol.id, {\n id: symbol.id,\n name: symbol.name,\n kind: symbol.kind,\n filePath: symbol.filePath,\n exportNames: [...symbol.exportNames].sort(),\n usages: [],\n })\n }\n }\n\n addExternalHookNodes(fileAnalyses, nodes)\n if (this.options.includeBuiltins === true) {\n addBuiltinNodes(fileAnalyses, nodes)\n }\n return nodes\n }\n\n private attachUsages(\n fileAnalyses: ReadonlyMap<string, import('./file.js').FileAnalysis>,\n nodes: Map<string, ReactUsageNode>,\n ): void {\n for (const fileAnalysis of fileAnalyses.values()) {\n for (const symbol of fileAnalysis.allSymbolsById.values()) {\n const usages = new Map<string, ReactUsageEdge>()\n\n symbol.componentReferences.forEach((referenceName) => {\n const targetId = resolveReactReference(\n fileAnalysis,\n fileAnalyses,\n referenceName,\n 'component',\n )\n if (targetId !== undefined && targetId !== symbol.id) {\n usages.set(`render:${targetId}:${referenceName}`, {\n kind: 'render',\n target: targetId,\n referenceName,\n })\n }\n })\n\n symbol.hookReferences.forEach((referenceName) => {\n const targetId = resolveReactReference(\n fileAnalysis,\n fileAnalyses,\n referenceName,\n 'hook',\n )\n if (targetId !== undefined && targetId !== symbol.id) {\n usages.set(`hook:${targetId}:${referenceName}`, {\n kind: 'hook-call',\n target: targetId,\n referenceName,\n })\n }\n })\n\n if (this.options.includeBuiltins === true) {\n symbol.builtinReferences.forEach((referenceName) => {\n const targetId = getBuiltinNodeId(referenceName)\n usages.set(`render:${targetId}:${referenceName}`, {\n kind: 'render',\n target: targetId,\n referenceName,\n })\n })\n }\n\n const node = nodes.get(symbol.id)\n if (node === undefined) {\n continue\n }\n\n const sortedUsages = [...usages.values()].sort((left, right) =>\n compareReactNodeIds(left.target, right.target, nodes),\n )\n\n nodes.set(symbol.id, {\n ...node,\n usages: sortedUsages,\n })\n }\n }\n }\n\n private collectEntries(\n fileAnalyses: ReadonlyMap<string, import('./file.js').FileAnalysis>,\n nodes: ReadonlyMap<string, ReactUsageNode>,\n ): ReactUsageEntry[] {\n const entriesByKey = new Map<string, ReactUsageEntry>()\n\n for (const fileAnalysis of fileAnalyses.values()) {\n for (const entry of fileAnalysis.entryUsages) {\n const targetId = resolveReactReference(\n fileAnalysis,\n fileAnalyses,\n entry.referenceName,\n entry.kind,\n )\n if (targetId === undefined) {\n continue\n }\n\n const key = `${entry.location.filePath}:${entry.location.line}:${entry.location.column}:${targetId}`\n entriesByKey.set(key, {\n target: targetId,\n referenceName: entry.referenceName,\n location: entry.location,\n })\n }\n }\n\n return [...entriesByKey.values()].sort((left, right) =>\n compareReactUsageEntries(left, right, nodes),\n )\n }\n}\n\nfunction normalizeEntryFiles(entryFile: string | readonly string[]): string[] {\n const entryFiles = Array.isArray(entryFile) ? entryFile : [entryFile]\n const dedupedEntryFiles = [...new Set(entryFiles)]\n\n if (dedupedEntryFiles.length === 0) {\n throw new Error('At least one React entry file is required.')\n }\n\n return dedupedEntryFiles\n}\n\nfunction mergeDependencyGraphs(\n graphs: readonly DependencyGraph[],\n): MergedDependencyGraph {\n const firstGraph = graphs[0]\n if (firstGraph === undefined) {\n throw new Error('At least one dependency graph is required.')\n }\n\n const nodes = new Map<string, SourceModuleNode>()\n for (const graph of graphs) {\n for (const [nodeId, node] of graph.nodes) {\n if (!nodes.has(nodeId)) {\n nodes.set(nodeId, node)\n }\n }\n }\n\n const uniqueConfigPaths = [\n ...new Set(graphs.map((graph) => graph.configPath)),\n ]\n const configPath =\n uniqueConfigPaths.length === 1 ? uniqueConfigPaths[0] : undefined\n\n return {\n cwd: firstGraph.cwd,\n entryId: firstGraph.entryId,\n entryIds: graphs.map((graph) => graph.entryId),\n nodes,\n ...(configPath === undefined ? {} : { configPath }),\n }\n}\n\ninterface MergedDependencyGraph extends DependencyGraph {\n readonly entryIds: readonly string[]\n}\n","import type { ReactUsageEdge } from '../../types/react-usage-edge.js'\nimport type { ReactUsageEntry } from '../../types/react-usage-entry.js'\nimport type { ReactUsageFilter } from '../../types/react-usage-filter.js'\nimport type { ReactUsageGraph } from '../../types/react-usage-graph.js'\nimport type { ReactUsageNode } from '../../types/react-usage-node.js'\nimport { compareReactNodeIds } from './references.js'\n\nexport function getReactUsageEntries(\n graph: ReactUsageGraph,\n filter: ReactUsageFilter = 'all',\n): ReactUsageEntry[] {\n return graph.entries.filter((entry) => {\n const targetNode = graph.nodes.get(entry.target)\n return targetNode !== undefined && matchesReactFilter(targetNode, filter)\n })\n}\n\nexport function getReactUsageRoots(\n graph: ReactUsageGraph,\n filter: ReactUsageFilter = 'all',\n): string[] {\n const entries = getReactUsageEntries(graph, filter)\n if (entries.length > 0) {\n return [...new Set(entries.map((entry) => entry.target))]\n }\n\n const filteredNodes = getFilteredReactUsageNodes(graph, filter)\n const inboundCounts = new Map<string, number>()\n\n filteredNodes.forEach((node) => {\n inboundCounts.set(node.id, 0)\n })\n\n filteredNodes.forEach((node) => {\n getFilteredUsages(node, graph, filter).forEach((usage) => {\n inboundCounts.set(\n usage.target,\n (inboundCounts.get(usage.target) ?? 0) + 1,\n )\n })\n })\n\n const roots = filteredNodes\n .filter((node) => (inboundCounts.get(node.id) ?? 0) === 0)\n .map((node) => node.id)\n\n if (roots.length > 0) {\n return roots.sort((left, right) =>\n compareReactNodeIds(left, right, graph.nodes),\n )\n }\n\n return filteredNodes\n .map((node) => node.id)\n .sort((left, right) => compareReactNodeIds(left, right, graph.nodes))\n}\n\nexport function getFilteredUsages(\n node: ReactUsageNode,\n graph: ReactUsageGraph,\n filter: ReactUsageFilter = 'all',\n): ReactUsageEdge[] {\n return node.usages.filter((usage) => {\n const targetNode = graph.nodes.get(usage.target)\n return targetNode !== undefined && matchesReactFilter(targetNode, filter)\n })\n}\n\nfunction getFilteredReactUsageNodes(\n graph: ReactUsageGraph,\n filter: ReactUsageFilter,\n): ReactUsageNode[] {\n return [...graph.nodes.values()]\n .filter((node) => matchesReactFilter(node, filter))\n .sort((left, right) => {\n return (\n left.filePath.localeCompare(right.filePath) ||\n left.name.localeCompare(right.name) ||\n left.kind.localeCompare(right.kind)\n )\n })\n}\n\nfunction matchesReactFilter(\n node: ReactUsageNode,\n filter: ReactUsageFilter,\n): boolean {\n return filter === 'all' || node.kind === filter\n}\n","import process from 'node:process'\n\nimport type { ColorMode } from './types/color-mode.js'\nimport type { ReactSymbolKind } from './types/react-symbol-kind.js'\n\nconst ANSI_RESET = '\\u001B[0m'\nconst ANSI_COMPONENT = '\\u001B[36m'\nconst ANSI_HOOK = '\\u001B[35m'\nconst ANSI_BUILTIN = '\\u001B[34m'\nconst ANSI_MUTED = '\\u001B[38;5;244m'\nconst ANSI_UNUSED = '\\u001B[38;5;214m'\nconst ANSI_DIFF_ADDED = '\\u001B[32m'\nconst ANSI_DIFF_REMOVED = '\\u001B[31m'\nconst ANSI_DIFF_CHANGED = '\\u001B[33m'\n\ninterface ResolveColorSupportOptions {\n readonly forceColor?: string | undefined\n readonly isTTY?: boolean | undefined\n readonly noColor?: string | undefined\n}\n\nexport function resolveColorSupport(\n mode: ColorMode = 'auto',\n options: ResolveColorSupportOptions = {},\n): boolean {\n if (mode === true) {\n return true\n }\n\n if (mode === false) {\n return false\n }\n\n const forceColor =\n 'forceColor' in options ? options.forceColor : process.env.FORCE_COLOR\n if (forceColor !== undefined) {\n return forceColor !== '0'\n }\n\n const noColor = 'noColor' in options ? options.noColor : process.env.NO_COLOR\n if (noColor !== undefined) {\n return false\n }\n\n const isTTY = 'isTTY' in options ? options.isTTY : process.stdout.isTTY\n return isTTY === true\n}\n\nexport function colorizeUnusedMarker(text: string, enabled: boolean): string {\n if (!enabled) {\n return text\n }\n\n return text.replaceAll('(unused)', `${ANSI_UNUSED}(unused)${ANSI_RESET}`)\n}\n\nexport function formatReactSymbolLabel(\n name: string,\n kind: ReactSymbolKind,\n enabled: boolean,\n): string {\n const label = `${formatReactSymbolName(name, kind)} [${kind}]`\n if (!enabled) {\n return label\n }\n\n return `${getReactSymbolColor(kind)}${label}${ANSI_RESET}`\n}\n\nexport function formatReactSymbolName(\n name: string,\n kind: ReactSymbolKind,\n): string {\n if (kind === 'component') {\n return `<${name} />`\n }\n\n if (kind === 'hook') {\n return `${name}()`\n }\n\n return `<${name}>`\n}\nexport function colorizeReactLabel(\n text: string,\n kind: ReactSymbolKind,\n enabled: boolean,\n): string {\n if (!enabled) {\n return text\n }\n\n return `${getReactSymbolColor(kind)}${text}${ANSI_RESET}`\n}\n\nexport function colorizeMuted(text: string, enabled: boolean): string {\n if (!enabled) {\n return text\n }\n\n return `${ANSI_MUTED}${text}${ANSI_RESET}`\n}\n\nexport function colorizePackageDiff(\n text: string,\n change: 'added' | 'removed' | 'changed',\n enabled: boolean,\n): string {\n if (!enabled) {\n return text\n }\n\n return `${getPackageDiffColor(change)}${text}${ANSI_RESET}`\n}\n\nfunction getReactSymbolColor(kind: ReactSymbolKind): string {\n if (kind === 'component') {\n return ANSI_COMPONENT\n }\n\n if (kind === 'hook') {\n return ANSI_HOOK\n }\n\n return ANSI_BUILTIN\n}\n\nfunction getPackageDiffColor(change: 'added' | 'removed' | 'changed'): string {\n if (change === 'added') {\n return ANSI_DIFF_ADDED\n }\n\n if (change === 'removed') {\n return ANSI_DIFF_REMOVED\n }\n\n return ANSI_DIFF_CHANGED\n}\n","import { colorizePackageDiff, resolveColorSupport } from '../../color.js'\nimport type { PackageDependencyChangeKind } from '../../types/package-dependency-change-kind.js'\nimport type { PackageDependencyDiffDependency } from '../../types/package-dependency-diff-dependency.js'\nimport type { PackageDependencyDiffGraph } from '../../types/package-dependency-diff-graph.js'\nimport type { PackageDependencyDiffNode } from '../../types/package-dependency-diff-node.js'\nimport type { PackageDependencyGraph } from '../../types/package-dependency-graph.js'\nimport type { PackageManifestDependency } from '../../types/package-manifest-dependency.js'\nimport type { PrintPackageTreeOptions } from '../../types/print-package-tree-options.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\nexport function printPackageDependencyTree(\n graph: PackageDependencyGraph,\n _options: PrintPackageTreeOptions = {},\n): string {\n const rootNode = graph.nodes.get(graph.rootId)\n if (rootNode === undefined) {\n return toDisplayPath(graph.rootId, graph.repositoryRoot)\n }\n\n const lines = [rootNode.packageName]\n const visited = new Set<string>([graph.rootId])\n\n rootNode.dependencies.forEach((dependency, index) => {\n lines.push(\n ...renderDependency(\n dependency,\n graph,\n visited,\n '',\n index === rootNode.dependencies.length - 1,\n ),\n )\n })\n\n return lines.join('\\n')\n}\n\nexport function printPackageDependencyDiffTree(\n graph: PackageDependencyDiffGraph,\n options: PrintPackageTreeOptions = {},\n): string {\n const color = resolveColorSupport(options.color)\n const lines = [formatDiffRootLabel(graph.root, color)]\n\n graph.root.dependencies.forEach((dependency, index) => {\n lines.push(\n ...renderDiffDependency(\n dependency,\n '',\n index === graph.root.dependencies.length - 1,\n color,\n ),\n )\n })\n\n return lines.join('\\n')\n}\n\nfunction renderDependency(\n dependency: PackageManifestDependency,\n graph: PackageDependencyGraph,\n visited: ReadonlySet<string>,\n prefix: string,\n isLast: boolean,\n): string[] {\n const branch = `${prefix}${isLast ? '└─ ' : '├─ '}`\n const label = formatDependencyLabel(dependency, graph.repositoryRoot)\n\n if (dependency.kind === 'external') {\n return [`${branch}${label}`]\n }\n\n if (visited.has(dependency.target)) {\n return [`${branch}${label} (circular)`]\n }\n\n const childNode = graph.nodes.get(dependency.target)\n if (childNode === undefined) {\n return [`${branch}${label}`]\n }\n\n const childLines = [`${branch}${label}`]\n const nextPrefix = `${prefix}${isLast ? ' ' : '│ '}`\n const nextVisited = new Set(visited)\n nextVisited.add(dependency.target)\n\n childNode.dependencies.forEach((childDependency, index) => {\n childLines.push(\n ...renderDependency(\n childDependency,\n graph,\n nextVisited,\n nextPrefix,\n index === childNode.dependencies.length - 1,\n ),\n )\n })\n\n return childLines\n}\n\nfunction formatDependencyLabel(\n dependency: PackageManifestDependency,\n repositoryRoot: string,\n): string {\n if (dependency.kind === 'external') {\n return `${dependency.name}@${dependency.specifier}`\n }\n\n const workspaceLabel = toDisplayPath(dependency.target, repositoryRoot)\n\n if (dependency.specifier === undefined) {\n return workspaceLabel\n }\n\n return `${workspaceLabel} (${dependency.specifier})`\n}\n\nfunction renderDiffDependency(\n dependency: PackageDependencyDiffDependency,\n prefix: string,\n isLast: boolean,\n color: boolean,\n): string[] {\n const branch = `${prefix}${isLast ? '└─ ' : '├─ '}`\n const line = `${branch}${formatDiffDependencyLine(dependency, color)}`\n\n if (dependency.kind === 'external') {\n return [line]\n }\n\n if (dependency.node.kind === 'circular') {\n return [`${line} (circular)`]\n }\n\n const childLines = [line]\n const nextPrefix = `${prefix}${isLast ? ' ' : '│ '}`\n\n dependency.node.dependencies.forEach((childDependency, index) => {\n childLines.push(\n ...renderDiffDependency(\n childDependency,\n nextPrefix,\n index === dependency.node.dependencies.length - 1,\n color,\n ),\n )\n })\n\n return childLines\n}\n\nfunction formatDiffRootLabel(\n node: PackageDependencyDiffNode,\n color: boolean,\n): string {\n if (\n node.change === 'changed' &&\n node.beforePackageName !== undefined &&\n node.afterPackageName !== undefined\n ) {\n return colorizeDiffText(\n `${toMarker(node.change)} ${node.beforePackageName} -> ${node.afterPackageName}`,\n node.change,\n color,\n )\n }\n\n if (node.change === 'unchanged') {\n return node.packageName\n }\n\n return colorizeDiffText(\n `${toMarker(node.change)} ${node.packageName}`,\n node.change,\n color,\n )\n}\n\nfunction formatDiffDependencyLine(\n dependency: PackageDependencyDiffDependency,\n color: boolean,\n): string {\n const marker = resolveVisibleDependencyMarker(dependency)\n const label = formatDiffDependencyLabel(dependency)\n\n if (marker === 'unchanged') {\n return label\n }\n\n return colorizeDiffText(`${toMarker(marker)} ${label}`, marker, color)\n}\n\nfunction resolveVisibleDependencyMarker(\n dependency: PackageDependencyDiffDependency,\n): PackageDependencyChangeKind {\n if (dependency.change !== 'unchanged') {\n return dependency.change\n }\n\n if (\n dependency.kind === 'workspace' &&\n dependency.node.change !== 'unchanged'\n ) {\n return dependency.node.change\n }\n\n return 'unchanged'\n}\n\nfunction formatDiffDependencyLabel(\n dependency: PackageDependencyDiffDependency,\n): string {\n if (dependency.kind === 'external') {\n return formatExternalDiffLabel(dependency)\n }\n\n return formatWorkspaceDiffLabel(dependency)\n}\n\nfunction formatExternalDiffLabel(\n dependency: Extract<PackageDependencyDiffDependency, { kind: 'external' }>,\n): string {\n const beforeResolution = dependency.before?.resolvedVersion\n const afterResolution = dependency.after?.resolvedVersion\n\n if (dependency.change !== 'changed') {\n return (\n dependency.after?.target ?? dependency.before?.target ?? dependency.name\n )\n }\n\n const previousSpecifier = dependency.before?.specifier ?? 'none'\n const nextSpecifier = dependency.after?.specifier ?? 'none'\n\n if (dependency.resolvedVersionChanged) {\n const resolutionLabel = formatVersionChange(\n beforeResolution,\n afterResolution,\n )\n\n return previousSpecifier === nextSpecifier\n ? `${dependency.name}@${nextSpecifier} (${resolutionLabel})`\n : `${dependency.name}@${previousSpecifier} -> ${nextSpecifier} (${resolutionLabel})`\n }\n\n if (previousSpecifier === nextSpecifier) {\n return `${dependency.name}@${nextSpecifier}`\n }\n\n return `${dependency.name}@${previousSpecifier} -> ${nextSpecifier}`\n}\n\nfunction formatWorkspaceDiffLabel(\n dependency: Extract<PackageDependencyDiffDependency, { kind: 'workspace' }>,\n): string {\n if (dependency.change !== 'changed') {\n return formatWorkspaceState(\n dependency.after ?? dependency.before,\n dependency.node.path,\n )\n }\n\n const previousTarget = dependency.before?.target ?? dependency.node.path\n const nextTarget = dependency.after?.target ?? dependency.node.path\n const targetLabel =\n previousTarget === nextTarget\n ? nextTarget\n : `${previousTarget} -> ${nextTarget}`\n const previousSpecifier = dependency.before?.specifier\n const nextSpecifier = dependency.after?.specifier\n\n if (previousSpecifier === nextSpecifier) {\n return formatWorkspaceState(\n {\n target: targetLabel,\n ...(nextSpecifier === undefined ? {} : { specifier: nextSpecifier }),\n },\n dependency.node.path,\n )\n }\n\n return formatWorkspaceState(\n {\n target: targetLabel,\n specifier: `${previousSpecifier ?? 'none'} -> ${nextSpecifier ?? 'none'}`,\n },\n dependency.node.path,\n )\n}\n\nfunction formatWorkspaceState(\n state:\n | {\n readonly target: string\n readonly specifier?: string\n }\n | undefined,\n fallbackTarget: string,\n): string {\n const target = state?.target ?? fallbackTarget\n\n if (state?.specifier === undefined) {\n return target\n }\n\n return `${target} (${state.specifier})`\n}\n\nfunction formatVersionChange(\n beforeResolvedVersion: string | undefined,\n afterResolvedVersion: string | undefined,\n): string {\n return `${beforeResolvedVersion ?? 'none'} -> ${afterResolvedVersion ?? 'none'}`\n}\n\nfunction toMarker(change: PackageDependencyChangeKind): '+' | '-' | '~' {\n if (change === 'added') {\n return '+'\n }\n\n if (change === 'removed') {\n return '-'\n }\n\n return '~'\n}\n\nfunction colorizeDiffText(\n text: string,\n change: PackageDependencyChangeKind,\n color: boolean,\n): string {\n if (change === 'unchanged') {\n return text\n }\n\n return colorizePackageDiff(text, change, color)\n}\n","import { colorizeUnusedMarker, resolveColorSupport } from '../../color.js'\nimport type { DependencyEdge } from '../../types/dependency-edge.js'\nimport type { DependencyGraph } from '../../types/dependency-graph.js'\nimport type { PrintTreeOptions } from '../../types/print-tree-options.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\nexport function printDependencyTree(\n graph: DependencyGraph,\n options: PrintTreeOptions = {},\n): string {\n const cwd = options.cwd ?? graph.cwd\n const color = resolveColorSupport(options.color)\n const includeExternals = options.includeExternals ?? false\n const omitUnused = options.omitUnused ?? false\n const rootLines = [toDisplayPath(graph.entryId, cwd)]\n const visited = new Set<string>([graph.entryId])\n const entryNode = graph.nodes.get(graph.entryId)\n\n if (entryNode === undefined) {\n return rootLines.join('\\n')\n }\n\n const rootDependencies = filterDependencies(\n entryNode.dependencies,\n includeExternals,\n omitUnused,\n )\n\n rootDependencies.forEach((dependency, index) => {\n rootLines.push(\n ...renderDependency(\n dependency,\n graph,\n visited,\n '',\n index === rootDependencies.length - 1,\n includeExternals,\n omitUnused,\n color,\n cwd,\n ),\n )\n })\n\n return rootLines.join('\\n')\n}\n\nfunction renderDependency(\n dependency: DependencyEdge,\n graph: DependencyGraph,\n visited: ReadonlySet<string>,\n prefix: string,\n isLast: boolean,\n includeExternals: boolean,\n omitUnused: boolean,\n color: boolean,\n cwd: string,\n): string[] {\n const branch = `${prefix}${isLast ? '└─ ' : '├─ '}`\n const label = formatDependencyLabel(dependency, cwd, color)\n\n if (dependency.kind !== 'source') {\n return [`${branch}${label}`]\n }\n\n if (visited.has(dependency.target)) {\n return [`${branch}${label} (circular)`]\n }\n\n const childNode = graph.nodes.get(dependency.target)\n if (childNode === undefined) {\n return [`${branch}${label}`]\n }\n\n const nextPrefix = `${prefix}${isLast ? ' ' : '│ '}`\n const nextVisited = new Set(visited)\n nextVisited.add(dependency.target)\n\n const childLines = [`${branch}${label}`]\n const childDependencies = filterDependencies(\n childNode.dependencies,\n includeExternals,\n omitUnused,\n )\n\n childDependencies.forEach((childDependency, index) => {\n childLines.push(\n ...renderDependency(\n childDependency,\n graph,\n nextVisited,\n nextPrefix,\n index === childDependencies.length - 1,\n includeExternals,\n omitUnused,\n color,\n cwd,\n ),\n )\n })\n\n return childLines\n}\n\nfunction filterDependencies(\n dependencies: readonly DependencyEdge[],\n includeExternals: boolean,\n omitUnused: boolean,\n): DependencyEdge[] {\n return dependencies.filter((dependency) => {\n if (omitUnused && dependency.unused) {\n return false\n }\n\n if (\n dependency.kind === 'source' ||\n dependency.kind === 'missing' ||\n dependency.kind === 'boundary'\n ) {\n return true\n }\n\n return includeExternals\n })\n}\n\nfunction formatDependencyLabel(\n dependency: DependencyEdge,\n cwd: string,\n color: boolean,\n): string {\n const prefixes: string[] = []\n if (dependency.isTypeOnly) {\n prefixes.push('type')\n }\n\n if (dependency.referenceKind === 'require') {\n prefixes.push('require')\n } else if (dependency.referenceKind === 'dynamic-import') {\n prefixes.push('dynamic')\n } else if (dependency.referenceKind === 'export') {\n prefixes.push('re-export')\n } else if (dependency.referenceKind === 'import-equals') {\n prefixes.push('import=')\n }\n\n const annotation = prefixes.length > 0 ? `[${prefixes.join(', ')}] ` : ''\n\n if (dependency.kind === 'source') {\n return colorizeUnusedMarker(\n withUnusedSuffix(\n `${annotation}${toDisplayPath(dependency.target, cwd)}`,\n dependency.unused,\n ),\n color,\n )\n }\n\n if (dependency.kind === 'missing') {\n return colorizeUnusedMarker(\n withUnusedSuffix(\n `${annotation}${dependency.specifier} [missing]`,\n dependency.unused,\n ),\n color,\n )\n }\n\n if (dependency.kind === 'boundary') {\n return colorizeUnusedMarker(\n withUnusedSuffix(\n `${annotation}${toDisplayPath(dependency.target, cwd)} [${\n dependency.boundary === 'project'\n ? 'project boundary'\n : 'workspace boundary'\n }]`,\n dependency.unused,\n ),\n color,\n )\n }\n\n if (dependency.kind === 'builtin') {\n return colorizeUnusedMarker(\n withUnusedSuffix(\n `${annotation}${dependency.target} [builtin]`,\n dependency.unused,\n ),\n color,\n )\n }\n\n return colorizeUnusedMarker(\n withUnusedSuffix(\n `${annotation}${dependency.target} [external]`,\n dependency.unused,\n ),\n color,\n )\n}\n\nfunction withUnusedSuffix(label: string, unused: boolean): string {\n return unused ? `${label} (unused)` : label\n}\n","import {\n getFilteredUsages,\n getReactUsageEntries,\n getReactUsageRoots,\n} from '../../analyzers/react/queries.js'\nimport {\n colorizeMuted,\n colorizeReactLabel,\n formatReactSymbolLabel,\n formatReactSymbolName,\n resolveColorSupport,\n} from '../../color.js'\nimport type { PrintReactTreeOptions } from '../../types/print-react-tree-options.js'\nimport type { ReactUsageEdge } from '../../types/react-usage-edge.js'\nimport type { ReactUsageEntry } from '../../types/react-usage-entry.js'\nimport type { ReactUsageGraph } from '../../types/react-usage-graph.js'\nimport type { ReactUsageNode } from '../../types/react-usage-node.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\nexport function printReactUsageTree(\n graph: ReactUsageGraph,\n options: PrintReactTreeOptions = {},\n): string {\n const cwd = options.cwd ?? graph.cwd\n const color = resolveColorSupport(options.color)\n const filter = options.filter ?? 'all'\n const entries = getReactUsageEntries(graph, filter)\n\n if (entries.length > 0) {\n return renderReactUsageEntries(graph, entries, cwd, filter, color)\n }\n\n const roots = getReactUsageRoots(graph, filter)\n if (roots.length === 0) {\n return 'No React symbols found.'\n }\n\n const lines: string[] = []\n roots.forEach((rootId, index) => {\n const root = graph.nodes.get(rootId)\n if (root === undefined) {\n return\n }\n\n lines.push(formatReactNodeLabel(root, cwd, color))\n const usages = getFilteredUsages(root, graph, filter)\n usages.forEach((usage, usageIndex) => {\n lines.push(\n ...renderUsage(\n usage,\n graph,\n cwd,\n filter,\n color,\n new Set([root.id]),\n '',\n usageIndex === usages.length - 1,\n ),\n )\n })\n\n if (index < roots.length - 1) {\n lines.push('')\n }\n })\n\n return lines.join('\\n')\n}\n\nfunction renderReactUsageEntries(\n graph: ReactUsageGraph,\n entries: readonly ReactUsageEntry[],\n cwd: string,\n filter: NonNullable<PrintReactTreeOptions['filter']>,\n color: boolean,\n): string {\n const lines: string[] = []\n\n entries.forEach((entry, index) => {\n const root = graph.nodes.get(entry.target)\n if (root === undefined) {\n return\n }\n\n lines.push(formatReactEntryLabel(entry, cwd))\n lines.push(formatReactNodeLabel(root, cwd, color, entry.referenceName))\n\n const usages = getFilteredUsages(root, graph, filter)\n usages.forEach((usage, usageIndex) => {\n lines.push(\n ...renderUsage(\n usage,\n graph,\n cwd,\n filter,\n color,\n new Set([root.id]),\n '',\n usageIndex === usages.length - 1,\n ),\n )\n })\n\n if (index < entries.length - 1) {\n lines.push('')\n }\n })\n\n return lines.join('\\n')\n}\n\nfunction renderUsage(\n usage: ReactUsageEdge,\n graph: ReactUsageGraph,\n cwd: string,\n filter: NonNullable<PrintReactTreeOptions['filter']>,\n color: boolean,\n visited: ReadonlySet<string>,\n prefix: string,\n isLast: boolean,\n): string[] {\n const branch = `${prefix}${isLast ? '└─ ' : '├─ '}`\n const target = graph.nodes.get(usage.target)\n\n if (target === undefined) {\n return [`${branch}${usage.target}`]\n }\n\n if (visited.has(target.id)) {\n return [\n `${branch}${formatReactNodeLabel(target, cwd, color, usage.referenceName)} (circular)`,\n ]\n }\n\n const childLines = [\n `${branch}${formatReactNodeLabel(target, cwd, color, usage.referenceName)}`,\n ]\n const nextVisited = new Set(visited)\n nextVisited.add(target.id)\n const nextPrefix = `${prefix}${isLast ? ' ' : '│ '}`\n const childUsages = getFilteredUsages(target, graph, filter)\n\n childUsages.forEach((childUsage, index) => {\n childLines.push(\n ...renderUsage(\n childUsage,\n graph,\n cwd,\n filter,\n color,\n nextVisited,\n nextPrefix,\n index === childUsages.length - 1,\n ),\n )\n })\n\n return childLines\n}\n\nfunction formatReactNodeLabel(\n node: ReactUsageNode,\n cwd: string,\n color: boolean,\n referenceName?: string,\n): string {\n const hasAlias = referenceName !== undefined && referenceName !== node.name\n const label = hasAlias\n ? `${colorizeReactLabel(formatReactSymbolName(node.name, node.kind), node.kind, color)} ${colorizeMuted(\n `as ${referenceName}`,\n color,\n )} ${colorizeReactLabel(`[${node.kind}]`, node.kind, color)}`\n : formatReactSymbolLabel(node.name, node.kind, color)\n\n return `${label} (${formatReactNodeFilePath(node, cwd)})`\n}\n\nfunction formatReactEntryLabel(entry: ReactUsageEntry, cwd: string): string {\n return `${toDisplayPath(entry.location.filePath, cwd)}:${entry.location.line}:${entry.location.column}`\n}\n\nfunction formatReactNodeFilePath(node: ReactUsageNode, cwd: string): string {\n return node.kind === 'builtin' ? 'html' : toDisplayPath(node.filePath, cwd)\n}\n","import type { PackageDependencyDiffDependency } from '../../types/package-dependency-diff-dependency.js'\nimport type { PackageDependencyDiffGraph } from '../../types/package-dependency-diff-graph.js'\nimport type { PackageDependencyDiffNode } from '../../types/package-dependency-diff-node.js'\nimport type { PackageDependencyGraph } from '../../types/package-dependency-graph.js'\nimport type { PackageManifestDependency } from '../../types/package-manifest-dependency.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\nexport function graphToSerializablePackageTree(\n graph: PackageDependencyGraph,\n): object {\n return serializePackageNode(graph.rootId, graph, new Set())\n}\n\nexport function diffGraphToSerializablePackageTree(\n graph: PackageDependencyDiffGraph,\n): object {\n return serializePackageDiffNode(graph.root)\n}\n\nfunction serializePackageNode(\n packageDir: string,\n graph: PackageDependencyGraph,\n visited: Set<string>,\n): object {\n const packageNode = graph.nodes.get(packageDir)\n const packagePath = toDisplayPath(packageDir, graph.repositoryRoot)\n\n if (packageNode === undefined) {\n return {\n kind: 'missing',\n label: packagePath,\n path: packagePath,\n dependencies: [],\n }\n }\n\n if (visited.has(packageDir)) {\n return {\n kind: 'circular',\n label: packageNode.packageName,\n packageName: packageNode.packageName,\n path: packagePath,\n dependencies: [],\n }\n }\n\n visited.add(packageDir)\n\n return {\n kind: packageDir === graph.rootId ? 'root' : 'workspace',\n label: packageDir === graph.rootId ? packageNode.packageName : packagePath,\n packageName: packageNode.packageName,\n path: packagePath,\n dependencies: packageNode.dependencies.map((dependency) =>\n serializeDependency(dependency, graph, new Set(visited)),\n ),\n }\n}\n\nfunction serializeDependency(\n dependency: PackageManifestDependency,\n graph: PackageDependencyGraph,\n visited: Set<string>,\n): object {\n if (dependency.kind === 'external') {\n return {\n kind: 'external',\n name: dependency.name,\n specifier: dependency.specifier,\n target: `${dependency.name}@${dependency.specifier}`,\n }\n }\n\n return {\n kind: 'workspace',\n name: dependency.name,\n ...(dependency.specifier === undefined\n ? {}\n : { specifier: dependency.specifier }),\n target: toDisplayPath(dependency.target, graph.repositoryRoot),\n node: serializePackageNode(dependency.target, graph, visited),\n }\n}\n\nfunction serializePackageDiffNode(node: PackageDependencyDiffNode): object {\n return {\n kind: node.kind,\n label: node.label,\n packageName: node.packageName,\n path: node.path,\n change: node.change,\n ...(node.beforePackageName === undefined\n ? {}\n : { beforePackageName: node.beforePackageName }),\n ...(node.afterPackageName === undefined\n ? {}\n : { afterPackageName: node.afterPackageName }),\n dependencies: node.dependencies.map((dependency) =>\n serializePackageDiffDependency(dependency),\n ),\n }\n}\n\nfunction serializePackageDiffDependency(\n dependency: PackageDependencyDiffDependency,\n): object {\n return {\n kind: dependency.kind,\n name: dependency.name,\n change: dependency.change,\n ...(dependency.kind === 'external'\n ? {\n specifierChanged: dependency.specifierChanged,\n resolvedVersionChanged: dependency.resolvedVersionChanged,\n peerContextChanged: dependency.peerContextChanged,\n }\n : {}),\n ...(dependency.before === undefined\n ? {}\n : {\n beforeTarget: dependency.before.target,\n ...(dependency.before.specifier === undefined\n ? {}\n : { beforeSpecifier: dependency.before.specifier }),\n ...(dependency.before.resolvedVersion === undefined\n ? {}\n : { beforeResolvedVersion: dependency.before.resolvedVersion }),\n ...(dependency.before.peerContext === undefined\n ? {}\n : { beforePeerContext: dependency.before.peerContext }),\n }),\n ...(dependency.after === undefined\n ? {}\n : {\n afterTarget: dependency.after.target,\n ...(dependency.after.specifier === undefined\n ? {}\n : { afterSpecifier: dependency.after.specifier }),\n ...(dependency.after.resolvedVersion === undefined\n ? {}\n : { afterResolvedVersion: dependency.after.resolvedVersion }),\n ...(dependency.after.peerContext === undefined\n ? {}\n : { afterPeerContext: dependency.after.peerContext }),\n }),\n ...(dependency.before === undefined ? {} : { before: dependency.before }),\n ...(dependency.after === undefined ? {} : { after: dependency.after }),\n ...(dependency.after === undefined\n ? dependency.before === undefined\n ? {}\n : { target: dependency.before.target }\n : { target: dependency.after.target }),\n ...(dependency.kind === 'workspace'\n ? { node: serializePackageDiffNode(dependency.node) }\n : {}),\n }\n}\n","import type { DependencyEdge } from '../../types/dependency-edge.js'\nimport type { DependencyGraph } from '../../types/dependency-graph.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\nexport function graphToSerializableTree(\n graph: DependencyGraph,\n options: {\n readonly omitUnused?: boolean\n } = {},\n): object {\n const visited = new Set<string>()\n return serializeNode(\n graph.entryId,\n graph,\n visited,\n options.omitUnused ?? false,\n )\n}\n\nfunction serializeNode(\n filePath: string,\n graph: DependencyGraph,\n visited: Set<string>,\n omitUnused: boolean,\n): object {\n const node = graph.nodes.get(filePath)\n const displayPath = toDisplayPath(filePath, graph.cwd)\n\n if (node === undefined) {\n return {\n path: displayPath,\n kind: 'missing',\n dependencies: [],\n }\n }\n\n if (visited.has(filePath)) {\n return {\n path: displayPath,\n kind: 'circular',\n dependencies: [],\n }\n }\n\n visited.add(filePath)\n\n const dependencies = node.dependencies\n .filter((dependency) => !omitUnused || !dependency.unused)\n .map((dependency) => {\n if (dependency.kind !== 'source') {\n return {\n specifier: dependency.specifier,\n referenceKind: dependency.referenceKind,\n isTypeOnly: dependency.isTypeOnly,\n unused: dependency.unused,\n kind: dependency.kind,\n ...(dependency.boundary === undefined\n ? {}\n : { boundary: dependency.boundary }),\n target: serializeDependencyTarget(dependency, graph.cwd),\n }\n }\n\n return {\n specifier: dependency.specifier,\n referenceKind: dependency.referenceKind,\n isTypeOnly: dependency.isTypeOnly,\n unused: dependency.unused,\n kind: dependency.kind,\n target: toDisplayPath(dependency.target, graph.cwd),\n node: serializeNode(\n dependency.target,\n graph,\n new Set(visited),\n omitUnused,\n ),\n }\n })\n\n return {\n path: displayPath,\n kind: filePath === graph.entryId ? 'entry' : 'source',\n dependencies,\n }\n}\n\nfunction serializeDependencyTarget(\n dependency: DependencyEdge,\n cwd: string,\n): string {\n if (dependency.kind === 'missing' || dependency.kind === 'external') {\n return dependency.target\n }\n\n if (dependency.kind === 'builtin') {\n return dependency.target\n }\n\n return toDisplayPath(dependency.target, cwd)\n}\n","import {\n getFilteredUsages,\n getReactUsageEntries,\n getReactUsageRoots,\n} from '../../analyzers/react/queries.js'\nimport type { ReactUsageEntry } from '../../types/react-usage-entry.js'\nimport type { ReactUsageFilter } from '../../types/react-usage-filter.js'\nimport type { ReactUsageGraph } from '../../types/react-usage-graph.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\ninterface SerializedReactUsageNode {\n readonly id: string\n readonly name: string\n readonly symbolKind:\n | import('../../types/react-symbol-kind.js').ReactSymbolKind\n | 'circular'\n readonly filePath: string\n readonly exportNames: readonly string[]\n readonly usages: readonly SerializedReactUsageEdge[]\n}\n\ninterface SerializedReactUsageEntry {\n readonly targetId: string\n readonly referenceName: string\n readonly filePath: string\n readonly line: number\n readonly column: number\n readonly node: SerializedReactUsageNode\n}\n\ninterface SerializedReactUsageEdge {\n readonly kind: import('../../types/react-usage-edge.js').ReactUsageEdge['kind']\n readonly targetId: string\n readonly referenceName: string\n readonly node: SerializedReactUsageNode\n}\n\nexport function graphToSerializableReactTree(\n graph: ReactUsageGraph,\n options: {\n readonly filter?: ReactUsageFilter\n } = {},\n): object {\n const filter = options.filter ?? 'all'\n const entries = getReactUsageEntries(graph, filter)\n const roots =\n entries.length > 0\n ? entries.map((entry) =>\n serializeReactUsageNode(entry.target, graph, filter, new Set()),\n )\n : getReactUsageRoots(graph, filter).map((rootId) =>\n serializeReactUsageNode(rootId, graph, filter, new Set()),\n )\n\n return {\n kind: 'react-usage',\n entries: entries.map((entry) =>\n serializeReactUsageEntry(entry, graph, filter),\n ),\n roots,\n }\n}\n\nfunction serializeReactUsageNode(\n nodeId: string,\n graph: ReactUsageGraph,\n filter: ReactUsageFilter,\n visited: Set<string>,\n): SerializedReactUsageNode {\n const node = graph.nodes.get(nodeId)\n if (node === undefined) {\n return {\n id: nodeId,\n name: nodeId,\n symbolKind: 'circular',\n filePath: '',\n exportNames: [],\n usages: [],\n }\n }\n\n if (visited.has(nodeId)) {\n return {\n id: node.id,\n name: node.name,\n symbolKind: 'circular',\n filePath: formatReactNodeFilePath(node.filePath, node.kind, graph.cwd),\n exportNames: node.exportNames,\n usages: [],\n }\n }\n\n const nextVisited = new Set(visited)\n nextVisited.add(nodeId)\n\n return {\n id: node.id,\n name: node.name,\n symbolKind: node.kind,\n filePath: formatReactNodeFilePath(node.filePath, node.kind, graph.cwd),\n exportNames: node.exportNames,\n usages: getFilteredUsages(node, graph, filter).map((usage) => ({\n kind: usage.kind,\n targetId: usage.target,\n referenceName: usage.referenceName,\n node: serializeReactUsageNode(usage.target, graph, filter, nextVisited),\n })),\n }\n}\n\nfunction serializeReactUsageEntry(\n entry: ReactUsageEntry,\n graph: ReactUsageGraph,\n filter: ReactUsageFilter,\n): SerializedReactUsageEntry {\n return {\n targetId: entry.target,\n referenceName: entry.referenceName,\n filePath: toDisplayPath(entry.location.filePath, graph.cwd),\n line: entry.location.line,\n column: entry.location.column,\n node: serializeReactUsageNode(entry.target, graph, filter, new Set()),\n }\n}\n\nfunction formatReactNodeFilePath(\n filePath: string,\n kind: import('../../types/react-symbol-kind.js').ReactSymbolKind,\n cwd: string,\n): string {\n return kind === 'builtin' ? 'html' : toDisplayPath(filePath, cwd)\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"react-CABHoyGj.mjs","names":["PNPM_WORKSPACE_FILE","PNPM_LOCKFILE","isInsideNodeModules","process","renderDependency","formatDependencyLabel","formatReactNodeFilePath"],"sources":["../src/utils/to-display-path.ts","../src/analyzers/base.ts","../src/analyzers/deps/index.ts","../src/analyzers/deps/pnpm-lock.ts","../src/analyzers/deps/diff.ts","../src/typescript/config.ts","../src/utils/is-source-code-file.ts","../src/utils/normalize-file-path.ts","../src/analyzers/import/entry.ts","../src/typescript/program.ts","../src/analyzers/import/unused.ts","../src/analyzers/import/references.ts","../src/analyzers/import/resolver.ts","../src/analyzers/import/graph.ts","../src/analyzers/import/index.ts","../src/analyzers/react/bindings.ts","../src/analyzers/react/walk.ts","../src/analyzers/react/entries.ts","../src/analyzers/react/symbols.ts","../src/analyzers/react/usage.ts","../src/analyzers/react/file.ts","../src/analyzers/react/references.ts","../src/analyzers/react/index.ts","../src/analyzers/react/queries.ts","../src/color.ts","../src/output/ascii/deps.ts","../src/output/ascii/import.ts","../src/output/ascii/react.ts","../src/output/json/deps.ts","../src/output/json/import.ts","../src/output/json/react.ts"],"sourcesContent":["import path from 'node:path'\n\nexport function toDisplayPath(filePath: string, cwd: string): string {\n const relativePath = path.relative(cwd, filePath)\n if (relativePath === '') {\n return '.'\n }\n\n const normalizedPath = relativePath.split(path.sep).join('/')\n return normalizedPath.startsWith('..') ? filePath : normalizedPath\n}\n","import type { AnalyzeOptions } from '../types/analyze-options.js'\n\nexport abstract class BaseAnalyzer<TGraph> {\n constructor(\n protected readonly entryFile: string,\n protected readonly options: AnalyzeOptions,\n ) {}\n\n analyze(): TGraph {\n return this.doAnalyze()\n }\n\n protected abstract doAnalyze(): TGraph\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport type { PackageDependencyGraph } from '../../types/package-dependency-graph.js'\nimport type { PackageDependencyNode } from '../../types/package-dependency-node.js'\nimport type {\n ExternalPackageManifestDependency,\n PackageManifestDependency,\n WorkspacePackageManifestDependency,\n} from '../../types/package-manifest-dependency.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\nimport { BaseAnalyzer } from '../base.js'\n\ninterface PackageManifest {\n readonly name?: string\n readonly workspaces?: readonly string[] | WorkspaceConfig\n readonly dependencies?: Readonly<Record<string, string>>\n}\n\ninterface WorkspaceConfig {\n readonly packages?: readonly string[]\n}\n\ninterface WorkspacePackage {\n readonly name: string\n readonly packageDir: string\n readonly label: string\n}\n\nconst PNPM_WORKSPACE_FILE = 'pnpm-workspace.yaml'\n\nexport function analyzePackageDependencies(\n directory: string,\n): PackageDependencyGraph {\n return new PackageDependencyAnalyzer(directory).analyze()\n}\n\nclass PackageDependencyAnalyzer extends BaseAnalyzer<PackageDependencyGraph> {\n private readonly inputPath: string\n\n constructor(directory: string) {\n super(directory, {})\n this.inputPath = path.resolve(process.cwd(), directory)\n }\n\n protected doAnalyze(): PackageDependencyGraph {\n const inputDirectory = resolveInputDirectory(this.inputPath)\n const rootPackageDir = findNearestPackageDirectory(inputDirectory)\n const workspaceRootDir = findWorkspaceRoot(rootPackageDir) ?? rootPackageDir\n const workspacePackages = discoverWorkspacePackages(workspaceRootDir)\n const nodes = new Map<string, PackageDependencyNode>()\n\n visitPackage(rootPackageDir, workspaceRootDir, workspacePackages, nodes)\n\n return {\n repositoryRoot: workspaceRootDir,\n rootId: rootPackageDir,\n nodes,\n }\n }\n}\n\nfunction visitPackage(\n packageDir: string,\n repositoryRoot: string,\n workspacePackages: ReadonlyMap<string, WorkspacePackage>,\n nodes: Map<string, PackageDependencyNode>,\n): void {\n if (nodes.has(packageDir)) {\n return\n }\n\n const manifest = readPackageManifest(packageDir)\n const packageName = resolvePackageName(manifest, packageDir)\n const dependencies =\n packageDir === repositoryRoot && workspacePackages.size > 0\n ? collectRepositoryRootDependencies(\n manifest,\n workspacePackages,\n repositoryRoot,\n )\n : collectManifestDependencies(manifest, workspacePackages, repositoryRoot)\n\n nodes.set(packageDir, {\n packageDir,\n packageName,\n dependencies,\n })\n\n dependencies.forEach((dependency) => {\n if (dependency.kind === 'workspace') {\n visitPackage(dependency.target, repositoryRoot, workspacePackages, nodes)\n }\n })\n}\n\nfunction resolveInputDirectory(resolvedPath: string): string {\n const stats = fs.existsSync(resolvedPath) ? fs.statSync(resolvedPath) : null\n\n if (stats === null) {\n throw new Error(`Directory does not exist: ${resolvedPath}`)\n }\n\n if (stats.isDirectory()) {\n return resolvedPath\n }\n\n if (stats.isFile() && path.basename(resolvedPath) === 'package.json') {\n return path.dirname(resolvedPath)\n }\n\n throw new Error(`Expected a package directory: ${resolvedPath}`)\n}\n\nfunction findNearestPackageDirectory(startDirectory: string): string {\n let currentDirectory = startDirectory\n\n while (true) {\n const packageJsonPath = path.join(currentDirectory, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n return currentDirectory\n }\n\n const parentDirectory = path.dirname(currentDirectory)\n if (parentDirectory === currentDirectory) {\n break\n }\n\n currentDirectory = parentDirectory\n }\n\n throw new Error(`No package.json found from ${startDirectory}`)\n}\n\nfunction findWorkspaceRoot(packageDir: string): string | undefined {\n let currentDirectory = packageDir\n\n while (true) {\n const packageJsonPath = path.join(currentDirectory, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n const manifest = readPackageManifest(currentDirectory)\n const workspacePatterns = resolveWorkspacePatterns(\n currentDirectory,\n manifest,\n )\n\n if (workspacePatterns.length > 0 && currentDirectory === packageDir) {\n return currentDirectory\n }\n\n if (\n workspacePatterns.length > 0 &&\n isWorkspaceMatch(currentDirectory, workspacePatterns, packageDir)\n ) {\n return currentDirectory\n }\n }\n\n const parentDirectory = path.dirname(currentDirectory)\n if (parentDirectory === currentDirectory) {\n return undefined\n }\n\n currentDirectory = parentDirectory\n }\n}\n\nfunction discoverWorkspacePackages(\n repositoryRoot: string,\n): ReadonlyMap<string, WorkspacePackage> {\n const manifest = readPackageManifest(repositoryRoot)\n const workspacePatterns = resolveWorkspacePatterns(repositoryRoot, manifest)\n\n if (workspacePatterns.length === 0) {\n return new Map()\n }\n\n const workspacePackageDirs = new Set<string>()\n\n workspacePatterns.forEach((pattern) => {\n expandWorkspacePattern(repositoryRoot, pattern).forEach((packageDir) => {\n workspacePackageDirs.add(packageDir)\n })\n })\n\n const workspacePackages = new Map<string, WorkspacePackage>()\n\n Array.from(workspacePackageDirs)\n .sort((left, right) => left.localeCompare(right))\n .forEach((packageDir) => {\n const workspaceManifest = readPackageManifest(packageDir)\n const workspaceName = resolvePackageName(workspaceManifest, packageDir)\n\n if (workspacePackages.has(workspaceName)) {\n throw new Error(`Duplicate workspace package name: ${workspaceName}`)\n }\n\n workspacePackages.set(workspaceName, {\n name: workspaceName,\n packageDir,\n label: toDisplayPath(packageDir, repositoryRoot),\n })\n })\n\n return workspacePackages\n}\n\nfunction collectManifestDependencies(\n manifest: PackageManifest,\n workspacePackages: ReadonlyMap<string, WorkspacePackage>,\n repositoryRoot: string,\n): readonly PackageManifestDependency[] {\n const dependencyEntries = Object.entries(manifest.dependencies ?? {})\n const workspaceDependencies: WorkspacePackageManifestDependency[] = []\n const externalDependencies: ExternalPackageManifestDependency[] = []\n\n dependencyEntries.forEach(([dependencyName, specifier]) => {\n const workspacePackage = workspacePackages.get(dependencyName)\n\n if (workspacePackage !== undefined) {\n workspaceDependencies.push({\n kind: 'workspace',\n name: dependencyName,\n specifier,\n target: workspacePackage.packageDir,\n })\n return\n }\n\n externalDependencies.push({\n kind: 'external',\n name: dependencyName,\n specifier,\n })\n })\n\n workspaceDependencies.sort((left, right) => {\n const leftLabel = toDisplayPath(left.target, repositoryRoot)\n const rightLabel = toDisplayPath(right.target, repositoryRoot)\n return leftLabel.localeCompare(rightLabel)\n })\n externalDependencies.sort((left, right) =>\n left.name.localeCompare(right.name),\n )\n\n return [...workspaceDependencies, ...externalDependencies]\n}\n\nfunction collectRepositoryRootDependencies(\n manifest: PackageManifest,\n workspacePackages: ReadonlyMap<string, WorkspacePackage>,\n _repositoryRoot: string,\n): readonly PackageManifestDependency[] {\n const topLevelWorkspaceDependencies = Array.from(workspacePackages.values())\n .sort((left, right) => left.label.localeCompare(right.label))\n .map<WorkspacePackageManifestDependency>((workspacePackage) => ({\n kind: 'workspace',\n name: workspacePackage.name,\n target: workspacePackage.packageDir,\n }))\n\n const externalDependencies = Object.entries(manifest.dependencies ?? {})\n .filter(([dependencyName]) => !workspacePackages.has(dependencyName))\n .map<ExternalPackageManifestDependency>(([dependencyName, specifier]) => ({\n kind: 'external',\n name: dependencyName,\n specifier,\n }))\n .sort((left, right) => left.name.localeCompare(right.name))\n\n return [...topLevelWorkspaceDependencies, ...externalDependencies]\n}\n\nfunction readPackageManifest(packageDir: string): PackageManifest {\n const packageJsonPath = path.join(packageDir, 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n throw new Error(`Missing package.json in ${packageDir}`)\n }\n\n const manifestText = fs.readFileSync(packageJsonPath, 'utf8')\n\n try {\n const parsed = JSON.parse(manifestText) as unknown\n\n if (!isRecord(parsed)) {\n throw new Error('package.json must contain an object')\n }\n\n return parsed as PackageManifest\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown JSON parse error'\n throw new Error(`Failed to read ${packageJsonPath}: ${message}`)\n }\n}\n\nfunction resolvePackageName(\n manifest: PackageManifest,\n packageDir: string,\n): string {\n if (typeof manifest.name === 'string' && manifest.name.trim().length > 0) {\n return manifest.name\n }\n\n throw new Error(`Package at ${packageDir} is missing a valid name`)\n}\n\nfunction getWorkspacePatterns(manifest: PackageManifest): readonly string[] {\n if (Array.isArray(manifest.workspaces)) {\n return manifest.workspaces.filter(\n (pattern): pattern is string =>\n typeof pattern === 'string' && pattern.length > 0,\n )\n }\n\n if (\n isRecord(manifest.workspaces) &&\n Array.isArray(manifest.workspaces.packages)\n ) {\n return manifest.workspaces.packages.filter(\n (pattern): pattern is string =>\n typeof pattern === 'string' && pattern.length > 0,\n )\n }\n\n return []\n}\n\nfunction resolveWorkspacePatterns(\n repositoryRoot: string,\n manifest: PackageManifest,\n): readonly string[] {\n const manifestPatterns = getWorkspacePatterns(manifest)\n if (manifestPatterns.length > 0) {\n return manifestPatterns\n }\n\n return readPnpmWorkspacePatterns(repositoryRoot)\n}\n\nfunction readPnpmWorkspacePatterns(repositoryRoot: string): readonly string[] {\n const pnpmWorkspacePath = path.join(repositoryRoot, PNPM_WORKSPACE_FILE)\n\n if (!fs.existsSync(pnpmWorkspacePath)) {\n return []\n }\n\n const fileContent = fs.readFileSync(pnpmWorkspacePath, 'utf8')\n const lines = fileContent.split(/\\r?\\n/)\n const patterns: string[] = []\n let inPackagesBlock = false\n\n for (const line of lines) {\n const trimmedLine = line.trim()\n\n if (trimmedLine.length === 0 || trimmedLine.startsWith('#')) {\n continue\n }\n\n if (!inPackagesBlock) {\n if (trimmedLine === 'packages:') {\n inPackagesBlock = true\n }\n\n continue\n }\n\n if (!line.startsWith(' ') && !line.startsWith('\\t')) {\n break\n }\n\n if (!trimmedLine.startsWith('- ')) {\n continue\n }\n\n const pattern = unquoteWorkspacePattern(trimmedLine.slice(2).trim())\n\n if (pattern.length > 0) {\n patterns.push(pattern)\n }\n }\n\n return patterns\n}\n\nfunction unquoteWorkspacePattern(pattern: string): string {\n if (\n (pattern.startsWith('\"') && pattern.endsWith('\"')) ||\n (pattern.startsWith(\"'\") && pattern.endsWith(\"'\"))\n ) {\n return pattern.slice(1, -1)\n }\n\n return pattern\n}\n\nfunction isWorkspaceMatch(\n repositoryRoot: string,\n patterns: readonly string[],\n packageDir: string,\n): boolean {\n return patterns.some((pattern) =>\n expandWorkspacePattern(repositoryRoot, pattern).includes(packageDir),\n )\n}\n\nfunction expandWorkspacePattern(\n repositoryRoot: string,\n pattern: string,\n): string[] {\n const segments = normalizeWorkspacePattern(pattern)\n const matches = matchWorkspaceSegments(repositoryRoot, segments, 0)\n\n return matches.filter((packageDir) =>\n fs.existsSync(path.join(packageDir, 'package.json')),\n )\n}\n\nfunction normalizeWorkspacePattern(pattern: string): string[] {\n return pattern\n .split(/[\\\\/]+/)\n .filter((segment) => segment.length > 0 && segment !== '.')\n}\n\nfunction matchWorkspaceSegments(\n currentDirectory: string,\n segments: readonly string[],\n index: number,\n): string[] {\n if (index >= segments.length) {\n return [currentDirectory]\n }\n\n const segment = segments[index]\n if (segment === undefined) {\n return [currentDirectory]\n }\n\n if (segment === '**') {\n const results = new Set<string>(\n matchWorkspaceSegments(currentDirectory, segments, index + 1),\n )\n\n listSubdirectories(currentDirectory).forEach((subdirectory) => {\n matchWorkspaceSegments(subdirectory, segments, index).forEach((match) => {\n results.add(match)\n })\n })\n\n return [...results]\n }\n\n const matcher = createWorkspaceSegmentMatcher(segment)\n const results: string[] = []\n\n listSubdirectories(currentDirectory).forEach((subdirectory) => {\n if (!matcher(path.basename(subdirectory))) {\n return\n }\n\n results.push(...matchWorkspaceSegments(subdirectory, segments, index + 1))\n })\n\n return results\n}\n\nfunction listSubdirectories(directory: string): string[] {\n return fs\n .readdirSync(directory, { withFileTypes: true })\n .filter(\n (entry) =>\n entry.isDirectory() &&\n entry.name !== 'node_modules' &&\n entry.name !== '.git',\n )\n .map((entry) => path.join(directory, entry.name))\n}\n\nfunction createWorkspaceSegmentMatcher(\n segment: string,\n): (name: string) => boolean {\n if (!segment.includes('*')) {\n return (name: string) => name === segment\n }\n\n const escapedSegment = escapeRegExp(segment).replaceAll('*', '[^/]*')\n const pattern = new RegExp(`^${escapedSegment}$`)\n\n return (name: string) => pattern.test(name)\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replaceAll(/[|\\\\{}()[\\]^$+?.]/g, '\\\\$&')\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport interface PnpmLockDependencyResolution {\n readonly specifier?: string\n readonly version?: string\n readonly peerSuffix?: string\n}\n\nexport type PnpmLockImporterResolutions = ReadonlyMap<\n string,\n ReadonlyMap<string, PnpmLockDependencyResolution>\n>\n\nconst PNPM_LOCKFILE = 'pnpm-lock.yaml'\nconst DEPENDENCY_SECTIONS = new Set(['dependencies', 'optionalDependencies'])\n\nexport function loadPnpmLockImporterResolutions(\n repositoryRoot: string,\n): PnpmLockImporterResolutions | undefined {\n const lockfilePath = path.join(repositoryRoot, PNPM_LOCKFILE)\n\n if (!fs.existsSync(lockfilePath)) {\n return undefined\n }\n\n return parsePnpmLockImporterResolutions(fs.readFileSync(lockfilePath, 'utf8'))\n}\n\nfunction parsePnpmLockImporterResolutions(\n source: string,\n): PnpmLockImporterResolutions {\n const importers = new Map<string, Map<string, PnpmLockDependencyResolution>>()\n const lines = source.split(/\\r?\\n/u)\n let inImporters = false\n let currentImporter: string | undefined\n let currentSection: string | undefined\n let currentDependencyName: string | undefined\n\n lines.forEach((line) => {\n const trimmedLine = line.trim()\n if (trimmedLine.length === 0 || trimmedLine.startsWith('#')) {\n return\n }\n\n const indentation = line.length - line.trimStart().length\n\n if (indentation === 0) {\n if (trimmedLine === 'importers:') {\n inImporters = true\n currentImporter = undefined\n currentSection = undefined\n currentDependencyName = undefined\n return\n }\n\n inImporters = false\n return\n }\n\n if (!inImporters) {\n return\n }\n\n if (indentation === 2 && trimmedLine.endsWith(':')) {\n currentImporter = parseYamlScalar(trimmedLine.slice(0, -1))\n currentSection = undefined\n currentDependencyName = undefined\n\n if (!importers.has(currentImporter)) {\n importers.set(currentImporter, new Map())\n }\n return\n }\n\n if (currentImporter === undefined) {\n return\n }\n\n if (indentation === 4 && trimmedLine.endsWith(':')) {\n const sectionName = parseYamlScalar(trimmedLine.slice(0, -1))\n currentSection = DEPENDENCY_SECTIONS.has(sectionName)\n ? sectionName\n : undefined\n currentDependencyName = undefined\n return\n }\n\n if (currentSection === undefined) {\n return\n }\n\n if (indentation === 6) {\n if (trimmedLine.endsWith(':')) {\n currentDependencyName = parseYamlScalar(trimmedLine.slice(0, -1))\n upsertDependency(importers, currentImporter, currentDependencyName, {})\n return\n }\n\n const pair = splitYamlKeyValue(trimmedLine)\n if (pair === undefined) {\n return\n }\n\n currentDependencyName = undefined\n upsertDependency(importers, currentImporter, parseYamlScalar(pair.key), {\n ...parsePnpmVersion(parseYamlScalar(pair.value)),\n })\n return\n }\n\n if (indentation === 8 && currentDependencyName !== undefined) {\n const pair = splitYamlKeyValue(trimmedLine)\n if (pair === undefined) {\n return\n }\n\n if (pair.key === 'specifier') {\n upsertDependency(importers, currentImporter, currentDependencyName, {\n specifier: parseYamlScalar(pair.value),\n })\n return\n }\n\n if (pair.key === 'version') {\n upsertDependency(importers, currentImporter, currentDependencyName, {\n ...parsePnpmVersion(parseYamlScalar(pair.value)),\n })\n }\n }\n })\n\n return importers\n}\n\nfunction upsertDependency(\n importers: Map<string, Map<string, PnpmLockDependencyResolution>>,\n importerPath: string,\n dependencyName: string,\n nextValue: PnpmLockDependencyResolution,\n): void {\n const importer = importers.get(importerPath)\n if (importer === undefined) {\n return\n }\n\n importer.set(dependencyName, {\n ...importer.get(dependencyName),\n ...nextValue,\n })\n}\n\nfunction splitYamlKeyValue(\n line: string,\n): { readonly key: string; readonly value: string } | undefined {\n const separatorIndex = line.indexOf(':')\n\n if (separatorIndex <= 0) {\n return undefined\n }\n\n return {\n key: line.slice(0, separatorIndex).trim(),\n value: line.slice(separatorIndex + 1).trim(),\n }\n}\n\nfunction parseYamlScalar(value: string): string {\n if (value.length >= 2) {\n const firstCharacter = value[0]\n const lastCharacter = value[value.length - 1]\n\n if (\n (firstCharacter === '\"' && lastCharacter === '\"') ||\n (firstCharacter === \"'\" && lastCharacter === \"'\")\n ) {\n return value.slice(1, -1)\n }\n }\n\n return value\n}\n\nfunction parsePnpmVersion(\n value: string,\n): Pick<PnpmLockDependencyResolution, 'version' | 'peerSuffix'> {\n const firstParenthesisIndex = value.indexOf('(')\n\n if (firstParenthesisIndex < 0) {\n return {\n version: value,\n }\n }\n\n return {\n version: value.slice(0, firstParenthesisIndex),\n peerSuffix: value.slice(firstParenthesisIndex),\n }\n}\n","import { execFileSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport type { PackageDependencyChangeKind } from '../../types/package-dependency-change-kind.js'\nimport type {\n PackageDependencyDiffDependency,\n PackageDependencyDiffState,\n} from '../../types/package-dependency-diff-dependency.js'\nimport type { PackageDependencyDiffGraph } from '../../types/package-dependency-diff-graph.js'\nimport type { PackageDependencyDiffNode } from '../../types/package-dependency-diff-node.js'\nimport type { PackageDependencyGraph } from '../../types/package-dependency-graph.js'\nimport type { PackageManifestDependency } from '../../types/package-manifest-dependency.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\nimport { analyzePackageDependencies } from './index.js'\nimport {\n loadPnpmLockImporterResolutions,\n type PnpmLockDependencyResolution,\n} from './pnpm-lock.js'\n\ninterface GitDiffComparison {\n readonly beforeTree: string\n readonly afterTree: string | undefined\n}\n\ninterface ComparablePackageDependencyGraph {\n readonly rootPath: string\n readonly nodes: ReadonlyMap<string, ComparablePackageDependencyNode>\n}\n\ninterface ComparablePackageDependencyNode {\n readonly path: string\n readonly packageName: string\n readonly dependenciesByKey: ReadonlyMap<string, ComparablePackageDependency>\n}\n\ninterface ComparableExternalPackageDependency {\n readonly kind: 'external'\n readonly key: string\n readonly name: string\n readonly specifier: string\n readonly resolvedVersion?: string\n readonly peerContext?: string\n}\n\ninterface ComparableWorkspacePackageDependency {\n readonly kind: 'workspace'\n readonly key: string\n readonly name: string\n readonly specifier: string | undefined\n readonly targetPath: string\n}\n\ntype ComparablePackageDependency =\n | ComparableExternalPackageDependency\n | ComparableWorkspacePackageDependency\n\nconst PNPM_LOCKFILE = 'pnpm-lock.yaml'\nconst PNPM_WORKSPACE_FILE = 'pnpm-workspace.yaml'\n\nexport function analyzePackageDependencyDiff(\n directory: string,\n diff: string,\n): PackageDependencyDiffGraph {\n const resolvedInputPath = path.resolve(process.cwd(), directory)\n const repositoryRoot = findGitRepositoryRoot(resolvedInputPath)\n const inputPathWithinRepository = resolveRepositoryInputPath(\n resolvedInputPath,\n repositoryRoot,\n )\n const comparison = resolveGitDiffComparison(repositoryRoot, diff)\n const beforeGraph = loadGitTreeGraph(\n repositoryRoot,\n comparison.beforeTree,\n inputPathWithinRepository,\n )\n const afterGraph =\n comparison.afterTree === undefined\n ? loadWorkingTreeGraph(repositoryRoot, inputPathWithinRepository)\n : loadGitTreeGraph(\n repositoryRoot,\n comparison.afterTree,\n inputPathWithinRepository,\n )\n\n if (beforeGraph === undefined && afterGraph === undefined) {\n throw new Error(`No package.json found from ${resolvedInputPath}`)\n }\n\n const changedPackagePaths = collectChangedPackagePaths(\n repositoryRoot,\n comparison,\n beforeGraph,\n afterGraph,\n )\n\n return {\n repositoryRoot,\n root: diffPackageNode(\n {\n beforePath: beforeGraph?.rootPath,\n afterPath: afterGraph?.rootPath,\n kind: 'root',\n },\n beforeGraph,\n afterGraph,\n changedPackagePaths,\n new Set(),\n ),\n }\n}\n\nfunction resolveRepositoryInputPath(\n resolvedInputPath: string,\n repositoryRoot: string,\n): string {\n const existingPath = findNearestExistingPath(resolvedInputPath)\n const existingRealPath = fs.realpathSync.native(existingPath)\n const repositoryRealPath = fs.realpathSync.native(repositoryRoot)\n const relativeFromExistingPath = path.relative(\n existingPath,\n resolvedInputPath,\n )\n const relativeToRepository = path.relative(\n repositoryRealPath,\n existingRealPath,\n )\n const normalizedPath = path.normalize(\n path.join(relativeToRepository, relativeFromExistingPath),\n )\n\n return normalizedPath === '.' ? '' : normalizedPath\n}\n\nfunction findGitRepositoryRoot(resolvedInputPath: string): string {\n const searchPath = findNearestExistingPath(resolvedInputPath)\n\n try {\n return runGit(searchPath, ['rev-parse', '--show-toplevel']).trim()\n } catch (error) {\n throw new Error(\n `Git diff mode requires a Git repository: ${getCommandErrorMessage(error)}`,\n )\n }\n}\n\nfunction findNearestExistingPath(resolvedInputPath: string): string {\n let currentPath = resolvedInputPath\n\n while (!fs.existsSync(currentPath)) {\n const parentPath = path.dirname(currentPath)\n\n if (parentPath === currentPath) {\n return resolvedInputPath\n }\n\n currentPath = parentPath\n }\n\n if (fs.statSync(currentPath).isFile()) {\n return path.dirname(currentPath)\n }\n\n return currentPath\n}\n\nfunction resolveGitDiffComparison(\n repositoryRoot: string,\n diff: string,\n): GitDiffComparison {\n if (diff.includes('...')) {\n const [baseRef, headRef] = splitDiffRange(diff, '...')\n\n try {\n const mergeBase = runGit(repositoryRoot, [\n 'merge-base',\n baseRef,\n headRef,\n ]).trim()\n\n return {\n beforeTree: resolveGitTree(repositoryRoot, mergeBase),\n afterTree: resolveGitTree(repositoryRoot, headRef),\n }\n } catch (error) {\n throw new Error(\n `Failed to resolve Git diff spec \\`${diff}\\`: ${getCommandErrorMessage(error)}`,\n )\n }\n }\n\n if (diff.includes('..')) {\n const [beforeRef, afterRef] = splitDiffRange(diff, '..')\n\n try {\n return {\n beforeTree: resolveGitTree(repositoryRoot, beforeRef),\n afterTree: resolveGitTree(repositoryRoot, afterRef),\n }\n } catch (error) {\n throw new Error(\n `Failed to resolve Git diff spec \\`${diff}\\`: ${getCommandErrorMessage(error)}`,\n )\n }\n }\n\n try {\n return {\n beforeTree: resolveGitTree(repositoryRoot, diff),\n afterTree: undefined,\n }\n } catch (error) {\n throw new Error(\n `Failed to resolve Git diff spec \\`${diff}\\`: ${getCommandErrorMessage(error)}`,\n )\n }\n}\n\nfunction splitDiffRange(\n diff: string,\n separator: '...' | '..',\n): readonly [string, string] {\n const [left, right, ...extra] = diff.split(separator)\n\n if (\n left === undefined ||\n right === undefined ||\n left.length === 0 ||\n right.length === 0 ||\n extra.length > 0\n ) {\n throw new Error(`Invalid Git diff spec \\`${diff}\\``)\n }\n\n return [left, right]\n}\n\nfunction resolveGitTree(repositoryRoot: string, reference: string): string {\n return runGit(repositoryRoot, [\n 'rev-parse',\n '--verify',\n `${reference}^{tree}`,\n ]).trim()\n}\n\nfunction loadWorkingTreeGraph(\n repositoryRoot: string,\n inputPathWithinRepository: string,\n): ComparablePackageDependencyGraph | undefined {\n const packageGraph = tryAnalyzePackageGraph(\n resolveSnapshotInputPath(repositoryRoot, inputPathWithinRepository),\n )\n\n return packageGraph === undefined\n ? undefined\n : toComparableGraph(packageGraph)\n}\n\nfunction loadGitTreeGraph(\n repositoryRoot: string,\n tree: string,\n inputPathWithinRepository: string,\n): ComparablePackageDependencyGraph | undefined {\n const snapshotRoot = materializeGitTreeSnapshot(repositoryRoot, tree)\n\n try {\n const packageGraph = tryAnalyzePackageGraph(\n resolveSnapshotInputPath(snapshotRoot, inputPathWithinRepository),\n )\n\n return packageGraph === undefined\n ? undefined\n : toComparableGraph(packageGraph)\n } finally {\n fs.rmSync(snapshotRoot, { recursive: true, force: true })\n }\n}\n\nfunction materializeGitTreeSnapshot(\n repositoryRoot: string,\n tree: string,\n): string {\n const snapshotRoot = fs.mkdtempSync(\n path.join(os.tmpdir(), 'foresthouse-deps-diff-'),\n )\n const trackedFiles = runGit(repositoryRoot, [\n 'ls-tree',\n '-r',\n '-z',\n '--name-only',\n tree,\n ])\n .split('\\u0000')\n .filter((filePath) => filePath.length > 0)\n\n trackedFiles.forEach((filePath) => {\n ensureSnapshotDirectory(snapshotRoot, filePath)\n })\n\n trackedFiles.filter(isManifestSnapshotFile).forEach((filePath) => {\n const fileContent = runGit(\n repositoryRoot,\n ['cat-file', '-p', `${tree}:${filePath}`],\n {\n trim: false,\n },\n )\n const absolutePath = path.join(snapshotRoot, ...filePath.split('/'))\n\n fs.writeFileSync(absolutePath, fileContent)\n })\n\n return snapshotRoot\n}\n\nfunction ensureSnapshotDirectory(snapshotRoot: string, filePath: string): void {\n const parentDirectory = path.dirname(filePath)\n\n if (parentDirectory === '.') {\n return\n }\n\n fs.mkdirSync(path.join(snapshotRoot, ...parentDirectory.split('/')), {\n recursive: true,\n })\n}\n\nfunction isManifestSnapshotFile(filePath: string): boolean {\n const fileName = path.posix.basename(filePath)\n return (\n fileName === 'package.json' ||\n fileName === PNPM_LOCKFILE ||\n fileName === PNPM_WORKSPACE_FILE\n )\n}\n\nfunction resolveSnapshotInputPath(\n snapshotRoot: string,\n inputPathWithinRepository: string,\n): string {\n if (inputPathWithinRepository === '') {\n return snapshotRoot\n }\n\n return path.join(snapshotRoot, inputPathWithinRepository)\n}\n\nfunction tryAnalyzePackageGraph(\n inputPath: string,\n): PackageDependencyGraph | undefined {\n if (!fs.existsSync(inputPath)) {\n return undefined\n }\n\n try {\n return analyzePackageDependencies(inputPath)\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.startsWith('No package.json found from ')\n ) {\n return undefined\n }\n\n throw error\n }\n}\n\nfunction toComparableGraph(\n graph: PackageDependencyGraph,\n): ComparablePackageDependencyGraph {\n const pnpmLockResolutions = loadPnpmLockImporterResolutions(\n graph.repositoryRoot,\n )\n const nodes = new Map<string, ComparablePackageDependencyNode>()\n\n graph.nodes.forEach((node, packageDir) => {\n const packagePath = toDisplayPath(packageDir, graph.repositoryRoot)\n const packageLockResolutions = pnpmLockResolutions?.get(packagePath)\n const dependenciesByKey = new Map<string, ComparablePackageDependency>()\n\n node.dependencies.forEach((dependency) => {\n dependenciesByKey.set(\n createDependencyKey(dependency),\n toComparableDependency(\n dependency,\n graph.repositoryRoot,\n packageLockResolutions?.get(dependency.name),\n ),\n )\n })\n\n nodes.set(packagePath, {\n path: packagePath,\n packageName: node.packageName,\n dependenciesByKey,\n })\n })\n\n return {\n rootPath: toDisplayPath(graph.rootId, graph.repositoryRoot),\n nodes,\n }\n}\n\nfunction createDependencyKey(dependency: PackageManifestDependency): string {\n return `${dependency.kind}:${dependency.name}`\n}\n\nfunction toComparableDependency(\n dependency: PackageManifestDependency,\n repositoryRoot: string,\n lockResolution: PnpmLockDependencyResolution | undefined,\n): ComparablePackageDependency {\n if (dependency.kind === 'external') {\n const resolvedVersion = resolveResolvedVersion(lockResolution)\n const peerContext = resolvePeerContext(lockResolution)\n\n return {\n kind: 'external',\n key: createDependencyKey(dependency),\n name: dependency.name,\n specifier: dependency.specifier,\n ...(resolvedVersion === undefined ? {} : { resolvedVersion }),\n ...(peerContext === undefined ? {} : { peerContext }),\n }\n }\n\n return {\n kind: 'workspace',\n key: createDependencyKey(dependency),\n name: dependency.name,\n specifier: dependency.specifier,\n targetPath: toDisplayPath(dependency.target, repositoryRoot),\n }\n}\n\nfunction resolveResolvedVersion(\n lockResolution: PnpmLockDependencyResolution | undefined,\n): string | undefined {\n if (lockResolution === undefined) {\n return undefined\n }\n\n const version = lockResolution.version?.trim()\n\n if (\n version === undefined ||\n version.length === 0 ||\n version.startsWith('link:') ||\n version.startsWith('file:') ||\n version.startsWith('workspace:')\n ) {\n return undefined\n }\n\n return version\n}\n\nfunction resolvePeerContext(\n lockResolution: PnpmLockDependencyResolution | undefined,\n): string | undefined {\n const peerSuffix = lockResolution?.peerSuffix?.trim()\n\n return peerSuffix === undefined || peerSuffix.length === 0\n ? undefined\n : peerSuffix\n}\n\nfunction diffPackageNode(\n location: {\n readonly beforePath: string | undefined\n readonly afterPath: string | undefined\n readonly kind: 'root' | 'workspace'\n },\n beforeGraph: ComparablePackageDependencyGraph | undefined,\n afterGraph: ComparablePackageDependencyGraph | undefined,\n changedPackagePaths: ReadonlySet<string>,\n ancestry: ReadonlySet<string>,\n): PackageDependencyDiffNode {\n const nodeKey = `${location.beforePath ?? ''}->${location.afterPath ?? ''}`\n const beforeNode =\n location.beforePath === undefined\n ? undefined\n : beforeGraph?.nodes.get(location.beforePath)\n const afterNode =\n location.afterPath === undefined\n ? undefined\n : afterGraph?.nodes.get(location.afterPath)\n\n if (beforeNode === undefined && afterNode === undefined) {\n throw new Error('Unable to resolve package diff node.')\n }\n\n const packageName =\n afterNode?.packageName ??\n beforeNode?.packageName ??\n location.afterPath ??\n location.beforePath ??\n '.'\n const packagePath = location.afterPath ?? location.beforePath ?? '.'\n\n if (ancestry.has(nodeKey)) {\n return {\n kind: 'circular',\n label: location.kind === 'root' ? packageName : packagePath,\n packageName,\n path: packagePath,\n change: 'unchanged',\n dependencies: [],\n }\n }\n\n const nextAncestry = new Set(ancestry)\n nextAncestry.add(nodeKey)\n\n const dependencies = collectDependencyDiffs(\n beforeNode,\n afterNode,\n beforeGraph,\n afterGraph,\n changedPackagePaths,\n nextAncestry,\n )\n const change = resolveNodeChange(\n location,\n beforeNode,\n afterNode,\n dependencies,\n changedPackagePaths,\n )\n\n return {\n kind: location.kind,\n label: location.kind === 'root' ? packageName : packagePath,\n packageName,\n path: packagePath,\n change,\n ...(beforeNode !== undefined &&\n afterNode !== undefined &&\n beforeNode.packageName !== afterNode.packageName\n ? {\n beforePackageName: beforeNode.packageName,\n afterPackageName: afterNode.packageName,\n }\n : {}),\n dependencies,\n }\n}\n\nfunction collectDependencyDiffs(\n beforeNode: ComparablePackageDependencyNode | undefined,\n afterNode: ComparablePackageDependencyNode | undefined,\n beforeGraph: ComparablePackageDependencyGraph | undefined,\n afterGraph: ComparablePackageDependencyGraph | undefined,\n changedPackagePaths: ReadonlySet<string>,\n ancestry: ReadonlySet<string>,\n): PackageDependencyDiffDependency[] {\n const dependencyKeys = new Set<string>([\n ...Array.from(beforeNode?.dependenciesByKey.keys() ?? []),\n ...Array.from(afterNode?.dependenciesByKey.keys() ?? []),\n ])\n\n return Array.from(dependencyKeys)\n .sort((left, right) =>\n compareDependencyLabels(\n beforeNode?.dependenciesByKey.get(left) ??\n afterNode?.dependenciesByKey.get(left),\n beforeNode?.dependenciesByKey.get(right) ??\n afterNode?.dependenciesByKey.get(right),\n ),\n )\n .flatMap((dependencyKey) => {\n const dependency = diffDependency(\n beforeNode?.dependenciesByKey.get(dependencyKey),\n afterNode?.dependenciesByKey.get(dependencyKey),\n beforeGraph,\n afterGraph,\n changedPackagePaths,\n ancestry,\n )\n\n return dependency === undefined ? [] : [dependency]\n })\n}\n\nfunction compareDependencyLabels(\n left: ComparablePackageDependency | undefined,\n right: ComparablePackageDependency | undefined,\n): number {\n const leftLabel = left === undefined ? '' : getDependencySortLabel(left)\n const rightLabel = right === undefined ? '' : getDependencySortLabel(right)\n\n return leftLabel.localeCompare(rightLabel)\n}\n\nfunction getDependencySortLabel(\n dependency: ComparablePackageDependency,\n): string {\n if (dependency.kind === 'external') {\n return `${dependency.name}@${dependency.specifier}`\n }\n\n return dependency.targetPath\n}\n\nfunction diffDependency(\n beforeDependency: ComparablePackageDependency | undefined,\n afterDependency: ComparablePackageDependency | undefined,\n beforeGraph: ComparablePackageDependencyGraph | undefined,\n afterGraph: ComparablePackageDependencyGraph | undefined,\n changedPackagePaths: ReadonlySet<string>,\n ancestry: ReadonlySet<string>,\n): PackageDependencyDiffDependency | undefined {\n const change = resolveDependencyChange(beforeDependency, afterDependency)\n\n if (\n beforeDependency?.kind === 'workspace' ||\n afterDependency?.kind === 'workspace'\n ) {\n const workspaceDependency =\n afterDependency?.kind === 'workspace'\n ? afterDependency\n : beforeDependency?.kind === 'workspace'\n ? beforeDependency\n : undefined\n\n if (workspaceDependency === undefined) {\n return undefined\n }\n\n const node = diffPackageNode(\n {\n beforePath:\n beforeDependency?.kind === 'workspace'\n ? beforeDependency.targetPath\n : undefined,\n afterPath:\n afterDependency?.kind === 'workspace'\n ? afterDependency.targetPath\n : undefined,\n kind: 'workspace',\n },\n beforeGraph,\n afterGraph,\n changedPackagePaths,\n ancestry,\n )\n\n if (change === 'unchanged' && !hasVisibleChanges(node)) {\n return undefined\n }\n\n return {\n kind: 'workspace',\n name: workspaceDependency.name,\n change,\n ...(beforeDependency === undefined\n ? {}\n : { before: toDiffState(beforeDependency) }),\n ...(afterDependency === undefined\n ? {}\n : { after: toDiffState(afterDependency) }),\n node,\n }\n }\n\n if (change === 'unchanged') {\n return undefined\n }\n\n const dependency = afterDependency ?? beforeDependency\n\n if (dependency === undefined || dependency.kind !== 'external') {\n return undefined\n }\n\n return {\n kind: 'external',\n name: dependency.name,\n change,\n specifierChanged: didExternalSpecifierChange(\n beforeDependency,\n afterDependency,\n ),\n resolvedVersionChanged: didExternalResolvedVersionChange(\n beforeDependency,\n afterDependency,\n ),\n peerContextChanged: didExternalPeerContextChange(\n beforeDependency,\n afterDependency,\n ),\n ...(beforeDependency === undefined\n ? {}\n : { before: toDiffState(beforeDependency) }),\n ...(afterDependency === undefined\n ? {}\n : { after: toDiffState(afterDependency) }),\n }\n}\n\nfunction didExternalSpecifierChange(\n beforeDependency: ComparablePackageDependency | undefined,\n afterDependency: ComparablePackageDependency | undefined,\n): boolean {\n return (\n beforeDependency?.kind === 'external' &&\n afterDependency?.kind === 'external' &&\n beforeDependency.specifier !== afterDependency.specifier\n )\n}\n\nfunction didExternalResolvedVersionChange(\n beforeDependency: ComparablePackageDependency | undefined,\n afterDependency: ComparablePackageDependency | undefined,\n): boolean {\n return (\n beforeDependency?.kind === 'external' &&\n afterDependency?.kind === 'external' &&\n beforeDependency.resolvedVersion !== afterDependency.resolvedVersion\n )\n}\n\nfunction didExternalPeerContextChange(\n beforeDependency: ComparablePackageDependency | undefined,\n afterDependency: ComparablePackageDependency | undefined,\n): boolean {\n return (\n beforeDependency?.kind === 'external' &&\n afterDependency?.kind === 'external' &&\n beforeDependency.peerContext !== afterDependency.peerContext\n )\n}\n\nfunction resolveDependencyChange(\n beforeDependency: ComparablePackageDependency | undefined,\n afterDependency: ComparablePackageDependency | undefined,\n): PackageDependencyChangeKind {\n if (beforeDependency === undefined && afterDependency !== undefined) {\n return 'added'\n }\n\n if (beforeDependency !== undefined && afterDependency === undefined) {\n return 'removed'\n }\n\n if (beforeDependency === undefined || afterDependency === undefined) {\n return 'unchanged'\n }\n\n if (beforeDependency.kind !== afterDependency.kind) {\n return 'changed'\n }\n\n if (\n beforeDependency.kind === 'external' &&\n afterDependency.kind === 'external'\n ) {\n return beforeDependency.specifier === afterDependency.specifier &&\n beforeDependency.resolvedVersion === afterDependency.resolvedVersion &&\n beforeDependency.peerContext === afterDependency.peerContext\n ? 'unchanged'\n : 'changed'\n }\n\n if (\n beforeDependency.kind === 'workspace' &&\n afterDependency.kind === 'workspace'\n ) {\n return beforeDependency.specifier === afterDependency.specifier &&\n beforeDependency.targetPath === afterDependency.targetPath\n ? 'unchanged'\n : 'changed'\n }\n\n return 'changed'\n}\n\nfunction toDiffState(\n dependency: ComparablePackageDependency,\n): PackageDependencyDiffState {\n if (dependency.kind === 'external') {\n return {\n target: `${dependency.name}@${dependency.specifier}`,\n specifier: dependency.specifier,\n ...(dependency.resolvedVersion === undefined\n ? {}\n : { resolvedVersion: dependency.resolvedVersion }),\n ...(dependency.peerContext === undefined\n ? {}\n : { peerContext: dependency.peerContext }),\n }\n }\n\n return dependency.specifier === undefined\n ? {\n target: dependency.targetPath,\n }\n : {\n target: dependency.targetPath,\n specifier: dependency.specifier,\n }\n}\n\nfunction hasVisibleChanges(node: PackageDependencyDiffNode): boolean {\n return node.change !== 'unchanged' || node.dependencies.length > 0\n}\n\nfunction resolveNodeChange(\n location: {\n readonly beforePath: string | undefined\n readonly afterPath: string | undefined\n },\n beforeNode: ComparablePackageDependencyNode | undefined,\n afterNode: ComparablePackageDependencyNode | undefined,\n dependencies: readonly PackageDependencyDiffDependency[],\n changedPackagePaths: ReadonlySet<string>,\n): PackageDependencyChangeKind {\n if (beforeNode === undefined && afterNode !== undefined) {\n return 'added'\n }\n\n if (beforeNode !== undefined && afterNode === undefined) {\n return 'removed'\n }\n\n if (beforeNode === undefined || afterNode === undefined) {\n return 'unchanged'\n }\n\n if (location.beforePath !== location.afterPath) {\n return 'changed'\n }\n\n if (beforeNode.packageName !== afterNode.packageName) {\n return 'changed'\n }\n\n const packagePath = location.afterPath ?? location.beforePath\n\n if (packagePath !== undefined && changedPackagePaths.has(packagePath)) {\n return 'changed'\n }\n\n return dependencies.length > 0 ? 'changed' : 'unchanged'\n}\n\nfunction collectChangedPackagePaths(\n repositoryRoot: string,\n comparison: GitDiffComparison,\n beforeGraph: ComparablePackageDependencyGraph | undefined,\n afterGraph: ComparablePackageDependencyGraph | undefined,\n): ReadonlySet<string> {\n const changedFiles = listChangedRepositoryPaths(repositoryRoot, comparison)\n const packagePaths = Array.from(\n new Set([\n ...Array.from(beforeGraph?.nodes.keys() ?? []),\n ...Array.from(afterGraph?.nodes.keys() ?? []),\n ]),\n ).sort((left, right) => right.length - left.length)\n const changedPackagePaths = new Set<string>()\n\n changedFiles.forEach((filePath) => {\n const ownerPackagePath = packagePaths.find((packagePath) =>\n isFileInPackage(filePath, packagePath),\n )\n\n if (ownerPackagePath !== undefined) {\n changedPackagePaths.add(ownerPackagePath)\n }\n })\n\n return changedPackagePaths\n}\n\nfunction listChangedRepositoryPaths(\n repositoryRoot: string,\n comparison: GitDiffComparison,\n): readonly string[] {\n const trackedChanges =\n comparison.afterTree === undefined\n ? runGit(repositoryRoot, [\n 'diff',\n '--name-only',\n '-z',\n comparison.beforeTree,\n '--',\n ])\n : runGit(repositoryRoot, [\n 'diff',\n '--name-only',\n '-z',\n comparison.beforeTree,\n comparison.afterTree,\n ])\n\n const changedPaths = new Set(\n trackedChanges.split('\\u0000').filter((filePath) => filePath.length > 0),\n )\n\n if (comparison.afterTree === undefined) {\n runGit(repositoryRoot, ['ls-files', '--others', '--exclude-standard', '-z'])\n .split('\\u0000')\n .filter((filePath) => filePath.length > 0)\n .forEach((filePath) => {\n changedPaths.add(filePath)\n })\n }\n\n return Array.from(changedPaths)\n}\n\nfunction isFileInPackage(filePath: string, packagePath: string): boolean {\n if (packagePath === '.') {\n return true\n }\n\n return filePath === packagePath || filePath.startsWith(`${packagePath}/`)\n}\n\nfunction runGit(\n repositoryRoot: string,\n args: readonly string[],\n options: {\n readonly trim?: boolean\n } = {},\n): string {\n const output = execFileSync('git', ['-C', repositoryRoot, ...args], {\n encoding: 'utf8',\n })\n\n return options.trim === false ? output : output.trimEnd()\n}\n\nfunction getCommandErrorMessage(error: unknown): string {\n if (!(error instanceof Error)) {\n return 'Unknown Git error'\n }\n\n const stderr = Reflect.get(error, 'stderr')\n\n if (typeof stderr === 'string' && stderr.trim().length > 0) {\n return stderr.trim()\n }\n\n if (Buffer.isBuffer(stderr) && stderr.byteLength > 0) {\n return stderr.toString('utf8').trim()\n }\n\n return error.message\n}\n","import path from 'node:path'\nimport ts from 'typescript'\n\nexport interface LoadedConfig {\n readonly path?: string\n readonly compilerOptions: ts.CompilerOptions\n}\n\nexport function loadCompilerOptions(\n searchFrom: string,\n explicitConfigPath?: string,\n): LoadedConfig {\n const configPath =\n explicitConfigPath === undefined\n ? findNearestConfig(searchFrom)\n : path.resolve(searchFrom, explicitConfigPath)\n\n if (configPath === undefined) {\n return {\n compilerOptions: defaultCompilerOptions(),\n }\n }\n\n const readResult = ts.readConfigFile(configPath, ts.sys.readFile)\n if (readResult.error !== undefined) {\n throw new Error(\n `Failed to read TypeScript config at ${configPath}: ${formatDiagnostic(\n readResult.error,\n )}`,\n )\n }\n\n const parsed = ts.parseJsonConfigFileContent(\n readResult.config,\n ts.sys,\n path.dirname(configPath),\n defaultCompilerOptions(),\n configPath,\n )\n\n if (parsed.errors.length > 0) {\n const [firstError] = parsed.errors\n if (firstError === undefined) {\n throw new Error(`Failed to parse TypeScript config at ${configPath}.`)\n }\n\n throw new Error(\n `Failed to parse TypeScript config at ${configPath}: ${formatDiagnostic(\n firstError,\n )}`,\n )\n }\n\n return {\n path: configPath,\n compilerOptions: parsed.options,\n }\n}\n\nfunction findNearestConfig(searchFrom: string): string | undefined {\n let currentDirectory = path.resolve(searchFrom)\n\n while (true) {\n if (!isInsideNodeModules(currentDirectory)) {\n const tsconfigPath = path.join(currentDirectory, 'tsconfig.json')\n if (ts.sys.fileExists(tsconfigPath)) {\n return tsconfigPath\n }\n\n const jsconfigPath = path.join(currentDirectory, 'jsconfig.json')\n if (ts.sys.fileExists(jsconfigPath)) {\n return jsconfigPath\n }\n }\n\n const parentDirectory = path.dirname(currentDirectory)\n if (parentDirectory === currentDirectory) {\n return undefined\n }\n\n currentDirectory = parentDirectory\n }\n}\n\nfunction defaultCompilerOptions(): ts.CompilerOptions {\n return {\n allowJs: true,\n jsx: ts.JsxEmit.ReactJSX,\n module: ts.ModuleKind.NodeNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n target: ts.ScriptTarget.ESNext,\n resolveJsonModule: true,\n esModuleInterop: true,\n }\n}\n\nfunction formatDiagnostic(diagnostic: ts.Diagnostic): string {\n return ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n')\n}\n\nfunction isInsideNodeModules(filePath: string): boolean {\n return filePath.includes(`${path.sep}node_modules${path.sep}`)\n}\n","import path from 'node:path'\n\nexport const SOURCE_EXTENSIONS = new Set([\n '.js',\n '.jsx',\n '.ts',\n '.tsx',\n '.mjs',\n '.cjs',\n '.mts',\n '.cts',\n])\n\nexport function isSourceCodeFile(filePath: string): boolean {\n return SOURCE_EXTENSIONS.has(path.extname(filePath).toLowerCase())\n}\n","import path from 'node:path'\n\nexport function normalizeFilePath(filePath: string): string {\n return path.normalize(filePath)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport { isSourceCodeFile } from '../../utils/is-source-code-file.js'\nimport { normalizeFilePath } from '../../utils/normalize-file-path.js'\n\nexport function resolveExistingPath(cwd: string, entryFile: string): string {\n const absolutePath = path.resolve(cwd, entryFile)\n const normalizedPath = normalizeFilePath(absolutePath)\n\n if (!fs.existsSync(normalizedPath)) {\n throw new Error(`Entry file not found: ${entryFile}`)\n }\n\n if (!isSourceCodeFile(normalizedPath)) {\n throw new Error(`Entry file must be a JS/TS source file: ${entryFile}`)\n }\n\n return normalizedPath\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport ts from 'typescript'\n\nexport function createProgram(\n entryFile: string,\n compilerOptions: ts.CompilerOptions,\n currentDirectory: string,\n): ts.Program {\n const host = ts.createCompilerHost(compilerOptions, true)\n host.getCurrentDirectory = () => currentDirectory\n\n if (ts.sys.realpath !== undefined) {\n host.realpath = ts.sys.realpath\n }\n\n return ts.createProgram({\n rootNames: [entryFile],\n options: compilerOptions,\n host,\n })\n}\n\nexport function createSourceFile(filePath: string): ts.SourceFile {\n const sourceText = fs.readFileSync(filePath, 'utf8')\n return ts.createSourceFile(\n filePath,\n sourceText,\n ts.ScriptTarget.Latest,\n true,\n getScriptKind(filePath),\n )\n}\n\nexport function createModuleResolutionHost(\n currentDirectory: string,\n): ts.ModuleResolutionHost {\n return {\n fileExists: ts.sys.fileExists,\n readFile: ts.sys.readFile,\n directoryExists: ts.sys.directoryExists,\n getCurrentDirectory: () => currentDirectory,\n getDirectories: ts.sys.getDirectories,\n ...(ts.sys.realpath === undefined ? {} : { realpath: ts.sys.realpath }),\n }\n}\n\nfunction getScriptKind(filePath: string): ts.ScriptKind {\n switch (path.extname(filePath).toLowerCase()) {\n case '.js':\n case '.mjs':\n case '.cjs':\n return ts.ScriptKind.JS\n case '.jsx':\n return ts.ScriptKind.JSX\n case '.tsx':\n return ts.ScriptKind.TSX\n case '.json':\n return ts.ScriptKind.JSON\n default:\n return ts.ScriptKind.TS\n }\n}\n","import ts from 'typescript'\n\nexport function collectUnusedImports(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n): ReadonlyMap<ts.ImportDeclaration, boolean> {\n const importUsage = new Map<\n ts.ImportDeclaration,\n {\n canTrack: boolean\n used: boolean\n }\n >()\n const symbolToImportDeclaration = new Map<ts.Symbol, ts.ImportDeclaration>()\n const importedLocalNames = new Set<string>()\n\n sourceFile.statements.forEach((statement) => {\n if (\n !ts.isImportDeclaration(statement) ||\n statement.importClause === undefined\n ) {\n return\n }\n\n const identifiers = getImportBindingIdentifiers(statement.importClause)\n if (identifiers.length === 0) {\n return\n }\n\n importUsage.set(statement, {\n canTrack: false,\n used: false,\n })\n\n identifiers.forEach((identifier) => {\n importedLocalNames.add(identifier.text)\n\n const symbol = tryGetSymbolAtLocation(checker, identifier)\n if (symbol === undefined) {\n return\n }\n\n symbolToImportDeclaration.set(symbol, statement)\n const state = importUsage.get(statement)\n if (state !== undefined) {\n state.canTrack = true\n }\n })\n })\n\n function visit(node: ts.Node): void {\n if (ts.isImportDeclaration(node)) {\n return\n }\n\n if (\n ts.isIdentifier(node) &&\n importedLocalNames.has(node.text) &&\n isReferenceIdentifier(node)\n ) {\n const symbol = tryGetSymbolAtLocation(checker, node)\n const declaration =\n symbol === undefined ? undefined : symbolToImportDeclaration.get(symbol)\n if (declaration !== undefined) {\n const state = importUsage.get(declaration)\n if (state !== undefined) {\n state.used = true\n }\n }\n }\n\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n\n return new Map(\n [...importUsage.entries()].map(([declaration, state]) => [\n declaration,\n state.canTrack && !state.used,\n ]),\n )\n}\n\nfunction getImportBindingIdentifiers(\n importClause: ts.ImportClause,\n): ts.Identifier[] {\n const identifiers: ts.Identifier[] = []\n\n if (importClause.name !== undefined) {\n identifiers.push(importClause.name)\n }\n\n const namedBindings = importClause.namedBindings\n if (namedBindings === undefined) {\n return identifiers\n }\n\n if (ts.isNamespaceImport(namedBindings)) {\n identifiers.push(namedBindings.name)\n return identifiers\n }\n\n namedBindings.elements.forEach((element) => {\n identifiers.push(element.name)\n })\n\n return identifiers\n}\n\nfunction isReferenceIdentifier(node: ts.Identifier): boolean {\n const parent = node.parent\n\n if (ts.isPropertyAccessExpression(parent) && parent.name === node) {\n return false\n }\n\n if (ts.isQualifiedName(parent) && parent.right === node) {\n return false\n }\n\n if (ts.isPropertyAssignment(parent) && parent.name === node) {\n return false\n }\n\n if (ts.isBindingElement(parent) && parent.propertyName === node) {\n return false\n }\n\n if (ts.isJsxAttribute(parent) && parent.name === node) {\n return false\n }\n\n if (ts.isExportSpecifier(parent)) {\n return parent.propertyName === node || parent.propertyName === undefined\n }\n\n return true\n}\n\nfunction tryGetSymbolAtLocation(\n checker: ts.TypeChecker,\n node: ts.Node,\n): ts.Symbol | undefined {\n try {\n return checker.getSymbolAtLocation(node)\n } catch {\n return undefined\n }\n}\n","import ts from 'typescript'\n\nimport type { ReferenceKind } from '../../types/reference-kind.js'\nimport { collectUnusedImports } from './unused.js'\n\nexport interface ModuleReference {\n readonly specifier: string\n readonly referenceKind: ReferenceKind\n readonly isTypeOnly: boolean\n readonly unused: boolean\n}\n\nexport function collectModuleReferences(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n): ModuleReference[] {\n const references = new Map<string, ModuleReference>()\n const unusedImports = collectUnusedImports(sourceFile, checker)\n\n function addReference(\n specifier: string,\n referenceKind: ReferenceKind,\n isTypeOnly: boolean,\n unused: boolean,\n ): void {\n const key = `${referenceKind}:${isTypeOnly ? 'type' : 'value'}:${specifier}`\n const existing = references.get(key)\n if (existing !== undefined) {\n if (existing.unused && !unused) {\n references.set(key, {\n ...existing,\n unused: false,\n })\n }\n return\n }\n\n references.set(key, {\n specifier,\n referenceKind,\n isTypeOnly,\n unused,\n })\n }\n\n function visit(node: ts.Node): void {\n if (\n ts.isImportDeclaration(node) &&\n ts.isStringLiteralLike(node.moduleSpecifier)\n ) {\n addReference(\n node.moduleSpecifier.text,\n 'import',\n node.importClause?.isTypeOnly ?? false,\n unusedImports.get(node) ?? false,\n )\n } else if (\n ts.isExportDeclaration(node) &&\n node.moduleSpecifier !== undefined &&\n ts.isStringLiteralLike(node.moduleSpecifier)\n ) {\n addReference(\n node.moduleSpecifier.text,\n 'export',\n node.isTypeOnly ?? false,\n false,\n )\n } else if (ts.isImportEqualsDeclaration(node)) {\n const moduleReference = node.moduleReference\n if (\n ts.isExternalModuleReference(moduleReference) &&\n moduleReference.expression !== undefined &&\n ts.isStringLiteralLike(moduleReference.expression)\n ) {\n addReference(\n moduleReference.expression.text,\n 'import-equals',\n false,\n false,\n )\n }\n } else if (ts.isCallExpression(node)) {\n if (\n node.expression.kind === ts.SyntaxKind.ImportKeyword &&\n node.arguments.length === 1\n ) {\n const [argument] = node.arguments\n if (argument !== undefined && ts.isStringLiteralLike(argument)) {\n addReference(argument.text, 'dynamic-import', false, false)\n }\n }\n\n if (\n ts.isIdentifier(node.expression) &&\n node.expression.text === 'require' &&\n node.arguments.length === 1\n ) {\n const [argument] = node.arguments\n if (argument !== undefined && ts.isStringLiteralLike(argument)) {\n addReference(argument.text, 'require', false, false)\n }\n }\n }\n\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n return [...references.values()]\n}\n","import { builtinModules } from 'node:module'\nimport path from 'node:path'\nimport type { ResolverFactory } from 'oxc-resolver'\nimport ts from 'typescript'\n\nimport type { DependencyEdge } from '../../types/dependency-edge.js'\nimport type { DependencyKind } from '../../types/dependency-kind.js'\nimport { isSourceCodeFile } from '../../utils/is-source-code-file.js'\nimport { normalizeFilePath } from '../../utils/normalize-file-path.js'\nimport type { ModuleReference } from './references.js'\n\nconst BUILTIN_MODULES = new Set(\n builtinModules.flatMap((name) => [name, `node:${name}`]),\n)\n\nexport interface ResolverConfigContext {\n readonly path?: string\n readonly compilerOptions: ts.CompilerOptions\n}\n\nexport interface ResolveDependencyOptions {\n readonly cwd: string\n readonly entryConfigPath?: string\n readonly expandWorkspaces: boolean\n readonly projectOnly: boolean\n readonly getConfigForFile: (filePath: string) => ResolverConfigContext\n readonly getResolverForFile: (filePath: string) => ResolverFactory\n}\n\nexport function resolveDependency(\n reference: ModuleReference,\n containingFile: string,\n options: ResolveDependencyOptions,\n): DependencyEdge {\n const specifier = reference.specifier\n if (BUILTIN_MODULES.has(specifier)) {\n return createEdge(reference, 'builtin', specifier)\n }\n\n const containingConfig = options.getConfigForFile(containingFile)\n const oxcResolution = resolveWithOxc(\n reference,\n specifier,\n containingFile,\n options,\n )\n if (oxcResolution !== undefined) {\n return oxcResolution\n }\n\n const host = createResolutionHost(containingConfig, options.cwd)\n const resolution = ts.resolveModuleName(\n specifier,\n containingFile,\n containingConfig.compilerOptions,\n host,\n ).resolvedModule\n\n if (resolution !== undefined) {\n const resolvedPath = normalizeFilePath(resolution.resolvedFileName)\n const realPath = resolveRealPath(resolvedPath)\n const sourcePath = pickSourcePath(resolvedPath, realPath)\n\n if (sourcePath !== undefined) {\n const boundary = classifyBoundary(specifier, sourcePath, options)\n if (boundary !== undefined) {\n return createEdge(reference, 'boundary', sourcePath, boundary)\n }\n\n if (\n !resolution.isExternalLibraryImport ||\n !isInsideNodeModules(sourcePath) ||\n (realPath !== undefined && !isInsideNodeModules(realPath))\n ) {\n return createEdge(reference, 'source', sourcePath)\n }\n }\n\n if (\n resolution.isExternalLibraryImport ||\n isInsideNodeModules(resolvedPath) ||\n (realPath !== undefined && isInsideNodeModules(realPath))\n ) {\n return createEdge(reference, 'external', specifier)\n }\n }\n\n if (!specifier.startsWith('.') && !path.isAbsolute(specifier)) {\n return createEdge(reference, 'external', specifier)\n }\n\n return createEdge(reference, 'missing', specifier)\n}\n\nfunction resolveWithOxc(\n reference: ModuleReference,\n specifier: string,\n containingFile: string,\n options: ResolveDependencyOptions,\n): DependencyEdge | undefined {\n try {\n const result = options\n .getResolverForFile(containingFile)\n .resolveFileSync(containingFile, specifier)\n\n if (result.builtin !== undefined) {\n return createEdge(reference, 'builtin', result.builtin.resolved)\n }\n\n if (result.path !== undefined) {\n return classifyResolvedPath(reference, specifier, result.path, options)\n }\n } catch {\n return undefined\n }\n\n return undefined\n}\n\nfunction createEdge(\n reference: ModuleReference,\n kind: DependencyKind,\n target: string,\n boundary?: 'workspace' | 'project',\n): DependencyEdge {\n return {\n specifier: reference.specifier,\n referenceKind: reference.referenceKind,\n isTypeOnly: reference.isTypeOnly,\n unused: reference.unused,\n kind,\n target,\n ...(boundary === undefined ? {} : { boundary }),\n }\n}\n\nfunction createResolutionHost(\n config: ResolverConfigContext,\n cwd: string,\n): ts.ModuleResolutionHost {\n return {\n fileExists: ts.sys.fileExists,\n readFile: ts.sys.readFile,\n directoryExists: ts.sys.directoryExists,\n getCurrentDirectory: () =>\n config.path === undefined ? cwd : path.dirname(config.path),\n getDirectories: ts.sys.getDirectories,\n ...(ts.sys.realpath === undefined ? {} : { realpath: ts.sys.realpath }),\n }\n}\n\nfunction resolveRealPath(resolvedPath: string): string | undefined {\n if (ts.sys.realpath === undefined) {\n return undefined\n }\n\n try {\n return normalizeFilePath(ts.sys.realpath(resolvedPath))\n } catch {\n return undefined\n }\n}\n\nfunction classifyResolvedPath(\n reference: ModuleReference,\n specifier: string,\n resolvedPathValue: string,\n options: ResolveDependencyOptions,\n): DependencyEdge {\n const resolvedPath = normalizeFilePath(resolvedPathValue)\n const realPath = resolveRealPath(resolvedPath)\n const sourcePath = pickSourcePath(resolvedPath, realPath)\n\n if (sourcePath !== undefined) {\n const boundary = classifyBoundary(specifier, sourcePath, options)\n if (boundary !== undefined) {\n return createEdge(reference, 'boundary', sourcePath, boundary)\n }\n\n if (\n !isInsideNodeModules(sourcePath) ||\n (realPath !== undefined && !isInsideNodeModules(realPath))\n ) {\n return createEdge(reference, 'source', sourcePath)\n }\n }\n\n return createEdge(reference, 'external', specifier)\n}\n\nfunction pickSourcePath(\n resolvedPath: string,\n realPath: string | undefined,\n): string | undefined {\n const candidates = [realPath, resolvedPath]\n\n for (const candidate of candidates) {\n if (\n candidate !== undefined &&\n isSourceCodeFile(candidate) &&\n !candidate.endsWith('.d.ts')\n ) {\n return candidate\n }\n }\n\n return undefined\n}\n\nfunction classifyBoundary(\n specifier: string,\n sourcePath: string,\n options: ResolveDependencyOptions,\n): 'workspace' | 'project' | undefined {\n const targetConfigPath = options.getConfigForFile(sourcePath).path\n const entryConfigPath = options.entryConfigPath\n\n if (\n options.projectOnly &&\n entryConfigPath !== undefined &&\n targetConfigPath !== entryConfigPath\n ) {\n return 'project'\n }\n\n if (\n !options.expandWorkspaces &&\n isWorkspaceLikeImport(specifier) &&\n entryConfigPath !== undefined &&\n targetConfigPath !== entryConfigPath\n ) {\n return 'workspace'\n }\n\n return undefined\n}\n\nfunction isWorkspaceLikeImport(specifier: string): boolean {\n return !specifier.startsWith('.') && !path.isAbsolute(specifier)\n}\n\nfunction isInsideNodeModules(filePath: string): boolean {\n return filePath.includes(`${path.sep}node_modules${path.sep}`)\n}\n","import path from 'node:path'\nimport { ResolverFactory } from 'oxc-resolver'\nimport type ts from 'typescript'\n\nimport type { SourceModuleNode } from '../../types/source-module-node.js'\nimport { loadCompilerOptions } from '../../typescript/config.js'\nimport { createProgram, createSourceFile } from '../../typescript/program.js'\nimport { normalizeFilePath } from '../../utils/normalize-file-path.js'\nimport { collectModuleReferences } from './references.js'\nimport { resolveDependency } from './resolver.js'\n\nexport function buildDependencyGraph(\n entryPath: string,\n options: BuildDependencyGraphOptions,\n): Map<string, SourceModuleNode> {\n return new DependencyGraphBuilder(entryPath, options).build()\n}\n\nexport interface BuildDependencyGraphOptions {\n readonly cwd: string\n readonly entryConfigPath?: string\n readonly entryCompilerOptions: ts.CompilerOptions\n readonly expandWorkspaces: boolean\n readonly projectOnly: boolean\n}\n\nclass DependencyGraphBuilder {\n private readonly nodes = new Map<string, SourceModuleNode>()\n private readonly configCache = new Map<\n string,\n import('./resolver.js').ResolverConfigContext\n >()\n private readonly programCache = new Map<string, ts.Program>()\n private readonly checkerCache = new Map<string, ts.TypeChecker>()\n private readonly resolverCache = new Map<string, ResolverFactory>()\n\n constructor(\n private readonly entryPath: string,\n private readonly options: BuildDependencyGraphOptions,\n ) {\n const entryConfig: import('./resolver.js').ResolverConfigContext = {\n compilerOptions: options.entryCompilerOptions,\n ...(options.entryConfigPath === undefined\n ? {}\n : { path: options.entryConfigPath }),\n }\n\n this.configCache.set(path.dirname(this.entryPath), entryConfig)\n }\n\n build(): Map<string, SourceModuleNode> {\n this.visitFile(this.entryPath)\n return this.nodes\n }\n\n private visitFile(filePath: string): void {\n const normalizedPath = normalizeFilePath(filePath)\n if (this.nodes.has(normalizedPath)) {\n return\n }\n\n const config = this.getConfigForFile(normalizedPath)\n const program = this.getProgramForFile(normalizedPath, config)\n const checker = this.getCheckerForFile(normalizedPath, config)\n const sourceFile =\n program.getSourceFile(normalizedPath) ?? createSourceFile(normalizedPath)\n\n const references = collectModuleReferences(sourceFile, checker)\n const dependencies = references.map((reference) =>\n resolveDependency(reference, normalizedPath, {\n cwd: this.options.cwd,\n expandWorkspaces: this.options.expandWorkspaces,\n projectOnly: this.options.projectOnly,\n getConfigForFile: (targetPath) => this.getConfigForFile(targetPath),\n getResolverForFile: (targetPath) => this.getResolverForFile(targetPath),\n ...(this.options.entryConfigPath === undefined\n ? {}\n : { entryConfigPath: this.options.entryConfigPath }),\n }),\n )\n\n this.nodes.set(normalizedPath, {\n id: normalizedPath,\n dependencies,\n })\n\n for (const dependency of dependencies) {\n if (dependency.kind === 'source') {\n this.visitFile(dependency.target)\n }\n }\n }\n\n private getConfigForFile(\n filePath: string,\n ): import('./resolver.js').ResolverConfigContext {\n const directory = path.dirname(filePath)\n const cached = this.configCache.get(directory)\n if (cached !== undefined) {\n return cached\n }\n\n const loaded = loadCompilerOptions(directory)\n this.configCache.set(directory, loaded)\n return loaded\n }\n\n private getProgramForFile(\n filePath: string,\n config: import('./resolver.js').ResolverConfigContext,\n ): ts.Program {\n const cacheKey = this.getProgramCacheKey(filePath, config)\n const cached = this.programCache.get(cacheKey)\n if (cached !== undefined) {\n return cached\n }\n\n const currentDirectory =\n config.path === undefined\n ? path.dirname(filePath)\n : path.dirname(config.path)\n const program = createProgram(\n filePath,\n config.compilerOptions,\n currentDirectory,\n )\n this.programCache.set(cacheKey, program)\n return program\n }\n\n private getCheckerForFile(\n filePath: string,\n config: import('./resolver.js').ResolverConfigContext,\n ): ts.TypeChecker {\n const cacheKey = this.getProgramCacheKey(filePath, config)\n const cached = this.checkerCache.get(cacheKey)\n if (cached !== undefined) {\n return cached\n }\n\n const checker = this.getProgramForFile(filePath, config).getTypeChecker()\n this.checkerCache.set(cacheKey, checker)\n return checker\n }\n\n private getProgramCacheKey(\n filePath: string,\n config: import('./resolver.js').ResolverConfigContext,\n ): string {\n return config.path ?? `default:${path.dirname(filePath)}`\n }\n\n private getResolverForFile(filePath: string): ResolverFactory {\n const config = this.getConfigForFile(filePath)\n const cacheKey = this.getProgramCacheKey(filePath, config)\n const cached = this.resolverCache.get(cacheKey)\n if (cached !== undefined) {\n return cached\n }\n\n const resolver = new ResolverFactory({\n builtinModules: true,\n conditionNames: ['import', 'require', 'default'],\n extensions: [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.mts',\n '.cts',\n '.mjs',\n '.cjs',\n '.json',\n ],\n mainFields: ['types', 'module', 'main'],\n tsconfig:\n config.path === undefined ? 'auto' : { configFile: config.path },\n })\n this.resolverCache.set(cacheKey, resolver)\n return resolver\n }\n}\n","import path from 'node:path'\n\nimport type { AnalyzeOptions } from '../../types/analyze-options.js'\nimport type { DependencyGraph } from '../../types/dependency-graph.js'\nimport { loadCompilerOptions } from '../../typescript/config.js'\nimport { BaseAnalyzer } from '../base.js'\nimport { resolveExistingPath } from './entry.js'\nimport { buildDependencyGraph } from './graph.js'\n\nexport function analyzeDependencies(\n entryFile: string,\n options: AnalyzeOptions = {},\n): DependencyGraph {\n return new ImportAnalyzer(entryFile, options).analyze()\n}\n\nclass ImportAnalyzer extends BaseAnalyzer<DependencyGraph> {\n private readonly cwd: string\n private readonly entryPath: string\n\n constructor(entryFile: string, options: AnalyzeOptions) {\n super(entryFile, options)\n this.cwd = path.resolve(options.cwd ?? process.cwd())\n this.entryPath = resolveExistingPath(this.cwd, entryFile)\n }\n\n protected doAnalyze(): DependencyGraph {\n const { compilerOptions, path: configPath } = loadCompilerOptions(\n path.dirname(this.entryPath),\n this.options.configPath,\n )\n const nodes = buildDependencyGraph(this.entryPath, {\n cwd: this.cwd,\n entryCompilerOptions: compilerOptions,\n expandWorkspaces: this.options.expandWorkspaces ?? true,\n projectOnly: this.options.projectOnly ?? false,\n ...(configPath === undefined ? {} : { entryConfigPath: configPath }),\n })\n\n return {\n cwd: this.cwd,\n entryId: this.entryPath,\n nodes,\n ...(configPath === undefined ? {} : { configPath }),\n }\n }\n}\n","import type {\n ExportAllDeclaration,\n ExportDefaultDeclaration,\n ExportNamedDeclaration,\n ImportDeclaration,\n ImportDeclarationSpecifier,\n ModuleExportName,\n Statement,\n} from 'oxc-parser'\n\nimport type { PendingReactUsageNode } from './file.js'\n\nexport interface ImportBinding {\n readonly importedName: string\n readonly sourceSpecifier: string\n readonly sourcePath?: string\n}\n\nexport function collectImportsAndExports(\n statement: Statement,\n sourceDependencies: ReadonlyMap<string, string>,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n importsByLocalName: Map<string, ImportBinding>,\n exportsByName: Map<string, string>,\n reExportBindingsByName: Map<string, ImportBinding>,\n exportAllBindings: ImportBinding[],\n): void {\n switch (statement.type) {\n case 'ImportDeclaration':\n collectImportBindings(statement, sourceDependencies, importsByLocalName)\n return\n case 'ExportNamedDeclaration':\n collectNamedExports(\n statement,\n sourceDependencies,\n symbolsByName,\n exportsByName,\n reExportBindingsByName,\n )\n return\n case 'ExportAllDeclaration':\n collectExportAllBindings(statement, sourceDependencies, exportAllBindings)\n return\n case 'ExportDefaultDeclaration':\n collectDefaultExport(statement, symbolsByName, exportsByName)\n return\n default:\n return\n }\n}\n\nfunction collectImportBindings(\n declaration: ImportDeclaration,\n sourceDependencies: ReadonlyMap<string, string>,\n importsByLocalName: Map<string, ImportBinding>,\n): void {\n if (declaration.importKind === 'type') {\n return\n }\n\n const sourceSpecifier = declaration.source.value\n const sourcePath = sourceDependencies.get(declaration.source.value)\n\n declaration.specifiers.forEach((specifier) => {\n const binding = getImportBinding(specifier, sourceSpecifier, sourcePath)\n if (binding === undefined) {\n return\n }\n\n importsByLocalName.set(binding.localName, {\n importedName: binding.importedName,\n sourceSpecifier: binding.sourceSpecifier,\n ...(binding.sourcePath === undefined\n ? {}\n : { sourcePath: binding.sourcePath }),\n })\n })\n}\n\nfunction getImportBinding(\n specifier: ImportDeclarationSpecifier,\n sourceSpecifier: string,\n sourcePath: string | undefined,\n):\n | {\n readonly localName: string\n readonly importedName: string\n readonly sourceSpecifier: string\n readonly sourcePath?: string\n }\n | undefined {\n if (specifier.type === 'ImportSpecifier') {\n if (specifier.importKind === 'type') {\n return undefined\n }\n\n return {\n localName: specifier.local.name,\n importedName: toModuleExportName(specifier.imported),\n sourceSpecifier,\n ...(sourcePath === undefined ? {} : { sourcePath }),\n }\n }\n\n if (specifier.type === 'ImportDefaultSpecifier') {\n return {\n localName: specifier.local.name,\n importedName: 'default',\n sourceSpecifier,\n ...(sourcePath === undefined ? {} : { sourcePath }),\n }\n }\n\n return undefined\n}\n\nfunction collectNamedExports(\n declaration: ExportNamedDeclaration,\n sourceDependencies: ReadonlyMap<string, string>,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n exportsByName: Map<string, string>,\n reExportBindingsByName: Map<string, ImportBinding>,\n): void {\n if (declaration.exportKind === 'type') {\n return\n }\n\n if (declaration.declaration !== null) {\n if (declaration.declaration.type === 'FunctionDeclaration') {\n const name = declaration.declaration.id?.name\n if (name !== undefined) {\n addExportBinding(name, name, symbolsByName, exportsByName)\n }\n } else if (declaration.declaration.type === 'VariableDeclaration') {\n declaration.declaration.declarations.forEach((declarator) => {\n if (declarator.id.type === 'Identifier') {\n addExportBinding(\n declarator.id.name,\n declarator.id.name,\n symbolsByName,\n exportsByName,\n )\n }\n })\n }\n\n return\n }\n\n if (declaration.source !== null) {\n const sourceSpecifier = declaration.source.value\n const sourcePath = sourceDependencies.get(sourceSpecifier)\n\n declaration.specifiers.forEach((specifier) => {\n if (specifier.exportKind === 'type') {\n return\n }\n\n reExportBindingsByName.set(toModuleExportName(specifier.exported), {\n importedName: toModuleExportName(specifier.local),\n sourceSpecifier,\n ...(sourcePath === undefined ? {} : { sourcePath }),\n })\n })\n return\n }\n\n declaration.specifiers.forEach((specifier) => {\n if (specifier.exportKind === 'type') {\n return\n }\n\n const localName = toModuleExportName(specifier.local)\n const exportedName = toModuleExportName(specifier.exported)\n addExportBinding(localName, exportedName, symbolsByName, exportsByName)\n })\n}\n\nfunction collectExportAllBindings(\n declaration: ExportAllDeclaration,\n sourceDependencies: ReadonlyMap<string, string>,\n exportAllBindings: ImportBinding[],\n): void {\n if (declaration.exportKind === 'type') {\n return\n }\n\n const sourceSpecifier = declaration.source.value\n const sourcePath = sourceDependencies.get(sourceSpecifier)\n\n exportAllBindings.push({\n importedName: '*',\n sourceSpecifier,\n ...(sourcePath === undefined ? {} : { sourcePath }),\n })\n}\n\nfunction collectDefaultExport(\n declaration: ExportDefaultDeclaration,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n exportsByName: Map<string, string>,\n): void {\n if (\n declaration.declaration.type === 'FunctionDeclaration' ||\n declaration.declaration.type === 'FunctionExpression'\n ) {\n const localName = declaration.declaration.id?.name\n if (localName !== undefined) {\n addExportBinding(localName, 'default', symbolsByName, exportsByName)\n }\n return\n }\n\n if (declaration.declaration.type === 'Identifier') {\n addExportBinding(\n declaration.declaration.name,\n 'default',\n symbolsByName,\n exportsByName,\n )\n return\n }\n\n if (declaration.declaration.type === 'ArrowFunctionExpression') {\n addExportBinding('default', 'default', symbolsByName, exportsByName)\n }\n}\n\nfunction addExportBinding(\n localName: string,\n exportedName: string,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n exportsByName: Map<string, string>,\n): void {\n const symbol = symbolsByName.get(localName)\n if (symbol === undefined) {\n return\n }\n\n symbol.exportNames.add(exportedName)\n exportsByName.set(exportedName, symbol.id)\n}\n\nfunction toModuleExportName(name: ModuleExportName): string {\n return name.type === 'Literal' ? name.value : name.name\n}\n","import type {\n ArrowFunctionExpression,\n CallExpression,\n Expression,\n FunctionBody,\n JSXElement,\n JSXElementName,\n JSXFragment,\n Node,\n TaggedTemplateExpression,\n} from 'oxc-parser'\nimport { visitorKeys } from 'oxc-parser'\n\nexport const FUNCTION_NODE_TYPES = new Set([\n 'FunctionDeclaration',\n 'FunctionExpression',\n 'ArrowFunctionExpression',\n 'TSDeclareFunction',\n 'TSEmptyBodyFunctionExpression',\n])\n\nexport function walkReactUsageTree(\n root: FunctionBody | Expression | JSXFragment | JSXElement,\n visit: (node: Node) => void,\n): void {\n walkNode(root, visit, true)\n}\n\nexport function walkNode(\n node: Node,\n visit: (node: Node) => void,\n allowNestedFunctions = false,\n): void {\n visit(node)\n\n const keys = visitorKeys[node.type]\n if (keys === undefined) {\n return\n }\n\n keys.forEach((key) => {\n const value = (node as unknown as Record<string, unknown>)[key]\n walkChild(value, visit, allowNestedFunctions)\n })\n}\n\nfunction walkChild(\n value: unknown,\n visit: (node: Node) => void,\n allowNestedFunctions: boolean,\n): void {\n if (Array.isArray(value)) {\n value.forEach((entry) => {\n walkChild(entry, visit, allowNestedFunctions)\n })\n return\n }\n\n if (!isNode(value)) {\n return\n }\n\n if (!allowNestedFunctions && FUNCTION_NODE_TYPES.has(value.type)) {\n return\n }\n\n walkNode(value, visit, false)\n}\n\nexport function isNode(value: unknown): value is Node {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n typeof (value as { type: unknown }).type === 'string'\n )\n}\n\nexport function classifyReactSymbol(\n name: string,\n declaration:\n | ArrowFunctionExpression\n | import('oxc-parser').Function\n | Expression,\n): import('../../types/react-symbol-kind.js').ReactSymbolKind | undefined {\n if (isHookName(name) && isFunctionLikeDeclaration(declaration)) {\n return 'hook'\n }\n\n if (\n isComponentName(name) &&\n ((isFunctionLikeDeclaration(declaration) &&\n returnsReactElement(declaration)) ||\n isStyledComponentDeclaration(declaration))\n ) {\n return 'component'\n }\n\n return undefined\n}\n\nexport function containsReactElementLikeExpression(\n expression: Expression,\n): boolean {\n let found = false\n\n walkNode(expression, (node) => {\n if (\n node.type === 'JSXElement' ||\n node.type === 'JSXFragment' ||\n (node.type === 'CallExpression' && isReactCreateElementCall(node))\n ) {\n found = true\n }\n })\n\n return found\n}\n\nexport function getComponentReferenceName(\n node: JSXElement,\n): string | undefined {\n const name = getJsxName(node.openingElement.name)\n return name !== undefined && isComponentName(name) ? name : undefined\n}\n\nexport function getBuiltinReferenceName(node: JSXElement): string | undefined {\n const name = getJsxName(node.openingElement.name)\n return name !== undefined && isIntrinsicElementName(name) ? name : undefined\n}\n\nexport function getHookReferenceName(node: CallExpression): string | undefined {\n const calleeName = getIdentifierName(node.callee)\n return calleeName !== undefined && isHookName(calleeName)\n ? calleeName\n : undefined\n}\n\nexport function getCreateElementComponentReferenceName(\n node: CallExpression,\n): string | undefined {\n if (!isReactCreateElementCall(node)) {\n return undefined\n }\n\n const [firstArgument] = node.arguments\n if (firstArgument === undefined || firstArgument.type !== 'Identifier') {\n return undefined\n }\n\n return isComponentName(firstArgument.name) ? firstArgument.name : undefined\n}\n\nexport function getStyledComponentReferenceName(\n node: CallExpression | TaggedTemplateExpression,\n): string | undefined {\n const reference = getStyledFactoryReference(\n node.type === 'CallExpression' ? node.callee : node.tag,\n )\n\n return reference?.kind === 'component' ? reference.name : undefined\n}\n\nexport function getStyledBuiltinReferenceName(\n node: CallExpression | TaggedTemplateExpression,\n): string | undefined {\n const reference = getStyledFactoryReference(\n node.type === 'CallExpression' ? node.callee : node.tag,\n )\n\n return reference?.kind === 'builtin' ? reference.name : undefined\n}\n\nexport function isHookName(name: string): boolean {\n return /^use[A-Z0-9]/.test(name)\n}\n\nexport function isComponentName(name: string): boolean {\n return /^[A-Z]/.test(name)\n}\n\nfunction isIntrinsicElementName(name: string): boolean {\n return /^[a-z]/.test(name)\n}\n\nfunction isFunctionLikeDeclaration(\n declaration:\n | ArrowFunctionExpression\n | import('oxc-parser').Function\n | Expression,\n): declaration is ArrowFunctionExpression | import('oxc-parser').Function {\n return (\n declaration.type === 'ArrowFunctionExpression' ||\n declaration.type === 'FunctionDeclaration' ||\n declaration.type === 'FunctionExpression'\n )\n}\n\nfunction returnsReactElement(\n declaration: ArrowFunctionExpression | import('oxc-parser').Function,\n): boolean {\n if (\n declaration.type === 'ArrowFunctionExpression' &&\n declaration.expression\n ) {\n return containsReactElementLikeExpression(declaration.body as Expression)\n }\n\n const body = declaration.body\n if (body === null) {\n return false\n }\n\n let found = false\n walkReactUsageTree(body, (node) => {\n if (node.type !== 'ReturnStatement' || node.argument === null) {\n return\n }\n\n if (containsReactElementLikeExpression(node.argument)) {\n found = true\n }\n })\n\n return found\n}\n\nfunction isStyledComponentDeclaration(expression: Expression): boolean {\n if (expression.type === 'CallExpression') {\n return getStyledFactoryReference(expression.callee) !== undefined\n }\n\n if (expression.type === 'TaggedTemplateExpression') {\n return getStyledFactoryReference(expression.tag) !== undefined\n }\n\n return false\n}\n\nfunction getStyledFactoryReference(expression: Expression):\n | {\n readonly kind: 'builtin' | 'component'\n readonly name: string\n }\n | undefined {\n const unwrapped = unwrapExpression(expression)\n\n if (unwrapped.type === 'MemberExpression' && !unwrapped.computed) {\n if (\n unwrapped.object.type !== 'Identifier' ||\n unwrapped.object.name !== 'styled' ||\n unwrapped.property.type !== 'Identifier'\n ) {\n return undefined\n }\n\n const name = unwrapped.property.name\n if (isIntrinsicElementName(name)) {\n return {\n kind: 'builtin',\n name,\n }\n }\n\n if (isComponentName(name)) {\n return {\n kind: 'component',\n name,\n }\n }\n\n return undefined\n }\n\n if (unwrapped.type !== 'CallExpression') {\n return undefined\n }\n\n const callee = unwrapExpression(unwrapped.callee)\n if (callee.type !== 'Identifier' || callee.name !== 'styled') {\n return undefined\n }\n\n const [firstArgument] = unwrapped.arguments\n if (firstArgument?.type !== 'Identifier') {\n return undefined\n }\n\n return isComponentName(firstArgument.name)\n ? {\n kind: 'component',\n name: firstArgument.name,\n }\n : undefined\n}\n\nfunction isReactCreateElementCall(node: CallExpression): boolean {\n const callee = unwrapExpression(node.callee)\n if (callee.type !== 'MemberExpression' || callee.computed) {\n return false\n }\n\n return (\n callee.object.type === 'Identifier' &&\n callee.object.name === 'React' &&\n callee.property.name === 'createElement'\n )\n}\n\nfunction getJsxName(name: JSXElementName): string | undefined {\n if (name.type === 'JSXIdentifier') {\n return name.name\n }\n\n return undefined\n}\n\nfunction getIdentifierName(expression: Expression): string | undefined {\n const unwrapped = unwrapExpression(expression)\n return unwrapped.type === 'Identifier' ? unwrapped.name : undefined\n}\n\nfunction unwrapExpression(expression: Expression): Expression {\n let current = expression\n\n while (true) {\n if (\n current.type === 'ParenthesizedExpression' ||\n current.type === 'TSAsExpression' ||\n current.type === 'TSSatisfiesExpression' ||\n current.type === 'TSTypeAssertion' ||\n current.type === 'TSNonNullExpression'\n ) {\n current = current.expression\n continue\n }\n\n return current\n }\n}\n","import type { Node, Program, Statement } from 'oxc-parser'\nimport { visitorKeys } from 'oxc-parser'\n\nimport type { ReactSymbolKind } from '../../types/react-symbol-kind.js'\nimport type { ReactUsageLocation } from '../../types/react-usage-location.js'\nimport {\n FUNCTION_NODE_TYPES,\n getBuiltinReferenceName,\n getComponentReferenceName,\n getCreateElementComponentReferenceName,\n getHookReferenceName,\n isNode,\n} from './walk.js'\n\nexport interface PendingReactUsageEntry {\n readonly referenceName: string\n readonly kind: ReactSymbolKind\n readonly location: ReactUsageLocation\n}\n\nexport function collectEntryUsages(\n program: Program,\n filePath: string,\n sourceText: string,\n includeBuiltins: boolean,\n): PendingReactUsageEntry[] {\n const entries = new Map<string, PendingReactUsageEntry>()\n\n program.body.forEach((statement) => {\n collectStatementEntryUsages(\n statement,\n filePath,\n sourceText,\n entries,\n includeBuiltins,\n )\n })\n\n return [...entries.values()].sort(comparePendingReactUsageEntries)\n}\n\nfunction collectStatementEntryUsages(\n statement: Statement,\n filePath: string,\n sourceText: string,\n entries: Map<string, PendingReactUsageEntry>,\n includeBuiltins: boolean,\n): void {\n collectNodeEntryUsages(\n statement,\n filePath,\n sourceText,\n entries,\n includeBuiltins,\n false,\n )\n}\n\nfunction collectNodeEntryUsages(\n node: Node,\n filePath: string,\n sourceText: string,\n entries: Map<string, PendingReactUsageEntry>,\n includeBuiltins: boolean,\n hasComponentAncestor: boolean,\n): void {\n if (FUNCTION_NODE_TYPES.has(node.type)) {\n return\n }\n\n let nextHasComponentAncestor = hasComponentAncestor\n\n if (node.type === 'JSXElement') {\n const referenceName = getComponentReferenceName(node)\n if (referenceName !== undefined) {\n if (!hasComponentAncestor) {\n addPendingReactUsageEntry(\n entries,\n referenceName,\n 'component',\n createReactUsageLocation(filePath, sourceText, node.start),\n )\n }\n nextHasComponentAncestor = true\n } else if (includeBuiltins) {\n const builtinName = getBuiltinReferenceName(node)\n if (builtinName !== undefined) {\n if (!hasComponentAncestor) {\n addPendingReactUsageEntry(\n entries,\n builtinName,\n 'builtin',\n createReactUsageLocation(filePath, sourceText, node.start),\n )\n }\n nextHasComponentAncestor = true\n }\n }\n } else if (node.type === 'CallExpression') {\n const hookReference = getHookReferenceName(node)\n if (hookReference !== undefined) {\n addPendingReactUsageEntry(\n entries,\n hookReference,\n 'hook',\n createReactUsageLocation(filePath, sourceText, node.start),\n )\n }\n\n const referenceName = getCreateElementComponentReferenceName(node)\n if (referenceName !== undefined) {\n if (!hasComponentAncestor) {\n addPendingReactUsageEntry(\n entries,\n referenceName,\n 'component',\n createReactUsageLocation(filePath, sourceText, node.start),\n )\n }\n nextHasComponentAncestor = true\n }\n }\n\n const keys = visitorKeys[node.type]\n if (keys === undefined) {\n return\n }\n\n keys.forEach((key) => {\n const value = (node as unknown as Record<string, unknown>)[key]\n collectEntryUsageChild(\n value,\n filePath,\n sourceText,\n entries,\n includeBuiltins,\n nextHasComponentAncestor,\n )\n })\n}\n\nfunction collectEntryUsageChild(\n value: unknown,\n filePath: string,\n sourceText: string,\n entries: Map<string, PendingReactUsageEntry>,\n includeBuiltins: boolean,\n hasComponentAncestor: boolean,\n): void {\n if (Array.isArray(value)) {\n value.forEach((entry) => {\n collectEntryUsageChild(\n entry,\n filePath,\n sourceText,\n entries,\n includeBuiltins,\n hasComponentAncestor,\n )\n })\n return\n }\n\n if (!isNode(value)) {\n return\n }\n\n collectNodeEntryUsages(\n value,\n filePath,\n sourceText,\n entries,\n includeBuiltins,\n hasComponentAncestor,\n )\n}\n\nfunction addPendingReactUsageEntry(\n entries: Map<string, PendingReactUsageEntry>,\n referenceName: string,\n kind: ReactSymbolKind,\n location: ReactUsageLocation,\n): void {\n const key = `${location.filePath}:${location.line}:${location.column}:${kind}:${referenceName}`\n entries.set(key, {\n referenceName,\n kind,\n location,\n })\n}\n\nexport function createReactUsageLocation(\n filePath: string,\n sourceText: string,\n offset: number,\n): ReactUsageLocation {\n return {\n filePath,\n ...offsetToLineAndColumn(sourceText, offset),\n }\n}\n\nfunction offsetToLineAndColumn(\n sourceText: string,\n offset: number,\n): Pick<ReactUsageLocation, 'line' | 'column'> {\n let line = 1\n let column = 1\n\n for (let index = 0; index < offset && index < sourceText.length; index += 1) {\n if (sourceText[index] === '\\n') {\n line += 1\n column = 1\n continue\n }\n\n column += 1\n }\n\n return { line, column }\n}\n\nfunction comparePendingReactUsageEntries(\n left: PendingReactUsageEntry,\n right: PendingReactUsageEntry,\n): number {\n return (\n left.location.filePath.localeCompare(right.location.filePath) ||\n left.location.line - right.location.line ||\n left.location.column - right.location.column ||\n left.kind.localeCompare(right.kind) ||\n left.referenceName.localeCompare(right.referenceName)\n )\n}\n","import type {\n ArrowFunctionExpression,\n ExportDefaultDeclaration,\n Expression,\n FunctionBody,\n JSXElement,\n JSXFragment,\n Function as OxcFunction,\n Statement,\n VariableDeclarator,\n} from 'oxc-parser'\n\nimport type { ReactSymbolKind } from '../../types/react-symbol-kind.js'\nimport type { PendingReactUsageNode } from './file.js'\nimport { classifyReactSymbol } from './walk.js'\n\nexport function collectTopLevelReactSymbols(\n statement: Statement,\n filePath: string,\n symbolsByName: Map<string, PendingReactUsageNode>,\n): void {\n switch (statement.type) {\n case 'FunctionDeclaration':\n addFunctionSymbol(statement, filePath, symbolsByName)\n return\n case 'VariableDeclaration':\n statement.declarations.forEach((declarator) => {\n addVariableSymbol(declarator, filePath, symbolsByName)\n })\n return\n case 'ExportNamedDeclaration':\n if (statement.declaration !== null) {\n collectTopLevelReactSymbols(\n statement.declaration,\n filePath,\n symbolsByName,\n )\n }\n return\n case 'ExportDefaultDeclaration':\n addDefaultExportSymbol(statement, filePath, symbolsByName)\n return\n default:\n return\n }\n}\n\nexport function collectTopLevelDynamicComponentCandidates(\n statement: Statement,\n filePath: string,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n dynamicComponentCandidatesByName: Map<string, PendingReactUsageNode>,\n): void {\n switch (statement.type) {\n case 'VariableDeclaration':\n statement.declarations.forEach((declarator) => {\n addDynamicComponentCandidate(\n declarator,\n filePath,\n symbolsByName,\n dynamicComponentCandidatesByName,\n )\n })\n return\n case 'ExportNamedDeclaration':\n if (statement.declaration !== null) {\n collectTopLevelDynamicComponentCandidates(\n statement.declaration,\n filePath,\n symbolsByName,\n dynamicComponentCandidatesByName,\n )\n }\n return\n default:\n return\n }\n}\n\nfunction addFunctionSymbol(\n declaration: OxcFunction,\n filePath: string,\n symbolsByName: Map<string, PendingReactUsageNode>,\n): void {\n const name = declaration.id?.name\n if (name === undefined) {\n return\n }\n\n const kind = classifyReactSymbol(name, declaration)\n if (kind === undefined) {\n return\n }\n\n symbolsByName.set(\n name,\n createPendingSymbol(\n filePath,\n name,\n kind,\n declaration.id?.start ?? declaration.start,\n getAnalysisRoot(declaration),\n ),\n )\n}\n\nfunction addVariableSymbol(\n declarator: VariableDeclarator,\n filePath: string,\n symbolsByName: Map<string, PendingReactUsageNode>,\n): void {\n if (declarator.id.type !== 'Identifier' || declarator.init === null) {\n return\n }\n\n const name = declarator.id.name\n const kind = classifyReactSymbol(name, declarator.init)\n if (kind === undefined) {\n return\n }\n\n symbolsByName.set(\n name,\n createPendingSymbol(\n filePath,\n name,\n kind,\n declarator.init.start,\n getAnalysisRoot(declarator.init),\n ),\n )\n}\n\nfunction addDefaultExportSymbol(\n declaration: ExportDefaultDeclaration,\n filePath: string,\n symbolsByName: Map<string, PendingReactUsageNode>,\n): void {\n if (\n declaration.declaration.type === 'FunctionDeclaration' ||\n declaration.declaration.type === 'FunctionExpression'\n ) {\n addFunctionSymbol(declaration.declaration, filePath, symbolsByName)\n } else if (declaration.declaration.type === 'ArrowFunctionExpression') {\n const name = 'default'\n const kind = declaration.declaration.body\n ? classifyReactSymbol(name, declaration.declaration)\n : undefined\n if (kind !== undefined) {\n symbolsByName.set(\n name,\n createPendingSymbol(\n filePath,\n name,\n kind,\n declaration.declaration.start,\n getAnalysisRoot(declaration.declaration),\n ),\n )\n }\n }\n}\n\nfunction addDynamicComponentCandidate(\n declarator: VariableDeclarator,\n filePath: string,\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n dynamicComponentCandidatesByName: Map<string, PendingReactUsageNode>,\n): void {\n if (declarator.id.type !== 'Identifier' || declarator.init === null) {\n return\n }\n\n const name = declarator.id.name\n if (\n !isPotentialDynamicComponentName(name) ||\n symbolsByName.has(name) ||\n !isDynamicComponentInitializer(declarator.init)\n ) {\n return\n }\n\n dynamicComponentCandidatesByName.set(\n name,\n createPendingSymbol(\n filePath,\n name,\n 'component',\n declarator.init.start,\n getAnalysisRoot(declarator.init),\n ),\n )\n}\n\nfunction createPendingSymbol(\n filePath: string,\n name: string,\n kind: ReactSymbolKind,\n declarationOffset: number,\n analysisRoot: FunctionBody | Expression | JSXFragment | JSXElement,\n): PendingReactUsageNode {\n return {\n id: `${filePath}#${kind}:${name}`,\n name,\n kind,\n filePath,\n declarationOffset,\n analysisRoot,\n exportNames: new Set<string>(),\n componentReferences: new Set<string>(),\n hookReferences: new Set<string>(),\n builtinReferences: new Set<string>(),\n }\n}\n\nfunction getAnalysisRoot(\n declaration: OxcFunction | ArrowFunctionExpression | Expression,\n): FunctionBody | Expression | JSXFragment | JSXElement {\n if (\n declaration.type === 'FunctionDeclaration' ||\n declaration.type === 'FunctionExpression'\n ) {\n if (declaration.body === null) {\n throw new Error(\n `Expected React symbol \"${declaration.id?.name ?? 'anonymous'}\" to have a body.`,\n )\n }\n\n return declaration.body\n }\n\n if (declaration.type === 'ArrowFunctionExpression') {\n return declaration.body\n }\n\n return declaration\n}\n\nfunction isDynamicComponentInitializer(expression: Expression): boolean {\n return (\n expression.type === 'CallExpression' ||\n expression.type === 'TaggedTemplateExpression'\n )\n}\n\nfunction isPotentialDynamicComponentName(name: string): boolean {\n return /^[A-Z][A-Za-z0-9]*$/.test(name)\n}\n","import type { PendingReactUsageNode } from './file.js'\nimport {\n getBuiltinReferenceName,\n getComponentReferenceName,\n getCreateElementComponentReferenceName,\n getHookReferenceName,\n getStyledBuiltinReferenceName,\n getStyledComponentReferenceName,\n walkReactUsageTree,\n} from './walk.js'\n\nexport function analyzeSymbolUsages(\n symbol: PendingReactUsageNode,\n includeBuiltins: boolean,\n): void {\n walkReactUsageTree(symbol.analysisRoot, (node) => {\n if (node.type === 'JSXElement') {\n const name = getComponentReferenceName(node)\n if (name !== undefined) {\n symbol.componentReferences.add(name)\n }\n\n if (includeBuiltins) {\n const builtinName = getBuiltinReferenceName(node)\n if (builtinName !== undefined) {\n symbol.builtinReferences.add(builtinName)\n }\n }\n return\n }\n\n if (node.type === 'CallExpression') {\n const hookReference = getHookReferenceName(node)\n if (hookReference !== undefined) {\n symbol.hookReferences.add(hookReference)\n }\n\n const componentReference = getCreateElementComponentReferenceName(node)\n if (componentReference !== undefined) {\n symbol.componentReferences.add(componentReference)\n }\n\n const styledComponentReference = getStyledComponentReferenceName(node)\n if (styledComponentReference !== undefined) {\n symbol.componentReferences.add(styledComponentReference)\n }\n\n if (includeBuiltins) {\n const styledBuiltinReference = getStyledBuiltinReferenceName(node)\n if (styledBuiltinReference !== undefined) {\n symbol.builtinReferences.add(styledBuiltinReference)\n }\n }\n }\n\n if (node.type === 'TaggedTemplateExpression') {\n const styledComponentReference = getStyledComponentReferenceName(node)\n if (styledComponentReference !== undefined) {\n symbol.componentReferences.add(styledComponentReference)\n }\n\n if (includeBuiltins) {\n const styledBuiltinReference = getStyledBuiltinReferenceName(node)\n if (styledBuiltinReference !== undefined) {\n symbol.builtinReferences.add(styledBuiltinReference)\n }\n }\n }\n })\n}\n","import type {\n Expression,\n FunctionBody,\n JSXElement,\n JSXFragment,\n Program,\n} from 'oxc-parser'\n\nimport type { ReactSymbolKind } from '../../types/react-symbol-kind.js'\nimport type { ImportBinding } from './bindings.js'\nimport { collectImportsAndExports } from './bindings.js'\nimport type { PendingReactUsageEntry } from './entries.js'\nimport { collectEntryUsages, createReactUsageLocation } from './entries.js'\nimport {\n collectTopLevelDynamicComponentCandidates,\n collectTopLevelReactSymbols,\n} from './symbols.js'\nimport { analyzeSymbolUsages } from './usage.js'\n\nexport interface PendingReactUsageNode {\n readonly id: string\n readonly name: string\n readonly kind: ReactSymbolKind\n readonly filePath: string\n readonly declarationOffset: number\n readonly analysisRoot: FunctionBody | Expression | JSXFragment | JSXElement\n readonly exportNames: Set<string>\n readonly componentReferences: Set<string>\n readonly hookReferences: Set<string>\n readonly builtinReferences: Set<string>\n}\n\nexport interface FileAnalysis {\n readonly filePath: string\n readonly importsByLocalName: Map<string, ImportBinding>\n readonly exportsByName: Map<string, string>\n readonly reExportBindingsByName: Map<string, ImportBinding>\n readonly exportAllBindings: readonly ImportBinding[]\n readonly entryUsages: readonly PendingReactUsageEntry[]\n readonly allSymbolsById: Map<string, PendingReactUsageNode>\n readonly allSymbolsByName: Map<string, PendingReactUsageNode>\n readonly symbolsById: Map<string, PendingReactUsageNode>\n readonly symbolsByName: Map<string, PendingReactUsageNode>\n}\n\nexport function analyzeReactFile(\n program: Program,\n filePath: string,\n sourceText: string,\n includeNestedRenderEntries: boolean,\n sourceDependencies: ReadonlyMap<string, string>,\n includeBuiltins: boolean,\n): FileAnalysis {\n const symbolsByName = new Map<string, PendingReactUsageNode>()\n const dynamicComponentCandidatesByName = new Map<\n string,\n PendingReactUsageNode\n >()\n\n program.body.forEach((statement) => {\n collectTopLevelReactSymbols(statement, filePath, symbolsByName)\n })\n program.body.forEach((statement) => {\n collectTopLevelDynamicComponentCandidates(\n statement,\n filePath,\n symbolsByName,\n dynamicComponentCandidatesByName,\n )\n })\n\n const allSymbolsByName = new Map<string, PendingReactUsageNode>([\n ...dynamicComponentCandidatesByName,\n ...symbolsByName,\n ])\n\n const importsByLocalName = new Map<string, ImportBinding>()\n const exportsByName = new Map<string, string>()\n const reExportBindingsByName = new Map<string, ImportBinding>()\n const exportAllBindings: ImportBinding[] = []\n const directEntryUsages = includeNestedRenderEntries\n ? collectEntryUsages(program, filePath, sourceText, includeBuiltins)\n : []\n\n program.body.forEach((statement) => {\n collectImportsAndExports(\n statement,\n sourceDependencies,\n allSymbolsByName,\n importsByLocalName,\n exportsByName,\n reExportBindingsByName,\n exportAllBindings,\n )\n })\n\n allSymbolsByName.forEach((symbol) => {\n analyzeSymbolUsages(symbol, includeBuiltins)\n })\n\n const allSymbolsById = new Map(\n [...allSymbolsByName.values()].map((symbol) => [symbol.id, symbol]),\n )\n\n const entryUsages =\n directEntryUsages.length > 0\n ? directEntryUsages\n : includeNestedRenderEntries\n ? collectComponentDeclarationEntryUsages(symbolsByName, sourceText)\n : []\n\n return {\n filePath,\n importsByLocalName,\n exportsByName,\n reExportBindingsByName,\n exportAllBindings,\n entryUsages,\n allSymbolsById,\n allSymbolsByName,\n symbolsById: new Map(\n [...symbolsByName.values()].map((symbol) => [symbol.id, symbol]),\n ),\n symbolsByName,\n }\n}\n\nfunction collectComponentDeclarationEntryUsages(\n symbolsByName: ReadonlyMap<string, PendingReactUsageNode>,\n sourceText: string,\n): PendingReactUsageEntry[] {\n const componentSymbols = [...symbolsByName.values()].filter(\n (symbol) => symbol.kind === 'component',\n )\n if (componentSymbols.length === 0) {\n return []\n }\n\n const exportedComponentSymbols = componentSymbols.filter(\n (symbol) => symbol.exportNames.size > 0,\n )\n const fallbackSymbols =\n exportedComponentSymbols.length > 0\n ? exportedComponentSymbols\n : componentSymbols\n\n return fallbackSymbols\n .sort((left, right) => {\n return (\n left.declarationOffset - right.declarationOffset ||\n left.name.localeCompare(right.name)\n )\n })\n .map((symbol) => ({\n referenceName: symbol.name,\n kind: 'component',\n location: createReactUsageLocation(\n symbol.filePath,\n sourceText,\n symbol.declarationOffset,\n ),\n }))\n}\n","import type { ReactSymbolKind } from '../../types/react-symbol-kind.js'\nimport type { ReactUsageEntry } from '../../types/react-usage-entry.js'\nimport type { ReactUsageNode } from '../../types/react-usage-node.js'\nimport type { ImportBinding } from './bindings.js'\nimport type { FileAnalysis } from './file.js'\nimport { isHookName } from './walk.js'\n\nexport function resolveReactReference(\n fileAnalysis: FileAnalysis,\n fileAnalyses: ReadonlyMap<string, FileAnalysis>,\n name: string,\n kind: ReactSymbolKind,\n): string | undefined {\n if (kind === 'builtin') {\n return getBuiltinNodeId(name)\n }\n\n const localSymbol = fileAnalysis.allSymbolsByName.get(name)\n if (localSymbol !== undefined && localSymbol.kind === kind) {\n return localSymbol.id\n }\n\n const importBinding = fileAnalysis.importsByLocalName.get(name)\n if (importBinding === undefined) {\n return undefined\n }\n\n if (importBinding.sourcePath === undefined) {\n return kind === 'hook'\n ? getExternalHookNodeId(importBinding, name)\n : undefined\n }\n\n const sourceFileAnalysis = fileAnalyses.get(importBinding.sourcePath)\n if (sourceFileAnalysis === undefined) {\n return undefined\n }\n\n const targetId = resolveExportedSymbol(\n sourceFileAnalysis,\n importBinding.importedName,\n kind,\n fileAnalyses,\n new Set<string>(),\n )\n if (targetId === undefined) {\n return undefined\n }\n\n return targetId\n}\n\nfunction resolveExportedSymbol(\n fileAnalysis: FileAnalysis,\n exportName: string,\n kind: ReactSymbolKind,\n fileAnalyses: ReadonlyMap<string, FileAnalysis>,\n visited: Set<string>,\n): string | undefined {\n const visitKey = `${fileAnalysis.filePath}:${exportName}:${kind}`\n if (visited.has(visitKey)) {\n return undefined\n }\n\n visited.add(visitKey)\n\n const directTargetId = fileAnalysis.exportsByName.get(exportName)\n if (directTargetId !== undefined) {\n const directTargetSymbol = fileAnalysis.allSymbolsById.get(directTargetId)\n if (directTargetSymbol?.kind === kind) {\n return directTargetId\n }\n }\n\n const reExportBinding = fileAnalysis.reExportBindingsByName.get(exportName)\n if (reExportBinding?.sourcePath !== undefined) {\n const reExportSourceAnalysis = fileAnalyses.get(reExportBinding.sourcePath)\n if (reExportSourceAnalysis !== undefined) {\n const reExportTargetId = resolveExportedSymbol(\n reExportSourceAnalysis,\n reExportBinding.importedName,\n kind,\n fileAnalyses,\n visited,\n )\n if (reExportTargetId !== undefined) {\n return reExportTargetId\n }\n }\n }\n\n for (const exportAllBinding of fileAnalysis.exportAllBindings) {\n if (exportAllBinding.sourcePath === undefined) {\n continue\n }\n\n const exportAllSourceAnalysis = fileAnalyses.get(\n exportAllBinding.sourcePath,\n )\n if (exportAllSourceAnalysis === undefined) {\n continue\n }\n\n const exportAllTargetId = resolveExportedSymbol(\n exportAllSourceAnalysis,\n exportName,\n kind,\n fileAnalyses,\n visited,\n )\n if (exportAllTargetId !== undefined) {\n return exportAllTargetId\n }\n }\n\n return undefined\n}\n\nexport function addExternalHookNodes(\n fileAnalyses: ReadonlyMap<string, FileAnalysis>,\n nodes: Map<string, ReactUsageNode>,\n): void {\n for (const fileAnalysis of fileAnalyses.values()) {\n fileAnalysis.importsByLocalName.forEach((binding, localName) => {\n if (binding.sourcePath !== undefined) {\n return\n }\n\n if (!isHookName(localName) && !isHookName(binding.importedName)) {\n return\n }\n\n const externalNode = createExternalHookNode(binding, localName)\n if (!nodes.has(externalNode.id)) {\n nodes.set(externalNode.id, externalNode)\n }\n })\n }\n}\n\nexport function addBuiltinNodes(\n fileAnalyses: ReadonlyMap<string, FileAnalysis>,\n nodes: Map<string, ReactUsageNode>,\n): void {\n for (const fileAnalysis of fileAnalyses.values()) {\n fileAnalysis.entryUsages.forEach((entry) => {\n if (entry.kind !== 'builtin') {\n return\n }\n\n const builtinNode = createBuiltinNode(entry.referenceName)\n if (!nodes.has(builtinNode.id)) {\n nodes.set(builtinNode.id, builtinNode)\n }\n })\n\n fileAnalysis.allSymbolsById.forEach((symbol) => {\n symbol.builtinReferences.forEach((name) => {\n const builtinNode = createBuiltinNode(name)\n if (!nodes.has(builtinNode.id)) {\n nodes.set(builtinNode.id, builtinNode)\n }\n })\n })\n }\n}\n\nfunction createExternalHookNode(\n binding: ImportBinding,\n localName: string,\n): ReactUsageNode {\n const name = getExternalHookName(binding, localName)\n\n return {\n id: getExternalHookNodeId(binding, localName),\n name,\n kind: 'hook',\n filePath: binding.sourceSpecifier,\n exportNames: [binding.importedName],\n usages: [],\n }\n}\n\nfunction createBuiltinNode(name: string): ReactUsageNode {\n return {\n id: getBuiltinNodeId(name),\n name,\n kind: 'builtin',\n filePath: 'html',\n exportNames: [],\n usages: [],\n }\n}\n\nfunction getExternalHookNodeId(\n binding: ImportBinding,\n localName: string,\n): string {\n return `external:${binding.sourceSpecifier}#hook:${getExternalHookName(binding, localName)}`\n}\n\nexport function getBuiltinNodeId(name: string): string {\n return `builtin:${name}`\n}\n\nfunction getExternalHookName(\n binding: ImportBinding,\n localName: string,\n): string {\n return binding.importedName === 'default' ? localName : binding.importedName\n}\n\nexport function compareReactNodeIds(\n leftId: string,\n rightId: string,\n nodes: ReadonlyMap<string, ReactUsageNode>,\n): number {\n const left = nodes.get(leftId)\n const right = nodes.get(rightId)\n\n if (left === undefined || right === undefined) {\n return leftId.localeCompare(rightId)\n }\n\n return compareReactNodes(left, right)\n}\n\nexport function compareReactUsageEntries(\n left: ReactUsageEntry,\n right: ReactUsageEntry,\n nodes: ReadonlyMap<string, ReactUsageNode>,\n): number {\n return (\n left.location.filePath.localeCompare(right.location.filePath) ||\n left.location.line - right.location.line ||\n left.location.column - right.location.column ||\n left.referenceName.localeCompare(right.referenceName) ||\n compareReactNodeIds(left.target, right.target, nodes)\n )\n}\n\nfunction compareReactNodes(\n left: ReactUsageNode,\n right: ReactUsageNode,\n): number {\n return (\n left.filePath.localeCompare(right.filePath) ||\n left.name.localeCompare(right.name) ||\n left.kind.localeCompare(right.kind)\n )\n}\n","import fs from 'node:fs'\n\nimport { parseSync } from 'oxc-parser'\n\nimport type { AnalyzeOptions } from '../../types/analyze-options.js'\nimport type { DependencyGraph } from '../../types/dependency-graph.js'\nimport type { ReactUsageEdge } from '../../types/react-usage-edge.js'\nimport type { ReactUsageEntry } from '../../types/react-usage-entry.js'\nimport type { ReactUsageGraph } from '../../types/react-usage-graph.js'\nimport type { ReactUsageNode } from '../../types/react-usage-node.js'\nimport type { SourceModuleNode } from '../../types/source-module-node.js'\nimport { isSourceCodeFile } from '../../utils/is-source-code-file.js'\nimport { BaseAnalyzer } from '../base.js'\nimport { analyzeDependencies } from '../import/index.js'\nimport { analyzeReactFile } from './file.js'\nimport {\n addBuiltinNodes,\n addExternalHookNodes,\n compareReactNodeIds,\n compareReactUsageEntries,\n getBuiltinNodeId,\n resolveReactReference,\n} from './references.js'\n\nexport function analyzeReactUsage(\n entryFile: string | readonly string[],\n options: AnalyzeOptions = {},\n): ReactUsageGraph {\n return new ReactAnalyzer(normalizeEntryFiles(entryFile), options).analyze()\n}\n\nclass ReactAnalyzer extends BaseAnalyzer<ReactUsageGraph> {\n constructor(\n private readonly entryFiles: readonly string[],\n options: AnalyzeOptions,\n ) {\n const [firstEntryFile] = entryFiles\n if (firstEntryFile === undefined) {\n throw new Error('At least one React entry file is required.')\n }\n\n super(firstEntryFile, options)\n }\n\n protected doAnalyze(): ReactUsageGraph {\n const dependencyGraphs = this.entryFiles.map((entryFile) =>\n analyzeDependencies(entryFile, this.options),\n )\n const dependencyGraph = mergeDependencyGraphs(dependencyGraphs)\n const entryIds = dependencyGraphs.map((graph) => graph.entryId)\n const fileAnalyses = this.collectFileAnalyses(dependencyGraph)\n const nodes = this.createNodes(fileAnalyses)\n this.attachUsages(fileAnalyses, nodes)\n const entries = this.collectEntries(fileAnalyses, nodes)\n\n return {\n cwd: dependencyGraph.cwd,\n entryId: dependencyGraph.entryId,\n entryIds,\n nodes,\n entries,\n }\n }\n\n private collectFileAnalyses(\n dependencyGraph: MergedDependencyGraph,\n ): Map<string, import('./file.js').FileAnalysis> {\n const reachableFiles = new Set<string>([\n ...dependencyGraph.entryIds,\n ...dependencyGraph.nodes.keys(),\n ])\n const fileAnalyses = new Map<string, import('./file.js').FileAnalysis>()\n\n for (const filePath of [...reachableFiles].sort()) {\n if (!isSourceCodeFile(filePath) || filePath.endsWith('.d.ts')) {\n continue\n }\n\n const sourceText = fs.readFileSync(filePath, 'utf8')\n const parseResult = parseSync(filePath, sourceText, {\n astType: 'ts',\n sourceType: 'unambiguous',\n })\n\n const dependencyNode = dependencyGraph.nodes.get(filePath)\n const sourceDependencies = new Map<string, string>()\n dependencyNode?.dependencies.forEach((dependency) => {\n if (dependency.kind === 'source') {\n sourceDependencies.set(dependency.specifier, dependency.target)\n }\n })\n\n fileAnalyses.set(\n filePath,\n analyzeReactFile(\n parseResult.program,\n filePath,\n sourceText,\n dependencyGraph.entryIds.includes(filePath),\n sourceDependencies,\n this.options.includeBuiltins === true,\n ),\n )\n }\n\n return fileAnalyses\n }\n\n private createNodes(\n fileAnalyses: ReadonlyMap<string, import('./file.js').FileAnalysis>,\n ): Map<string, ReactUsageNode> {\n const nodes = new Map<string, ReactUsageNode>()\n\n for (const fileAnalysis of fileAnalyses.values()) {\n for (const symbol of fileAnalysis.allSymbolsById.values()) {\n nodes.set(symbol.id, {\n id: symbol.id,\n name: symbol.name,\n kind: symbol.kind,\n filePath: symbol.filePath,\n exportNames: [...symbol.exportNames].sort(),\n usages: [],\n })\n }\n }\n\n addExternalHookNodes(fileAnalyses, nodes)\n if (this.options.includeBuiltins === true) {\n addBuiltinNodes(fileAnalyses, nodes)\n }\n return nodes\n }\n\n private attachUsages(\n fileAnalyses: ReadonlyMap<string, import('./file.js').FileAnalysis>,\n nodes: Map<string, ReactUsageNode>,\n ): void {\n for (const fileAnalysis of fileAnalyses.values()) {\n for (const symbol of fileAnalysis.allSymbolsById.values()) {\n const usages = new Map<string, ReactUsageEdge>()\n\n symbol.componentReferences.forEach((referenceName) => {\n const targetId = resolveReactReference(\n fileAnalysis,\n fileAnalyses,\n referenceName,\n 'component',\n )\n if (targetId !== undefined && targetId !== symbol.id) {\n usages.set(`render:${targetId}:${referenceName}`, {\n kind: 'render',\n target: targetId,\n referenceName,\n })\n }\n })\n\n symbol.hookReferences.forEach((referenceName) => {\n const targetId = resolveReactReference(\n fileAnalysis,\n fileAnalyses,\n referenceName,\n 'hook',\n )\n if (targetId !== undefined && targetId !== symbol.id) {\n usages.set(`hook:${targetId}:${referenceName}`, {\n kind: 'hook-call',\n target: targetId,\n referenceName,\n })\n }\n })\n\n if (this.options.includeBuiltins === true) {\n symbol.builtinReferences.forEach((referenceName) => {\n const targetId = getBuiltinNodeId(referenceName)\n usages.set(`render:${targetId}:${referenceName}`, {\n kind: 'render',\n target: targetId,\n referenceName,\n })\n })\n }\n\n const node = nodes.get(symbol.id)\n if (node === undefined) {\n continue\n }\n\n const sortedUsages = [...usages.values()].sort((left, right) =>\n compareReactNodeIds(left.target, right.target, nodes),\n )\n\n nodes.set(symbol.id, {\n ...node,\n usages: sortedUsages,\n })\n }\n }\n }\n\n private collectEntries(\n fileAnalyses: ReadonlyMap<string, import('./file.js').FileAnalysis>,\n nodes: ReadonlyMap<string, ReactUsageNode>,\n ): ReactUsageEntry[] {\n const entriesByKey = new Map<string, ReactUsageEntry>()\n\n for (const fileAnalysis of fileAnalyses.values()) {\n for (const entry of fileAnalysis.entryUsages) {\n const targetId = resolveReactReference(\n fileAnalysis,\n fileAnalyses,\n entry.referenceName,\n entry.kind,\n )\n if (targetId === undefined) {\n continue\n }\n\n const key = `${entry.location.filePath}:${entry.location.line}:${entry.location.column}:${targetId}`\n entriesByKey.set(key, {\n target: targetId,\n referenceName: entry.referenceName,\n location: entry.location,\n })\n }\n }\n\n return [...entriesByKey.values()].sort((left, right) =>\n compareReactUsageEntries(left, right, nodes),\n )\n }\n}\n\nfunction normalizeEntryFiles(entryFile: string | readonly string[]): string[] {\n const entryFiles = Array.isArray(entryFile) ? entryFile : [entryFile]\n const dedupedEntryFiles = [...new Set(entryFiles)]\n\n if (dedupedEntryFiles.length === 0) {\n throw new Error('At least one React entry file is required.')\n }\n\n return dedupedEntryFiles\n}\n\nfunction mergeDependencyGraphs(\n graphs: readonly DependencyGraph[],\n): MergedDependencyGraph {\n const firstGraph = graphs[0]\n if (firstGraph === undefined) {\n throw new Error('At least one dependency graph is required.')\n }\n\n const nodes = new Map<string, SourceModuleNode>()\n for (const graph of graphs) {\n for (const [nodeId, node] of graph.nodes) {\n if (!nodes.has(nodeId)) {\n nodes.set(nodeId, node)\n }\n }\n }\n\n const uniqueConfigPaths = [\n ...new Set(graphs.map((graph) => graph.configPath)),\n ]\n const configPath =\n uniqueConfigPaths.length === 1 ? uniqueConfigPaths[0] : undefined\n\n return {\n cwd: firstGraph.cwd,\n entryId: firstGraph.entryId,\n entryIds: graphs.map((graph) => graph.entryId),\n nodes,\n ...(configPath === undefined ? {} : { configPath }),\n }\n}\n\ninterface MergedDependencyGraph extends DependencyGraph {\n readonly entryIds: readonly string[]\n}\n","import type { ReactUsageEdge } from '../../types/react-usage-edge.js'\nimport type { ReactUsageEntry } from '../../types/react-usage-entry.js'\nimport type { ReactUsageFilter } from '../../types/react-usage-filter.js'\nimport type { ReactUsageGraph } from '../../types/react-usage-graph.js'\nimport type { ReactUsageNode } from '../../types/react-usage-node.js'\nimport { compareReactNodeIds } from './references.js'\n\nexport function getReactUsageEntries(\n graph: ReactUsageGraph,\n filter: ReactUsageFilter = 'all',\n): ReactUsageEntry[] {\n return graph.entries.filter((entry) => {\n const targetNode = graph.nodes.get(entry.target)\n return targetNode !== undefined && matchesReactFilter(targetNode, filter)\n })\n}\n\nexport function getReactUsageRoots(\n graph: ReactUsageGraph,\n filter: ReactUsageFilter = 'all',\n): string[] {\n const entries = getReactUsageEntries(graph, filter)\n if (entries.length > 0) {\n return [...new Set(entries.map((entry) => entry.target))]\n }\n\n const filteredNodes = getFilteredReactUsageNodes(graph, filter)\n const inboundCounts = new Map<string, number>()\n\n filteredNodes.forEach((node) => {\n inboundCounts.set(node.id, 0)\n })\n\n filteredNodes.forEach((node) => {\n getFilteredUsages(node, graph, filter).forEach((usage) => {\n inboundCounts.set(\n usage.target,\n (inboundCounts.get(usage.target) ?? 0) + 1,\n )\n })\n })\n\n const roots = filteredNodes\n .filter((node) => (inboundCounts.get(node.id) ?? 0) === 0)\n .map((node) => node.id)\n\n if (roots.length > 0) {\n return roots.sort((left, right) =>\n compareReactNodeIds(left, right, graph.nodes),\n )\n }\n\n return filteredNodes\n .map((node) => node.id)\n .sort((left, right) => compareReactNodeIds(left, right, graph.nodes))\n}\n\nexport function getFilteredUsages(\n node: ReactUsageNode,\n graph: ReactUsageGraph,\n filter: ReactUsageFilter = 'all',\n): ReactUsageEdge[] {\n return node.usages.filter((usage) => {\n const targetNode = graph.nodes.get(usage.target)\n return targetNode !== undefined && matchesReactFilter(targetNode, filter)\n })\n}\n\nfunction getFilteredReactUsageNodes(\n graph: ReactUsageGraph,\n filter: ReactUsageFilter,\n): ReactUsageNode[] {\n return [...graph.nodes.values()]\n .filter((node) => matchesReactFilter(node, filter))\n .sort((left, right) => {\n return (\n left.filePath.localeCompare(right.filePath) ||\n left.name.localeCompare(right.name) ||\n left.kind.localeCompare(right.kind)\n )\n })\n}\n\nfunction matchesReactFilter(\n node: ReactUsageNode,\n filter: ReactUsageFilter,\n): boolean {\n return filter === 'all' || node.kind === filter\n}\n","import process from 'node:process'\n\nimport type { ColorMode } from './types/color-mode.js'\nimport type { ReactSymbolKind } from './types/react-symbol-kind.js'\n\nconst ANSI_RESET = '\\u001B[0m'\nconst ANSI_COMPONENT = '\\u001B[36m'\nconst ANSI_HOOK = '\\u001B[35m'\nconst ANSI_BUILTIN = '\\u001B[34m'\nconst ANSI_MUTED = '\\u001B[38;5;244m'\nconst ANSI_UNUSED = '\\u001B[38;5;214m'\nconst ANSI_DIFF_ADDED = '\\u001B[32m'\nconst ANSI_DIFF_REMOVED = '\\u001B[31m'\nconst ANSI_DIFF_CHANGED = '\\u001B[33m'\n\ninterface ResolveColorSupportOptions {\n readonly forceColor?: string | undefined\n readonly isTTY?: boolean | undefined\n readonly noColor?: string | undefined\n}\n\nexport function resolveColorSupport(\n mode: ColorMode = 'auto',\n options: ResolveColorSupportOptions = {},\n): boolean {\n if (mode === true) {\n return true\n }\n\n if (mode === false) {\n return false\n }\n\n const forceColor =\n 'forceColor' in options ? options.forceColor : process.env.FORCE_COLOR\n if (forceColor !== undefined) {\n return forceColor !== '0'\n }\n\n const noColor = 'noColor' in options ? options.noColor : process.env.NO_COLOR\n if (noColor !== undefined) {\n return false\n }\n\n const isTTY = 'isTTY' in options ? options.isTTY : process.stdout.isTTY\n return isTTY === true\n}\n\nexport function colorizeUnusedMarker(text: string, enabled: boolean): string {\n if (!enabled) {\n return text\n }\n\n return text.replaceAll('(unused)', `${ANSI_UNUSED}(unused)${ANSI_RESET}`)\n}\n\nexport function formatReactSymbolLabel(\n name: string,\n kind: ReactSymbolKind,\n enabled: boolean,\n): string {\n const label = `${formatReactSymbolName(name, kind)} [${kind}]`\n if (!enabled) {\n return label\n }\n\n return `${getReactSymbolColor(kind)}${label}${ANSI_RESET}`\n}\n\nexport function formatReactSymbolName(\n name: string,\n kind: ReactSymbolKind,\n): string {\n if (kind === 'component') {\n return `<${name} />`\n }\n\n if (kind === 'hook') {\n return `${name}()`\n }\n\n return `<${name}>`\n}\nexport function colorizeReactLabel(\n text: string,\n kind: ReactSymbolKind,\n enabled: boolean,\n): string {\n if (!enabled) {\n return text\n }\n\n return `${getReactSymbolColor(kind)}${text}${ANSI_RESET}`\n}\n\nexport function colorizeMuted(text: string, enabled: boolean): string {\n if (!enabled) {\n return text\n }\n\n return `${ANSI_MUTED}${text}${ANSI_RESET}`\n}\n\nexport function colorizePackageDiff(\n text: string,\n change: 'added' | 'removed' | 'changed',\n enabled: boolean,\n): string {\n if (!enabled) {\n return text\n }\n\n return `${getPackageDiffColor(change)}${text}${ANSI_RESET}`\n}\n\nfunction getReactSymbolColor(kind: ReactSymbolKind): string {\n if (kind === 'component') {\n return ANSI_COMPONENT\n }\n\n if (kind === 'hook') {\n return ANSI_HOOK\n }\n\n return ANSI_BUILTIN\n}\n\nfunction getPackageDiffColor(change: 'added' | 'removed' | 'changed'): string {\n if (change === 'added') {\n return ANSI_DIFF_ADDED\n }\n\n if (change === 'removed') {\n return ANSI_DIFF_REMOVED\n }\n\n return ANSI_DIFF_CHANGED\n}\n","import { colorizePackageDiff, resolveColorSupport } from '../../color.js'\nimport type { PackageDependencyChangeKind } from '../../types/package-dependency-change-kind.js'\nimport type { PackageDependencyDiffDependency } from '../../types/package-dependency-diff-dependency.js'\nimport type { PackageDependencyDiffGraph } from '../../types/package-dependency-diff-graph.js'\nimport type { PackageDependencyDiffNode } from '../../types/package-dependency-diff-node.js'\nimport type { PackageDependencyGraph } from '../../types/package-dependency-graph.js'\nimport type { PackageManifestDependency } from '../../types/package-manifest-dependency.js'\nimport type { PrintPackageTreeOptions } from '../../types/print-package-tree-options.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\nexport function printPackageDependencyTree(\n graph: PackageDependencyGraph,\n _options: PrintPackageTreeOptions = {},\n): string {\n const rootNode = graph.nodes.get(graph.rootId)\n if (rootNode === undefined) {\n return toDisplayPath(graph.rootId, graph.repositoryRoot)\n }\n\n const lines = [rootNode.packageName]\n const visited = new Set<string>([graph.rootId])\n\n rootNode.dependencies.forEach((dependency, index) => {\n lines.push(\n ...renderDependency(\n dependency,\n graph,\n visited,\n '',\n index === rootNode.dependencies.length - 1,\n ),\n )\n })\n\n return lines.join('\\n')\n}\n\nexport function printPackageDependencyDiffTree(\n graph: PackageDependencyDiffGraph,\n options: PrintPackageTreeOptions = {},\n): string {\n const color = resolveColorSupport(options.color)\n const lines = [formatDiffRootLabel(graph.root, color)]\n\n graph.root.dependencies.forEach((dependency, index) => {\n lines.push(\n ...renderDiffDependency(\n dependency,\n '',\n index === graph.root.dependencies.length - 1,\n color,\n ),\n )\n })\n\n return lines.join('\\n')\n}\n\nfunction renderDependency(\n dependency: PackageManifestDependency,\n graph: PackageDependencyGraph,\n visited: ReadonlySet<string>,\n prefix: string,\n isLast: boolean,\n): string[] {\n const branch = `${prefix}${isLast ? '└─ ' : '├─ '}`\n const label = formatDependencyLabel(dependency, graph.repositoryRoot)\n\n if (dependency.kind === 'external') {\n return [`${branch}${label}`]\n }\n\n if (visited.has(dependency.target)) {\n return [`${branch}${label} (circular)`]\n }\n\n const childNode = graph.nodes.get(dependency.target)\n if (childNode === undefined) {\n return [`${branch}${label}`]\n }\n\n const childLines = [`${branch}${label}`]\n const nextPrefix = `${prefix}${isLast ? ' ' : '│ '}`\n const nextVisited = new Set(visited)\n nextVisited.add(dependency.target)\n\n childNode.dependencies.forEach((childDependency, index) => {\n childLines.push(\n ...renderDependency(\n childDependency,\n graph,\n nextVisited,\n nextPrefix,\n index === childNode.dependencies.length - 1,\n ),\n )\n })\n\n return childLines\n}\n\nfunction formatDependencyLabel(\n dependency: PackageManifestDependency,\n repositoryRoot: string,\n): string {\n if (dependency.kind === 'external') {\n return `${dependency.name}@${dependency.specifier}`\n }\n\n const workspaceLabel = toDisplayPath(dependency.target, repositoryRoot)\n\n if (dependency.specifier === undefined) {\n return workspaceLabel\n }\n\n return `${workspaceLabel} (${dependency.specifier})`\n}\n\nfunction renderDiffDependency(\n dependency: PackageDependencyDiffDependency,\n prefix: string,\n isLast: boolean,\n color: boolean,\n): string[] {\n const branch = `${prefix}${isLast ? '└─ ' : '├─ '}`\n const line = `${branch}${formatDiffDependencyLine(dependency, color)}`\n\n if (dependency.kind === 'external') {\n return [line]\n }\n\n if (dependency.node.kind === 'circular') {\n return [`${line} (circular)`]\n }\n\n const childLines = [line]\n const nextPrefix = `${prefix}${isLast ? ' ' : '│ '}`\n\n dependency.node.dependencies.forEach((childDependency, index) => {\n childLines.push(\n ...renderDiffDependency(\n childDependency,\n nextPrefix,\n index === dependency.node.dependencies.length - 1,\n color,\n ),\n )\n })\n\n return childLines\n}\n\nfunction formatDiffRootLabel(\n node: PackageDependencyDiffNode,\n color: boolean,\n): string {\n if (\n node.change === 'changed' &&\n node.beforePackageName !== undefined &&\n node.afterPackageName !== undefined\n ) {\n return colorizeDiffText(\n `${toMarker(node.change)} ${node.beforePackageName} -> ${node.afterPackageName}`,\n node.change,\n color,\n )\n }\n\n if (node.change === 'unchanged') {\n return node.packageName\n }\n\n return colorizeDiffText(\n `${toMarker(node.change)} ${node.packageName}`,\n node.change,\n color,\n )\n}\n\nfunction formatDiffDependencyLine(\n dependency: PackageDependencyDiffDependency,\n color: boolean,\n): string {\n const marker = resolveVisibleDependencyMarker(dependency)\n const label = formatDiffDependencyLabel(dependency)\n\n if (marker === 'unchanged') {\n return label\n }\n\n return colorizeDiffText(`${toMarker(marker)} ${label}`, marker, color)\n}\n\nfunction resolveVisibleDependencyMarker(\n dependency: PackageDependencyDiffDependency,\n): PackageDependencyChangeKind {\n if (dependency.change !== 'unchanged') {\n return dependency.change\n }\n\n if (\n dependency.kind === 'workspace' &&\n dependency.node.change !== 'unchanged'\n ) {\n return dependency.node.change\n }\n\n return 'unchanged'\n}\n\nfunction formatDiffDependencyLabel(\n dependency: PackageDependencyDiffDependency,\n): string {\n if (dependency.kind === 'external') {\n return formatExternalDiffLabel(dependency)\n }\n\n return formatWorkspaceDiffLabel(dependency)\n}\n\nfunction formatExternalDiffLabel(\n dependency: Extract<PackageDependencyDiffDependency, { kind: 'external' }>,\n): string {\n const beforeResolution = dependency.before?.resolvedVersion\n const afterResolution = dependency.after?.resolvedVersion\n\n if (dependency.change !== 'changed') {\n return (\n dependency.after?.target ?? dependency.before?.target ?? dependency.name\n )\n }\n\n const previousSpecifier = dependency.before?.specifier ?? 'none'\n const nextSpecifier = dependency.after?.specifier ?? 'none'\n\n if (dependency.resolvedVersionChanged) {\n const resolutionLabel = formatVersionChange(\n beforeResolution,\n afterResolution,\n )\n\n return previousSpecifier === nextSpecifier\n ? `${dependency.name}@${nextSpecifier} (${resolutionLabel})`\n : `${dependency.name}@${previousSpecifier} -> ${nextSpecifier} (${resolutionLabel})`\n }\n\n if (previousSpecifier === nextSpecifier) {\n return `${dependency.name}@${nextSpecifier}`\n }\n\n return `${dependency.name}@${previousSpecifier} -> ${nextSpecifier}`\n}\n\nfunction formatWorkspaceDiffLabel(\n dependency: Extract<PackageDependencyDiffDependency, { kind: 'workspace' }>,\n): string {\n if (dependency.change !== 'changed') {\n return formatWorkspaceState(\n dependency.after ?? dependency.before,\n dependency.node.path,\n )\n }\n\n const previousTarget = dependency.before?.target ?? dependency.node.path\n const nextTarget = dependency.after?.target ?? dependency.node.path\n const targetLabel =\n previousTarget === nextTarget\n ? nextTarget\n : `${previousTarget} -> ${nextTarget}`\n const previousSpecifier = dependency.before?.specifier\n const nextSpecifier = dependency.after?.specifier\n\n if (previousSpecifier === nextSpecifier) {\n return formatWorkspaceState(\n {\n target: targetLabel,\n ...(nextSpecifier === undefined ? {} : { specifier: nextSpecifier }),\n },\n dependency.node.path,\n )\n }\n\n return formatWorkspaceState(\n {\n target: targetLabel,\n specifier: `${previousSpecifier ?? 'none'} -> ${nextSpecifier ?? 'none'}`,\n },\n dependency.node.path,\n )\n}\n\nfunction formatWorkspaceState(\n state:\n | {\n readonly target: string\n readonly specifier?: string\n }\n | undefined,\n fallbackTarget: string,\n): string {\n const target = state?.target ?? fallbackTarget\n\n if (state?.specifier === undefined) {\n return target\n }\n\n return `${target} (${state.specifier})`\n}\n\nfunction formatVersionChange(\n beforeResolvedVersion: string | undefined,\n afterResolvedVersion: string | undefined,\n): string {\n return `${beforeResolvedVersion ?? 'none'} -> ${afterResolvedVersion ?? 'none'}`\n}\n\nfunction toMarker(change: PackageDependencyChangeKind): '+' | '-' | '~' {\n if (change === 'added') {\n return '+'\n }\n\n if (change === 'removed') {\n return '-'\n }\n\n return '~'\n}\n\nfunction colorizeDiffText(\n text: string,\n change: PackageDependencyChangeKind,\n color: boolean,\n): string {\n if (change === 'unchanged') {\n return text\n }\n\n return colorizePackageDiff(text, change, color)\n}\n","import { colorizeUnusedMarker, resolveColorSupport } from '../../color.js'\nimport type { DependencyEdge } from '../../types/dependency-edge.js'\nimport type { DependencyGraph } from '../../types/dependency-graph.js'\nimport type { PrintTreeOptions } from '../../types/print-tree-options.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\nexport function printDependencyTree(\n graph: DependencyGraph,\n options: PrintTreeOptions = {},\n): string {\n const cwd = options.cwd ?? graph.cwd\n const color = resolveColorSupport(options.color)\n const includeExternals = options.includeExternals ?? false\n const omitUnused = options.omitUnused ?? false\n const rootLines = [toDisplayPath(graph.entryId, cwd)]\n const visited = new Set<string>([graph.entryId])\n const expanded = new Set<string>([graph.entryId])\n const entryNode = graph.nodes.get(graph.entryId)\n\n if (entryNode === undefined) {\n return rootLines.join('\\n')\n }\n\n const rootDependencies = filterDependencies(\n entryNode.dependencies,\n includeExternals,\n omitUnused,\n )\n\n rootDependencies.forEach((dependency, index) => {\n rootLines.push(\n ...renderDependency(\n dependency,\n graph,\n visited,\n expanded,\n '',\n index === rootDependencies.length - 1,\n includeExternals,\n omitUnused,\n color,\n cwd,\n ),\n )\n })\n\n return rootLines.join('\\n')\n}\n\nfunction renderDependency(\n dependency: DependencyEdge,\n graph: DependencyGraph,\n visited: ReadonlySet<string>,\n expanded: Set<string>,\n prefix: string,\n isLast: boolean,\n includeExternals: boolean,\n omitUnused: boolean,\n color: boolean,\n cwd: string,\n): string[] {\n const branch = `${prefix}${isLast ? '└─ ' : '├─ '}`\n const label = formatDependencyLabel(dependency, cwd, color)\n\n if (dependency.kind !== 'source') {\n return [`${branch}${label}`]\n }\n\n if (visited.has(dependency.target)) {\n return [`${branch}${label} (circular)`]\n }\n\n const childNode = graph.nodes.get(dependency.target)\n if (childNode === undefined) {\n return [`${branch}${label}`]\n }\n\n if (expanded.has(dependency.target)) {\n return [`${branch}${label} (shared)`]\n }\n\n const nextPrefix = `${prefix}${isLast ? ' ' : '│ '}`\n const nextVisited = new Set(visited)\n nextVisited.add(dependency.target)\n expanded.add(dependency.target)\n\n const childLines = [`${branch}${label}`]\n const childDependencies = filterDependencies(\n childNode.dependencies,\n includeExternals,\n omitUnused,\n )\n\n childDependencies.forEach((childDependency, index) => {\n childLines.push(\n ...renderDependency(\n childDependency,\n graph,\n nextVisited,\n expanded,\n nextPrefix,\n index === childDependencies.length - 1,\n includeExternals,\n omitUnused,\n color,\n cwd,\n ),\n )\n })\n\n return childLines\n}\n\nfunction filterDependencies(\n dependencies: readonly DependencyEdge[],\n includeExternals: boolean,\n omitUnused: boolean,\n): DependencyEdge[] {\n return dependencies.filter((dependency) => {\n if (omitUnused && dependency.unused) {\n return false\n }\n\n if (\n dependency.kind === 'source' ||\n dependency.kind === 'missing' ||\n dependency.kind === 'boundary'\n ) {\n return true\n }\n\n return includeExternals\n })\n}\n\nfunction formatDependencyLabel(\n dependency: DependencyEdge,\n cwd: string,\n color: boolean,\n): string {\n const prefixes: string[] = []\n if (dependency.isTypeOnly) {\n prefixes.push('type')\n }\n\n if (dependency.referenceKind === 'require') {\n prefixes.push('require')\n } else if (dependency.referenceKind === 'dynamic-import') {\n prefixes.push('dynamic')\n } else if (dependency.referenceKind === 'export') {\n prefixes.push('re-export')\n } else if (dependency.referenceKind === 'import-equals') {\n prefixes.push('import=')\n }\n\n const annotation = prefixes.length > 0 ? `[${prefixes.join(', ')}] ` : ''\n\n if (dependency.kind === 'source') {\n return colorizeUnusedMarker(\n withUnusedSuffix(\n `${annotation}${toDisplayPath(dependency.target, cwd)}`,\n dependency.unused,\n ),\n color,\n )\n }\n\n if (dependency.kind === 'missing') {\n return colorizeUnusedMarker(\n withUnusedSuffix(\n `${annotation}${dependency.specifier} [missing]`,\n dependency.unused,\n ),\n color,\n )\n }\n\n if (dependency.kind === 'boundary') {\n return colorizeUnusedMarker(\n withUnusedSuffix(\n `${annotation}${toDisplayPath(dependency.target, cwd)} [${\n dependency.boundary === 'project'\n ? 'project boundary'\n : 'workspace boundary'\n }]`,\n dependency.unused,\n ),\n color,\n )\n }\n\n if (dependency.kind === 'builtin') {\n return colorizeUnusedMarker(\n withUnusedSuffix(\n `${annotation}${dependency.target} [builtin]`,\n dependency.unused,\n ),\n color,\n )\n }\n\n return colorizeUnusedMarker(\n withUnusedSuffix(\n `${annotation}${dependency.target} [external]`,\n dependency.unused,\n ),\n color,\n )\n}\n\nfunction withUnusedSuffix(label: string, unused: boolean): string {\n return unused ? `${label} (unused)` : label\n}\n","import {\n getFilteredUsages,\n getReactUsageEntries,\n getReactUsageRoots,\n} from '../../analyzers/react/queries.js'\nimport {\n colorizeMuted,\n colorizeReactLabel,\n formatReactSymbolLabel,\n formatReactSymbolName,\n resolveColorSupport,\n} from '../../color.js'\nimport type { PrintReactTreeOptions } from '../../types/print-react-tree-options.js'\nimport type { ReactUsageEdge } from '../../types/react-usage-edge.js'\nimport type { ReactUsageEntry } from '../../types/react-usage-entry.js'\nimport type { ReactUsageGraph } from '../../types/react-usage-graph.js'\nimport type { ReactUsageNode } from '../../types/react-usage-node.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\nexport function printReactUsageTree(\n graph: ReactUsageGraph,\n options: PrintReactTreeOptions = {},\n): string {\n const cwd = options.cwd ?? graph.cwd\n const color = resolveColorSupport(options.color)\n const filter = options.filter ?? 'all'\n const entries = getReactUsageEntries(graph, filter)\n\n if (entries.length > 0) {\n return renderReactUsageEntries(graph, entries, cwd, filter, color)\n }\n\n const roots = getReactUsageRoots(graph, filter)\n if (roots.length === 0) {\n return 'No React symbols found.'\n }\n\n const lines: string[] = []\n roots.forEach((rootId, index) => {\n const root = graph.nodes.get(rootId)\n if (root === undefined) {\n return\n }\n\n lines.push(formatReactNodeLabel(root, cwd, color))\n const usages = getFilteredUsages(root, graph, filter)\n usages.forEach((usage, usageIndex) => {\n lines.push(\n ...renderUsage(\n usage,\n graph,\n cwd,\n filter,\n color,\n new Set([root.id]),\n '',\n usageIndex === usages.length - 1,\n ),\n )\n })\n\n if (index < roots.length - 1) {\n lines.push('')\n }\n })\n\n return lines.join('\\n')\n}\n\nfunction renderReactUsageEntries(\n graph: ReactUsageGraph,\n entries: readonly ReactUsageEntry[],\n cwd: string,\n filter: NonNullable<PrintReactTreeOptions['filter']>,\n color: boolean,\n): string {\n const lines: string[] = []\n\n entries.forEach((entry, index) => {\n const root = graph.nodes.get(entry.target)\n if (root === undefined) {\n return\n }\n\n lines.push(formatReactEntryLabel(entry, cwd))\n lines.push(formatReactNodeLabel(root, cwd, color, entry.referenceName))\n\n const usages = getFilteredUsages(root, graph, filter)\n usages.forEach((usage, usageIndex) => {\n lines.push(\n ...renderUsage(\n usage,\n graph,\n cwd,\n filter,\n color,\n new Set([root.id]),\n '',\n usageIndex === usages.length - 1,\n ),\n )\n })\n\n if (index < entries.length - 1) {\n lines.push('')\n }\n })\n\n return lines.join('\\n')\n}\n\nfunction renderUsage(\n usage: ReactUsageEdge,\n graph: ReactUsageGraph,\n cwd: string,\n filter: NonNullable<PrintReactTreeOptions['filter']>,\n color: boolean,\n visited: ReadonlySet<string>,\n prefix: string,\n isLast: boolean,\n): string[] {\n const branch = `${prefix}${isLast ? '└─ ' : '├─ '}`\n const target = graph.nodes.get(usage.target)\n\n if (target === undefined) {\n return [`${branch}${usage.target}`]\n }\n\n if (visited.has(target.id)) {\n return [\n `${branch}${formatReactNodeLabel(target, cwd, color, usage.referenceName)} (circular)`,\n ]\n }\n\n const childLines = [\n `${branch}${formatReactNodeLabel(target, cwd, color, usage.referenceName)}`,\n ]\n const nextVisited = new Set(visited)\n nextVisited.add(target.id)\n const nextPrefix = `${prefix}${isLast ? ' ' : '│ '}`\n const childUsages = getFilteredUsages(target, graph, filter)\n\n childUsages.forEach((childUsage, index) => {\n childLines.push(\n ...renderUsage(\n childUsage,\n graph,\n cwd,\n filter,\n color,\n nextVisited,\n nextPrefix,\n index === childUsages.length - 1,\n ),\n )\n })\n\n return childLines\n}\n\nfunction formatReactNodeLabel(\n node: ReactUsageNode,\n cwd: string,\n color: boolean,\n referenceName?: string,\n): string {\n const hasAlias = referenceName !== undefined && referenceName !== node.name\n const label = hasAlias\n ? `${colorizeReactLabel(formatReactSymbolName(node.name, node.kind), node.kind, color)} ${colorizeMuted(\n `as ${referenceName}`,\n color,\n )} ${colorizeReactLabel(`[${node.kind}]`, node.kind, color)}`\n : formatReactSymbolLabel(node.name, node.kind, color)\n\n return `${label} (${formatReactNodeFilePath(node, cwd)})`\n}\n\nfunction formatReactEntryLabel(entry: ReactUsageEntry, cwd: string): string {\n return `${toDisplayPath(entry.location.filePath, cwd)}:${entry.location.line}:${entry.location.column}`\n}\n\nfunction formatReactNodeFilePath(node: ReactUsageNode, cwd: string): string {\n return node.kind === 'builtin' ? 'html' : toDisplayPath(node.filePath, cwd)\n}\n","import type { PackageDependencyDiffDependency } from '../../types/package-dependency-diff-dependency.js'\nimport type { PackageDependencyDiffGraph } from '../../types/package-dependency-diff-graph.js'\nimport type { PackageDependencyDiffNode } from '../../types/package-dependency-diff-node.js'\nimport type { PackageDependencyGraph } from '../../types/package-dependency-graph.js'\nimport type { PackageManifestDependency } from '../../types/package-manifest-dependency.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\nexport function graphToSerializablePackageTree(\n graph: PackageDependencyGraph,\n): object {\n return serializePackageNode(graph.rootId, graph, new Set())\n}\n\nexport function diffGraphToSerializablePackageTree(\n graph: PackageDependencyDiffGraph,\n): object {\n return serializePackageDiffNode(graph.root)\n}\n\nfunction serializePackageNode(\n packageDir: string,\n graph: PackageDependencyGraph,\n visited: Set<string>,\n): object {\n const packageNode = graph.nodes.get(packageDir)\n const packagePath = toDisplayPath(packageDir, graph.repositoryRoot)\n\n if (packageNode === undefined) {\n return {\n kind: 'missing',\n label: packagePath,\n path: packagePath,\n dependencies: [],\n }\n }\n\n if (visited.has(packageDir)) {\n return {\n kind: 'circular',\n label: packageNode.packageName,\n packageName: packageNode.packageName,\n path: packagePath,\n dependencies: [],\n }\n }\n\n visited.add(packageDir)\n\n return {\n kind: packageDir === graph.rootId ? 'root' : 'workspace',\n label: packageDir === graph.rootId ? packageNode.packageName : packagePath,\n packageName: packageNode.packageName,\n path: packagePath,\n dependencies: packageNode.dependencies.map((dependency) =>\n serializeDependency(dependency, graph, new Set(visited)),\n ),\n }\n}\n\nfunction serializeDependency(\n dependency: PackageManifestDependency,\n graph: PackageDependencyGraph,\n visited: Set<string>,\n): object {\n if (dependency.kind === 'external') {\n return {\n kind: 'external',\n name: dependency.name,\n specifier: dependency.specifier,\n target: `${dependency.name}@${dependency.specifier}`,\n }\n }\n\n return {\n kind: 'workspace',\n name: dependency.name,\n ...(dependency.specifier === undefined\n ? {}\n : { specifier: dependency.specifier }),\n target: toDisplayPath(dependency.target, graph.repositoryRoot),\n node: serializePackageNode(dependency.target, graph, visited),\n }\n}\n\nfunction serializePackageDiffNode(node: PackageDependencyDiffNode): object {\n return {\n kind: node.kind,\n label: node.label,\n packageName: node.packageName,\n path: node.path,\n change: node.change,\n ...(node.beforePackageName === undefined\n ? {}\n : { beforePackageName: node.beforePackageName }),\n ...(node.afterPackageName === undefined\n ? {}\n : { afterPackageName: node.afterPackageName }),\n dependencies: node.dependencies.map((dependency) =>\n serializePackageDiffDependency(dependency),\n ),\n }\n}\n\nfunction serializePackageDiffDependency(\n dependency: PackageDependencyDiffDependency,\n): object {\n return {\n kind: dependency.kind,\n name: dependency.name,\n change: dependency.change,\n ...(dependency.kind === 'external'\n ? {\n specifierChanged: dependency.specifierChanged,\n resolvedVersionChanged: dependency.resolvedVersionChanged,\n peerContextChanged: dependency.peerContextChanged,\n }\n : {}),\n ...(dependency.before === undefined\n ? {}\n : {\n beforeTarget: dependency.before.target,\n ...(dependency.before.specifier === undefined\n ? {}\n : { beforeSpecifier: dependency.before.specifier }),\n ...(dependency.before.resolvedVersion === undefined\n ? {}\n : { beforeResolvedVersion: dependency.before.resolvedVersion }),\n ...(dependency.before.peerContext === undefined\n ? {}\n : { beforePeerContext: dependency.before.peerContext }),\n }),\n ...(dependency.after === undefined\n ? {}\n : {\n afterTarget: dependency.after.target,\n ...(dependency.after.specifier === undefined\n ? {}\n : { afterSpecifier: dependency.after.specifier }),\n ...(dependency.after.resolvedVersion === undefined\n ? {}\n : { afterResolvedVersion: dependency.after.resolvedVersion }),\n ...(dependency.after.peerContext === undefined\n ? {}\n : { afterPeerContext: dependency.after.peerContext }),\n }),\n ...(dependency.before === undefined ? {} : { before: dependency.before }),\n ...(dependency.after === undefined ? {} : { after: dependency.after }),\n ...(dependency.after === undefined\n ? dependency.before === undefined\n ? {}\n : { target: dependency.before.target }\n : { target: dependency.after.target }),\n ...(dependency.kind === 'workspace'\n ? { node: serializePackageDiffNode(dependency.node) }\n : {}),\n }\n}\n","import type { DependencyEdge } from '../../types/dependency-edge.js'\nimport type { DependencyGraph } from '../../types/dependency-graph.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\nexport function graphToSerializableTree(\n graph: DependencyGraph,\n options: {\n readonly omitUnused?: boolean\n } = {},\n): object {\n return serializeNode(\n graph.entryId,\n graph,\n new Set<string>(),\n new Set<string>(),\n options.omitUnused ?? false,\n )\n}\n\nfunction serializeNode(\n filePath: string,\n graph: DependencyGraph,\n visited: ReadonlySet<string>,\n expanded: Set<string>,\n omitUnused: boolean,\n): object {\n const node = graph.nodes.get(filePath)\n const displayPath = toDisplayPath(filePath, graph.cwd)\n\n if (node === undefined) {\n return {\n path: displayPath,\n kind: 'missing',\n dependencies: [],\n }\n }\n\n if (visited.has(filePath)) {\n return {\n path: displayPath,\n kind: 'circular',\n dependencies: [],\n }\n }\n\n if (expanded.has(filePath)) {\n return {\n path: displayPath,\n kind: 'shared',\n dependencies: [],\n }\n }\n\n const nextVisited = new Set(visited)\n nextVisited.add(filePath)\n expanded.add(filePath)\n\n const dependencies = node.dependencies\n .filter((dependency) => !omitUnused || !dependency.unused)\n .map((dependency) => {\n if (dependency.kind !== 'source') {\n return {\n specifier: dependency.specifier,\n referenceKind: dependency.referenceKind,\n isTypeOnly: dependency.isTypeOnly,\n unused: dependency.unused,\n kind: dependency.kind,\n ...(dependency.boundary === undefined\n ? {}\n : { boundary: dependency.boundary }),\n target: serializeDependencyTarget(dependency, graph.cwd),\n }\n }\n\n return {\n specifier: dependency.specifier,\n referenceKind: dependency.referenceKind,\n isTypeOnly: dependency.isTypeOnly,\n unused: dependency.unused,\n kind: dependency.kind,\n target: toDisplayPath(dependency.target, graph.cwd),\n node: serializeNode(\n dependency.target,\n graph,\n nextVisited,\n expanded,\n omitUnused,\n ),\n }\n })\n\n return {\n path: displayPath,\n kind: filePath === graph.entryId ? 'entry' : 'source',\n dependencies,\n }\n}\n\nfunction serializeDependencyTarget(\n dependency: DependencyEdge,\n cwd: string,\n): string {\n if (dependency.kind === 'missing' || dependency.kind === 'external') {\n return dependency.target\n }\n\n if (dependency.kind === 'builtin') {\n return dependency.target\n }\n\n return toDisplayPath(dependency.target, cwd)\n}\n","import {\n getFilteredUsages,\n getReactUsageEntries,\n getReactUsageRoots,\n} from '../../analyzers/react/queries.js'\nimport type { ReactUsageEntry } from '../../types/react-usage-entry.js'\nimport type { ReactUsageFilter } from '../../types/react-usage-filter.js'\nimport type { ReactUsageGraph } from '../../types/react-usage-graph.js'\nimport { toDisplayPath } from '../../utils/to-display-path.js'\n\ninterface SerializedReactUsageNode {\n readonly id: string\n readonly name: string\n readonly symbolKind:\n | import('../../types/react-symbol-kind.js').ReactSymbolKind\n | 'circular'\n readonly filePath: string\n readonly exportNames: readonly string[]\n readonly usages: readonly SerializedReactUsageEdge[]\n}\n\ninterface SerializedReactUsageEntry {\n readonly targetId: string\n readonly referenceName: string\n readonly filePath: string\n readonly line: number\n readonly column: number\n readonly node: SerializedReactUsageNode\n}\n\ninterface SerializedReactUsageEdge {\n readonly kind: import('../../types/react-usage-edge.js').ReactUsageEdge['kind']\n readonly targetId: string\n readonly referenceName: string\n readonly node: SerializedReactUsageNode\n}\n\nexport function graphToSerializableReactTree(\n graph: ReactUsageGraph,\n options: {\n readonly filter?: ReactUsageFilter\n } = {},\n): object {\n const filter = options.filter ?? 'all'\n const entries = getReactUsageEntries(graph, filter)\n const roots =\n entries.length > 0\n ? entries.map((entry) =>\n serializeReactUsageNode(entry.target, graph, filter, new Set()),\n )\n : getReactUsageRoots(graph, filter).map((rootId) =>\n serializeReactUsageNode(rootId, graph, filter, new Set()),\n )\n\n return {\n kind: 'react-usage',\n entries: entries.map((entry) =>\n serializeReactUsageEntry(entry, graph, filter),\n ),\n roots,\n }\n}\n\nfunction serializeReactUsageNode(\n nodeId: string,\n graph: ReactUsageGraph,\n filter: ReactUsageFilter,\n visited: Set<string>,\n): SerializedReactUsageNode {\n const node = graph.nodes.get(nodeId)\n if (node === undefined) {\n return {\n id: nodeId,\n name: nodeId,\n symbolKind: 'circular',\n filePath: '',\n exportNames: [],\n usages: [],\n }\n }\n\n if (visited.has(nodeId)) {\n return {\n id: node.id,\n name: node.name,\n symbolKind: 'circular',\n filePath: formatReactNodeFilePath(node.filePath, node.kind, graph.cwd),\n exportNames: node.exportNames,\n usages: [],\n }\n }\n\n const nextVisited = new Set(visited)\n nextVisited.add(nodeId)\n\n return {\n id: node.id,\n name: node.name,\n symbolKind: node.kind,\n filePath: formatReactNodeFilePath(node.filePath, node.kind, graph.cwd),\n exportNames: node.exportNames,\n usages: getFilteredUsages(node, graph, filter).map((usage) => ({\n kind: usage.kind,\n targetId: usage.target,\n referenceName: usage.referenceName,\n node: serializeReactUsageNode(usage.target, graph, filter, nextVisited),\n })),\n }\n}\n\nfunction serializeReactUsageEntry(\n entry: ReactUsageEntry,\n graph: ReactUsageGraph,\n filter: ReactUsageFilter,\n): SerializedReactUsageEntry {\n return {\n targetId: entry.target,\n referenceName: entry.referenceName,\n filePath: toDisplayPath(entry.location.filePath, graph.cwd),\n line: entry.location.line,\n column: entry.location.column,\n node: serializeReactUsageNode(entry.target, graph, filter, new Set()),\n }\n}\n\nfunction formatReactNodeFilePath(\n filePath: string,\n kind: import('../../types/react-symbol-kind.js').ReactSymbolKind,\n cwd: string,\n): string {\n return kind === 'builtin' ? 'html' : toDisplayPath(filePath, cwd)\n}\n"],"mappings":"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"}