foresthouse 1.0.0-dev.12 → 1.0.0-dev.14
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.
- package/README.md +2 -1
- package/dist/cli.mjs +11 -4
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{react-B_mdmJKQ.mjs → react-qiCwZtzi.mjs} +97 -25
- package/dist/react-qiCwZtzi.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/react-B_mdmJKQ.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -67,7 +67,8 @@ src/main.ts
|
|
|
67
67
|
- `foresthouse react <path>`: print a React usage tree from an entry file
|
|
68
68
|
- `--cwd <path>`: working directory for resolving the entry file and config
|
|
69
69
|
- `--config <path>`: use a specific `tsconfig.json` or `jsconfig.json`
|
|
70
|
-
- `--filter <component|hook>`: limit the output to a specific React symbol kind
|
|
70
|
+
- `--filter <component|hook|builtin>`: limit the output to a specific React symbol kind
|
|
71
|
+
- `--builtin`: include built-in HTML nodes such as `button` and `div`
|
|
71
72
|
- `--no-workspaces`: stop at sibling workspace package boundaries instead of expanding them
|
|
72
73
|
- `--project-only`: restrict traversal to the active `tsconfig.json` or `jsconfig.json` project
|
|
73
74
|
- `--json`: print a JSON tree instead of ASCII output
|
package/dist/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { c as analyzeReactUsage, i as printDependencyTree, l as analyzeDependencies, n as graphToSerializableTree, r as printReactUsageTree, t as graphToSerializableReactTree } from "./react-
|
|
2
|
+
import { c as analyzeReactUsage, i as printDependencyTree, l as analyzeDependencies, n as graphToSerializableTree, r as printReactUsageTree, t as graphToSerializableReactTree } from "./react-qiCwZtzi.mjs";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
4
|
import process$1 from "node:process";
|
|
5
5
|
import { cac } from "cac";
|
|
@@ -60,6 +60,12 @@ var ReactCommand = class extends BaseCommand {
|
|
|
60
60
|
filter: this.getFilter()
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
|
+
getAnalyzeOptions() {
|
|
64
|
+
return {
|
|
65
|
+
...super.getAnalyzeOptions(),
|
|
66
|
+
includeBuiltins: this.options.includeBuiltins
|
|
67
|
+
};
|
|
68
|
+
}
|
|
63
69
|
getFilter() {
|
|
64
70
|
return this.options.filter;
|
|
65
71
|
}
|
|
@@ -111,7 +117,7 @@ var CliMain = class {
|
|
|
111
117
|
cli.command("import [entry-file]", "Analyze an entry file and print its dependency tree.").usage("import <entry-file> [options]").option("--entry <path>", "Entry file to analyze.").option("--cwd <path>", "Working directory used for relative paths.").option("--config <path>", "Explicit tsconfig.json or jsconfig.json path.").option("--include-externals", "Include packages and Node built-ins in the tree.").option("--no-workspaces", "Do not expand sibling workspace packages into source subtrees.").option("--project-only", "Restrict traversal to the active tsconfig.json or jsconfig.json project.").option("--no-unused", "Omit imports that are never referenced.").option("--json", "Print the dependency tree as JSON.").action((entryFile, rawOptions) => {
|
|
112
118
|
runCli(normalizeImportCliOptions(entryFile, rawOptions));
|
|
113
119
|
});
|
|
114
|
-
cli.command("react <entry-file>", "Analyze React usage from an entry file.").usage("react <entry-file> [options]").option("--cwd <path>", "Working directory used for relative paths.").option("--config <path>", "Explicit tsconfig.json or jsconfig.json path.").option("--filter <mode>", "Limit output to `component` or `
|
|
120
|
+
cli.command("react <entry-file>", "Analyze React usage from an entry file.").usage("react <entry-file> [options]").option("--cwd <path>", "Working directory used for relative paths.").option("--config <path>", "Explicit tsconfig.json or jsconfig.json path.").option("--filter <mode>", "Limit output to `component`, `hook`, or `builtin` usages.").option("--builtin", "Include built-in HTML nodes in the React tree.").option("--no-workspaces", "Do not expand sibling workspace packages into source subtrees.").option("--project-only", "Restrict traversal to the active tsconfig.json or jsconfig.json project.").option("--json", "Print the React usage tree as JSON.").action((entryFile, rawOptions) => {
|
|
115
121
|
runCli(normalizeReactCliOptions(entryFile, rawOptions));
|
|
116
122
|
});
|
|
117
123
|
cli.help();
|
|
@@ -157,7 +163,8 @@ function normalizeReactCliOptions(entryFile, options) {
|
|
|
157
163
|
expandWorkspaces: options.workspaces !== false,
|
|
158
164
|
projectOnly: options.projectOnly === true,
|
|
159
165
|
json: options.json === true,
|
|
160
|
-
filter: normalizeReactFilter(options.filter)
|
|
166
|
+
filter: normalizeReactFilter(options.filter),
|
|
167
|
+
includeBuiltins: options.builtin === true
|
|
161
168
|
};
|
|
162
169
|
}
|
|
163
170
|
function resolveImportEntryFile(positionalEntryFile, optionEntryFile) {
|
|
@@ -168,7 +175,7 @@ function resolveImportEntryFile(positionalEntryFile, optionEntryFile) {
|
|
|
168
175
|
}
|
|
169
176
|
function normalizeReactFilter(filter) {
|
|
170
177
|
if (filter === void 0) return "all";
|
|
171
|
-
if (filter === "component" || filter === "hook") return filter;
|
|
178
|
+
if (filter === "component" || filter === "hook" || filter === "builtin") return filter;
|
|
172
179
|
throw new Error(`Unknown React filter: ${filter}`);
|
|
173
180
|
}
|
|
174
181
|
//#endregion
|
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":["process"],"sources":["../src/commands/base.ts","../src/commands/import.ts","../src/commands/react.ts","../src/app/run.ts","../src/app/cli.ts","../src/cli.ts"],"sourcesContent":["import type { CliOptions } from '../app/args.js'\nimport type { AnalyzeOptions } from '../types/analyze-options.js'\n\nexport abstract class BaseCommand<\n TGraph,\n TOptions extends CliOptions = CliOptions,\n> {\n constructor(protected readonly options: TOptions) {}\n\n run(): void {\n const graph = this.analyze()\n\n if (this.isJsonMode()) {\n process.stdout.write(\n `${JSON.stringify(this.serialize(graph), null, 2)}\\n`,\n )\n return\n }\n\n process.stdout.write(`${this.render(graph)}\\n`)\n }\n\n protected isJsonMode(): boolean {\n return this.options.json\n }\n\n protected getAnalyzeOptions(): AnalyzeOptions {\n return {\n ...(this.options.cwd === undefined ? {} : { cwd: this.options.cwd }),\n ...(this.options.configPath === undefined\n ? {}\n : { configPath: this.options.configPath }),\n expandWorkspaces: this.options.expandWorkspaces,\n projectOnly: this.options.projectOnly,\n }\n }\n\n protected abstract analyze(): TGraph\n protected abstract serialize(graph: TGraph): object\n protected abstract render(graph: TGraph): string\n}\n","import { analyzeDependencies } from '../analyzers/import/index.js'\nimport type { ImportCliOptions } from '../app/args.js'\nimport { printDependencyTree } from '../output/ascii/import.js'\nimport { graphToSerializableTree } from '../output/json/import.js'\nimport type { DependencyGraph } from '../types/dependency-graph.js'\nimport { BaseCommand } from './base.js'\n\nexport class ImportCommand extends BaseCommand<\n DependencyGraph,\n ImportCliOptions\n> {\n protected analyze(): DependencyGraph {\n return analyzeDependencies(this.options.entryFile, this.getAnalyzeOptions())\n }\n\n protected serialize(graph: DependencyGraph): object {\n return graphToSerializableTree(graph, {\n omitUnused: this.options.omitUnused,\n })\n }\n\n protected render(graph: DependencyGraph): string {\n return printDependencyTree(graph, {\n cwd: this.options.cwd ?? graph.cwd,\n includeExternals: this.options.includeExternals,\n omitUnused: this.options.omitUnused,\n })\n }\n}\n","import { analyzeReactUsage } from '../analyzers/react/index.js'\nimport type { ReactCliOptions } from '../app/args.js'\nimport { printReactUsageTree } from '../output/ascii/react.js'\nimport { graphToSerializableReactTree } from '../output/json/react.js'\nimport type { ReactUsageFilter } from '../types/react-usage-filter.js'\nimport type { ReactUsageGraph } from '../types/react-usage-graph.js'\nimport { BaseCommand } from './base.js'\n\nexport class ReactCommand extends BaseCommand<\n ReactUsageGraph,\n ReactCliOptions\n> {\n protected analyze(): ReactUsageGraph {\n return analyzeReactUsage(this.options.entryFile, this.getAnalyzeOptions())\n }\n\n protected serialize(graph: ReactUsageGraph): object {\n return graphToSerializableReactTree(graph, {\n filter: this.getFilter(),\n })\n }\n\n protected render(graph: ReactUsageGraph): string {\n return printReactUsageTree(graph, {\n cwd: this.options.cwd ?? graph.cwd,\n filter: this.getFilter(),\n })\n }\n\n private getFilter(): ReactUsageFilter {\n return this.options.filter\n }\n}\n","import { ImportCommand } from '../commands/import.js'\nimport { ReactCommand } from '../commands/react.js'\nimport type { CliOptions } from './args.js'\n\nexport function runCli(options: CliOptions): void {\n new CliApplication(options).run()\n}\n\nclass CliApplication {\n constructor(private readonly options: CliOptions) {}\n\n run(): void {\n this.createCommand().run()\n }\n\n private createCommand(): {\n run(): void\n } {\n if (this.options.command === 'react') {\n return new ReactCommand(this.options)\n }\n\n return new ImportCommand(this.options)\n }\n}\n","import process from 'node:process'\n\nimport { cac } from 'cac'\n\nimport type { ReactUsageFilter } from '../types/react-usage-filter.js'\nimport type { ImportCliOptions, ReactCliOptions } from './args.js'\nimport { runCli } from './run.js'\n\nexport function main(version: string, argv = process.argv.slice(2)): void {\n new CliMain(version, argv).run()\n}\n\nclass CliMain {\n constructor(\n private readonly version: string,\n private readonly argv: string[],\n ) {}\n\n run(): void {\n try {\n const cli = this.createCli()\n\n if (this.argv.length === 0) {\n cli.outputHelp()\n return\n }\n\n this.validateCommandSyntax()\n cli.parse(this.toProcessArgv())\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error occurred.'\n process.stderr.write(`foresthouse: ${message}\\n`)\n process.exitCode = 1\n }\n }\n\n private createCli() {\n const cli = cac('foresthouse')\n\n cli\n .command(\n 'import [entry-file]',\n 'Analyze an entry file and print its dependency tree.',\n )\n .usage('import <entry-file> [options]')\n .option('--entry <path>', 'Entry file to analyze.')\n .option('--cwd <path>', 'Working directory used for relative paths.')\n .option(\n '--config <path>',\n 'Explicit tsconfig.json or jsconfig.json path.',\n )\n .option(\n '--include-externals',\n 'Include packages and Node built-ins in the tree.',\n )\n .option(\n '--no-workspaces',\n 'Do not expand sibling workspace packages into source subtrees.',\n )\n .option(\n '--project-only',\n 'Restrict traversal to the active tsconfig.json or jsconfig.json project.',\n )\n .option('--no-unused', 'Omit imports that are never referenced.')\n .option('--json', 'Print the dependency tree as JSON.')\n .action(\n (entryFile: string | undefined, rawOptions: ParsedImportCliOptions) => {\n runCli(normalizeImportCliOptions(entryFile, rawOptions))\n },\n )\n\n cli\n .command('react <entry-file>', 'Analyze React usage from an entry file.')\n .usage('react <entry-file> [options]')\n .option('--cwd <path>', 'Working directory used for relative paths.')\n .option(\n '--config <path>',\n 'Explicit tsconfig.json or jsconfig.json path.',\n )\n .option(\n '--filter <mode>',\n 'Limit output to `component` or `hook` usages.',\n )\n .option(\n '--no-workspaces',\n 'Do not expand sibling workspace packages into source subtrees.',\n )\n .option(\n '--project-only',\n 'Restrict traversal to the active tsconfig.json or jsconfig.json project.',\n )\n .option('--json', 'Print the React usage tree as JSON.')\n .action((entryFile: string, rawOptions: ParsedReactCliOptions) => {\n runCli(normalizeReactCliOptions(entryFile, rawOptions))\n })\n\n cli.help()\n cli.version(this.version)\n\n return cli\n }\n\n private validateCommandSyntax(): void {\n if (this.argv.length === 0) {\n return\n }\n\n const firstArgument = this.argv[0]\n\n if (firstArgument === undefined) {\n return\n }\n\n if (firstArgument === '--react' || firstArgument.startsWith('--react=')) {\n throw new Error('Unknown option `--react`')\n }\n\n if (firstArgument.startsWith('-')) {\n return\n }\n\n if (firstArgument === 'import' || firstArgument === 'react') {\n return\n }\n\n throw new Error(`Unknown command \\`${firstArgument}\\``)\n }\n\n private toProcessArgv(): string[] {\n return ['node', 'foresthouse', ...this.argv]\n }\n}\n\ninterface ParsedBaseCliOptions {\n readonly cwd?: string\n readonly config?: string\n readonly workspaces?: boolean\n readonly projectOnly?: boolean\n readonly json?: boolean\n}\n\ninterface ParsedImportCliOptions extends ParsedBaseCliOptions {\n readonly entry?: string\n readonly includeExternals?: boolean\n readonly unused?: boolean\n}\n\ninterface ParsedReactCliOptions extends ParsedBaseCliOptions {\n readonly filter?: string\n}\n\nfunction normalizeImportCliOptions(\n entryFile: string | undefined,\n options: ParsedImportCliOptions,\n): ImportCliOptions {\n return {\n command: 'import',\n entryFile: resolveImportEntryFile(entryFile, options.entry),\n cwd: options.cwd,\n configPath: options.config,\n expandWorkspaces: options.workspaces !== false,\n projectOnly: options.projectOnly === true,\n includeExternals: options.includeExternals === true,\n omitUnused: options.unused === false,\n json: options.json === true,\n }\n}\n\nfunction normalizeReactCliOptions(\n entryFile: string,\n options: ParsedReactCliOptions,\n): ReactCliOptions {\n return {\n command: 'react',\n entryFile,\n cwd: options.cwd,\n configPath: options.config,\n expandWorkspaces: options.workspaces !== false,\n projectOnly: options.projectOnly === true,\n json: options.json === true,\n filter: normalizeReactFilter(options.filter),\n }\n}\n\nfunction resolveImportEntryFile(\n positionalEntryFile: string | undefined,\n optionEntryFile: string | undefined,\n): string {\n if (\n positionalEntryFile !== undefined &&\n optionEntryFile !== undefined &&\n positionalEntryFile !== optionEntryFile\n ) {\n throw new Error(\n 'Provide the import entry only once, either as `foresthouse import <entry-file>` or `foresthouse import --entry <path>`.',\n )\n }\n\n const resolvedEntryFile = positionalEntryFile ?? optionEntryFile\n\n if (resolvedEntryFile === undefined) {\n throw new Error(\n 'Missing import entry file. Use `foresthouse import <entry-file>` or `foresthouse import --entry <path>`.',\n )\n }\n\n return resolvedEntryFile\n}\n\nfunction normalizeReactFilter(\n filter: ParsedReactCliOptions['filter'],\n): ReactUsageFilter {\n if (filter === undefined) {\n return 'all'\n }\n\n if (filter === 'component' || filter === 'hook') {\n return filter\n }\n\n throw new Error(`Unknown React filter: ${filter}`)\n}\n","#!/usr/bin/env node\n\nimport { createRequire } from 'node:module'\n\nimport { main } from './app/cli.js'\n\nconst require = createRequire(import.meta.url)\nconst { version } = require('../package.json') as { version: string }\n\nmain(version)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":["process"],"sources":["../src/commands/base.ts","../src/commands/import.ts","../src/commands/react.ts","../src/app/run.ts","../src/app/cli.ts","../src/cli.ts"],"sourcesContent":["import type { CliOptions } from '../app/args.js'\nimport type { AnalyzeOptions } from '../types/analyze-options.js'\n\nexport abstract class BaseCommand<\n TGraph,\n TOptions extends CliOptions = CliOptions,\n> {\n constructor(protected readonly options: TOptions) {}\n\n run(): void {\n const graph = this.analyze()\n\n if (this.isJsonMode()) {\n process.stdout.write(\n `${JSON.stringify(this.serialize(graph), null, 2)}\\n`,\n )\n return\n }\n\n process.stdout.write(`${this.render(graph)}\\n`)\n }\n\n protected isJsonMode(): boolean {\n return this.options.json\n }\n\n protected getAnalyzeOptions(): AnalyzeOptions {\n return {\n ...(this.options.cwd === undefined ? {} : { cwd: this.options.cwd }),\n ...(this.options.configPath === undefined\n ? {}\n : { configPath: this.options.configPath }),\n expandWorkspaces: this.options.expandWorkspaces,\n projectOnly: this.options.projectOnly,\n }\n }\n\n protected abstract analyze(): TGraph\n protected abstract serialize(graph: TGraph): object\n protected abstract render(graph: TGraph): string\n}\n","import { analyzeDependencies } from '../analyzers/import/index.js'\nimport type { ImportCliOptions } from '../app/args.js'\nimport { printDependencyTree } from '../output/ascii/import.js'\nimport { graphToSerializableTree } from '../output/json/import.js'\nimport type { DependencyGraph } from '../types/dependency-graph.js'\nimport { BaseCommand } from './base.js'\n\nexport class ImportCommand extends BaseCommand<\n DependencyGraph,\n ImportCliOptions\n> {\n protected analyze(): DependencyGraph {\n return analyzeDependencies(this.options.entryFile, this.getAnalyzeOptions())\n }\n\n protected serialize(graph: DependencyGraph): object {\n return graphToSerializableTree(graph, {\n omitUnused: this.options.omitUnused,\n })\n }\n\n protected render(graph: DependencyGraph): string {\n return printDependencyTree(graph, {\n cwd: this.options.cwd ?? graph.cwd,\n includeExternals: this.options.includeExternals,\n omitUnused: this.options.omitUnused,\n })\n }\n}\n","import { analyzeReactUsage } from '../analyzers/react/index.js'\nimport type { ReactCliOptions } from '../app/args.js'\nimport { printReactUsageTree } from '../output/ascii/react.js'\nimport { graphToSerializableReactTree } from '../output/json/react.js'\nimport type { AnalyzeOptions } from '../types/analyze-options.js'\nimport type { ReactUsageFilter } from '../types/react-usage-filter.js'\nimport type { ReactUsageGraph } from '../types/react-usage-graph.js'\nimport { BaseCommand } from './base.js'\n\nexport class ReactCommand extends BaseCommand<\n ReactUsageGraph,\n ReactCliOptions\n> {\n protected analyze(): ReactUsageGraph {\n return analyzeReactUsage(this.options.entryFile, this.getAnalyzeOptions())\n }\n\n protected serialize(graph: ReactUsageGraph): object {\n return graphToSerializableReactTree(graph, {\n filter: this.getFilter(),\n })\n }\n\n protected render(graph: ReactUsageGraph): string {\n return printReactUsageTree(graph, {\n cwd: this.options.cwd ?? graph.cwd,\n filter: this.getFilter(),\n })\n }\n\n protected getAnalyzeOptions(): AnalyzeOptions {\n return {\n ...super.getAnalyzeOptions(),\n includeBuiltins: this.options.includeBuiltins,\n }\n }\n\n private getFilter(): ReactUsageFilter {\n return this.options.filter\n }\n}\n","import { ImportCommand } from '../commands/import.js'\nimport { ReactCommand } from '../commands/react.js'\nimport type { CliOptions } from './args.js'\n\nexport function runCli(options: CliOptions): void {\n new CliApplication(options).run()\n}\n\nclass CliApplication {\n constructor(private readonly options: CliOptions) {}\n\n run(): void {\n this.createCommand().run()\n }\n\n private createCommand(): {\n run(): void\n } {\n if (this.options.command === 'react') {\n return new ReactCommand(this.options)\n }\n\n return new ImportCommand(this.options)\n }\n}\n","import process from 'node:process'\n\nimport { cac } from 'cac'\n\nimport type { ReactUsageFilter } from '../types/react-usage-filter.js'\nimport type { ImportCliOptions, ReactCliOptions } from './args.js'\nimport { runCli } from './run.js'\n\nexport function main(version: string, argv = process.argv.slice(2)): void {\n new CliMain(version, argv).run()\n}\n\nclass CliMain {\n constructor(\n private readonly version: string,\n private readonly argv: string[],\n ) {}\n\n run(): void {\n try {\n const cli = this.createCli()\n\n if (this.argv.length === 0) {\n cli.outputHelp()\n return\n }\n\n this.validateCommandSyntax()\n cli.parse(this.toProcessArgv())\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error occurred.'\n process.stderr.write(`foresthouse: ${message}\\n`)\n process.exitCode = 1\n }\n }\n\n private createCli() {\n const cli = cac('foresthouse')\n\n cli\n .command(\n 'import [entry-file]',\n 'Analyze an entry file and print its dependency tree.',\n )\n .usage('import <entry-file> [options]')\n .option('--entry <path>', 'Entry file to analyze.')\n .option('--cwd <path>', 'Working directory used for relative paths.')\n .option(\n '--config <path>',\n 'Explicit tsconfig.json or jsconfig.json path.',\n )\n .option(\n '--include-externals',\n 'Include packages and Node built-ins in the tree.',\n )\n .option(\n '--no-workspaces',\n 'Do not expand sibling workspace packages into source subtrees.',\n )\n .option(\n '--project-only',\n 'Restrict traversal to the active tsconfig.json or jsconfig.json project.',\n )\n .option('--no-unused', 'Omit imports that are never referenced.')\n .option('--json', 'Print the dependency tree as JSON.')\n .action(\n (entryFile: string | undefined, rawOptions: ParsedImportCliOptions) => {\n runCli(normalizeImportCliOptions(entryFile, rawOptions))\n },\n )\n\n cli\n .command('react <entry-file>', 'Analyze React usage from an entry file.')\n .usage('react <entry-file> [options]')\n .option('--cwd <path>', 'Working directory used for relative paths.')\n .option(\n '--config <path>',\n 'Explicit tsconfig.json or jsconfig.json path.',\n )\n .option(\n '--filter <mode>',\n 'Limit output to `component`, `hook`, or `builtin` usages.',\n )\n .option('--builtin', 'Include built-in HTML nodes in the React tree.')\n .option(\n '--no-workspaces',\n 'Do not expand sibling workspace packages into source subtrees.',\n )\n .option(\n '--project-only',\n 'Restrict traversal to the active tsconfig.json or jsconfig.json project.',\n )\n .option('--json', 'Print the React usage tree as JSON.')\n .action((entryFile: string, rawOptions: ParsedReactCliOptions) => {\n runCli(normalizeReactCliOptions(entryFile, rawOptions))\n })\n\n cli.help()\n cli.version(this.version)\n\n return cli\n }\n\n private validateCommandSyntax(): void {\n if (this.argv.length === 0) {\n return\n }\n\n const firstArgument = this.argv[0]\n\n if (firstArgument === undefined) {\n return\n }\n\n if (firstArgument === '--react' || firstArgument.startsWith('--react=')) {\n throw new Error('Unknown option `--react`')\n }\n\n if (firstArgument.startsWith('-')) {\n return\n }\n\n if (firstArgument === 'import' || firstArgument === 'react') {\n return\n }\n\n throw new Error(`Unknown command \\`${firstArgument}\\``)\n }\n\n private toProcessArgv(): string[] {\n return ['node', 'foresthouse', ...this.argv]\n }\n}\n\ninterface ParsedBaseCliOptions {\n readonly cwd?: string\n readonly config?: string\n readonly workspaces?: boolean\n readonly projectOnly?: boolean\n readonly json?: boolean\n}\n\ninterface ParsedImportCliOptions extends ParsedBaseCliOptions {\n readonly entry?: string\n readonly includeExternals?: boolean\n readonly unused?: boolean\n}\n\ninterface ParsedReactCliOptions extends ParsedBaseCliOptions {\n readonly filter?: string\n readonly builtin?: boolean\n}\n\nfunction normalizeImportCliOptions(\n entryFile: string | undefined,\n options: ParsedImportCliOptions,\n): ImportCliOptions {\n return {\n command: 'import',\n entryFile: resolveImportEntryFile(entryFile, options.entry),\n cwd: options.cwd,\n configPath: options.config,\n expandWorkspaces: options.workspaces !== false,\n projectOnly: options.projectOnly === true,\n includeExternals: options.includeExternals === true,\n omitUnused: options.unused === false,\n json: options.json === true,\n }\n}\n\nfunction normalizeReactCliOptions(\n entryFile: string,\n options: ParsedReactCliOptions,\n): ReactCliOptions {\n return {\n command: 'react',\n entryFile,\n cwd: options.cwd,\n configPath: options.config,\n expandWorkspaces: options.workspaces !== false,\n projectOnly: options.projectOnly === true,\n json: options.json === true,\n filter: normalizeReactFilter(options.filter),\n includeBuiltins: options.builtin === true,\n }\n}\n\nfunction resolveImportEntryFile(\n positionalEntryFile: string | undefined,\n optionEntryFile: string | undefined,\n): string {\n if (\n positionalEntryFile !== undefined &&\n optionEntryFile !== undefined &&\n positionalEntryFile !== optionEntryFile\n ) {\n throw new Error(\n 'Provide the import entry only once, either as `foresthouse import <entry-file>` or `foresthouse import --entry <path>`.',\n )\n }\n\n const resolvedEntryFile = positionalEntryFile ?? optionEntryFile\n\n if (resolvedEntryFile === undefined) {\n throw new Error(\n 'Missing import entry file. Use `foresthouse import <entry-file>` or `foresthouse import --entry <path>`.',\n )\n }\n\n return resolvedEntryFile\n}\n\nfunction normalizeReactFilter(\n filter: ParsedReactCliOptions['filter'],\n): ReactUsageFilter {\n if (filter === undefined) {\n return 'all'\n }\n\n if (filter === 'component' || filter === 'hook' || filter === 'builtin') {\n return filter\n }\n\n throw new Error(`Unknown React filter: ${filter}`)\n}\n","#!/usr/bin/env node\n\nimport { createRequire } from 'node:module'\n\nimport { main } from './app/cli.js'\n\nconst require = createRequire(import.meta.url)\nconst { version } = require('../package.json') as { version: string }\n\nmain(version)\n"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -4,6 +4,7 @@ interface AnalyzeOptions {
|
|
|
4
4
|
readonly configPath?: string;
|
|
5
5
|
readonly expandWorkspaces?: boolean;
|
|
6
6
|
readonly projectOnly?: boolean;
|
|
7
|
+
readonly includeBuiltins?: boolean;
|
|
7
8
|
}
|
|
8
9
|
//#endregion
|
|
9
10
|
//#region src/types/dependency-kind.d.ts
|
|
@@ -55,7 +56,7 @@ interface ReactUsageEntry {
|
|
|
55
56
|
}
|
|
56
57
|
//#endregion
|
|
57
58
|
//#region src/types/react-symbol-kind.d.ts
|
|
58
|
-
type ReactSymbolKind = 'component' | 'hook';
|
|
59
|
+
type ReactSymbolKind = 'component' | 'hook' | 'builtin';
|
|
59
60
|
//#endregion
|
|
60
61
|
//#region src/types/react-usage-edge-kind.d.ts
|
|
61
62
|
type ReactUsageEdgeKind = 'render' | 'hook-call';
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/analyze-options.ts","../src/types/dependency-kind.ts","../src/types/reference-kind.ts","../src/types/dependency-edge.ts","../src/types/source-module-node.ts","../src/types/dependency-graph.ts","../src/analyzers/import/index.ts","../src/types/react-usage-location.ts","../src/types/react-usage-entry.ts","../src/types/react-symbol-kind.ts","../src/types/react-usage-edge-kind.ts","../src/types/react-usage-edge.ts","../src/types/react-usage-node.ts","../src/types/react-usage-graph.ts","../src/analyzers/react/index.ts","../src/types/react-usage-filter.ts","../src/analyzers/react/queries.ts","../src/types/color-mode.ts","../src/types/print-tree-options.ts","../src/output/ascii/import.ts","../src/types/print-react-tree-options.ts","../src/output/ascii/react.ts","../src/output/json/import.ts","../src/output/json/react.ts"],"mappings":";UAAiB,cAAA;EAAA,SACN,GAAA;EAAA,SACA,UAAA;EAAA,SACA,gBAAA;EAAA,SACA,WAAA;AAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/analyze-options.ts","../src/types/dependency-kind.ts","../src/types/reference-kind.ts","../src/types/dependency-edge.ts","../src/types/source-module-node.ts","../src/types/dependency-graph.ts","../src/analyzers/import/index.ts","../src/types/react-usage-location.ts","../src/types/react-usage-entry.ts","../src/types/react-symbol-kind.ts","../src/types/react-usage-edge-kind.ts","../src/types/react-usage-edge.ts","../src/types/react-usage-node.ts","../src/types/react-usage-graph.ts","../src/analyzers/react/index.ts","../src/types/react-usage-filter.ts","../src/analyzers/react/queries.ts","../src/types/color-mode.ts","../src/types/print-tree-options.ts","../src/output/ascii/import.ts","../src/types/print-react-tree-options.ts","../src/output/ascii/react.ts","../src/output/json/import.ts","../src/output/json/react.ts"],"mappings":";UAAiB,cAAA;EAAA,SACN,GAAA;EAAA,SACA,UAAA;EAAA,SACA,gBAAA;EAAA,SACA,WAAA;EAAA,SACA,eAAA;AAAA;;;KCLC,cAAA;;;KCAA,aAAA;;;UCGK,cAAA;EAAA,SACN,SAAA;EAAA,SACA,aAAA,EAAe,aAAA;EAAA,SACf,UAAA;EAAA,SACA,MAAA;EAAA,SACA,IAAA,EAAM,cAAA;EAAA,SACN,MAAA;EAAA,SACA,QAAA;AAAA;;;UCRM,gBAAA;EAAA,SACN,EAAA;EAAA,SACA,YAAA,WAAuB,cAAA;AAAA;;;UCFjB,eAAA;EAAA,SACN,GAAA;EAAA,SACA,OAAA;EAAA,SACA,KAAA,EAAO,WAAA,SAAoB,gBAAA;EAAA,SAC3B,UAAA;AAAA;;;iBCGK,mBAAA,CACd,SAAA,UACA,OAAA,GAAS,cAAA,GACR,eAAA;;;UCZc,kBAAA;EAAA,SACN,QAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA;AAAA;;;UCDM,eAAA;EAAA,SACN,MAAA;EAAA,SACA,aAAA;EAAA,SACA,QAAA,EAAU,kBAAA;AAAA;;;KCLT,eAAA;;;KCAA,kBAAA;;;UCEK,cAAA;EAAA,SACN,IAAA,EAAM,kBAAA;EAAA,SACN,MAAA;EAAA,SACA,aAAA;AAAA;;;UCFM,cAAA;EAAA,SACN,EAAA;EAAA,SACA,IAAA;EAAA,SACA,IAAA,EAAM,eAAA;EAAA,SACN,QAAA;EAAA,SACA,WAAA;EAAA,SACA,MAAA,WAAiB,cAAA;AAAA;;;UCNX,eAAA;EAAA,SACN,GAAA;EAAA,SACA,OAAA;EAAA,SACA,KAAA,EAAO,WAAA,SAAoB,cAAA;EAAA,SAC3B,OAAA,WAAkB,eAAA;AAAA;;;iBCgBb,iBAAA,CACd,SAAA,UACA,OAAA,GAAS,cAAA,GACR,eAAA;;;KCxBS,gBAAA,WAA2B,eAAA;;;iBCKvB,oBAAA,CACd,KAAA,EAAO,eAAA,EACP,MAAA,GAAQ,gBAAA,GACP,eAAA;AAAA,iBAOa,kBAAA,CACd,KAAA,EAAO,eAAA,EACP,MAAA,GAAQ,gBAAA;AAAA,iBAsCM,iBAAA,CACd,IAAA,EAAM,cAAA,EACN,KAAA,EAAO,eAAA,EACP,MAAA,GAAQ,gBAAA,GACP,cAAA;;;KC7DS,SAAA;;;UCEK,gBAAA;EAAA,SACN,GAAA;EAAA,SACA,gBAAA;EAAA,SACA,UAAA;EAAA,SACA,KAAA,GAAQ,SAAA;AAAA;;;iBCAH,mBAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA,GAAS,gBAAA;;;UCLM,qBAAA;EAAA,SACN,GAAA;EAAA,SACA,MAAA,GAAS,gBAAA;EAAA,SACT,KAAA,GAAQ,SAAA;AAAA;;;iBCaH,mBAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA,GAAS,qBAAA;;;iBCjBK,uBAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA;EAAA,SACW,UAAA;AAAA;;;iBC8BG,4BAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA;EAAA,SACW,MAAA,GAAS,gBAAA;AAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as getFilteredUsages, c as analyzeReactUsage, i as printDependencyTree, l as analyzeDependencies, n as graphToSerializableTree, o as getReactUsageEntries, r as printReactUsageTree, s as getReactUsageRoots, t as graphToSerializableReactTree } from "./react-
|
|
1
|
+
import { a as getFilteredUsages, c as analyzeReactUsage, i as printDependencyTree, l as analyzeDependencies, n as graphToSerializableTree, o as getReactUsageEntries, r as printReactUsageTree, s as getReactUsageRoots, t as graphToSerializableReactTree } from "./react-qiCwZtzi.mjs";
|
|
2
2
|
export { analyzeDependencies, analyzeReactUsage, getFilteredUsages, getReactUsageEntries, getReactUsageRoots, graphToSerializableReactTree, graphToSerializableTree, printDependencyTree, printReactUsageTree };
|
|
@@ -25,10 +25,12 @@ function loadCompilerOptions(searchFrom, explicitConfigPath) {
|
|
|
25
25
|
function findNearestConfig(searchFrom) {
|
|
26
26
|
let currentDirectory = path.resolve(searchFrom);
|
|
27
27
|
while (true) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
if (!isInsideNodeModules$1(currentDirectory)) {
|
|
29
|
+
const tsconfigPath = path.join(currentDirectory, "tsconfig.json");
|
|
30
|
+
if (ts.sys.fileExists(tsconfigPath)) return tsconfigPath;
|
|
31
|
+
const jsconfigPath = path.join(currentDirectory, "jsconfig.json");
|
|
32
|
+
if (ts.sys.fileExists(jsconfigPath)) return jsconfigPath;
|
|
33
|
+
}
|
|
32
34
|
const parentDirectory = path.dirname(currentDirectory);
|
|
33
35
|
if (parentDirectory === currentDirectory) return;
|
|
34
36
|
currentDirectory = parentDirectory;
|
|
@@ -48,6 +50,9 @@ function defaultCompilerOptions() {
|
|
|
48
50
|
function formatDiagnostic(diagnostic) {
|
|
49
51
|
return ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
|
|
50
52
|
}
|
|
53
|
+
function isInsideNodeModules$1(filePath) {
|
|
54
|
+
return filePath.includes(`${path.sep}node_modules${path.sep}`);
|
|
55
|
+
}
|
|
51
56
|
//#endregion
|
|
52
57
|
//#region src/analyzers/base.ts
|
|
53
58
|
var BaseAnalyzer = class {
|
|
@@ -612,6 +617,10 @@ function getComponentReferenceName(node) {
|
|
|
612
617
|
const name = getJsxName(node.openingElement.name);
|
|
613
618
|
return name !== void 0 && isComponentName(name) ? name : void 0;
|
|
614
619
|
}
|
|
620
|
+
function getBuiltinReferenceName(node) {
|
|
621
|
+
const name = getJsxName(node.openingElement.name);
|
|
622
|
+
return name !== void 0 && isIntrinsicElementName(name) ? name : void 0;
|
|
623
|
+
}
|
|
615
624
|
function getHookReferenceName(node) {
|
|
616
625
|
const calleeName = getIdentifierName(node.callee);
|
|
617
626
|
return calleeName !== void 0 && isHookName(calleeName) ? calleeName : void 0;
|
|
@@ -628,6 +637,9 @@ function isHookName(name) {
|
|
|
628
637
|
function isComponentName(name) {
|
|
629
638
|
return /^[A-Z]/.test(name);
|
|
630
639
|
}
|
|
640
|
+
function isIntrinsicElementName(name) {
|
|
641
|
+
return /^[a-z]/.test(name);
|
|
642
|
+
}
|
|
631
643
|
function returnsReactElement(declaration) {
|
|
632
644
|
if (declaration.type === "ArrowFunctionExpression" && declaration.expression) return containsReactElementLikeExpression(declaration.body);
|
|
633
645
|
const body = declaration.body;
|
|
@@ -663,17 +675,17 @@ function unwrapExpression(expression) {
|
|
|
663
675
|
}
|
|
664
676
|
//#endregion
|
|
665
677
|
//#region src/analyzers/react/entries.ts
|
|
666
|
-
function collectEntryUsages(program, filePath, sourceText) {
|
|
678
|
+
function collectEntryUsages(program, filePath, sourceText, includeBuiltins) {
|
|
667
679
|
const entries = /* @__PURE__ */ new Map();
|
|
668
680
|
program.body.forEach((statement) => {
|
|
669
|
-
collectStatementEntryUsages(statement, filePath, sourceText, entries);
|
|
681
|
+
collectStatementEntryUsages(statement, filePath, sourceText, entries, includeBuiltins);
|
|
670
682
|
});
|
|
671
683
|
return [...entries.values()].sort(comparePendingReactUsageEntries);
|
|
672
684
|
}
|
|
673
|
-
function collectStatementEntryUsages(statement, filePath, sourceText, entries) {
|
|
674
|
-
collectNodeEntryUsages(statement, filePath, sourceText, entries, false);
|
|
685
|
+
function collectStatementEntryUsages(statement, filePath, sourceText, entries, includeBuiltins) {
|
|
686
|
+
collectNodeEntryUsages(statement, filePath, sourceText, entries, includeBuiltins, false);
|
|
675
687
|
}
|
|
676
|
-
function collectNodeEntryUsages(node, filePath, sourceText, entries, hasComponentAncestor) {
|
|
688
|
+
function collectNodeEntryUsages(node, filePath, sourceText, entries, includeBuiltins, hasComponentAncestor) {
|
|
677
689
|
if (FUNCTION_NODE_TYPES.has(node.type)) return;
|
|
678
690
|
let nextHasComponentAncestor = hasComponentAncestor;
|
|
679
691
|
if (node.type === "JSXElement") {
|
|
@@ -681,6 +693,12 @@ function collectNodeEntryUsages(node, filePath, sourceText, entries, hasComponen
|
|
|
681
693
|
if (referenceName !== void 0) {
|
|
682
694
|
if (!hasComponentAncestor) addPendingReactUsageEntry(entries, referenceName, "component", createReactUsageLocation(filePath, sourceText, node.start));
|
|
683
695
|
nextHasComponentAncestor = true;
|
|
696
|
+
} else if (includeBuiltins) {
|
|
697
|
+
const builtinName = getBuiltinReferenceName(node);
|
|
698
|
+
if (builtinName !== void 0) {
|
|
699
|
+
if (!hasComponentAncestor) addPendingReactUsageEntry(entries, builtinName, "builtin", createReactUsageLocation(filePath, sourceText, node.start));
|
|
700
|
+
nextHasComponentAncestor = true;
|
|
701
|
+
}
|
|
684
702
|
}
|
|
685
703
|
} else if (node.type === "CallExpression") {
|
|
686
704
|
const hookReference = getHookReferenceName(node);
|
|
@@ -695,18 +713,18 @@ function collectNodeEntryUsages(node, filePath, sourceText, entries, hasComponen
|
|
|
695
713
|
if (keys === void 0) return;
|
|
696
714
|
keys.forEach((key) => {
|
|
697
715
|
const value = node[key];
|
|
698
|
-
collectEntryUsageChild(value, filePath, sourceText, entries, nextHasComponentAncestor);
|
|
716
|
+
collectEntryUsageChild(value, filePath, sourceText, entries, includeBuiltins, nextHasComponentAncestor);
|
|
699
717
|
});
|
|
700
718
|
}
|
|
701
|
-
function collectEntryUsageChild(value, filePath, sourceText, entries, hasComponentAncestor) {
|
|
719
|
+
function collectEntryUsageChild(value, filePath, sourceText, entries, includeBuiltins, hasComponentAncestor) {
|
|
702
720
|
if (Array.isArray(value)) {
|
|
703
721
|
value.forEach((entry) => {
|
|
704
|
-
collectEntryUsageChild(entry, filePath, sourceText, entries, hasComponentAncestor);
|
|
722
|
+
collectEntryUsageChild(entry, filePath, sourceText, entries, includeBuiltins, hasComponentAncestor);
|
|
705
723
|
});
|
|
706
724
|
return;
|
|
707
725
|
}
|
|
708
726
|
if (!isNode(value)) return;
|
|
709
|
-
collectNodeEntryUsages(value, filePath, sourceText, entries, hasComponentAncestor);
|
|
727
|
+
collectNodeEntryUsages(value, filePath, sourceText, entries, includeBuiltins, hasComponentAncestor);
|
|
710
728
|
}
|
|
711
729
|
function addPendingReactUsageEntry(entries, referenceName, kind, location) {
|
|
712
730
|
const key = `${location.filePath}:${location.line}:${location.column}:${kind}:${referenceName}`;
|
|
@@ -795,18 +813,23 @@ function createPendingSymbol(filePath, name, kind, declaration) {
|
|
|
795
813
|
declaration,
|
|
796
814
|
exportNames: /* @__PURE__ */ new Set(),
|
|
797
815
|
componentReferences: /* @__PURE__ */ new Set(),
|
|
798
|
-
hookReferences: /* @__PURE__ */ new Set()
|
|
816
|
+
hookReferences: /* @__PURE__ */ new Set(),
|
|
817
|
+
builtinReferences: /* @__PURE__ */ new Set()
|
|
799
818
|
};
|
|
800
819
|
}
|
|
801
820
|
//#endregion
|
|
802
821
|
//#region src/analyzers/react/usage.ts
|
|
803
|
-
function analyzeSymbolUsages(symbol) {
|
|
822
|
+
function analyzeSymbolUsages(symbol, includeBuiltins) {
|
|
804
823
|
const root = symbol.declaration.type === "ArrowFunctionExpression" ? symbol.declaration.body : symbol.declaration.body;
|
|
805
824
|
if (root === null) return;
|
|
806
825
|
walkReactUsageTree(root, (node) => {
|
|
807
826
|
if (node.type === "JSXElement") {
|
|
808
827
|
const name = getComponentReferenceName(node);
|
|
809
828
|
if (name !== void 0) symbol.componentReferences.add(name);
|
|
829
|
+
if (includeBuiltins) {
|
|
830
|
+
const builtinName = getBuiltinReferenceName(node);
|
|
831
|
+
if (builtinName !== void 0) symbol.builtinReferences.add(builtinName);
|
|
832
|
+
}
|
|
810
833
|
return;
|
|
811
834
|
}
|
|
812
835
|
if (node.type === "CallExpression") {
|
|
@@ -819,7 +842,7 @@ function analyzeSymbolUsages(symbol) {
|
|
|
819
842
|
}
|
|
820
843
|
//#endregion
|
|
821
844
|
//#region src/analyzers/react/file.ts
|
|
822
|
-
function analyzeReactFile(program, filePath, sourceText, includeNestedRenderEntries, sourceDependencies) {
|
|
845
|
+
function analyzeReactFile(program, filePath, sourceText, includeNestedRenderEntries, sourceDependencies, includeBuiltins) {
|
|
823
846
|
const symbolsByName = /* @__PURE__ */ new Map();
|
|
824
847
|
program.body.forEach((statement) => {
|
|
825
848
|
collectTopLevelReactSymbols(statement, filePath, symbolsByName);
|
|
@@ -828,12 +851,12 @@ function analyzeReactFile(program, filePath, sourceText, includeNestedRenderEntr
|
|
|
828
851
|
const exportsByName = /* @__PURE__ */ new Map();
|
|
829
852
|
const reExportBindingsByName = /* @__PURE__ */ new Map();
|
|
830
853
|
const exportAllBindings = [];
|
|
831
|
-
const directEntryUsages = includeNestedRenderEntries ? collectEntryUsages(program, filePath, sourceText) : [];
|
|
854
|
+
const directEntryUsages = includeNestedRenderEntries ? collectEntryUsages(program, filePath, sourceText, includeBuiltins) : [];
|
|
832
855
|
program.body.forEach((statement) => {
|
|
833
856
|
collectImportsAndExports(statement, sourceDependencies, symbolsByName, importsByLocalName, exportsByName, reExportBindingsByName, exportAllBindings);
|
|
834
857
|
});
|
|
835
858
|
symbolsByName.forEach((symbol) => {
|
|
836
|
-
analyzeSymbolUsages(symbol);
|
|
859
|
+
analyzeSymbolUsages(symbol, includeBuiltins);
|
|
837
860
|
});
|
|
838
861
|
return {
|
|
839
862
|
filePath,
|
|
@@ -861,6 +884,7 @@ function collectComponentDeclarationEntryUsages(symbolsByName, sourceText) {
|
|
|
861
884
|
//#endregion
|
|
862
885
|
//#region src/analyzers/react/references.ts
|
|
863
886
|
function resolveReactReference(fileAnalysis, fileAnalyses, name, kind) {
|
|
887
|
+
if (kind === "builtin") return getBuiltinNodeId(name);
|
|
864
888
|
const localSymbol = fileAnalysis.symbolsByName.get(name);
|
|
865
889
|
if (localSymbol !== void 0 && localSymbol.kind === kind) return localSymbol.id;
|
|
866
890
|
const importBinding = fileAnalysis.importsByLocalName.get(name);
|
|
@@ -904,6 +928,21 @@ function addExternalHookNodes(fileAnalyses, nodes) {
|
|
|
904
928
|
if (!nodes.has(externalNode.id)) nodes.set(externalNode.id, externalNode);
|
|
905
929
|
});
|
|
906
930
|
}
|
|
931
|
+
function addBuiltinNodes(fileAnalyses, nodes) {
|
|
932
|
+
for (const fileAnalysis of fileAnalyses.values()) {
|
|
933
|
+
fileAnalysis.entryUsages.forEach((entry) => {
|
|
934
|
+
if (entry.kind !== "builtin") return;
|
|
935
|
+
const builtinNode = createBuiltinNode(entry.referenceName);
|
|
936
|
+
if (!nodes.has(builtinNode.id)) nodes.set(builtinNode.id, builtinNode);
|
|
937
|
+
});
|
|
938
|
+
fileAnalysis.symbolsById.forEach((symbol) => {
|
|
939
|
+
symbol.builtinReferences.forEach((name) => {
|
|
940
|
+
const builtinNode = createBuiltinNode(name);
|
|
941
|
+
if (!nodes.has(builtinNode.id)) nodes.set(builtinNode.id, builtinNode);
|
|
942
|
+
});
|
|
943
|
+
});
|
|
944
|
+
}
|
|
945
|
+
}
|
|
907
946
|
function createExternalHookNode(binding, localName) {
|
|
908
947
|
const name = getExternalHookName(binding, localName);
|
|
909
948
|
return {
|
|
@@ -915,9 +954,22 @@ function createExternalHookNode(binding, localName) {
|
|
|
915
954
|
usages: []
|
|
916
955
|
};
|
|
917
956
|
}
|
|
957
|
+
function createBuiltinNode(name) {
|
|
958
|
+
return {
|
|
959
|
+
id: getBuiltinNodeId(name),
|
|
960
|
+
name,
|
|
961
|
+
kind: "builtin",
|
|
962
|
+
filePath: "html",
|
|
963
|
+
exportNames: [],
|
|
964
|
+
usages: []
|
|
965
|
+
};
|
|
966
|
+
}
|
|
918
967
|
function getExternalHookNodeId(binding, localName) {
|
|
919
968
|
return `external:${binding.sourceSpecifier}#hook:${getExternalHookName(binding, localName)}`;
|
|
920
969
|
}
|
|
970
|
+
function getBuiltinNodeId(name) {
|
|
971
|
+
return `builtin:${name}`;
|
|
972
|
+
}
|
|
921
973
|
function getExternalHookName(binding, localName) {
|
|
922
974
|
return binding.importedName === "default" ? localName : binding.importedName;
|
|
923
975
|
}
|
|
@@ -967,7 +1019,7 @@ var ReactAnalyzer = class extends BaseAnalyzer {
|
|
|
967
1019
|
dependencyNode?.dependencies.forEach((dependency) => {
|
|
968
1020
|
if (dependency.kind === "source") sourceDependencies.set(dependency.specifier, dependency.target);
|
|
969
1021
|
});
|
|
970
|
-
fileAnalyses.set(filePath, analyzeReactFile(parseResult.program, filePath, sourceText, filePath === dependencyGraph.entryId, sourceDependencies));
|
|
1022
|
+
fileAnalyses.set(filePath, analyzeReactFile(parseResult.program, filePath, sourceText, filePath === dependencyGraph.entryId, sourceDependencies, this.options.includeBuiltins === true));
|
|
971
1023
|
}
|
|
972
1024
|
return fileAnalyses;
|
|
973
1025
|
}
|
|
@@ -982,6 +1034,7 @@ var ReactAnalyzer = class extends BaseAnalyzer {
|
|
|
982
1034
|
usages: []
|
|
983
1035
|
});
|
|
984
1036
|
addExternalHookNodes(fileAnalyses, nodes);
|
|
1037
|
+
if (this.options.includeBuiltins === true) addBuiltinNodes(fileAnalyses, nodes);
|
|
985
1038
|
return nodes;
|
|
986
1039
|
}
|
|
987
1040
|
attachUsages(fileAnalyses, nodes) {
|
|
@@ -1003,6 +1056,14 @@ var ReactAnalyzer = class extends BaseAnalyzer {
|
|
|
1003
1056
|
referenceName
|
|
1004
1057
|
});
|
|
1005
1058
|
});
|
|
1059
|
+
if (this.options.includeBuiltins === true) symbol.builtinReferences.forEach((referenceName) => {
|
|
1060
|
+
const targetId = getBuiltinNodeId(referenceName);
|
|
1061
|
+
usages.set(`render:${targetId}:${referenceName}`, {
|
|
1062
|
+
kind: "render",
|
|
1063
|
+
target: targetId,
|
|
1064
|
+
referenceName
|
|
1065
|
+
});
|
|
1066
|
+
});
|
|
1006
1067
|
const node = nodes.get(symbol.id);
|
|
1007
1068
|
if (node === void 0) continue;
|
|
1008
1069
|
const sortedUsages = [...usages.values()].sort((left, right) => compareReactNodeIds(left.target, right.target, nodes));
|
|
@@ -1071,6 +1132,7 @@ function matchesReactFilter(node, filter) {
|
|
|
1071
1132
|
const ANSI_RESET = "\x1B[0m";
|
|
1072
1133
|
const ANSI_COMPONENT = "\x1B[36m";
|
|
1073
1134
|
const ANSI_HOOK = "\x1B[35m";
|
|
1135
|
+
const ANSI_BUILTIN = "\x1B[34m";
|
|
1074
1136
|
const ANSI_MUTED = "\x1B[38;5;244m";
|
|
1075
1137
|
const ANSI_UNUSED = "\x1B[38;5;214m";
|
|
1076
1138
|
function resolveColorSupport(mode = "auto", options = {}) {
|
|
@@ -1091,7 +1153,9 @@ function formatReactSymbolLabel(name, kind, enabled) {
|
|
|
1091
1153
|
return `${getReactSymbolColor(kind)}${label}${ANSI_RESET}`;
|
|
1092
1154
|
}
|
|
1093
1155
|
function formatReactSymbolName(name, kind) {
|
|
1094
|
-
|
|
1156
|
+
if (kind === "component") return `<${name} />`;
|
|
1157
|
+
if (kind === "hook") return `${name}()`;
|
|
1158
|
+
return `<${name}>`;
|
|
1095
1159
|
}
|
|
1096
1160
|
function colorizeReactLabel(text, kind, enabled) {
|
|
1097
1161
|
if (!enabled) return text;
|
|
@@ -1102,7 +1166,9 @@ function colorizeMuted(text, enabled) {
|
|
|
1102
1166
|
return `${ANSI_MUTED}${text}${ANSI_RESET}`;
|
|
1103
1167
|
}
|
|
1104
1168
|
function getReactSymbolColor(kind) {
|
|
1105
|
-
|
|
1169
|
+
if (kind === "component") return ANSI_COMPONENT;
|
|
1170
|
+
if (kind === "hook") return ANSI_HOOK;
|
|
1171
|
+
return ANSI_BUILTIN;
|
|
1106
1172
|
}
|
|
1107
1173
|
//#endregion
|
|
1108
1174
|
//#region src/utils/to-display-path.ts
|
|
@@ -1224,11 +1290,14 @@ function renderUsage(usage, graph, cwd, filter, color, visited, prefix, isLast)
|
|
|
1224
1290
|
return childLines;
|
|
1225
1291
|
}
|
|
1226
1292
|
function formatReactNodeLabel(node, cwd, color, referenceName) {
|
|
1227
|
-
return `${referenceName !== void 0 && referenceName !== node.name ? `${colorizeReactLabel(formatReactSymbolName(node.name, node.kind), node.kind, color)} ${colorizeMuted(`as ${referenceName}`, color)} ${colorizeReactLabel(`[${node.kind}]`, node.kind, color)}` : formatReactSymbolLabel(node.name, node.kind, color)} (${
|
|
1293
|
+
return `${referenceName !== void 0 && referenceName !== node.name ? `${colorizeReactLabel(formatReactSymbolName(node.name, node.kind), node.kind, color)} ${colorizeMuted(`as ${referenceName}`, color)} ${colorizeReactLabel(`[${node.kind}]`, node.kind, color)}` : formatReactSymbolLabel(node.name, node.kind, color)} (${formatReactNodeFilePath$1(node, cwd)})`;
|
|
1228
1294
|
}
|
|
1229
1295
|
function formatReactEntryLabel(entry, cwd) {
|
|
1230
1296
|
return `${toDisplayPath(entry.location.filePath, cwd)}:${entry.location.line}:${entry.location.column}`;
|
|
1231
1297
|
}
|
|
1298
|
+
function formatReactNodeFilePath$1(node, cwd) {
|
|
1299
|
+
return node.kind === "builtin" ? "html" : toDisplayPath(node.filePath, cwd);
|
|
1300
|
+
}
|
|
1232
1301
|
//#endregion
|
|
1233
1302
|
//#region src/output/json/import.ts
|
|
1234
1303
|
function graphToSerializableTree(graph, options = {}) {
|
|
@@ -1306,7 +1375,7 @@ function serializeReactUsageNode(nodeId, graph, filter, visited) {
|
|
|
1306
1375
|
id: node.id,
|
|
1307
1376
|
name: node.name,
|
|
1308
1377
|
symbolKind: "circular",
|
|
1309
|
-
filePath:
|
|
1378
|
+
filePath: formatReactNodeFilePath(node.filePath, node.kind, graph.cwd),
|
|
1310
1379
|
exportNames: node.exportNames,
|
|
1311
1380
|
usages: []
|
|
1312
1381
|
};
|
|
@@ -1316,7 +1385,7 @@ function serializeReactUsageNode(nodeId, graph, filter, visited) {
|
|
|
1316
1385
|
id: node.id,
|
|
1317
1386
|
name: node.name,
|
|
1318
1387
|
symbolKind: node.kind,
|
|
1319
|
-
filePath:
|
|
1388
|
+
filePath: formatReactNodeFilePath(node.filePath, node.kind, graph.cwd),
|
|
1320
1389
|
exportNames: node.exportNames,
|
|
1321
1390
|
usages: getFilteredUsages(node, graph, filter).map((usage) => ({
|
|
1322
1391
|
kind: usage.kind,
|
|
@@ -1336,7 +1405,10 @@ function serializeReactUsageEntry(entry, graph, filter) {
|
|
|
1336
1405
|
node: serializeReactUsageNode(entry.target, graph, filter, /* @__PURE__ */ new Set())
|
|
1337
1406
|
};
|
|
1338
1407
|
}
|
|
1408
|
+
function formatReactNodeFilePath(filePath, kind, cwd) {
|
|
1409
|
+
return kind === "builtin" ? "html" : toDisplayPath(filePath, cwd);
|
|
1410
|
+
}
|
|
1339
1411
|
//#endregion
|
|
1340
1412
|
export { getFilteredUsages as a, analyzeReactUsage as c, printDependencyTree as i, analyzeDependencies as l, graphToSerializableTree as n, getReactUsageEntries as o, printReactUsageTree as r, getReactUsageRoots as s, graphToSerializableReactTree as t };
|
|
1341
1413
|
|
|
1342
|
-
//# sourceMappingURL=react-
|
|
1414
|
+
//# sourceMappingURL=react-qiCwZtzi.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-qiCwZtzi.mjs","names":["isInsideNodeModules","process","formatReactNodeFilePath"],"sources":["../src/typescript/config.ts","../src/analyzers/base.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/utils/to-display-path.ts","../src/output/ascii/import.ts","../src/output/ascii/react.ts","../src/output/json/import.ts","../src/output/json/react.ts"],"sourcesContent":["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 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 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} 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: ArrowFunctionExpression | import('oxc-parser').Function,\n): import('../../types/react-symbol-kind.js').ReactSymbolKind | undefined {\n if (isHookName(name)) {\n return 'hook'\n }\n\n if (isComponentName(name) && returnsReactElement(declaration)) {\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 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 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 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 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\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(filePath, name, kind, declaration),\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 if (\n declarator.init.type !== 'ArrowFunctionExpression' &&\n declarator.init.type !== 'FunctionExpression'\n ) {\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(filePath, name, kind, declarator.init),\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(filePath, name, kind, declaration.declaration),\n )\n }\n }\n}\n\nfunction createPendingSymbol(\n filePath: string,\n name: string,\n kind: ReactSymbolKind,\n declaration: OxcFunction | ArrowFunctionExpression,\n): PendingReactUsageNode {\n return {\n id: `${filePath}#${kind}:${name}`,\n name,\n kind,\n filePath,\n declarationOffset: declaration.id?.start ?? declaration.start,\n declaration,\n exportNames: new Set<string>(),\n componentReferences: new Set<string>(),\n hookReferences: new Set<string>(),\n builtinReferences: new Set<string>(),\n }\n}\n","import type { PendingReactUsageNode } from './file.js'\nimport {\n getBuiltinReferenceName,\n getComponentReferenceName,\n getCreateElementComponentReferenceName,\n getHookReferenceName,\n walkReactUsageTree,\n} from './walk.js'\n\nexport function analyzeSymbolUsages(\n symbol: PendingReactUsageNode,\n includeBuiltins: boolean,\n): void {\n const root =\n symbol.declaration.type === 'ArrowFunctionExpression'\n ? symbol.declaration.body\n : symbol.declaration.body\n\n if (root === null) {\n return\n }\n\n walkReactUsageTree(root, (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 })\n}\n","import type {\n ArrowFunctionExpression,\n Function as OxcFunction,\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 { collectTopLevelReactSymbols } 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 declaration: OxcFunction | ArrowFunctionExpression\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 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\n program.body.forEach((statement) => {\n collectTopLevelReactSymbols(statement, filePath, 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 symbolsByName,\n importsByLocalName,\n exportsByName,\n reExportBindingsByName,\n exportAllBindings,\n )\n })\n\n symbolsByName.forEach((symbol) => {\n analyzeSymbolUsages(symbol, includeBuiltins)\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 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.symbolsByName.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.symbolsById.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.symbolsById.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 { 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,\n options: AnalyzeOptions = {},\n): ReactUsageGraph {\n return new ReactAnalyzer(entryFile, options).analyze()\n}\n\nclass ReactAnalyzer extends BaseAnalyzer<ReactUsageGraph> {\n protected doAnalyze(): ReactUsageGraph {\n const dependencyGraph = analyzeDependencies(this.entryFile, this.options)\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 nodes,\n entries,\n }\n }\n\n private collectFileAnalyses(\n dependencyGraph: DependencyGraph,\n ): Map<string, import('./file.js').FileAnalysis> {\n const reachableFiles = new Set<string>([\n dependencyGraph.entryId,\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 filePath === dependencyGraph.entryId,\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.symbolsById.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.symbolsById.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","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'\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\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","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 { 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 { 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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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"react-B_mdmJKQ.mjs","names":["process"],"sources":["../src/typescript/config.ts","../src/analyzers/base.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/utils/to-display-path.ts","../src/output/ascii/import.ts","../src/output/ascii/react.ts","../src/output/json/import.ts","../src/output/json/react.ts"],"sourcesContent":["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 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 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","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 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} 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: ArrowFunctionExpression | import('oxc-parser').Function,\n): import('../../types/react-symbol-kind.js').ReactSymbolKind | undefined {\n if (isHookName(name)) {\n return 'hook'\n }\n\n if (isComponentName(name) && returnsReactElement(declaration)) {\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 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 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 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 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 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): PendingReactUsageEntry[] {\n const entries = new Map<string, PendingReactUsageEntry>()\n\n program.body.forEach((statement) => {\n collectStatementEntryUsages(statement, filePath, sourceText, entries)\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): void {\n collectNodeEntryUsages(statement, filePath, sourceText, entries, false)\n}\n\nfunction collectNodeEntryUsages(\n node: Node,\n filePath: string,\n sourceText: string,\n entries: Map<string, PendingReactUsageEntry>,\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 }\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 nextHasComponentAncestor,\n )\n })\n}\n\nfunction collectEntryUsageChild(\n value: unknown,\n filePath: string,\n sourceText: string,\n entries: Map<string, PendingReactUsageEntry>,\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 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 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 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\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(filePath, name, kind, declaration),\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 if (\n declarator.init.type !== 'ArrowFunctionExpression' &&\n declarator.init.type !== 'FunctionExpression'\n ) {\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(filePath, name, kind, declarator.init),\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(filePath, name, kind, declaration.declaration),\n )\n }\n }\n}\n\nfunction createPendingSymbol(\n filePath: string,\n name: string,\n kind: ReactSymbolKind,\n declaration: OxcFunction | ArrowFunctionExpression,\n): PendingReactUsageNode {\n return {\n id: `${filePath}#${kind}:${name}`,\n name,\n kind,\n filePath,\n declarationOffset: declaration.id?.start ?? declaration.start,\n declaration,\n exportNames: new Set<string>(),\n componentReferences: new Set<string>(),\n hookReferences: new Set<string>(),\n }\n}\n","import type { PendingReactUsageNode } from './file.js'\nimport {\n getComponentReferenceName,\n getCreateElementComponentReferenceName,\n getHookReferenceName,\n walkReactUsageTree,\n} from './walk.js'\n\nexport function analyzeSymbolUsages(symbol: PendingReactUsageNode): void {\n const root =\n symbol.declaration.type === 'ArrowFunctionExpression'\n ? symbol.declaration.body\n : symbol.declaration.body\n\n if (root === null) {\n return\n }\n\n walkReactUsageTree(root, (node) => {\n if (node.type === 'JSXElement') {\n const name = getComponentReferenceName(node)\n if (name !== undefined) {\n symbol.componentReferences.add(name)\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 })\n}\n","import type {\n ArrowFunctionExpression,\n Function as OxcFunction,\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 { collectTopLevelReactSymbols } 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 declaration: OxcFunction | ArrowFunctionExpression\n readonly exportNames: Set<string>\n readonly componentReferences: Set<string>\n readonly hookReferences: 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 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): FileAnalysis {\n const symbolsByName = new Map<string, PendingReactUsageNode>()\n\n program.body.forEach((statement) => {\n collectTopLevelReactSymbols(statement, filePath, 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)\n : []\n\n program.body.forEach((statement) => {\n collectImportsAndExports(\n statement,\n sourceDependencies,\n symbolsByName,\n importsByLocalName,\n exportsByName,\n reExportBindingsByName,\n exportAllBindings,\n )\n })\n\n symbolsByName.forEach((symbol) => {\n analyzeSymbolUsages(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 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 const localSymbol = fileAnalysis.symbolsByName.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.symbolsById.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\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 getExternalHookNodeId(\n binding: ImportBinding,\n localName: string,\n): string {\n return `external:${binding.sourceSpecifier}#hook:${getExternalHookName(binding, localName)}`\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 { 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 addExternalHookNodes,\n compareReactNodeIds,\n compareReactUsageEntries,\n resolveReactReference,\n} from './references.js'\n\nexport function analyzeReactUsage(\n entryFile: string,\n options: AnalyzeOptions = {},\n): ReactUsageGraph {\n return new ReactAnalyzer(entryFile, options).analyze()\n}\n\nclass ReactAnalyzer extends BaseAnalyzer<ReactUsageGraph> {\n protected doAnalyze(): ReactUsageGraph {\n const dependencyGraph = analyzeDependencies(this.entryFile, this.options)\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 nodes,\n entries,\n }\n }\n\n private collectFileAnalyses(\n dependencyGraph: DependencyGraph,\n ): Map<string, import('./file.js').FileAnalysis> {\n const reachableFiles = new Set<string>([\n dependencyGraph.entryId,\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 filePath === dependencyGraph.entryId,\n sourceDependencies,\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.symbolsById.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 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.symbolsById.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 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","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_MUTED = '\\u001B[38;5;244m'\nconst ANSI_UNUSED = '\\u001B[38;5;214m'\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 return kind === 'component' ? `<${name} />` : `${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\nfunction getReactSymbolColor(kind: ReactSymbolKind): string {\n return kind === 'component' ? ANSI_COMPONENT : ANSI_HOOK\n}\n","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 { 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} (${toDisplayPath(node.filePath, 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","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: toDisplayPath(node.filePath, 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: toDisplayPath(node.filePath, 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"],"mappings":"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"}
|