From b2874b7632d1318b4a9de56befabe8c8f7b21c35 Mon Sep 17 00:00:00 2001 From: brkalow Date: Tue, 1 Sep 2026 12:34:10 -0500 Subject: [PATCH] fix(shared): classify local production keys as live --- .changeset/honest-plants-smile.md | 5 +++++ packages/shared/src/__tests__/keys.spec.ts | 2 ++ packages/shared/src/keys.ts | 8 +++++--- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 .changeset/honest-plants-smile.md diff --git a/.changeset/honest-plants-smile.md b/.changeset/honest-plants-smile.md new file mode 100644 index 00000000000..ce79c162041 --- /dev/null +++ b/.changeset/honest-plants-smile.md @@ -0,0 +1,5 @@ +--- +'@clerk/shared': patch +--- + +Fix publishable-key generation for production instances in local Clerk environments. diff --git a/packages/shared/src/__tests__/keys.spec.ts b/packages/shared/src/__tests__/keys.spec.ts index c9ec4d42acc..08337901099 100644 --- a/packages/shared/src/__tests__/keys.spec.ts +++ b/packages/shared/src/__tests__/keys.spec.ts @@ -19,6 +19,8 @@ describe('buildPublishableKey(frontendApi)', () => { ['foo-bar-13.clerk.accounts.dev', 'pk_test_Zm9vLWJhci0xMy5jbGVyay5hY2NvdW50cy5kZXYk'], ['clerk.boring.sawfly-91.lcl.dev', 'pk_test_Y2xlcmsuYm9yaW5nLnNhd2ZseS05MS5sY2wuZGV2JA'], ['clerk.boring.sawfly-91.lclclerk.com', 'pk_test_Y2xlcmsuYm9yaW5nLnNhd2ZseS05MS5sY2xjbGVyay5jb20k'], + ['clerk.prod.lclclerk.com', 'pk_live_Y2xlcmsucHJvZC5sY2xjbGVyay5jb20k'], + ['clerk.example.prod.lclclerk.com', 'pk_live_Y2xlcmsuZXhhbXBsZS5wcm9kLmxjbGNsZXJrLmNvbSQ'], ]; test.each(cases)( diff --git a/packages/shared/src/keys.ts b/packages/shared/src/keys.ts index c293a74bcb9..eb9139c91ae 100644 --- a/packages/shared/src/keys.ts +++ b/packages/shared/src/keys.ts @@ -36,9 +36,11 @@ const PUBLISHABLE_FRONTEND_API_DEV_REGEX = /^(([a-z]+)-){2}([0-9]{1,2})\.clerk\. * @returns An unpadded base64-encoded publishable key with appropriate prefix (pk_live_ or pk_test_). */ export function buildPublishableKey(frontendApi: string): string { - const isDevKey = - PUBLISHABLE_FRONTEND_API_DEV_REGEX.test(frontendApi) || - (frontendApi.startsWith('clerk.') && LEGACY_DEV_INSTANCE_SUFFIXES.some(s => frontendApi.endsWith(s))); + const isLegacyDevKey = + frontendApi.startsWith('clerk.') && + LEGACY_DEV_INSTANCE_SUFFIXES.some(s => frontendApi.endsWith(s)) && + !frontendApi.endsWith('.prod.lclclerk.com'); + const isDevKey = PUBLISHABLE_FRONTEND_API_DEV_REGEX.test(frontendApi) || isLegacyDevKey; const keyPrefix = isDevKey ? PUBLISHABLE_KEY_TEST_PREFIX : PUBLISHABLE_KEY_LIVE_PREFIX; return `${keyPrefix}${isomorphicBtoa(`${frontendApi}$`).replace(/=+$/, '')}`; }