Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
424 commits
Select commit Hold shift + click to select a range
83b4104
perf(native): port pure black shadow rule
aidenybai Aug 25, 2026
e0b5655
perf(native): port absurd z-index rule
aidenybai Aug 25, 2026
66ce620
perf(native): port emoji heading decoration rule
aidenybai Aug 25, 2026
2fb6bd7
perf(native): port auto scrolling content rule
aidenybai Aug 25, 2026
c4a3eba
perf(native): port dark mode glow rule
aidenybai Aug 25, 2026
44028e2
perf(native): port decorative grid background rule
aidenybai Aug 25, 2026
75ff12c
perf(native): port decorative pulse rule
aidenybai Aug 25, 2026
f44deb8
perf(native): port decorative radial spotlight rule
aidenybai Aug 25, 2026
35923da
perf(native): port default props rule
aidenybai Aug 25, 2026
e7c4d6b
perf(native): port deprecated keyboard event rule
aidenybai Aug 25, 2026
90fe97f
perf(native): port excessive card surfaces rule
aidenybai Aug 25, 2026
68426e2
perf(native): port nested card surface rule
aidenybai Aug 25, 2026
ca1fd95
perf(native): port icon tile heading rule
aidenybai Aug 25, 2026
fba8898
perf(native): port uniform feature card grid rule
aidenybai Aug 25, 2026
15c7467
perf(native): port SVG currentColor conflict rule
aidenybai Aug 25, 2026
c1899d2
perf(native): port outline focus rule
aidenybai Aug 25, 2026
1bdc5de
perf(native): port scaled reveal origin rule
aidenybai Aug 25, 2026
45e5943
perf(native): port generic icon gradient rule
aidenybai Aug 25, 2026
69a6735
perf(native): port pointer-disabled control rule
aidenybai Aug 25, 2026
ddbdb70
perf(native): port inert pointer affordance rule
aidenybai Aug 25, 2026
17d83df
perf(native): port generic marketing copy rule
aidenybai Aug 25, 2026
5cef729
perf(native): port gradient text rule
aidenybai Aug 25, 2026
f4e9b9b
perf(native): port gray background contrast rule
aidenybai Aug 25, 2026
7569961
perf(native): port hero eyebrow rule
aidenybai Aug 25, 2026
ae5ea80
perf(native): port cramped container padding rule
aidenybai Aug 25, 2026
e931830
perf(native): port exhaustive inline style rule
aidenybai Aug 25, 2026
dbac6bc
perf(native): port animation completion focus rule
aidenybai Aug 25, 2026
3f31b90
perf(native): port hover-only reveal rule
aidenybai Aug 25, 2026
bcebe3f
perf(native): port image hover transform rule
aidenybai Aug 25, 2026
50974d5
perf(native): port indeterminate attribute rule
aidenybai Aug 25, 2026
7e8724e
perf(native): port module-scope impurity rule
aidenybai Aug 25, 2026
6123eaf
perf(native): port impure state updater rule
aidenybai Aug 25, 2026
4161cc1
perf(native): port inline HOC component rule
aidenybai Aug 25, 2026
963b85a
perf(native): port inline memo prop rule
aidenybai Aug 25, 2026
30c1209
perf(native): port invisible focus control rule
aidenybai Aug 26, 2026
2fc2844
perf(native): port JSON clone rule
aidenybai Aug 26, 2026
ed5b33d
perf(native): port JSX element type rule
aidenybai Aug 26, 2026
be728ed
perf(native): port large animated blur rule
aidenybai Aug 26, 2026
7b70d09
perf(native): port layout property animation rule
aidenybai Aug 26, 2026
dfd7bfd
perf(native): port layout shifting interaction rule
aidenybai Aug 26, 2026
f741480
perf(native): port boolean-heavy props rule
aidenybai Aug 26, 2026
b6a636a
perf(native): port matchMedia state initializer rule
aidenybai Aug 26, 2026
9d0535f
perf(native): port mirror prop effect rule
aidenybai Aug 26, 2026
7c36c50
perf(native): port monotonous page spacing rule
aidenybai Aug 26, 2026
fe8f319
perf(native): port navigation landmark naming rule
aidenybai Aug 26, 2026
abf15f8
perf(native): port mutable dependency rule
aidenybai Aug 26, 2026
8b0b3ab
perf(native): port mutating array rule
aidenybai Aug 26, 2026
018a4cf
perf(native): port mutating reducer state rule
aidenybai Aug 26, 2026
5fd809f
perf(native): port selector query safety rule
aidenybai Aug 26, 2026
75839ef
perf(native): port nullish arithmetic precedence rule
aidenybai Aug 26, 2026
9ef6607
perf(native): port numbered section markers rule
aidenybai Aug 26, 2026
5d38a87
perf(native): port object string coercion rule
aidenybai Aug 26, 2026
9704b61
perf(native): port passive request owner rule
aidenybai Aug 26, 2026
9f10485
perf(native): port path prefix containment rule
aidenybai Aug 26, 2026
65cfac8
perf(native): port placeholder-only field rule
aidenybai Aug 26, 2026
528bbe0
perf(native): port polymorphic children rule
aidenybai Aug 26, 2026
2e0cd99
perf(native): port predicate function reference rule
aidenybai Aug 26, 2026
7e2429a
perf(native): port preventDefault rule
aidenybai Aug 26, 2026
98d1b89
perf(native): port random key rule
aidenybai Aug 26, 2026
780227d
perf(native): port React 18 ref cleanup rule
aidenybai Aug 26, 2026
126f891
perf(native): port uncontrolled input rule
aidenybai Aug 26, 2026
c5d8206
perf(native): port third party script rule
aidenybai Aug 26, 2026
8ec5454
perf(native): port undersized icon button rule
aidenybai Aug 26, 2026
c98a7de
perf(native): port ungated Tailwind animation rule
aidenybai Aug 26, 2026
34a9d7e
perf(native): port unthrottled scroll mutation rule
aidenybai Aug 26, 2026
db54a15
perf(native): port WAAPI render rule
aidenybai Aug 26, 2026
4fd6061
perf(native): port Preact onInput rule
aidenybai Aug 26, 2026
2c913d4
perf(native): port Zod string format rule
aidenybai Aug 26, 2026
ba0d0a1
perf(native): port Zod error API rule
aidenybai Aug 26, 2026
4e388f9
perf(native): port Zod error customization rule
aidenybai Aug 26, 2026
dea6f7f
perf(native): port Zod schema API rule
aidenybai Aug 26, 2026
e5b2a47
perf(native): port Motion keyframe timing rule
aidenybai Aug 26, 2026
e595a9f
perf(native): port TanStack Query void query function rule
aidenybai Aug 26, 2026
36ca274
perf(native): port React Native navigator rule
aidenybai Aug 26, 2026
4260586
perf(native): port React cache object rule
aidenybai Aug 26, 2026
099a36f
perf(native): port Next.js client fetch rule
aidenybai Aug 26, 2026
ede847b
perf(native): port R3F linewidth rule
aidenybai Aug 26, 2026
8d94431
perf(native): port R3F shadow light rule
aidenybai Aug 26, 2026
d647d0e
perf(native): port R3F basic material rule
aidenybai Aug 26, 2026
6e530ee
perf(native): port R3F material opacity rule
aidenybai Aug 26, 2026
4f2b95e
perf(native): port R3F PBR material rule
aidenybai Aug 26, 2026
c189a4f
perf(native): port R3F physical material rule
aidenybai Aug 26, 2026
763a6a6
perf(native): port R3F opacity transparency rule
aidenybai Aug 26, 2026
c96f415
perf(native): port R3F buffer item-size rule
aidenybai Aug 26, 2026
218361b
perf(native): port R3F buffer array-length rule
aidenybai Aug 26, 2026
e29510c
perf(native): port R3F shadow-map size rule
aidenybai Aug 26, 2026
eb01af1
perf(native): port R3F raycaster range rule
aidenybai Aug 26, 2026
69998ad
perf(native): port R3F fog parameters rule
aidenybai Aug 26, 2026
9bc124a
perf(native): port R3F spotlight properties rule
aidenybai Aug 26, 2026
72bc6b2
perf(native): port R3F perspective camera rule
aidenybai Aug 26, 2026
bc4f3e7
perf(native): port R3F orthographic camera rule
aidenybai Aug 26, 2026
b4354e8
perf(native): port R3F useFrame dependency rule
aidenybai Aug 26, 2026
08c22d4
perf(native): port R3F normalized float attribute rule
aidenybai Aug 26, 2026
2c91d92
perf(native): port R3F WebGPU Canvas prop rule
aidenybai Aug 26, 2026
bd5edb2
perf(native): port R3F shadowed point light rule
aidenybai Aug 26, 2026
4971902
perf(native): port Bottom Sheet scrollable rule
aidenybai Aug 26, 2026
d20f08d
perf(native): port aria-hidden focusability rule
aidenybai Aug 26, 2026
dfec2f1
perf(native): port alt text rule
aidenybai Aug 26, 2026
a6127e6
perf(native): port anchor validity rule
aidenybai Aug 26, 2026
e4819cc
perf(native): port anchor target rule
aidenybai Aug 26, 2026
fa55387
perf(native): port ARIA property types rule
aidenybai Aug 26, 2026
d262065
perf(native): port async await loop rule
aidenybai Aug 26, 2026
fd767ce
perf(native): port async defer await rule
aidenybai Aug 26, 2026
d6141cd
perf(native): port async parallel rule
aidenybai Aug 26, 2026
19c789c
perf(native): port autocomplete valid rule
aidenybai Aug 26, 2026
882828b
fix(native): honor autocomplete settings
aidenybai Aug 26, 2026
e9e9982
perf(native): port button has type rule
aidenybai Aug 27, 2026
a733c75
perf(native): port checked input control rule
aidenybai Aug 27, 2026
415f39a
perf(native): port class component teardown rule
aidenybai Aug 27, 2026
99485c3
perf(native): port click keyboard rule
aidenybai Aug 27, 2026
d1899ab
perf(native): port control label rule
aidenybai Aug 27, 2026
10b6d48
perf(native): port display name rule
aidenybai Aug 27, 2026
520bc73
perf(native): port forbid component props rule
aidenybai Aug 27, 2026
20ee950
perf(native): port forbid DOM props rule
aidenybai Aug 27, 2026
fea9dc3
perf(native): port forbid elements rule
aidenybai Aug 27, 2026
a5eb7b3
perf(native): port form control name rule
aidenybai Aug 27, 2026
68a856a
perf(native): port hook import rename rule
aidenybai Aug 27, 2026
24a779d
perf(native): port invalid paragraph child rule
aidenybai Aug 27, 2026
dac062d
perf(native): port invalid table nesting rule
aidenybai Aug 27, 2026
97293cf
perf(native): port auth token storage rule
aidenybai Aug 27, 2026
2fc4ce9
perf(native): port localStorage version rule
aidenybai Aug 27, 2026
44a9a63
perf(native): port data table name rule
aidenybai Aug 27, 2026
4ce991b
perf(native): port Expo env rule
aidenybai Aug 27, 2026
32c9aa6
perf(native): port nested interactive rule
aidenybai Aug 27, 2026
5c814e4
perf(native): port iframe title rule
aidenybai Aug 27, 2026
1b3f5eb
perf(native): port iframe sandbox rule
aidenybai Aug 27, 2026
e5d56e3
perf(native): port redundant image alt rule
aidenybai Aug 27, 2026
de4173f
perf(native): port interactive focus rule
aidenybai Aug 27, 2026
7b6438d
perf(native): port label control association rule
aidenybai Aug 27, 2026
caf9029
perf(native): port mouse keyboard pairing rule
aidenybai Aug 27, 2026
bd2a679
perf(native): port no eval rule
aidenybai Aug 27, 2026
6c68cb9
perf(native): port JSX filename extension rule
aidenybai Aug 27, 2026
eb3804d
perf(native): port JSX curly brace presence rule
aidenybai Aug 27, 2026
e47b3e0
perf(native): port JSX handler names rule
aidenybai Aug 27, 2026
b7ad298
perf(native): port script loading strategy rule
aidenybai Aug 27, 2026
9200a93
perf(native): port Three.js PBR lighting rule
aidenybai Aug 27, 2026
ee4ba84
perf(native): port R3F PBR lighting rule
aidenybai Aug 27, 2026
3c79bb9
perf(native): port R3F metal environment rule
aidenybai Aug 27, 2026
c43839d
perf(native): port R3F Canvas shadow rule
aidenybai Aug 27, 2026
3bec1db
perf(native): port R3F texture repeat rule
aidenybai Aug 27, 2026
03f770c
perf(native): port R3F frame compile rule
aidenybai Aug 27, 2026
5ed9ba7
perf(native): port R3F clock rule
aidenybai Aug 27, 2026
fbfaaf7
perf(native): port R3F inline primitive rule
aidenybai Aug 27, 2026
15ed672
perf(native): port R3F namespace extend rule
aidenybai Aug 27, 2026
0374c4d
perf(native): port R3F DPR cap rule
aidenybai Aug 27, 2026
f443da5
perf(native): port R3F pointer allocation rule
aidenybai Aug 27, 2026
33a7c03
perf(native): port R3F clone rule
aidenybai Aug 27, 2026
07c1116
perf(native): port R3F deep selector rule
aidenybai Aug 27, 2026
fb2f190
perf(native): port R3F loader disposal rule
aidenybai Aug 27, 2026
8bfae5c
perf(native): port R3F duplicate primitive rule
aidenybai Aug 27, 2026
afab73c
perf(native): port R3F extend render rule
aidenybai Aug 28, 2026
fb58abf
perf(native): port R3F portal container rule
aidenybai Aug 28, 2026
04f3e23
perf(native): port R3F selector stability rule
aidenybai Aug 28, 2026
b2c42af
perf(native): port R3F managed ref attach rule
aidenybai Aug 28, 2026
8124df4
perf(native): port R3F inline resource rule
aidenybai Aug 28, 2026
c86d259
perf(native): port R3F manual canvas resize rule
aidenybai Aug 28, 2026
2d88cf0
perf(native): port R3F animation mixer update rule
aidenybai Aug 28, 2026
c345a29
perf(native): port R3F runtime correctness rules
aidenybai Aug 28, 2026
9873c7b
perf(native): port R3F mutation rules
aidenybai Aug 28, 2026
7312f53
perf(native): port R3F lifecycle rules
aidenybai Aug 28, 2026
20bed73
perf(native): port R3F frame safety rules
aidenybai Aug 28, 2026
0c47c38
perf(native): port R3F animation rules
aidenybai Aug 28, 2026
1ae2347
perf(native): port R3F resource rules
aidenybai Aug 28, 2026
3bd7c80
perf(native): port R3F correctness rules
aidenybai Aug 28, 2026
fca89a1
perf(native): port R3F rendering rules
aidenybai Aug 28, 2026
c9e3a00
perf(native): port Three controls and renderer rules
aidenybai Aug 28, 2026
f988966
perf(native): port Three lifecycle and resize rules
aidenybai Aug 28, 2026
2cb8cdc
perf(native): port Three camera and shadow rules
aidenybai Aug 28, 2026
6339b3b
perf(native): port Three pipeline and pointer rules
aidenybai Aug 28, 2026
14d7e81
perf(native): port Three animation loop hazards
aidenybai Aug 28, 2026
d086ae5
perf(native): port Three renderer loop guards
aidenybai Aug 28, 2026
fbd17a0
perf(native): port Three mixer and texture lifecycle rules
aidenybai Aug 28, 2026
70b9179
perf(native): port Three resource correctness rules
aidenybai Aug 28, 2026
c926365
perf(native): port Three loader and owned resource rules
aidenybai Aug 28, 2026
99e42c1
perf(native): port Three computation and renderer cleanup rules
aidenybai Aug 28, 2026
b6a58bb
perf(native): port Three buffer and texture correctness rules
aidenybai Aug 28, 2026
c74c4eb
perf(native): port Query, Motion, and React Native rules
aidenybai Aug 29, 2026
407bbdb
perf(native): port JSX, Next, design, and Jotai rules
aidenybai Aug 29, 2026
6f03f98
perf(native): port five correctness rules
aidenybai Aug 29, 2026
a1b11c8
perf(native): port Next and JavaScript rules
aidenybai Aug 29, 2026
0604cb4
perf(native): port lookup correctness rules
aidenybai Aug 29, 2026
dba1d6e
fix(native): sync native rule registry
aidenybai Aug 29, 2026
193cc44
perf(native): port Motion and Reanimated rules
aidenybai Aug 29, 2026
11574d7
perf(native): port Next.js and shader correctness rules
aidenybai Aug 29, 2026
8baa0b5
perf(native): port shader validation rules
aidenybai Aug 29, 2026
babc3ec
perf(native): port shader interface rules
aidenybai Aug 29, 2026
259b101
perf(native): port MobX correctness rules
aidenybai Aug 29, 2026
5961ca8
perf(native): port state and accessibility rules
aidenybai Aug 29, 2026
694d217
perf(native): port event and render rules
aidenybai Aug 29, 2026
d9b6891
perf(native): port effect cleanup rules
aidenybai Aug 29, 2026
70b75f1
perf(native): port JavaScript performance rules
aidenybai Aug 29, 2026
3cb6903
perf(native): port React correctness rules
aidenybai Aug 29, 2026
ae8cedc
perf(native): port React rules and scan foundation
aidenybai Aug 30, 2026
29b3276
fix(native): sync production rule allowlist
aidenybai Aug 30, 2026
a6365e3
perf(native): port React rules and project analysis
aidenybai Aug 30, 2026
290bb75
perf(native): port retained security scans
aidenybai Aug 30, 2026
bc8bbc5
perf(native): port unused export project rules
aidenybai Aug 30, 2026
35c6b03
perf(native): port circular dependency analysis
aidenybai Aug 30, 2026
c25eae4
perf(native): port unused dependency project rules
aidenybai Aug 30, 2026
78a27be
perf(native): port duplicate JSX project rule
aidenybai Aug 30, 2026
c4f1987
perf(native): port input correctness rules
aidenybai Aug 30, 2026
2b37125
perf(native): port render and platform rules
aidenybai Aug 30, 2026
115fe82
perf(native): port animation and React Native rules
aidenybai Aug 30, 2026
6b1b260
perf(native): port effect and interaction rules
aidenybai Aug 30, 2026
00384b6
perf(native): port synchronous XHR rule
aidenybai Aug 30, 2026
323f7bb
perf(native): port framework and accessibility rules
aidenybai Aug 30, 2026
eed7939
perf(native): port server and platform rules
aidenybai Aug 30, 2026
a8fcfd9
perf(native): port accessibility and state rules
aidenybai Aug 30, 2026
7edf53b
perf(native): port list and server rules
aidenybai Aug 30, 2026
9a5c9ef
perf(native): port unsafe JSON parse rule
aidenybai Aug 30, 2026
96747a6
perf(native): port React optimization rules
aidenybai Aug 30, 2026
5d6b3d1
perf(native): port render stability rules
aidenybai Aug 30, 2026
ba8ab39
perf(native): port state and server rules
aidenybai Aug 31, 2026
7c24912
perf(native): port lifecycle state rules
aidenybai Aug 31, 2026
f889a4b
perf(native): port component correctness rules
aidenybai Aug 31, 2026
4e8788b
perf(native): port React correctness rules
aidenybai Aug 31, 2026
859184b
perf(native): port async correctness rules
aidenybai Aug 31, 2026
61e9e36
perf(native): port effect state rules
aidenybai Aug 31, 2026
8e12d86
perf(native): port render state rules
aidenybai Aug 31, 2026
cf33a33
perf(native): port prop callback effect rule
aidenybai Aug 31, 2026
aecf1e8
perf(native): port module browser global rule
aidenybai Aug 31, 2026
d41d738
perf(native): port no-initialize-state
aidenybai Aug 31, 2026
ae19002
perf(native): port no-chain-state-updates
aidenybai Aug 31, 2026
82799f6
fix(native): sync type-only browser globals
aidenybai Aug 31, 2026
4e9cd83
perf(native): port derived state rules
aidenybai Aug 31, 2026
074af61
perf(native): port Fast Refresh export rule
aidenybai Sep 1, 2026
85db853
perf(native): port hydration guard rules
aidenybai Sep 1, 2026
69c6f7e
perf(native): port effect chain and memo default rules
aidenybai Sep 1, 2026
a3d27cd
perf(native): port React hook and parent data rules
aidenybai Sep 1, 2026
bb66fd1
perf(native): complete retained rule ports
aidenybai Sep 2, 2026
0ce8d9b
fix(native): sync rule fixes from main
aidenybai Sep 2, 2026
6e6945b
feat(native): package react-doctor-rust
aidenybai Sep 3, 2026
384ff2a
fix(native): preserve Windows router parity
aidenybai Sep 3, 2026
b72658a
fix(native): canonicalize project roots on Windows
aidenybai Sep 3, 2026
b404f03
fix(native): preserve Windows route module parity
aidenybai Sep 3, 2026
b179fbd
fix(native): preserve Windows server entry parity
aidenybai Sep 3, 2026
a4ccc75
fix(native): cover Windows root route parity
aidenybai Sep 3, 2026
e1ac677
ci(native): allow Intel build to finish
aidenybai Sep 3, 2026
7491725
fix(native): disable unused smoke cache
aidenybai Sep 3, 2026
83f13f4
feat(native): port non-socket security rules
aidenybai Sep 3, 2026
1b3f93d
fix(native): harden scan parity and artifact provenance
aidenybai Sep 5, 2026
f08f1e9
fix(native): target glibc 2.28 for Linux packages
aidenybai Sep 5, 2026
070e6b0
fix(native): allow Intel macOS builds to finish
aidenybai Sep 5, 2026
4611492
fix(native): preserve multiline HTML template parity
aidenybai Sep 5, 2026
fb0f962
fix(native): preserve canonical diagnostic URLs
aidenybai Sep 5, 2026
82a4d26
fix(native): preserve runtime diagnostic boundaries
aidenybai Sep 5, 2026
3237778
Merge commit 'ff7dd679e' into codex/oxc-source-patch
aidenybai Sep 5, 2026
3ced1c9
fix(native): sync upstream rule boundaries
aidenybai Sep 5, 2026
2f45687
fix(native): harden effect and project-resolution parity
aidenybai Sep 6, 2026
56f576b
fix(native): close callback and state guard parity gaps
aidenybai Sep 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .changeset/functional-state-rust.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"oxlint-plugin-react-doctor": patch
"eslint-plugin-react-doctor": patch
"react-doctor": patch
---

Run `rerender-functional-setstate` natively in the patched Oxlint binding and avoid reporting a synchronous state update when the only other call to the same setter does not read that state.
5 changes: 5 additions & 0 deletions .changeset/tidy-oxen-compile.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"react-doctor": patch
---

Add an opt-in, source-patched Oxlint binding path with native rule parity, cache isolation, provenance metadata, and reproducible cross-platform build tooling.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
packages/fuzz/corpus/react-bench-0.9.7-audit/** -text whitespace=-trailing-space
packages/fuzz/corpus/dummy-threejs-v14-audit/** -text whitespace=-trailing-space
native/oxlint/*.patch -text whitespace=-trailing-space
165 changes: 165 additions & 0 deletions .github/workflows/native-oxlint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
name: Native Oxlint

on:
push:
branches: [main]
paths:
- "LICENSE"
- "native/oxlint/**"
- "scripts/native/**"
- "package.json"
- "pnpm-lock.yaml"
- "pnpm-workspace.yaml"
- "turbo.json"
- "packages/api/**"
- "packages/core/**"
- "packages/oxlint-plugin-react-doctor/**"
- "packages/react-doctor/**"
- "skills/**"
- ".github/workflows/native-oxlint.yml"
pull_request:
branches: [main]
paths:
- "LICENSE"
- "native/oxlint/**"
- "scripts/native/**"
- "package.json"
- "pnpm-lock.yaml"
- "pnpm-workspace.yaml"
- "turbo.json"
- "packages/api/**"
- "packages/core/**"
- "packages/oxlint-plugin-react-doctor/**"
- "packages/react-doctor/**"
- "skills/**"
- ".github/workflows/native-oxlint.yml"

permissions:
contents: read

jobs:
verify-patch:
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- run: node scripts/native/build-oxlint-binding.mjs --check-only
- run: node --test native/oxlint/npm/react-doctor-rust/tests/*.test.js

build:
needs: verify-patch
timeout-minutes: ${{ matrix.runner == 'macos-15-intel' && 120 || 60 }}
env:
CARGO_BUILD_JOBS: 1
CARGO_INCREMENTAL: 0
CARGO_TARGET_DIR: ${{ github.workspace }}/target/native-oxlint
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-24.04
container: quay.io/pypa/manylinux_2_28_x86_64
- runner: ubuntu-24.04-arm
container: quay.io/pypa/manylinux_2_28_aarch64
- runner: macos-15-intel
- runner: macos-15
- runner: windows-2025
runs-on: ${{ matrix.runner }}
container: ${{ matrix.container }}
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: pnpm/action-setup@v5
- uses: actions/setup-node@v5
with:
node-version: "22.18.0"
cache: pnpm
- run: pnpm install --frozen-lockfile --prefer-offline
- uses: dtolnay/rust-toolchain@1.97.1
with:
components: rustfmt
- uses: Swatinem/rust-cache@v2
with:
shared-key: native-oxlint-${{ matrix.runner }}${{ matrix.container && '-manylinux-2-28' || '' }}
- run: pnpm native:oxlint:build -- --output dist/native-oxlint
- run: pnpm --filter oxlint-plugin-react-doctor build
- run: pnpm native:oxlint:parity -- --directory dist/native-oxlint
- run: pnpm native:oxlint:scan-parity
- run: pnpm native:oxlint:project-parity
- uses: actions/upload-artifact@v7
with:
name: native-oxlint-${{ matrix.runner }}
path: dist/native-oxlint/*
if-no-files-found: error

package:
needs: build
runs-on: ubuntu-24.04
timeout-minutes: 20
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: pnpm/action-setup@v5
- uses: actions/setup-node@v5
with:
node-version: "22.18.0"
cache: pnpm
- run: pnpm install --frozen-lockfile --prefer-offline
- run: pnpm exec turbo run build --filter=react-doctor
- uses: actions/download-artifact@v8
with:
pattern: native-oxlint-*
path: dist/native-oxlint-all
merge-multiple: true
- run: pnpm native:rust:assemble -- --artifacts dist/native-oxlint-all
- run: pnpm native:rust:pack
- uses: actions/upload-artifact@v7
with:
name: react-doctor-rust-packages
path: dist/react-doctor-rust-tarballs/*
if-no-files-found: error

smoke:
needs: package
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-24.04
node-version: "20.19.0"
- runner: ubuntu-24.04
node-version: "22.18.0"
- runner: ubuntu-24.04-arm
node-version: "22.18.0"
- runner: ubuntu-24.04
node-version: "20.19.0"
container: quay.io/pypa/manylinux_2_28_x86_64
- runner: ubuntu-24.04-arm
node-version: "20.19.0"
container: quay.io/pypa/manylinux_2_28_aarch64
- runner: macos-15-intel
node-version: "22.18.0"
- runner: macos-15
node-version: "22.18.0"
- runner: windows-2025
node-version: "22.18.0"
runs-on: ${{ matrix.runner }}
container: ${{ matrix.container }}
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@v5
with:
node-version: ${{ matrix.node-version }}
package-manager-cache: false
- uses: actions/download-artifact@v8
with:
name: react-doctor-rust-packages
path: dist/react-doctor-rust-tarballs
- run: node scripts/native/smoke-react-doctor-rust-package.mjs
36 changes: 36 additions & 0 deletions native/oxlint/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Source-patched Oxlint

This directory contains a patch against one exact Oxc commit. It adds a `react-doctor-native` plugin while leaving the stock Oxlint JavaScript launcher and all unported React Doctor rules unchanged.

The native rule cohort is listed in `upstream.json`, with one Rust source file per rule in `rules/`. React Doctor enables those rules only when `REACT_DOCTOR_NATIVE_OXLINT_BINDING_PATH` points to a built `.node` binding. Without that environment variable, scans use the published Oxlint binding and JavaScript rules exactly as before.

## Build and verify

```sh
nr native:oxlint:verify
nr native:oxlint:check
nr native:oxlint:build
REACT_DOCTOR_NATIVE_OXLINT_BINDING_PATH=dist/native-oxlint/<binding>.node nr native:oxlint:parity
REACT_DOCTOR_NATIVE_OXLINT_BINDING_PATH=dist/native-oxlint/<binding>.node nr native:oxlint:parity --benchmark
REACT_DOCTOR_NATIVE_OXLINT_BINDING_PATH=dist/native-oxlint/<binding>.node nr native:oxlint:parity --corpus packages/fuzz/tmp/corpus-repos
```

Set `CARGO_BUILD_JOBS=1` and `CARGO_INCREMENTAL=0` for the compile-check and release build on memory-constrained builders.

`native:oxlint:verify` clones the pinned tag, checks its commit, and proves the patch still applies. `native:oxlint:check` overlays every native rule, regenerates Oxc's rule registry, and compile-checks the linter. `native:oxlint:build` performs the same source assembly, compiles and loads the N-API binding, and writes the binding plus provenance and SHA-256 hashes to `dist/native-oxlint`.

The parity check runs the JavaScript and native implementations over the same adversarial TypeScript fixture and compares normalized diagnostics. It also runs isolated cases from `fixtures/ast-parity-boundaries.json`, including multiple files in one process and cross-file parser limits. Each case pins the canonical diagnostic count and compares messages, severity, filenames, spans, and multiplicity; unexpected parser or plugin diagnostics fail the check. Pass `--corpus` with a directory of repositories to compare every repository independently. A native rule should not be added to `nativeRules` or `NATIVE_REACT_DOCTOR_RULE_IDS` until both checks pass.

The workflow builds artifacts for Linux x64/arm64, macOS x64/arm64, and Windows x64. It does not publish them. Shipping or making the native patch the default should happen only after corpus parity shows no diagnostic drift and benchmarks show at least a 15% p50 lint improvement.

## Experimental package

`react-doctor-rust` is a separate launcher for the source-patched binding. It does not change the `react-doctor` package, fails before startup when the matching native package is missing or incompatible, and exits on native analysis failures instead of falling back to TypeScript.

The native workflow builds, verifies, packages, and smoke-tests Linux glibc x64/arm64, macOS x64/arm64, and Windows x64 independently. Every platform runs exact fixture parity, native scan parity, and native project-analysis parity before its artifact can enter the package assembly job. The assembly job verifies the recorded binding and patch SHA-256 hashes and a fingerprint of the current native sources, upstream manifest, build generator, and native CI configuration. Stale artifacts require a rebuild, including artifacts created before source fingerprinting. The fingerprint normalizes checkout line endings across platforms. Assembly generates one optional platform package per target and emits packed tarballs plus `SHA256SUMS`. Each target then installs and scans with those exact tarballs on its native runner.

Both Linux architectures build in official PyPA `manylinux_2_28` containers to target glibc 2.28. These images use AlmaLinux 8; see the [manylinux image documentation](https://github.com/pypa/manylinux#manylinux_2_28-almalinux-8-based). The eight tarball smoke jobs cover both architectures on this baseline with Node 20.19.0, current Ubuntu runners, both macOS architectures, and Windows x64. Linux Cargo caches are isolated from host builds so newer glibc artifacts cannot enter the baseline build through the cache.

The package remains private and CI-only until a separately approved release workflow publishes it under the `experimental` npm tag. A release assembly must pass both `--version` and `--react-doctor-version`; that exact `react-doctor` version must already be published with required-native execution support. Publishing must remove `private` from the launcher and all platform packages, publish the five platform packages before the launcher, and preserve the shared version.

The packed CI smoke installs explicit local tarballs to validate their contents. After publishing, run `nr native:rust:smoke -- --package react-doctor-rust@<exact-version>` on every supported runner. That mode installs only the registry launcher, proving npm selects its current platform binding and resolves the compatible `react-doctor` dependency. Do not promote the experimental tag until every postpublish smoke passes. Musl and other targets are unsupported until they have native build and install smoke lanes.
Loading
Loading