Skip to content

Commit aba2d52

Browse files
authored
Merge branch 'main' into iago/orgs-924
2 parents d566824 + 8743290 commit aba2d52

37 files changed

+1235
-199
lines changed

.changeset/pretty-rings-compare.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@clerk/shared": patch
3+
---
4+
5+
Increase sampling for high-signal auth components on mount.

.changeset/quiet-bats-protect.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
---
2+
'@clerk/react-router': major
3+
---
4+
5+
Introduce [React Router middleware](https://reactrouter.com/how-to/middleware) support with `clerkMiddleware()` for improved performance and streaming capabilities.
6+
7+
Usage of `rootAuthLoader` without the `clerkMiddleware()` installed is now deprecated and will be removed in the next major version.
8+
9+
**Before (Deprecated - will be removed):**
10+
11+
```tsx
12+
import { rootAuthLoader } from '@clerk/react-router/ssr.server'
13+
14+
export const loader = (args: Route.LoaderArgs) => rootAuthLoader(args)
15+
```
16+
17+
**After (Recommended):**
18+
19+
1. Enable the `v8_middleware` future flag:
20+
21+
```ts
22+
// react-router.config.ts
23+
export default {
24+
future: {
25+
v8_middleware: true,
26+
},
27+
} satisfies Config;
28+
```
29+
30+
2. Use the middleware in your app:
31+
32+
```tsx
33+
import { clerkMiddleware, rootAuthLoader } from '@clerk/react-router/server'
34+
35+
export const middleware: Route.MiddlewareFunction[] = [clerkMiddleware()]
36+
37+
export const loader = (args: Route.LoaderArgs) => rootAuthLoader(args)
38+
```
39+
40+
**Streaming Support (with middleware):**
41+
42+
```tsx
43+
export const middleware: Route.MiddlewareFunction[] = [clerkMiddleware()]
44+
45+
export const loader = (args: Route.LoaderArgs) => {
46+
const nonCriticalData = new Promise((res) =>
47+
setTimeout(() => res('non-critical'), 5000),
48+
)
49+
50+
return rootAuthLoader(args, () => ({
51+
nonCriticalData
52+
}))
53+
}
54+
```

.changeset/tangy-bees-follow.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/shared': minor
3+
---
4+
5+
Improve error handling when loading clerk-js.

integration/presets/utils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import path from 'node:path';
22

33
export function linkPackage(pkg: string) {
44
// eslint-disable-next-line turbo/no-undeclared-env-vars
5-
if (process.env.CI === 'true') return '*';
5+
if (process.env.CI === 'true') {
6+
return '*';
7+
}
68

79
return `link:${path.resolve(process.cwd(), `packages/${pkg}`)}`;
810
}

integration/templates/react-router-library/package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,14 @@
99
"preview": "vite preview --port $PORT"
1010
},
1111
"dependencies": {
12-
"@clerk/react-router": "^0.1.2",
1312
"react": "^18.3.1",
1413
"react-dom": "^18.3.1",
15-
"react-router": "^7.1.2"
14+
"react-router": "^7.9.1"
1615
},
1716
"devDependencies": {
1817
"@types/react": "^18.3.12",
1918
"@types/react-dom": "^18.3.1",
20-
"@vitejs/plugin-react": "^4.3.4",
19+
"@vitejs/plugin-react": "^5.0.3",
2120
"globals": "^15.12.0",
2221
"typescript": "~5.7.3",
2322
"vite": "^6.0.1"

integration/templates/react-router-node/app/root.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { isRouteErrorResponse, Links, Meta, Outlet, Scripts, ScrollRestoration } from 'react-router';
22
import { rootAuthLoader } from '@clerk/react-router/ssr.server';
33
import { ClerkProvider } from '@clerk/react-router';
4-
54
import type { Route } from './+types/root';
65

6+
// TODO: Uncomment when published
7+
// export const middleware: Route.MiddlewareFunction[] = [clerkMiddleware()];
8+
79
export async function loader(args: Route.LoaderArgs) {
810
return rootAuthLoader(args);
911
}

integration/templates/react-router-node/app/routes/protected.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ export async function loader(args: Route.LoaderArgs) {
1414
const user = await createClerkClient({ secretKey: process.env.CLERK_SECRET_KEY }).users.getUser(userId);
1515

1616
return {
17-
user,
17+
firstName: user.firstName,
18+
emailAddress: user.emailAddresses[0].emailAddress,
1819
};
1920
}
2021

@@ -24,8 +25,8 @@ export default function Profile({ loaderData }: Route.ComponentProps) {
2425
<h1>Protected</h1>
2526
<UserProfile />
2627
<ul>
27-
<li>First name: {loaderData.user.firstName}</li>
28-
<li>Email: {loaderData.user.emailAddresses[0].emailAddress}</li>
28+
<li>First name: {loaderData.firstName}</li>
29+
<li>Email: {loaderData.emailAddress}</li>
2930
</ul>
3031
</div>
3132
);

integration/templates/react-router-node/package.json

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,20 @@
99
"typecheck": "react-router typegen && tsc --build --noEmit"
1010
},
1111
"dependencies": {
12-
"@clerk/react-router": "latest",
13-
"@react-router/node": "^7.1.2",
14-
"@react-router/serve": "^7.1.2",
12+
"@react-router/node": "^7.9.1",
13+
"@react-router/serve": "^7.9.1",
1514
"isbot": "^5.1.17",
16-
"react": "^18.3.1",
17-
"react-dom": "^18.3.1",
18-
"react-router": "^7.1.2"
15+
"react": "^19.1.0",
16+
"react-dom": "^19.1.0",
17+
"react-router": "^7.9.1"
1918
},
2019
"devDependencies": {
21-
"@react-router/dev": "^7.1.2",
20+
"@react-router/dev": "^7.9.1",
2221
"@types/node": "^20",
23-
"@types/react": "^18.3.12",
24-
"@types/react-dom": "^18.3.1",
22+
"@types/react": "^19.1.2",
23+
"@types/react-dom": "^19.1.2",
2524
"typescript": "^5.7.3",
26-
"vite": "^5.4.11",
27-
"vite-tsconfig-paths": "^5.1.2"
25+
"vite": "^7.1.5",
26+
"vite-tsconfig-paths": "^5.1.4"
2827
}
2928
}

integration/templates/react-router-node/react-router.config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,8 @@ export default {
44
// Config options...
55
// Server-side render by default, to enable SPA mode set this to `false`
66
ssr: true,
7+
future: {
8+
v8_middleware: true,
9+
unstable_optimizeDeps: true,
10+
},
711
} satisfies Config;

integration/tests/react-router/basic.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type { FakeUser } from '../../testUtils';
55
import { createTestUtils, testAgainstRunningApps } from '../../testUtils';
66

77
testAgainstRunningApps({ withEnv: [appConfigs.envs.withEmailCodes], withPattern: ['react-router.node'] })(
8-
'basic tests for @react-router',
8+
'basic tests for @react-router with middleware',
99
({ app }) => {
1010
test.describe.configure({ mode: 'parallel' });
1111

0 commit comments

Comments
 (0)