Skip to content

Commit e9ea271

Browse files
build(deps): React 19, Vite 8, Vitest 4, and the GitHub Actions majors
Closes the dependabot backlog in one sweep rather than 17 sequential rebase-and-merge cycles: every one of those PRs touches package.json or package-lock.json, so each merge conflicts the next and the queue can only drain one CI round at a time. ── GitHub Actions (7 PRs) ──────────────────────────────────────────────────── checkout 4→7, setup-go 5→7, setup-node 4→7, setup-python 5→7, deploy-pages 4→5, upload-pages-artifact 3→5, action-gh-release 2→3. Mechanical; the v4/v5 majors were also emitting Node 20 deprecation warnings on every run. ── Web (7 of 10 PRs) ───────────────────────────────────────────────────────── react + react-dom 18.3.1→19.2.8, @types/react 19, @dnd-kit/sortable 8→10 (with core →6.3.0 for its peer), vite 5→8, @vitejs/plugin-react 4→6, vitest + @vitest/coverage-v8 2→4, globals 15→17, eslint-plugin-react-hooks 5→7, typescript-eslint →8.68.0. Three things had to change for these to work: • React 19 types. `useRef<T>(null)` now yields `RefObject<T | null>` rather than `RefObject<T>` — the honest type, since a ref genuinely is null until its element mounts. Fixed at the three declaration sites (useStickToBottom's return, Modal's initialFocusRef, HITLPopup's firstActionRef) rather than cast away at the ~10 use sites. • Vite 8 builds on rolldown, which accepts `manualChunks` only as a callback and fails the build outright on the object form. Same three vendor chunks (react / dnd / icons), matched on module id. • `__dirname` in the vite and vitest configs, which Vite 8's native config loader warns about. Now `import.meta.dirname`. ── The new React Compiler lint rules are OFF, deliberately ────────────────── eslint-plugin-react-hooks v7 enables a family of rules derived from the React Compiler. They flag 42 EXISTING patterns across Studio — not regressions, just constructs the compiler cannot prove safe to memoize, setState-inside-an-effect being most of them. They are off rather than warnings because a warning nobody can act on 42 times is noise that trains people to ignore the whole report. Adopting them is a real refactor of state flow across the app and deserves its own review, not a silent rewrite of every effect riding along in a version bump. rules-of-hooks and exhaustive-deps — the two that caught real shipped bugs — stay errors. The gate is not weakened by one rule: eslint still reports 0 errors and the same 50 pre-existing warnings it did before. ── Three PRs are NOT adoptable, and the blocker is upstream ───────────────── typescript 5.9.3 → 7.0.2 (#17) typescript-eslint caps TypeScript at <6.1.0 — including its own 8.68.1 alphas. Taking TS 7 means deleting TypeScript linting from the project. eslint 9.39.5 → 10.8.1 (#19) and @eslint/js → 10.0.1 (#11) eslint-plugin-jsx-a11y's newest release (6.10.2) peers eslint ^3..^9 only. No ESLint 10 support has shipped. Forcing either with --legacy-peer-deps produces a tree whose linting is silently broken, which is worse than staying on the current major. They stay open until the ecosystem catches up. Verified: tsc clean, eslint 0 errors, 79/79 vitest, vite build green, Go build + lint at the zero baseline + full suite clean, and Studio exercised in a browser under React 19 — SSE connected, all chunks and API calls 200, the composition preview and phase rail rendering correctly.
1 parent f52556c commit e9ea271

12 files changed

Lines changed: 1271 additions & 2062 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
timeout-minutes: 5
2121
steps:
2222
- name: Checkout
23-
uses: actions/checkout@v4
23+
uses: actions/checkout@v7
2424

2525
- name: Check for stale/broken repo slug references
2626
run: ./scripts/check-repo-refs.sh
@@ -34,16 +34,16 @@ jobs:
3434
timeout-minutes: 25
3535
steps:
3636
- name: Checkout
37-
uses: actions/checkout@v4
37+
uses: actions/checkout@v7
3838

3939
- name: Set up Go
40-
uses: actions/setup-go@v5
40+
uses: actions/setup-go@v7
4141
with:
4242
go-version-file: go.mod
4343
cache: true
4444

4545
- name: Set up Node
46-
uses: actions/setup-node@v4
46+
uses: actions/setup-node@v7
4747
with:
4848
node-version: "20"
4949
cache: npm
@@ -89,10 +89,10 @@ jobs:
8989
timeout-minutes: 20
9090
steps:
9191
- name: Checkout
92-
uses: actions/checkout@v4
92+
uses: actions/checkout@v7
9393

9494
- name: Set up Go
95-
uses: actions/setup-go@v5
95+
uses: actions/setup-go@v7
9696
with:
9797
go-version-file: go.mod
9898
cache: true
@@ -109,10 +109,10 @@ jobs:
109109
timeout-minutes: 15
110110
steps:
111111
- name: Checkout
112-
uses: actions/checkout@v4
112+
uses: actions/checkout@v7
113113

114114
- name: Set up Node
115-
uses: actions/setup-node@v4
115+
uses: actions/setup-node@v7
116116
with:
117117
node-version: "20"
118118
cache: npm
@@ -137,23 +137,23 @@ jobs:
137137
timeout-minutes: 15
138138
steps:
139139
- name: Checkout
140-
uses: actions/checkout@v4
140+
uses: actions/checkout@v7
141141

142142
- name: Set up Go
143-
uses: actions/setup-go@v5
143+
uses: actions/setup-go@v7
144144
with:
145145
go-version-file: go.mod
146146
cache: true
147147

148148
- name: Set up Node
149-
uses: actions/setup-node@v4
149+
uses: actions/setup-node@v7
150150
with:
151151
node-version: "20"
152152
cache: npm
153153
cache-dependency-path: web/package-lock.json
154154

155155
- name: Set up Python
156-
uses: actions/setup-python@v5
156+
uses: actions/setup-python@v7
157157
with:
158158
python-version: "3.12"
159159

‎.github/workflows/docs.yml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ jobs:
3434
timeout-minutes: 15
3535
steps:
3636
- name: Checkout
37-
uses: actions/checkout@v4
37+
uses: actions/checkout@v7
3838

3939
- name: Set up Python
40-
uses: actions/setup-python@v5
40+
uses: actions/setup-python@v7
4141
with:
4242
python-version: "3.12"
4343
cache: pip
@@ -56,7 +56,7 @@ jobs:
5656

5757
- name: Upload Pages artifact
5858
if: github.event_name != 'pull_request'
59-
uses: actions/upload-pages-artifact@v3
59+
uses: actions/upload-pages-artifact@v5
6060
with:
6161
path: site
6262

@@ -71,4 +71,4 @@ jobs:
7171
steps:
7272
- name: Deploy to GitHub Pages
7373
id: deployment
74-
uses: actions/deploy-pages@v4
74+
uses: actions/deploy-pages@v5

‎.github/workflows/govulncheck.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ jobs:
2222
timeout-minutes: 15
2323
steps:
2424
- name: Checkout
25-
uses: actions/checkout@v4
25+
uses: actions/checkout@v7
2626

2727
- name: Set up Go
28-
uses: actions/setup-go@v5
28+
uses: actions/setup-go@v7
2929
with:
3030
go-version-file: go.mod
3131
cache: true

‎.github/workflows/release.yml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,18 @@ jobs:
2323
timeout-minutes: 60
2424
steps:
2525
- name: Checkout
26-
uses: actions/checkout@v4
26+
uses: actions/checkout@v7
2727
with:
2828
fetch-depth: 0
2929

3030
- name: Set up Go
31-
uses: actions/setup-go@v5
31+
uses: actions/setup-go@v7
3232
with:
3333
go-version-file: go.mod
3434
cache: true
3535

3636
- name: Set up Node
37-
uses: actions/setup-node@v4
37+
uses: actions/setup-node@v7
3838
with:
3939
node-version: "20"
4040
cache: npm
@@ -227,7 +227,7 @@ jobs:
227227
PY
228228
229229
- name: Create GitHub Release
230-
uses: softprops/action-gh-release@v2
230+
uses: softprops/action-gh-release@v3
231231
with:
232232
tag_name: ${{ steps.ver.outputs.tag }}
233233
name: SLMCode ${{ steps.ver.outputs.tag }}

‎web/eslint.config.js‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,29 @@ export default tseslint.config(
3838
'react-hooks/rules-of-hooks': 'error',
3939
'react-hooks/exhaustive-deps': 'error',
4040

41+
// ── React Compiler rules, deliberately off for now ──
42+
//
43+
// eslint-plugin-react-hooks v7 turns on a new family of rules derived
44+
// from the React Compiler. They flag 42 EXISTING patterns across Studio —
45+
// not regressions, not new defects, just constructs the compiler cannot
46+
// prove safe to memoize (setState inside an effect being by far the most
47+
// common).
48+
//
49+
// They are off rather than downgraded to warnings because a warning
50+
// nobody can act on 42 times is noise that trains people to ignore the
51+
// whole report. Adopting them is a real refactor of state flow across the
52+
// app, and it is its own piece of work — doing it inside a dependency
53+
// bump would put an unreviewed rewrite of every effect in the same commit
54+
// as a version number.
55+
//
56+
// The two rules above — the ones that caught real shipped bugs — stay
57+
// errors, so this upgrade does not weaken the gate by one rule.
58+
'react-hooks/set-state-in-effect': 'off',
59+
'react-hooks/refs': 'off',
60+
'react-hooks/purity': 'off',
61+
'react-hooks/immutability': 'off',
62+
'react-hooks/preserve-manual-memoization': 'off',
63+
4164
// A bare `catch {}` (or `catch (e) {}` with an empty body) is how 37 API
4265
// failures became invisible. Empty blocks must carry a comment saying
4366
// why swallowing is correct.

0 commit comments

Comments
 (0)