diff --git a/code/core/src/manager-api/modules/versions.ts b/code/core/src/manager-api/modules/versions.ts index c3b2f38ddcdc..85bcdcada282 100644 --- a/code/core/src/manager-api/modules/versions.ts +++ b/code/core/src/manager-api/modules/versions.ts @@ -102,24 +102,22 @@ export const init: ModuleFn = ({ store }) => { }, // TODO: Move this to it's own "info" module later getDocsUrl: ({ asset, subpath = asset, versioned, renderer, ref = 'ui' }) => { - const { - versions: { latest, current }, - } = store.getState(); + const { versions } = store.getState(); + const latestVersion = versions.latest?.version; + const currentVersion = versions.current?.version; + const activeVersion = + (currentVersion?.startsWith('0.0.0') && latestVersion) || currentVersion; let url = `https://storybook.js.org/${asset ? 'docs-assets' : 'docs'}/`; - if (asset && current?.version) { - url += `${semver.major(current.version)}.${semver.minor(current.version)}/`; - } else if (versioned && current?.version && latest?.version) { - const versionDiff = semver.diff(latest.version, current.version); - const isLatestDocs = - versionDiff === 'patch' || - versionDiff === null || - // assume latest version when current version is a 0.0.0 canary - semver.satisfies(current.version, '0.0.0', { includePrerelease: true }); + if (asset && activeVersion) { + url += `${semver.major(activeVersion)}.${semver.minor(activeVersion)}/`; + } else if (versioned && activeVersion && latestVersion) { + const versionDiff = semver.diff(latestVersion, activeVersion); + const isLatestDocs = versionDiff === 'patch' || versionDiff === null; if (!isLatestDocs) { - url += `${semver.major(current.version)}.${semver.minor(current.version)}/`; + url += `${semver.major(activeVersion)}.${semver.minor(activeVersion)}/`; } } diff --git a/code/core/src/manager-api/tests/versions.test.js b/code/core/src/manager-api/tests/versions.test.js index 5f3895bd0ce0..8bc1401e7745 100644 --- a/code/core/src/manager-api/tests/versions.test.js +++ b/code/core/src/manager-api/tests/versions.test.js @@ -64,6 +64,10 @@ const majorDiff = { current: { version: '6.2.1' }, latest: { version: '7.6.10' }, }; +const canary = { + current: { version: '0.0.0-canary.0' }, + latest: { version: '7.6.10' }, +}; const newerPrerelease = { current: { version: '8.0.0-beta' }, latest: { version: '7.6.10' }, @@ -186,6 +190,17 @@ describe('versions API', () => { ); }); + it('returns the latest versioned url when current is a canary', async () => { + const store = createMockStore(); + const { init, api, state: initialState } = initVersions({ store }); + + await init(); + + setVersions(store, initialState, canary); + + expect(api.getDocsUrl({ versioned: true })).toEqual('https://storybook.js.org/docs/?ref=ui'); + }); + it('returns the versioned url when current is a prerelease', async () => { const store = createMockStore(); const { init, api, state: initialState } = initVersions({ store }); @@ -250,6 +265,19 @@ describe('versions API', () => { 'https://storybook.js.org/docs-assets/7.6/api/doc-block-controls.png?ref=ui' ); }); + + it('returns the latest versioned url with assets path for canary version', async () => { + const store = createMockStore(); + const { init, api, state: initialState } = initVersions({ store }); + + await init(); + + setVersions(store, initialState, canary); + + expect(api.getDocsUrl({ asset: 'api/doc-block-controls.png' })).toEqual( + 'https://storybook.js.org/docs-assets/7.6/api/doc-block-controls.png?ref=ui' + ); + }); }); describe('versionUpdateAvailable', () => {