Commit 8bb54c9
authored
refactor: split src/utils/ into src/core/{config,detection,diagnostics,scoring,runners}/ + src/cli/ (#224)
* refactor: split src/utils/ (68 flat files) into src/core/{config,detection,diagnostics,scoring,runners}/ + src/cli/
Final big organizational refactor in the series (#218 plugin/, #220 cli/,
#221 scan/, #222 drop browser-poc, #223 dead-code). Carves the 68-file
src/utils/ dumping ground into purpose-built directories.
New layout:
src/cli/ presentation (26 files)
+ prompts.ts, highlighter.ts, spinner.ts, logger.ts
+ colorize-by-score.ts, format-error-chain.ts
+ indent-multiline-text.ts, wrap-indented-text.ts
+ build-hidden-diagnostics-summary.ts
+ should-auto-select-current-choice.ts, should-select-all-choices.ts
+ detect-agents.ts, to-display-name.ts
+ (existing cli/ files: index.ts, render-*.ts, etc.)
src/core/ core logic (7 files at root + 5 subdirs)
build-json-report.ts shared JSON reporting (CLI + public API)
build-json-report-error.ts shared JSON error envelope
group-by.ts, is-file.ts generic primitives
is-plain-object.ts, to-relative-path.ts
read-file-lines-node.ts
config/ (11) config loading, root-dir resolution, ignore patterns,
glob matching, gitattributes parsing, validation
detection/ (6) project discovery, react/tailwind major-version parsing,
package.json reading, monorepo root detection
diagnostics/ (12) combine/filter/suppress/merge, jsx-opener-span
lookup, disable-directive walks
scoring/ (6) local + remote score calc, score breakdown,
reduced-motion check, proxy fetch
runners/ (13) oxlint + knip + their config builders, include-path
computation, Node-version compat, diff-files
src/plugin/ (unchanged from #218)
scan.ts, index.ts, errors.ts, types.ts, constants.ts,
oxlint-config.ts, eslint-plugin.ts, install-skill.ts top-level
Driven by a one-shot codemod that performed the moves via `git mv` (so
all 68 file renames preserve blame/log history) and rewrote every
relative import in the package + tests (98 importer files touched) to
the new paths.
One non-mechanical fix needed after the move:
src/core/runners/run-oxlint.ts resolved its built plugin via
`../../dist/react-doctor-plugin.js` -- with 1 extra level of nesting
that needs to be `../../../dist/react-doctor-plugin.js`.
One test fixed:
tests/regressions/scan-resilience.test.ts read a source file by
hardcoded path (`src/utils/calculate-score-locally.ts`) to assert no
`fetch(` reference -- updated to the new location
(`src/core/scoring/calculate-score-locally.ts`).
Verification:
- 128 files changed, +237 / -222 (almost entirely import-path edits)
- typecheck/lint/format clean
- 734/734 tests pass
- build produces identical dist/cli.js, dist/index.js, etc.
- No public API change
- src/utils/ no longer exists
* refactor: move orchestrators into tiers + rename scan -> inspect (#225)
* refactor: move install-skill, scan, oxlint-config out of src/ root into their tiers
Top-level src/ was still holding three orchestrator-grade files that
logically belong inside the existing tier directories. Move them so the
src/ root only contains public-API entry points and cross-cutting types.
Moves (via git mv, history preserved):
src/install-skill.ts -> src/cli/install-skill.ts CLI subcommand
(already imported
6 things from cli/)
src/scan.ts -> src/core/scan.ts Orchestrator
(lives with the
logic it calls)
src/oxlint-config.ts -> src/core/runners/oxlint-config.ts Sibling of
run-oxlint.ts
(config + runner)
After: top-level src/ contains only the entry points and shared types:
src/
├── cli/ presentation
├── core/ logic
├── plugin/ rules
├── constants.ts
├── errors.ts
├── eslint-plugin.ts public-API entry
├── index.ts public-API entry
├── knip.d.ts type declaration
└── types.ts
Imports rewritten via a small codemod (11 files):
- 3 moved files' internal imports recomputed for new depth
- 4 src/ consumers of the moved files updated
- 4 test files updated
Verification:
- 11 files changed, +39/-39 (all import path edits)
- typecheck/lint/format clean
- 734/734 tests pass
- build produces identical dist/* output
- run-oxlint.ts's relative path to dist/react-doctor-plugin.js
(../../../) is unchanged -- run-oxlint.ts itself didn't move
Stacks on top of #224 (utils->core reorg). Once #224 merges, this PR's
base auto-rebases to main.
* refactor: rename scan -> inspect (function, file, types, test)
"scan" was a misnomer -- the function does much more than scan files: it
runs lint via oxlint, runs dead-code via knip, calculates a score,
merges/filters diagnostics, and renders CLI output. "inspect" describes
the role accurately and matches v2's chosen name.
Renames:
src/core/scan.ts -> src/core/inspect.ts (git mv)
tests/scan.test.ts -> tests/inspect.test.ts (git mv)
scan() function -> inspect() function
runScan() -> runInspect()
mergeScanOptions() -> mergeInspectOptions()
ResolvedScanOptions -> ResolvedInspectOptions
ScanResult -> InspectResult (src/types.ts)
ScanOptions -> InspectOptions (src/types.ts)
describe("scan", ...) -> describe("inspect", ...) (test)
Importers updated:
src/cli/index.ts 4 sites
src/core/build-json-report.ts 3 sites
tests/inspect.test.ts 5 sites
tests/regressions/cli-and-output.test.ts 4 sites
tests/build-json-report.test.ts 2 sites
Kept as English prose (not identifiers):
- "full scan", "scan output", "scan only files", "scan banner" in
comments, CLI option descriptions, and prompt text -- these describe
the action of scanning the codebase, not references to the function.
- constants.ts JSX_OPENER_SCAN_MAX_LINES (about lexical JSX scanning,
unrelated to inspect()).
Verification:
- 7 files changed, +54/-54 (all renames)
- typecheck/lint/format clean
- 734/734 tests pass
- No public API change (scan/ScanResult/ScanOptions weren't exported
from src/index.ts -- the public API still calls the underlying
function diagnose() which is unchanged)
Stacks on #225 (which moved scan.ts to src/core/). Once #225 merges,
this PR's base auto-rebases to main.
* fix: restore help-text example paths corrupted by the import codemod
The utils->core import-path codemod's regex matched `from '...'`
substrings inside string literals -- specifically the EXAMPLE code
shown to users in oxlint diagnostic help text. Three messages in
HELP_TEXT_MAP had their example paths mangled into the codemod's
target form (`../../utils/...`) even though they were supposed to
illustrate paths in the USER'S code, not paths internal to this
package.
Restored to the original example paths:
no-barrel-import:
`import { Button } from '../../utils/components/Button.js'`
-> `import { Button } from './components/Button'`
no-dynamic-import-path:
`import('../../utils/feature/heavy.js')`
-> `import('./feature/heavy.js')`
nextjs-no-css-link:
`import styles from '../../utils/Button.module.css.js'`
-> `import styles from './Button.module.css'`
Verified no other string literals were corrupted (grepped for
`["'`]../../(utils|core|cli)/` across src/ -- all remaining hits are
legitimate plugin/utils imports from the per-rule split in #218, which
is its own unrelated `utils/` directory).
Closes the Bugbot finding on PR #224.
* refactor: move format-error-chain / logger / highlighter to core/ (fix layering)
Addresses Bugbot's "Core modules depend backwards on CLI layer" finding
on PR #224. Several core/ files were importing from cli/, undermining
the layered structure the refactor was introducing:
core/build-json-report-error.ts -> cli/format-error-chain
core/runners/extract-failed-plugin-name -> cli/format-error-chain
core/config/load-config -> cli/logger
core/config/read-ignore-file -> cli/logger
core/config/resolve-config-root-dir -> cli/logger
The 3 utilities in question are all pure abstractions (no CLI-specific
behavior beyond using console.* for output), so they belong in core/
where both core AND cli consumers can import them without inversion.
Moves (git mv, history preserved):
cli/format-error-chain.ts -> core/format-error-chain.ts (Error.cause walker)
cli/logger.ts -> core/logger.ts (silent-mode logger)
cli/highlighter.ts -> core/highlighter.ts (picocolors wrapper)
22 files changed, +29/-29 -- all relative-import path rewrites driven
by a small codemod with a strict `^import ... from "..."` regex
(line-anchored to avoid the help-text-literal corruption bug from the
previous codemod, which triggered the bigger Bugbot follow-up).
After this:
- core/ no longer imports from cli/ for utilities -- only
core/inspect.ts still does (legitimately: it's the CLI orchestrator
that calls render-*.ts + resolve-oxlint-node prompt + spinner)
- cli/ files import the moved utilities via `../core/<name>.js`
Verification:
- typecheck/lint/format clean
- 734/734 tests pass
- `rg "from .+cli/" src/core` shows only inspect.ts's legitimate
imports of render-*, spinner, resolve-oxlint-node (all of which
are CLI presentation/interaction, not utilities)1 parent ef2b7fe commit 8bb54c9
131 files changed
Lines changed: 302 additions & 287 deletions
File tree
- packages/react-doctor
- src
- cli
- core
- config
- detection
- diagnostics
- runners
- scoring
- tests
- regressions
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
| 2 | + | |
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| |||
File renamed without changes.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
3 | 6 | | |
4 | 7 | | |
5 | 8 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
4 | | - | |
| 3 | + | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
8 | | - | |
| 7 | + | |
| 8 | + | |
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
17 | | - | |
| 16 | + | |
| 17 | + | |
18 | 18 | | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| |||
161 | 161 | | |
162 | 162 | | |
163 | 163 | | |
164 | | - | |
| 164 | + | |
165 | 165 | | |
166 | 166 | | |
167 | 167 | | |
168 | | - | |
| 168 | + | |
169 | 169 | | |
170 | 170 | | |
171 | 171 | | |
| |||
264 | 264 | | |
265 | 265 | | |
266 | 266 | | |
267 | | - | |
| 267 | + | |
268 | 268 | | |
269 | 269 | | |
270 | 270 | | |
| |||
275 | 275 | | |
276 | 276 | | |
277 | 277 | | |
278 | | - | |
| 278 | + | |
279 | 279 | | |
280 | 280 | | |
281 | 281 | | |
| |||
449 | 449 | | |
450 | 450 | | |
451 | 451 | | |
452 | | - | |
| 452 | + | |
453 | 453 | | |
454 | 454 | | |
455 | 455 | | |
| |||
460 | 460 | | |
461 | 461 | | |
462 | 462 | | |
463 | | - | |
| 463 | + | |
464 | 464 | | |
465 | 465 | | |
466 | 466 | | |
| |||
506 | 506 | | |
507 | 507 | | |
508 | 508 | | |
509 | | - | |
| 509 | + | |
510 | 510 | | |
511 | 511 | | |
512 | 512 | | |
| |||
520 | 520 | | |
521 | 521 | | |
522 | 522 | | |
523 | | - | |
| 523 | + | |
524 | 524 | | |
525 | 525 | | |
526 | 526 | | |
| |||
534 | 534 | | |
535 | 535 | | |
536 | 536 | | |
537 | | - | |
| 537 | + | |
538 | 538 | | |
539 | 539 | | |
540 | 540 | | |
| |||
594 | 594 | | |
595 | 595 | | |
596 | 596 | | |
597 | | - | |
| 597 | + | |
598 | 598 | | |
599 | 599 | | |
600 | 600 | | |
| |||
625 | 625 | | |
626 | 626 | | |
627 | 627 | | |
628 | | - | |
| 628 | + | |
629 | 629 | | |
630 | 630 | | |
631 | 631 | | |
| |||
packages/react-doctor/src/install-skill.ts renamed to packages/react-doctor/src/cli/install-skill.ts
Lines changed: 7 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
6 | | - | |
7 | | - | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
0 commit comments