From 49ebb385867e98eddbce6fcf4f3eb4be45cf8186 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Tue, 18 Feb 2025 10:36:06 +0800 Subject: [PATCH 1/3] Index: Don't count example stories towards feature usage stats --- code/core/src/core-server/utils/StoryIndexGenerator.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/core/src/core-server/utils/StoryIndexGenerator.ts b/code/core/src/core-server/utils/StoryIndexGenerator.ts index 6b8ccf381794..882bf094dc85 100644 --- a/code/core/src/core-server/utils/StoryIndexGenerator.ts +++ b/code/core/src/core-server/utils/StoryIndexGenerator.ts @@ -5,6 +5,7 @@ import { dirname, extname, join, normalize, relative, resolve, sep } from 'node: import { commonGlobOptions, normalizeStoryPath } from '@storybook/core/common'; import { combineTags, storyNameFromExport, toId } from '@storybook/core/csf'; +import { isExampleStoryId } from '@storybook/core/telemetry'; import type { DocsIndexEntry, DocsOptions, @@ -269,7 +270,10 @@ export class StoryIndexGenerator { return item; } - addStats(item.extra.stats, statsSummary); + // don't count example stories towards feature usage stats + if (!isExampleStoryId(item.id)) { + addStats(item.extra.stats, statsSummary); + } // Drop extra data used for internal bookkeeping const { extra, ...existing } = item; From 83999c3edc087af10d200a4771aa0bedb2a9fb91 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Tue, 18 Feb 2025 11:33:32 +0800 Subject: [PATCH 2/3] Add test case --- .../utils/StoryIndexGenerator.test.ts | 39 +++++++++++++++++-- .../utils/__mockdata__/src/Button.stories.ts | 8 ++++ 2 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 code/core/src/core-server/utils/__mockdata__/src/Button.stories.ts diff --git a/code/core/src/core-server/utils/StoryIndexGenerator.test.ts b/code/core/src/core-server/utils/StoryIndexGenerator.test.ts index 38e7212379fc..7f231fb9407e 100644 --- a/code/core/src/core-server/utils/StoryIndexGenerator.test.ts +++ b/code/core/src/core-server/utils/StoryIndexGenerator.test.ts @@ -345,6 +345,19 @@ describe('StoryIndexGenerator', () => { "title": "D", "type": "story", }, + "example-button--story-one": { + "componentPath": undefined, + "id": "example-button--story-one", + "importPath": "./src/Button.stories.ts", + "name": "Story One", + "tags": [ + "dev", + "test", + "foobar", + ], + "title": "Example/Button", + "type": "story", + }, "first-nested-deeply-f--story-one": { "componentPath": undefined, "id": "first-nested-deeply-f--story-one", @@ -599,6 +612,19 @@ describe('StoryIndexGenerator', () => { "title": "D", "type": "story", }, + "example-button--story-one": { + "componentPath": undefined, + "id": "example-button--story-one", + "importPath": "./src/Button.stories.ts", + "name": "Story One", + "tags": [ + "dev", + "test", + "foobar", + ], + "title": "Example/Button", + "type": "story", + }, "first-nested-deeply-f--story-one": { "componentPath": undefined, "id": "first-nested-deeply-f--story-one", @@ -767,6 +793,8 @@ describe('StoryIndexGenerator', () => { "a--story-one", "b--docs", "b--story-one", + "example-button--docs", + "example-button--story-one", "d--docs", "d--story-one", "h--docs", @@ -809,6 +837,8 @@ describe('StoryIndexGenerator', () => { "a--story-one", "b--docs", "b--story-one", + "example-button--docs", + "example-button--story-one", "d--docs", "d--story-one", "h--docs", @@ -1797,6 +1827,7 @@ describe('StoryIndexGenerator', () => { "second-nested-g--story-one", "componentreference--docs", "notitle--docs", + "example-button--story-one", "h--story-one", "componentpath-extension--story-one", "componentpath-noextension--story-one", @@ -1825,7 +1856,7 @@ describe('StoryIndexGenerator', () => { const generator = new StoryIndexGenerator([specifier], options); await generator.initialize(); await generator.getIndex(); - expect(readCsfMock).toHaveBeenCalledTimes(11); + expect(readCsfMock).toHaveBeenCalledTimes(12); readCsfMock.mockClear(); await generator.getIndex(); @@ -1883,7 +1914,7 @@ describe('StoryIndexGenerator', () => { const generator = new StoryIndexGenerator([specifier], options); await generator.initialize(); await generator.getIndex(); - expect(readCsfMock).toHaveBeenCalledTimes(11); + expect(readCsfMock).toHaveBeenCalledTimes(12); generator.invalidate(specifier, './src/B.stories.ts', false); @@ -1968,7 +1999,7 @@ describe('StoryIndexGenerator', () => { const generator = new StoryIndexGenerator([specifier], options); await generator.initialize(); await generator.getIndex(); - expect(readCsfMock).toHaveBeenCalledTimes(11); + expect(readCsfMock).toHaveBeenCalledTimes(12); generator.invalidate(specifier, './src/B.stories.ts', true); @@ -2007,7 +2038,7 @@ describe('StoryIndexGenerator', () => { const generator = new StoryIndexGenerator([specifier], options); await generator.initialize(); await generator.getIndex(); - expect(readCsfMock).toHaveBeenCalledTimes(11); + expect(readCsfMock).toHaveBeenCalledTimes(12); generator.invalidate(specifier, './src/B.stories.ts', true); diff --git a/code/core/src/core-server/utils/__mockdata__/src/Button.stories.ts b/code/core/src/core-server/utils/__mockdata__/src/Button.stories.ts new file mode 100644 index 000000000000..80d4b4e95cdf --- /dev/null +++ b/code/core/src/core-server/utils/__mockdata__/src/Button.stories.ts @@ -0,0 +1,8 @@ +const component = {}; +export default { + title: 'Example/Button', + component, + tags: ['foobar'], +}; + +export const StoryOne = {}; From 7cc29a44dc7f67815a75a086adc03c3eb6f8c935 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Tue, 18 Feb 2025 11:53:48 +0800 Subject: [PATCH 3/3] Update snapshot --- code/core/src/core-server/utils/stories-json.test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/code/core/src/core-server/utils/stories-json.test.ts b/code/core/src/core-server/utils/stories-json.test.ts index d5ed690f1405..f2246080c9e5 100644 --- a/code/core/src/core-server/utils/stories-json.test.ts +++ b/code/core/src/core-server/utils/stories-json.test.ts @@ -255,6 +255,18 @@ describe('useStoriesJson', () => { "title": "docs2/Yabbadabbadooo", "type": "docs", }, + "example-button--story-one": { + "id": "example-button--story-one", + "importPath": "./src/Button.stories.ts", + "name": "Story One", + "tags": [ + "dev", + "test", + "foobar", + ], + "title": "Example/Button", + "type": "story", + }, "first-nested-deeply-f--story-one": { "id": "first-nested-deeply-f--story-one", "importPath": "./src/first-nested/deeply/F.stories.js",