diff --git a/.changeset/add-storybook-telemetry.md b/.changeset/add-storybook-telemetry.md new file mode 100644 index 0000000000..76aad4cfc6 --- /dev/null +++ b/.changeset/add-storybook-telemetry.md @@ -0,0 +1,5 @@ +--- +'@storybook/react-native': patch +--- + +Add Storybook telemetry when on-device Storybook is enabled, with opt-out via `STORYBOOK_DISABLE_TELEMETRY`. Telemetry runs from the unified `withStorybook` wrapper and the Re.Pack plugin. diff --git a/packages/react-native/src/metro/withStorybook.ts b/packages/react-native/src/metro/withStorybook.ts index 20a1f777ca..b870a5f173 100644 --- a/packages/react-native/src/metro/withStorybook.ts +++ b/packages/react-native/src/metro/withStorybook.ts @@ -146,9 +146,7 @@ export function withStorybook( const disableTelemetry = optionalEnvToBoolean(process.env.STORYBOOK_DISABLE_TELEMETRY); if (!disableTelemetry && enabled) { - const event = process.env.NODE_ENV === 'production' ? 'build' : 'dev'; - - telemetry(event, {}).catch((e) => {}); + telemetry('dev', {}).catch((e) => {}); } if (!enabled) { diff --git a/packages/react-native/src/repack/withStorybook.test.ts b/packages/react-native/src/repack/withStorybook.test.ts index 09f523fb93..06e067cf7e 100644 --- a/packages/react-native/src/repack/withStorybook.test.ts +++ b/packages/react-native/src/repack/withStorybook.test.ts @@ -9,6 +9,10 @@ jest.mock('../../scripts/generate', () => ({ generate: jest.fn(), })); +jest.mock('storybook/internal/telemetry', () => ({ + telemetry: jest.fn(() => Promise.resolve()), +})); + const { generate } = require('../../scripts/generate') as typeof import('../../scripts/generate'); function createCompilerMock() { diff --git a/packages/react-native/src/repack/withStorybook.ts b/packages/react-native/src/repack/withStorybook.ts index cac8a9f8f5..df2dc3ff01 100644 --- a/packages/react-native/src/repack/withStorybook.ts +++ b/packages/react-native/src/repack/withStorybook.ts @@ -2,7 +2,8 @@ import * as path from 'path'; import { generate } from '../../scripts/generate'; import { createChannelServer } from '../metro/channelServer'; import type { WebsocketsOptions } from '../types'; -import { loadWebsocketEnvOverrides } from '../env-tools'; +import { envVariableToBoolean, loadWebsocketEnvOverrides } from '../env-tools'; +import { telemetry } from 'storybook/internal/telemetry'; /** * Minimal compiler types for webpack/rspack compatibility. @@ -138,6 +139,12 @@ export class StorybookPlugin { return; } + const disableTelemetry = envVariableToBoolean(process.env.STORYBOOK_DISABLE_TELEMETRY, false); + + if (!disableTelemetry && enabled) { + telemetry('dev', {}).catch((e) => {}); + } + this.applyEnabled(compiler, { configPath, websockets, diff --git a/packages/react-native/src/withStorybook.test.ts b/packages/react-native/src/withStorybook.test.ts index 27b4133057..1a5796e274 100644 --- a/packages/react-native/src/withStorybook.test.ts +++ b/packages/react-native/src/withStorybook.test.ts @@ -16,6 +16,10 @@ jest.mock('storybook/internal/telemetry', () => ({ telemetry: jest.fn(() => Promise.resolve()), })); +jest.mock('storybook/internal/telemetry', () => ({ + telemetry: jest.fn(() => Promise.resolve()), +})); + describe('withStorybook (unified)', () => { const metroConfig = { resolver: {}, transformer: {} } as MetroConfig; diff --git a/packages/react-native/src/withStorybook.ts b/packages/react-native/src/withStorybook.ts index db9a321ff6..b9fc0a640a 100644 --- a/packages/react-native/src/withStorybook.ts +++ b/packages/react-native/src/withStorybook.ts @@ -7,6 +7,7 @@ import type { WithStorybookOptions } from './metro/utils'; import { generate } from '../scripts/generate'; import { createChannelServer } from './metro/channelServer'; import { envVariableToBoolean, loadWebsocketEnvOverrides } from './env-tools'; +import { telemetry } from 'storybook/internal/telemetry'; function isMetroConfig(config: unknown): config is MetroConfig { return config != null && typeof config === 'object' && 'transformer' in config; @@ -14,6 +15,8 @@ function isMetroConfig(config: unknown): config is MetroConfig { export function withStorybook(config: T, options: WithStorybookOptions = {}): T { const enabled = envVariableToBoolean(process.env.STORYBOOK_ENABLED, options.enabled ?? false); + const disableTelemetry = envVariableToBoolean(process.env.STORYBOOK_DISABLE_TELEMETRY, false); + if (!enabled) { return config; } @@ -24,6 +27,10 @@ export function withStorybook(config: T, options: WithStorybo ); const settings = { ...options }; + if (!disableTelemetry && enabled) { + telemetry('dev', {}).catch((e) => {}); + } + if (!server) { settings.experimental_mcp = false; }