// noinspection JSUnusedGlobalSymbols import { readFile } from 'node:fs/promises'; import { fileURLToPath } from 'node:url'; import { NoStatsForViteDevError } from 'storybook/internal/server-errors'; import type { Middleware, Options } from 'storybook/internal/types'; import type { ViteDevServer } from 'vite'; import { build as viteBuild } from './build'; import type { ViteBuilder } from './types'; import { createViteServer } from './vite-server'; export { withoutVitePlugins } from './utils/without-vite-plugins'; export { hasVitePlugins } from './utils/has-vite-plugins'; export * from './types'; function iframeHandler(options: Options, server: ViteDevServer): Middleware { return async (req, res) => { const indexHtml = await readFile( fileURLToPath(import.meta.resolve('@storybook/builder-vite/input/iframe.html')), { encoding: 'utf8', } ); const transformed = await server.transformIndexHtml('/iframe.html', indexHtml); res.setHeader('Content-Type', 'text/html'); res.statusCode = 200; res.write(transformed); res.end(); }; } let server: ViteDevServer; export async function bail(): Promise { return server?.close(); } export const start: ViteBuilder['start'] = async ({ startTime, options, router, server: devServer, }) => { server = await createViteServer(options as Options, devServer); router.get('/iframe.html', iframeHandler(options as Options, server)); router.use(server.middlewares); return { bail, stats: { toJson: () => { throw new NoStatsForViteDevError(); }, }, totalTime: process.hrtime(startTime), }; }; export const build: ViteBuilder['build'] = async ({ options }) => { return viteBuild(options as Options); }; export const corePresets = [import.meta.resolve('@storybook/builder-vite/preset')];