diff --git a/.changeset/astro-log-load-errors.md b/.changeset/astro-log-load-errors.md new file mode 100644 index 00000000000..5236997bc1e --- /dev/null +++ b/.changeset/astro-log-load-errors.md @@ -0,0 +1,5 @@ +--- +'@clerk/astro': patch +--- + +Log `Clerk.load()` failures to the console instead of silently swallowing them, making component mount failures diagnosable. diff --git a/packages/astro/src/internal/__tests__/create-clerk-instance.test.ts b/packages/astro/src/internal/__tests__/create-clerk-instance.test.ts index c265e920058..f7a45e4007d 100644 --- a/packages/astro/src/internal/__tests__/create-clerk-instance.test.ts +++ b/packages/astro/src/internal/__tests__/create-clerk-instance.test.ts @@ -118,6 +118,33 @@ describe('getClerkUIEntryChunk', () => { expect(loadCall.ui.ClerkUI).toBeUndefined(); }); + it('logs load() rejections to the console and does not mount components', async () => { + const loadError = new Error('ClerkJS failed to load'); + mockLoadClerkJSScript.mockImplementation(() => { + (window as any).Clerk = { + load: vi.fn().mockRejectedValue(loadError), + addListener: vi.fn(), + }; + return Promise.resolve(null); + }); + const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + + const { createClerkInstance } = await import('../create-clerk-instance'); + const { $csrState } = await import('../../stores/internal'); + const { mountAllClerkAstroJSComponents } = await import('../mount-clerk-astro-js-components'); + + await createClerkInstance({ + publishableKey: 'pk_test_xxx', + prefetchUI: false, + }); + + expect(consoleErrorSpy).toHaveBeenCalledWith(loadError.stack); + expect($csrState.setKey).not.toHaveBeenCalledWith('isLoaded', true); + expect(mountAllClerkAstroJSComponents).not.toHaveBeenCalled(); + + consoleErrorSpy.mockRestore(); + }); + it('does not pass a ClerkUI promise when ui is a marker object without a constructor', async () => { const mockLoad = vi.fn().mockResolvedValue(undefined); diff --git a/packages/astro/src/internal/create-clerk-instance.ts b/packages/astro/src/internal/create-clerk-instance.ts index c3ea0bf20b9..73bd5d7dd9c 100644 --- a/packages/astro/src/internal/create-clerk-instance.ts +++ b/packages/astro/src/internal/create-clerk-instance.ts @@ -90,7 +90,9 @@ async function createClerkInstanceInternal(options?: AstroC $csrState.setKey('organization', payload.organization); }); }) - .catch(() => {}); + .catch((err: Error) => { + console.error(err.stack || err.message || err); + }); } function updateClerkOptions(options: AstroClerkUpdateOptions) {