@storybook-astro/framework 1.0.3 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/{chunk-KSDXET2L.js → chunk-4HECE7IW.js} +477 -61
  2. package/dist/chunk-4HECE7IW.js.map +1 -0
  3. package/dist/{chunk-7GHEQUPV.js → chunk-POHTFYST.js} +46 -8
  4. package/dist/chunk-POHTFYST.js.map +1 -0
  5. package/dist/chunk-T7NWIO5S.js +220 -0
  6. package/dist/chunk-T7NWIO5S.js.map +1 -0
  7. package/dist/{chunk-C5OH4VBR.js → chunk-V76WSNSP.js} +124 -47
  8. package/dist/chunk-V76WSNSP.js.map +1 -0
  9. package/dist/index.d.ts +19 -9
  10. package/dist/index.js +10 -3
  11. package/dist/index.js.map +1 -1
  12. package/dist/middleware.js +57 -39
  13. package/dist/middleware.js.map +1 -1
  14. package/dist/node/index.d.ts +10 -0
  15. package/dist/node/index.js +10 -0
  16. package/dist/node/index.js.map +1 -0
  17. package/dist/preset.d.ts +1 -1
  18. package/dist/preset.js +3 -3
  19. package/dist/testing.js +12 -64
  20. package/dist/testing.js.map +1 -1
  21. package/dist/{types-CHTsRtA7.d.ts → types-Cvor6Tyi.d.ts} +21 -5
  22. package/dist/{viteStorybookAstroMiddlewarePlugin-NP2E52IC.js → viteStorybookAstroMiddlewarePlugin-2EFKTECT.js} +2 -2
  23. package/dist/vitest/global-setup.js +42 -0
  24. package/dist/vitest/global-setup.js.map +1 -0
  25. package/dist/vitest/index.js +20 -3
  26. package/dist/vitest/index.js.map +1 -1
  27. package/package.json +11 -3
  28. package/src/index.ts +21 -1
  29. package/src/lib/sanitization.ts +104 -0
  30. package/src/middleware.ts +76 -44
  31. package/src/node/index.ts +7 -0
  32. package/src/preset.ts +86 -16
  33. package/src/renderer/renderer-dev.ts +82 -0
  34. package/src/renderer/renderer-server.test.ts +101 -0
  35. package/src/renderer/renderer-server.ts +135 -0
  36. package/src/renderer/renderer-static.ts +62 -0
  37. package/src/rules.test.ts +89 -18
  38. package/src/rules.ts +67 -18
  39. package/src/server/index.ts +111 -0
  40. package/src/testing/renderer-daemon.ts +10 -1
  41. package/src/types.ts +25 -5
  42. package/src/virtual.d.ts +37 -0
  43. package/src/vite/astroFilesVirtualModulePlugin.ts +36 -0
  44. package/src/vite/createVirtualModulePlugin.ts +3 -3
  45. package/src/vite/storybookAstroRulesConfigVirtualModulePlugin.ts +37 -0
  46. package/src/vite/storybookAstroSanitizationConfigVirtualModulePlugin.ts +21 -0
  47. package/src/vite/storybookAstroServerAuthConfigVirtualModulePlugin.test.ts +71 -0
  48. package/src/vite/storybookAstroServerAuthConfigVirtualModulePlugin.ts +42 -0
  49. package/src/vitePluginAstroBuildPrerender.ts +50 -51
  50. package/src/vitePluginAstroBuildServer.ts +289 -0
  51. package/src/vitePluginAstroIntegrationOptsFallback.ts +25 -0
  52. package/src/vitePluginAstroToolbarFallback.ts +38 -0
  53. package/src/viteStorybookAstroMiddlewarePlugin.ts +40 -8
  54. package/src/viteStorybookAstroRendererPlugin.ts +45 -0
  55. package/src/vitest/config.ts +45 -4
  56. package/src/vitest/global-setup.ts +45 -0
  57. package/dist/chunk-7GHEQUPV.js.map +0 -1
  58. package/dist/chunk-C5OH4VBR.js.map +0 -1
  59. package/dist/chunk-KSDXET2L.js.map +0 -1
  60. package/dist/middleware.d.ts +0 -26
  61. package/src/msw-helpers.ts +0 -1
  62. package/src/msw.ts +0 -58
  63. /package/dist/{viteStorybookAstroMiddlewarePlugin-NP2E52IC.js.map → viteStorybookAstroMiddlewarePlugin-2EFKTECT.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/viteStorybookRendererFallbackPlugin.ts","../src/viteStorybookAstroRendererPlugin.ts","../src/vitePluginAstroBuildPrerender.ts","../src/vitePluginAstroBuildServer.ts","../src/vitePluginAstro.ts","../src/vite/astroFilesVirtualModulePlugin.ts","../src/vite/storybookAstroRulesConfigVirtualModulePlugin.ts","../src/vite/storybookAstroSanitizationConfigVirtualModulePlugin.ts","../src/vite/storybookAstroServerAuthConfigVirtualModulePlugin.ts","../src/vitePluginAstroToolbarFallback.ts","../src/preset.ts"],"sourcesContent":["import type { Integration } from './integrations/index.ts';\nimport { createVirtualModulePlugin } from './vite/createVirtualModulePlugin.ts';\n\nexport function viteStorybookRendererFallbackPlugin(integrations: Integration[]) {\n const safeIntegrations = integrations ?? [];\n\n return createVirtualModulePlugin({\n pluginName: 'storybook-renderer-fallback',\n virtualModuleId: 'virtual:storybook-renderer-fallback',\n load() {\n return safeIntegrations\n .filter((integration) => integration.storybookEntryPreview)\n .map(\n (integration) =>\n `export * as ${integration.name} from '${integration.storybookEntryPreview}';`\n )\n .join('\\n');\n }\n });\n}\n","import type { RenderMode, ServerBuildOptions } from './types.ts';\nimport { createVirtualModulePlugin } from './vite/createVirtualModulePlugin.ts';\n\nconst packageName = '@storybook-astro/framework';\n\nexport function viteStorybookAstroRendererPlugin(options: {\n mode: 'development' | 'production';\n renderMode?: RenderMode;\n server?: ServerBuildOptions;\n}) {\n const pluginName = 'storybook-astro:renderer-module';\n const virtualModuleId = 'virtual:storybook-astro-renderer';\n const isProduction = options.mode === 'production';\n const isStaticMode = options.renderMode === 'static';\n\n return createVirtualModulePlugin({\n pluginName,\n virtualModuleId,\n load() {\n if (!isProduction) {\n return `export * from '${packageName}/renderer/renderer-dev.ts';`;\n }\n\n if (isStaticMode) {\n return `export * from '${packageName}/renderer/renderer-static.ts';`;\n }\n\n return [\n `import { createServerRenderer } from '${packageName}/renderer/renderer-server.ts';`,\n `const renderer = createServerRenderer(${JSON.stringify(\n {\n serverUrl: options.server?.serverUrl,\n authToken: options.server?.authToken,\n authHeader: options.server?.authHeader\n },\n null,\n 2\n )});`,\n 'export const render = renderer.render;',\n 'export const init = renderer.init;',\n 'export const applyStyles = renderer.applyStyles;'\n ].join('\\n');\n }\n });\n}\n","import { createRequire } from 'node:module';\nimport type { Dirent } from 'node:fs';\nimport { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { experimental_AstroContainer as AstroContainer } from 'astro/container';\nimport { createServer, mergeConfig, type Plugin, type Rollup } from 'vite';\nimport { importAstroConfig } from './importAstroConfig.ts';\nimport type { Integration } from './integrations/index.ts';\nimport { ssrLoadModuleWithFsFallback } from './lib/ssr-load-module-with-fs-fallback.ts';\nimport { resolveSanitizationOptions, sanitizeRenderPayload } from './lib/sanitization.ts';\nimport { resolveStoryModuleMock, withStoryModuleMocks } from './module-mocks.ts';\nimport { resolveRulesConfigFilePath } from './rules-options.ts';\nimport { selectStoryRules, withStoryRuleCleanups } from './rules.ts';\nimport type { FrameworkOptions } from './types.ts';\nimport { vitePluginAstroFontsFallback } from './vitePluginAstroFontsFallback.ts';\nimport { vitePluginAstroIntegrationOptsFallback } from './vitePluginAstroIntegrationOptsFallback.ts';\nimport { vitePluginAstroRoutesFallback } from './vitePluginAstroRoutesFallback.ts';\nimport { vitePluginAstroVueFallback } from './vitePluginAstroVueFallback.ts';\n\nconst PRERENDERED_STORIES_FILE = 'astro-prerendered-stories.json';\n\ntype StoryIndex = {\n entries?: Record<\n string,\n {\n type?: string;\n id?: string;\n importPath?: string;\n exportName?: string;\n componentPath?: string;\n title?: string;\n name?: string;\n }\n >;\n};\n\ntype StoryEntry = {\n id: string;\n importPath: string;\n exportName: string;\n title?: string;\n name?: string;\n};\n\ntype AstroCreateResult = {\n createAstro?: (...args: unknown[]) => unknown;\n};\n\ntype AstroComponentFactory = ((\n result: AstroCreateResult,\n props: unknown,\n slots: unknown\n) => unknown) & {\n isAstroComponentFactory?: boolean;\n moduleId?: string;\n propagation?: unknown;\n};\n\nexport function vitePluginAstroBuildPrerender(options: FrameworkOptions): Plugin {\n const integrations = options.integrations ?? [];\n const resolveFrom = options.resolveFrom ?? process.cwd();\n const storyRulesConfigFilePath = resolveRulesConfigFilePath(options.storyRules, resolveFrom);\n const trackedSpecifiers = collectTrackedSpecifiers(integrations);\n const staticEntrypointRefs = new Map<string, string>();\n const componentEntrypointRefs = new Map<string, string>();\n let outDir = resolve(resolveFrom, 'storybook-static');\n\n return {\n name: 'storybook-astro:build-prerender',\n apply: 'build',\n enforce: 'post',\n\n configResolved(config) {\n outDir = resolve(resolveFrom, config.build.outDir ?? 'storybook-static');\n },\n\n resolveId(id: string) {\n if (id.startsWith('virtual:astro-static-module/')) {\n return `\\0${id}`;\n }\n\n if (id.startsWith('virtual:astro-component-module/')) {\n return `\\0${id}`;\n }\n },\n\n load(id: string) {\n if (id.startsWith('\\0virtual:astro-static-module/')) {\n const encodedSpecifier = id.replace('\\0virtual:astro-static-module/', '');\n const specifier = decodeURIComponent(encodedSpecifier);\n\n if (isClientEntrypoint(specifier)) {\n return [`export { default } from '${specifier}';`, `export * from '${specifier}';`].join('\\n');\n }\n\n return [`import '${specifier}';`, 'export default undefined;'].join('\\n');\n }\n\n if (id.startsWith('\\0virtual:astro-component-module/')) {\n const encodedSpecifier = id.replace('\\0virtual:astro-component-module/', '');\n const specifier = decodeURIComponent(encodedSpecifier);\n\n return [`export { default } from '${specifier}';`, `export * from '${specifier}';`].join('\\n');\n }\n },\n\n async buildStart(this: Rollup.PluginContext) {\n integrations.forEach((integration) => {\n const entrypoint = integration.renderer.client?.entrypoint;\n\n if (entrypoint) {\n this.addWatchFile(entrypoint);\n }\n });\n\n trackedSpecifiers.forEach((specifier) => {\n const fileReferenceId = this.emitFile({\n type: 'chunk',\n id: toStaticVirtualId(specifier)\n });\n\n staticEntrypointRefs.set(specifier, fileReferenceId);\n });\n\n const srcRoot = resolve(resolveFrom, 'src/components');\n const specifiers = await collectHydratableSourceModules(srcRoot);\n\n specifiers.forEach((specifier) => {\n const fileReferenceId = this.emitFile({\n type: 'chunk',\n id: toComponentVirtualId(specifier)\n });\n\n componentEntrypointRefs.set(specifier, fileReferenceId);\n });\n },\n\n async writeBundle(this: Rollup.PluginContext) {\n const staticModuleMap = buildStaticModuleMap(\n this,\n staticEntrypointRefs,\n componentEntrypointRefs\n );\n\n const stories = await collectAstroStories(outDir);\n\n if (stories.length === 0) {\n await writePrerenderedStoriesFile(outDir, {});\n\n return;\n }\n\n const prerenderedStories = await prerenderStories({\n stories,\n integrations,\n sanitization: options.sanitization,\n storyRulesConfigFilePath,\n staticModuleMap,\n trackedSpecifiers,\n resolveFrom\n });\n\n await writePrerenderedStoriesFile(outDir, prerenderedStories);\n }\n };\n}\n\nasync function writePrerenderedStoriesFile(outDir: string, payload: Record<string, string>) {\n await mkdir(outDir, { recursive: true });\n await writeFile(resolve(outDir, PRERENDERED_STORIES_FILE), JSON.stringify(payload), 'utf-8');\n}\n\nasync function prerenderStories(options: {\n stories: StoryEntry[];\n integrations: Integration[];\n sanitization?: FrameworkOptions['sanitization'];\n storyRulesConfigFilePath?: string;\n staticModuleMap: Record<string, string>;\n trackedSpecifiers: Set<string>;\n resolveFrom: string;\n}) {\n const sanitizationOptions = resolveSanitizationOptions(options.sanitization ?? undefined);\n const resolveClientModule = createClientModuleResolver(\n options.integrations,\n options.staticModuleMap\n );\n const viteServer = await createStorySsrServer(\n options.integrations,\n options.trackedSpecifiers,\n options.resolveFrom\n );\n const rulesConfigModule = await loadRulesConfigModule(viteServer, options.storyRulesConfigFilePath);\n\n try {\n const container = await AstroContainer.create({\n resolve: async (specifier) => {\n const mockedModule = resolveStoryModuleMock(specifier);\n\n if (mockedModule) {\n return mockedModule;\n }\n\n const resolution = resolveClientModule(specifier);\n\n if (resolution) {\n return resolution;\n }\n\n return specifier;\n }\n });\n\n await addContainerRenderers(container, options.integrations, resolveClientModule, viteServer);\n\n const output: Record<string, string> = {};\n\n for (const story of options.stories) {\n const selectedRules = await selectStoryRules({\n configModule: rulesConfigModule,\n configFilePath: options.storyRulesConfigFilePath,\n story: {\n id: story.id,\n title: story.title,\n name: story.name\n }\n });\n\n if (selectedRules.moduleMocks.size > 0) {\n viteServer.moduleGraph.invalidateAll();\n }\n\n const html = await withStoryRuleCleanups(selectedRules.cleanups, async () => {\n return withStoryModuleMocks(selectedRules.moduleMocks, async () => {\n const modulePath = resolveImportPath(story.importPath, options.resolveFrom);\n const storyModule = await viteServer.ssrLoadModule(modulePath);\n const meta = isRecord(storyModule.default) ? storyModule.default : {};\n const storyExport = isRecord(storyModule[story.exportName])\n ? storyModule[story.exportName]\n : {};\n\n if (typeof meta.component !== 'function') {\n throw new Error(\n `Unable to prerender story \"${story.id}\". Missing default export component in ${story.importPath}.`\n );\n }\n\n if (storyExport.component && storyExport.component !== meta.component) {\n return undefined;\n }\n\n const mergedArgs = mergeStoryArgs(toRecord(meta.args), toRecord(storyExport.args));\n const { args, slots } = separateSlots(mergedArgs);\n const processedArgs = await processImageMetadata(args);\n const sanitizedPayload = sanitizeRenderPayload(\n {\n args: processedArgs,\n slots\n },\n sanitizationOptions\n );\n\n return container.renderToString(\n patchCreateAstroCompat(meta.component) as Parameters<typeof container.renderToString>[0],\n {\n props: sanitizedPayload.args,\n slots: sanitizedPayload.slots\n }\n );\n });\n });\n\n if (html !== undefined) {\n output[story.id] = html;\n }\n }\n\n return output;\n } finally {\n await viteServer.close();\n }\n}\n\nasync function createStorySsrServer(\n integrations: Integration[],\n trackedSpecifiers: Set<string>,\n resolveFrom: string\n) {\n const { getViteConfig, passthroughImageService } = await importAstroConfig(resolveFrom);\n const astroConfig = await getViteConfig(\n { root: resolveFrom },\n {\n configFile: false,\n integrations: await Promise.all(\n integrations.map((integration) => integration.loadIntegration(resolveFrom))\n ),\n // Use the passthrough image service so nested components that use <Image>\n // from astro:assets render as plain <img> tags without triggering image\n // optimization (which fails in the Storybook SSR context).\n image: { service: passthroughImageService() }\n }\n )({\n mode: 'production',\n command: 'serve'\n });\n\n const config = mergeConfig(astroConfig, {\n appType: 'custom',\n server: {\n middlewareMode: true\n },\n plugins: [\n createProjectAstroResolutionPlugin(resolveFrom),\n vitePluginAstroFontsFallback(),\n vitePluginAstroIntegrationOptsFallback(),\n vitePluginAstroVueFallback(),\n vitePluginAstroRoutesFallback(),\n {\n name: 'storybook-astro:static-prerender-ssr-stubs',\n resolveId(id: string) {\n if (trackedSpecifiers.has(id)) {\n return `\\0storybook-astro-static-prerender-stub:${encodeURIComponent(id)}`;\n }\n },\n load(id: string) {\n if (id.startsWith('\\0storybook-astro-static-prerender-stub:')) {\n return 'export default undefined;';\n }\n }\n }\n ]\n });\n\n return createServer(config);\n}\n\nasync function loadRulesConfigModule(\n viteServer: Awaited<ReturnType<typeof createStorySsrServer>>,\n configFilePath?: string\n) {\n if (!configFilePath) {\n return undefined;\n }\n\n try {\n return await ssrLoadModuleWithFsFallback(viteServer, configFilePath, {\n fixStacktrace: true\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n\n throw new Error(\n `Unable to load framework.options.storyRules config module at ${configFilePath}: ${reason}`\n );\n }\n}\n\nasync function addContainerRenderers(\n container: Awaited<ReturnType<typeof AstroContainer.create>>,\n integrations: Integration[],\n resolveClientModule: (specifier: string) => string | undefined,\n viteServer: Awaited<ReturnType<typeof createStorySsrServer>>\n) {\n for (const integration of integrations) {\n const serverRenderer = integration.renderer.server;\n\n if (serverRenderer) {\n const serverRendererModule = await viteServer.ssrLoadModule(serverRenderer.entrypoint);\n const renderer = serverRendererModule.default ?? serverRendererModule;\n\n if (integration.name === 'solid' && isRecord(renderer)) {\n container.addServerRenderer({\n name: serverRenderer.name,\n renderer: {\n ...renderer,\n name: serverRenderer.name\n } as Parameters<typeof container.addServerRenderer>[0]['renderer']\n });\n } else {\n container.addServerRenderer({\n name: serverRenderer.name,\n renderer\n });\n }\n }\n\n const clientRenderer = integration.renderer.client;\n\n if (clientRenderer) {\n const resolvedEntrypoint =\n resolveClientModule(clientRenderer.entrypoint) ?? clientRenderer.entrypoint;\n\n container.addClientRenderer({\n name: clientRenderer.name,\n entrypoint: resolvedEntrypoint\n });\n }\n }\n}\n\nfunction createClientModuleResolver(\n integrations: Integration[],\n staticModuleMap: Record<string, string>\n) {\n return function resolveClientModule(specifier: string) {\n if (Object.hasOwn(staticModuleMap, specifier)) {\n return staticModuleMap[specifier];\n }\n\n const normalizedSpecifier = specifier.replace(/\\\\/g, '/').replace(/\\?.*$/, '');\n\n if (Object.hasOwn(staticModuleMap, normalizedSpecifier)) {\n return staticModuleMap[normalizedSpecifier];\n }\n\n for (const integration of integrations) {\n const resolution = integration.resolveClient(specifier);\n\n if (resolution) {\n return resolution;\n }\n }\n };\n}\n\nasync function collectAstroStories(outDir: string): Promise<StoryEntry[]> {\n const indexFile = resolve(outDir, 'index.json');\n const indexRaw = await readFile(indexFile, 'utf-8');\n const indexJson = JSON.parse(indexRaw) as StoryIndex;\n\n return Object.values(indexJson.entries ?? {})\n .filter((entry) => entry.type === 'story' && entry.componentPath?.endsWith('.astro'))\n .map((entry) => {\n if (!entry.id || !entry.importPath || !entry.exportName) {\n throw new Error(`Encountered an invalid Storybook index entry in ${indexFile}.`);\n }\n\n return {\n id: entry.id,\n importPath: entry.importPath,\n exportName: entry.exportName,\n title: entry.title,\n name: entry.name\n };\n });\n}\n\nfunction mergeStoryArgs(\n metaArgs: Record<string, unknown> | undefined,\n storyArgs: Record<string, unknown> | undefined\n) {\n return {\n ...(metaArgs ?? {}),\n ...(storyArgs ?? {})\n };\n}\n\nfunction separateSlots(inputArgs: Record<string, unknown>) {\n const args = { ...inputArgs };\n const slotsCandidate = args.slots;\n\n delete args.slots;\n\n if (!isRecord(slotsCandidate)) {\n return {\n args,\n slots: {}\n };\n }\n\n return {\n args,\n slots: slotsCandidate as Record<string, string>\n };\n}\n\nfunction resolveImportPath(importPath: string, resolveFrom: string) {\n if (importPath.startsWith('./')) {\n return resolve(resolveFrom, importPath.slice(2));\n }\n\n return resolve(resolveFrom, importPath);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n return value;\n}\n\nfunction collectTrackedSpecifiers(integrations: Integration[]) {\n const specifiers = new Set<string>(['astro:scripts/page.js', 'astro:scripts/before-hydration.js']);\n\n integrations.forEach((integration) => {\n const entrypoint = integration.renderer.client?.entrypoint;\n\n if (entrypoint) {\n specifiers.add(entrypoint);\n }\n });\n\n return specifiers;\n}\n\nfunction buildStaticModuleMap(\n pluginContext: Rollup.PluginContext,\n staticEntrypointRefs: Map<string, string>,\n componentEntrypointRefs: Map<string, string>\n) {\n const map: Record<string, string> = {};\n\n staticEntrypointRefs.forEach((fileReferenceId, specifier) => {\n const fileName = pluginContext.getFileName(fileReferenceId);\n\n if (fileName) {\n map[specifier] = toPublicPath(fileName);\n }\n });\n\n componentEntrypointRefs.forEach((fileReferenceId, specifier) => {\n const fileName = pluginContext.getFileName(fileReferenceId);\n\n if (fileName) {\n map[specifier] = toPublicPath(fileName);\n }\n });\n\n return map;\n}\n\nfunction toStaticVirtualId(specifier: string) {\n return `virtual:astro-static-module/${encodeURIComponent(specifier)}`;\n}\n\nfunction toComponentVirtualId(specifier: string) {\n return `virtual:astro-component-module/${encodeURIComponent(specifier)}`;\n}\n\nfunction isClientEntrypoint(specifier: string) {\n return specifier.startsWith('@astrojs/') && specifier.endsWith('/client.js');\n}\n\nfunction toPublicPath(fileName: string) {\n return `./${fileName}`;\n}\n\nasync function collectHydratableSourceModules(srcRoot: string): Promise<string[]> {\n const modules: string[] = [];\n\n async function walk(directory: string) {\n let entries: Dirent[];\n\n try {\n entries = await readdir(directory, { withFileTypes: true });\n } catch {\n return;\n }\n\n await Promise.all(\n entries.map(async (entry) => {\n const absolutePath = resolve(directory, entry.name);\n\n if (entry.isDirectory()) {\n await walk(absolutePath);\n\n return;\n }\n\n if (!entry.isFile()) {\n return;\n }\n\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n\n if (!isHydratableSourceFile(normalizedPath)) {\n return;\n }\n\n if (isNonHydratableSourceFile(normalizedPath)) {\n return;\n }\n\n modules.push(normalizedPath);\n })\n );\n }\n\n await walk(srcRoot);\n\n return modules;\n}\n\nfunction isHydratableSourceFile(input: string) {\n return /\\.(jsx|tsx|vue|svelte|js|ts)$/.test(input);\n}\n\nfunction isNonHydratableSourceFile(input: string) {\n return /\\.stories\\.[jt]sx?$|\\.stories\\.vue$|\\.stories\\.svelte$|\\.(spec|test)\\.[jt]sx?$/.test(\n input\n );\n}\n\nfunction patchCreateAstroCompat(component: unknown): AstroComponentFactory {\n if (typeof component !== 'function') {\n throw new Error('Expected Astro component factory to be a function.');\n }\n\n const originalComponent = component as AstroComponentFactory;\n const wrapped = ((result: AstroCreateResult, props: unknown, slots: unknown) => {\n if (result && typeof result.createAstro === 'function') {\n const originalCreateAstro = result.createAstro;\n const runtimeExpectsAstroGlobal = originalCreateAstro.length >= 3;\n\n result.createAstro = (...args: unknown[]) => {\n if (args.length === 3 && !runtimeExpectsAstroGlobal) {\n return originalCreateAstro(args[1], args[2]);\n }\n\n return originalCreateAstro(...args);\n };\n }\n\n return originalComponent(result, props, slots);\n }) as AstroComponentFactory;\n\n wrapped.isAstroComponentFactory = originalComponent.isAstroComponentFactory;\n wrapped.moduleId = originalComponent.moduleId;\n wrapped.propagation = originalComponent.propagation;\n\n return wrapped;\n}\n\nasync function processImageMetadata(\n args: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const processed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(args)) {\n if (isImageMetadata(value)) {\n // Keep ImageMetadata as a plain object — Astro's image service checks\n // isESMImportedImage (typeof src === 'object') and skips the /@fs/ string\n // validation that throws LocalImageUsedWrongly. Converting to a URL string\n // causes that error when the string starts with /@fs/.\n processed[key] = value;\n\n continue;\n }\n\n if (Array.isArray(value)) {\n processed[key] = await Promise.all(\n value.map(async (item) => {\n if (isImageMetadata(item)) {\n return item;\n }\n\n if (isRecord(item)) {\n return processImageMetadata(item);\n }\n\n return item;\n })\n );\n\n continue;\n }\n\n if (isRecord(value)) {\n processed[key] = await processImageMetadata(value);\n\n continue;\n }\n\n processed[key] = value;\n }\n\n return processed;\n}\n\nfunction isImageMetadata(value: unknown): value is Record<string, unknown> {\n return (\n isRecord(value) &&\n typeof value.src === 'string' &&\n ('width' in value || 'height' in value || 'format' in value)\n );\n}\n\n\nfunction createProjectAstroResolutionPlugin(resolveFrom: string): Plugin {\n const require = createRequire(import.meta.url);\n\n return {\n name: 'storybook-astro:resolve-project-astro-prerender',\n enforce: 'pre',\n resolveId(id: string) {\n if (id !== 'astro' && !id.startsWith('astro/')) {\n return null;\n }\n\n try {\n return require.resolve(id, {\n paths: [resolveFrom]\n });\n } catch {\n return null;\n }\n }\n };\n}\n","import type { Dirent } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { build, type Rollup } from 'vite';\nimport type { FrameworkOptions } from './types.ts';\nimport { mergeWithAstroConfig } from './vitePluginAstro.ts';\nimport { viteAstroContainerRenderersPlugin } from './viteAstroContainerRenderersPlugin.ts';\nimport { astroFilesVirtualModulePlugin } from './vite/astroFilesVirtualModulePlugin.ts';\nimport { storybookAstroStoryRulesConfigVirtualModulePlugin } from './vite/storybookAstroRulesConfigVirtualModulePlugin.ts';\nimport { storybookAstroSanitizationConfigVirtualModulePlugin } from './vite/storybookAstroSanitizationConfigVirtualModulePlugin.ts';\nimport { storybookAstroServerAuthConfigVirtualModulePlugin } from './vite/storybookAstroServerAuthConfigVirtualModulePlugin.ts';\n\nconst moduleRoot = resolve(dirname(fileURLToPath(import.meta.url)), '.');\n// packageRoot works regardless of whether this file is running from src/ or dist/\nconst packageRoot = resolve(moduleRoot, '..');\n\nexport function vitePluginAstroBuildServer(options: FrameworkOptions) {\n const integrations = options.integrations ?? [];\n const resolveFrom = options.resolveFrom ?? process.cwd();\n const storiesMap = new Map<string, Set<string>>();\n const trackedSpecifiers = collectTrackedSpecifiers(integrations);\n const staticEntrypointRefs = new Map<string, string>();\n const componentEntrypointRefs = new Map<string, string>();\n let storybookStaticOutDir = resolve(resolveFrom, 'storybook-static');\n\n return {\n name: 'storybook-astro:build-server',\n apply: 'build',\n enforce: 'post',\n\n configResolved(config: { build: { outDir?: string } }) {\n storybookStaticOutDir = resolve(resolveFrom, config.build.outDir ?? 'storybook-static');\n },\n\n resolveId(id: string, importer?: string) {\n if (id.endsWith('.astro') && importer) {\n const absoluteAstroPath = resolve(dirname(importer), id);\n\n if (!storiesMap.has(absoluteAstroPath)) {\n storiesMap.set(absoluteAstroPath, new Set());\n }\n\n storiesMap.get(absoluteAstroPath)?.add(importer);\n }\n\n if (id.startsWith('virtual:astro-static-module/')) {\n return `\\0${id}`;\n }\n\n if (id.startsWith('virtual:astro-component-module/')) {\n return `\\0${id}`;\n }\n },\n\n load(id: string) {\n if (id.startsWith('\\0virtual:astro-static-module/')) {\n const encodedSpecifier = id.replace('\\0virtual:astro-static-module/', '');\n const specifier = decodeURIComponent(encodedSpecifier);\n\n if (isClientEntrypoint(specifier)) {\n return [`export { default } from '${specifier}';`, `export * from '${specifier}';`].join('\\n');\n }\n\n return [`import '${specifier}';`, 'export default undefined;'].join('\\n');\n }\n\n if (id.startsWith('\\0virtual:astro-component-module/')) {\n const encodedSpecifier = id.replace('\\0virtual:astro-component-module/', '');\n const specifier = decodeURIComponent(encodedSpecifier);\n\n return [`export { default } from '${specifier}';`, `export * from '${specifier}';`].join('\\n');\n }\n },\n\n async buildStart(this: Rollup.PluginContext) {\n integrations.forEach((integration) => {\n const entrypoint = integration.renderer.client?.entrypoint;\n\n if (entrypoint) {\n this.addWatchFile(entrypoint);\n }\n });\n\n trackedSpecifiers.forEach((specifier) => {\n const fileReferenceId = this.emitFile({\n type: 'chunk',\n id: toStaticVirtualId(specifier)\n });\n\n staticEntrypointRefs.set(specifier, fileReferenceId);\n });\n\n const srcRoot = resolve(resolveFrom, 'src/components');\n const specifiers = await collectHydratableSourceModules(srcRoot);\n\n specifiers.forEach((specifier) => {\n const fileReferenceId = this.emitFile({\n type: 'chunk',\n id: toComponentVirtualId(specifier)\n });\n\n componentEntrypointRefs.set(specifier, fileReferenceId);\n });\n },\n\n async writeBundle(this: Rollup.PluginContext) {\n const astroComponents = Array.from(storiesMap.keys());\n const staticModuleMap = buildStaticModuleMap(\n this,\n staticEntrypointRefs,\n componentEntrypointRefs\n );\n const serverOutDir = resolve(dirname(storybookStaticOutDir), 'storybook-server');\n\n await buildAstroServer({\n astroComponents,\n integrations,\n sanitization: options.sanitization,\n storyRules: options.storyRules,\n server: options.server,\n outDir: serverOutDir,\n staticModuleMap,\n resolveFrom\n });\n }\n };\n}\n\nasync function buildAstroServer(options: {\n astroComponents: string[];\n integrations: FrameworkOptions['integrations'];\n sanitization?: FrameworkOptions['sanitization'];\n storyRules?: FrameworkOptions['storyRules'];\n server?: FrameworkOptions['server'];\n outDir: string;\n staticModuleMap: Record<string, string>;\n resolveFrom: string;\n}) {\n const buildConfig = {\n root: resolve(packageRoot, 'src/server'),\n ssr: {\n noExternal: /(@astrojs\\/.+|react|react-dom)/\n },\n build: {\n ssr: true,\n outDir: options.outDir,\n emptyOutDir: true,\n sourcemap: true,\n manifest: false,\n rollupOptions: {\n input: resolve(packageRoot, 'src/server/index.ts'),\n treeshake: true\n }\n },\n plugins: [\n astroFilesVirtualModulePlugin(options.astroComponents),\n storybookAstroSanitizationConfigVirtualModulePlugin(options.sanitization),\n storybookAstroStoryRulesConfigVirtualModulePlugin(options.storyRules, options.resolveFrom),\n storybookAstroServerAuthConfigVirtualModulePlugin(options.server),\n viteAstroContainerRenderersPlugin(options.integrations, {\n mode: 'production',\n staticModuleMap: options.staticModuleMap\n })\n ]\n };\n\n const finalConfig = await mergeWithAstroConfig(\n buildConfig,\n options.integrations,\n options.resolveFrom,\n 'production',\n 'build'\n );\n\n await build(finalConfig);\n}\n\nfunction collectTrackedSpecifiers(integrations: FrameworkOptions['integrations']) {\n const specifiers = new Set<string>(['astro:scripts/page.js', 'astro:scripts/before-hydration.js']);\n\n integrations.forEach((integration) => {\n const entrypoint = integration.renderer.client?.entrypoint;\n\n if (entrypoint) {\n specifiers.add(entrypoint);\n }\n });\n\n return specifiers;\n}\n\nfunction buildStaticModuleMap(\n pluginContext: Rollup.PluginContext,\n staticEntrypointRefs: Map<string, string>,\n componentEntrypointRefs: Map<string, string>\n) {\n const map: Record<string, string> = {};\n\n staticEntrypointRefs.forEach((fileReferenceId, specifier) => {\n const fileName = pluginContext.getFileName(fileReferenceId);\n\n if (fileName) {\n map[specifier] = toPublicPath(fileName);\n }\n });\n\n componentEntrypointRefs.forEach((fileReferenceId, specifier) => {\n const fileName = pluginContext.getFileName(fileReferenceId);\n\n if (fileName) {\n map[specifier] = toPublicPath(fileName);\n }\n });\n\n return map;\n}\n\nfunction toStaticVirtualId(specifier: string) {\n return `virtual:astro-static-module/${encodeURIComponent(specifier)}`;\n}\n\nfunction toComponentVirtualId(specifier: string) {\n return `virtual:astro-component-module/${encodeURIComponent(specifier)}`;\n}\n\nfunction isClientEntrypoint(specifier: string) {\n return specifier.startsWith('@astrojs/') && specifier.endsWith('/client.js');\n}\n\nfunction toPublicPath(fileName: string) {\n return `./${fileName}`;\n}\n\nasync function collectHydratableSourceModules(srcRoot: string): Promise<string[]> {\n const modules: string[] = [];\n\n async function walk(directory: string) {\n let entries: Dirent[];\n\n try {\n entries = await readdir(directory, { withFileTypes: true });\n } catch {\n return;\n }\n\n await Promise.all(\n entries.map(async (entry) => {\n const absolutePath = resolve(directory, entry.name);\n\n if (entry.isDirectory()) {\n await walk(absolutePath);\n\n return;\n }\n\n if (!entry.isFile()) {\n return;\n }\n\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n\n if (!isHydratableSourceFile(normalizedPath)) {\n return;\n }\n\n if (isNonHydratableSourceFile(normalizedPath)) {\n return;\n }\n\n modules.push(normalizedPath);\n })\n );\n }\n\n await walk(srcRoot);\n\n return modules;\n}\n\nfunction isHydratableSourceFile(input: string) {\n return /\\.(jsx|tsx|vue|svelte|js|ts)$/.test(input);\n}\n\nfunction isNonHydratableSourceFile(input: string) {\n return /\\.stories\\.[jt]sx?$|\\.stories\\.vue$|\\.stories\\.svelte$|\\.(spec|test)\\.[jt]sx?$/.test(\n input\n );\n}\n","import { mergeConfig, type InlineConfig } from 'vite';\nimport type { Integration } from './integrations/index.ts';\nimport { importAstroConfig } from './importAstroConfig.ts';\n\nconst ASTRO_PLUGINS_THAT_ARE_SUPPOSEDLY_NOT_NEEDED_IN_STORYBOOK = [\n '@astro/plugin-actions',\n '@astrojs/vite-plugin-astro-ssr-manifest',\n 'astro-content-virtual-mod-plugin',\n 'astro:actions',\n 'astro:build:normal',\n 'astro:container',\n 'astro:content-asset-propagation',\n 'astro:content-imports',\n 'astro:content-listen',\n 'astro:dev-toolbar',\n 'astro:head-metadata',\n 'astro:html',\n 'astro:i18n',\n 'astro:integration-container',\n 'astro:jsx',\n 'astro:markdown',\n 'astro:postprocess',\n 'astro:prefetch',\n 'astro:scanner',\n 'astro:scripts:page-ssr',\n 'astro:server',\n 'astro:vite-plugin-env',\n 'astro:vite-plugin-file-url'\n];\n\nexport async function mergeWithAstroConfig(\n config: InlineConfig,\n integrations: Integration[] = [],\n resolveFrom = process.cwd(),\n mode = 'development',\n command: 'build' | 'serve' = 'serve'\n) {\n const { getViteConfig } = await importAstroConfig(resolveFrom);\n const safeIntegrations = integrations ?? [];\n\n const astroConfig = await getViteConfig(\n {},\n {\n configFile: false,\n integrations: await Promise.all(\n safeIntegrations.map((integration) => integration.loadIntegration(resolveFrom))\n )\n }\n )({\n mode,\n command\n });\n\n const filteredPlugins = astroConfig\n .plugins!.flat()\n .filter(\n (plugin) =>\n plugin &&\n 'name' in plugin &&\n !ASTRO_PLUGINS_THAT_ARE_SUPPOSEDLY_NOT_NEEDED_IN_STORYBOOK.includes(plugin.name)\n );\n\n return mergeConfig(config, {\n ...astroConfig,\n plugins: filteredPlugins\n });\n}\n","import type { Plugin } from 'vite';\nimport { createVirtualModulePlugin } from './createVirtualModulePlugin.ts';\n\ntype ImportRecord = {\n id: string;\n file: string;\n importStatement: string;\n};\n\nexport function astroFilesVirtualModulePlugin(astroComponents: string[]): Plugin {\n return createVirtualModulePlugin({\n pluginName: 'storybook-astro:virtual-astro-files',\n virtualModuleId: 'virtual:astro-files',\n load() {\n const imports = astroComponents.reduce<ImportRecord[]>((records, file, index) => {\n const moduleId = `_astroFile${index}`;\n\n return [\n ...records,\n {\n id: moduleId,\n file,\n importStatement: `import ${moduleId} from '${file}';`\n }\n ];\n }, []);\n\n return [\n imports.map(({ importStatement }) => importStatement).join('\\n'),\n 'export default {',\n imports.map(({ file, id }) => `'${file}': ${id}`).join(',\\n'),\n '};'\n ].join('\\n');\n }\n });\n}\n","import type { Plugin } from 'vite';\nimport type { StoryRulesOptions } from '../rules-options.ts';\nimport { resolveRulesConfigFilePath } from '../rules-options.ts';\nimport { createVirtualModulePlugin } from './createVirtualModulePlugin.ts';\n\nexport const STORYBOOK_ASTRO_STORY_RULES_CONFIG_VIRTUAL_MODULE_ID =\n 'virtual:storybook-astro-story-rules-config';\n\nexport function storybookAstroStoryRulesConfigVirtualModulePlugin(\n options?: StoryRulesOptions,\n resolveFrom = process.cwd()\n): Plugin {\n return createVirtualModulePlugin({\n pluginName: 'storybook-astro:virtual-story-rules-config',\n virtualModuleId: STORYBOOK_ASTRO_STORY_RULES_CONFIG_VIRTUAL_MODULE_ID,\n load() {\n const configFilePath = resolveRulesConfigFilePath(options, resolveFrom);\n\n if (!configFilePath) {\n return [\n 'const storybookAstroStoryRulesConfig = { rules: [] };',\n 'export default storybookAstroStoryRulesConfig;',\n 'export const storybookAstroStoryRulesConfigFilePath = undefined;'\n ].join('\\n');\n }\n\n const importPath = JSON.stringify(configFilePath.replace(/\\\\/g, '/'));\n const configPath = JSON.stringify(configFilePath.replace(/\\\\/g, '/'));\n\n return [\n `import * as storybookAstroStoryRulesConfigModule from ${importPath};`,\n 'export default storybookAstroStoryRulesConfigModule;',\n `export const storybookAstroStoryRulesConfigFilePath = ${configPath};`\n ].join('\\n');\n }\n });\n}\n","import type { Plugin } from 'vite';\nimport type { SanitizationOptions } from '../lib/sanitization.ts';\nimport { serializeSanitizationOptions } from '../lib/sanitization.ts';\nimport { createVirtualModulePlugin } from './createVirtualModulePlugin.ts';\n\nexport const STORYBOOK_ASTRO_SANITIZATION_CONFIG_VIRTUAL_MODULE_ID =\n 'virtual:storybook-astro-sanitization-config';\n\nexport function storybookAstroSanitizationConfigVirtualModulePlugin(\n options?: SanitizationOptions\n): Plugin {\n return createVirtualModulePlugin({\n pluginName: 'storybook-astro:virtual-sanitization-config',\n virtualModuleId: STORYBOOK_ASTRO_SANITIZATION_CONFIG_VIRTUAL_MODULE_ID,\n load() {\n const serializedConfig = serializeSanitizationOptions(options);\n\n return `export default ${serializedConfig};`;\n }\n });\n}\n","import type { Plugin } from 'vite';\nimport type { ServerBuildOptions } from '../types.ts';\nimport { createVirtualModulePlugin } from './createVirtualModulePlugin.ts';\n\nexport const STORYBOOK_ASTRO_SERVER_AUTH_CONFIG_VIRTUAL_MODULE_ID =\n 'virtual:storybook-astro-server-auth-config';\n\nexport function storybookAstroServerAuthConfigVirtualModulePlugin(\n options?: ServerBuildOptions\n): Plugin {\n const authToken = normalizeOptionalString(options?.authToken);\n const authHeader = normalizeAuthHeader(options?.authHeader);\n\n return createVirtualModulePlugin({\n pluginName: 'storybook-astro:virtual-server-auth-config',\n virtualModuleId: STORYBOOK_ASTRO_SERVER_AUTH_CONFIG_VIRTUAL_MODULE_ID,\n load() {\n return [\n `export const storybookAstroServerAuthToken = ${\n authToken ? JSON.stringify(authToken) : 'undefined'\n };`,\n `export const storybookAstroServerAuthHeader = ${JSON.stringify(authHeader)};`\n ].join('\\n');\n }\n });\n}\n\nfunction normalizeOptionalString(value: string | undefined) {\n if (!value) {\n return undefined;\n }\n\n const normalizedValue = value.trim();\n\n return normalizedValue || undefined;\n}\n\nfunction normalizeAuthHeader(value: string | undefined) {\n const normalizedValue = normalizeOptionalString(value);\n\n return (normalizedValue ?? 'authorization').toLowerCase();\n}\n","import type { Plugin } from 'vite';\n\nconst TOOLBAR_INTERNAL_STUB = `\nexport const loadDevToolbarApps = async () => [];\n`;\n\n/**\n * Provides a fallback stub for Astro's dev toolbar virtual module.\n *\n * Astro's `astro/dist/runtime/client/dev-toolbar/entrypoint.js` imports\n * from `astro:toolbar:internal`, a virtual module normally provided by\n * Astro's own `vite-plugin-dev-toolbar` Vite plugin. In the Storybook\n * context that plugin is not active, causing esbuild to fail during\n * dependency optimisation when it encounters the unresolvable import.\n *\n * Storybook doesn't use Astro's dev toolbar, so a no-op stub is safe.\n */\nexport function vitePluginAstroToolbarFallback(): Plugin {\n const VIRTUAL_ID = 'astro:toolbar:internal';\n const RESOLVED_ID = '\\0' + VIRTUAL_ID;\n\n return {\n name: 'storybook-astro-toolbar-fallback',\n enforce: 'pre',\n\n resolveId(id) {\n if (id === VIRTUAL_ID) {\n return RESOLVED_ID;\n }\n },\n\n load(id) {\n if (id === RESOLVED_ID) {\n return { code: TOOLBAR_INTERNAL_STUB };\n }\n }\n };\n}\n","import type { StorybookConfigVite, FrameworkOptions } from './types.ts';\nimport { vitePluginStorybookAstroMiddleware } from './viteStorybookAstroMiddlewarePlugin.ts';\nimport { viteStorybookRendererFallbackPlugin } from './viteStorybookRendererFallbackPlugin.ts';\nimport { viteStorybookAstroRendererPlugin } from './viteStorybookAstroRendererPlugin.ts';\nimport { vitePluginAstroComponentMarker } from './vitePluginAstroComponentMarker.ts';\nimport { vitePluginAstroBuildPrerender } from './vitePluginAstroBuildPrerender.ts';\nimport { vitePluginAstroBuildServer } from './vitePluginAstroBuildServer.ts';\nimport { vitePluginAstroIntegrationOptsFallback } from './vitePluginAstroIntegrationOptsFallback.ts';\nimport { vitePluginAstroVueFallback } from './vitePluginAstroVueFallback.ts';\nimport { vitePluginAstroToolbarFallback } from './vitePluginAstroToolbarFallback.ts';\nimport { resolveSanitizationOptions } from './lib/sanitization.ts';\nimport { mergeWithAstroConfig } from './vitePluginAstro.ts';\n\nexport const core = {\n builder: '@storybook/builder-vite',\n // Use import.meta.resolve so Storybook receives an absolute file:// URL\n // to the renderer preset rather than a bare package specifier. When\n // package managers like pnpm use strict node_modules isolation, bare\n // specifiers are resolved from the *project root*, where the renderer\n // (a dep of this framework, not the user's project) is not hoisted.\n // The absolute URL is resolved from *this* file's location where the\n // renderer is always accessible as a direct dependency.\n renderer: import.meta.resolve('@storybook-astro/renderer')\n};\n\nexport const viteFinal: StorybookConfigVite['viteFinal'] = async (config, { configType, presets }) => {\n const options = await presets.apply<FrameworkOptions>('frameworkOptions');\n\n if (!config.plugins) {\n config.plugins = [];\n }\n\n const integrations = options.integrations ?? [];\n const resolveFrom = options.resolveFrom ?? process.cwd();\n const renderMode = options.renderMode ?? 'server';\n const mode = configType === 'DEVELOPMENT' ? 'development' : 'production';\n const command = configType === 'DEVELOPMENT' ? 'serve' : 'build';\n\n resolveSanitizationOptions(options.sanitization);\n\n config.envPrefix = mergeEnvPrefixes(config.envPrefix, 'STORYBOOK_');\n\n const { vitePlugin: storybookAstroMiddlewarePlugin, viteConfig } =\n await vitePluginStorybookAstroMiddleware(options);\n\n config.plugins.push(\n viteStorybookRendererFallbackPlugin(integrations),\n viteStorybookAstroRendererPlugin({\n mode,\n renderMode,\n server: options.server\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vitePluginAstroComponentMarker() as any,\n vitePluginAstroIntegrationOptsFallback(),\n vitePluginAstroToolbarFallback(),\n vitePluginAstroVueFallback(),\n );\n\n if (configType === 'DEVELOPMENT') {\n config.plugins.push(storybookAstroMiddlewarePlugin, ...viteConfig.plugins);\n } else if (renderMode === 'static') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n config.plugins.push(vitePluginAstroBuildPrerender(options) as any);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n config.plugins.push(vitePluginAstroBuildServer(options) as any);\n }\n\n if (configType !== 'DEVELOPMENT') {\n config.build = {\n ...(config.build ?? {}),\n manifest: true\n };\n\n config.build.rollupOptions = {\n ...(config.build.rollupOptions ?? {}),\n preserveEntrySignatures: 'strict'\n };\n }\n\n // Add React/ReactDOM aliases for storybook-solidjs compatibility\n if (!config.resolve) {\n config.resolve = {};\n }\n if (!config.resolve.alias) {\n config.resolve.alias = {};\n }\n \n // Ensure React is available for storybook-solidjs\n const aliases = config.resolve.alias as Record<string, string>;\n\n if (!aliases['react']) {\n aliases['react'] = 'react';\n }\n if (!aliases['react-dom']) {\n aliases['react-dom'] = 'react-dom';\n }\n\n const finalConfig = await mergeWithAstroConfig(config, integrations, resolveFrom, mode, command);\n\n // Exclude Astro integration packages from dependency optimization because\n // they import virtual modules that esbuild cannot resolve.\n if (!finalConfig.optimizeDeps) {\n finalConfig.optimizeDeps = {};\n }\n if (!finalConfig.optimizeDeps.exclude) {\n finalConfig.optimizeDeps.exclude = [];\n }\n for (const pkg of ['@astrojs/vue', '@astrojs/react', '@astrojs/preact']) {\n if (!finalConfig.optimizeDeps.exclude.includes(pkg)) {\n finalConfig.optimizeDeps.exclude.push(pkg);\n }\n }\n // Exclude the renderer from Vite's esbuild pre-bundler so that\n // import.meta.hot is preserved in the preview iframe. When installed\n // via npm (not workspace:*), Vite would otherwise pre-bundle the\n // renderer with esbuild, which strips import.meta.hot and causes the\n // renderer to fall back to fetching astro-prerendered-stories.json\n // (a 404 in dev mode) rather than using the Vite HMR channel.\n if (!finalConfig.optimizeDeps.exclude.includes('@storybook-astro/renderer')) {\n finalConfig.optimizeDeps.exclude.push('@storybook-astro/renderer');\n }\n // Mark integration virtual modules as external so the dep bundler doesn't\n // try to resolve them (they are Vite virtual modules with no real package).\n // Set both esbuildOptions (Vite ≤7) and rolldownOptions (Vite 8+, Rolldown)\n // so the correct key is populated regardless of Vite version.\n const integrationVirtualModules = [\n 'virtual:@astrojs/vue/app',\n 'virtual:astro:vue-app',\n 'astro:react:opts',\n 'astro:preact:opts',\n 'astro:toolbar:internal'\n ];\n\n // Vite ≤7 (esbuild-based optimizer)\n if (!finalConfig.optimizeDeps.esbuildOptions) {\n finalConfig.optimizeDeps.esbuildOptions = {};\n }\n if (!finalConfig.optimizeDeps.esbuildOptions.external) {\n finalConfig.optimizeDeps.esbuildOptions.external = [];\n }\n for (const mod of integrationVirtualModules) {\n if (!finalConfig.optimizeDeps.esbuildOptions.external.includes(mod)) {\n finalConfig.optimizeDeps.esbuildOptions.external.push(mod);\n }\n }\n\n // Vite 8+ (Rolldown-based optimizer) — same semantics, different key\n // Use a loose cast because rolldownOptions is absent from Vite <8 types.\n const optimizeDepsMut = finalConfig.optimizeDeps as Record<string, unknown>;\n const rolldownOpts = (optimizeDepsMut.rolldownOptions ?? {}) as { external?: string[] };\n\n rolldownOpts.external = Array.from(\n new Set([...(rolldownOpts.external ?? []), ...integrationVirtualModules])\n );\n optimizeDepsMut.rolldownOptions = rolldownOpts;\n\n return finalConfig;\n};\n\nfunction mergeEnvPrefixes(\n existing: string | string[] | undefined,\n additionalPrefix: string\n): string[] {\n const prefixes = Array.isArray(existing) ? existing : existing ? [existing] : [];\n\n return Array.from(new Set([...prefixes, additionalPrefix]));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,SAAS,oCAAoC,cAA6B;AAC/E,QAAM,mBAAmB,gBAAgB,CAAC;AAE1C,SAAO,0BAA0B;AAAA,IAC/B,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AACL,aAAO,iBACJ,OAAO,CAAC,gBAAgB,YAAY,qBAAqB,EACzD;AAAA,QACC,CAAC,gBACC,eAAe,YAAY,IAAI,UAAU,YAAY,qBAAqB;AAAA,MAC9E,EACC,KAAK,IAAI;AAAA,IACd;AAAA,EACF,CAAC;AACH;;;AChBA,IAAM,cAAc;AAEb,SAAS,iCAAiC,SAI9C;AACD,QAAM,aAAa;AACnB,QAAM,kBAAkB;AACxB,QAAM,eAAe,QAAQ,SAAS;AACtC,QAAM,eAAe,QAAQ,eAAe;AAE5C,SAAO,0BAA0B;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,OAAO;AACL,UAAI,CAAC,cAAc;AACjB,eAAO,kBAAkB,WAAW;AAAA,MACtC;AAEA,UAAI,cAAc;AAChB,eAAO,kBAAkB,WAAW;AAAA,MACtC;AAEA,aAAO;AAAA,QACL,yCAAyC,WAAW;AAAA,QACpD,yCAAyC,KAAK;AAAA,UAC5C;AAAA,YACE,WAAW,QAAQ,QAAQ;AAAA,YAC3B,WAAW,QAAQ,QAAQ;AAAA,YAC3B,YAAY,QAAQ,QAAQ;AAAA,UAC9B;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF,CAAC;AACH;;;AC5CA,SAAS,qBAAqB;AAE9B,SAAS,OAAO,UAAU,SAAS,iBAAiB;AACpD,SAAS,eAAe;AACxB,SAAS,+BAA+B,sBAAsB;AAC9D,SAAS,cAAc,mBAA6C;AAcpE,IAAM,2BAA2B;AAuC1B,SAAS,8BAA8B,SAAmC;AAC/E,QAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,QAAM,cAAc,QAAQ,eAAe,QAAQ,IAAI;AACvD,QAAM,2BAA2B,2BAA2B,QAAQ,YAAY,WAAW;AAC3F,QAAM,oBAAoB,yBAAyB,YAAY;AAC/D,QAAM,uBAAuB,oBAAI,IAAoB;AACrD,QAAM,0BAA0B,oBAAI,IAAoB;AACxD,MAAI,SAAS,QAAQ,aAAa,kBAAkB;AAEpD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IAET,eAAe,QAAQ;AACrB,eAAS,QAAQ,aAAa,OAAO,MAAM,UAAU,kBAAkB;AAAA,IACzE;AAAA,IAEA,UAAU,IAAY;AACpB,UAAI,GAAG,WAAW,8BAA8B,GAAG;AACjD,eAAO,KAAK,EAAE;AAAA,MAChB;AAEA,UAAI,GAAG,WAAW,iCAAiC,GAAG;AACpD,eAAO,KAAK,EAAE;AAAA,MAChB;AAAA,IACF;AAAA,IAEA,KAAK,IAAY;AACf,UAAI,GAAG,WAAW,gCAAgC,GAAG;AACnD,cAAM,mBAAmB,GAAG,QAAQ,kCAAkC,EAAE;AACxE,cAAM,YAAY,mBAAmB,gBAAgB;AAErD,YAAI,mBAAmB,SAAS,GAAG;AACjC,iBAAO,CAAC,4BAA4B,SAAS,MAAM,kBAAkB,SAAS,IAAI,EAAE,KAAK,IAAI;AAAA,QAC/F;AAEA,eAAO,CAAC,WAAW,SAAS,MAAM,2BAA2B,EAAE,KAAK,IAAI;AAAA,MAC1E;AAEA,UAAI,GAAG,WAAW,mCAAmC,GAAG;AACtD,cAAM,mBAAmB,GAAG,QAAQ,qCAAqC,EAAE;AAC3E,cAAM,YAAY,mBAAmB,gBAAgB;AAErD,eAAO,CAAC,4BAA4B,SAAS,MAAM,kBAAkB,SAAS,IAAI,EAAE,KAAK,IAAI;AAAA,MAC/F;AAAA,IACF;AAAA,IAEA,MAAM,aAAuC;AAC3C,mBAAa,QAAQ,CAAC,gBAAgB;AACpC,cAAM,aAAa,YAAY,SAAS,QAAQ;AAEhD,YAAI,YAAY;AACd,eAAK,aAAa,UAAU;AAAA,QAC9B;AAAA,MACF,CAAC;AAED,wBAAkB,QAAQ,CAAC,cAAc;AACvC,cAAM,kBAAkB,KAAK,SAAS;AAAA,UACpC,MAAM;AAAA,UACN,IAAI,kBAAkB,SAAS;AAAA,QACjC,CAAC;AAED,6BAAqB,IAAI,WAAW,eAAe;AAAA,MACrD,CAAC;AAED,YAAM,UAAU,QAAQ,aAAa,gBAAgB;AACrD,YAAM,aAAa,MAAM,+BAA+B,OAAO;AAE/D,iBAAW,QAAQ,CAAC,cAAc;AAChC,cAAM,kBAAkB,KAAK,SAAS;AAAA,UACpC,MAAM;AAAA,UACN,IAAI,qBAAqB,SAAS;AAAA,QACpC,CAAC;AAED,gCAAwB,IAAI,WAAW,eAAe;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,cAAwC;AAC5C,YAAM,kBAAkB;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,oBAAoB,MAAM;AAEhD,UAAI,QAAQ,WAAW,GAAG;AACxB,cAAM,4BAA4B,QAAQ,CAAC,CAAC;AAE5C;AAAA,MACF;AAEA,YAAM,qBAAqB,MAAM,iBAAiB;AAAA,QAChD;AAAA,QACA;AAAA,QACA,cAAc,QAAQ;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,4BAA4B,QAAQ,kBAAkB;AAAA,IAC9D;AAAA,EACF;AACF;AAEA,eAAe,4BAA4B,QAAgB,SAAiC;AAC1F,QAAM,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AACvC,QAAM,UAAU,QAAQ,QAAQ,wBAAwB,GAAG,KAAK,UAAU,OAAO,GAAG,OAAO;AAC7F;AAEA,eAAe,iBAAiB,SAQ7B;AACD,QAAM,sBAAsB,2BAA2B,QAAQ,gBAAgB,MAAS;AACxF,QAAM,sBAAsB;AAAA,IAC1B,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,aAAa,MAAM;AAAA,IACvB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,oBAAoB,MAAM,sBAAsB,YAAY,QAAQ,wBAAwB;AAElG,MAAI;AACF,UAAM,YAAY,MAAM,eAAe,OAAO;AAAA,MAC5C,SAAS,OAAO,cAAc;AAC5B,cAAM,eAAe,uBAAuB,SAAS;AAErD,YAAI,cAAc;AAChB,iBAAO;AAAA,QACT;AAEA,cAAM,aAAa,oBAAoB,SAAS;AAEhD,YAAI,YAAY;AACd,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,UAAM,sBAAsB,WAAW,QAAQ,cAAc,qBAAqB,UAAU;AAE5F,UAAM,SAAiC,CAAC;AAExC,eAAW,SAAS,QAAQ,SAAS;AACnC,YAAM,gBAAgB,MAAM,iBAAiB;AAAA,QAC3C,cAAc;AAAA,QACd,gBAAgB,QAAQ;AAAA,QACxB,OAAO;AAAA,UACL,IAAI,MAAM;AAAA,UACV,OAAO,MAAM;AAAA,UACb,MAAM,MAAM;AAAA,QACd;AAAA,MACF,CAAC;AAED,UAAI,cAAc,YAAY,OAAO,GAAG;AACtC,mBAAW,YAAY,cAAc;AAAA,MACvC;AAEA,YAAM,OAAO,MAAM,sBAAsB,cAAc,UAAU,YAAY;AAC3E,eAAO,qBAAqB,cAAc,aAAa,YAAY;AACjE,gBAAM,aAAa,kBAAkB,MAAM,YAAY,QAAQ,WAAW;AAC1E,gBAAM,cAAc,MAAM,WAAW,cAAc,UAAU;AAC7D,gBAAM,OAAO,SAAS,YAAY,OAAO,IAAI,YAAY,UAAU,CAAC;AACpE,gBAAM,cAAc,SAAS,YAAY,MAAM,UAAU,CAAC,IACtD,YAAY,MAAM,UAAU,IAC5B,CAAC;AAEL,cAAI,OAAO,KAAK,cAAc,YAAY;AACxC,kBAAM,IAAI;AAAA,cACR,8BAA8B,MAAM,EAAE,0CAA0C,MAAM,UAAU;AAAA,YAClG;AAAA,UACF;AAEA,cAAI,YAAY,aAAa,YAAY,cAAc,KAAK,WAAW;AACrE,mBAAO;AAAA,UACT;AAEA,gBAAM,aAAa,eAAe,SAAS,KAAK,IAAI,GAAG,SAAS,YAAY,IAAI,CAAC;AACjF,gBAAM,EAAE,MAAM,MAAM,IAAI,cAAc,UAAU;AAChD,gBAAM,gBAAgB,MAAM,qBAAqB,IAAI;AACrD,gBAAM,mBAAmB;AAAA,YACvB;AAAA,cACE,MAAM;AAAA,cACN;AAAA,YACF;AAAA,YACA;AAAA,UACF;AAEA,iBAAO,UAAU;AAAA,YACf,uBAAuB,KAAK,SAAS;AAAA,YACrC;AAAA,cACE,OAAO,iBAAiB;AAAA,cACxB,OAAO,iBAAiB;AAAA,YAC1B;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,UAAI,SAAS,QAAW;AACtB,eAAO,MAAM,EAAE,IAAI;AAAA,MACrB;AAAA,IACF;AAEA,WAAO;AAAA,EACT,UAAE;AACA,UAAM,WAAW,MAAM;AAAA,EACzB;AACF;AAEA,eAAe,qBACb,cACA,mBACA,aACA;AACA,QAAM,EAAE,eAAe,wBAAwB,IAAI,MAAM,kBAAkB,WAAW;AACtF,QAAM,cAAc,MAAM;AAAA,IACxB,EAAE,MAAM,YAAY;AAAA,IACpB;AAAA,MACE,YAAY;AAAA,MACZ,cAAc,MAAM,QAAQ;AAAA,QAC1B,aAAa,IAAI,CAAC,gBAAgB,YAAY,gBAAgB,WAAW,CAAC;AAAA,MAC5E;AAAA;AAAA;AAAA;AAAA,MAIA,OAAO,EAAE,SAAS,wBAAwB,EAAE;AAAA,IAC9C;AAAA,EACF,EAAE;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAED,QAAM,SAAS,YAAY,aAAa;AAAA,IACtC,SAAS;AAAA,IACT,QAAQ;AAAA,MACN,gBAAgB;AAAA,IAClB;AAAA,IACA,SAAS;AAAA,MACP,mCAAmC,WAAW;AAAA,MAC9C,6BAA6B;AAAA,MAC7B,uCAAuC;AAAA,MACvC,2BAA2B;AAAA,MAC3B,8BAA8B;AAAA,MAC9B;AAAA,QACE,MAAM;AAAA,QACN,UAAU,IAAY;AACpB,cAAI,kBAAkB,IAAI,EAAE,GAAG;AAC7B,mBAAO,2CAA2C,mBAAmB,EAAE,CAAC;AAAA,UAC1E;AAAA,QACF;AAAA,QACA,KAAK,IAAY;AACf,cAAI,GAAG,WAAW,0CAA0C,GAAG;AAC7D,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,aAAa,MAAM;AAC5B;AAEA,eAAe,sBACb,YACA,gBACA;AACA,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,MAAM,4BAA4B,YAAY,gBAAgB;AAAA,MACnE,eAAe;AAAA,IACjB,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEpE,UAAM,IAAI;AAAA,MACR,gEAAgE,cAAc,KAAK,MAAM;AAAA,IAC3F;AAAA,EACF;AACF;AAEA,eAAe,sBACb,WACA,cACA,qBACA,YACA;AACA,aAAW,eAAe,cAAc;AACtC,UAAM,iBAAiB,YAAY,SAAS;AAE5C,QAAI,gBAAgB;AAClB,YAAM,uBAAuB,MAAM,WAAW,cAAc,eAAe,UAAU;AACrF,YAAM,WAAW,qBAAqB,WAAW;AAEjD,UAAI,YAAY,SAAS,WAAW,SAAS,QAAQ,GAAG;AACtD,kBAAU,kBAAkB;AAAA,UAC1B,MAAM,eAAe;AAAA,UACrB,UAAU;AAAA,YACR,GAAG;AAAA,YACH,MAAM,eAAe;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,kBAAU,kBAAkB;AAAA,UAC1B,MAAM,eAAe;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,iBAAiB,YAAY,SAAS;AAE5C,QAAI,gBAAgB;AAClB,YAAM,qBACJ,oBAAoB,eAAe,UAAU,KAAK,eAAe;AAEnE,gBAAU,kBAAkB;AAAA,QAC1B,MAAM,eAAe;AAAA,QACrB,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,2BACP,cACA,iBACA;AACA,SAAO,SAAS,oBAAoB,WAAmB;AACrD,QAAI,OAAO,OAAO,iBAAiB,SAAS,GAAG;AAC7C,aAAO,gBAAgB,SAAS;AAAA,IAClC;AAEA,UAAM,sBAAsB,UAAU,QAAQ,OAAO,GAAG,EAAE,QAAQ,SAAS,EAAE;AAE7E,QAAI,OAAO,OAAO,iBAAiB,mBAAmB,GAAG;AACvD,aAAO,gBAAgB,mBAAmB;AAAA,IAC5C;AAEA,eAAW,eAAe,cAAc;AACtC,YAAM,aAAa,YAAY,cAAc,SAAS;AAEtD,UAAI,YAAY;AACd,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,oBAAoB,QAAuC;AACxE,QAAM,YAAY,QAAQ,QAAQ,YAAY;AAC9C,QAAM,WAAW,MAAM,SAAS,WAAW,OAAO;AAClD,QAAM,YAAY,KAAK,MAAM,QAAQ;AAErC,SAAO,OAAO,OAAO,UAAU,WAAW,CAAC,CAAC,EACzC,OAAO,CAAC,UAAU,MAAM,SAAS,WAAW,MAAM,eAAe,SAAS,QAAQ,CAAC,EACnF,IAAI,CAAC,UAAU;AACd,QAAI,CAAC,MAAM,MAAM,CAAC,MAAM,cAAc,CAAC,MAAM,YAAY;AACvD,YAAM,IAAI,MAAM,mDAAmD,SAAS,GAAG;AAAA,IACjF;AAEA,WAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,IACd;AAAA,EACF,CAAC;AACL;AAEA,SAAS,eACP,UACA,WACA;AACA,SAAO;AAAA,IACL,GAAI,YAAY,CAAC;AAAA,IACjB,GAAI,aAAa,CAAC;AAAA,EACpB;AACF;AAEA,SAAS,cAAc,WAAoC;AACzD,QAAM,OAAO,EAAE,GAAG,UAAU;AAC5B,QAAM,iBAAiB,KAAK;AAE5B,SAAO,KAAK;AAEZ,MAAI,CAAC,SAAS,cAAc,GAAG;AAC7B,WAAO;AAAA,MACL;AAAA,MACA,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,YAAoB,aAAqB;AAClE,MAAI,WAAW,WAAW,IAAI,GAAG;AAC/B,WAAO,QAAQ,aAAa,WAAW,MAAM,CAAC,CAAC;AAAA,EACjD;AAEA,SAAO,QAAQ,aAAa,UAAU;AACxC;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,SAAS,OAAqD;AACrE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,cAA6B;AAC7D,QAAM,aAAa,oBAAI,IAAY,CAAC,yBAAyB,mCAAmC,CAAC;AAEjG,eAAa,QAAQ,CAAC,gBAAgB;AACpC,UAAM,aAAa,YAAY,SAAS,QAAQ;AAEhD,QAAI,YAAY;AACd,iBAAW,IAAI,UAAU;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,qBACP,eACA,sBACA,yBACA;AACA,QAAM,MAA8B,CAAC;AAErC,uBAAqB,QAAQ,CAAC,iBAAiB,cAAc;AAC3D,UAAM,WAAW,cAAc,YAAY,eAAe;AAE1D,QAAI,UAAU;AACZ,UAAI,SAAS,IAAI,aAAa,QAAQ;AAAA,IACxC;AAAA,EACF,CAAC;AAED,0BAAwB,QAAQ,CAAC,iBAAiB,cAAc;AAC9D,UAAM,WAAW,cAAc,YAAY,eAAe;AAE1D,QAAI,UAAU;AACZ,UAAI,SAAS,IAAI,aAAa,QAAQ;AAAA,IACxC;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,kBAAkB,WAAmB;AAC5C,SAAO,+BAA+B,mBAAmB,SAAS,CAAC;AACrE;AAEA,SAAS,qBAAqB,WAAmB;AAC/C,SAAO,kCAAkC,mBAAmB,SAAS,CAAC;AACxE;AAEA,SAAS,mBAAmB,WAAmB;AAC7C,SAAO,UAAU,WAAW,WAAW,KAAK,UAAU,SAAS,YAAY;AAC7E;AAEA,SAAS,aAAa,UAAkB;AACtC,SAAO,KAAK,QAAQ;AACtB;AAEA,eAAe,+BAA+B,SAAoC;AAChF,QAAM,UAAoB,CAAC;AAE3B,iBAAe,KAAK,WAAmB;AACrC,QAAI;AAEJ,QAAI;AACF,gBAAU,MAAM,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,IAC5D,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,MACZ,QAAQ,IAAI,OAAO,UAAU;AAC3B,cAAM,eAAe,QAAQ,WAAW,MAAM,IAAI;AAElD,YAAI,MAAM,YAAY,GAAG;AACvB,gBAAM,KAAK,YAAY;AAEvB;AAAA,QACF;AAEA,YAAI,CAAC,MAAM,OAAO,GAAG;AACnB;AAAA,QACF;AAEA,cAAM,iBAAiB,aAAa,QAAQ,OAAO,GAAG;AAEtD,YAAI,CAAC,uBAAuB,cAAc,GAAG;AAC3C;AAAA,QACF;AAEA,YAAI,0BAA0B,cAAc,GAAG;AAC7C;AAAA,QACF;AAEA,gBAAQ,KAAK,cAAc;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,KAAK,OAAO;AAElB,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAe;AAC7C,SAAO,gCAAgC,KAAK,KAAK;AACnD;AAEA,SAAS,0BAA0B,OAAe;AAChD,SAAO,iFAAiF;AAAA,IACtF;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,WAA2C;AACzE,MAAI,OAAO,cAAc,YAAY;AACnC,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,QAAM,oBAAoB;AAC1B,QAAM,WAAW,CAAC,QAA2B,OAAgB,UAAmB;AAC9E,QAAI,UAAU,OAAO,OAAO,gBAAgB,YAAY;AACtD,YAAM,sBAAsB,OAAO;AACnC,YAAM,4BAA4B,oBAAoB,UAAU;AAEhE,aAAO,cAAc,IAAI,SAAoB;AAC3C,YAAI,KAAK,WAAW,KAAK,CAAC,2BAA2B;AACnD,iBAAO,oBAAoB,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,QAC7C;AAEA,eAAO,oBAAoB,GAAG,IAAI;AAAA,MACpC;AAAA,IACF;AAEA,WAAO,kBAAkB,QAAQ,OAAO,KAAK;AAAA,EAC/C;AAEA,UAAQ,0BAA0B,kBAAkB;AACpD,UAAQ,WAAW,kBAAkB;AACrC,UAAQ,cAAc,kBAAkB;AAExC,SAAO;AACT;AAEA,eAAe,qBACb,MACkC;AAClC,QAAM,YAAqC,CAAC;AAE5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,gBAAgB,KAAK,GAAG;AAK1B,gBAAU,GAAG,IAAI;AAEjB;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAU,GAAG,IAAI,MAAM,QAAQ;AAAA,QAC7B,MAAM,IAAI,OAAO,SAAS;AACxB,cAAI,gBAAgB,IAAI,GAAG;AACzB,mBAAO;AAAA,UACT;AAEA,cAAI,SAAS,IAAI,GAAG;AAClB,mBAAO,qBAAqB,IAAI;AAAA,UAClC;AAEA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAEA;AAAA,IACF;AAEA,QAAI,SAAS,KAAK,GAAG;AACnB,gBAAU,GAAG,IAAI,MAAM,qBAAqB,KAAK;AAEjD;AAAA,IACF;AAEA,cAAU,GAAG,IAAI;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAkD;AACzE,SACE,SAAS,KAAK,KACd,OAAO,MAAM,QAAQ,aACpB,WAAW,SAAS,YAAY,SAAS,YAAY;AAE1D;AAGA,SAAS,mCAAmC,aAA6B;AACvE,QAAMA,WAAU,cAAc,YAAY,GAAG;AAE7C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU,IAAY;AACpB,UAAI,OAAO,WAAW,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC9C,eAAO;AAAA,MACT;AAEA,UAAI;AACF,eAAOA,SAAQ,QAAQ,IAAI;AAAA,UACzB,OAAO,CAAC,WAAW;AAAA,QACrB,CAAC;AAAA,MACH,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;;;ACvsBA,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAS,WAAAC,gBAAe;AACjC,SAAS,qBAAqB;AAC9B,SAAS,aAA0B;;;ACJnC,SAAS,eAAAC,oBAAsC;AAI/C,IAAM,4DAA4D;AAAA,EAChE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAsB,qBACpB,QACA,eAA8B,CAAC,GAC/B,cAAc,QAAQ,IAAI,GAC1B,OAAO,eACP,UAA6B,SAC7B;AACA,QAAM,EAAE,cAAc,IAAI,MAAM,kBAAkB,WAAW;AAC7D,QAAM,mBAAmB,gBAAgB,CAAC;AAE1C,QAAM,cAAc,MAAM;AAAA,IACxB,CAAC;AAAA,IACD;AAAA,MACE,YAAY;AAAA,MACZ,cAAc,MAAM,QAAQ;AAAA,QAC1B,iBAAiB,IAAI,CAAC,gBAAgB,YAAY,gBAAgB,WAAW,CAAC;AAAA,MAChF;AAAA,IACF;AAAA,EACF,EAAE;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,kBAAkB,YACrB,QAAS,KAAK,EACd;AAAA,IACC,CAAC,WACC,UACA,UAAU,UACV,CAAC,0DAA0D,SAAS,OAAO,IAAI;AAAA,EACnF;AAEF,SAAOC,aAAY,QAAQ;AAAA,IACzB,GAAG;AAAA,IACH,SAAS;AAAA,EACX,CAAC;AACH;;;ACzDO,SAAS,8BAA8B,iBAAmC;AAC/E,SAAO,0BAA0B;AAAA,IAC/B,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AACL,YAAM,UAAU,gBAAgB,OAAuB,CAAC,SAAS,MAAM,UAAU;AAC/E,cAAM,WAAW,aAAa,KAAK;AAEnC,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,YACE,IAAI;AAAA,YACJ;AAAA,YACA,iBAAiB,UAAU,QAAQ,UAAU,IAAI;AAAA,UACnD;AAAA,QACF;AAAA,MACF,GAAG,CAAC,CAAC;AAEL,aAAO;AAAA,QACL,QAAQ,IAAI,CAAC,EAAE,gBAAgB,MAAM,eAAe,EAAE,KAAK,IAAI;AAAA,QAC/D;AAAA,QACA,QAAQ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,EAAE,EAAE,EAAE,KAAK,KAAK;AAAA,QAC5D;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF,CAAC;AACH;;;AC9BO,IAAM,uDACX;AAEK,SAAS,kDACd,SACA,cAAc,QAAQ,IAAI,GAClB;AACR,SAAO,0BAA0B;AAAA,IAC/B,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AACL,YAAM,iBAAiB,2BAA2B,SAAS,WAAW;AAEtE,UAAI,CAAC,gBAAgB;AACnB,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,MACb;AAEA,YAAM,aAAa,KAAK,UAAU,eAAe,QAAQ,OAAO,GAAG,CAAC;AACpE,YAAM,aAAa,KAAK,UAAU,eAAe,QAAQ,OAAO,GAAG,CAAC;AAEpE,aAAO;AAAA,QACL,yDAAyD,UAAU;AAAA,QACnE;AAAA,QACA,yDAAyD,UAAU;AAAA,MACrE,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF,CAAC;AACH;;;AC/BO,IAAM,wDACX;AAEK,SAAS,oDACd,SACQ;AACR,SAAO,0BAA0B;AAAA,IAC/B,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AACL,YAAM,mBAAmB,6BAA6B,OAAO;AAE7D,aAAO,kBAAkB,gBAAgB;AAAA,IAC3C;AAAA,EACF,CAAC;AACH;;;AChBO,IAAM,uDACX;AAEK,SAAS,kDACd,SACQ;AACR,QAAM,YAAY,wBAAwB,SAAS,SAAS;AAC5D,QAAM,aAAa,oBAAoB,SAAS,UAAU;AAE1D,SAAO,0BAA0B;AAAA,IAC/B,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AACL,aAAO;AAAA,QACL,gDACE,YAAY,KAAK,UAAU,SAAS,IAAI,WAC1C;AAAA,QACA,iDAAiD,KAAK,UAAU,UAAU,CAAC;AAAA,MAC7E,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF,CAAC;AACH;AAEA,SAAS,wBAAwB,OAA2B;AAC1D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,MAAM,KAAK;AAEnC,SAAO,mBAAmB;AAC5B;AAEA,SAAS,oBAAoB,OAA2B;AACtD,QAAM,kBAAkB,wBAAwB,KAAK;AAErD,UAAQ,mBAAmB,iBAAiB,YAAY;AAC1D;;;AL5BA,IAAM,aAAaC,SAAQ,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,GAAG;AAEvE,IAAM,cAAcA,SAAQ,YAAY,IAAI;AAErC,SAAS,2BAA2B,SAA2B;AACpE,QAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,QAAM,cAAc,QAAQ,eAAe,QAAQ,IAAI;AACvD,QAAM,aAAa,oBAAI,IAAyB;AAChD,QAAM,oBAAoBC,0BAAyB,YAAY;AAC/D,QAAM,uBAAuB,oBAAI,IAAoB;AACrD,QAAM,0BAA0B,oBAAI,IAAoB;AACxD,MAAI,wBAAwBD,SAAQ,aAAa,kBAAkB;AAEnE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IAET,eAAe,QAAwC;AACrD,8BAAwBA,SAAQ,aAAa,OAAO,MAAM,UAAU,kBAAkB;AAAA,IACxF;AAAA,IAEA,UAAU,IAAY,UAAmB;AACvC,UAAI,GAAG,SAAS,QAAQ,KAAK,UAAU;AACrC,cAAM,oBAAoBA,SAAQ,QAAQ,QAAQ,GAAG,EAAE;AAEvD,YAAI,CAAC,WAAW,IAAI,iBAAiB,GAAG;AACtC,qBAAW,IAAI,mBAAmB,oBAAI,IAAI,CAAC;AAAA,QAC7C;AAEA,mBAAW,IAAI,iBAAiB,GAAG,IAAI,QAAQ;AAAA,MACjD;AAEA,UAAI,GAAG,WAAW,8BAA8B,GAAG;AACjD,eAAO,KAAK,EAAE;AAAA,MAChB;AAEA,UAAI,GAAG,WAAW,iCAAiC,GAAG;AACpD,eAAO,KAAK,EAAE;AAAA,MAChB;AAAA,IACF;AAAA,IAEA,KAAK,IAAY;AACf,UAAI,GAAG,WAAW,gCAAgC,GAAG;AACnD,cAAM,mBAAmB,GAAG,QAAQ,kCAAkC,EAAE;AACxE,cAAM,YAAY,mBAAmB,gBAAgB;AAErD,YAAIE,oBAAmB,SAAS,GAAG;AACjC,iBAAO,CAAC,4BAA4B,SAAS,MAAM,kBAAkB,SAAS,IAAI,EAAE,KAAK,IAAI;AAAA,QAC/F;AAEA,eAAO,CAAC,WAAW,SAAS,MAAM,2BAA2B,EAAE,KAAK,IAAI;AAAA,MAC1E;AAEA,UAAI,GAAG,WAAW,mCAAmC,GAAG;AACtD,cAAM,mBAAmB,GAAG,QAAQ,qCAAqC,EAAE;AAC3E,cAAM,YAAY,mBAAmB,gBAAgB;AAErD,eAAO,CAAC,4BAA4B,SAAS,MAAM,kBAAkB,SAAS,IAAI,EAAE,KAAK,IAAI;AAAA,MAC/F;AAAA,IACF;AAAA,IAEA,MAAM,aAAuC;AAC3C,mBAAa,QAAQ,CAAC,gBAAgB;AACpC,cAAM,aAAa,YAAY,SAAS,QAAQ;AAEhD,YAAI,YAAY;AACd,eAAK,aAAa,UAAU;AAAA,QAC9B;AAAA,MACF,CAAC;AAED,wBAAkB,QAAQ,CAAC,cAAc;AACvC,cAAM,kBAAkB,KAAK,SAAS;AAAA,UACpC,MAAM;AAAA,UACN,IAAIC,mBAAkB,SAAS;AAAA,QACjC,CAAC;AAED,6BAAqB,IAAI,WAAW,eAAe;AAAA,MACrD,CAAC;AAED,YAAM,UAAUH,SAAQ,aAAa,gBAAgB;AACrD,YAAM,aAAa,MAAMI,gCAA+B,OAAO;AAE/D,iBAAW,QAAQ,CAAC,cAAc;AAChC,cAAM,kBAAkB,KAAK,SAAS;AAAA,UACpC,MAAM;AAAA,UACN,IAAIC,sBAAqB,SAAS;AAAA,QACpC,CAAC;AAED,gCAAwB,IAAI,WAAW,eAAe;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,cAAwC;AAC5C,YAAM,kBAAkB,MAAM,KAAK,WAAW,KAAK,CAAC;AACpD,YAAM,kBAAkBC;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,eAAeN,SAAQ,QAAQ,qBAAqB,GAAG,kBAAkB;AAE/E,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA,cAAc,QAAQ;AAAA,QACtB,YAAY,QAAQ;AAAA,QACpB,QAAQ,QAAQ;AAAA,QAChB,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAe,iBAAiB,SAS7B;AACD,QAAM,cAAc;AAAA,IAClB,MAAMA,SAAQ,aAAa,YAAY;AAAA,IACvC,KAAK;AAAA,MACH,YAAY;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ,QAAQ;AAAA,MAChB,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,QACb,OAAOA,SAAQ,aAAa,qBAAqB;AAAA,QACjD,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,8BAA8B,QAAQ,eAAe;AAAA,MACrD,oDAAoD,QAAQ,YAAY;AAAA,MACxE,kDAAkD,QAAQ,YAAY,QAAQ,WAAW;AAAA,MACzF,kDAAkD,QAAQ,MAAM;AAAA,MAChE,kCAAkC,QAAQ,cAAc;AAAA,QACtD,MAAM;AAAA,QACN,iBAAiB,QAAQ;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAEA,QAAM,MAAM,WAAW;AACzB;AAEA,SAASC,0BAAyB,cAAgD;AAChF,QAAM,aAAa,oBAAI,IAAY,CAAC,yBAAyB,mCAAmC,CAAC;AAEjG,eAAa,QAAQ,CAAC,gBAAgB;AACpC,UAAM,aAAa,YAAY,SAAS,QAAQ;AAEhD,QAAI,YAAY;AACd,iBAAW,IAAI,UAAU;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAASK,sBACP,eACA,sBACA,yBACA;AACA,QAAM,MAA8B,CAAC;AAErC,uBAAqB,QAAQ,CAAC,iBAAiB,cAAc;AAC3D,UAAM,WAAW,cAAc,YAAY,eAAe;AAE1D,QAAI,UAAU;AACZ,UAAI,SAAS,IAAIC,cAAa,QAAQ;AAAA,IACxC;AAAA,EACF,CAAC;AAED,0BAAwB,QAAQ,CAAC,iBAAiB,cAAc;AAC9D,UAAM,WAAW,cAAc,YAAY,eAAe;AAE1D,QAAI,UAAU;AACZ,UAAI,SAAS,IAAIA,cAAa,QAAQ;AAAA,IACxC;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAASJ,mBAAkB,WAAmB;AAC5C,SAAO,+BAA+B,mBAAmB,SAAS,CAAC;AACrE;AAEA,SAASE,sBAAqB,WAAmB;AAC/C,SAAO,kCAAkC,mBAAmB,SAAS,CAAC;AACxE;AAEA,SAASH,oBAAmB,WAAmB;AAC7C,SAAO,UAAU,WAAW,WAAW,KAAK,UAAU,SAAS,YAAY;AAC7E;AAEA,SAASK,cAAa,UAAkB;AACtC,SAAO,KAAK,QAAQ;AACtB;AAEA,eAAeH,gCAA+B,SAAoC;AAChF,QAAM,UAAoB,CAAC;AAE3B,iBAAe,KAAK,WAAmB;AACrC,QAAI;AAEJ,QAAI;AACF,gBAAU,MAAMI,SAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,IAC5D,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,MACZ,QAAQ,IAAI,OAAO,UAAU;AAC3B,cAAM,eAAeR,SAAQ,WAAW,MAAM,IAAI;AAElD,YAAI,MAAM,YAAY,GAAG;AACvB,gBAAM,KAAK,YAAY;AAEvB;AAAA,QACF;AAEA,YAAI,CAAC,MAAM,OAAO,GAAG;AACnB;AAAA,QACF;AAEA,cAAM,iBAAiB,aAAa,QAAQ,OAAO,GAAG;AAEtD,YAAI,CAACS,wBAAuB,cAAc,GAAG;AAC3C;AAAA,QACF;AAEA,YAAIC,2BAA0B,cAAc,GAAG;AAC7C;AAAA,QACF;AAEA,gBAAQ,KAAK,cAAc;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,KAAK,OAAO;AAElB,SAAO;AACT;AAEA,SAASD,wBAAuB,OAAe;AAC7C,SAAO,gCAAgC,KAAK,KAAK;AACnD;AAEA,SAASC,2BAA0B,OAAe;AAChD,SAAO,iFAAiF;AAAA,IACtF;AAAA,EACF;AACF;;;AM9RA,IAAM,wBAAwB;AAAA;AAAA;AAevB,SAAS,iCAAyC;AACvD,QAAM,aAAa;AACnB,QAAM,cAAc,OAAO;AAE3B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,UAAU,IAAI;AACZ,UAAI,OAAO,YAAY;AACrB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,KAAK,IAAI;AACP,UAAI,OAAO,aAAa;AACtB,eAAO,EAAE,MAAM,sBAAsB;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACF;;;ACxBO,IAAM,OAAO;AAAA,EAClB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQT,UAAU,YAAY,QAAQ,2BAA2B;AAC3D;AAEO,IAAM,YAA8C,OAAO,QAAQ,EAAE,YAAY,QAAQ,MAAM;AACpG,QAAM,UAAU,MAAM,QAAQ,MAAwB,kBAAkB;AAExE,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,UAAU,CAAC;AAAA,EACpB;AAEA,QAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,QAAM,cAAc,QAAQ,eAAe,QAAQ,IAAI;AACvD,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,OAAO,eAAe,gBAAgB,gBAAgB;AAC5D,QAAM,UAAU,eAAe,gBAAgB,UAAU;AAEzD,6BAA2B,QAAQ,YAAY;AAE/C,SAAO,YAAY,iBAAiB,OAAO,WAAW,YAAY;AAElE,QAAM,EAAE,YAAY,gCAAgC,WAAW,IAC7D,MAAM,mCAAmC,OAAO;AAElD,SAAO,QAAQ;AAAA,IACb,oCAAoC,YAAY;AAAA,IAChD,iCAAiC;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA;AAAA,IAED,+BAA+B;AAAA,IAC/B,uCAAuC;AAAA,IACvC,+BAA+B;AAAA,IAC/B,2BAA2B;AAAA,EAC7B;AAEA,MAAI,eAAe,eAAe;AAChC,WAAO,QAAQ,KAAK,gCAAgC,GAAG,WAAW,OAAO;AAAA,EAC3E,WAAW,eAAe,UAAU;AAElC,WAAO,QAAQ,KAAK,8BAA8B,OAAO,CAAQ;AAAA,EACnE,OAAO;AAEL,WAAO,QAAQ,KAAK,2BAA2B,OAAO,CAAQ;AAAA,EAChE;AAEA,MAAI,eAAe,eAAe;AAChC,WAAO,QAAQ;AAAA,MACb,GAAI,OAAO,SAAS,CAAC;AAAA,MACrB,UAAU;AAAA,IACZ;AAEA,WAAO,MAAM,gBAAgB;AAAA,MAC3B,GAAI,OAAO,MAAM,iBAAiB,CAAC;AAAA,MACnC,yBAAyB;AAAA,IAC3B;AAAA,EACF;AAGA,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,UAAU,CAAC;AAAA,EACpB;AACA,MAAI,CAAC,OAAO,QAAQ,OAAO;AACzB,WAAO,QAAQ,QAAQ,CAAC;AAAA,EAC1B;AAGA,QAAM,UAAU,OAAO,QAAQ;AAE/B,MAAI,CAAC,QAAQ,OAAO,GAAG;AACrB,YAAQ,OAAO,IAAI;AAAA,EACrB;AACA,MAAI,CAAC,QAAQ,WAAW,GAAG;AACzB,YAAQ,WAAW,IAAI;AAAA,EACzB;AAEA,QAAM,cAAc,MAAM,qBAAqB,QAAQ,cAAc,aAAa,MAAM,OAAO;AAI/F,MAAI,CAAC,YAAY,cAAc;AAC7B,gBAAY,eAAe,CAAC;AAAA,EAC9B;AACA,MAAI,CAAC,YAAY,aAAa,SAAS;AACrC,gBAAY,aAAa,UAAU,CAAC;AAAA,EACtC;AACA,aAAW,OAAO,CAAC,gBAAgB,kBAAkB,iBAAiB,GAAG;AACvE,QAAI,CAAC,YAAY,aAAa,QAAQ,SAAS,GAAG,GAAG;AACnD,kBAAY,aAAa,QAAQ,KAAK,GAAG;AAAA,IAC3C;AAAA,EACF;AAOA,MAAI,CAAC,YAAY,aAAa,QAAQ,SAAS,2BAA2B,GAAG;AAC3E,gBAAY,aAAa,QAAQ,KAAK,2BAA2B;AAAA,EACnE;AAKA,QAAM,4BAA4B;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,MAAI,CAAC,YAAY,aAAa,gBAAgB;AAC5C,gBAAY,aAAa,iBAAiB,CAAC;AAAA,EAC7C;AACA,MAAI,CAAC,YAAY,aAAa,eAAe,UAAU;AACrD,gBAAY,aAAa,eAAe,WAAW,CAAC;AAAA,EACtD;AACA,aAAW,OAAO,2BAA2B;AAC3C,QAAI,CAAC,YAAY,aAAa,eAAe,SAAS,SAAS,GAAG,GAAG;AACnE,kBAAY,aAAa,eAAe,SAAS,KAAK,GAAG;AAAA,IAC3D;AAAA,EACF;AAIA,QAAM,kBAAkB,YAAY;AACpC,QAAM,eAAgB,gBAAgB,mBAAmB,CAAC;AAE1D,eAAa,WAAW,MAAM;AAAA,IAC5B,oBAAI,IAAI,CAAC,GAAI,aAAa,YAAY,CAAC,GAAI,GAAG,yBAAyB,CAAC;AAAA,EAC1E;AACA,kBAAgB,kBAAkB;AAElC,SAAO;AACT;AAEA,SAAS,iBACP,UACA,kBACU;AACV,QAAM,WAAW,MAAM,QAAQ,QAAQ,IAAI,WAAW,WAAW,CAAC,QAAQ,IAAI,CAAC;AAE/E,SAAO,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,UAAU,gBAAgB,CAAC,CAAC;AAC5D;","names":["require","readdir","resolve","mergeConfig","mergeConfig","resolve","collectTrackedSpecifiers","isClientEntrypoint","toStaticVirtualId","collectHydratableSourceModules","toComponentVirtualId","buildStaticModuleMap","toPublicPath","readdir","isHydratableSourceFile","isNonHydratableSourceFile"]}
@@ -5,7 +5,7 @@ import {
5
5
  // src/viteStorybookAstroMiddlewarePlugin.ts
6
6
  import { createRequire } from "module";
7
7
  import { fileURLToPath } from "url";
8
- import { createServer } from "vite";
8
+ import { createServer, createLogger } from "vite";
9
9
 
10
10
  // src/vite/createVirtualModulePlugin.ts
11
11
  function createVirtualModulePlugin(options) {
@@ -159,13 +159,33 @@ function vitePluginAstroFontsFallback() {
159
159
  };
160
160
  }
161
161
 
162
+ // src/vitePluginAstroIntegrationOptsFallback.ts
163
+ var OPTS_STUB = "export default {}";
164
+ var VIRTUAL_IDS = ["astro:react:opts", "astro:preact:opts"];
165
+ function vitePluginAstroIntegrationOptsFallback() {
166
+ const resolvedIds = new Map(VIRTUAL_IDS.map((id) => [id, `\0${id}`]));
167
+ const resolvedIdSet = new Set(resolvedIds.values());
168
+ return {
169
+ name: "storybook-astro-integration-opts-fallback",
170
+ enforce: "pre",
171
+ resolveId(id) {
172
+ return resolvedIds.get(id);
173
+ },
174
+ load(id) {
175
+ if (resolvedIdSet.has(id)) {
176
+ return { code: OPTS_STUB };
177
+ }
178
+ }
179
+ };
180
+ }
181
+
162
182
  // src/vitePluginAstroVueFallback.ts
163
183
  var VUE_APP_STUB = `
164
184
  export const setup = () => {};
165
185
  `;
166
- var VIRTUAL_IDS = ["virtual:astro:vue-app", "virtual:@astrojs/vue/app"];
186
+ var VIRTUAL_IDS2 = ["virtual:astro:vue-app", "virtual:@astrojs/vue/app"];
167
187
  function vitePluginAstroVueFallback() {
168
- const resolvedIds = new Map(VIRTUAL_IDS.map((id) => [id, "\0" + id]));
188
+ const resolvedIds = new Map(VIRTUAL_IDS2.map((id) => [id, "\0" + id]));
169
189
  const resolvedIdSet = new Set(resolvedIds.values());
170
190
  return {
171
191
  name: "storybook-astro-vue-fallback",
@@ -291,14 +311,13 @@ async function vitePluginStorybookAstroMiddleware(options) {
291
311
  const vitePlugin = {
292
312
  name: "storybook-astro-middleware-plugin",
293
313
  async configureServer(server) {
294
- viteServer = await createViteServer(options.integrations, resolveFrom);
314
+ viteServer = await createViteServer(options.integrations ?? [], resolveFrom);
295
315
  const storyRulesConfigFilePath = resolveRulesConfigFilePath(options.storyRules, resolveFrom);
296
316
  const filePath = fileURLToPath(new URL("./middleware", import.meta.url));
297
317
  const middleware = await viteServer.ssrLoadModule(filePath, {
298
318
  fixStacktrace: true
299
319
  });
300
320
  const createHandler = () => middleware.handlerFactory(options.integrations ?? [], {
301
- mode: "development",
302
321
  sanitization: options.sanitization,
303
322
  rulesConfigFilePath: storyRulesConfigFilePath,
304
323
  resolveRulesConfigModule: () => loadRulesConfigModule(viteServer, storyRulesConfigFilePath),
@@ -362,8 +381,19 @@ async function vitePluginStorybookAstroMiddleware(options) {
362
381
  }
363
382
  };
364
383
  }
384
+ function createSsrServerLogger() {
385
+ const logger = createLogger();
386
+ const originalWarn = logger.warn.bind(logger);
387
+ logger.warn = (msg, options) => {
388
+ if (msg.includes("Missing pages directory") || msg.includes("points to missing source files") || msg.includes("Failed to load source map for")) {
389
+ return;
390
+ }
391
+ originalWarn(msg, options);
392
+ };
393
+ return logger;
394
+ }
365
395
  async function createViteServer(integrations, resolveFrom = process.cwd()) {
366
- const { getViteConfig } = await importAstroConfig(resolveFrom);
396
+ const { getViteConfig, passthroughImageService } = await importAstroConfig(resolveFrom);
367
397
  const safeIntegrations = integrations ?? [];
368
398
  const projectAstroResolutionPlugin = createProjectAstroResolutionPlugin(resolveFrom);
369
399
  const config = await getViteConfig(
@@ -372,16 +402,22 @@ async function createViteServer(integrations, resolveFrom = process.cwd()) {
372
402
  configFile: false,
373
403
  integrations: await Promise.all(
374
404
  safeIntegrations.map((integration) => integration.loadIntegration(resolveFrom))
375
- )
405
+ ),
406
+ // Use the passthrough image service so nested components that use <Image>
407
+ // from astro:assets render as plain <img> tags without triggering image
408
+ // optimization (which fails in the Storybook SSR context).
409
+ image: { service: passthroughImageService() }
376
410
  }
377
411
  )({ mode: "development", command: "serve" });
378
412
  const viteServer = await createServer({
379
413
  configFile: false,
380
414
  ...config,
415
+ customLogger: createSsrServerLogger(),
381
416
  plugins: [
382
417
  projectAstroResolutionPlugin,
383
418
  // Fallbacks must come first to intercept before Astro's plugins
384
419
  vitePluginAstroFontsFallback(),
420
+ vitePluginAstroIntegrationOptsFallback(),
385
421
  vitePluginAstroVueFallback(),
386
422
  vitePluginAstroRoutesFallback(),
387
423
  ...config.plugins?.filter(Boolean) ?? [],
@@ -428,7 +464,9 @@ async function loadRulesConfigModule(viteServer, configFilePath) {
428
464
 
429
465
  export {
430
466
  createVirtualModulePlugin,
467
+ viteAstroContainerRenderersPlugin,
431
468
  vitePluginAstroFontsFallback,
469
+ vitePluginAstroIntegrationOptsFallback,
432
470
  vitePluginAstroVueFallback,
433
471
  vitePluginAstroRoutesFallback,
434
472
  ssrLoadModuleWithFsFallback,
@@ -436,4 +474,4 @@ export {
436
474
  vitePluginStorybookAstroMiddleware,
437
475
  createViteServer
438
476
  };
439
- //# sourceMappingURL=chunk-7GHEQUPV.js.map
477
+ //# sourceMappingURL=chunk-POHTFYST.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/viteStorybookAstroMiddlewarePlugin.ts","../src/vite/createVirtualModulePlugin.ts","../src/viteAstroContainerRenderersPlugin.ts","../src/vitePluginAstroFontsFallback.ts","../src/vitePluginAstroIntegrationOptsFallback.ts","../src/vitePluginAstroVueFallback.ts","../src/vitePluginAstroRoutesFallback.ts","../src/lib/ssr-load-module-with-fs-fallback.ts","../src/rules-options.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport type { ServerResponse } from 'node:http';\nimport { createServer, createLogger, type Connect, type PluginOption, type ViteDevServer } from 'vite';\nimport type { RenderRequestMessage, RenderResponseMessage } from '@storybook-astro/renderer/types';\nimport type { FrameworkOptions } from './types.ts';\nimport type { Integration } from './integrations/index.ts';\nimport { importAstroConfig } from './importAstroConfig.ts';\nimport { viteAstroContainerRenderersPlugin } from './viteAstroContainerRenderersPlugin.ts';\nimport { vitePluginAstroFontsFallback } from './vitePluginAstroFontsFallback.ts';\nimport { vitePluginAstroIntegrationOptsFallback } from './vitePluginAstroIntegrationOptsFallback.ts';\nimport { vitePluginAstroVueFallback } from './vitePluginAstroVueFallback.ts';\nimport { vitePluginAstroRoutesFallback } from './vitePluginAstroRoutesFallback.ts';\nimport { ssrLoadModuleWithFsFallback } from './lib/ssr-load-module-with-fs-fallback.ts';\nimport { resolveRulesConfigFilePath } from './rules-options.ts';\n\nexport async function vitePluginStorybookAstroMiddleware(options: FrameworkOptions) {\n // The internal Vite server is created lazily inside configureServer (dev-only).\n // During builds, configureServer never fires, so no server is created.\n let viteServer: ViteDevServer | null = null;\n\n const resolveFrom = options.resolveFrom ?? process.cwd();\n\n const vitePlugin = {\n name: 'storybook-astro-middleware-plugin',\n async configureServer(server) {\n viteServer = await createViteServer(options.integrations ?? [], resolveFrom);\n const storyRulesConfigFilePath = resolveRulesConfigFilePath(options.storyRules, resolveFrom);\n\n const filePath = fileURLToPath(new URL('./middleware', import.meta.url));\n const middleware = await viteServer.ssrLoadModule(filePath, {\n fixStacktrace: true\n });\n\n const createHandler = () => middleware.handlerFactory(options.integrations ?? [], {\n sanitization: options.sanitization,\n rulesConfigFilePath: storyRulesConfigFilePath,\n resolveRulesConfigModule: () =>\n loadRulesConfigModule(viteServer!, storyRulesConfigFilePath),\n loadModule: (id: string) =>\n ssrLoadModuleWithFsFallback(viteServer!, id, {\n fixStacktrace: true\n })\n });\n\n let handlerPromise = createHandler();\n\n const resetHandler = () => {\n handlerPromise = createHandler();\n };\n\n server.watcher.on('add', resetHandler);\n server.watcher.on('change', resetHandler);\n server.watcher.on('unlink', resetHandler);\n\n server.ws.on('astro:render:request', async (data: RenderRequestMessage['data']) => {\n try {\n const handler = await handlerPromise;\n const html = await handler(data);\n\n server.ws.send('astro:render:response', {\n html,\n id: data.id\n } satisfies RenderResponseMessage['data']);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error ? err.stack : '';\n\n console.error('[storybook-astro] Render error:', errorMessage);\n if (errorStack) {console.error(errorStack);}\n server.ws.send('astro:render:response', {\n id: data.id,\n html:\n '<div style=\"background: #d73838; padding: 12px; color: #f0f0f0; font-family: monospace; border-radius: 4px\">' +\n '<strong>Error rendering Astro component</strong><br/>' +\n '<pre style=\"white-space: pre-wrap; margin-top: 8px; font-size: 12px\">' +\n errorMessage.replace(/</g, '&lt;').replace(/>/g, '&gt;') +\n '</pre></div>'\n } satisfies RenderResponseMessage['data']);\n }\n });\n }\n } satisfies PluginOption;\n\n // Create asset serving plugin (only active in dev when viteServer exists)\n const assetServingPlugin = {\n name: 'storybook-astro-assets',\n configureServer(server: ViteDevServer) {\n server.middlewares.use('/_image', (req: Connect.IncomingMessage, res: ServerResponse, next: Connect.NextFunction) => {\n if (!viteServer) {\n next();\n\n return;\n }\n // Forward the request to the Astro vite server\n viteServer.middlewares.handle(req, res, (err?: unknown) => {\n if (err) {\n console.error('Asset serving error:', err);\n next();\n }\n });\n });\n }\n };\n\n // The extracted CSS plugins from Astro's internal Vite server cause Vue SFC\n // <style> blocks to be double-processed (once by these plugins, once by\n // Storybook's built-in CSS plugins), resulting in PostCSS errors.\n //\n // Solution: Don't extract Astro's CSS plugins. Storybook's built-in CSS\n // plugins handle both Vue styles AND Astro style sub-modules (which are\n // standard CSS imports like `Component.astro?astro&type=style&index=0&lang.css`).\n //\n // The Astro internal server's CSS plugins are only needed for SSR rendering\n // within that server - they don't need to be shared with Storybook's server.\n return {\n vitePlugin,\n viteConfig: {\n plugins: [\n assetServingPlugin\n ].filter(Boolean)\n }\n };\n}\n\n/**\n * Creates a Vite logger that silences known benign warnings emitted by Astro's\n * Vite plugin in the SSR server context:\n * - \"Missing pages directory\" — Storybook and test contexts have no src/pages.\n * - \"points to missing source files\" — Sourcemap gaps in the `entities` package.\n */\nfunction createSsrServerLogger() {\n const logger = createLogger();\n const originalWarn = logger.warn.bind(logger);\n\n logger.warn = (msg, options) => {\n if (\n msg.includes('Missing pages directory') ||\n msg.includes('points to missing source files') ||\n msg.includes('Failed to load source map for')\n ) {\n return;\n }\n\n originalWarn(msg, options);\n };\n\n return logger;\n}\n\nexport async function createViteServer(integrations: Integration[], resolveFrom = process.cwd()) {\n const { getViteConfig, passthroughImageService } = await importAstroConfig(resolveFrom);\n const safeIntegrations = integrations ?? [];\n const projectAstroResolutionPlugin = createProjectAstroResolutionPlugin(resolveFrom);\n\n const config = await getViteConfig(\n { root: resolveFrom },\n {\n configFile: false,\n integrations: await Promise.all(\n safeIntegrations.map((integration) => integration.loadIntegration(resolveFrom))\n ),\n // Use the passthrough image service so nested components that use <Image>\n // from astro:assets render as plain <img> tags without triggering image\n // optimization (which fails in the Storybook SSR context).\n image: { service: passthroughImageService() }\n }\n )({ mode: 'development', command: 'serve' });\n\n const viteServer = await createServer({\n configFile: false,\n ...config,\n customLogger: createSsrServerLogger(),\n plugins: [\n projectAstroResolutionPlugin,\n // Fallbacks must come first to intercept before Astro's plugins\n vitePluginAstroFontsFallback(),\n vitePluginAstroIntegrationOptsFallback(),\n vitePluginAstroVueFallback(),\n vitePluginAstroRoutesFallback(),\n ...(config.plugins?.filter(Boolean) ?? []),\n viteAstroContainerRenderersPlugin(safeIntegrations)\n ]\n });\n\n // Initialize the server's plugin container to ensure all plugins are ready.\n // Without this, some plugins (like vite:css) may have uninitialized state\n // when ssrLoadModule is called.\n await viteServer.pluginContainer.buildStart({});\n\n return viteServer;\n}\n\nfunction createProjectAstroResolutionPlugin(resolveFrom: string): PluginOption {\n const require = createRequire(import.meta.url);\n\n return {\n name: 'storybook-astro:resolve-project-astro',\n enforce: 'pre',\n resolveId(id: string) {\n if (id !== 'astro' && !id.startsWith('astro/')) {\n return null;\n }\n\n try {\n return require.resolve(id, {\n paths: [resolveFrom]\n });\n } catch {\n return null;\n }\n }\n } satisfies PluginOption;\n}\n\nasync function loadRulesConfigModule(viteServer: ViteDevServer, configFilePath?: string) {\n if (!configFilePath) {\n return undefined;\n }\n\n try {\n return await ssrLoadModuleWithFsFallback(viteServer, configFilePath, {\n fixStacktrace: true\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n\n throw new Error(\n `Unable to load framework.options.storyRules config module at ${configFilePath}: ${reason}`\n );\n }\n}\n","import type { Plugin } from 'vite';\n\ntype CreateVirtualModulePluginOptions = {\n pluginName: string;\n virtualModuleId: string;\n load: (id: string) => string | Promise<string> | undefined;\n};\n\nexport function createVirtualModulePlugin(options: CreateVirtualModulePluginOptions): Plugin {\n const resolvedVirtualModuleId = `\\0${options.virtualModuleId}`;\n\n return {\n name: options.pluginName,\n resolveId(id) {\n if (id === options.virtualModuleId) {\n return resolvedVirtualModuleId;\n }\n },\n async load(id) {\n if (id === resolvedVirtualModuleId) {\n return options.load(id);\n }\n }\n } satisfies Plugin;\n}\n","import type { Integration } from './integrations/index.ts';\nimport { createVirtualModulePlugin } from './vite/createVirtualModulePlugin.ts';\n\ntype PluginOptions = {\n mode?: 'development' | 'production';\n staticModuleMap?: Record<string, string>;\n};\n\nexport function viteAstroContainerRenderersPlugin(\n integrations: Integration[],\n options: PluginOptions = {}\n) {\n const safeIntegrations = integrations ?? [];\n const mode = options.mode ?? 'development';\n const staticModuleMap = options.staticModuleMap ?? {};\n\n return createVirtualModulePlugin({\n pluginName: 'storybook-astro:container-renderers',\n virtualModuleId: 'virtual:astro-container-renderers',\n load() {\n const importStatements = buildImportStatements(safeIntegrations);\n const clientResolvers =\n mode === 'development'\n ? safeIntegrations\n .filter((integration) => typeof integration.resolveClient === 'function')\n .map((integration) =>\n integration.resolveClient.toString().replace(/^resolveClient/, 'function')\n )\n .join(',\\n')\n : '';\n\n return `\n ${importStatements}\n\n export function addRenderers(container) {\n ${safeIntegrations.map((integration) => buildServerRenderer(integration) + '\\n' + buildClientRenderer(integration)).join('\\n')}\n }\n\n const staticClientModules = ${JSON.stringify(staticModuleMap, null, 2)};\n\n const clientModulesResolvers = [\n ${clientResolvers}\n ];\n\n export function resolveClientModules(specifier) {\n if (Object.hasOwn(staticClientModules, specifier)) {\n return staticClientModules[specifier];\n }\n\n const normalizedSpecifier = specifier.replace(/\\\\\\\\/g, '/').replace(/\\\\?.*$/, '');\n\n if (Object.hasOwn(staticClientModules, normalizedSpecifier)) {\n return staticClientModules[normalizedSpecifier];\n }\n\n for (const resolver of clientModulesResolvers) {\n const resolution = resolver(specifier);\n\n if (resolution) {\n return resolution;\n }\n }\n }\n `;\n }\n });\n}\n\nfunction buildImportStatements(integrations: Integration[]) {\n return integrations\n .filter((integration) => integration.renderer.server)\n .map(\n (integration) =>\n `import ${integration.name}Renderer from '${integration.renderer.server?.entrypoint}';`\n )\n .join('\\n');\n}\n\nfunction buildServerRenderer(integration: Integration) {\n const serverRenderer = integration.renderer.server;\n\n if (!serverRenderer) {\n return '';\n }\n\n if (integration.name === 'solid') {\n return `\n container.addServerRenderer({\n name: '${serverRenderer.name}',\n renderer: {\n ...${integration.name}Renderer,\n name: '${serverRenderer.name}'\n }\n });\n `;\n }\n\n return `\n container.addServerRenderer({\n name: '${serverRenderer.name}',\n renderer: ${integration.name}Renderer\n });\n `;\n}\n\nfunction buildClientRenderer(integration: Integration) {\n const clientRenderer = integration.renderer.client;\n\n if (clientRenderer) {\n return `\n container.addClientRenderer({\n name: '${clientRenderer.name}',\n entrypoint: '${clientRenderer.entrypoint}'\n });\n `;\n }\n\n return '';\n}\n","import type { Plugin } from 'vite';\n\nconst FONTS_RUNTIME_STUB = `\nexport const fontData = {};\nexport function createGetFontData(fontsMod) {\n return fontsMod?.fontDataByCssVariable ?? {};\n}\n`;\n\nconst FONTS_INTERNAL_STUB = `\nexport const componentDataByCssVariable = new Map();\nexport const fontDataByCssVariable = {};\n`;\n\n/**\n * Provides fallback resolution for Astro's font-related virtual modules\n * and package import paths in Storybook's SSR Vite server.\n *\n * In Astro 6, the `astro:assets` virtual module depends on font-related\n * modules through virtual modules and a bare `astro/assets/fonts/runtime`\n * import. In the Storybook SSR context:\n *\n * 1. The fonts plugin's filter-based `resolveId` may not trigger for\n * the virtual module IDs.\n * 2. A Vite transform rewrites the `astro:assets` module to import\n * `createGetFontData` from `astro/assets/fonts/runtime` (without\n * `.js`), which fails against Astro's package.json exports map.\n * 3. The `createGetFontData` function is injected by a runtime Vite\n * transform that doesn't run in our SSR context.\n *\n * This plugin stubs all three font module paths with no-op exports,\n * since Storybook doesn't need Astro's font system.\n */\nexport function vitePluginAstroFontsFallback(): Plugin {\n const VIRTUAL_ID = 'virtual:astro:assets/fonts/internal';\n const RUNTIME_VIRTUAL_ID = 'virtual:astro:assets/fonts/runtime';\n const RESOLVED_VIRTUAL_ID = '\\0' + VIRTUAL_ID;\n const RESOLVED_RUNTIME_VIRTUAL_ID = '\\0' + RUNTIME_VIRTUAL_ID;\n const RESOLVED_FONTS_RUNTIME_ID = '\\0storybook:astro-fonts-runtime';\n\n return {\n name: 'storybook-astro-fonts-fallback',\n // Must run before vite:resolve to intercept virtual modules\n // before Vite tries to resolve them as Node package imports\n enforce: 'pre',\n\n resolveId(id) {\n if (id === VIRTUAL_ID) {\n return RESOLVED_VIRTUAL_ID;\n }\n if (id === RUNTIME_VIRTUAL_ID) {\n return RESOLVED_RUNTIME_VIRTUAL_ID;\n }\n // Intercept the bare package import (without .js) and the .js variant\n if (id === 'astro/assets/fonts/runtime' || id === 'astro/assets/fonts/runtime.js') {\n return RESOLVED_FONTS_RUNTIME_ID;\n }\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_ID) {\n return { code: FONTS_INTERNAL_STUB };\n }\n if (id === RESOLVED_RUNTIME_VIRTUAL_ID || id === RESOLVED_FONTS_RUNTIME_ID) {\n return { code: FONTS_RUNTIME_STUB };\n }\n }\n };\n}\n","import type { Plugin } from 'vite';\n\nconst OPTS_STUB = 'export default {}';\n\nconst VIRTUAL_IDS = ['astro:react:opts', 'astro:preact:opts'];\n\nexport function vitePluginAstroIntegrationOptsFallback(): Plugin {\n const resolvedIds = new Map(VIRTUAL_IDS.map((id) => [id, `\\0${id}`]));\n const resolvedIdSet = new Set(resolvedIds.values());\n\n return {\n name: 'storybook-astro-integration-opts-fallback',\n enforce: 'pre',\n\n resolveId(id) {\n return resolvedIds.get(id);\n },\n\n load(id) {\n if (resolvedIdSet.has(id)) {\n return { code: OPTS_STUB };\n }\n }\n };\n}\n","import type { Plugin } from 'vite';\n\nconst VUE_APP_STUB = `\nexport const setup = () => {};\n`;\n\n// Different versions of @astrojs/vue use different virtual module names\nconst VIRTUAL_IDS = ['virtual:astro:vue-app', 'virtual:@astrojs/vue/app'];\n\n/**\n * Provides fallback resolution for @astrojs/vue's virtual module\n * in Storybook's SSR Vite server.\n *\n * @astrojs/vue's server.js imports a virtual module to get a setup function\n * for configuring the Vue app instance. The virtual module name varies by version:\n * - v6.0.0-beta.1: \"virtual:astro:vue-app\"\n * - Later versions: \"virtual:@astrojs/vue/app\"\n *\n * The Vite plugin that normally creates this virtual module may not run in\n * Storybook's SSR context, so this plugin stubs it with a no-op setup function\n * (the default behavior when no appEntrypoint is configured).\n */\nexport function vitePluginAstroVueFallback(): Plugin {\n const resolvedIds = new Map(VIRTUAL_IDS.map((id) => [id, '\\0' + id]));\n const resolvedIdSet = new Set(resolvedIds.values());\n\n return {\n name: 'storybook-astro-vue-fallback',\n // Must run before vite:resolve to intercept virtual modules\n // before Vite tries to resolve them as Node package imports\n enforce: 'pre',\n\n resolveId(id) {\n const resolved = resolvedIds.get(id);\n\n if (resolved) {\n return resolved;\n }\n },\n\n load(id) {\n if (resolvedIdSet.has(id)) {\n return { code: VUE_APP_STUB };\n }\n }\n };\n}\n","import type { Plugin } from 'vite';\n\nconst ROUTES_STUB = `\nexport const routes = [];\n`;\n\n/**\n * Provides fallback resolution for Astro's routes virtual module\n * in Storybook's SSR Vite server.\n *\n * In Astro 6, the manifest and app entrypoints import from \"virtual:astro:routes\"\n * to get route data. In Storybook's context, there are no routes, so this plugin\n * stubs the virtual module with an empty routes array.\n */\nexport function vitePluginAstroRoutesFallback(): Plugin {\n const VIRTUAL_ID = 'virtual:astro:routes';\n const RESOLVED_VIRTUAL_ID = '\\0' + VIRTUAL_ID;\n\n return {\n name: 'storybook-astro-routes-fallback',\n // Must run before vite:resolve to intercept virtual modules\n // before Vite tries to resolve them as Node package imports\n enforce: 'pre',\n\n resolveId(id) {\n if (id === VIRTUAL_ID) {\n return RESOLVED_VIRTUAL_ID;\n }\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_ID) {\n return { code: ROUTES_STUB };\n }\n }\n };\n}\n","import type { ViteDevServer } from 'vite';\n\ntype SsrLoadModuleOptions = {\n fixStacktrace?: boolean;\n};\n\nexport async function ssrLoadModuleWithFsFallback<TModule = unknown>(\n viteServer: Pick<ViteDevServer, 'ssrLoadModule'>,\n id: string,\n options?: SsrLoadModuleOptions\n) {\n const ids = [id];\n\n if (id.startsWith('/') && !id.startsWith('/@fs/')) {\n ids.push(`/@fs${id}`);\n }\n\n let lastError: unknown;\n\n for (const candidate of ids) {\n try {\n return await viteServer.ssrLoadModule(candidate, options) as TModule;\n } catch (error) {\n lastError = error;\n }\n }\n\n throw lastError;\n}\n","import { existsSync, statSync } from 'node:fs';\nimport { extname, resolve } from 'node:path';\n\nexport type StoryRulesOptions =\n | string\n | {\n configFile: string;\n };\n\nexport function resolveRulesConfigFilePath(\n options?: StoryRulesOptions,\n resolveFrom = process.cwd()\n): string | undefined {\n if (options === undefined) {\n return undefined;\n }\n\n const configFile = normalizeConfigFileOption(options);\n const resolvedConfigFilePath = resolve(resolveFrom, configFile);\n const normalizedConfigFilePath = resolveConfigFilePath(resolvedConfigFilePath);\n\n if (!normalizedConfigFilePath) {\n throw new Error(\n `framework.options.storyRules config file was not found: ${resolvedConfigFilePath}. ` +\n 'Provide an existing path in framework.options.storyRules.'\n );\n }\n\n return normalizedConfigFilePath;\n}\n\nfunction normalizeConfigFileOption(options: StoryRulesOptions): string {\n const configFile =\n typeof options === 'string'\n ? options\n : typeof options === 'object' && options !== null\n ? options.configFile\n : undefined;\n\n if (typeof configFile !== 'string') {\n throw new Error(\n 'framework.options.storyRules must be either a string path or an object with a string configFile.'\n );\n }\n\n const normalizedConfigFile = configFile.trim();\n\n if (!normalizedConfigFile) {\n throw new Error('framework.options.storyRules config file path cannot be empty.');\n }\n\n return normalizedConfigFile;\n}\n\nfunction resolveConfigFilePath(filePath: string): string | undefined {\n if (existsSync(filePath)) {\n const fileStats = statSync(filePath);\n\n if (fileStats.isFile()) {\n return filePath;\n }\n }\n\n if (extname(filePath)) {\n return undefined;\n }\n\n const extensions = ['.ts', '.mts', '.cts', '.js', '.mjs', '.cjs'];\n\n for (const extension of extensions) {\n const candidateFilePath = `${filePath}${extension}`;\n\n if (existsSync(candidateFilePath)) {\n return candidateFilePath;\n }\n }\n\n for (const extension of extensions) {\n const candidateFilePath = resolve(filePath, `index${extension}`);\n\n if (existsSync(candidateFilePath)) {\n return candidateFilePath;\n }\n }\n\n return undefined;\n}\n"],"mappings":"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","names":["VIRTUAL_IDS","require"]}
@@ -0,0 +1,220 @@
1
+ import {
2
+ createViteServer,
3
+ ssrLoadModuleWithFsFallback
4
+ } from "./chunk-POHTFYST.js";
5
+ import {
6
+ resolveTestingIntegrationsForRoot
7
+ } from "./chunk-4SWPVM6R.js";
8
+
9
+ // src/testing/renderer-daemon.ts
10
+ import { createServer as createHttpServer } from "http";
11
+ import { existsSync } from "fs";
12
+ import { fileURLToPath } from "url";
13
+
14
+ // src/testing/working-directory.ts
15
+ var workingDirectoryLock = Promise.resolve();
16
+ async function runWithWorkingDirectory(dir, fn) {
17
+ const previousLock = workingDirectoryLock;
18
+ let releaseLock;
19
+ workingDirectoryLock = new Promise((resolve) => {
20
+ releaseLock = resolve;
21
+ });
22
+ await previousLock;
23
+ const previousCwd = process.cwd();
24
+ try {
25
+ if (previousCwd !== dir) {
26
+ process.chdir(dir);
27
+ }
28
+ return await fn();
29
+ } finally {
30
+ if (process.cwd() !== previousCwd) {
31
+ process.chdir(previousCwd);
32
+ }
33
+ releaseLock();
34
+ }
35
+ }
36
+
37
+ // src/testing/renderer-daemon.ts
38
+ var RENDER_PATH = "/render";
39
+ var TESTING_RENDERER_DAEMON_URL_ENV = "STORYBOOK_ASTRO_TESTING_RENDERER_DAEMON_URL";
40
+ async function readJsonBody(request) {
41
+ const chunks = [];
42
+ for await (const chunk of request) {
43
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
44
+ }
45
+ if (chunks.length === 0) {
46
+ return null;
47
+ }
48
+ return JSON.parse(Buffer.concat(chunks).toString("utf-8"));
49
+ }
50
+ function createBadRequest(message) {
51
+ const error = new Error(message);
52
+ error.statusCode = 400;
53
+ return error;
54
+ }
55
+ function assertRenderPayload(payload) {
56
+ if (!payload || typeof payload !== "object") {
57
+ throw createBadRequest("Invalid render payload.");
58
+ }
59
+ const record = payload;
60
+ if (typeof record.resolveFrom !== "string" || record.resolveFrom.length === 0) {
61
+ throw createBadRequest("Missing render payload field: resolveFrom.");
62
+ }
63
+ if (typeof record.component !== "string" || record.component.length === 0) {
64
+ throw createBadRequest("Missing render payload field: component.");
65
+ }
66
+ if ("args" in record && typeof record.args !== "undefined" && (typeof record.args !== "object" || record.args === null || Array.isArray(record.args))) {
67
+ throw createBadRequest("Render payload field args must be an object when provided.");
68
+ }
69
+ if ("slots" in record && typeof record.slots !== "undefined" && (typeof record.slots !== "object" || record.slots === null || Array.isArray(record.slots))) {
70
+ throw createBadRequest("Render payload field slots must be an object when provided.");
71
+ }
72
+ }
73
+ function getErrorStatusCode(error) {
74
+ if (error && typeof error === "object" && "statusCode" in error) {
75
+ const statusCode = error.statusCode;
76
+ if (typeof statusCode === "number" && Number.isInteger(statusCode) && statusCode >= 400) {
77
+ return statusCode;
78
+ }
79
+ }
80
+ return 500;
81
+ }
82
+ async function startTestingRendererDaemon() {
83
+ const viteServerPromises = /* @__PURE__ */ new Map();
84
+ const renderHandlerPromises = /* @__PURE__ */ new Map();
85
+ async function getViteServer(resolveFrom) {
86
+ if (!viteServerPromises.has(resolveFrom)) {
87
+ const integrations = resolveTestingIntegrationsForRoot(resolveFrom);
88
+ viteServerPromises.set(
89
+ resolveFrom,
90
+ runWithWorkingDirectory(resolveFrom, () => createViteServer(integrations, resolveFrom))
91
+ );
92
+ }
93
+ return viteServerPromises.get(resolveFrom);
94
+ }
95
+ async function getRenderHandler(resolveFrom) {
96
+ if (!renderHandlerPromises.has(resolveFrom)) {
97
+ renderHandlerPromises.set(resolveFrom, (async () => {
98
+ const integrations = resolveTestingIntegrationsForRoot(resolveFrom);
99
+ const viteServer = await getViteServer(resolveFrom);
100
+ const middlewareSrcPath = fileURLToPath(new URL("../middleware.ts", import.meta.url));
101
+ const middlewareModulePath = existsSync(middlewareSrcPath) ? middlewareSrcPath : fileURLToPath(new URL("./middleware.js", import.meta.url));
102
+ const middleware = await runWithWorkingDirectory(
103
+ resolveFrom,
104
+ () => viteServer.ssrLoadModule(middlewareModulePath, {
105
+ fixStacktrace: true
106
+ })
107
+ );
108
+ return middleware.handlerFactory(integrations, {
109
+ loadModule: (id) => ssrLoadModuleWithFsFallback(viteServer, id, {
110
+ fixStacktrace: true
111
+ })
112
+ });
113
+ })());
114
+ }
115
+ return renderHandlerPromises.get(resolveFrom);
116
+ }
117
+ const server = createHttpServer(async (request, response) => {
118
+ response.setHeader("Access-Control-Allow-Origin", "*");
119
+ response.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS");
120
+ response.setHeader("Access-Control-Allow-Headers", "content-type");
121
+ if (request.method === "OPTIONS") {
122
+ response.statusCode = 204;
123
+ response.end();
124
+ return;
125
+ }
126
+ if (request.method !== "POST" || request.url !== RENDER_PATH) {
127
+ response.statusCode = 404;
128
+ response.end();
129
+ return;
130
+ }
131
+ try {
132
+ const payload = await readJsonBody(request);
133
+ assertRenderPayload(payload);
134
+ const handler = await getRenderHandler(payload.resolveFrom);
135
+ const html = await handler({
136
+ component: payload.component,
137
+ args: payload.args,
138
+ slots: payload.slots
139
+ });
140
+ response.statusCode = 200;
141
+ response.setHeader("content-type", "application/json");
142
+ response.end(JSON.stringify({ html }));
143
+ } catch (error) {
144
+ const statusCode = getErrorStatusCode(error);
145
+ response.statusCode = statusCode;
146
+ response.setHeader("content-type", "application/json");
147
+ response.end(JSON.stringify({
148
+ error: error instanceof Error ? error.message : String(error)
149
+ }));
150
+ }
151
+ });
152
+ await new Promise((resolve, reject) => {
153
+ server.once("error", reject);
154
+ server.listen(0, "127.0.0.1", () => {
155
+ server.off("error", reject);
156
+ resolve();
157
+ });
158
+ });
159
+ const address = server.address();
160
+ if (!address || typeof address === "string") {
161
+ throw new Error("Failed to start Storybook Astro testing renderer daemon.");
162
+ }
163
+ const url = `http://127.0.0.1:${address.port}${RENDER_PATH}`;
164
+ return {
165
+ url,
166
+ close: async () => {
167
+ await Promise.all(
168
+ [...viteServerPromises.values()].map(async (viteServerPromise) => {
169
+ const viteServer = await viteServerPromise;
170
+ await viteServer.close();
171
+ })
172
+ );
173
+ await new Promise((resolve, reject) => {
174
+ server.close((error) => {
175
+ if (error) {
176
+ reject(error);
177
+ return;
178
+ }
179
+ resolve();
180
+ });
181
+ });
182
+ }
183
+ };
184
+ }
185
+ function getTestingRendererDaemonUrl() {
186
+ const value = process.env[TESTING_RENDERER_DAEMON_URL_ENV];
187
+ if (!value || value.length === 0) {
188
+ return null;
189
+ }
190
+ return value;
191
+ }
192
+ async function renderViaTestingRendererDaemon(payload) {
193
+ const daemonUrl = getTestingRendererDaemonUrl();
194
+ if (!daemonUrl) {
195
+ return null;
196
+ }
197
+ const response = await fetch(daemonUrl, {
198
+ method: "POST",
199
+ headers: {
200
+ "content-type": "application/json"
201
+ },
202
+ body: JSON.stringify(payload)
203
+ });
204
+ const parsed = await response.json();
205
+ if (!response.ok) {
206
+ throw new Error(parsed.error ?? `Renderer daemon returned ${response.status}.`);
207
+ }
208
+ if (typeof parsed.html !== "string") {
209
+ throw new Error("Renderer daemon returned an invalid payload.");
210
+ }
211
+ return parsed.html;
212
+ }
213
+
214
+ export {
215
+ runWithWorkingDirectory,
216
+ TESTING_RENDERER_DAEMON_URL_ENV,
217
+ startTestingRendererDaemon,
218
+ renderViaTestingRendererDaemon
219
+ };
220
+ //# sourceMappingURL=chunk-T7NWIO5S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/testing/renderer-daemon.ts","../src/testing/working-directory.ts"],"sourcesContent":["import { createServer as createHttpServer } from 'node:http';\nimport type { IncomingMessage } from 'node:http';\nimport { existsSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport type { ViteDevServer } from 'vite';\nimport { createViteServer } from '../viteStorybookAstroMiddlewarePlugin.ts';\nimport { resolveTestingIntegrationsForRoot } from './integration-config.ts';\nimport { runWithWorkingDirectory } from './working-directory.ts';\nimport { ssrLoadModuleWithFsFallback } from '../lib/ssr-load-module-with-fs-fallback.ts';\n\nconst RENDER_PATH = '/render';\n\nexport const TESTING_RENDERER_DAEMON_URL_ENV = 'STORYBOOK_ASTRO_TESTING_RENDERER_DAEMON_URL';\n\ntype RenderPayload = {\n resolveFrom: string;\n component: string;\n args?: Record<string, unknown>;\n slots?: Record<string, unknown>;\n};\n\ntype RenderHandler = (data: {\n component: string;\n args?: Record<string, unknown>;\n slots?: Record<string, unknown>;\n}) => Promise<string>;\n\ntype RunningDaemon = {\n url: string;\n close: () => Promise<void>;\n};\n\nasync function readJsonBody(request: IncomingMessage) {\n const chunks: Buffer[] = [];\n\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n if (chunks.length === 0) {\n return null;\n }\n\n return JSON.parse(Buffer.concat(chunks).toString('utf-8')) as unknown;\n}\n\nfunction createBadRequest(message: string) {\n const error = new Error(message);\n\n (error as Error & { statusCode?: number }).statusCode = 400;\n\n return error;\n}\n\nfunction assertRenderPayload(payload: unknown): asserts payload is RenderPayload {\n if (!payload || typeof payload !== 'object') {\n throw createBadRequest('Invalid render payload.');\n }\n\n const record = payload as Record<string, unknown>;\n\n if (typeof record.resolveFrom !== 'string' || record.resolveFrom.length === 0) {\n throw createBadRequest('Missing render payload field: resolveFrom.');\n }\n\n if (typeof record.component !== 'string' || record.component.length === 0) {\n throw createBadRequest('Missing render payload field: component.');\n }\n\n if (\n 'args' in record &&\n typeof record.args !== 'undefined' &&\n (typeof record.args !== 'object' || record.args === null || Array.isArray(record.args))\n ) {\n throw createBadRequest('Render payload field args must be an object when provided.');\n }\n\n if (\n 'slots' in record &&\n typeof record.slots !== 'undefined' &&\n (typeof record.slots !== 'object' || record.slots === null || Array.isArray(record.slots))\n ) {\n throw createBadRequest('Render payload field slots must be an object when provided.');\n }\n}\n\nfunction getErrorStatusCode(error: unknown) {\n if (error && typeof error === 'object' && 'statusCode' in error) {\n const statusCode = (error as { statusCode?: unknown }).statusCode;\n\n if (typeof statusCode === 'number' && Number.isInteger(statusCode) && statusCode >= 400) {\n return statusCode;\n }\n }\n\n return 500;\n}\n\nexport async function startTestingRendererDaemon(): Promise<RunningDaemon> {\n // One daemon process serves all Vitest workers; cache is keyed by project root.\n const viteServerPromises = new Map<string, Promise<ViteDevServer>>();\n const renderHandlerPromises = new Map<string, Promise<RenderHandler>>();\n\n async function getViteServer(resolveFrom: string) {\n if (!viteServerPromises.has(resolveFrom)) {\n const integrations = resolveTestingIntegrationsForRoot(resolveFrom);\n\n viteServerPromises.set(\n resolveFrom,\n runWithWorkingDirectory(resolveFrom, () => createViteServer(integrations, resolveFrom))\n );\n }\n\n return viteServerPromises.get(resolveFrom)!;\n }\n\n async function getRenderHandler(resolveFrom: string) {\n if (!renderHandlerPromises.has(resolveFrom)) {\n renderHandlerPromises.set(resolveFrom, (async () => {\n const integrations = resolveTestingIntegrationsForRoot(resolveFrom);\n const viteServer = await getViteServer(resolveFrom);\n // In the workspace this file is src/testing/renderer-daemon.ts so\n // '../middleware.ts' resolves to src/middleware.ts (Vite handles .ts).\n // When compiled by tsup, this code lands in a dist/chunk-*.js file so\n // '../middleware.ts' would resolve to framework/middleware.ts which does\n // not exist; fall back to './middleware.js' (sibling in dist/).\n const middlewareSrcPath = fileURLToPath(new URL('../middleware.ts', import.meta.url));\n const middlewareModulePath = existsSync(middlewareSrcPath)\n ? middlewareSrcPath\n : fileURLToPath(new URL('./middleware.js', import.meta.url));\n const middleware = await runWithWorkingDirectory(resolveFrom, () =>\n viteServer.ssrLoadModule(middlewareModulePath, {\n fixStacktrace: true\n })\n );\n\n return middleware.handlerFactory(integrations, {\n loadModule: (id: string) =>\n ssrLoadModuleWithFsFallback(viteServer, id, {\n fixStacktrace: true\n })\n }) as Promise<RenderHandler>;\n })());\n }\n\n return renderHandlerPromises.get(resolveFrom)!;\n }\n\n const server = createHttpServer(async (request, response) => {\n // Allow cross-origin requests from browser-like test environments (e.g. happy-dom).\n response.setHeader('Access-Control-Allow-Origin', '*');\n response.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');\n response.setHeader('Access-Control-Allow-Headers', 'content-type');\n\n if (request.method === 'OPTIONS') {\n response.statusCode = 204;\n response.end();\n\n return;\n }\n\n if (request.method !== 'POST' || request.url !== RENDER_PATH) {\n response.statusCode = 404;\n response.end();\n\n return;\n }\n\n try {\n const payload = await readJsonBody(request);\n\n assertRenderPayload(payload);\n\n const handler = await getRenderHandler(payload.resolveFrom);\n const html = await handler({\n component: payload.component,\n args: payload.args,\n slots: payload.slots\n });\n\n response.statusCode = 200;\n response.setHeader('content-type', 'application/json');\n response.end(JSON.stringify({ html }));\n } catch (error) {\n const statusCode = getErrorStatusCode(error);\n\n response.statusCode = statusCode;\n response.setHeader('content-type', 'application/json');\n response.end(JSON.stringify({\n error: error instanceof Error ? error.message : String(error)\n }));\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => {\n server.off('error', reject);\n resolve();\n });\n });\n\n const address = server.address();\n\n if (!address || typeof address === 'string') {\n throw new Error('Failed to start Storybook Astro testing renderer daemon.');\n }\n\n const url = `http://127.0.0.1:${address.port}${RENDER_PATH}`;\n\n return {\n url,\n close: async () => {\n await Promise.all(\n [...viteServerPromises.values()].map(async (viteServerPromise) => {\n const viteServer = await viteServerPromise;\n\n await viteServer.close();\n })\n );\n\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n\n return;\n }\n\n resolve();\n });\n });\n }\n };\n}\n\nexport function getTestingRendererDaemonUrl() {\n const value = process.env[TESTING_RENDERER_DAEMON_URL_ENV];\n\n if (!value || value.length === 0) {\n return null;\n }\n\n return value;\n}\n\nexport async function renderViaTestingRendererDaemon(payload: RenderPayload) {\n const daemonUrl = getTestingRendererDaemonUrl();\n\n if (!daemonUrl) {\n // Daemon is optional so local in-worker rendering can still be used as fallback.\n return null;\n }\n\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n const response = await fetch(daemonUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n\n const parsed = (await response.json()) as {\n html?: string;\n error?: string;\n };\n\n if (!response.ok) {\n throw new Error(parsed.error ?? `Renderer daemon returned ${response.status}.`);\n }\n\n if (typeof parsed.html !== 'string') {\n throw new Error('Renderer daemon returned an invalid payload.');\n }\n\n return parsed.html;\n}\n","let workingDirectoryLock: Promise<void> = Promise.resolve();\n\nexport async function runWithWorkingDirectory<T>(dir: string, fn: () => Promise<T>) {\n const previousLock = workingDirectoryLock;\n let releaseLock!: () => void;\n\n workingDirectoryLock = new Promise<void>((resolve) => {\n releaseLock = resolve;\n });\n\n await previousLock;\n\n const previousCwd = process.cwd();\n\n try {\n if (previousCwd !== dir) {\n process.chdir(dir);\n }\n\n return await fn();\n } finally {\n if (process.cwd() !== previousCwd) {\n process.chdir(previousCwd);\n }\n\n releaseLock();\n }\n}\n"],"mappings":"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","names":[]}