diff --git a/code/core/src/preview-api/modules/preview-web/render/MdxDocsRender.test.ts b/code/core/src/preview-api/modules/preview-web/render/MdxDocsRender.test.ts index 170483bd6512..d3d93775ba0a 100644 --- a/code/core/src/preview-api/modules/preview-web/render/MdxDocsRender.test.ts +++ b/code/core/src/preview-api/modules/preview-web/render/MdxDocsRender.test.ts @@ -115,6 +115,46 @@ describe('attaching', () => { }); }); +describe('equality', () => { + it('treats changed referenced CSF files as a docs render change', async () => { + const mdxExports = { default: () => null }; + const first = csfFileParts('meta--story', 'meta'); + const second = csfFileParts('meta--story', 'meta'); + const store = { + loadEntry: vi + .fn() + .mockResolvedValueOnce({ + entryExports: mdxExports, + csfFiles: [first.csfFile], + }) + .mockResolvedValueOnce({ + entryExports: mdxExports, + csfFiles: [second.csfFile], + }), + storyFromCSFFile: ({ csfFile }: { csfFile: typeof first.csfFile }) => + csfFile === first.csfFile ? first.story : second.story, + } as unknown as StoryStore; + + const previousRender = new MdxDocsRender( + new Channel({}), + store, + attachedEntry, + {} as RenderContextCallbacks + ); + await previousRender.prepare(); + + const nextRender = new MdxDocsRender( + new Channel({}), + store, + attachedEntry, + {} as RenderContextCallbacks + ); + await nextRender.prepare(); + + expect(nextRender.isEqual(previousRender)).toBe(false); + }); +}); + describe('docs parameters', () => { it('uses the attached CSF story docs parameters for attached MDX docs', async () => { const renderPage = vi.fn(); diff --git a/code/core/src/preview-api/modules/preview-web/render/MdxDocsRender.ts b/code/core/src/preview-api/modules/preview-web/render/MdxDocsRender.ts index 15023c923c17..691ffd8352cf 100644 --- a/code/core/src/preview-api/modules/preview-web/render/MdxDocsRender.ts +++ b/code/core/src/preview-api/modules/preview-web/render/MdxDocsRender.ts @@ -94,10 +94,16 @@ export class MdxDocsRender implements Render): boolean { + const otherRender = other as MdxDocsRender; + const sameReferencedCsfFiles = + this.csfFiles?.length === otherRender.csfFiles?.length && + this.csfFiles?.every((csfFile, index) => csfFile === otherRender.csfFiles?.[index]); + return !!( this.id === other.id && this.exports && - this.exports === (other as MdxDocsRender).exports + this.exports === otherRender.exports && + sameReferencedCsfFiles ); }