refactor: drop browser-poc (src + fixtures + bippy/@oxc-parser/wasm deps)#222
Merged
Conversation
…eps)
Removes the browser-poc surface entirely (matches v2's decision). Frees
~1300 LOC of source + two runtime deps that nothing else in src/ uses.
Deletions:
src/browser-poc.ts 1083 LOC
src/wasm.d.ts 4 LOC (only typed
.wasm imports
for browser-poc)
tests/fixtures/browser-poc/ app.tsx + index.html
src/constants.ts drop 2 unused consts
(BROWSER_POC_FUNCTION_SOURCE_MAX_CHARS,
BROWSER_POC_HOST_SELECTOR_MAX_COUNT)
package.json:
- exports./browser-poc removed
- scripts.build drop trailing esbuild
step that bundled
dist/browser-poc.global.js
- scripts.poc:browser removed (vite dev
server for the demo)
- dependencies.@oxc-parser/wasm ^0.60.0 removed (only used
by browser-poc)
- dependencies.bippy ^0.5.39 removed (only used
by browser-poc)
vite.config.ts:
- drop react-doctor-wasm-binary-loader plugin (only converted .wasm
to base64 for browser-poc)
- drop WASM_FILE_SUFFIX constant
- drop the { entry: { "browser-poc": ... } } pack
Verified after deletion:
- typecheck/format/lint/test all clean
- 734 tests still pass (no tests targeted browser-poc directly --
only the fixture html/tsx that were html-loaded by the vite dev
server in `poc:browser`)
- dist size drops from ~1.4 MB to ~1.19 MB
- 3 packages removed from node_modules (bippy + @oxc-parser/wasm +
one transitive)
Net diff: 8 files changed, +1 / -1267.
|
🔴 React Review — 0/100 (unchanged) · No new issues Reviewed by react-review for commit 5b2f1ab. Configure here. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
3 tasks
aidenybai
added a commit
that referenced
this pull request
May 13, 2026
Audit after the refactor wave (#218 plugin/, #220 cli/, #221 scan/, #222 drop browser-poc) found 16 zero-reference exports across src/. 15 of them were genuinely dead; 1 was kept (clearCaches is public API). Removals: src/utils/is-rule-suppressed-at.ts ENTIRELY ORPHANED: no file imports it (it just wraps evaluateSuppression) src/constants.ts: REACT_19_DEPRECATION_MIN_MAJOR Defined for rule version-gating that inlined the numbers in oxlint-config.ts instead. REACT_DOM_LEGACY_API_MIN_MAJOR Same -- never wired up TAILWIND_SIZE_SHORTHAND_MIN_MAJOR Same TAILWIND_SIZE_SHORTHAND_MIN_MINOR Same (plus the orphaned HACK comment that described them) Un-exported (interface/helpers only used inside own file): src/cli/parse-file-line-argument.ts ParsedFileLineArgument src/oxlint-config.ts RuleMetadataEntry buildCapabilities shouldEnableRule src/utils/apply-ignore-overrides.ts CompiledIgnoreOverride src/utils/build-category-breakdown.ts CategoryBreakdownEntry src/utils/calculate-score-locally.ts ScoreBreakdown src/utils/evaluate-suppression.ts SuppressionEvaluation src/utils/load-config.ts LoadedReactDoctorConfig src/utils/parse-tailwind-major-minor.ts TailwindMajorMinor Kept: src/index.ts clearCaches Public-API entry, intentionally exposed even if no internal caller uses it. 10 files changed, +10 / -36. typecheck/lint/format/test all clean, 734/734 tests still pass.
4 tasks
aidenybai
added a commit
that referenced
this pull request
May 13, 2026
…s,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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Drops the `browser-poc` surface entirely (matches v2's decision). Frees ~1300 LOC of source plus two runtime dependencies (`bippy`, `@oxc-parser/wasm`) that nothing else in `src/` uses.
What's removed
Why now
`browser-poc` was experimental and unused by the CLI / public API / eslint-plugin / oxlint-plugin / tests. It pinned a large dependency footprint (`bippy` runtime, wasm parser, base64-loaded wasm bytes in the bundle). v2 PR #217 dropped it for the same reasons.
Verification
Test plan
Note
Low Risk
Low risk because this PR is primarily deletion of an unused experimental browser-only entrypoint, build wiring, and dependencies; main CLI/plugin surfaces remain unchanged. Risk is limited to any external consumers that relied on the removed
./browser-pocexport or demo scripts.Overview
Removes the
browser-pocsurface entirely: deletessrc/browser-poc.ts, its demo fixtures, and related constants/types, and drops the./browser-pocexport.Simplifies packaging by removing the extra browser build steps and Vite wasm loader/pack entry, and trims dependencies by deleting
bippyand@oxc-parser/wasmfromreact-doctor(with corresponding lockfile cleanup).Reviewed by Cursor Bugbot for commit 5b2f1ab. Bugbot is set up for automated code reviews on this repo. Configure here.