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` 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; +};