Skip to content

Commit 1aaf37b

Browse files
authored
Merge branch 'main' into jacek/user-4607-do-not-await-nonce-in-the-clerkprovider
2 parents 9e46dfe + 1a72784 commit 1aaf37b

5 files changed

Lines changed: 48 additions & 25 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/nextjs': patch
3+
---
4+
5+
Fix Turbopack compatibility for `ui` prop by adding `turbopackIgnore` magic comment alongside `webpackIgnore` on the dynamic `@clerk/ui/entry` import. This prevents both bundlers from statically resolving the optional dependency at build time.

.changeset/wild-clocks-stare.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

integration/tests/next-quickstart-keyless.test.ts

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,20 +89,28 @@ test.describe('Keyless mode @quickstart', () => {
8989
await newPage.waitForLoadState();
9090

9191
await newPage.waitForURL(url => {
92-
const urlToReturnTo = `${dashboardUrl}apps/claim?token=`;
93-
92+
const signInForceRedirectUrl = url.searchParams.get('sign_in_force_redirect_url');
9493
const signUpForceRedirectUrl = url.searchParams.get('sign_up_force_redirect_url');
9594

96-
const signUpForceRedirectUrlCheck =
97-
signUpForceRedirectUrl?.startsWith(urlToReturnTo) ||
98-
(signUpForceRedirectUrl?.startsWith(`${dashboardUrl}prepare-account`) &&
99-
signUpForceRedirectUrl?.includes(encodeURIComponent('apps/claim?token=')));
95+
const signInHasRequiredParams =
96+
signInForceRedirectUrl?.includes(`${dashboardUrl}apps/claim`) &&
97+
signInForceRedirectUrl?.includes('token=') &&
98+
signInForceRedirectUrl?.includes('framework=nextjs');
99+
100+
const signUpRegularCase =
101+
signUpForceRedirectUrl?.includes(`${dashboardUrl}apps/claim`) &&
102+
signUpForceRedirectUrl?.includes('token=') &&
103+
signUpForceRedirectUrl?.includes('framework=nextjs');
104+
105+
const signUpPrepareAccountCase =
106+
signUpForceRedirectUrl?.startsWith(`${dashboardUrl}prepare-account`) &&
107+
signUpForceRedirectUrl?.includes(encodeURIComponent('apps/claim')) &&
108+
signUpForceRedirectUrl?.includes(encodeURIComponent('token=')) &&
109+
signUpForceRedirectUrl?.includes(encodeURIComponent('framework=nextjs'));
110+
111+
const signUpHasRequiredParams = signUpRegularCase || signUpPrepareAccountCase;
100112

101-
return (
102-
url.pathname === '/apps/claim/sign-in' &&
103-
url.searchParams.get('sign_in_force_redirect_url')?.startsWith(urlToReturnTo) &&
104-
signUpForceRedirectUrlCheck
105-
);
113+
return url.pathname === '/apps/claim/sign-in' && signInHasRequiredParams && signUpHasRequiredParams;
106114
});
107115
});
108116

integration/tests/tanstack-start/keyless.test.ts

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,28 @@ test.describe('Keyless mode @tanstack-react-start', () => {
6969
await newPage.waitForLoadState();
7070

7171
await newPage.waitForURL(url => {
72-
const urlToReturnTo = `${dashboardUrl}apps/claim?token=`;
73-
72+
const signInForceRedirectUrl = url.searchParams.get('sign_in_force_redirect_url');
7473
const signUpForceRedirectUrl = url.searchParams.get('sign_up_force_redirect_url');
7574

76-
const signUpForceRedirectUrlCheck =
77-
signUpForceRedirectUrl?.startsWith(urlToReturnTo) ||
78-
(signUpForceRedirectUrl?.startsWith(`${dashboardUrl}prepare-account`) &&
79-
signUpForceRedirectUrl?.includes(encodeURIComponent('apps/claim?token=')));
75+
const signInHasRequiredParams =
76+
signInForceRedirectUrl?.includes(`${dashboardUrl}apps/claim`) &&
77+
signInForceRedirectUrl?.includes('token=') &&
78+
signInForceRedirectUrl?.includes('framework=tanstack-react-start');
79+
80+
const signUpRegularCase =
81+
signUpForceRedirectUrl?.includes(`${dashboardUrl}apps/claim`) &&
82+
signUpForceRedirectUrl?.includes('token=') &&
83+
signUpForceRedirectUrl?.includes('framework=tanstack-react-start');
84+
85+
const signUpPrepareAccountCase =
86+
signUpForceRedirectUrl?.startsWith(`${dashboardUrl}prepare-account`) &&
87+
signUpForceRedirectUrl?.includes(encodeURIComponent('apps/claim')) &&
88+
signUpForceRedirectUrl?.includes(encodeURIComponent('token=')) &&
89+
signUpForceRedirectUrl?.includes(encodeURIComponent('framework=tanstack-react-start'));
90+
91+
const signUpHasRequiredParams = signUpRegularCase || signUpPrepareAccountCase;
8092

81-
return (
82-
url.pathname === '/apps/claim/sign-in' &&
83-
url.searchParams.get('sign_in_force_redirect_url')?.startsWith(urlToReturnTo) &&
84-
signUpForceRedirectUrlCheck
85-
);
93+
return url.pathname === '/apps/claim/sign-in' && signInHasRequiredParams && signUpHasRequiredParams;
8694
});
8795
});
8896

packages/nextjs/src/app-router/client/ClerkProvider.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,11 @@ const NextClientClerkProvider = <TUi extends Ui = Ui>(props: NextClerkProviderPr
9595
// the ClerkUI constructor is stripped (not serializable). Re-import it on the client.
9696
const uiProp = mergedProps.ui as { __brand?: string; ClerkUI?: unknown } | undefined;
9797
if (uiProp?.__brand && !uiProp?.ClerkUI) {
98-
// webpackIgnore prevents the bundler from statically resolving @clerk/ui/entry at build time,
98+
// webpackIgnore/turbopackIgnore prevent the bundler from statically resolving @clerk/ui/entry at build time,
9999
// since @clerk/ui is an optional dependency that may not be installed.
100-
// @ts-expect-error - @clerk/ui/entry is resolved by the user's Next.js bundler at runtime, not at package build time
100+
// @ts-expect-error - @clerk/ui is an optional peer dependency, not declared in this package's dependencies
101101
// eslint-disable-next-line import/no-unresolved
102-
_resolvedClerkUI ??= import(/* webpackIgnore: true */ '@clerk/ui/entry').then(
102+
_resolvedClerkUI ??= import(/* webpackIgnore: true */ /* turbopackIgnore: true */ '@clerk/ui/entry').then(
103103
(m: { ClerkUI: ClerkUIConstructor }) => m.ClerkUI,
104104
);
105105
mergedProps.ui = { ...mergedProps.ui, ClerkUI: _resolvedClerkUI };

0 commit comments

Comments
 (0)