Skip to content

Commit ce695f4

Browse files
chore(deps): update dependencies to latest versions (#1321)
## Summary Applies all pending Renovate PRs plus additional updates discovered via `bun outdated`. Fixes the `axios` override conflict that was blocking `npm-check-updates`, and adapts CI + the Cypress e2e suite to the updated dependencies. ### Conflict Fix - `axios`: unpinned exact `1.16.1` → `^1.18.0`; aligned `overrides.axios` from `^1.15.0` → `^1.18.0` ### Range Fixes (were outside previous semver range) - `@conform-to/react` + `@conform-to/zod`: pinned `1.19.3` → `^1.19.4` - `@opentelemetry/*`: `^0.218.0` → `^0.219.0`, auto-instrumentations `^0.76.0` → `^0.77.0` - `@hey-api/openapi-ts`: `^0.97.0` → `^0.99.0` ### Major Updates (datum-ui peer dep aligned) - `react-day-picker`: `^9.14.0` → `^10` — datum-ui v1.3.0 compatible, typecheck clean - `@stepperize/react`: `^6.1.0` → `^7` — optional peer dep, typecheck clean - `js-yaml`: `^4` → `^5` — datum-ui peer dep, typecheck clean - `@types/node`: `^25` → `^26` — typecheck clean ### Minor/Patch Bumps (~50 packages) React Router `7.16→7.18`, Sentry `10.56→10.59`, Tiptap `3.24→3.27`, AI SDK, lucide-react, isomorphic-dompurify, hono, ioredis, eslint, prettier, cypress `15.14→15.17`, typescript-eslint, tailwindcss, `@datum-cloud/datum-ui` `1.2.0→1.3.0`, and more. ### Skipped (framework migrations requiring dedicated PRs) - `react-router` / `@react-router/*` v8 - `vite` v8 + `@vitejs/plugin-react` v6 - `graphql` v17 - `remix-utils` v10 ## CI & E2E Fixes The dependency bump surfaced several CI/test failures that are fixed in this PR (commit `fix(ci): adapt CI and e2e suite to updated dependencies`): - **`.github/workflows/ci.yml`** — share the build output between jobs via `upload-artifact`/`download-artifact` instead of `actions/cache` (the e2e jobs were failing with `Cannot find module '../build/server/index.js'`), and pin Node.js 24 (`.nvmrc`) for the Cypress jobs. - **`vite.config.ts`** — lazy-load `@react-router/dev/vite` when `CYPRESS` is set, so Cypress runs no longer crash on the react-router 7.18 esbuild path. - **`cypress.config.ts`** — replace `require('react-router')` with a dynamic `import()` (react-router 7.18+ is ESM-only) in the `signSessionCookie` task, and guard against a missing `SESSION_SECRET`. - **`cypress/support/e2e.ts`** — neutralize Radix's close-on-window-blur behavior. `@radix-ui/react-menu` ≥2.1.17 (via `@datum-cloud/datum-ui` 1.3.0) registers a `window` `blur` listener that closes any open `DropdownMenu`/`Select`/`Popover`. In headless runs the AUT window routinely lacks OS focus, firing spurious `blur` events that close the user menu the instant it opens — the smoke test failed with `[data-e2e="user-menu-logout"]` "never found". A capture-phase `blur` listener registered at page load (before React/Radix mount) stops the event before Radix's handler runs, keeping menus open in tests. Production behavior is untouched. - **`cypress/e2e/smoke/auth.cy.ts`** — open the user menu with plain `.click()` (the Radix dropdown does not open via `pointerdown` alone). ## Test plan - [x] `bun run typecheck` — passes clean - [x] `bun run lint` — 0 errors (2 pre-existing warnings unrelated to deps) - [x] Verify date-picker and calendar components render correctly - [x] Verify stepper/wizard flows work (service account wizard, export policy stepper) - [x] CI green across all jobs (Build, Unit, Bun Unit, **E2E Smoke**, Lint, Type Check)
2 parents 6001e2e + 28e8ed6 commit ce695f4

7 files changed

Lines changed: 1036 additions & 389 deletions

File tree

.github/workflows/ci.yml

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,11 @@ jobs:
8787
**/node_modules
8888
key: ${{ runner.os }}-deps-${{ hashFiles('**/bun.lock', '**/bun.lockb', '**/package.json') }}
8989
- run: bun run build
90-
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
90+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
9191
with:
92+
name: build-${{ github.sha }}
9293
path: build
93-
key: build-${{ github.sha }}
94+
retention-days: 1
9495

9596
# ─── Tests ──────────────────────────────────────────────────
9697
bun-tests:
@@ -128,6 +129,9 @@ jobs:
128129
if: ${{ !failure() && !cancelled() }}
129130
steps:
130131
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
132+
- uses: actions/setup-node@v4
133+
with:
134+
node-version-file: '.nvmrc'
131135
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
132136
with: { bun-version: 1.3.14 } # renovate: datasource=docker depName=oven/bun
133137
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
@@ -150,6 +154,9 @@ jobs:
150154
if: ${{ !failure() && !cancelled() }}
151155
steps:
152156
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
157+
- uses: actions/setup-node@v4
158+
with:
159+
node-version-file: '.nvmrc'
153160
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
154161
with: { bun-version: 1.3.14 } # renovate: datasource=docker depName=oven/bun
155162
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
@@ -158,10 +165,10 @@ jobs:
158165
${{ env.BUN_CACHE }}
159166
**/node_modules
160167
key: ${{ runner.os }}-deps-${{ hashFiles('**/bun.lock', '**/bun.lockb', '**/package.json') }}
161-
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
168+
- uses: actions/download-artifact@v4
162169
with:
170+
name: build-${{ github.sha }}
163171
path: build
164-
key: build-${{ github.sha }}
165172
- name: Setup Environment
166173
env:
167174
SESSION_SECRET: ${{ secrets.SESSION_SECRET }}
@@ -220,6 +227,9 @@ jobs:
220227
shard: [0, 1, 2, 3]
221228
steps:
222229
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
230+
- uses: actions/setup-node@v4
231+
with:
232+
node-version-file: '.nvmrc'
223233
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
224234
with: { bun-version: 1.3.14 } # renovate: datasource=docker depName=oven/bun
225235
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
@@ -228,10 +238,10 @@ jobs:
228238
${{ env.BUN_CACHE }}
229239
**/node_modules
230240
key: ${{ runner.os }}-deps-${{ hashFiles('**/bun.lock', '**/bun.lockb', '**/package.json') }}
231-
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
241+
- uses: actions/download-artifact@v4
232242
with:
243+
name: build-${{ github.sha }}
233244
path: build
234-
key: build-${{ github.sha }}
235245
- name: Setup Environment
236246
env:
237247
SESSION_SECRET: ${{ secrets.SESSION_SECRET }}

bun.lock

Lines changed: 886 additions & 294 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cypress.config.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,21 @@ export default defineConfig({
5353

5454
return null;
5555
},
56-
signSessionCookie(sessionData: { accessToken: string; expiredAt: string; sub: string }) {
57-
// Import React Router's cookie utilities to sign the cookie properly
58-
const { createCookie, createCookieSessionStorage } = require('react-router');
56+
async signSessionCookie(sessionData: {
57+
accessToken: string;
58+
expiredAt: string;
59+
sub: string;
60+
}) {
61+
// react-router 7.18+ ships ESM-only — require() is not available
62+
const { createCookie, createCookieSessionStorage } = await import('react-router');
5963
const sessionSecret = process.env.SESSION_SECRET;
6064

6165
const sessionCookie = createCookie('_session', {
6266
path: '/',
6367
sameSite: 'lax',
6468
httpOnly: true,
6569
maxAge: 60 * 60 * 13, // 13 hours
66-
secrets: [sessionSecret],
70+
secrets: sessionSecret ? [sessionSecret] : [],
6771
secure: process.env.NODE_ENV === 'development' ? false : true,
6872
});
6973

@@ -74,11 +78,11 @@ export default defineConfig({
7478
// Create a session and commit it to get the signed cookie value
7579
return sessionStorage
7680
.getSession()
77-
.then((session: ReturnType<typeof createCookieSessionStorage>['getSession']) => {
81+
.then((session) => {
7882
session.set('_session', sessionData);
7983
return sessionStorage.commitSession(session);
8084
})
81-
.then((cookieHeader: string) => {
85+
.then((cookieHeader) => {
8286
// Extract just the cookie value from the Set-Cookie header
8387
// Format: "_session=value; Path=/; ..."
8488
const match = cookieHeader.match(/^_session=([^;]+)/);

cypress/e2e/smoke/auth.cy.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ describe('Authentication — smoke', () => {
3434
cy.visit(paths.account.organizations.root);
3535
cy.url().should('include', paths.account.organizations.root);
3636

37-
// Open user menu and click Log Out
37+
// Open user menu and click Log Out. The Radix dropdown's close-on-window-blur
38+
// behavior (added in @radix-ui/react-menu ≥2.1.17) is neutralized globally in
39+
// cypress/support/e2e.ts so the menu stays open in headless runs.
3840
cy.get('[data-e2e="user-menu-trigger"]').click();
3941
cy.get('[data-e2e="user-menu-logout"]').click();
4042

cypress/support/e2e.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,27 @@ import { paths } from '@/utils/config/paths.config';
22
import { getPathWithParams } from '@/utils/helpers/path.helper';
33
import '@testing-library/cypress/add-commands';
44

5+
/**
6+
* Neutralize Radix UI's "close on window blur" behavior in the test runner.
7+
*
8+
* `@radix-ui/react-menu` ≥2.1.17 (pulled in by `@datum-cloud/datum-ui` 1.3.0)
9+
* registers `window.addEventListener('blur', () => close())` whenever a
10+
* DropdownMenu / Select / Popover is open. In Cypress headless runs the
11+
* application-under-test window routinely lacks OS focus, so the browser fires
12+
* spurious `blur` events that close menus the instant they open — making it
13+
* impossible to click an item inside (e.g. the user-menu "Log Out"). The
14+
* user-visible symptom is `[data-e2e="user-menu-logout"]` "never found".
15+
*
16+
* We register a `blur` listener on the AUT window at page-load time — before
17+
* React/Radix mount — and call `stopImmediatePropagation()`. Because `blur`
18+
* targets `window` itself (AT_TARGET phase), listeners run in registration
19+
* order, so ours runs before Radix's and prevents the close. This only affects
20+
* the test environment; production close-on-blur behavior is untouched.
21+
*/
22+
Cypress.on('window:before:load', (win) => {
23+
win.addEventListener('blur', (event) => event.stopImmediatePropagation(), { capture: true });
24+
});
25+
526
/**
627
* Stub the "ambient" authenticated-page polling that fires on every visit so
728
* the e2e suite doesn't trip the upstream IAM rate limiter for the test

package.json

Lines changed: 75 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -29,76 +29,76 @@
2929
"test:coverage": "bun test --coverage"
3030
},
3131
"dependencies": {
32-
"@ai-sdk/anthropic": "^3.0.71",
33-
"@ai-sdk/react": "^3.0.170",
34-
"@conform-to/react": "1.19.3",
35-
"@conform-to/zod": "1.19.3",
36-
"@datum-cloud/activity-ui": "^0.5.0",
37-
"@datum-cloud/datum-ui": "^1.2.0",
32+
"@ai-sdk/anthropic": "^3.0.85",
33+
"@ai-sdk/react": "^3.0.210",
34+
"@conform-to/react": "^1.19.4",
35+
"@conform-to/zod": "^1.19.4",
36+
"@datum-cloud/activity-ui": "^0.5.1",
37+
"@datum-cloud/datum-ui": "^1.3.0",
3838
"@epic-web/client-hints": "^1.3.9",
39-
"@gqlts/runtime": "^3.3.0",
39+
"@gqlts/runtime": "^3.4.2",
4040
"@hono/prometheus": "^1.0.3",
4141
"@monaco-editor/react": "^4.7.0",
42-
"@openfeature/server-sdk": "^1.21.0",
43-
"@opentelemetry/auto-instrumentations-node": "^0.76.0",
44-
"@opentelemetry/exporter-metrics-otlp-http": "^0.218.0",
45-
"@opentelemetry/exporter-trace-otlp-http": "^0.218.0",
46-
"@opentelemetry/sdk-node": "^0.218.0",
47-
"@opentelemetry/sdk-trace-base": "^2.7.0",
48-
"@react-router/node": "^7.16.0",
49-
"@react-router/serve": "^7.16.0",
50-
"@sentry/react-router": "^10.49.0",
51-
"@stepperize/react": "^6.1.0",
42+
"@openfeature/server-sdk": "^1.22.0",
43+
"@opentelemetry/auto-instrumentations-node": "^0.77.0",
44+
"@opentelemetry/exporter-metrics-otlp-http": "^0.219.0",
45+
"@opentelemetry/exporter-trace-otlp-http": "^0.219.0",
46+
"@opentelemetry/sdk-node": "^0.219.0",
47+
"@opentelemetry/sdk-trace-base": "^2.8.0",
48+
"@react-router/node": "^7.18.0",
49+
"@react-router/serve": "^7.18.0",
50+
"@sentry/react-router": "^10.59.0",
51+
"@stepperize/react": "^7",
5252
"@streamdown/code": "^1.1.1",
53-
"@stripe/react-stripe-js": "^6.4.0",
54-
"@stripe/stripe-js": "^9.6.0",
55-
"@tailwindcss/typography": "^0.5.19",
56-
"@tailwindcss/vite": "^4.2.2",
57-
"@tanstack/react-query": "^5.99.2",
53+
"@stripe/react-stripe-js": "^6.6.0",
54+
"@stripe/stripe-js": "^9.8.0",
55+
"@tailwindcss/typography": "^0.5.20",
56+
"@tailwindcss/vite": "^4.3.1",
57+
"@tanstack/react-query": "^5.101.0",
5858
"@tanstack/react-table": "^8.21.3",
59-
"@tanstack/react-virtual": "^3.13.24",
60-
"@tiptap/extension-character-count": "^3.22.4",
61-
"@tiptap/extension-link": "^3.22.4",
62-
"@tiptap/extension-placeholder": "^3.22.4",
63-
"@tiptap/extension-underline": "^3.22.4",
64-
"@tiptap/pm": "^3.22.4",
65-
"@tiptap/react": "^3.22.4",
66-
"@tiptap/starter-kit": "^3.22.4",
67-
"@urql/core": "^6.0.1",
59+
"@tanstack/react-virtual": "^3.14.3",
60+
"@tiptap/extension-character-count": "^3.27.1",
61+
"@tiptap/extension-link": "^3.27.1",
62+
"@tiptap/extension-placeholder": "^3.27.1",
63+
"@tiptap/extension-underline": "^3.27.1",
64+
"@tiptap/pm": "^3.27.1",
65+
"@tiptap/react": "^3.27.1",
66+
"@tiptap/starter-kit": "^3.27.1",
67+
"@urql/core": "^6.0.2",
6868
"@xterm/addon-fit": "^0.11.0",
6969
"@xterm/xterm": "^6.0.0",
70-
"ai": "^6.0.168",
71-
"axios": "1.16.1",
70+
"ai": "^6.0.208",
71+
"axios": "^1.18.0",
7272
"bun": "1.3.14",
7373
"class-variance-authority": "^0.7.1",
7474
"d3-geo": "^3.1.1",
75-
"date-fns": "^4.1.0",
75+
"date-fns": "^4.4.0",
7676
"date-fns-tz": "^3.2.0",
7777
"dotenv": "^17.4.2",
78-
"es-toolkit": "^1.45.1",
78+
"es-toolkit": "^1.48.1",
7979
"fathom-client": "^3.7.2",
80-
"graphql": "^16.13.2",
81-
"hono": "^4.12.14",
80+
"graphql": "^16.14.2",
81+
"hono": "^4.12.26",
8282
"hono-rate-limiter": "^0.5.3",
8383
"i18n-iso-countries": "^7.14.0",
84-
"ioredis": "^5.10.1",
85-
"isbot": "^5.1.39",
86-
"isomorphic-dompurify": "^3.9.0",
87-
"js-yaml": "^4.1.1",
84+
"ioredis": "^5.11.1",
85+
"isbot": "^5.1.43",
86+
"isomorphic-dompurify": "^3.18.0",
87+
"js-yaml": "^5",
8888
"jwt-decode": "^4.0.0",
89-
"lucide-react": "^1.8.0",
89+
"lucide-react": "^1.21.0",
9090
"monaco-editor": "^0.55.1",
91-
"motion": "^12.38.0",
91+
"motion": "^12.40.0",
9292
"nprogress": "^0.2.0",
9393
"nuqs": "^2.8.9",
9494
"prom-client": "^15.1.3",
9595
"rate-limit-redis": "^5.0.0",
96-
"react": "^19.2.5",
97-
"react-day-picker": "^9.14.0",
98-
"react-dom": "^19.2.5",
96+
"react": "^19.2.7",
97+
"react-day-picker": "^10",
98+
"react-dom": "^19.2.7",
9999
"react-dropzone": "^15.0.0",
100-
"react-router": "^7.16.0",
101-
"react-router-hono-server": "^2.25.3",
100+
"react-router": "^7.18.0",
101+
"react-router-hono-server": "^2.26.0",
102102
"recharts": "^3.8.1",
103103
"remix-auth": "^4.2.0",
104104
"remix-auth-oauth2": "^3.4.1",
@@ -108,18 +108,18 @@
108108
"tailwind-scrollbar-hide": "^4.0.0",
109109
"tailwindcss-animate": "^1.0.7",
110110
"tslib": "^2.8.1",
111-
"urql": "^5.0.2",
111+
"urql": "^5.0.3",
112112
"zod": "4.4.3"
113113
},
114114
"devDependencies": {
115-
"@eslint/compat": "^2.0.5",
116-
"@gqlts/cli": "^3.3.0",
117-
"@hey-api/openapi-ts": "^0.97.0",
118-
"@inquirer/prompts": "^8.4.2",
119-
"@react-router/dev": "^7.16.0",
120-
"@testing-library/cypress": "^10.1.0",
115+
"@eslint/compat": "^2.1.0",
116+
"@gqlts/cli": "^3.4.2",
117+
"@hey-api/openapi-ts": "^0.99.0",
118+
"@inquirer/prompts": "^8.5.2",
119+
"@react-router/dev": "^7.18.0",
120+
"@testing-library/cypress": "^10.1.3",
121121
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
122-
"@types/axios-curlirize": "^1.3.5",
122+
"@types/axios-curlirize": "^1.3.6",
123123
"@types/compression": "^1.8.1",
124124
"@types/d3-geo": "^3.1.0",
125125
"@types/geojson": "^7946.0.16",
@@ -129,42 +129,42 @@
129129
"@types/leaflet-draw": "^1.0.13",
130130
"@types/leaflet.markercluster": "^1.5.6",
131131
"@types/morgan": "^1.9.10",
132-
"@types/node": "^25.6.0",
132+
"@types/node": "^26",
133133
"@types/nprogress": "^0.2.3",
134-
"@types/react": "^19.2.14",
134+
"@types/react": "^19.2.17",
135135
"@types/react-dom": "^19.2.3",
136136
"@types/topojson-client": "^3.1.5",
137137
"@types/topojson-specification": "^1.0.5",
138-
"@typescript-eslint/eslint-plugin": "^8.59.1",
139-
"@typescript-eslint/parser": "^8.59.1",
140-
"@vitejs/plugin-react": "^5.1.4",
141-
"bun-types": "^1.3.13",
142-
"cypress": "^15.14.0",
143-
"cypress-split": "^1.24.31",
144-
"cypress-vite": "^1.8.0",
145-
"eslint": "^10.2.1",
138+
"@typescript-eslint/eslint-plugin": "^8.61.1",
139+
"@typescript-eslint/parser": "^8.61.1",
140+
"@vitejs/plugin-react": "^5.2.0",
141+
"bun-types": "^1.3.14",
142+
"cypress": "^15.17.0",
143+
"cypress-split": "^1.25.0",
144+
"cypress-vite": "1.10.0",
145+
"eslint": "^10.5.0",
146146
"eslint-plugin-jsx-a11y": "^6.10.2",
147-
"eslint-plugin-prettier": "^5.5.5",
147+
"eslint-plugin-prettier": "^5.5.6",
148148
"eslint-plugin-react": "^7.37.5",
149149
"eslint-plugin-react-hooks": "^7.1.1",
150150
"eslint-plugin-unused-imports": "^4.4.1",
151-
"lefthook": "^2.1.6",
152-
"prettier": "^3.8.3",
151+
"lefthook": "^2.1.9",
152+
"prettier": "^3.8.4",
153153
"prettier-plugin-tailwindcss": "^0.8.0",
154-
"start-server-and-test": "^3.0.2",
154+
"start-server-and-test": "^3.0.11",
155155
"tailwind-variants": "^3.2.2",
156-
"tailwindcss": "^4.2.2",
156+
"tailwindcss": "^4.3.1",
157157
"tw-animate-css": "^1.4.0",
158-
"typescript": "^6.0.0",
159-
"typescript-eslint": "^8.59.1",
160-
"vite": "^7.3.1",
158+
"typescript": "^6.0.3",
159+
"typescript-eslint": "^8.61.1",
160+
"vite": "^7.3.5",
161161
"vite-tsconfig-paths": "^6.1.1"
162162
},
163163
"engines": {
164164
"node": ">=24.0.0"
165165
},
166166
"overrides": {
167-
"axios": "^1.15.0",
167+
"axios": "^1.18.0",
168168
"form-data": "^4.0.4",
169169
"dompurify": "^3.3.2",
170170
"@hono/node-server": "^2.0.0",

0 commit comments

Comments
 (0)