Skip to content

Commit 03636db

Browse files
committed
fix(astro): preserve bundled ui in injected scripts
1 parent 99aab85 commit 03636db

3 files changed

Lines changed: 97 additions & 3 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/astro': patch
3+
---
4+
5+
Fix bundled Clerk UI initialization when `ui` is passed to the Astro integration.
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import type { ClerkOptions } from '@clerk/shared/types';
2+
import { describe, expect, it } from 'vitest';
3+
4+
import { buildBeforeHydrationSnippet, buildPageLoadSnippet } from '../snippets';
5+
6+
const buildSnippetOptions = (internalParams: ClerkOptions) => ({
7+
command: 'build',
8+
packageName: '@clerk/astro',
9+
buildImportPath: '@clerk/astro/internal',
10+
internalParams,
11+
});
12+
13+
describe('integration snippets', () => {
14+
it('imports bundled Clerk UI instead of serializing the constructor for before-hydration scripts', () => {
15+
class ClerkUI {}
16+
17+
const snippet = buildBeforeHydrationSnippet(
18+
buildSnippetOptions({
19+
publishableKey: 'pk_test_123',
20+
ui: {
21+
__brand: '__clerkUI',
22+
version: '1.2.3',
23+
ClerkUI,
24+
},
25+
} as unknown as ClerkOptions),
26+
);
27+
28+
expect(snippet).toContain('import { ui as __internal_clerkAstroUi } from "@clerk/ui";');
29+
expect(snippet).toContain(
30+
'await runInjectionScript({ ...{"publishableKey":"pk_test_123","ui":{"__brand":"__clerkUI","version":"1.2.3"}}, ui: __internal_clerkAstroUi });',
31+
);
32+
});
33+
34+
it('imports bundled Clerk UI for page-load scripts including view-transition reinitialization', () => {
35+
class ClerkUI {}
36+
37+
const snippet = buildPageLoadSnippet(
38+
buildSnippetOptions({
39+
publishableKey: 'pk_test_123',
40+
ui: {
41+
__brand: '__clerkUI',
42+
version: '1.2.3',
43+
ClerkUI,
44+
},
45+
} as unknown as ClerkOptions),
46+
);
47+
48+
expect(snippet).toContain('import { ui as __internal_clerkAstroUi } from "@clerk/ui";');
49+
expect(snippet).toContain(
50+
'...{ ...{"publishableKey":"pk_test_123","ui":{"__brand":"__clerkUI","version":"1.2.3"}}, ui: __internal_clerkAstroUi },',
51+
);
52+
expect(snippet).toContain(
53+
'await runInjectionScript({ ...{"publishableKey":"pk_test_123","ui":{"__brand":"__clerkUI","version":"1.2.3"}}, ui: __internal_clerkAstroUi });',
54+
);
55+
});
56+
57+
it('keeps default snippets free of the bundled UI import', () => {
58+
const snippet = buildBeforeHydrationSnippet(
59+
buildSnippetOptions({
60+
publishableKey: 'pk_test_123',
61+
} as unknown as ClerkOptions),
62+
);
63+
64+
expect(snippet).not.toContain('@clerk/ui');
65+
expect(snippet).toContain('await runInjectionScript({"publishableKey":"pk_test_123"});');
66+
});
67+
});

packages/astro/src/integration/snippets.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
import type { ClerkOptions } from '@clerk/shared/types';
22

3+
function buildInternalParamsExpression(internalParams: ClerkOptions) {
4+
const serializedParams = JSON.stringify(internalParams);
5+
6+
if (!internalParams.ui) {
7+
return {
8+
imports: '',
9+
params: serializedParams,
10+
};
11+
}
12+
13+
return {
14+
imports: 'import { ui as __internal_clerkAstroUi } from "@clerk/ui";',
15+
params: `{ ...${serializedParams}, ui: __internal_clerkAstroUi }`,
16+
};
17+
}
18+
319
/**
420
* Creates a snippet that initializes Clerk before client-side framework hydration occurs.
521
*
@@ -24,10 +40,13 @@ export function buildBeforeHydrationSnippet({
2440
buildImportPath: string;
2541
internalParams: ClerkOptions;
2642
}) {
43+
const { imports, params } = buildInternalParamsExpression(internalParams);
44+
2745
return `
2846
${command === 'dev' ? `console.log("${packageName}","Initialize Clerk: before-hydration")` : ''}
47+
${imports}
2948
import { runInjectionScript } from "${buildImportPath}";
30-
await runInjectionScript(${JSON.stringify(internalParams)});`;
49+
await runInjectionScript(${params});`;
3150
}
3251

3352
/**
@@ -59,8 +78,11 @@ export function buildPageLoadSnippet({
5978
buildImportPath: string;
6079
internalParams: ClerkOptions;
6180
}) {
81+
const { imports, params } = buildInternalParamsExpression(internalParams);
82+
6283
return `
6384
${command === 'dev' ? `console.log("${packageName}","Initialize Clerk: page")` : ''}
85+
${imports}
6486
import { runInjectionScript, swapDocument } from "${buildImportPath}";
6587
6688
// Taken from https://github.com/withastro/astro/blob/e10b03e88c22592fbb42d7245b65c4f486ab736d/packages/astro/src/transitions/router.ts#L39.
@@ -89,12 +111,12 @@ export function buildPageLoadSnippet({
89111
const { navigate } = await import('astro:transitions/client');
90112
91113
await runInjectionScript({
92-
...${JSON.stringify(internalParams)},
114+
...${params},
93115
routerPush: navigate,
94116
routerReplace: (url) => navigate(url, { history: 'replace' }),
95117
});
96118
})
97119
} else {
98-
await runInjectionScript(${JSON.stringify(internalParams)});
120+
await runInjectionScript(${params});
99121
}`;
100122
}

0 commit comments

Comments
 (0)