storybook-builder-rsbuild
Version:
Rsbuild builder for Storybook
50 lines (39 loc) • 1.66 kB
JavaScript
import { importFn } from '{{storiesFilename}}'
import { global } from '@storybook/global'
import { createBrowserChannel } from 'storybook/internal/channels'
import { STORY_HOT_UPDATED } from 'storybook/internal/core-events'
import { isPreview } from 'storybook/internal/csf'
import { addons, composeConfigs, PreviewWeb } from 'storybook/preview-api'
const getProjectAnnotations = () => {
const previewAnnotations = ['{{previewAnnotations_requires}}']
// the last one in this array is the user preview
const userPreview = previewAnnotations[previewAnnotations.length - 1]?.default
if (isPreview(userPreview)) {
return userPreview.composed
}
return composeConfigs(previewAnnotations)
}
const channel = createBrowserChannel({ page: 'preview' })
addons.setChannel(channel)
if (global.CONFIG_TYPE === 'DEVELOPMENT') {
window.__STORYBOOK_SERVER_CHANNEL__ = channel
}
const preview = new PreviewWeb(importFn, getProjectAnnotations)
window.__STORYBOOK_PREVIEW__ = preview
window.__STORYBOOK_STORY_STORE__ = preview.storyStore
window.__STORYBOOK_ADDONS_CHANNEL__ = channel
if (import.meta.webpackHot) {
import.meta.webpackHot.addStatusHandler((status) => {
if (status === 'idle') {
preview.channel.emit(STORY_HOT_UPDATED)
}
})
import.meta.webpackHot.accept('{{storiesFilename}}', () => {
// importFn has changed so we need to patch the new one in
preview.onStoriesChanged({ importFn })
})
import.meta.webpackHot.accept(['{{previewAnnotations}}'], () => {
// getProjectAnnotations has changed so we need to patch the new one in
preview.onGetProjectAnnotationsChanged({ getProjectAnnotations })
})
}