foresthouse 1.0.0-dev.1 → 1.0.0-dev.10

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 CHANGED
@@ -19,6 +19,7 @@
19
19
  - Resolves local imports, re-exports, `require()`, and string-literal dynamic `import()`
20
20
  - Honors the nearest `tsconfig.json` or `jsconfig.json`, including `baseUrl` and `paths`
21
21
  - Prints a tree by default, or JSON with `--json`
22
+ - Colorizes ASCII output automatically when the terminal supports ANSI colors
22
23
 
23
24
  ## Usage
24
25
 
@@ -26,13 +27,13 @@
26
27
  corepack enable
27
28
  pnpm install
28
29
  pnpm run build
29
- node dist/cli.mjs src/index.ts
30
+ node dist/cli.mjs import src/index.ts
30
31
  ```
31
32
 
32
33
  ### Example
33
34
 
34
35
  ```bash
35
- node dist/cli.mjs src/main.ts --cwd test/fixtures/basic
36
+ node dist/cli.mjs import src/main.ts --cwd test/fixtures/basic
36
37
  ```
37
38
 
38
39
  Output:
@@ -48,9 +49,22 @@ src/main.ts
48
49
 
49
50
  ### Options
50
51
 
52
+ `import` command:
53
+
54
+ - `foresthouse import <path>`: analyze an entry file by positional argument
55
+ - `foresthouse import --entry <path>`: analyze an entry file by explicit option
51
56
  - `--cwd <path>`: working directory for resolving the entry file and config
52
57
  - `--config <path>`: use a specific `tsconfig.json` or `jsconfig.json`
53
58
  - `--include-externals`: include packages and Node built-ins in the output
59
+ - `--no-unused`: omit imports that are never referenced
60
+ - `--json`: print a JSON tree instead of ASCII output
61
+
62
+ `react` command:
63
+
64
+ - `foresthouse react <path>`: print a React usage tree from an entry file
65
+ - `--cwd <path>`: working directory for resolving the entry file and config
66
+ - `--config <path>`: use a specific `tsconfig.json` or `jsconfig.json`
67
+ - `--filter <component|hook>`: limit the output to a specific React symbol kind
54
68
  - `--json`: print a JSON tree instead of ASCII output
55
69
 
56
70
  ## Development
package/dist/cli.mjs CHANGED
@@ -1,99 +1,174 @@
1
1
  #!/usr/bin/env node
2
- import { n as analyzeDependencies, r as graphToSerializableTree, t as printDependencyTree } from "./tree-BiiNljTI.mjs";
2
+ import { c as analyzeReactUsage, i as printDependencyTree, l as analyzeDependencies, n as graphToSerializableTree, r as printReactUsageTree, t as graphToSerializableReactTree } from "./react-DQxFg3iv.mjs";
3
3
  import { createRequire } from "node:module";
4
- import process from "node:process";
5
- //#region src/cli.ts
6
- const { version } = createRequire(import.meta.url)("../package.json");
7
- function main() {
8
- try {
9
- const options = parseArgs(process.argv.slice(2));
10
- const graph = analyzeDependencies(options.entryFile, {
11
- ...options.cwd === void 0 ? {} : { cwd: options.cwd },
12
- ...options.configPath === void 0 ? {} : { configPath: options.configPath }
13
- });
14
- if (options.json) {
15
- process.stdout.write(`${JSON.stringify(graphToSerializableTree(graph), null, 2)}\n`);
4
+ import process$1 from "node:process";
5
+ import { cac } from "cac";
6
+ //#region src/commands/base.ts
7
+ var BaseCommand = class {
8
+ constructor(options) {
9
+ this.options = options;
10
+ }
11
+ run() {
12
+ const graph = this.analyze();
13
+ if (this.isJsonMode()) {
14
+ process.stdout.write(`${JSON.stringify(this.serialize(graph), null, 2)}\n`);
16
15
  return;
17
16
  }
18
- process.stdout.write(`${printDependencyTree(graph, {
19
- cwd: options.cwd ?? graph.cwd,
20
- includeExternals: options.includeExternals
21
- })}\n`);
22
- } catch (error) {
23
- const message = error instanceof Error ? error.message : "Unknown error occurred.";
24
- process.stderr.write(`foresthouse: ${message}\n`);
25
- process.exitCode = 1;
17
+ process.stdout.write(`${this.render(graph)}\n`);
18
+ }
19
+ isJsonMode() {
20
+ return this.options.json;
21
+ }
22
+ getAnalyzeOptions() {
23
+ return {
24
+ ...this.options.cwd === void 0 ? {} : { cwd: this.options.cwd },
25
+ ...this.options.configPath === void 0 ? {} : { configPath: this.options.configPath }
26
+ };
27
+ }
28
+ };
29
+ //#endregion
30
+ //#region src/commands/import.ts
31
+ var ImportCommand = class extends BaseCommand {
32
+ analyze() {
33
+ return analyzeDependencies(this.options.entryFile, this.getAnalyzeOptions());
34
+ }
35
+ serialize(graph) {
36
+ return graphToSerializableTree(graph, { omitUnused: this.options.omitUnused });
37
+ }
38
+ render(graph) {
39
+ return printDependencyTree(graph, {
40
+ cwd: this.options.cwd ?? graph.cwd,
41
+ includeExternals: this.options.includeExternals,
42
+ omitUnused: this.options.omitUnused
43
+ });
44
+ }
45
+ };
46
+ //#endregion
47
+ //#region src/commands/react.ts
48
+ var ReactCommand = class extends BaseCommand {
49
+ analyze() {
50
+ return analyzeReactUsage(this.options.entryFile, this.getAnalyzeOptions());
51
+ }
52
+ serialize(graph) {
53
+ return graphToSerializableReactTree(graph, { filter: this.getFilter() });
54
+ }
55
+ render(graph) {
56
+ return printReactUsageTree(graph, {
57
+ cwd: this.options.cwd ?? graph.cwd,
58
+ filter: this.getFilter()
59
+ });
60
+ }
61
+ getFilter() {
62
+ return this.options.filter;
26
63
  }
64
+ };
65
+ //#endregion
66
+ //#region src/app/run.ts
67
+ function runCli(options) {
68
+ new CliApplication(options).run();
27
69
  }
28
- function parseArgs(argv) {
29
- if (argv.includes("--version") || argv.includes("-v")) {
30
- process.stdout.write(`${version}\n`);
31
- process.exit(0);
32
- }
33
- if (argv.length === 0 || argv.includes("--help") || argv.includes("-h")) {
34
- printHelp();
35
- process.exit(0);
36
- }
37
- let entryFile;
38
- let cwd;
39
- let configPath;
40
- let includeExternals = false;
41
- let json = false;
42
- for (let index = 0; index < argv.length; index += 1) {
43
- const argument = argv[index];
44
- if (argument === void 0) continue;
45
- if (argument === "--cwd") {
46
- cwd = readOptionValue(argv, index, "--cwd");
47
- index += 1;
48
- continue;
49
- }
50
- if (argument === "--config") {
51
- configPath = readOptionValue(argv, index, "--config");
52
- index += 1;
53
- continue;
54
- }
55
- if (argument === "--include-externals") {
56
- includeExternals = true;
57
- continue;
58
- }
59
- if (argument === "--json") {
60
- json = true;
61
- continue;
70
+ var CliApplication = class {
71
+ constructor(options) {
72
+ this.options = options;
73
+ }
74
+ run() {
75
+ this.createCommand().run();
76
+ }
77
+ createCommand() {
78
+ if (this.options.command === "react") return new ReactCommand(this.options);
79
+ return new ImportCommand(this.options);
80
+ }
81
+ };
82
+ //#endregion
83
+ //#region src/app/cli.ts
84
+ function main(version, argv = process$1.argv.slice(2)) {
85
+ new CliMain(version, argv).run();
86
+ }
87
+ var CliMain = class {
88
+ constructor(version, argv) {
89
+ this.version = version;
90
+ this.argv = argv;
91
+ }
92
+ run() {
93
+ try {
94
+ const cli = this.createCli();
95
+ if (this.argv.length === 0) {
96
+ cli.outputHelp();
97
+ return;
98
+ }
99
+ this.validateCommandSyntax();
100
+ cli.parse(this.toProcessArgv());
101
+ } catch (error) {
102
+ const message = error instanceof Error ? error.message : "Unknown error occurred.";
103
+ process$1.stderr.write(`foresthouse: ${message}\n`);
104
+ process$1.exitCode = 1;
62
105
  }
63
- if (argument.startsWith("-")) throw new Error(`Unknown option: ${argument}`);
64
- if (entryFile !== void 0) throw new Error("Only one entry file can be provided.");
65
- entryFile = argument;
66
106
  }
67
- if (entryFile === void 0) throw new Error("An entry file is required.");
107
+ createCli() {
108
+ const cli = cac("foresthouse");
109
+ 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-unused", "Omit imports that are never referenced.").option("--json", "Print the dependency tree as JSON.").action((entryFile, rawOptions) => {
110
+ runCli(normalizeImportCliOptions(entryFile, rawOptions));
111
+ });
112
+ 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 `hook` usages.").option("--json", "Print the React usage tree as JSON.").action((entryFile, rawOptions) => {
113
+ runCli(normalizeReactCliOptions(entryFile, rawOptions));
114
+ });
115
+ cli.help();
116
+ cli.version(this.version);
117
+ return cli;
118
+ }
119
+ validateCommandSyntax() {
120
+ if (this.argv.length === 0) return;
121
+ const firstArgument = this.argv[0];
122
+ if (firstArgument === void 0) return;
123
+ if (firstArgument === "--react" || firstArgument.startsWith("--react=")) throw new Error("Unknown option `--react`");
124
+ if (firstArgument.startsWith("-")) return;
125
+ if (firstArgument === "import" || firstArgument === "react") return;
126
+ throw new Error(`Unknown command \`${firstArgument}\``);
127
+ }
128
+ toProcessArgv() {
129
+ return [
130
+ "node",
131
+ "foresthouse",
132
+ ...this.argv
133
+ ];
134
+ }
135
+ };
136
+ function normalizeImportCliOptions(entryFile, options) {
137
+ return {
138
+ command: "import",
139
+ entryFile: resolveImportEntryFile(entryFile, options.entry),
140
+ cwd: options.cwd,
141
+ configPath: options.config,
142
+ includeExternals: options.includeExternals === true,
143
+ omitUnused: options.unused === false,
144
+ json: options.json === true
145
+ };
146
+ }
147
+ function normalizeReactCliOptions(entryFile, options) {
68
148
  return {
149
+ command: "react",
69
150
  entryFile,
70
- cwd,
71
- configPath,
72
- includeExternals,
73
- json
151
+ cwd: options.cwd,
152
+ configPath: options.config,
153
+ json: options.json === true,
154
+ filter: normalizeReactFilter(options.filter)
74
155
  };
75
156
  }
76
- function readOptionValue(argv, index, optionName) {
77
- const value = argv[index + 1];
78
- if (value === void 0 || value.startsWith("-")) throw new Error(`Missing value for ${optionName}`);
79
- return value;
157
+ function resolveImportEntryFile(positionalEntryFile, optionEntryFile) {
158
+ if (positionalEntryFile !== void 0 && optionEntryFile !== void 0 && positionalEntryFile !== optionEntryFile) throw new Error("Provide the import entry only once, either as `foresthouse import <entry-file>` or `foresthouse import --entry <path>`.");
159
+ const resolvedEntryFile = positionalEntryFile ?? optionEntryFile;
160
+ if (resolvedEntryFile === void 0) throw new Error("Missing import entry file. Use `foresthouse import <entry-file>` or `foresthouse import --entry <path>`.");
161
+ return resolvedEntryFile;
80
162
  }
81
- function printHelp() {
82
- process.stdout.write(`foresthouse v${version}
83
-
84
- Usage:
85
- foresthouse <entry-file> [options]
86
-
87
- Options:
88
- --cwd <path> Working directory used for relative paths.
89
- --config <path> Explicit tsconfig.json or jsconfig.json path.
90
- --include-externals Include packages and Node built-ins in the tree.
91
- --json Print the dependency tree as JSON.
92
- -v, --version Show the current version.
93
- -h, --help Show this help message.
94
- `);
163
+ function normalizeReactFilter(filter) {
164
+ if (filter === void 0) return "all";
165
+ if (filter === "component" || filter === "hook") return filter;
166
+ throw new Error(`Unknown React filter: ${filter}`);
95
167
  }
96
- main();
168
+ //#endregion
169
+ //#region src/cli.ts
170
+ const { version } = createRequire(import.meta.url)("../package.json");
171
+ main(version);
97
172
  //#endregion
98
173
  export {};
99
174
 
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { createRequire } from 'node:module'\nimport process from 'node:process'\n\nimport { analyzeDependencies, graphToSerializableTree } from './analyzer.js'\nimport { printDependencyTree } from './tree.js'\n\nconst require = createRequire(import.meta.url)\nconst { version } = require('../package.json') as { version: string }\n\ninterface CliOptions {\n readonly entryFile: string\n readonly cwd: string | undefined\n readonly configPath: string | undefined\n readonly includeExternals: boolean\n readonly json: boolean\n}\n\nfunction main(): void {\n try {\n const options = parseArgs(process.argv.slice(2))\n const graph = analyzeDependencies(options.entryFile, {\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n ...(options.configPath === undefined\n ? {}\n : { configPath: options.configPath }),\n })\n\n if (options.json) {\n process.stdout.write(\n `${JSON.stringify(graphToSerializableTree(graph), null, 2)}\\n`,\n )\n return\n }\n\n process.stdout.write(\n `${printDependencyTree(graph, {\n cwd: options.cwd ?? graph.cwd,\n includeExternals: options.includeExternals,\n })}\\n`,\n )\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\nfunction parseArgs(argv: string[]): CliOptions {\n if (argv.includes('--version') || argv.includes('-v')) {\n process.stdout.write(`${version}\\n`)\n process.exit(0)\n }\n\n if (argv.length === 0 || argv.includes('--help') || argv.includes('-h')) {\n printHelp()\n process.exit(0)\n }\n\n let entryFile: string | undefined\n let cwd: string | undefined\n let configPath: string | undefined\n let includeExternals = false\n let json = false\n\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index]\n if (argument === undefined) {\n continue\n }\n\n if (argument === '--cwd') {\n cwd = readOptionValue(argv, index, '--cwd')\n index += 1\n continue\n }\n\n if (argument === '--config') {\n configPath = readOptionValue(argv, index, '--config')\n index += 1\n continue\n }\n\n if (argument === '--include-externals') {\n includeExternals = true\n continue\n }\n\n if (argument === '--json') {\n json = true\n continue\n }\n\n if (argument.startsWith('-')) {\n throw new Error(`Unknown option: ${argument}`)\n }\n\n if (entryFile !== undefined) {\n throw new Error('Only one entry file can be provided.')\n }\n\n entryFile = argument\n }\n\n if (entryFile === undefined) {\n throw new Error('An entry file is required.')\n }\n\n return {\n entryFile,\n cwd,\n configPath,\n includeExternals,\n json,\n }\n}\n\nfunction readOptionValue(\n argv: string[],\n index: number,\n optionName: string,\n): string {\n const value = argv[index + 1]\n if (value === undefined || value.startsWith('-')) {\n throw new Error(`Missing value for ${optionName}`)\n }\n\n return value\n}\n\nfunction printHelp(): void {\n process.stdout.write(`foresthouse v${version}\n\nUsage:\n foresthouse <entry-file> [options]\n\nOptions:\n --cwd <path> Working directory used for relative paths.\n --config <path> Explicit tsconfig.json or jsconfig.json path.\n --include-externals Include packages and Node built-ins in the tree.\n --json Print the dependency tree as JSON.\n -v, --version Show the current version.\n -h, --help Show this help message.\n`)\n}\n\nmain()\n"],"mappings":";;;;;AASA,MAAM,EAAE,YADQ,cAAc,OAAO,KAAK,IAAI,CAClB,kBAAkB;AAU9C,SAAS,OAAa;AACpB,KAAI;EACF,MAAM,UAAU,UAAU,QAAQ,KAAK,MAAM,EAAE,CAAC;EAChD,MAAM,QAAQ,oBAAoB,QAAQ,WAAW;GACnD,GAAI,QAAQ,QAAQ,KAAA,IAAY,EAAE,GAAG,EAAE,KAAK,QAAQ,KAAK;GACzD,GAAI,QAAQ,eAAe,KAAA,IACvB,EAAE,GACF,EAAE,YAAY,QAAQ,YAAY;GACvC,CAAC;AAEF,MAAI,QAAQ,MAAM;AAChB,WAAQ,OAAO,MACb,GAAG,KAAK,UAAU,wBAAwB,MAAM,EAAE,MAAM,EAAE,CAAC,IAC5D;AACD;;AAGF,UAAQ,OAAO,MACb,GAAG,oBAAoB,OAAO;GAC5B,KAAK,QAAQ,OAAO,MAAM;GAC1B,kBAAkB,QAAQ;GAC3B,CAAC,CAAC,IACJ;UACM,OAAO;EACd,MAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,UAAQ,OAAO,MAAM,gBAAgB,QAAQ,IAAI;AACjD,UAAQ,WAAW;;;AAIvB,SAAS,UAAU,MAA4B;AAC7C,KAAI,KAAK,SAAS,YAAY,IAAI,KAAK,SAAS,KAAK,EAAE;AACrD,UAAQ,OAAO,MAAM,GAAG,QAAQ,IAAI;AACpC,UAAQ,KAAK,EAAE;;AAGjB,KAAI,KAAK,WAAW,KAAK,KAAK,SAAS,SAAS,IAAI,KAAK,SAAS,KAAK,EAAE;AACvE,aAAW;AACX,UAAQ,KAAK,EAAE;;CAGjB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI,mBAAmB;CACvB,IAAI,OAAO;AAEX,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,WAAW,KAAK;AACtB,MAAI,aAAa,KAAA,EACf;AAGF,MAAI,aAAa,SAAS;AACxB,SAAM,gBAAgB,MAAM,OAAO,QAAQ;AAC3C,YAAS;AACT;;AAGF,MAAI,aAAa,YAAY;AAC3B,gBAAa,gBAAgB,MAAM,OAAO,WAAW;AACrD,YAAS;AACT;;AAGF,MAAI,aAAa,uBAAuB;AACtC,sBAAmB;AACnB;;AAGF,MAAI,aAAa,UAAU;AACzB,UAAO;AACP;;AAGF,MAAI,SAAS,WAAW,IAAI,CAC1B,OAAM,IAAI,MAAM,mBAAmB,WAAW;AAGhD,MAAI,cAAc,KAAA,EAChB,OAAM,IAAI,MAAM,uCAAuC;AAGzD,cAAY;;AAGd,KAAI,cAAc,KAAA,EAChB,OAAM,IAAI,MAAM,6BAA6B;AAG/C,QAAO;EACL;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAS,gBACP,MACA,OACA,YACQ;CACR,MAAM,QAAQ,KAAK,QAAQ;AAC3B,KAAI,UAAU,KAAA,KAAa,MAAM,WAAW,IAAI,CAC9C,OAAM,IAAI,MAAM,qBAAqB,aAAa;AAGpD,QAAO;;AAGT,SAAS,YAAkB;AACzB,SAAQ,OAAO,MAAM,gBAAgB,QAAQ;;;;;;;;;;;;EAY7C;;AAGF,MAAM"}
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 }\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('--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('--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 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 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 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":";;;;;;AAGA,IAAsB,cAAtB,MAGE;CACA,YAAY,SAAsC;AAAnB,OAAA,UAAA;;CAE/B,MAAY;EACV,MAAM,QAAQ,KAAK,SAAS;AAE5B,MAAI,KAAK,YAAY,EAAE;AACrB,WAAQ,OAAO,MACb,GAAG,KAAK,UAAU,KAAK,UAAU,MAAM,EAAE,MAAM,EAAE,CAAC,IACnD;AACD;;AAGF,UAAQ,OAAO,MAAM,GAAG,KAAK,OAAO,MAAM,CAAC,IAAI;;CAGjD,aAAgC;AAC9B,SAAO,KAAK,QAAQ;;CAGtB,oBAA8C;AAC5C,SAAO;GACL,GAAI,KAAK,QAAQ,QAAQ,KAAA,IAAY,EAAE,GAAG,EAAE,KAAK,KAAK,QAAQ,KAAK;GACnE,GAAI,KAAK,QAAQ,eAAe,KAAA,IAC5B,EAAE,GACF,EAAE,YAAY,KAAK,QAAQ,YAAY;GAC5C;;;;;ACzBL,IAAa,gBAAb,cAAmC,YAGjC;CACA,UAAqC;AACnC,SAAO,oBAAoB,KAAK,QAAQ,WAAW,KAAK,mBAAmB,CAAC;;CAG9E,UAAoB,OAAgC;AAClD,SAAO,wBAAwB,OAAO,EACpC,YAAY,KAAK,QAAQ,YAC1B,CAAC;;CAGJ,OAAiB,OAAgC;AAC/C,SAAO,oBAAoB,OAAO;GAChC,KAAK,KAAK,QAAQ,OAAO,MAAM;GAC/B,kBAAkB,KAAK,QAAQ;GAC/B,YAAY,KAAK,QAAQ;GAC1B,CAAC;;;;;AClBN,IAAa,eAAb,cAAkC,YAGhC;CACA,UAAqC;AACnC,SAAO,kBAAkB,KAAK,QAAQ,WAAW,KAAK,mBAAmB,CAAC;;CAG5E,UAAoB,OAAgC;AAClD,SAAO,6BAA6B,OAAO,EACzC,QAAQ,KAAK,WAAW,EACzB,CAAC;;CAGJ,OAAiB,OAAgC;AAC/C,SAAO,oBAAoB,OAAO;GAChC,KAAK,KAAK,QAAQ,OAAO,MAAM;GAC/B,QAAQ,KAAK,WAAW;GACzB,CAAC;;CAGJ,YAAsC;AACpC,SAAO,KAAK,QAAQ;;;;;AC1BxB,SAAgB,OAAO,SAA2B;AAChD,KAAI,eAAe,QAAQ,CAAC,KAAK;;AAGnC,IAAM,iBAAN,MAAqB;CACnB,YAAY,SAAsC;AAArB,OAAA,UAAA;;CAE7B,MAAY;AACV,OAAK,eAAe,CAAC,KAAK;;CAG5B,gBAEE;AACA,MAAI,KAAK,QAAQ,YAAY,QAC3B,QAAO,IAAI,aAAa,KAAK,QAAQ;AAGvC,SAAO,IAAI,cAAc,KAAK,QAAQ;;;;;ACd1C,SAAgB,KAAK,SAAiB,OAAOA,UAAQ,KAAK,MAAM,EAAE,EAAQ;AACxE,KAAI,QAAQ,SAAS,KAAK,CAAC,KAAK;;AAGlC,IAAM,UAAN,MAAc;CACZ,YACE,SACA,MACA;AAFiB,OAAA,UAAA;AACA,OAAA,OAAA;;CAGnB,MAAY;AACV,MAAI;GACF,MAAM,MAAM,KAAK,WAAW;AAE5B,OAAI,KAAK,KAAK,WAAW,GAAG;AAC1B,QAAI,YAAY;AAChB;;AAGF,QAAK,uBAAuB;AAC5B,OAAI,MAAM,KAAK,eAAe,CAAC;WACxB,OAAO;GACd,MAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,aAAQ,OAAO,MAAM,gBAAgB,QAAQ,IAAI;AACjD,aAAQ,WAAW;;;CAIvB,YAAoB;EAClB,MAAM,MAAM,IAAI,cAAc;AAE9B,MACG,QACC,uBACA,uDACD,CACA,MAAM,gCAAgC,CACtC,OAAO,kBAAkB,yBAAyB,CAClD,OAAO,gBAAgB,6CAA6C,CACpE,OACC,mBACA,gDACD,CACA,OACC,uBACA,mDACD,CACA,OAAO,eAAe,0CAA0C,CAChE,OAAO,UAAU,qCAAqC,CACtD,QACE,WAA+B,eAAuC;AACrE,UAAO,0BAA0B,WAAW,WAAW,CAAC;IAE3D;AAEH,MACG,QAAQ,sBAAsB,0CAA0C,CACxE,MAAM,+BAA+B,CACrC,OAAO,gBAAgB,6CAA6C,CACpE,OACC,mBACA,gDACD,CACA,OACC,mBACA,gDACD,CACA,OAAO,UAAU,sCAAsC,CACvD,QAAQ,WAAmB,eAAsC;AAChE,UAAO,yBAAyB,WAAW,WAAW,CAAC;IACvD;AAEJ,MAAI,MAAM;AACV,MAAI,QAAQ,KAAK,QAAQ;AAEzB,SAAO;;CAGT,wBAAsC;AACpC,MAAI,KAAK,KAAK,WAAW,EACvB;EAGF,MAAM,gBAAgB,KAAK,KAAK;AAEhC,MAAI,kBAAkB,KAAA,EACpB;AAGF,MAAI,kBAAkB,aAAa,cAAc,WAAW,WAAW,CACrE,OAAM,IAAI,MAAM,2BAA2B;AAG7C,MAAI,cAAc,WAAW,IAAI,CAC/B;AAGF,MAAI,kBAAkB,YAAY,kBAAkB,QAClD;AAGF,QAAM,IAAI,MAAM,qBAAqB,cAAc,IAAI;;CAGzD,gBAAkC;AAChC,SAAO;GAAC;GAAQ;GAAe,GAAG,KAAK;GAAK;;;AAoBhD,SAAS,0BACP,WACA,SACkB;AAClB,QAAO;EACL,SAAS;EACT,WAAW,uBAAuB,WAAW,QAAQ,MAAM;EAC3D,KAAK,QAAQ;EACb,YAAY,QAAQ;EACpB,kBAAkB,QAAQ,qBAAqB;EAC/C,YAAY,QAAQ,WAAW;EAC/B,MAAM,QAAQ,SAAS;EACxB;;AAGH,SAAS,yBACP,WACA,SACiB;AACjB,QAAO;EACL,SAAS;EACT;EACA,KAAK,QAAQ;EACb,YAAY,QAAQ;EACpB,MAAM,QAAQ,SAAS;EACvB,QAAQ,qBAAqB,QAAQ,OAAO;EAC7C;;AAGH,SAAS,uBACP,qBACA,iBACQ;AACR,KACE,wBAAwB,KAAA,KACxB,oBAAoB,KAAA,KACpB,wBAAwB,gBAExB,OAAM,IAAI,MACR,0HACD;CAGH,MAAM,oBAAoB,uBAAuB;AAEjD,KAAI,sBAAsB,KAAA,EACxB,OAAM,IAAI,MACR,2GACD;AAGH,QAAO;;AAGT,SAAS,qBACP,QACkB;AAClB,KAAI,WAAW,KAAA,EACb,QAAO;AAGT,KAAI,WAAW,eAAe,WAAW,OACvC,QAAO;AAGT,OAAM,IAAI,MAAM,yBAAyB,SAAS;;;;AChMpD,MAAM,EAAE,YADQ,cAAc,OAAO,KAAK,IAAI,CAClB,kBAAkB;AAE9C,KAAK,QAAQ"}
package/dist/index.d.mts CHANGED
@@ -1,38 +1,131 @@
1
- //#region src/types.d.ts
1
+ //#region src/types/analyze-options.d.ts
2
+ interface AnalyzeOptions {
3
+ readonly cwd?: string;
4
+ readonly configPath?: string;
5
+ }
6
+ //#endregion
7
+ //#region src/types/dependency-kind.d.ts
2
8
  type DependencyKind = 'source' | 'external' | 'builtin' | 'missing';
9
+ //#endregion
10
+ //#region src/types/reference-kind.d.ts
3
11
  type ReferenceKind = 'import' | 'export' | 'require' | 'dynamic-import' | 'import-equals';
12
+ //#endregion
13
+ //#region src/types/dependency-edge.d.ts
4
14
  interface DependencyEdge {
5
15
  readonly specifier: string;
6
16
  readonly referenceKind: ReferenceKind;
7
17
  readonly isTypeOnly: boolean;
18
+ readonly unused: boolean;
8
19
  readonly kind: DependencyKind;
9
20
  readonly target: string;
10
21
  }
22
+ //#endregion
23
+ //#region src/types/source-module-node.d.ts
11
24
  interface SourceModuleNode {
12
25
  readonly id: string;
13
26
  readonly dependencies: readonly DependencyEdge[];
14
27
  }
28
+ //#endregion
29
+ //#region src/types/dependency-graph.d.ts
15
30
  interface DependencyGraph {
16
31
  readonly cwd: string;
17
32
  readonly entryId: string;
18
33
  readonly nodes: ReadonlyMap<string, SourceModuleNode>;
19
34
  readonly configPath?: string;
20
35
  }
21
- interface AnalyzeOptions {
22
- readonly cwd?: string;
23
- readonly configPath?: string;
36
+ //#endregion
37
+ //#region src/analyzers/import/index.d.ts
38
+ declare function analyzeDependencies(entryFile: string, options?: AnalyzeOptions): DependencyGraph;
39
+ //#endregion
40
+ //#region src/types/react-usage-location.d.ts
41
+ interface ReactUsageLocation {
42
+ readonly filePath: string;
43
+ readonly line: number;
44
+ readonly column: number;
24
45
  }
46
+ //#endregion
47
+ //#region src/types/react-usage-entry.d.ts
48
+ interface ReactUsageEntry {
49
+ readonly target: string;
50
+ readonly referenceName: string;
51
+ readonly location: ReactUsageLocation;
52
+ }
53
+ //#endregion
54
+ //#region src/types/react-symbol-kind.d.ts
55
+ type ReactSymbolKind = 'component' | 'hook';
56
+ //#endregion
57
+ //#region src/types/react-usage-edge-kind.d.ts
58
+ type ReactUsageEdgeKind = 'render' | 'hook-call';
59
+ //#endregion
60
+ //#region src/types/react-usage-edge.d.ts
61
+ interface ReactUsageEdge {
62
+ readonly kind: ReactUsageEdgeKind;
63
+ readonly target: string;
64
+ readonly referenceName: string;
65
+ }
66
+ //#endregion
67
+ //#region src/types/react-usage-node.d.ts
68
+ interface ReactUsageNode {
69
+ readonly id: string;
70
+ readonly name: string;
71
+ readonly kind: ReactSymbolKind;
72
+ readonly filePath: string;
73
+ readonly exportNames: readonly string[];
74
+ readonly usages: readonly ReactUsageEdge[];
75
+ }
76
+ //#endregion
77
+ //#region src/types/react-usage-graph.d.ts
78
+ interface ReactUsageGraph {
79
+ readonly cwd: string;
80
+ readonly entryId: string;
81
+ readonly nodes: ReadonlyMap<string, ReactUsageNode>;
82
+ readonly entries: readonly ReactUsageEntry[];
83
+ }
84
+ //#endregion
85
+ //#region src/analyzers/react/index.d.ts
86
+ declare function analyzeReactUsage(entryFile: string, options?: AnalyzeOptions): ReactUsageGraph;
87
+ //#endregion
88
+ //#region src/types/react-usage-filter.d.ts
89
+ type ReactUsageFilter = 'all' | ReactSymbolKind;
90
+ //#endregion
91
+ //#region src/analyzers/react/queries.d.ts
92
+ declare function getReactUsageEntries(graph: ReactUsageGraph, filter?: ReactUsageFilter): ReactUsageEntry[];
93
+ declare function getReactUsageRoots(graph: ReactUsageGraph, filter?: ReactUsageFilter): string[];
94
+ declare function getFilteredUsages(node: ReactUsageNode, graph: ReactUsageGraph, filter?: ReactUsageFilter): ReactUsageEdge[];
95
+ //#endregion
96
+ //#region src/types/color-mode.d.ts
97
+ type ColorMode = boolean | 'auto';
98
+ //#endregion
99
+ //#region src/types/print-tree-options.d.ts
25
100
  interface PrintTreeOptions {
26
101
  readonly cwd?: string;
27
102
  readonly includeExternals?: boolean;
103
+ readonly omitUnused?: boolean;
104
+ readonly color?: ColorMode;
28
105
  }
29
106
  //#endregion
30
- //#region src/analyzer.d.ts
31
- declare function analyzeDependencies(entryFile: string, options?: AnalyzeOptions): DependencyGraph;
32
- declare function graphToSerializableTree(graph: DependencyGraph): object;
33
- //#endregion
34
- //#region src/tree.d.ts
107
+ //#region src/output/ascii/import.d.ts
35
108
  declare function printDependencyTree(graph: DependencyGraph, options?: PrintTreeOptions): string;
36
109
  //#endregion
37
- export { type AnalyzeOptions, type DependencyEdge, type DependencyGraph, type DependencyKind, type PrintTreeOptions, type ReferenceKind, type SourceModuleNode, analyzeDependencies, graphToSerializableTree, printDependencyTree };
110
+ //#region src/types/print-react-tree-options.d.ts
111
+ interface PrintReactTreeOptions {
112
+ readonly cwd?: string;
113
+ readonly filter?: ReactUsageFilter;
114
+ readonly color?: ColorMode;
115
+ }
116
+ //#endregion
117
+ //#region src/output/ascii/react.d.ts
118
+ declare function printReactUsageTree(graph: ReactUsageGraph, options?: PrintReactTreeOptions): string;
119
+ //#endregion
120
+ //#region src/output/json/import.d.ts
121
+ declare function graphToSerializableTree(graph: DependencyGraph, options?: {
122
+ readonly omitUnused?: boolean;
123
+ }): object;
124
+ //#endregion
125
+ //#region src/output/json/react.d.ts
126
+ declare function graphToSerializableReactTree(graph: ReactUsageGraph, options?: {
127
+ readonly filter?: ReactUsageFilter;
128
+ }): object;
129
+ //#endregion
130
+ export { type AnalyzeOptions, type ColorMode, type DependencyEdge, type DependencyGraph, type DependencyKind, type PrintReactTreeOptions, type PrintTreeOptions, type ReactSymbolKind, type ReactUsageEdge, type ReactUsageEdgeKind, type ReactUsageEntry, type ReactUsageFilter, type ReactUsageGraph, type ReactUsageLocation, type ReactUsageNode, type ReferenceKind, type SourceModuleNode, analyzeDependencies, analyzeReactUsage, getFilteredUsages, getReactUsageEntries, getReactUsageRoots, graphToSerializableReactTree, graphToSerializableTree, printDependencyTree, printReactUsageTree };
38
131
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/analyzer.ts","../src/tree.ts"],"mappings":";KAAY,cAAA;AAAA,KAEA,aAAA;AAAA,UAOK,cAAA;EAAA,SACN,SAAA;EAAA,SACA,aAAA,EAAe,aAAA;EAAA,SACf,UAAA;EAAA,SACA,IAAA,EAAM,cAAA;EAAA,SACN,MAAA;AAAA;AAAA,UAGM,gBAAA;EAAA,SACN,EAAA;EAAA,SACA,YAAA,WAAuB,cAAA;AAAA;AAAA,UAGjB,eAAA;EAAA,SACN,GAAA;EAAA,SACA,OAAA;EAAA,SACA,KAAA,EAAO,WAAA,SAAoB,gBAAA;EAAA,SAC3B,UAAA;AAAA;AAAA,UAGM,cAAA;EAAA,SACN,GAAA;EAAA,SACA,UAAA;AAAA;AAAA,UAGM,gBAAA;EAAA,SACN,GAAA;EAAA,SACA,gBAAA;AAAA;;;iBCNK,mBAAA,CACd,SAAA,UACA,OAAA,GAAS,cAAA,GACR,eAAA;AAAA,iBA4Ba,uBAAA,CAAwB,KAAA,EAAO,eAAA;;;iBCtD/B,mBAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA,GAAS,gBAAA"}
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;AAAA;;;KCFC,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;AAAA;;;UCPM,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;;;iBCcb,iBAAA,CACd,SAAA,UACA,OAAA,GAAS,cAAA,GACR,eAAA;;;KCtBS,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;;;iBClBK,uBAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA;EAAA,SACW,UAAA;AAAA;;;iBC+BG,4BAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA;EAAA,SACW,MAAA,GAAS,gBAAA;AAAA"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { n as analyzeDependencies, r as graphToSerializableTree, t as printDependencyTree } from "./tree-BiiNljTI.mjs";
2
- export { analyzeDependencies, graphToSerializableTree, printDependencyTree };
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-DQxFg3iv.mjs";
2
+ export { analyzeDependencies, analyzeReactUsage, getFilteredUsages, getReactUsageEntries, getReactUsageRoots, graphToSerializableReactTree, graphToSerializableTree, printDependencyTree, printReactUsageTree };