foresthouse 1.1.0 → 1.2.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -1
- package/dist/cli.mjs +9 -65
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +84 -10
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/{react-xFA5HmqF.mjs → react-D0TO9XR2.mjs} +764 -41
- package/dist/react-D0TO9XR2.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/react-xFA5HmqF.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -29,6 +29,7 @@ bunx foresthouse --help
|
|
|
29
29
|
- Honors the nearest `tsconfig.json` or `jsconfig.json`, including `baseUrl` and `paths`
|
|
30
30
|
- Expands sibling workspace packages by default, including their own `tsconfig` alias rules
|
|
31
31
|
- Analyzes React component and hook usage trees from explicit entry files or inferred Next.js app and pages routes
|
|
32
|
+
- Shows React tree changes relative to a Git ref or range with `foresthouse react --diff`
|
|
32
33
|
- Reads `package.json` manifests to show package-level dependency trees for single packages and monorepos
|
|
33
34
|
- Shows dependency-tree changes relative to a Git ref or range with `foresthouse deps --diff`
|
|
34
35
|
- Prints an ASCII tree by default, or JSON with `--json`
|
|
@@ -58,7 +59,7 @@ Options:
|
|
|
58
59
|
### Commands
|
|
59
60
|
|
|
60
61
|
- `foresthouse import <entry-file>`: analyzes a JavaScript or TypeScript entry file and prints a dependency tree by following imports, re-exports, `require()`, and dynamic `import()`.
|
|
61
|
-
- `foresthouse react [entry-file]`: analyzes React component, hook, and render relationships and prints a React usage tree. It also supports automatic Next.js entry discovery with `--nextjs`.
|
|
62
|
+
- `foresthouse react [entry-file]`: analyzes React component, hook, and render relationships and prints a React usage tree. It also supports automatic Next.js entry discovery with `--nextjs`, plus Git-based tree diffs with `--diff`.
|
|
62
63
|
- `foresthouse deps <directory>`: reads `package.json` manifests and workspace structure from a package directory and prints a package dependency tree. Use `--diff` to show only changes relative to a Git ref or range.
|
|
63
64
|
|
|
64
65
|
### Example
|
|
@@ -107,6 +108,7 @@ Usage:
|
|
|
107
108
|
$ foresthouse react [entry-file] [options]
|
|
108
109
|
|
|
109
110
|
Options:
|
|
111
|
+
--diff <git-ref-or-range> Show only React tree changes relative to a Git revision or range.
|
|
110
112
|
--cwd <path> Working directory used for relative paths.
|
|
111
113
|
--config <path> Explicit tsconfig.json or jsconfig.json path.
|
|
112
114
|
--nextjs Infer Next.js page entries from app/ and pages/ when no entry is provided.
|
|
@@ -118,6 +120,19 @@ Options:
|
|
|
118
120
|
-h, --help Display this message
|
|
119
121
|
```
|
|
120
122
|
|
|
123
|
+
React diff mode compares React usage graphs rather than raw file text diffs. A single ref like `--diff HEAD~3` compares that tree to the current working tree, while ranges such as `HEAD~3..HEAD` or `origin/dev...HEAD` compare two committed Git trees.
|
|
124
|
+
|
|
125
|
+
Example React diff output:
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
~ apps/site/pages/index.tsx:21:45
|
|
129
|
+
~ <Home /> [component] (apps/site/pages/index.tsx)
|
|
130
|
+
└─ ~ <Hero /> [component] (apps/site/src/features/Main/Hero/Hero.tsx)
|
|
131
|
+
└─ + useForm() [hook] (react-hook-form)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
In this example, the page entry itself is unchanged as source text, but its reachable React graph changed because `<Hero />` started calling `useForm()`.
|
|
135
|
+
|
|
121
136
|
### `foresthouse deps --help`
|
|
122
137
|
|
|
123
138
|
Analyzes package-level dependency trees for both single-package projects and monorepos. Use `--diff` to show only dependency changes relative to a Git ref or range.
|
|
@@ -137,11 +152,129 @@ Common examples:
|
|
|
137
152
|
- `foresthouse import src/main.ts`
|
|
138
153
|
- `foresthouse import --entry src/main.ts --cwd test/fixtures/basic`
|
|
139
154
|
- `foresthouse react src/App.tsx`
|
|
155
|
+
- `foresthouse react src/App.tsx --diff origin/dev...HEAD`
|
|
156
|
+
- `foresthouse react pages/index.tsx --cwd . --diff HEAD~3..HEAD`
|
|
140
157
|
- `foresthouse react --nextjs --cwd .`
|
|
141
158
|
- `foresthouse deps .`
|
|
142
159
|
- `foresthouse deps ./packages/a`
|
|
143
160
|
- `foresthouse deps . --diff origin/dev...HEAD`
|
|
144
161
|
|
|
162
|
+
## Benchmark
|
|
163
|
+
|
|
164
|
+
<details>
|
|
165
|
+
<summary>Environment</summary>
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
+----------+--------------+
|
|
169
|
+
| Metric | Value |
|
|
170
|
+
+----------+--------------+
|
|
171
|
+
| Platform | darwin arm64 |
|
|
172
|
+
| Node | v24.14.0 |
|
|
173
|
+
| CPU | Apple M2 Max |
|
|
174
|
+
| Cores | 12 |
|
|
175
|
+
| Memory | 32.0 GB |
|
|
176
|
+
+----------+--------------+
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
</details>
|
|
180
|
+
|
|
181
|
+
<details>
|
|
182
|
+
<summary><code>foresthouse deps</code></summary>
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
+-----------+---------+-----------------+---------+---------+----------+----------+-------------------------------------------+
|
|
186
|
+
| Target | Options | Project | LOC | Status | Median | P95 | Note |
|
|
187
|
+
+-----------+---------+-----------------+---------+---------+----------+----------+-------------------------------------------+
|
|
188
|
+
| directory | (none) | supabase-studio | 493,979 | ok | 184.37ms | 216.11ms | |
|
|
189
|
+
| directory | (none) | cal-com-web | 218,466 | ok | 182.89ms | 196.84ms | |
|
|
190
|
+
| directory | (none) | outline-app | 87,658 | ok | 171.15ms | 172.83ms | |
|
|
191
|
+
| directory | (none) | dub-web | 345,285 | ok | 181.13ms | 186.52ms | |
|
|
192
|
+
| directory | (none) | commerce | 3,968 | skipped | - | - | Package manifest is missing a valid name. |
|
|
193
|
+
| directory | (none) | formbricks-web | 247,895 | ok | 171.78ms | 181.43ms | |
|
|
194
|
+
| directory | (none) | platforms | 1,308 | skipped | - | - | Package manifest is missing a valid name. |
|
|
195
|
+
| directory | (none) | t3-nextjs | 711 | ok | 173.51ms | 184.11ms | |
|
|
196
|
+
+-----------+---------+-----------------+---------+---------+----------+----------+-------------------------------------------+
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
</details>
|
|
200
|
+
|
|
201
|
+
<details>
|
|
202
|
+
<summary><code>foresthouse import</code></summary>
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
+--------+-----------------+-----------------+---------+--------+-----------+-----------+------+
|
|
206
|
+
| Target | Options | Project | LOC | Status | Median | P95 | Note |
|
|
207
|
+
+--------+-----------------+-----------------+---------+--------+-----------+-----------+------+
|
|
208
|
+
| entry | (none) | supabase-studio | 493,979 | ok | 1014.23ms | 1413.45ms | |
|
|
209
|
+
| entry | --project-only | supabase-studio | 493,979 | ok | 782.13ms | 838.64ms | |
|
|
210
|
+
| entry | --no-workspaces | supabase-studio | 493,979 | ok | 782.02ms | 833.00ms | |
|
|
211
|
+
| entry | (none) | cal-com-web | 218,466 | ok | 1042.08ms | 1109.40ms | |
|
|
212
|
+
| entry | --project-only | cal-com-web | 218,466 | ok | 284.00ms | 426.76ms | |
|
|
213
|
+
| entry | --no-workspaces | cal-com-web | 218,466 | ok | 250.25ms | 320.31ms | |
|
|
214
|
+
| entry | (none) | outline-app | 87,658 | ok | 600.36ms | 840.67ms | |
|
|
215
|
+
| entry | (none) | dub-web | 345,285 | ok | 259.89ms | 309.41ms | |
|
|
216
|
+
| entry | --project-only | dub-web | 345,285 | ok | 253.14ms | 254.04ms | |
|
|
217
|
+
| entry | --no-workspaces | dub-web | 345,285 | ok | 257.75ms | 259.07ms | |
|
|
218
|
+
| entry | (none) | commerce | 3,968 | ok | 199.93ms | 205.46ms | |
|
|
219
|
+
| entry | (none) | formbricks-web | 247,895 | ok | 333.93ms | 405.91ms | |
|
|
220
|
+
| entry | --project-only | formbricks-web | 247,895 | ok | 313.35ms | 342.89ms | |
|
|
221
|
+
| entry | --no-workspaces | formbricks-web | 247,895 | ok | 296.93ms | 355.40ms | |
|
|
222
|
+
| entry | (none) | platforms | 1,308 | ok | 189.81ms | 199.19ms | |
|
|
223
|
+
| entry | (none) | t3-nextjs | 711 | ok | 217.94ms | 247.73ms | |
|
|
224
|
+
| entry | --project-only | t3-nextjs | 711 | ok | 202.47ms | 215.69ms | |
|
|
225
|
+
| entry | --no-workspaces | t3-nextjs | 711 | ok | 200.04ms | 200.67ms | |
|
|
226
|
+
+--------+-----------------+-----------------+---------+--------+-----------+-----------+------+
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
</details>
|
|
230
|
+
|
|
231
|
+
<details>
|
|
232
|
+
<summary><code>foresthouse react</code></summary>
|
|
233
|
+
|
|
234
|
+
```
|
|
235
|
+
+--------+-----------------+-----------------+---------+--------+-----------+-----------+------+
|
|
236
|
+
| Target | Options | Project | LOC | Status | Median | P95 | Note |
|
|
237
|
+
+--------+-----------------+-----------------+---------+--------+-----------+-----------+------+
|
|
238
|
+
| entry | (none) | supabase-studio | 493,979 | ok | 1333.58ms | 1494.41ms | |
|
|
239
|
+
| entry | --project-only | supabase-studio | 493,979 | ok | 996.02ms | 1059.62ms | |
|
|
240
|
+
| entry | --no-workspaces | supabase-studio | 493,979 | ok | 1005.37ms | 1137.48ms | |
|
|
241
|
+
| nextjs | (none) | supabase-studio | 493,979 | ok | 3059.37ms | 3534.34ms | |
|
|
242
|
+
| nextjs | --project-only | supabase-studio | 493,979 | ok | 2602.21ms | 2716.90ms | |
|
|
243
|
+
| nextjs | --no-workspaces | supabase-studio | 493,979 | ok | 2716.09ms | 3007.85ms | |
|
|
244
|
+
| entry | (none) | cal-com-web | 218,466 | ok | 1832.85ms | 1859.41ms | |
|
|
245
|
+
| entry | --project-only | cal-com-web | 218,466 | ok | 244.83ms | 347.60ms | |
|
|
246
|
+
| entry | --no-workspaces | cal-com-web | 218,466 | ok | 242.31ms | 249.87ms | |
|
|
247
|
+
| nextjs | (none) | cal-com-web | 218,466 | ok | 4418.86ms | 5438.14ms | |
|
|
248
|
+
| nextjs | --project-only | cal-com-web | 218,466 | ok | 1400.78ms | 1498.16ms | |
|
|
249
|
+
| nextjs | --no-workspaces | cal-com-web | 218,466 | ok | 1405.46ms | 1452.13ms | |
|
|
250
|
+
| entry | (none) | outline-app | 87,658 | ok | 931.17ms | 946.86ms | |
|
|
251
|
+
| entry | (none) | dub-web | 345,285 | ok | 265.47ms | 273.70ms | |
|
|
252
|
+
| entry | --project-only | dub-web | 345,285 | ok | 266.99ms | 268.79ms | |
|
|
253
|
+
| entry | --no-workspaces | dub-web | 345,285 | ok | 265.71ms | 276.33ms | |
|
|
254
|
+
| nextjs | (none) | dub-web | 345,285 | ok | 1568.90ms | 1964.85ms | |
|
|
255
|
+
| nextjs | --project-only | dub-web | 345,285 | ok | 1589.73ms | 1624.88ms | |
|
|
256
|
+
| nextjs | --no-workspaces | dub-web | 345,285 | ok | 1507.13ms | 1859.47ms | |
|
|
257
|
+
| entry | (none) | commerce | 3,968 | ok | 213.42ms | 218.10ms | |
|
|
258
|
+
| nextjs | (none) | commerce | 3,968 | ok | 222.09ms | 227.03ms | |
|
|
259
|
+
| entry | (none) | formbricks-web | 247,895 | ok | 381.40ms | 391.71ms | |
|
|
260
|
+
| entry | --project-only | formbricks-web | 247,895 | ok | 321.40ms | 331.36ms | |
|
|
261
|
+
| entry | --no-workspaces | formbricks-web | 247,895 | ok | 323.95ms | 327.12ms | |
|
|
262
|
+
| nextjs | (none) | formbricks-web | 247,895 | ok | 1118.63ms | 1303.93ms | |
|
|
263
|
+
| nextjs | --project-only | formbricks-web | 247,895 | ok | 1041.12ms | 1062.49ms | |
|
|
264
|
+
| nextjs | --no-workspaces | formbricks-web | 247,895 | ok | 1055.21ms | 1107.24ms | |
|
|
265
|
+
| entry | (none) | platforms | 1,308 | ok | 201.30ms | 205.59ms | |
|
|
266
|
+
| nextjs | (none) | platforms | 1,308 | ok | 202.98ms | 209.47ms | |
|
|
267
|
+
| entry | (none) | t3-nextjs | 711 | ok | 231.38ms | 234.95ms | |
|
|
268
|
+
| entry | --project-only | t3-nextjs | 711 | ok | 212.96ms | 214.89ms | |
|
|
269
|
+
| entry | --no-workspaces | t3-nextjs | 711 | ok | 212.09ms | 218.98ms | |
|
|
270
|
+
| nextjs | (none) | t3-nextjs | 711 | ok | 232.97ms | 233.53ms | |
|
|
271
|
+
| nextjs | --project-only | t3-nextjs | 711 | ok | 211.67ms | 215.33ms | |
|
|
272
|
+
| nextjs | --no-workspaces | t3-nextjs | 711 | ok | 211.65ms | 215.49ms | |
|
|
273
|
+
+--------+-----------------+-----------------+---------+--------+-----------+-----------+------+
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
</details>
|
|
277
|
+
|
|
145
278
|
## Development
|
|
146
279
|
|
|
147
280
|
```bash
|
|
@@ -154,3 +287,4 @@ pnpm run check
|
|
|
154
287
|
|
|
155
288
|
- Unit tests live next to source files as `src/**/*.spec.ts`.
|
|
156
289
|
- End-to-end command tests live under `e2e/`.
|
|
290
|
+
- Benchmarks live next to analyzers as `src/**/*.bench.ts` and run with `pnpm exec vitest bench --run --config vitest.bench.config.ts`.
|
package/dist/cli.mjs
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { a as
|
|
2
|
+
import { _ as analyzeDependencies, a as graphToSerializablePackageTree, c as printDependencyTree, d as analyzeReactUsageDiff, g as resolveReactEntryFiles, h as analyzeReactUsage, i as diffGraphToSerializablePackageTree, l as printPackageDependencyDiffTree, n as graphToSerializableReactTree, o as printReactUsageDiffTree, r as graphToSerializableTree, s as printReactUsageTree, t as diffGraphToSerializableReactTree, u as printPackageDependencyTree, v as analyzePackageDependencyDiff, y as analyzePackageDependencies } from "./react-D0TO9XR2.mjs";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
|
-
import fs from "node:fs";
|
|
5
|
-
import path from "node:path";
|
|
6
4
|
import process$1 from "node:process";
|
|
7
5
|
import { cac } from "cac";
|
|
8
6
|
//#region src/commands/base.ts
|
|
@@ -70,76 +68,18 @@ var ImportCommand = class extends BaseCommand {
|
|
|
70
68
|
}
|
|
71
69
|
};
|
|
72
70
|
//#endregion
|
|
73
|
-
//#region src/app/react-entry-files.ts
|
|
74
|
-
const NEXT_JS_ENTRY_ROOTS = [
|
|
75
|
-
"pages",
|
|
76
|
-
"app",
|
|
77
|
-
path.join("src", "pages"),
|
|
78
|
-
path.join("src", "app")
|
|
79
|
-
];
|
|
80
|
-
function resolveReactEntryFiles(options) {
|
|
81
|
-
if (options.entryFile !== void 0) return [options.entryFile];
|
|
82
|
-
if (!options.nextjs) throw new Error("Missing React entry file. Use `foresthouse react <entry-file>` or `foresthouse react --nextjs`.");
|
|
83
|
-
return discoverNextJsPageEntries(options.cwd);
|
|
84
|
-
}
|
|
85
|
-
function discoverNextJsPageEntries(cwd) {
|
|
86
|
-
const effectiveCwd = path.resolve(cwd ?? process.cwd());
|
|
87
|
-
const entries = /* @__PURE__ */ new Set();
|
|
88
|
-
collectPagesRouterEntries(path.join(effectiveCwd, "pages"), effectiveCwd, entries);
|
|
89
|
-
collectAppRouterEntries(path.join(effectiveCwd, "app"), effectiveCwd, entries);
|
|
90
|
-
collectPagesRouterEntries(path.join(effectiveCwd, "src", "pages"), effectiveCwd, entries);
|
|
91
|
-
collectAppRouterEntries(path.join(effectiveCwd, "src", "app"), effectiveCwd, entries);
|
|
92
|
-
const resolvedEntries = [...entries].sort();
|
|
93
|
-
if (resolvedEntries.length > 0) return resolvedEntries;
|
|
94
|
-
const searchedRoots = NEXT_JS_ENTRY_ROOTS.map((root) => `\`${root}/\``).join(", ");
|
|
95
|
-
throw new Error(`No Next.js page entries found. Searched ${searchedRoots} relative to ${effectiveCwd}.`);
|
|
96
|
-
}
|
|
97
|
-
function collectPagesRouterEntries(rootDirectory, cwd, entries) {
|
|
98
|
-
walkDirectory(rootDirectory, (filePath, relativePath) => {
|
|
99
|
-
if (!isSourceCodeFile(filePath) || filePath.endsWith(".d.ts")) return;
|
|
100
|
-
if (relativePath.split(path.sep)[0] === "api") return;
|
|
101
|
-
if (path.basename(filePath).startsWith("_")) return;
|
|
102
|
-
entries.add(path.relative(cwd, filePath));
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
function collectAppRouterEntries(rootDirectory, cwd, entries) {
|
|
106
|
-
walkDirectory(rootDirectory, (filePath) => {
|
|
107
|
-
if (!isSourceCodeFile(filePath) || filePath.endsWith(".d.ts")) return;
|
|
108
|
-
const extension = path.extname(filePath);
|
|
109
|
-
if (path.basename(filePath, extension) !== "page") return;
|
|
110
|
-
entries.add(path.relative(cwd, filePath));
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
function walkDirectory(rootDirectory, visitor) {
|
|
114
|
-
if (!fs.existsSync(rootDirectory)) return;
|
|
115
|
-
const stack = [rootDirectory];
|
|
116
|
-
while (stack.length > 0) {
|
|
117
|
-
const directory = stack.pop();
|
|
118
|
-
if (directory === void 0) continue;
|
|
119
|
-
const directoryEntries = fs.readdirSync(directory, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name));
|
|
120
|
-
for (let index = directoryEntries.length - 1; index >= 0; index -= 1) {
|
|
121
|
-
const entry = directoryEntries[index];
|
|
122
|
-
if (entry === void 0) continue;
|
|
123
|
-
const entryPath = path.join(directory, entry.name);
|
|
124
|
-
if (entry.isDirectory()) {
|
|
125
|
-
stack.push(entryPath);
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
if (!entry.isFile()) continue;
|
|
129
|
-
visitor(entryPath, path.relative(rootDirectory, entryPath));
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
//#endregion
|
|
134
71
|
//#region src/commands/react.ts
|
|
135
72
|
var ReactCommand = class extends BaseCommand {
|
|
136
73
|
analyze() {
|
|
74
|
+
if (this.options.diff !== void 0) return analyzeReactUsageDiff(this.options);
|
|
137
75
|
return analyzeReactUsage(resolveReactEntryFiles(this.options), this.getAnalyzeOptions());
|
|
138
76
|
}
|
|
139
77
|
serialize(graph) {
|
|
78
|
+
if (isReactUsageDiffGraph(graph)) return diffGraphToSerializableReactTree(graph);
|
|
140
79
|
return graphToSerializableReactTree(graph, { filter: this.getFilter() });
|
|
141
80
|
}
|
|
142
81
|
render(graph) {
|
|
82
|
+
if (isReactUsageDiffGraph(graph)) return printReactUsageDiffTree(graph);
|
|
143
83
|
return printReactUsageTree(graph, {
|
|
144
84
|
cwd: this.options.cwd ?? graph.cwd,
|
|
145
85
|
filter: this.getFilter()
|
|
@@ -155,6 +95,9 @@ var ReactCommand = class extends BaseCommand {
|
|
|
155
95
|
return this.options.filter;
|
|
156
96
|
}
|
|
157
97
|
};
|
|
98
|
+
function isReactUsageDiffGraph(graph) {
|
|
99
|
+
return "kind" in graph && graph.kind === "react-usage-diff";
|
|
100
|
+
}
|
|
158
101
|
//#endregion
|
|
159
102
|
//#region src/app/run.ts
|
|
160
103
|
function runCli(options) {
|
|
@@ -206,7 +149,7 @@ var CliMain = class {
|
|
|
206
149
|
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("--unused", "Include imports that are never referenced.").option("--json", "Print the dependency tree as JSON.").action((entryFile, rawOptions) => {
|
|
207
150
|
runCli(normalizeImportCliOptions(entryFile, rawOptions));
|
|
208
151
|
});
|
|
209
|
-
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("--nextjs", "Infer Next.js page entries from app/ and pages/ when no entry is provided.").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) => {
|
|
152
|
+
cli.command("react [entry-file]", "Analyze React usage from an entry file.").usage("react [entry-file] [options]").option("--diff <git-ref-or-range>", "Show only React tree changes relative to a Git revision or range.").option("--cwd <path>", "Working directory used for relative paths.").option("--config <path>", "Explicit tsconfig.json or jsconfig.json path.").option("--nextjs", "Infer Next.js page entries from app/ and pages/ when no entry is provided.").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) => {
|
|
210
153
|
runCli(normalizeReactCliOptions(entryFile, rawOptions));
|
|
211
154
|
});
|
|
212
155
|
cli.help();
|
|
@@ -259,6 +202,7 @@ function normalizeReactCliOptions(entryFile, options) {
|
|
|
259
202
|
return {
|
|
260
203
|
command: "react",
|
|
261
204
|
entryFile: resolveReactEntryFile(entryFile, options.nextjs),
|
|
205
|
+
diff: options.diff,
|
|
262
206
|
cwd: options.cwd,
|
|
263
207
|
configPath: options.config,
|
|
264
208
|
expandWorkspaces: options.workspaces !== false,
|
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":["process"],"sources":["../src/commands/base.ts","../src/commands/deps.ts","../src/commands/import.ts","../src/app/react-entry-files.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 { analyzePackageDependencyDiff } from '../analyzers/deps/diff.js'\nimport { analyzePackageDependencies } from '../analyzers/deps/index.js'\nimport type { DepsCliOptions } from '../app/args.js'\nimport {\n printPackageDependencyDiffTree,\n printPackageDependencyTree,\n} from '../output/ascii/deps.js'\nimport {\n diffGraphToSerializablePackageTree,\n graphToSerializablePackageTree,\n} from '../output/json/deps.js'\nimport type { PackageDependencyDiffGraph } from '../types/package-dependency-diff-graph.js'\nimport type { PackageDependencyGraph } from '../types/package-dependency-graph.js'\nimport { BaseCommand } from './base.js'\n\nexport class DepsCommand extends BaseCommand<\n PackageDependencyGraph | PackageDependencyDiffGraph,\n DepsCliOptions\n> {\n protected analyze(): PackageDependencyGraph | PackageDependencyDiffGraph {\n if (this.options.diff !== undefined) {\n return analyzePackageDependencyDiff(\n this.options.directory,\n this.options.diff,\n )\n }\n\n return analyzePackageDependencies(this.options.directory)\n }\n\n protected serialize(\n graph: PackageDependencyGraph | PackageDependencyDiffGraph,\n ): object {\n if (isPackageDependencyDiffGraph(graph)) {\n return diffGraphToSerializablePackageTree(graph)\n }\n\n return graphToSerializablePackageTree(graph)\n }\n\n protected render(\n graph: PackageDependencyGraph | PackageDependencyDiffGraph,\n ): string {\n if (isPackageDependencyDiffGraph(graph)) {\n return printPackageDependencyDiffTree(graph)\n }\n\n return printPackageDependencyTree(graph)\n }\n}\n\nfunction isPackageDependencyDiffGraph(\n graph: PackageDependencyGraph | PackageDependencyDiffGraph,\n): graph is PackageDependencyDiffGraph {\n return 'root' in graph\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, {\n ...this.getAnalyzeOptions(),\n trackUnusedImports: !this.options.omitUnused,\n })\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 fs from 'node:fs'\nimport path from 'node:path'\nimport { isSourceCodeFile } from '../utils/is-source-code-file.js'\nimport type { ReactCliOptions } from './args.js'\n\nconst NEXT_JS_ENTRY_ROOTS = [\n 'pages',\n 'app',\n path.join('src', 'pages'),\n path.join('src', 'app'),\n]\n\nexport function resolveReactEntryFiles(options: ReactCliOptions): string[] {\n if (options.entryFile !== undefined) {\n return [options.entryFile]\n }\n\n if (!options.nextjs) {\n throw new Error(\n 'Missing React entry file. Use `foresthouse react <entry-file>` or `foresthouse react --nextjs`.',\n )\n }\n\n return discoverNextJsPageEntries(options.cwd)\n}\n\nexport function discoverNextJsPageEntries(cwd?: string): string[] {\n const effectiveCwd = path.resolve(cwd ?? process.cwd())\n const entries = new Set<string>()\n\n collectPagesRouterEntries(\n path.join(effectiveCwd, 'pages'),\n effectiveCwd,\n entries,\n )\n collectAppRouterEntries(path.join(effectiveCwd, 'app'), effectiveCwd, entries)\n collectPagesRouterEntries(\n path.join(effectiveCwd, 'src', 'pages'),\n effectiveCwd,\n entries,\n )\n collectAppRouterEntries(\n path.join(effectiveCwd, 'src', 'app'),\n effectiveCwd,\n entries,\n )\n\n const resolvedEntries = [...entries].sort()\n if (resolvedEntries.length > 0) {\n return resolvedEntries\n }\n\n const searchedRoots = NEXT_JS_ENTRY_ROOTS.map((root) => `\\`${root}/\\``).join(\n ', ',\n )\n throw new Error(\n `No Next.js page entries found. Searched ${searchedRoots} relative to ${effectiveCwd}.`,\n )\n}\n\nfunction collectPagesRouterEntries(\n rootDirectory: string,\n cwd: string,\n entries: Set<string>,\n): void {\n walkDirectory(rootDirectory, (filePath, relativePath) => {\n if (!isSourceCodeFile(filePath) || filePath.endsWith('.d.ts')) {\n return\n }\n\n const segments = relativePath.split(path.sep)\n if (segments[0] === 'api') {\n return\n }\n\n const baseName = path.basename(filePath)\n if (baseName.startsWith('_')) {\n return\n }\n\n entries.add(path.relative(cwd, filePath))\n })\n}\n\nfunction collectAppRouterEntries(\n rootDirectory: string,\n cwd: string,\n entries: Set<string>,\n): void {\n walkDirectory(rootDirectory, (filePath) => {\n if (!isSourceCodeFile(filePath) || filePath.endsWith('.d.ts')) {\n return\n }\n\n const extension = path.extname(filePath)\n const baseName = path.basename(filePath, extension)\n if (baseName !== 'page') {\n return\n }\n\n entries.add(path.relative(cwd, filePath))\n })\n}\n\nfunction walkDirectory(\n rootDirectory: string,\n visitor: (filePath: string, relativePath: string) => void,\n): void {\n if (!fs.existsSync(rootDirectory)) {\n return\n }\n\n const stack = [rootDirectory]\n\n while (stack.length > 0) {\n const directory = stack.pop()\n if (directory === undefined) {\n continue\n }\n\n const directoryEntries = fs\n .readdirSync(directory, { withFileTypes: true })\n .sort((left, right) => left.name.localeCompare(right.name))\n\n for (let index = directoryEntries.length - 1; index >= 0; index -= 1) {\n const entry = directoryEntries[index]\n if (entry === undefined) {\n continue\n }\n\n const entryPath = path.join(directory, entry.name)\n if (entry.isDirectory()) {\n stack.push(entryPath)\n continue\n }\n\n if (!entry.isFile()) {\n continue\n }\n\n visitor(entryPath, path.relative(rootDirectory, entryPath))\n }\n }\n}\n","import { analyzeReactUsage } from '../analyzers/react/index.js'\nimport type { ReactCliOptions } from '../app/args.js'\nimport { resolveReactEntryFiles } from '../app/react-entry-files.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(\n resolveReactEntryFiles(this.options),\n this.getAnalyzeOptions(),\n )\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 { DepsCommand } from '../commands/deps.js'\nimport { 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 === 'deps') {\n return new DepsCommand(this.options)\n }\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 {\n DepsCliOptions,\n ImportCliOptions,\n ReactCliOptions,\n} 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 'deps <directory>',\n 'Analyze package.json dependencies from a package directory.',\n )\n .usage('deps <directory> [options]')\n .option(\n '--diff <git-ref-or-range>',\n 'Show only dependency-tree changes relative to a Git revision or range.',\n )\n .option('--json', 'Print the package tree as JSON.')\n .action((directory: string, rawOptions: ParsedDepsCliOptions) => {\n runCli(normalizeDepsCliOptions(directory, rawOptions))\n })\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('--unused', 'Include 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 '--nextjs',\n 'Infer Next.js page entries from app/ and pages/ when no entry is provided.',\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(\n (entryFile: string | undefined, rawOptions: ParsedReactCliOptions) => {\n runCli(normalizeReactCliOptions(entryFile, rawOptions))\n },\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 (\n firstArgument === 'deps' ||\n firstArgument === 'import' ||\n firstArgument === 'react'\n ) {\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 ParsedDepsCliOptions {\n readonly diff?: 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 readonly nextjs?: boolean\n readonly builtin?: boolean\n}\n\nfunction normalizeDepsCliOptions(\n directory: string,\n options: ParsedDepsCliOptions,\n): DepsCliOptions {\n return {\n command: 'deps',\n directory,\n diff: options.diff,\n cwd: undefined,\n configPath: undefined,\n expandWorkspaces: true,\n projectOnly: false,\n json: options.json === true,\n }\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 !== true,\n json: options.json === true,\n }\n}\n\nfunction normalizeReactCliOptions(\n entryFile: string | undefined,\n options: ParsedReactCliOptions,\n): ReactCliOptions {\n return {\n command: 'react',\n entryFile: resolveReactEntryFile(entryFile, options.nextjs),\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 nextjs: options.nextjs === true,\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\nfunction resolveReactEntryFile(\n entryFile: string | undefined,\n nextjs: boolean | undefined,\n): string | undefined {\n if (entryFile !== undefined) {\n return entryFile\n }\n\n if (nextjs === true) {\n return undefined\n }\n\n throw new Error(\n 'Missing React entry file. Use `foresthouse react <entry-file>` or `foresthouse react --nextjs`.',\n )\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;GAC3C,kBAAkB,KAAK,QAAQ;GAC/B,aAAa,KAAK,QAAQ;GAC3B;;;;;ACnBL,IAAa,cAAb,cAAiC,YAG/B;CACA,UAAyE;AACvE,MAAI,KAAK,QAAQ,SAAS,KAAA,EACxB,QAAO,6BACL,KAAK,QAAQ,WACb,KAAK,QAAQ,KACd;AAGH,SAAO,2BAA2B,KAAK,QAAQ,UAAU;;CAG3D,UACE,OACQ;AACR,MAAI,6BAA6B,MAAM,CACrC,QAAO,mCAAmC,MAAM;AAGlD,SAAO,+BAA+B,MAAM;;CAG9C,OACE,OACQ;AACR,MAAI,6BAA6B,MAAM,CACrC,QAAO,+BAA+B,MAAM;AAG9C,SAAO,2BAA2B,MAAM;;;AAI5C,SAAS,6BACP,OACqC;AACrC,QAAO,UAAU;;;;AC/CnB,IAAa,gBAAb,cAAmC,YAGjC;CACA,UAAqC;AACnC,SAAO,oBAAoB,KAAK,QAAQ,WAAW;GACjD,GAAG,KAAK,mBAAmB;GAC3B,oBAAoB,CAAC,KAAK,QAAQ;GACnC,CAAC;;CAGJ,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;;;;;ACxBN,MAAM,sBAAsB;CAC1B;CACA;CACA,KAAK,KAAK,OAAO,QAAQ;CACzB,KAAK,KAAK,OAAO,MAAM;CACxB;AAED,SAAgB,uBAAuB,SAAoC;AACzE,KAAI,QAAQ,cAAc,KAAA,EACxB,QAAO,CAAC,QAAQ,UAAU;AAG5B,KAAI,CAAC,QAAQ,OACX,OAAM,IAAI,MACR,kGACD;AAGH,QAAO,0BAA0B,QAAQ,IAAI;;AAG/C,SAAgB,0BAA0B,KAAwB;CAChE,MAAM,eAAe,KAAK,QAAQ,OAAO,QAAQ,KAAK,CAAC;CACvD,MAAM,0BAAU,IAAI,KAAa;AAEjC,2BACE,KAAK,KAAK,cAAc,QAAQ,EAChC,cACA,QACD;AACD,yBAAwB,KAAK,KAAK,cAAc,MAAM,EAAE,cAAc,QAAQ;AAC9E,2BACE,KAAK,KAAK,cAAc,OAAO,QAAQ,EACvC,cACA,QACD;AACD,yBACE,KAAK,KAAK,cAAc,OAAO,MAAM,EACrC,cACA,QACD;CAED,MAAM,kBAAkB,CAAC,GAAG,QAAQ,CAAC,MAAM;AAC3C,KAAI,gBAAgB,SAAS,EAC3B,QAAO;CAGT,MAAM,gBAAgB,oBAAoB,KAAK,SAAS,KAAK,KAAK,KAAK,CAAC,KACtE,KACD;AACD,OAAM,IAAI,MACR,2CAA2C,cAAc,eAAe,aAAa,GACtF;;AAGH,SAAS,0BACP,eACA,KACA,SACM;AACN,eAAc,gBAAgB,UAAU,iBAAiB;AACvD,MAAI,CAAC,iBAAiB,SAAS,IAAI,SAAS,SAAS,QAAQ,CAC3D;AAIF,MADiB,aAAa,MAAM,KAAK,IAAI,CAChC,OAAO,MAClB;AAIF,MADiB,KAAK,SAAS,SAAS,CAC3B,WAAW,IAAI,CAC1B;AAGF,UAAQ,IAAI,KAAK,SAAS,KAAK,SAAS,CAAC;GACzC;;AAGJ,SAAS,wBACP,eACA,KACA,SACM;AACN,eAAc,gBAAgB,aAAa;AACzC,MAAI,CAAC,iBAAiB,SAAS,IAAI,SAAS,SAAS,QAAQ,CAC3D;EAGF,MAAM,YAAY,KAAK,QAAQ,SAAS;AAExC,MADiB,KAAK,SAAS,UAAU,UAAU,KAClC,OACf;AAGF,UAAQ,IAAI,KAAK,SAAS,KAAK,SAAS,CAAC;GACzC;;AAGJ,SAAS,cACP,eACA,SACM;AACN,KAAI,CAAC,GAAG,WAAW,cAAc,CAC/B;CAGF,MAAM,QAAQ,CAAC,cAAc;AAE7B,QAAO,MAAM,SAAS,GAAG;EACvB,MAAM,YAAY,MAAM,KAAK;AAC7B,MAAI,cAAc,KAAA,EAChB;EAGF,MAAM,mBAAmB,GACtB,YAAY,WAAW,EAAE,eAAe,MAAM,CAAC,CAC/C,MAAM,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,KAAK,CAAC;AAE7D,OAAK,IAAI,QAAQ,iBAAiB,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;GACpE,MAAM,QAAQ,iBAAiB;AAC/B,OAAI,UAAU,KAAA,EACZ;GAGF,MAAM,YAAY,KAAK,KAAK,WAAW,MAAM,KAAK;AAClD,OAAI,MAAM,aAAa,EAAE;AACvB,UAAM,KAAK,UAAU;AACrB;;AAGF,OAAI,CAAC,MAAM,QAAQ,CACjB;AAGF,WAAQ,WAAW,KAAK,SAAS,eAAe,UAAU,CAAC;;;;;;AClIjE,IAAa,eAAb,cAAkC,YAGhC;CACA,UAAqC;AACnC,SAAO,kBACL,uBAAuB,KAAK,QAAQ,EACpC,KAAK,mBAAmB,CACzB;;CAGH,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,oBAA8C;AAC5C,SAAO;GACL,GAAG,MAAM,mBAAmB;GAC5B,iBAAiB,KAAK,QAAQ;GAC/B;;CAGH,YAAsC;AACpC,SAAO,KAAK,QAAQ;;;;;ACrCxB,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,OAC3B,QAAO,IAAI,YAAY,KAAK,QAAQ;AAGtC,MAAI,KAAK,QAAQ,YAAY,QAC3B,QAAO,IAAI,aAAa,KAAK,QAAQ;AAGvC,SAAO,IAAI,cAAc,KAAK,QAAQ;;;;;ACf1C,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,oBACA,8DACD,CACA,MAAM,6BAA6B,CACnC,OACC,6BACA,yEACD,CACA,OAAO,UAAU,kCAAkC,CACnD,QAAQ,WAAmB,eAAqC;AAC/D,UAAO,wBAAwB,WAAW,WAAW,CAAC;IACtD;AAEJ,MACG,QACC,uBACA,uDACD,CACA,MAAM,gCAAgC,CACtC,OAAO,kBAAkB,yBAAyB,CAClD,OAAO,gBAAgB,6CAA6C,CACpE,OACC,mBACA,gDACD,CACA,OACC,uBACA,mDACD,CACA,OACC,mBACA,iEACD,CACA,OACC,kBACA,2EACD,CACA,OAAO,YAAY,6CAA6C,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,YACA,6EACD,CACA,OACC,mBACA,4DACD,CACA,OAAO,aAAa,iDAAiD,CACrE,OACC,mBACA,iEACD,CACA,OACC,kBACA,2EACD,CACA,OAAO,UAAU,sCAAsC,CACvD,QACE,WAA+B,eAAsC;AACpE,UAAO,yBAAyB,WAAW,WAAW,CAAC;IAE1D;AAEH,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,MACE,kBAAkB,UAClB,kBAAkB,YAClB,kBAAkB,QAElB;AAGF,QAAM,IAAI,MAAM,qBAAqB,cAAc,IAAI;;CAGzD,gBAAkC;AAChC,SAAO;GAAC;GAAQ;GAAe,GAAG,KAAK;GAAK;;;AA6BhD,SAAS,wBACP,WACA,SACgB;AAChB,QAAO;EACL,SAAS;EACT;EACA,MAAM,QAAQ;EACd,KAAK,KAAA;EACL,YAAY,KAAA;EACZ,kBAAkB;EAClB,aAAa;EACb,MAAM,QAAQ,SAAS;EACxB;;AAGH,SAAS,0BACP,WACA,SACkB;AAClB,QAAO;EACL,SAAS;EACT,WAAW,uBAAuB,WAAW,QAAQ,MAAM;EAC3D,KAAK,QAAQ;EACb,YAAY,QAAQ;EACpB,kBAAkB,QAAQ,eAAe;EACzC,aAAa,QAAQ,gBAAgB;EACrC,kBAAkB,QAAQ,qBAAqB;EAC/C,YAAY,QAAQ,WAAW;EAC/B,MAAM,QAAQ,SAAS;EACxB;;AAGH,SAAS,yBACP,WACA,SACiB;AACjB,QAAO;EACL,SAAS;EACT,WAAW,sBAAsB,WAAW,QAAQ,OAAO;EAC3D,KAAK,QAAQ;EACb,YAAY,QAAQ;EACpB,kBAAkB,QAAQ,eAAe;EACzC,aAAa,QAAQ,gBAAgB;EACrC,MAAM,QAAQ,SAAS;EACvB,QAAQ,qBAAqB,QAAQ,OAAO;EAC5C,QAAQ,QAAQ,WAAW;EAC3B,iBAAiB,QAAQ,YAAY;EACtC;;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,UAAU,WAAW,UAC5D,QAAO;AAGT,OAAM,IAAI,MAAM,yBAAyB,SAAS;;AAGpD,SAAS,sBACP,WACA,QACoB;AACpB,KAAI,cAAc,KAAA,EAChB,QAAO;AAGT,KAAI,WAAW,KACb;AAGF,OAAM,IAAI,MACR,kGACD;;;;AC9RH,MAAM,EAAE,YADQ,cAAc,OAAO,KAAK,IAAI,CAClB,kBAAkB;AAE9C,KAAK,QAAQ"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":["process"],"sources":["../src/commands/base.ts","../src/commands/deps.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 { analyzePackageDependencyDiff } from '../analyzers/deps/diff.js'\nimport { analyzePackageDependencies } from '../analyzers/deps/index.js'\nimport type { DepsCliOptions } from '../app/args.js'\nimport {\n printPackageDependencyDiffTree,\n printPackageDependencyTree,\n} from '../output/ascii/deps.js'\nimport {\n diffGraphToSerializablePackageTree,\n graphToSerializablePackageTree,\n} from '../output/json/deps.js'\nimport type { PackageDependencyDiffGraph } from '../types/package-dependency-diff-graph.js'\nimport type { PackageDependencyGraph } from '../types/package-dependency-graph.js'\nimport { BaseCommand } from './base.js'\n\nexport class DepsCommand extends BaseCommand<\n PackageDependencyGraph | PackageDependencyDiffGraph,\n DepsCliOptions\n> {\n protected analyze(): PackageDependencyGraph | PackageDependencyDiffGraph {\n if (this.options.diff !== undefined) {\n return analyzePackageDependencyDiff(\n this.options.directory,\n this.options.diff,\n )\n }\n\n return analyzePackageDependencies(this.options.directory)\n }\n\n protected serialize(\n graph: PackageDependencyGraph | PackageDependencyDiffGraph,\n ): object {\n if (isPackageDependencyDiffGraph(graph)) {\n return diffGraphToSerializablePackageTree(graph)\n }\n\n return graphToSerializablePackageTree(graph)\n }\n\n protected render(\n graph: PackageDependencyGraph | PackageDependencyDiffGraph,\n ): string {\n if (isPackageDependencyDiffGraph(graph)) {\n return printPackageDependencyDiffTree(graph)\n }\n\n return printPackageDependencyTree(graph)\n }\n}\n\nfunction isPackageDependencyDiffGraph(\n graph: PackageDependencyGraph | PackageDependencyDiffGraph,\n): graph is PackageDependencyDiffGraph {\n return 'root' in graph\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, {\n ...this.getAnalyzeOptions(),\n trackUnusedImports: !this.options.omitUnused,\n })\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 { analyzeReactUsageDiff } from '../analyzers/react/diff.js'\nimport { analyzeReactUsage } from '../analyzers/react/index.js'\nimport type { ReactCliOptions } from '../app/args.js'\nimport { resolveReactEntryFiles } from '../app/react-entry-files.js'\nimport {\n printReactUsageDiffTree,\n printReactUsageTree,\n} from '../output/ascii/react.js'\nimport {\n diffGraphToSerializableReactTree,\n graphToSerializableReactTree,\n} from '../output/json/react.js'\nimport type { AnalyzeOptions } from '../types/analyze-options.js'\nimport type { ReactUsageDiffGraph } from '../types/react-usage-diff-graph.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 | ReactUsageDiffGraph,\n ReactCliOptions\n> {\n protected analyze(): ReactUsageGraph | ReactUsageDiffGraph {\n if (this.options.diff !== undefined) {\n return analyzeReactUsageDiff(this.options)\n }\n\n return analyzeReactUsage(\n resolveReactEntryFiles(this.options),\n this.getAnalyzeOptions(),\n )\n }\n\n protected serialize(graph: ReactUsageGraph | ReactUsageDiffGraph): object {\n if (isReactUsageDiffGraph(graph)) {\n return diffGraphToSerializableReactTree(graph)\n }\n\n return graphToSerializableReactTree(graph, {\n filter: this.getFilter(),\n })\n }\n\n protected render(graph: ReactUsageGraph | ReactUsageDiffGraph): string {\n if (isReactUsageDiffGraph(graph)) {\n return printReactUsageDiffTree(graph)\n }\n\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\nfunction isReactUsageDiffGraph(\n graph: ReactUsageGraph | ReactUsageDiffGraph,\n): graph is ReactUsageDiffGraph {\n return 'kind' in graph && graph.kind === 'react-usage-diff'\n}\n","import { DepsCommand } from '../commands/deps.js'\nimport { 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 === 'deps') {\n return new DepsCommand(this.options)\n }\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 {\n DepsCliOptions,\n ImportCliOptions,\n ReactCliOptions,\n} 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 'deps <directory>',\n 'Analyze package.json dependencies from a package directory.',\n )\n .usage('deps <directory> [options]')\n .option(\n '--diff <git-ref-or-range>',\n 'Show only dependency-tree changes relative to a Git revision or range.',\n )\n .option('--json', 'Print the package tree as JSON.')\n .action((directory: string, rawOptions: ParsedDepsCliOptions) => {\n runCli(normalizeDepsCliOptions(directory, rawOptions))\n })\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('--unused', 'Include 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(\n '--diff <git-ref-or-range>',\n 'Show only React tree changes relative to a Git revision or range.',\n )\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 '--nextjs',\n 'Infer Next.js page entries from app/ and pages/ when no entry is provided.',\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(\n (entryFile: string | undefined, rawOptions: ParsedReactCliOptions) => {\n runCli(normalizeReactCliOptions(entryFile, rawOptions))\n },\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 (\n firstArgument === 'deps' ||\n firstArgument === 'import' ||\n firstArgument === 'react'\n ) {\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 ParsedDepsCliOptions {\n readonly diff?: 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 diff?: string\n readonly filter?: string\n readonly nextjs?: boolean\n readonly builtin?: boolean\n}\n\nfunction normalizeDepsCliOptions(\n directory: string,\n options: ParsedDepsCliOptions,\n): DepsCliOptions {\n return {\n command: 'deps',\n directory,\n diff: options.diff,\n cwd: undefined,\n configPath: undefined,\n expandWorkspaces: true,\n projectOnly: false,\n json: options.json === true,\n }\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 !== true,\n json: options.json === true,\n }\n}\n\nfunction normalizeReactCliOptions(\n entryFile: string | undefined,\n options: ParsedReactCliOptions,\n): ReactCliOptions {\n return {\n command: 'react',\n entryFile: resolveReactEntryFile(entryFile, options.nextjs),\n diff: options.diff,\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 nextjs: options.nextjs === true,\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\nfunction resolveReactEntryFile(\n entryFile: string | undefined,\n nextjs: boolean | undefined,\n): string | undefined {\n if (entryFile !== undefined) {\n return entryFile\n }\n\n if (nextjs === true) {\n return undefined\n }\n\n throw new Error(\n 'Missing React entry file. Use `foresthouse react <entry-file>` or `foresthouse react --nextjs`.',\n )\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
|
@@ -122,6 +122,87 @@ interface DependencyGraph {
|
|
|
122
122
|
//#region src/analyzers/import/index.d.ts
|
|
123
123
|
declare function analyzeDependencies(entryFile: string, options?: AnalyzeOptions): DependencyGraph;
|
|
124
124
|
//#endregion
|
|
125
|
+
//#region src/types/react-symbol-kind.d.ts
|
|
126
|
+
type ReactSymbolKind = 'component' | 'hook' | 'builtin';
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region src/types/react-usage-filter.d.ts
|
|
129
|
+
type ReactUsageFilter = 'all' | ReactSymbolKind;
|
|
130
|
+
//#endregion
|
|
131
|
+
//#region src/app/args.d.ts
|
|
132
|
+
interface BaseCliOptions {
|
|
133
|
+
readonly cwd: string | undefined;
|
|
134
|
+
readonly configPath: string | undefined;
|
|
135
|
+
readonly expandWorkspaces: boolean;
|
|
136
|
+
readonly projectOnly: boolean;
|
|
137
|
+
readonly json: boolean;
|
|
138
|
+
}
|
|
139
|
+
interface ReactCliOptions extends BaseCliOptions {
|
|
140
|
+
readonly command: 'react';
|
|
141
|
+
readonly entryFile: string | undefined;
|
|
142
|
+
readonly diff: string | undefined;
|
|
143
|
+
readonly filter: ReactUsageFilter;
|
|
144
|
+
readonly nextjs: boolean;
|
|
145
|
+
readonly includeBuiltins: boolean;
|
|
146
|
+
}
|
|
147
|
+
//#endregion
|
|
148
|
+
//#region src/types/react-usage-edge-kind.d.ts
|
|
149
|
+
type ReactUsageEdgeKind = 'render' | 'hook-call';
|
|
150
|
+
//#endregion
|
|
151
|
+
//#region src/types/react-usage-diff-edge.d.ts
|
|
152
|
+
interface ReactUsageDiffEdge {
|
|
153
|
+
readonly key: string;
|
|
154
|
+
readonly kind: ReactUsageEdgeKind;
|
|
155
|
+
readonly change: PackageDependencyChangeKind;
|
|
156
|
+
readonly targetId: string;
|
|
157
|
+
readonly referenceName: string;
|
|
158
|
+
readonly beforeReferenceName?: string;
|
|
159
|
+
readonly afterReferenceName?: string;
|
|
160
|
+
readonly node: ReactUsageDiffNode;
|
|
161
|
+
}
|
|
162
|
+
//#endregion
|
|
163
|
+
//#region src/types/react-usage-diff-node.d.ts
|
|
164
|
+
interface ReactUsageDiffNode {
|
|
165
|
+
readonly id: string;
|
|
166
|
+
readonly name: string;
|
|
167
|
+
readonly symbolKind: ReactSymbolKind;
|
|
168
|
+
readonly circular?: boolean;
|
|
169
|
+
readonly filePath: string;
|
|
170
|
+
readonly change: PackageDependencyChangeKind;
|
|
171
|
+
readonly exportNames: readonly string[];
|
|
172
|
+
readonly beforeExportNames?: readonly string[];
|
|
173
|
+
readonly afterExportNames?: readonly string[];
|
|
174
|
+
readonly usages: readonly ReactUsageDiffEdge[];
|
|
175
|
+
}
|
|
176
|
+
//#endregion
|
|
177
|
+
//#region src/types/react-usage-diff-entry.d.ts
|
|
178
|
+
interface ReactUsageDiffEntry {
|
|
179
|
+
readonly key: string;
|
|
180
|
+
readonly change: PackageDependencyChangeKind;
|
|
181
|
+
readonly targetId: string;
|
|
182
|
+
readonly referenceName: string;
|
|
183
|
+
readonly beforeReferenceName?: string;
|
|
184
|
+
readonly afterReferenceName?: string;
|
|
185
|
+
readonly beforeFilePath?: string;
|
|
186
|
+
readonly beforeLine?: number;
|
|
187
|
+
readonly beforeColumn?: number;
|
|
188
|
+
readonly afterFilePath?: string;
|
|
189
|
+
readonly afterLine?: number;
|
|
190
|
+
readonly afterColumn?: number;
|
|
191
|
+
readonly node: ReactUsageDiffNode;
|
|
192
|
+
}
|
|
193
|
+
//#endregion
|
|
194
|
+
//#region src/types/react-usage-diff-graph.d.ts
|
|
195
|
+
interface ReactUsageDiffGraph {
|
|
196
|
+
readonly kind: 'react-usage-diff';
|
|
197
|
+
readonly repositoryRoot: string;
|
|
198
|
+
readonly cwd: string;
|
|
199
|
+
readonly entries: readonly ReactUsageDiffEntry[];
|
|
200
|
+
readonly roots: readonly ReactUsageDiffNode[];
|
|
201
|
+
}
|
|
202
|
+
//#endregion
|
|
203
|
+
//#region src/analyzers/react/diff.d.ts
|
|
204
|
+
declare function analyzeReactUsageDiff(options: ReactCliOptions): ReactUsageDiffGraph;
|
|
205
|
+
//#endregion
|
|
125
206
|
//#region src/types/react-usage-location.d.ts
|
|
126
207
|
interface ReactUsageLocation {
|
|
127
208
|
readonly filePath: string;
|
|
@@ -136,12 +217,6 @@ interface ReactUsageEntry {
|
|
|
136
217
|
readonly location: ReactUsageLocation;
|
|
137
218
|
}
|
|
138
219
|
//#endregion
|
|
139
|
-
//#region src/types/react-symbol-kind.d.ts
|
|
140
|
-
type ReactSymbolKind = 'component' | 'hook' | 'builtin';
|
|
141
|
-
//#endregion
|
|
142
|
-
//#region src/types/react-usage-edge-kind.d.ts
|
|
143
|
-
type ReactUsageEdgeKind = 'render' | 'hook-call';
|
|
144
|
-
//#endregion
|
|
145
220
|
//#region src/types/react-usage-edge.d.ts
|
|
146
221
|
interface ReactUsageEdge {
|
|
147
222
|
readonly kind: ReactUsageEdgeKind;
|
|
@@ -171,9 +246,6 @@ interface ReactUsageGraph {
|
|
|
171
246
|
//#region src/analyzers/react/index.d.ts
|
|
172
247
|
declare function analyzeReactUsage(entryFile: string | readonly string[], options?: AnalyzeOptions): ReactUsageGraph;
|
|
173
248
|
//#endregion
|
|
174
|
-
//#region src/types/react-usage-filter.d.ts
|
|
175
|
-
type ReactUsageFilter = 'all' | ReactSymbolKind;
|
|
176
|
-
//#endregion
|
|
177
249
|
//#region src/analyzers/react/queries.d.ts
|
|
178
250
|
declare function getReactUsageEntries(graph: ReactUsageGraph, filter?: ReactUsageFilter): ReactUsageEntry[];
|
|
179
251
|
declare function getReactUsageRoots(graph: ReactUsageGraph, filter?: ReactUsageFilter): string[];
|
|
@@ -211,6 +283,7 @@ interface PrintReactTreeOptions {
|
|
|
211
283
|
//#endregion
|
|
212
284
|
//#region src/output/ascii/react.d.ts
|
|
213
285
|
declare function printReactUsageTree(graph: ReactUsageGraph, options?: PrintReactTreeOptions): string;
|
|
286
|
+
declare function printReactUsageDiffTree(graph: ReactUsageDiffGraph, options?: PrintReactTreeOptions): string;
|
|
214
287
|
//#endregion
|
|
215
288
|
//#region src/output/json/deps.d.ts
|
|
216
289
|
declare function graphToSerializablePackageTree(graph: PackageDependencyGraph): object;
|
|
@@ -225,6 +298,7 @@ declare function graphToSerializableTree(graph: DependencyGraph, options?: {
|
|
|
225
298
|
declare function graphToSerializableReactTree(graph: ReactUsageGraph, options?: {
|
|
226
299
|
readonly filter?: ReactUsageFilter;
|
|
227
300
|
}): object;
|
|
301
|
+
declare function diffGraphToSerializableReactTree(graph: ReactUsageDiffGraph): object;
|
|
228
302
|
//#endregion
|
|
229
|
-
export { type AnalyzeOptions, type ColorMode, type DependencyEdge, type DependencyGraph, type DependencyKind, type PackageDependencyChangeKind, type PackageDependencyDiffDependency, type PackageDependencyDiffGraph, type PackageDependencyDiffNode, type PackageDependencyGraph, type PackageDependencyNode, type PackageManifestDependency, type PrintPackageTreeOptions, 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, analyzePackageDependencies, analyzePackageDependencyDiff, analyzeReactUsage, diffGraphToSerializablePackageTree, getFilteredUsages, getReactUsageEntries, getReactUsageRoots, graphToSerializablePackageTree, graphToSerializableReactTree, graphToSerializableTree, printDependencyTree, printPackageDependencyDiffTree, printPackageDependencyTree, printReactUsageTree };
|
|
303
|
+
export { type AnalyzeOptions, type ColorMode, type DependencyEdge, type DependencyGraph, type DependencyKind, type PackageDependencyChangeKind, type PackageDependencyDiffDependency, type PackageDependencyDiffGraph, type PackageDependencyDiffNode, type PackageDependencyGraph, type PackageDependencyNode, type PackageManifestDependency, type PrintPackageTreeOptions, type PrintReactTreeOptions, type PrintTreeOptions, type ReactSymbolKind, type ReactUsageDiffEdge, type ReactUsageDiffEntry, type ReactUsageDiffGraph, type ReactUsageDiffNode, type ReactUsageEdge, type ReactUsageEdgeKind, type ReactUsageEntry, type ReactUsageFilter, type ReactUsageGraph, type ReactUsageLocation, type ReactUsageNode, type ReferenceKind, type SourceModuleNode, analyzeDependencies, analyzePackageDependencies, analyzePackageDependencyDiff, analyzeReactUsage, analyzeReactUsageDiff, diffGraphToSerializablePackageTree, diffGraphToSerializableReactTree, getFilteredUsages, getReactUsageEntries, getReactUsageRoots, graphToSerializablePackageTree, graphToSerializableReactTree, graphToSerializableTree, printDependencyTree, printPackageDependencyDiffTree, printPackageDependencyTree, printReactUsageDiffTree, printReactUsageTree };
|
|
230
304
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/package-dependency-change-kind.ts","../src/types/package-dependency-diff-dependency.ts","../src/types/package-dependency-diff-node.ts","../src/types/package-dependency-diff-graph.ts","../src/analyzers/deps/diff.ts","../src/types/package-manifest-dependency.ts","../src/types/package-dependency-node.ts","../src/types/package-dependency-graph.ts","../src/analyzers/deps/index.ts","../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-
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/package-dependency-change-kind.ts","../src/types/package-dependency-diff-dependency.ts","../src/types/package-dependency-diff-node.ts","../src/types/package-dependency-diff-graph.ts","../src/analyzers/deps/diff.ts","../src/types/package-manifest-dependency.ts","../src/types/package-dependency-node.ts","../src/types/package-dependency-graph.ts","../src/analyzers/deps/index.ts","../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-symbol-kind.ts","../src/types/react-usage-filter.ts","../src/app/args.ts","../src/types/react-usage-edge-kind.ts","../src/types/react-usage-diff-edge.ts","../src/types/react-usage-diff-node.ts","../src/types/react-usage-diff-entry.ts","../src/types/react-usage-diff-graph.ts","../src/analyzers/react/diff.ts","../src/types/react-usage-location.ts","../src/types/react-usage-entry.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/analyzers/react/queries.ts","../src/types/color-mode.ts","../src/types/print-package-tree-options.ts","../src/output/ascii/deps.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/deps.ts","../src/output/json/import.ts","../src/output/json/react.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { analyzeDependencies, analyzePackageDependencies, analyzePackageDependencyDiff, analyzeReactUsage, diffGraphToSerializablePackageTree, getFilteredUsages, getReactUsageEntries, getReactUsageRoots, graphToSerializablePackageTree, graphToSerializableReactTree, graphToSerializableTree, printDependencyTree, printPackageDependencyDiffTree, printPackageDependencyTree, printReactUsageTree };
|
|
1
|
+
import { _ as analyzeDependencies, a as graphToSerializablePackageTree, c as printDependencyTree, d as analyzeReactUsageDiff, f as getFilteredUsages, h as analyzeReactUsage, i as diffGraphToSerializablePackageTree, l as printPackageDependencyDiffTree, m as getReactUsageRoots, n as graphToSerializableReactTree, o as printReactUsageDiffTree, p as getReactUsageEntries, r as graphToSerializableTree, s as printReactUsageTree, t as diffGraphToSerializableReactTree, u as printPackageDependencyTree, v as analyzePackageDependencyDiff, y as analyzePackageDependencies } from "./react-D0TO9XR2.mjs";
|
|
2
|
+
export { analyzeDependencies, analyzePackageDependencies, analyzePackageDependencyDiff, analyzeReactUsage, analyzeReactUsageDiff, diffGraphToSerializablePackageTree, diffGraphToSerializableReactTree, getFilteredUsages, getReactUsageEntries, getReactUsageRoots, graphToSerializablePackageTree, graphToSerializableReactTree, graphToSerializableTree, printDependencyTree, printPackageDependencyDiffTree, printPackageDependencyTree, printReactUsageDiffTree, printReactUsageTree };
|