From 5a48de8b5a201bc6a56750bbce9e3adba071792c Mon Sep 17 00:00:00 2001 From: Jacek Date: Mon, 2 Feb 2026 14:51:11 -0600 Subject: [PATCH 1/2] fix(shared): Use canary tag for 0.x.x package versions When a package has a 0.x.x version, getMajorVersion was returning '0', which creates invalid CDN URLs like @clerk/ui@0 that don't resolve. This fix returns 'canary' instead for 0.x.x versions, ensuring the URL resolves to @clerk/ui@canary which works correctly. --- .../src/__tests__/versionSelector.spec.ts | 21 +++++++++++++++++++ packages/shared/src/versionSelector.ts | 6 +++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/shared/src/__tests__/versionSelector.spec.ts b/packages/shared/src/__tests__/versionSelector.spec.ts index cfca246a633..6fa41dd34cf 100644 --- a/packages/shared/src/__tests__/versionSelector.spec.ts +++ b/packages/shared/src/__tests__/versionSelector.spec.ts @@ -52,4 +52,25 @@ describe('versionSelector', () => { ])('versionSelector(%s) should return %i', (version, expected) => { expect(versionSelector(undefined, version)).toEqual(expected.toString()); }); + + // 0.x.x versions should return 'canary' since @pkg@0 doesn't resolve properly on the CDN + test.each([ + ['0.0.1', 'canary'], + ['0.1.0', 'canary'], + ['0.2.3', 'canary'], + ['v0.0.1', 'canary'], + [' 0.0.1 ', 'canary'], + ])('versionSelector(%s) should return canary for 0.x versions', (version, expected) => { + expect(versionSelector(undefined, version)).toEqual(expected); + }); + + // 0.x.x versions with prerelease tags should still use the prerelease tag + test.each([ + ['0.0.1-next.0', 'next'], + ['0.1.0-alpha.1', 'alpha'], + ['0.2.3-beta.5', 'beta'], + ['0.0.1-snapshot.0', '0.0.1-snapshot.0'], + ])('versionSelector(%s) should return prerelease tag for 0.x prerelease versions', (version, expected) => { + expect(versionSelector(undefined, version)).toEqual(expected); + }); }); diff --git a/packages/shared/src/versionSelector.ts b/packages/shared/src/versionSelector.ts index 36230709a5b..3677108fb77 100644 --- a/packages/shared/src/versionSelector.ts +++ b/packages/shared/src/versionSelector.ts @@ -32,4 +32,8 @@ const getPrereleaseTag = (packageVersion: string) => .replace(/^v/, '') .match(/-(.+?)(\.|$)/)?.[1]; -export const getMajorVersion = (packageVersion: string) => packageVersion.trim().replace(/^v/, '').split('.')[0]; +export const getMajorVersion = (packageVersion: string) => { + const major = packageVersion.trim().replace(/^v/, '').split('.')[0]; + // For 0.x.x versions, use canary since @pkg@0 doesn't resolve properly on the CDN + return major === '0' ? 'canary' : major; +}; From a1dd33c64d02d41926f958d63705c1751cc04bd4 Mon Sep 17 00:00:00 2001 From: Jacek Date: Mon, 2 Feb 2026 14:55:47 -0600 Subject: [PATCH 2/2] chore: Add changeset --- .changeset/fix-version-selector-zero.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fix-version-selector-zero.md diff --git a/.changeset/fix-version-selector-zero.md b/.changeset/fix-version-selector-zero.md new file mode 100644 index 00000000000..6c90c7e50b0 --- /dev/null +++ b/.changeset/fix-version-selector-zero.md @@ -0,0 +1,5 @@ +--- +'@clerk/shared': patch +--- + +Fix CDN URL resolution for packages with `0.x.x` versions by returning `canary` tag instead of `0`