foresthouse 1.0.0-dev.6 → 1.0.0-dev.8

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
@@ -27,13 +27,13 @@
27
27
  corepack enable
28
28
  pnpm install
29
29
  pnpm run build
30
- node dist/cli.mjs src/index.ts
30
+ node dist/cli.mjs import src/index.ts
31
31
  ```
32
32
 
33
33
  ### Example
34
34
 
35
35
  ```bash
36
- node dist/cli.mjs src/main.ts --cwd test/fixtures/basic
36
+ node dist/cli.mjs import src/main.ts --cwd test/fixtures/basic
37
37
  ```
38
38
 
39
39
  Output:
@@ -49,9 +49,22 @@ src/main.ts
49
49
 
50
50
  ### Options
51
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
52
56
  - `--cwd <path>`: working directory for resolving the entry file and config
53
57
  - `--config <path>`: use a specific `tsconfig.json` or `jsconfig.json`
54
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
55
68
  - `--json`: print a JSON tree instead of ASCII output
56
69
 
57
70
  ## Development
package/dist/cli.mjs CHANGED
@@ -1,137 +1,174 @@
1
1
  #!/usr/bin/env node
2
- import { a as graphToSerializableReactTree, n as printReactUsageTree, o as analyzeDependencies, r as analyzeReactUsage, s as graphToSerializableTree, t as printDependencyTree } from "./tree-Qsy9Nmh9.mjs";
2
+ import { c as analyzeReactUsage, i as printDependencyTree, l as analyzeDependencies, n as graphToSerializableTree, r as printReactUsageTree, t as graphToSerializableReactTree } from "./react-CWIt8V0Y.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
- if (options.react !== void 0) {
11
- const graph = analyzeReactUsage(options.entryFile, {
12
- ...options.cwd === void 0 ? {} : { cwd: options.cwd },
13
- ...options.configPath === void 0 ? {} : { configPath: options.configPath }
14
- });
15
- if (options.json) {
16
- process.stdout.write(`${JSON.stringify(graphToSerializableReactTree(graph, { filter: options.react }), null, 2)}\n`);
17
- return;
18
- }
19
- process.stdout.write(`${printReactUsageTree(graph, {
20
- cwd: options.cwd ?? graph.cwd,
21
- filter: options.react
22
- })}\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`);
23
15
  return;
24
16
  }
25
- const graph = analyzeDependencies(options.entryFile, {
26
- ...options.cwd === void 0 ? {} : { cwd: options.cwd },
27
- ...options.configPath === void 0 ? {} : { configPath: options.configPath }
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()
28
59
  });
29
- if (options.json) {
30
- process.stdout.write(`${JSON.stringify(graphToSerializableTree(graph, { omitUnused: options.omitUnused }), null, 2)}\n`);
31
- return;
32
- }
33
- process.stdout.write(`${printDependencyTree(graph, {
34
- cwd: options.cwd ?? graph.cwd,
35
- includeExternals: options.includeExternals,
36
- omitUnused: options.omitUnused
37
- })}\n`);
38
- } catch (error) {
39
- const message = error instanceof Error ? error.message : "Unknown error occurred.";
40
- process.stderr.write(`foresthouse: ${message}\n`);
41
- process.exitCode = 1;
42
60
  }
61
+ getFilter() {
62
+ return this.options.filter;
63
+ }
64
+ };
65
+ //#endregion
66
+ //#region src/app/run.ts
67
+ function runCli(options) {
68
+ new CliApplication(options).run();
43
69
  }
44
- function parseArgs(argv) {
45
- if (argv.includes("--version") || argv.includes("-v")) {
46
- process.stdout.write(`${version}\n`);
47
- process.exit(0);
48
- }
49
- if (argv.length === 0 || argv.includes("--help") || argv.includes("-h")) {
50
- printHelp();
51
- process.exit(0);
52
- }
53
- let entryFile;
54
- let cwd;
55
- let configPath;
56
- let includeExternals = false;
57
- let omitUnused = false;
58
- let json = false;
59
- let react;
60
- for (let index = 0; index < argv.length; index += 1) {
61
- const argument = argv[index];
62
- if (argument === void 0) continue;
63
- if (argument === "--cwd") {
64
- cwd = readOptionValue(argv, index, "--cwd");
65
- index += 1;
66
- continue;
67
- }
68
- if (argument === "--config") {
69
- configPath = readOptionValue(argv, index, "--config");
70
- index += 1;
71
- continue;
72
- }
73
- if (argument === "--include-externals") {
74
- includeExternals = true;
75
- continue;
76
- }
77
- if (argument === "--no-unused") {
78
- omitUnused = true;
79
- continue;
80
- }
81
- if (argument === "--json") {
82
- json = true;
83
- continue;
84
- }
85
- if (argument === "--react") {
86
- react = "all";
87
- continue;
88
- }
89
- if (argument.startsWith("--react=")) {
90
- const value = argument.slice(8);
91
- if (value === "component" || value === "hook") {
92
- react = value;
93
- 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;
94
98
  }
95
- throw new Error(`Unknown React mode: ${value}`);
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;
96
105
  }
97
- if (argument.startsWith("-")) throw new Error(`Unknown option: ${argument}`);
98
- if (entryFile !== void 0) throw new Error("Only one entry file can be provided.");
99
- entryFile = argument;
100
106
  }
101
- 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) {
102
148
  return {
149
+ command: "react",
103
150
  entryFile,
104
- cwd,
105
- configPath,
106
- includeExternals,
107
- omitUnused,
108
- json,
109
- react
151
+ cwd: options.cwd,
152
+ configPath: options.config,
153
+ json: options.json === true,
154
+ filter: normalizeReactFilter(options.filter)
110
155
  };
111
156
  }
112
- function readOptionValue(argv, index, optionName) {
113
- const value = argv[index + 1];
114
- if (value === void 0 || value.startsWith("-")) throw new Error(`Missing value for ${optionName}`);
115
- 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;
116
162
  }
117
- function printHelp() {
118
- process.stdout.write(`foresthouse v${version}
119
-
120
- Usage:
121
- foresthouse <entry-file> [options]
122
-
123
- Options:
124
- --cwd <path> Working directory used for relative paths.
125
- --config <path> Explicit tsconfig.json or jsconfig.json path.
126
- --include-externals Include packages and Node built-ins in the tree.
127
- --no-unused Omit imports that are never referenced.
128
- --react[=component|hook] Print a React usage tree instead of the import tree.
129
- --json Print the dependency tree as JSON.
130
- -v, --version Show the current version.
131
- -h, --help Show this help message.
132
- `);
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}`);
133
167
  }
134
- main();
168
+ //#endregion
169
+ //#region src/cli.ts
170
+ const { version } = createRequire(import.meta.url)("../package.json");
171
+ main(version);
135
172
  //#endregion
136
173
  export {};
137
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 {\n analyzeReactUsage,\n graphToSerializableReactTree,\n} from './react-analyzer.js'\nimport { printReactUsageTree } from './react-tree.js'\nimport { printDependencyTree } from './tree.js'\nimport type { ReactUsageFilter } from './types.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 omitUnused: boolean\n readonly json: boolean\n readonly react: ReactUsageFilter | undefined\n}\n\nfunction main(): void {\n try {\n const options = parseArgs(process.argv.slice(2))\n\n if (options.react !== undefined) {\n const graph = analyzeReactUsage(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(\n graphToSerializableReactTree(graph, {\n filter: options.react,\n }),\n null,\n 2,\n )}\\n`,\n )\n return\n }\n\n process.stdout.write(\n `${printReactUsageTree(graph, {\n cwd: options.cwd ?? graph.cwd,\n filter: options.react,\n })}\\n`,\n )\n return\n }\n\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(\n graphToSerializableTree(graph, {\n omitUnused: options.omitUnused,\n }),\n null,\n 2,\n )}\\n`,\n )\n return\n }\n\n process.stdout.write(\n `${printDependencyTree(graph, {\n cwd: options.cwd ?? graph.cwd,\n includeExternals: options.includeExternals,\n omitUnused: options.omitUnused,\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 omitUnused = false\n let json = false\n let react: ReactUsageFilter | undefined\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 === '--no-unused') {\n omitUnused = true\n continue\n }\n\n if (argument === '--json') {\n json = true\n continue\n }\n\n if (argument === '--react') {\n react = 'all'\n continue\n }\n\n if (argument.startsWith('--react=')) {\n const value = argument.slice('--react='.length)\n if (value === 'component' || value === 'hook') {\n react = value\n continue\n }\n\n throw new Error(`Unknown React mode: ${value}`)\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 omitUnused,\n json,\n react,\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 --no-unused Omit imports that are never referenced.\n --react[=component|hook] Print a React usage tree instead of the import 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":";;;;;AAeA,MAAM,EAAE,YADQ,cAAc,OAAO,KAAK,IAAI,CAClB,kBAAkB;AAY9C,SAAS,OAAa;AACpB,KAAI;EACF,MAAM,UAAU,UAAU,QAAQ,KAAK,MAAM,EAAE,CAAC;AAEhD,MAAI,QAAQ,UAAU,KAAA,GAAW;GAC/B,MAAM,QAAQ,kBAAkB,QAAQ,WAAW;IACjD,GAAI,QAAQ,QAAQ,KAAA,IAAY,EAAE,GAAG,EAAE,KAAK,QAAQ,KAAK;IACzD,GAAI,QAAQ,eAAe,KAAA,IACvB,EAAE,GACF,EAAE,YAAY,QAAQ,YAAY;IACvC,CAAC;AAEF,OAAI,QAAQ,MAAM;AAChB,YAAQ,OAAO,MACb,GAAG,KAAK,UACN,6BAA6B,OAAO,EAClC,QAAQ,QAAQ,OACjB,CAAC,EACF,MACA,EACD,CAAC,IACH;AACD;;AAGF,WAAQ,OAAO,MACb,GAAG,oBAAoB,OAAO;IAC5B,KAAK,QAAQ,OAAO,MAAM;IAC1B,QAAQ,QAAQ;IACjB,CAAC,CAAC,IACJ;AACD;;EAGF,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,UACN,wBAAwB,OAAO,EAC7B,YAAY,QAAQ,YACrB,CAAC,EACF,MACA,EACD,CAAC,IACH;AACD;;AAGF,UAAQ,OAAO,MACb,GAAG,oBAAoB,OAAO;GAC5B,KAAK,QAAQ,OAAO,MAAM;GAC1B,kBAAkB,QAAQ;GAC1B,YAAY,QAAQ;GACrB,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,aAAa;CACjB,IAAI,OAAO;CACX,IAAI;AAEJ,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,eAAe;AAC9B,gBAAa;AACb;;AAGF,MAAI,aAAa,UAAU;AACzB,UAAO;AACP;;AAGF,MAAI,aAAa,WAAW;AAC1B,WAAQ;AACR;;AAGF,MAAI,SAAS,WAAW,WAAW,EAAE;GACnC,MAAM,QAAQ,SAAS,MAAM,EAAkB;AAC/C,OAAI,UAAU,eAAe,UAAU,QAAQ;AAC7C,YAAQ;AACR;;AAGF,SAAM,IAAI,MAAM,uBAAuB,QAAQ;;AAGjD,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;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;;;;;;;;;;;;;;EAc7C;;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":"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"}
package/dist/index.d.mts CHANGED
@@ -1,6 +1,16 @@
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;
@@ -9,43 +19,50 @@ interface DependencyEdge {
9
19
  readonly kind: DependencyKind;
10
20
  readonly target: string;
11
21
  }
22
+ //#endregion
23
+ //#region src/types/source-module-node.d.ts
12
24
  interface SourceModuleNode {
13
25
  readonly id: string;
14
26
  readonly dependencies: readonly DependencyEdge[];
15
27
  }
28
+ //#endregion
29
+ //#region src/types/dependency-graph.d.ts
16
30
  interface DependencyGraph {
17
31
  readonly cwd: string;
18
32
  readonly entryId: string;
19
33
  readonly nodes: ReadonlyMap<string, SourceModuleNode>;
20
34
  readonly configPath?: string;
21
35
  }
22
- interface AnalyzeOptions {
23
- readonly cwd?: string;
24
- readonly configPath?: string;
25
- }
26
- interface PrintTreeOptions {
27
- readonly cwd?: string;
28
- readonly includeExternals?: boolean;
29
- readonly omitUnused?: boolean;
30
- readonly color?: ColorMode;
31
- }
32
- type ReactSymbolKind = 'component' | 'hook';
33
- type ColorMode = boolean | 'auto';
34
- type ReactUsageFilter = 'all' | ReactSymbolKind;
35
- type ReactUsageEdgeKind = 'render' | 'hook-call';
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
36
41
  interface ReactUsageLocation {
37
42
  readonly filePath: string;
38
43
  readonly line: number;
39
44
  readonly column: number;
40
45
  }
41
- interface ReactUsageEdge {
42
- readonly kind: ReactUsageEdgeKind;
43
- readonly target: string;
44
- }
46
+ //#endregion
47
+ //#region src/types/react-usage-entry.d.ts
45
48
  interface ReactUsageEntry {
46
49
  readonly target: string;
47
50
  readonly location: ReactUsageLocation;
48
51
  }
52
+ //#endregion
53
+ //#region src/types/react-symbol-kind.d.ts
54
+ type ReactSymbolKind = 'component' | 'hook';
55
+ //#endregion
56
+ //#region src/types/react-usage-edge-kind.d.ts
57
+ type ReactUsageEdgeKind = 'render' | 'hook-call';
58
+ //#endregion
59
+ //#region src/types/react-usage-edge.d.ts
60
+ interface ReactUsageEdge {
61
+ readonly kind: ReactUsageEdgeKind;
62
+ readonly target: string;
63
+ }
64
+ //#endregion
65
+ //#region src/types/react-usage-node.d.ts
49
66
  interface ReactUsageNode {
50
67
  readonly id: string;
51
68
  readonly name: string;
@@ -54,36 +71,59 @@ interface ReactUsageNode {
54
71
  readonly exportNames: readonly string[];
55
72
  readonly usages: readonly ReactUsageEdge[];
56
73
  }
74
+ //#endregion
75
+ //#region src/types/react-usage-graph.d.ts
57
76
  interface ReactUsageGraph {
58
77
  readonly cwd: string;
59
78
  readonly entryId: string;
60
79
  readonly nodes: ReadonlyMap<string, ReactUsageNode>;
61
80
  readonly entries: readonly ReactUsageEntry[];
62
81
  }
82
+ //#endregion
83
+ //#region src/analyzers/react/index.d.ts
84
+ declare function analyzeReactUsage(entryFile: string, options?: AnalyzeOptions): ReactUsageGraph;
85
+ //#endregion
86
+ //#region src/types/react-usage-filter.d.ts
87
+ type ReactUsageFilter = 'all' | ReactSymbolKind;
88
+ //#endregion
89
+ //#region src/analyzers/react/queries.d.ts
90
+ declare function getReactUsageEntries(graph: ReactUsageGraph, filter?: ReactUsageFilter): ReactUsageEntry[];
91
+ declare function getReactUsageRoots(graph: ReactUsageGraph, filter?: ReactUsageFilter): string[];
92
+ declare function getFilteredUsages(node: ReactUsageNode, graph: ReactUsageGraph, filter?: ReactUsageFilter): ReactUsageEdge[];
93
+ //#endregion
94
+ //#region src/types/color-mode.d.ts
95
+ type ColorMode = boolean | 'auto';
96
+ //#endregion
97
+ //#region src/types/print-tree-options.d.ts
98
+ interface PrintTreeOptions {
99
+ readonly cwd?: string;
100
+ readonly includeExternals?: boolean;
101
+ readonly omitUnused?: boolean;
102
+ readonly color?: ColorMode;
103
+ }
104
+ //#endregion
105
+ //#region src/output/ascii/import.d.ts
106
+ declare function printDependencyTree(graph: DependencyGraph, options?: PrintTreeOptions): string;
107
+ //#endregion
108
+ //#region src/types/print-react-tree-options.d.ts
63
109
  interface PrintReactTreeOptions {
64
110
  readonly cwd?: string;
65
111
  readonly filter?: ReactUsageFilter;
66
112
  readonly color?: ColorMode;
67
113
  }
68
114
  //#endregion
69
- //#region src/analyzer.d.ts
70
- declare function analyzeDependencies(entryFile: string, options?: AnalyzeOptions): DependencyGraph;
115
+ //#region src/output/ascii/react.d.ts
116
+ declare function printReactUsageTree(graph: ReactUsageGraph, options?: PrintReactTreeOptions): string;
117
+ //#endregion
118
+ //#region src/output/json/import.d.ts
71
119
  declare function graphToSerializableTree(graph: DependencyGraph, options?: {
72
120
  readonly omitUnused?: boolean;
73
121
  }): object;
74
122
  //#endregion
75
- //#region src/react-analyzer.d.ts
76
- declare function analyzeReactUsage(entryFile: string, options?: AnalyzeOptions): ReactUsageGraph;
123
+ //#region src/output/json/react.d.ts
77
124
  declare function graphToSerializableReactTree(graph: ReactUsageGraph, options?: {
78
125
  readonly filter?: ReactUsageFilter;
79
126
  }): object;
80
- declare function getReactUsageRoots(graph: ReactUsageGraph, filter?: ReactUsageFilter): string[];
81
- //#endregion
82
- //#region src/react-tree.d.ts
83
- declare function printReactUsageTree(graph: ReactUsageGraph, options?: PrintReactTreeOptions): string;
84
- //#endregion
85
- //#region src/tree.d.ts
86
- declare function printDependencyTree(graph: DependencyGraph, options?: PrintTreeOptions): string;
87
127
  //#endregion
88
- 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, getReactUsageRoots, graphToSerializableReactTree, graphToSerializableTree, printDependencyTree, printReactUsageTree };
128
+ 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 };
89
129
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/analyzer.ts","../src/react-analyzer.ts","../src/react-tree.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,MAAA;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;EAAA,SACA,UAAA;EAAA,SACA,KAAA,GAAQ,SAAA;AAAA;AAAA,KAGP,eAAA;AAAA,KAEA,SAAA;AAAA,KAEA,gBAAA,WAA2B,eAAA;AAAA,KAE3B,kBAAA;AAAA,UAEK,kBAAA;EAAA,SACN,QAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA;AAAA;AAAA,UAGM,cAAA;EAAA,SACN,IAAA,EAAM,kBAAA;EAAA,SACN,MAAA;AAAA;AAAA,UAGM,eAAA;EAAA,SACN,MAAA;EAAA,SACA,QAAA,EAAU,kBAAA;AAAA;AAAA,UAGJ,cAAA;EAAA,SACN,EAAA;EAAA,SACA,IAAA;EAAA,SACA,IAAA,EAAM,eAAA;EAAA,SACN,QAAA;EAAA,SACA,WAAA;EAAA,SACA,MAAA,WAAiB,cAAA;AAAA;AAAA,UAGX,eAAA;EAAA,SACN,GAAA;EAAA,SACA,OAAA;EAAA,SACA,KAAA,EAAO,WAAA,SAAoB,cAAA;EAAA,SAC3B,OAAA,WAAkB,eAAA;AAAA;AAAA,UAGZ,qBAAA;EAAA,SACN,GAAA;EAAA,SACA,MAAA,GAAS,gBAAA;EAAA,SACT,KAAA,GAAQ,SAAA;AAAA;;;iBCtDH,mBAAA,CACd,SAAA,UACA,OAAA,GAAS,cAAA,GACR,eAAA;AAAA,iBA8Ba,uBAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA;EAAA,SACW,UAAA;AAAA;;;iBC8BG,iBAAA,CACd,SAAA,UACA,OAAA,GAAS,cAAA,GACR,eAAA;AAAA,iBAyJa,4BAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA;EAAA,SACW,MAAA,GAAS,gBAAA;AAAA;AAAA,iBAqCN,kBAAA,CACd,KAAA,EAAO,eAAA,EACP,MAAA,GAAQ,gBAAA;;;iBCxRM,mBAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA,GAAS,qBAAA;;;iBCTK,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,QAAA,EAAU,kBAAA;AAAA;;;KCJT,eAAA;;;KCAA,kBAAA;;;UCEK,cAAA;EAAA,SACN,IAAA,EAAM,kBAAA;EAAA,SACN,MAAA;AAAA;;;UCDM,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;;;iBCOH,mBAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA,GAAS,qBAAA;;;iBCZK,uBAAA,CACd,KAAA,EAAO,eAAA,EACP,OAAA;EAAA,SACW,UAAA;AAAA;;;iBC6BG,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 graphToSerializableReactTree, i as getReactUsageRoots, n as printReactUsageTree, o as analyzeDependencies, r as analyzeReactUsage, s as graphToSerializableTree, t as printDependencyTree } from "./tree-Qsy9Nmh9.mjs";
2
- export { analyzeDependencies, analyzeReactUsage, getReactUsageRoots, graphToSerializableReactTree, graphToSerializableTree, printDependencyTree, printReactUsageTree };
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-CWIt8V0Y.mjs";
2
+ export { analyzeDependencies, analyzeReactUsage, getFilteredUsages, getReactUsageEntries, getReactUsageRoots, graphToSerializableReactTree, graphToSerializableTree, printDependencyTree, printReactUsageTree };