@storybook-astro/framework 1.1.1 → 1.3.0-canary.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.
- package/dist/{base-IRZo3zgK.d.ts → base-DT67T5pi.d.ts} +1 -0
- package/dist/{chunk-T7NWIO5S.js → chunk-2EABPTOY.js} +5 -5
- package/dist/{chunk-PJEDXZVN.js → chunk-7YBE4TTI.js} +2 -1
- package/dist/chunk-7YBE4TTI.js.map +1 -0
- package/dist/{chunk-POHTFYST.js → chunk-AYYMNFI6.js} +104 -6
- package/dist/chunk-AYYMNFI6.js.map +1 -0
- package/dist/chunk-B5HHF6FC.js +116 -0
- package/dist/chunk-B5HHF6FC.js.map +1 -0
- package/dist/chunk-H3XZHW6Z.js +1402 -0
- package/dist/chunk-H3XZHW6Z.js.map +1 -0
- package/dist/{chunk-5EF25G5S.js → chunk-KXAAX3GN.js} +1 -1
- package/dist/chunk-KXAAX3GN.js.map +1 -0
- package/dist/{chunk-DNGQBPT7.js → chunk-PUTCAN6X.js} +5 -2
- package/dist/{chunk-DNGQBPT7.js.map → chunk-PUTCAN6X.js.map} +1 -1
- package/dist/{chunk-V76WSNSP.js → chunk-TWAO2IQW.js} +229 -17
- package/dist/chunk-TWAO2IQW.js.map +1 -0
- package/dist/{chunk-4SWPVM6R.js → chunk-WUTCMEF5.js} +2 -2
- package/dist/index.d.ts +31 -11
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/dist/integrations/index.d.ts +2 -1
- package/dist/integrations/index.js +1 -1
- package/dist/middleware.js +18 -159
- package/dist/middleware.js.map +1 -1
- package/dist/{portable-stories-BvdaQigq.d.ts → portable-stories-DXT_GOf6.d.ts} +3 -3
- package/dist/{types-Cvor6Tyi.d.ts → preset-BvgHg2of.d.ts} +8 -2
- package/dist/preset.d.ts +2 -10
- package/dist/preset.js +5 -4
- package/dist/renderer/renderer-dev.js +62 -0
- package/dist/renderer/renderer-dev.js.map +1 -0
- package/dist/renderer/renderer-server.js +92 -0
- package/dist/renderer/renderer-server.js.map +1 -0
- package/dist/renderer/renderer-static.js +54 -0
- package/dist/renderer/renderer-static.js.map +1 -0
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +13 -12
- package/dist/testing.js.map +1 -1
- package/dist/{viteStorybookAstroMiddlewarePlugin-2EFKTECT.js → viteStorybookAstroMiddlewarePlugin-UB6ZLJ4B.js} +4 -3
- package/dist/vitest/global-setup.js +6 -5
- package/dist/vitest/global-setup.js.map +1 -1
- package/dist/vitest/index.d.ts +20 -2
- package/dist/vitest/index.js +4 -3
- package/package.json +16 -45
- package/src/astroImageService.ts +57 -0
- package/src/astroRenderHandler.ts +203 -0
- package/src/importAstroConfig.ts +1 -1
- package/src/index.ts +14 -2
- package/src/integrations/alpine.ts +1 -0
- package/src/integrations/base.ts +6 -0
- package/src/lib/passthrough-image-service.ts +76 -0
- package/src/middleware.ts +28 -240
- package/src/module-mocks.ts +153 -5
- package/src/portable-stories.test.ts +28 -0
- package/src/portable-stories.ts +12 -12
- package/src/preset.ts +38 -8
- package/src/productionRenderRuntime.ts +187 -0
- package/src/rules.test.ts +52 -4
- package/src/rules.ts +54 -7
- package/src/server/index.ts +101 -31
- package/src/storyRulesRuntime.ts +34 -0
- package/src/storySsrVite.ts +240 -0
- package/src/virtual.d.ts +17 -3
- package/src/vite/{astroFilesVirtualModulePlugin.ts → astroFilesPlugin.ts} +4 -4
- package/src/vite/sanitizeConfigPlugin.ts +18 -0
- package/src/vite/{storybookAstroServerAuthConfigVirtualModulePlugin.test.ts → serverAuthPlugin.test.ts} +7 -10
- package/src/vite/{storybookAstroServerAuthConfigVirtualModulePlugin.ts → serverAuthPlugin.ts} +6 -9
- package/src/vite/serverRuntimePlugin.ts +109 -0
- package/src/vite/{storybookAstroRulesConfigVirtualModulePlugin.ts → storyRulesPlugin.ts} +6 -7
- package/src/vite/{createVirtualModulePlugin.test.ts → virtualModulePlugin.test.ts} +5 -5
- package/src/vite/{createVirtualModulePlugin.ts → virtualModulePlugin.ts} +2 -2
- package/src/viteAstroContainerRenderersPlugin.ts +72 -2
- package/src/vitePluginAstroBuildPrerender.ts +124 -568
- package/src/vitePluginAstroBuildServer.ts +217 -165
- package/src/vitePluginAstroBuildShared.test.ts +87 -0
- package/src/vitePluginAstroBuildShared.ts +465 -0
- package/src/vitePluginStoryModuleMocks.ts +29 -0
- package/src/viteStorybookAstroMiddlewarePlugin.ts +8 -0
- package/src/viteStorybookAstroRendererPlugin.ts +13 -6
- package/src/viteStorybookRendererFallbackPlugin.ts +2 -2
- package/src/vitest/index.ts +1 -0
- package/dist/chunk-4HECE7IW.js +0 -1076
- package/dist/chunk-4HECE7IW.js.map +0 -1
- package/dist/chunk-5EF25G5S.js.map +0 -1
- package/dist/chunk-PJEDXZVN.js.map +0 -1
- package/dist/chunk-POHTFYST.js.map +0 -1
- package/dist/chunk-V76WSNSP.js.map +0 -1
- package/dist/node/index.d.ts +0 -10
- package/dist/node/index.js +0 -10
- package/dist/node/index.js.map +0 -1
- package/src/vite/storybookAstroSanitizationConfigVirtualModulePlugin.ts +0 -21
- /package/dist/{chunk-T7NWIO5S.js.map → chunk-2EABPTOY.js.map} +0 -0
- /package/dist/{chunk-4SWPVM6R.js.map → chunk-WUTCMEF5.js.map} +0 -0
- /package/dist/{viteStorybookAstroMiddlewarePlugin-2EFKTECT.js.map → viteStorybookAstroMiddlewarePlugin-UB6ZLJ4B.js.map} +0 -0
|
@@ -12,6 +12,7 @@ type RendererDeclaration = {
|
|
|
12
12
|
};
|
|
13
13
|
declare abstract class Integration {
|
|
14
14
|
abstract readonly name: string;
|
|
15
|
+
readonly factoryName?: string;
|
|
15
16
|
abstract readonly dependencies: string[];
|
|
16
17
|
abstract readonly options: Record<string | number | symbol, unknown>;
|
|
17
18
|
abstract readonly renderer: RendererDeclaration;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveTestingIntegrationsForRoot
|
|
3
|
+
} from "./chunk-WUTCMEF5.js";
|
|
1
4
|
import {
|
|
2
5
|
createViteServer,
|
|
3
6
|
ssrLoadModuleWithFsFallback
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import {
|
|
6
|
-
resolveTestingIntegrationsForRoot
|
|
7
|
-
} from "./chunk-4SWPVM6R.js";
|
|
7
|
+
} from "./chunk-AYYMNFI6.js";
|
|
8
8
|
|
|
9
9
|
// src/testing/renderer-daemon.ts
|
|
10
10
|
import { createServer as createHttpServer } from "http";
|
|
@@ -217,4 +217,4 @@ export {
|
|
|
217
217
|
startTestingRendererDaemon,
|
|
218
218
|
renderViaTestingRendererDaemon
|
|
219
219
|
};
|
|
220
|
-
//# sourceMappingURL=chunk-
|
|
220
|
+
//# sourceMappingURL=chunk-2EABPTOY.js.map
|
|
@@ -36,6 +36,7 @@ async function importModule(moduleName, resolveFrom2 = process.cwd()) {
|
|
|
36
36
|
// src/integrations/alpine.ts
|
|
37
37
|
var AlpineIntegration = class {
|
|
38
38
|
name = "alpine";
|
|
39
|
+
factoryName = "alpinejs";
|
|
39
40
|
dependencies = [
|
|
40
41
|
"@astrojs/alpinejs",
|
|
41
42
|
"alpinejs"
|
|
@@ -237,4 +238,4 @@ export {
|
|
|
237
238
|
svelte,
|
|
238
239
|
vue
|
|
239
240
|
};
|
|
240
|
-
//# sourceMappingURL=chunk-
|
|
241
|
+
//# sourceMappingURL=chunk-7YBE4TTI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/integrations/moduleResolver.ts","../src/integrations/alpine.ts","../src/integrations/preact.ts","../src/integrations/react.ts","../src/integrations/solid.ts","../src/integrations/svelte.ts","../src/integrations/vue.ts","../src/integrations/index.ts"],"sourcesContent":["import path from 'node:path';\nimport { createRequire } from 'node:module';\nimport { pathToFileURL } from 'node:url';\n\nfunction toFileHref(filePath: string): string {\n return pathToFileURL(filePath).href;\n}\n\nexport function resolveFrom(moduleName: string, fromDirectory: string): string {\n const fromFile = path.join(fromDirectory, '__storybook_astro_resolve__.js');\n\n return createRequire(toFileHref(fromFile)).resolve(moduleName);\n}\n\nfunction resolveFromCandidates(moduleName: string, primaryDirectory: string): string {\n const directories = [primaryDirectory, process.env.INIT_CWD].filter(\n (value): value is string => Boolean(value)\n );\n const visited = new Set<string>();\n let lastError: unknown;\n\n for (const directory of directories) {\n if (visited.has(directory)) {\n continue;\n }\n\n visited.add(directory);\n\n try {\n return resolveFrom(moduleName, directory);\n } catch (error) {\n lastError = error;\n }\n }\n\n throw lastError;\n}\n\nexport async function importModule<T = unknown>(moduleName: string, resolveFrom = process.cwd()): Promise<T> {\n const resolvedPath = resolveFromCandidates(moduleName, resolveFrom);\n\n return import(toFileHref(resolvedPath)) as Promise<T>;\n}\n","import type { Integration } from './base.ts';\nimport { importModule } from './moduleResolver.ts';\n\nexport type Options = Record<string, unknown>;\n\nexport class AlpineIntegration implements Integration {\n readonly name = 'alpine';\n readonly factoryName = 'alpinejs';\n readonly dependencies = [\n '@astrojs/alpinejs',\n 'alpinejs'\n ];\n readonly options: Options;\n readonly renderer = {};\n\n constructor(options: Options = {}) {\n this.options = options;\n }\n\n resolveClient(_moduleName: string): undefined {}\n\n async loadIntegration(resolveFrom = process.cwd()) {\n const framework = await importModule<{\n default: (options: Options) => Awaited<ReturnType<Integration['loadIntegration']>>;\n }>('@astrojs/alpinejs', resolveFrom);\n\n return framework.default(this.options);\n }\n}\n","import type { Integration } from './base.ts';\nimport type { PreactPluginOptions } from '@preact/preset-vite';\nimport { importModule } from './moduleResolver.ts';\n\nexport type Options = Pick<PreactPluginOptions, 'include' | 'exclude'> & {\n compat?: boolean;\n devtools?: boolean;\n};\n\nexport class PreactIntegration implements Integration {\n readonly name = 'preact';\n readonly dependencies = ['@astrojs/preact', '@storybook/preact-vite', 'preact'];\n readonly options: Options;\n readonly storybookEntryPreview = '@storybook/preact/entry-preview';\n \n readonly renderer = {\n server: {\n name: '@astrojs/preact',\n entrypoint: '@astrojs/preact/server.js'\n },\n client: {\n name: '@astrojs/preact',\n entrypoint: '@astrojs/preact/client.js'\n }\n };\n\n constructor(options: Options = {}) {\n this.options = options;\n }\n\n resolveClient(moduleName: string): string | undefined {\n if (moduleName.startsWith('@astrojs/preact/client')) {\n return `/@id/${moduleName}`;\n }\n }\n\n async loadIntegration(resolveFrom = process.cwd()) {\n const framework = await importModule<{\n default: (options: Options) => Awaited<ReturnType<Integration['loadIntegration']>>;\n }>('@astrojs/preact', resolveFrom);\n\n return framework.default(this.options);\n }\n}\n","import type { Integration } from './base.ts';\nimport type { Options as ViteReactPluginOptions } from '@vitejs/plugin-react';\nimport { importModule } from './moduleResolver.ts';\n\nexport type Options = Pick<ViteReactPluginOptions, 'include' | 'exclude'>;\n\nexport class ReactIntegration implements Integration {\n readonly name = 'react';\n readonly dependencies = ['@astrojs/react', '@storybook/react', 'react', 'react-dom'];\n readonly options: Options;\n readonly storybookEntryPreview = '@storybook/react/entry-preview';\n\n readonly renderer = {\n server: {\n name: '@astrojs/react',\n entrypoint: '@astrojs/react/server.js'\n },\n client: {\n name: '@astrojs/react',\n entrypoint: '@astrojs/react/client.js'\n }\n };\n\n constructor(options: Options = {}) {\n this.options = options;\n }\n\n resolveClient(moduleName: string): string | undefined {\n if (moduleName.startsWith('@astrojs/react/client')) {\n return `/@id/${moduleName}`;\n }\n }\n\n async loadIntegration(resolveFrom = process.cwd()) {\n const framework = await importModule<{\n default: (options: Options) => Awaited<ReturnType<Integration['loadIntegration']>>;\n }>('@astrojs/react', resolveFrom);\n\n return framework.default(this.options);\n }\n}\n","import type { Integration } from './base.ts';\nimport type { Options as ViteSolidPluginOptions } from 'vite-plugin-solid';\nimport { importModule } from './moduleResolver.ts';\n\nexport type Options = Pick<ViteSolidPluginOptions, 'include' | 'exclude'>;\n\nexport class SolidIntegration implements Integration {\n readonly name = 'solid';\n readonly dependencies = ['@astrojs/solid-js', 'storybook-solidjs-vite', 'solid-js'];\n readonly options: Options;\n readonly storybookEntryPreview = 'storybook-solidjs-vite/renderer/entry-preview';\n readonly renderer = {\n server: {\n name: '@astrojs/solid-js',\n entrypoint: '@astrojs/solid-js/server.js'\n },\n client: {\n name: '@astrojs/solid-js',\n entrypoint: '@astrojs/solid-js/client.js'\n }\n };\n\n constructor(options: Options = {}) {\n this.options = options;\n }\n\n resolveClient(moduleName: string): string | undefined {\n if (moduleName.startsWith('@astrojs/solid-js/client')) {\n return `/@id/${moduleName}`;\n }\n }\n\n async loadIntegration(resolveFrom = process.cwd()) {\n const framework = await importModule<{\n default: (options: Options) => Awaited<ReturnType<Integration['loadIntegration']>>;\n }>('@astrojs/solid-js', resolveFrom);\n\n return framework.default(this.options);\n }\n}\n","import type { Integration } from './base.ts';\nimport type { Options as _foo, PluginOptions, SvelteConfig } from '@sveltejs/vite-plugin-svelte';\nimport { importModule } from './moduleResolver.ts';\n\n// Using Omit with empty string to preserve index signature\n// capabilities while maintaining the structure of the original types\nexport type Options = Omit<PluginOptions, ''> & Omit<SvelteConfig, 'vitePlugin'>;\n\nconst DEFAULT_OPTIONS: Options = {\n extensions: ['.svelte']\n};\n\nexport class SvelteIntegration implements Integration {\n readonly name = 'svelte';\n readonly dependencies = ['@astrojs/svelte', '@storybook/svelte', 'svelte'];\n readonly options: Options;\n readonly storybookEntryPreview = '@storybook/svelte/entry-preview';\n readonly renderer = {\n server: {\n entrypoint: '@astrojs/svelte/server.js',\n name: '@astrojs/svelte'\n },\n client: {\n name: '@astrojs/svelte',\n entrypoint: '@astrojs/svelte/client.js'\n }\n };\n\n constructor(options: Options = DEFAULT_OPTIONS) {\n this.options = options;\n }\n\n resolveClient(moduleName: string): string | undefined {\n if (moduleName.startsWith('@astrojs/svelte/client')) {\n return `/@id/${moduleName}`;\n }\n }\n\n async loadIntegration(resolveFrom = process.cwd()) {\n const framework = await importModule<{\n default: (options: Options) => Awaited<ReturnType<Integration['loadIntegration']>>;\n }>('@astrojs/svelte', resolveFrom);\n\n return framework.default(this.options);\n }\n}\n","import type { Integration } from './base.ts';\nimport type { Options as VueOptions } from '@vitejs/plugin-vue';\nimport type { Options as VueJsxOptions } from '@vitejs/plugin-vue-jsx';\nimport { importModule } from './moduleResolver.ts';\n\nexport type Options = Pick<VueOptions, 'include' | 'exclude'> & {\n jsx?: boolean | VueJsxOptions;\n};\n\nconst DEFAULT_OPTIONS: Options = {\n include: ['**/*.vue']\n};\n\nexport class VueIntegration implements Integration {\n readonly name = 'vue';\n readonly dependencies = ['@astrojs/vue', '@storybook/vue3', 'vue'];\n readonly options: Options;\n readonly storybookEntryPreview = '@storybook/vue3/entry-preview';\n\n readonly renderer = {\n server: {\n name: '@astrojs/vue',\n entrypoint: '@astrojs/vue/server.js'\n },\n client: {\n name: '@astrojs/vue',\n entrypoint: '@astrojs/vue/client.js'\n }\n };\n\n constructor(options: Options = DEFAULT_OPTIONS) {\n this.options = options;\n }\n\n resolveClient(moduleName: string): string | undefined {\n if (moduleName.startsWith('@astrojs/vue/client')) {\n return `/@id/${moduleName}`;\n }\n }\n\n async loadIntegration(resolveFrom = process.cwd()) {\n const framework = await importModule<{\n default: (options: Options) => Awaited<ReturnType<Integration['loadIntegration']>>;\n }>('@astrojs/vue', resolveFrom);\n\n return framework.default(this.options);\n }\n}\n","import { AlpineIntegration, type Options as AlpineOptions } from './alpine.ts';\nimport { PreactIntegration, type Options as PreactOptions } from './preact.ts';\nimport { ReactIntegration, type Options as ReactOptions } from './react.ts';\nimport { SolidIntegration, type Options as SolidOptions } from './solid.ts';\nimport { SvelteIntegration, type Options as SvelteOptions } from './svelte.ts';\nimport { VueIntegration, type Options as VueOptions } from './vue.ts';\n\n\nexport function alpinejs(options?: AlpineOptions) {\n return new AlpineIntegration(options);\n}\n\nexport function preact(options?: PreactOptions) {\n return new PreactIntegration(options);\n}\n\nexport function react(options?: ReactOptions) {\n return new ReactIntegration(options);\n}\n\nexport function solid(options?: SolidOptions) {\n return new SolidIntegration(options);\n}\n\nexport function svelte(options?: SvelteOptions) {\n return new SvelteIntegration(options);\n}\n\nexport function vue(options?: VueOptions) {\n return new VueIntegration(options);\n}\n\nexport type { Integration } from './base.ts';\n"],"mappings":"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","names":["resolveFrom","resolveFrom","resolveFrom","resolveFrom","resolveFrom","resolveFrom","DEFAULT_OPTIONS","resolveFrom"]}
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
2
|
importAstroConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-PUTCAN6X.js";
|
|
4
|
+
import {
|
|
5
|
+
STORYBOOK_ASTRO_INLINE_MODULE_PREFIX,
|
|
6
|
+
loadStoryInlineModule,
|
|
7
|
+
resolveStoryModuleMock
|
|
8
|
+
} from "./chunk-B5HHF6FC.js";
|
|
4
9
|
|
|
5
10
|
// src/viteStorybookAstroMiddlewarePlugin.ts
|
|
6
11
|
import { createRequire } from "module";
|
|
7
12
|
import { fileURLToPath } from "url";
|
|
8
13
|
import { createServer, createLogger } from "vite";
|
|
9
14
|
|
|
10
|
-
// src/vite/
|
|
11
|
-
function
|
|
15
|
+
// src/vite/virtualModulePlugin.ts
|
|
16
|
+
function createVirtualModule(options) {
|
|
12
17
|
const resolvedVirtualModuleId = `\0${options.virtualModuleId}`;
|
|
13
18
|
return {
|
|
14
19
|
name: options.pluginName,
|
|
@@ -30,22 +35,26 @@ function viteAstroContainerRenderersPlugin(integrations, options = {}) {
|
|
|
30
35
|
const safeIntegrations = integrations ?? [];
|
|
31
36
|
const mode = options.mode ?? "development";
|
|
32
37
|
const staticModuleMap = options.staticModuleMap ?? {};
|
|
33
|
-
return
|
|
38
|
+
return createVirtualModule({
|
|
34
39
|
pluginName: "storybook-astro:container-renderers",
|
|
35
40
|
virtualModuleId: "virtual:astro-container-renderers",
|
|
36
41
|
load() {
|
|
37
42
|
const importStatements = buildImportStatements(safeIntegrations);
|
|
43
|
+
const browserModuleResolverHelpers = mode === "development" ? buildBrowserModuleResolverHelpers() : "";
|
|
44
|
+
const clientModuleEntrypoints = mode === "development" ? buildClientModuleEntrypoints(safeIntegrations) : "[]";
|
|
38
45
|
const clientResolvers = mode === "development" ? safeIntegrations.filter((integration) => typeof integration.resolveClient === "function").map(
|
|
39
46
|
(integration) => integration.resolveClient.toString().replace(/^resolveClient/, "function")
|
|
40
47
|
).join(",\n") : "";
|
|
41
48
|
return `
|
|
42
49
|
${importStatements}
|
|
50
|
+
${browserModuleResolverHelpers}
|
|
43
51
|
|
|
44
52
|
export function addRenderers(container) {
|
|
45
53
|
${safeIntegrations.map((integration) => buildServerRenderer(integration) + "\n" + buildClientRenderer(integration)).join("\n")}
|
|
46
54
|
}
|
|
47
55
|
|
|
48
56
|
const staticClientModules = ${JSON.stringify(staticModuleMap, null, 2)};
|
|
57
|
+
const clientModuleEntrypoints = ${clientModuleEntrypoints};
|
|
49
58
|
|
|
50
59
|
const clientModulesResolvers = [
|
|
51
60
|
${clientResolvers}
|
|
@@ -62,6 +71,12 @@ function viteAstroContainerRenderersPlugin(integrations, options = {}) {
|
|
|
62
71
|
return staticClientModules[normalizedSpecifier];
|
|
63
72
|
}
|
|
64
73
|
|
|
74
|
+
for (const entrypoint of clientModuleEntrypoints) {
|
|
75
|
+
if (normalizedSpecifier === entrypoint || normalizedSpecifier.startsWith(entrypoint)) {
|
|
76
|
+
return storybookAstroResolveBrowserModulePath(normalizedSpecifier);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
65
80
|
for (const resolver of clientModulesResolvers) {
|
|
66
81
|
const resolution = resolver(specifier);
|
|
67
82
|
|
|
@@ -74,6 +89,60 @@ function viteAstroContainerRenderersPlugin(integrations, options = {}) {
|
|
|
74
89
|
}
|
|
75
90
|
});
|
|
76
91
|
}
|
|
92
|
+
function buildClientModuleEntrypoints(integrations) {
|
|
93
|
+
return JSON.stringify(
|
|
94
|
+
Array.from(
|
|
95
|
+
new Set(
|
|
96
|
+
integrations.map((integration) => integration.renderer.client?.entrypoint).filter((entrypoint) => Boolean(entrypoint))
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
function buildBrowserModuleResolverHelpers() {
|
|
102
|
+
return `
|
|
103
|
+
import path from 'node:path';
|
|
104
|
+
import { createRequire } from 'node:module';
|
|
105
|
+
import { pathToFileURL } from 'node:url';
|
|
106
|
+
|
|
107
|
+
function storybookAstroToFileHref(filePath) {
|
|
108
|
+
return pathToFileURL(filePath).href;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function storybookAstroResolveFrom(moduleName, fromDirectory) {
|
|
112
|
+
const fromFile = path.join(fromDirectory, '__storybook_astro_resolve__.js');
|
|
113
|
+
|
|
114
|
+
return createRequire(storybookAstroToFileHref(fromFile)).resolve(moduleName);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function storybookAstroResolveFromCandidates(moduleName, primaryDirectory) {
|
|
118
|
+
const directories = [primaryDirectory, process.env.INIT_CWD].filter(Boolean);
|
|
119
|
+
const visited = new Set();
|
|
120
|
+
let lastError;
|
|
121
|
+
|
|
122
|
+
for (const directory of directories) {
|
|
123
|
+
if (visited.has(directory)) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
visited.add(directory);
|
|
128
|
+
|
|
129
|
+
try {
|
|
130
|
+
return storybookAstroResolveFrom(moduleName, directory);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
lastError = error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
throw lastError;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function storybookAstroResolveBrowserModulePath(moduleName, resolveFrom = process.cwd()) {
|
|
140
|
+
const resolvedPath = storybookAstroResolveFromCandidates(moduleName, resolveFrom).replace(/\\\\/g, '/');
|
|
141
|
+
|
|
142
|
+
return '/@fs/' + resolvedPath;
|
|
143
|
+
}
|
|
144
|
+
`;
|
|
145
|
+
}
|
|
77
146
|
function buildImportStatements(integrations) {
|
|
78
147
|
return integrations.filter((integration) => integration.renderer.server).map(
|
|
79
148
|
(integration) => `import ${integration.name}Renderer from '${integration.renderer.server?.entrypoint}';`
|
|
@@ -231,6 +300,27 @@ function vitePluginAstroRoutesFallback() {
|
|
|
231
300
|
};
|
|
232
301
|
}
|
|
233
302
|
|
|
303
|
+
// src/vitePluginStoryModuleMocks.ts
|
|
304
|
+
function vitePluginStoryModuleMocks() {
|
|
305
|
+
return {
|
|
306
|
+
name: "storybook-astro:story-module-mocks",
|
|
307
|
+
enforce: "pre",
|
|
308
|
+
resolveId(id) {
|
|
309
|
+
if (id.startsWith(STORYBOOK_ASTRO_INLINE_MODULE_PREFIX)) {
|
|
310
|
+
return `\0${id}`;
|
|
311
|
+
}
|
|
312
|
+
const mockedModule = resolveStoryModuleMock(id);
|
|
313
|
+
if (mockedModule) {
|
|
314
|
+
return mockedModule;
|
|
315
|
+
}
|
|
316
|
+
return null;
|
|
317
|
+
},
|
|
318
|
+
load(id) {
|
|
319
|
+
return loadStoryInlineModule(id);
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
234
324
|
// src/lib/ssr-load-module-with-fs-fallback.ts
|
|
235
325
|
async function ssrLoadModuleWithFsFallback(viteServer, id, options) {
|
|
236
326
|
const ids = [id];
|
|
@@ -321,6 +411,9 @@ async function vitePluginStorybookAstroMiddleware(options) {
|
|
|
321
411
|
sanitization: options.sanitization,
|
|
322
412
|
rulesConfigFilePath: storyRulesConfigFilePath,
|
|
323
413
|
resolveRulesConfigModule: () => loadRulesConfigModule(viteServer, storyRulesConfigFilePath),
|
|
414
|
+
invalidateModuleGraph: () => {
|
|
415
|
+
viteServer?.moduleGraph.invalidateAll();
|
|
416
|
+
},
|
|
324
417
|
loadModule: (id) => ssrLoadModuleWithFsFallback(viteServer, id, {
|
|
325
418
|
fixStacktrace: true
|
|
326
419
|
})
|
|
@@ -332,6 +425,9 @@ async function vitePluginStorybookAstroMiddleware(options) {
|
|
|
332
425
|
server.watcher.on("add", resetHandler);
|
|
333
426
|
server.watcher.on("change", resetHandler);
|
|
334
427
|
server.watcher.on("unlink", resetHandler);
|
|
428
|
+
viteServer.watcher.on("add", resetHandler);
|
|
429
|
+
viteServer.watcher.on("change", resetHandler);
|
|
430
|
+
viteServer.watcher.on("unlink", resetHandler);
|
|
335
431
|
server.ws.on("astro:render:request", async (data) => {
|
|
336
432
|
try {
|
|
337
433
|
const handler = await handlerPromise;
|
|
@@ -420,6 +516,7 @@ async function createViteServer(integrations, resolveFrom = process.cwd()) {
|
|
|
420
516
|
vitePluginAstroIntegrationOptsFallback(),
|
|
421
517
|
vitePluginAstroVueFallback(),
|
|
422
518
|
vitePluginAstroRoutesFallback(),
|
|
519
|
+
vitePluginStoryModuleMocks(),
|
|
423
520
|
...config.plugins?.filter(Boolean) ?? [],
|
|
424
521
|
viteAstroContainerRenderersPlugin(safeIntegrations)
|
|
425
522
|
]
|
|
@@ -463,15 +560,16 @@ async function loadRulesConfigModule(viteServer, configFilePath) {
|
|
|
463
560
|
}
|
|
464
561
|
|
|
465
562
|
export {
|
|
466
|
-
|
|
563
|
+
createVirtualModule,
|
|
467
564
|
viteAstroContainerRenderersPlugin,
|
|
468
565
|
vitePluginAstroFontsFallback,
|
|
469
566
|
vitePluginAstroIntegrationOptsFallback,
|
|
470
567
|
vitePluginAstroVueFallback,
|
|
471
568
|
vitePluginAstroRoutesFallback,
|
|
569
|
+
vitePluginStoryModuleMocks,
|
|
472
570
|
ssrLoadModuleWithFsFallback,
|
|
473
571
|
resolveRulesConfigFilePath,
|
|
474
572
|
vitePluginStorybookAstroMiddleware,
|
|
475
573
|
createViteServer
|
|
476
574
|
};
|
|
477
|
-
//# sourceMappingURL=chunk-
|
|
575
|
+
//# sourceMappingURL=chunk-AYYMNFI6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/viteStorybookAstroMiddlewarePlugin.ts","../src/vite/virtualModulePlugin.ts","../src/viteAstroContainerRenderersPlugin.ts","../src/vitePluginAstroFontsFallback.ts","../src/vitePluginAstroIntegrationOptsFallback.ts","../src/vitePluginAstroVueFallback.ts","../src/vitePluginAstroRoutesFallback.ts","../src/vitePluginStoryModuleMocks.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 { vitePluginStoryModuleMocks } from './vitePluginStoryModuleMocks.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 invalidateModuleGraph: () => {\n viteServer?.moduleGraph.invalidateAll();\n },\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 viteServer.watcher.on('add', resetHandler);\n viteServer.watcher.on('change', resetHandler);\n viteServer.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, '<').replace(/>/g, '>') +\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 vitePluginStoryModuleMocks(),\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 CreateVirtualModuleOptions = {\n pluginName: string;\n virtualModuleId: string;\n load: (id: string) => string | Promise<string> | undefined;\n};\n\nexport function createVirtualModule(options: CreateVirtualModuleOptions): 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 { createVirtualModule } from './vite/virtualModulePlugin.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 createVirtualModule({\n pluginName: 'storybook-astro:container-renderers',\n virtualModuleId: 'virtual:astro-container-renderers',\n load() {\n const importStatements = buildImportStatements(safeIntegrations);\n const browserModuleResolverHelpers =\n mode === 'development' ? buildBrowserModuleResolverHelpers() : '';\n const clientModuleEntrypoints =\n mode === 'development' ? buildClientModuleEntrypoints(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 ${browserModuleResolverHelpers}\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 const clientModuleEntrypoints = ${clientModuleEntrypoints};\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 entrypoint of clientModuleEntrypoints) {\n if (normalizedSpecifier === entrypoint || normalizedSpecifier.startsWith(entrypoint)) {\n return storybookAstroResolveBrowserModulePath(normalizedSpecifier);\n }\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 buildClientModuleEntrypoints(integrations: Integration[]) {\n return JSON.stringify(\n Array.from(\n new Set(\n integrations\n .map((integration) => integration.renderer.client?.entrypoint)\n .filter((entrypoint): entrypoint is string => Boolean(entrypoint))\n )\n )\n );\n}\n\nfunction buildBrowserModuleResolverHelpers() {\n return `\n import path from 'node:path';\n import { createRequire } from 'node:module';\n import { pathToFileURL } from 'node:url';\n\n function storybookAstroToFileHref(filePath) {\n return pathToFileURL(filePath).href;\n }\n\n function storybookAstroResolveFrom(moduleName, fromDirectory) {\n const fromFile = path.join(fromDirectory, '__storybook_astro_resolve__.js');\n\n return createRequire(storybookAstroToFileHref(fromFile)).resolve(moduleName);\n }\n\n function storybookAstroResolveFromCandidates(moduleName, primaryDirectory) {\n const directories = [primaryDirectory, process.env.INIT_CWD].filter(Boolean);\n const visited = new Set();\n let lastError;\n\n for (const directory of directories) {\n if (visited.has(directory)) {\n continue;\n }\n\n visited.add(directory);\n\n try {\n return storybookAstroResolveFrom(moduleName, directory);\n } catch (error) {\n lastError = error;\n }\n }\n\n throw lastError;\n }\n\n function storybookAstroResolveBrowserModulePath(moduleName, resolveFrom = process.cwd()) {\n const resolvedPath = storybookAstroResolveFromCandidates(moduleName, resolveFrom).replace(/\\\\\\\\/g, '/');\n\n return '/@fs/' + resolvedPath;\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 { PluginOption } from 'vite';\nimport {\n loadStoryInlineModule,\n resolveStoryModuleMock,\n STORYBOOK_ASTRO_INLINE_MODULE_PREFIX\n} from './module-mocks.ts';\n\nexport function vitePluginStoryModuleMocks(): PluginOption {\n return {\n name: 'storybook-astro:story-module-mocks',\n enforce: 'pre',\n resolveId(id) {\n if (id.startsWith(STORYBOOK_ASTRO_INLINE_MODULE_PREFIX)) {\n return `\\0${id}`;\n }\n\n const mockedModule = resolveStoryModuleMock(id);\n\n if (mockedModule) {\n return mockedModule;\n }\n\n return null;\n },\n load(id) {\n return loadStoryInlineModule(id);\n }\n } satisfies PluginOption;\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":";;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAE9B,SAAS,cAAc,oBAAyE;;;ACKzF,SAAS,oBAAoB,SAA6C;AAC/E,QAAM,0BAA0B,KAAK,QAAQ,eAAe;AAE5D,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,UAAU,IAAI;AACZ,UAAI,OAAO,QAAQ,iBAAiB;AAClC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,MAAM,KAAK,IAAI;AACb,UAAI,OAAO,yBAAyB;AAClC,eAAO,QAAQ,KAAK,EAAE;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;;;AChBO,SAAS,kCACd,cACA,UAAyB,CAAC,GAC1B;AACA,QAAM,mBAAmB,gBAAgB,CAAC;AAC1C,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,kBAAkB,QAAQ,mBAAmB,CAAC;AAEpD,SAAO,oBAAoB;AAAA,IACzB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AACL,YAAM,mBAAmB,sBAAsB,gBAAgB;AAC/D,YAAM,+BACJ,SAAS,gBAAgB,kCAAkC,IAAI;AACjE,YAAM,0BACJ,SAAS,gBAAgB,6BAA6B,gBAAgB,IAAI;AAC5E,YAAM,kBACJ,SAAS,gBACL,iBACG,OAAO,CAAC,gBAAgB,OAAO,YAAY,kBAAkB,UAAU,EACvE;AAAA,QAAI,CAAC,gBACJ,YAAY,cAAc,SAAS,EAAE,QAAQ,kBAAkB,UAAU;AAAA,MAC3E,EACC,KAAK,KAAK,IACb;AAEN,aAAO;AAAA,UACH,gBAAgB;AAAA,UAChB,4BAA4B;AAAA;AAAA;AAAA,YAG1B,iBAAiB,IAAI,CAAC,gBAAgB,oBAAoB,WAAW,IAAI,OAAO,oBAAoB,WAAW,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,sCAGlG,KAAK,UAAU,iBAAiB,MAAM,CAAC,CAAC;AAAA,0CACpC,uBAAuB;AAAA;AAAA;AAAA,YAGrD,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA6BvB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,6BAA6B,cAA6B;AACjE,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,MACJ,IAAI;AAAA,QACF,aACG,IAAI,CAAC,gBAAgB,YAAY,SAAS,QAAQ,UAAU,EAC5D,OAAO,CAAC,eAAqC,QAAQ,UAAU,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oCAAoC;AAC3C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CT;AAEA,SAAS,sBAAsB,cAA6B;AAC1D,SAAO,aACJ,OAAO,CAAC,gBAAgB,YAAY,SAAS,MAAM,EACnD;AAAA,IACC,CAAC,gBACC,UAAU,YAAY,IAAI,kBAAkB,YAAY,SAAS,QAAQ,UAAU;AAAA,EACvF,EACC,KAAK,IAAI;AACd;AAEA,SAAS,oBAAoB,aAA0B;AACrD,QAAM,iBAAiB,YAAY,SAAS;AAE5C,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,SAAS,SAAS;AAChC,WAAO;AAAA;AAAA,iBAEM,eAAe,IAAI;AAAA;AAAA,eAErB,YAAY,IAAI;AAAA,mBACZ,eAAe,IAAI;AAAA;AAAA;AAAA;AAAA,EAIpC;AAEA,SAAO;AAAA;AAAA,eAEM,eAAe,IAAI;AAAA,kBAChB,YAAY,IAAI;AAAA;AAAA;AAGlC;AAEA,SAAS,oBAAoB,aAA0B;AACrD,QAAM,iBAAiB,YAAY,SAAS;AAE5C,MAAI,gBAAgB;AAClB,WAAO;AAAA;AAAA,iBAEM,eAAe,IAAI;AAAA,uBACb,eAAe,UAAU;AAAA;AAAA;AAAA,EAG9C;AAEA,SAAO;AACT;;;AC1LA,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO3B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAwBrB,SAAS,+BAAuC;AACrD,QAAM,aAAa;AACnB,QAAM,qBAAqB;AAC3B,QAAM,sBAAsB,OAAO;AACnC,QAAM,8BAA8B,OAAO;AAC3C,QAAM,4BAA4B;AAElC,SAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA,IAGN,SAAS;AAAA,IAET,UAAU,IAAI;AACZ,UAAI,OAAO,YAAY;AACrB,eAAO;AAAA,MACT;AACA,UAAI,OAAO,oBAAoB;AAC7B,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,gCAAgC,OAAO,iCAAiC;AACjF,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,KAAK,IAAI;AACP,UAAI,OAAO,qBAAqB;AAC9B,eAAO,EAAE,MAAM,oBAAoB;AAAA,MACrC;AACA,UAAI,OAAO,+BAA+B,OAAO,2BAA2B;AAC1E,eAAO,EAAE,MAAM,mBAAmB;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;;;AClEA,IAAM,YAAY;AAElB,IAAM,cAAc,CAAC,oBAAoB,mBAAmB;AAErD,SAAS,yCAAiD;AAC/D,QAAM,cAAc,IAAI,IAAI,YAAY,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;AACpE,QAAM,gBAAgB,IAAI,IAAI,YAAY,OAAO,CAAC;AAElD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,UAAU,IAAI;AACZ,aAAO,YAAY,IAAI,EAAE;AAAA,IAC3B;AAAA,IAEA,KAAK,IAAI;AACP,UAAI,cAAc,IAAI,EAAE,GAAG;AACzB,eAAO,EAAE,MAAM,UAAU;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACtBA,IAAM,eAAe;AAAA;AAAA;AAKrB,IAAMA,eAAc,CAAC,yBAAyB,0BAA0B;AAejE,SAAS,6BAAqC;AACnD,QAAM,cAAc,IAAI,IAAIA,aAAY,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AACpE,QAAM,gBAAgB,IAAI,IAAI,YAAY,OAAO,CAAC;AAElD,SAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA,IAGN,SAAS;AAAA,IAET,UAAU,IAAI;AACZ,YAAM,WAAW,YAAY,IAAI,EAAE;AAEnC,UAAI,UAAU;AACZ,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,KAAK,IAAI;AACP,UAAI,cAAc,IAAI,EAAE,GAAG;AACzB,eAAO,EAAE,MAAM,aAAa;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;;;AC5CA,IAAM,cAAc;AAAA;AAAA;AAYb,SAAS,gCAAwC;AACtD,QAAM,aAAa;AACnB,QAAM,sBAAsB,OAAO;AAEnC,SAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA,IAGN,SAAS;AAAA,IAET,UAAU,IAAI;AACZ,UAAI,OAAO,YAAY;AACrB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,KAAK,IAAI;AACP,UAAI,OAAO,qBAAqB;AAC9B,eAAO,EAAE,MAAM,YAAY;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACF;;;AC7BO,SAAS,6BAA2C;AACzD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU,IAAI;AACZ,UAAI,GAAG,WAAW,oCAAoC,GAAG;AACvD,eAAO,KAAK,EAAE;AAAA,MAChB;AAEA,YAAM,eAAe,uBAAuB,EAAE;AAE9C,UAAI,cAAc;AAChB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,IAAI;AACP,aAAO,sBAAsB,EAAE;AAAA,IACjC;AAAA,EACF;AACF;;;ACtBA,eAAsB,4BACpB,YACA,IACA,SACA;AACA,QAAM,MAAM,CAAC,EAAE;AAEf,MAAI,GAAG,WAAW,GAAG,KAAK,CAAC,GAAG,WAAW,OAAO,GAAG;AACjD,QAAI,KAAK,OAAO,EAAE,EAAE;AAAA,EACtB;AAEA,MAAI;AAEJ,aAAW,aAAa,KAAK;AAC3B,QAAI;AACF,aAAO,MAAM,WAAW,cAAc,WAAW,OAAO;AAAA,IAC1D,SAAS,OAAO;AACd,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM;AACR;;;AC5BA,SAAS,YAAY,gBAAgB;AACrC,SAAS,SAAS,eAAe;AAQ1B,SAAS,2BACd,SACA,cAAc,QAAQ,IAAI,GACN;AACpB,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,0BAA0B,OAAO;AACpD,QAAM,yBAAyB,QAAQ,aAAa,UAAU;AAC9D,QAAM,2BAA2B,sBAAsB,sBAAsB;AAE7E,MAAI,CAAC,0BAA0B;AAC7B,UAAM,IAAI;AAAA,MACR,2DAA2D,sBAAsB;AAAA,IAEnF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,0BAA0B,SAAoC;AACrE,QAAM,aACJ,OAAO,YAAY,WACf,UACA,OAAO,YAAY,YAAY,YAAY,OACzC,QAAQ,aACR;AAER,MAAI,OAAO,eAAe,UAAU;AAClC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,uBAAuB,WAAW,KAAK;AAE7C,MAAI,CAAC,sBAAsB;AACzB,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,UAAsC;AACnE,MAAI,WAAW,QAAQ,GAAG;AACxB,UAAM,YAAY,SAAS,QAAQ;AAEnC,QAAI,UAAU,OAAO,GAAG;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,OAAO,QAAQ,QAAQ,OAAO,QAAQ,MAAM;AAEhE,aAAW,aAAa,YAAY;AAClC,UAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS;AAEjD,QAAI,WAAW,iBAAiB,GAAG;AACjC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,aAAW,aAAa,YAAY;AAClC,UAAM,oBAAoB,QAAQ,UAAU,QAAQ,SAAS,EAAE;AAE/D,QAAI,WAAW,iBAAiB,GAAG;AACjC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;ATrEA,eAAsB,mCAAmC,SAA2B;AAGlF,MAAI,aAAmC;AAEvC,QAAM,cAAc,QAAQ,eAAe,QAAQ,IAAI;AAEvD,QAAM,aAAa;AAAA,IACjB,MAAM;AAAA,IACN,MAAM,gBAAgB,QAAQ;AAC5B,mBAAa,MAAM,iBAAiB,QAAQ,gBAAgB,CAAC,GAAG,WAAW;AAC3E,YAAM,2BAA2B,2BAA2B,QAAQ,YAAY,WAAW;AAE3F,YAAM,WAAW,cAAc,IAAI,IAAI,gBAAgB,YAAY,GAAG,CAAC;AACvE,YAAM,aAAa,MAAM,WAAW,cAAc,UAAU;AAAA,QAC1D,eAAe;AAAA,MACjB,CAAC;AAED,YAAM,gBAAgB,MAAM,WAAW,eAAe,QAAQ,gBAAgB,CAAC,GAAG;AAAA,QAChF,cAAc,QAAQ;AAAA,QACtB,qBAAqB;AAAA,QACrB,0BAA0B,MACxB,sBAAsB,YAAa,wBAAwB;AAAA,QAC7D,uBAAuB,MAAM;AAC3B,sBAAY,YAAY,cAAc;AAAA,QACxC;AAAA,QACA,YAAY,CAAC,OACX,4BAA4B,YAAa,IAAI;AAAA,UAC3C,eAAe;AAAA,QACjB,CAAC;AAAA,MACL,CAAC;AAED,UAAI,iBAAiB,cAAc;AAEnC,YAAM,eAAe,MAAM;AACzB,yBAAiB,cAAc;AAAA,MACjC;AAEA,aAAO,QAAQ,GAAG,OAAO,YAAY;AACrC,aAAO,QAAQ,GAAG,UAAU,YAAY;AACxC,aAAO,QAAQ,GAAG,UAAU,YAAY;AACxC,iBAAW,QAAQ,GAAG,OAAO,YAAY;AACzC,iBAAW,QAAQ,GAAG,UAAU,YAAY;AAC5C,iBAAW,QAAQ,GAAG,UAAU,YAAY;AAE5C,aAAO,GAAG,GAAG,wBAAwB,OAAO,SAAuC;AACjF,YAAI;AACF,gBAAM,UAAU,MAAM;AACtB,gBAAM,OAAO,MAAM,QAAQ,IAAI;AAE/B,iBAAO,GAAG,KAAK,yBAAyB;AAAA,YACtC;AAAA,YACA,IAAI,KAAK;AAAA,UACX,CAAyC;AAAA,QAC3C,SAAS,KAAK;AACZ,gBAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACpE,gBAAM,aAAa,eAAe,QAAQ,IAAI,QAAQ;AAEtD,kBAAQ,MAAM,mCAAmC,YAAY;AAC7D,cAAI,YAAY;AAAC,oBAAQ,MAAM,UAAU;AAAA,UAAE;AAC3C,iBAAO,GAAG,KAAK,yBAAyB;AAAA,YACtC,IAAI,KAAK;AAAA,YACT,MACE,2OAGA,aAAa,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,IACvD;AAAA,UACJ,CAAyC;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,qBAAqB;AAAA,IACzB,MAAM;AAAA,IACN,gBAAgB,QAAuB;AACrC,aAAO,YAAY,IAAI,WAAW,CAAC,KAA8B,KAAqB,SAA+B;AACnH,YAAI,CAAC,YAAY;AACf,eAAK;AAEL;AAAA,QACF;AAEA,mBAAW,YAAY,OAAO,KAAK,KAAK,CAAC,QAAkB;AACzD,cAAI,KAAK;AACP,oBAAQ,MAAM,wBAAwB,GAAG;AACzC,iBAAK;AAAA,UACP;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAYA,SAAO;AAAA,IACL;AAAA,IACA,YAAY;AAAA,MACV,SAAS;AAAA,QACP;AAAA,MACF,EAAE,OAAO,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAQA,SAAS,wBAAwB;AAC/B,QAAM,SAAS,aAAa;AAC5B,QAAM,eAAe,OAAO,KAAK,KAAK,MAAM;AAE5C,SAAO,OAAO,CAAC,KAAK,YAAY;AAC9B,QACE,IAAI,SAAS,yBAAyB,KACtC,IAAI,SAAS,gCAAgC,KAC7C,IAAI,SAAS,+BAA+B,GAC5C;AACA;AAAA,IACF;AAEA,iBAAa,KAAK,OAAO;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,eAAsB,iBAAiB,cAA6B,cAAc,QAAQ,IAAI,GAAG;AAC/F,QAAM,EAAE,eAAe,wBAAwB,IAAI,MAAM,kBAAkB,WAAW;AACtF,QAAM,mBAAmB,gBAAgB,CAAC;AAC1C,QAAM,+BAA+B,mCAAmC,WAAW;AAEnF,QAAM,SAAS,MAAM;AAAA,IACnB,EAAE,MAAM,YAAY;AAAA,IACpB;AAAA,MACE,YAAY;AAAA,MACZ,cAAc,MAAM,QAAQ;AAAA,QAC1B,iBAAiB,IAAI,CAAC,gBAAgB,YAAY,gBAAgB,WAAW,CAAC;AAAA,MAChF;AAAA;AAAA;AAAA;AAAA,MAIA,OAAO,EAAE,SAAS,wBAAwB,EAAE;AAAA,IAC9C;AAAA,EACF,EAAE,EAAE,MAAM,eAAe,SAAS,QAAQ,CAAC;AAE3C,QAAM,aAAa,MAAM,aAAa;AAAA,IACpC,YAAY;AAAA,IACZ,GAAG;AAAA,IACH,cAAc,sBAAsB;AAAA,IACpC,SAAS;AAAA,MACP;AAAA;AAAA,MAEA,6BAA6B;AAAA,MAC7B,uCAAuC;AAAA,MACvC,2BAA2B;AAAA,MAC3B,8BAA8B;AAAA,MAC9B,2BAA2B;AAAA,MAC3B,GAAI,OAAO,SAAS,OAAO,OAAO,KAAK,CAAC;AAAA,MACxC,kCAAkC,gBAAgB;AAAA,IACpD;AAAA,EACF,CAAC;AAKD,QAAM,WAAW,gBAAgB,WAAW,CAAC,CAAC;AAE9C,SAAO;AACT;AAEA,SAAS,mCAAmC,aAAmC;AAC7E,QAAMC,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;AAEA,eAAe,sBAAsB,YAA2B,gBAAyB;AACvF,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;","names":["VIRTUAL_IDS","require"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// src/module-mocks.ts
|
|
2
|
+
var STORYBOOK_ASTRO_GET_MOCK_EXPORT = "__STORYBOOK_ASTRO_GET_STORY_MODULE_MOCK_EXPORT__";
|
|
3
|
+
var STORYBOOK_ASTRO_INLINE_MODULE_PREFIX = "virtual:storybook-astro-inline-module:";
|
|
4
|
+
var moduleMocksGlobal = globalThis;
|
|
5
|
+
var moduleMockState = moduleMocksGlobal.__STORYBOOK_ASTRO_STORY_MODULE_MOCK_STATE__ ?? (moduleMocksGlobal.__STORYBOOK_ASTRO_STORY_MODULE_MOCK_STATE__ = {
|
|
6
|
+
activeModuleMocksStack: [],
|
|
7
|
+
inlineModuleExports: /* @__PURE__ */ new Map(),
|
|
8
|
+
inlineModuleSequence: 0
|
|
9
|
+
});
|
|
10
|
+
if (typeof moduleMocksGlobal[STORYBOOK_ASTRO_GET_MOCK_EXPORT] !== "function") {
|
|
11
|
+
moduleMocksGlobal[STORYBOOK_ASTRO_GET_MOCK_EXPORT] = getStoryModuleMockExport;
|
|
12
|
+
}
|
|
13
|
+
async function withStoryModuleMocks(moduleMocks, callback) {
|
|
14
|
+
moduleMockState.activeModuleMocksStack.push(moduleMocks);
|
|
15
|
+
try {
|
|
16
|
+
return await callback();
|
|
17
|
+
} finally {
|
|
18
|
+
moduleMockState.activeModuleMocksStack.pop();
|
|
19
|
+
cleanupInlineModuleMocks(moduleMocks);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function resolveStoryModuleMock(specifier) {
|
|
23
|
+
return getActiveModuleMocks()?.get(specifier)?.replacement;
|
|
24
|
+
}
|
|
25
|
+
function createPathStoryModuleMock(replacement) {
|
|
26
|
+
return {
|
|
27
|
+
replacement
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function createInlineStoryModuleMock(exportsObject) {
|
|
31
|
+
const inlineModuleId = `storybook-astro-inline-module:${moduleMockState.inlineModuleSequence}`;
|
|
32
|
+
moduleMockState.inlineModuleSequence += 1;
|
|
33
|
+
moduleMockState.inlineModuleExports.set(inlineModuleId, exportsObject);
|
|
34
|
+
return {
|
|
35
|
+
replacement: `${STORYBOOK_ASTRO_INLINE_MODULE_PREFIX}${inlineModuleId}`,
|
|
36
|
+
inlineModuleId
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function loadStoryInlineModule(resolvedId) {
|
|
40
|
+
const inlineModuleId = normalizeInlineModuleId(resolvedId);
|
|
41
|
+
if (!inlineModuleId) {
|
|
42
|
+
return void 0;
|
|
43
|
+
}
|
|
44
|
+
const exportsObject = moduleMockState.inlineModuleExports.get(inlineModuleId);
|
|
45
|
+
if (!exportsObject) {
|
|
46
|
+
return void 0;
|
|
47
|
+
}
|
|
48
|
+
return createInlineModuleSource(inlineModuleId, exportsObject);
|
|
49
|
+
}
|
|
50
|
+
function cleanupInlineModuleMocks(moduleMocks) {
|
|
51
|
+
for (const mockEntry of moduleMocks.values()) {
|
|
52
|
+
if (mockEntry.inlineModuleId) {
|
|
53
|
+
moduleMockState.inlineModuleExports.delete(mockEntry.inlineModuleId);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function getActiveModuleMocks() {
|
|
58
|
+
return moduleMockState.activeModuleMocksStack[moduleMockState.activeModuleMocksStack.length - 1];
|
|
59
|
+
}
|
|
60
|
+
function getStoryModuleMockExport(moduleId, exportName) {
|
|
61
|
+
const exportsObject = moduleMockState.inlineModuleExports.get(moduleId);
|
|
62
|
+
if (!exportsObject) {
|
|
63
|
+
throw new Error(`Inline story module mock is unavailable: ${moduleId}`);
|
|
64
|
+
}
|
|
65
|
+
return exportsObject[exportName];
|
|
66
|
+
}
|
|
67
|
+
function createInlineModuleSource(inlineModuleId, exportsObject) {
|
|
68
|
+
const exportNames = Object.keys(exportsObject);
|
|
69
|
+
const sourceLines = [
|
|
70
|
+
`const getStoryModuleMockExport = globalThis.${STORYBOOK_ASTRO_GET_MOCK_EXPORT};`,
|
|
71
|
+
"if (typeof getStoryModuleMockExport !== 'function') {",
|
|
72
|
+
" throw new Error('Inline story module mock helper is unavailable.');",
|
|
73
|
+
"}",
|
|
74
|
+
""
|
|
75
|
+
];
|
|
76
|
+
if (Object.prototype.hasOwnProperty.call(exportsObject, "default")) {
|
|
77
|
+
sourceLines.push(
|
|
78
|
+
`export default getStoryModuleMockExport(${JSON.stringify(inlineModuleId)}, 'default');`
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
for (const exportName of exportNames) {
|
|
82
|
+
if (exportName === "default") {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
assertValidExportName(exportName);
|
|
86
|
+
sourceLines.push(
|
|
87
|
+
`export const ${exportName} = getStoryModuleMockExport(${JSON.stringify(inlineModuleId)}, ${JSON.stringify(exportName)});`
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
if (sourceLines[sourceLines.length - 1] === "") {
|
|
91
|
+
sourceLines.push("export {};");
|
|
92
|
+
}
|
|
93
|
+
return sourceLines.join("\n");
|
|
94
|
+
}
|
|
95
|
+
function assertValidExportName(exportName) {
|
|
96
|
+
if (!/^[$A-Z_a-z][$\w]*$/u.test(exportName)) {
|
|
97
|
+
throw new Error(`Story module mock export name is invalid: ${exportName}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function normalizeInlineModuleId(resolvedId) {
|
|
101
|
+
const normalizedId = resolvedId.startsWith("\0") ? resolvedId.slice(1) : resolvedId;
|
|
102
|
+
if (!normalizedId.startsWith(STORYBOOK_ASTRO_INLINE_MODULE_PREFIX)) {
|
|
103
|
+
return void 0;
|
|
104
|
+
}
|
|
105
|
+
return normalizedId.slice(STORYBOOK_ASTRO_INLINE_MODULE_PREFIX.length);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export {
|
|
109
|
+
STORYBOOK_ASTRO_INLINE_MODULE_PREFIX,
|
|
110
|
+
withStoryModuleMocks,
|
|
111
|
+
resolveStoryModuleMock,
|
|
112
|
+
createPathStoryModuleMock,
|
|
113
|
+
createInlineStoryModuleMock,
|
|
114
|
+
loadStoryInlineModule
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=chunk-B5HHF6FC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/module-mocks.ts"],"sourcesContent":["const STORYBOOK_ASTRO_GET_MOCK_EXPORT = '__STORYBOOK_ASTRO_GET_STORY_MODULE_MOCK_EXPORT__';\n\nexport const STORYBOOK_ASTRO_INLINE_MODULE_PREFIX = 'virtual:storybook-astro-inline-module:';\n\nexport type StoryModuleMockEntry = {\n replacement: string;\n inlineModuleId?: string;\n};\n\nexport type StoryModuleMockFactoryResult = Record<string, unknown>;\n\nexport type StoryModuleMocks = Map<string, StoryModuleMockEntry>;\n\ntype StoryModuleMocksGlobal = typeof globalThis & {\n __STORYBOOK_ASTRO_STORY_MODULE_MOCK_STATE__?: {\n activeModuleMocksStack: StoryModuleMocks[];\n inlineModuleExports: Map<string, StoryModuleMockFactoryResult>;\n inlineModuleSequence: number;\n };\n __STORYBOOK_ASTRO_GET_STORY_MODULE_MOCK_EXPORT__?: (moduleId: string, exportName: string) => unknown;\n};\n\nconst moduleMocksGlobal = globalThis as StoryModuleMocksGlobal;\n\nconst moduleMockState =\n moduleMocksGlobal.__STORYBOOK_ASTRO_STORY_MODULE_MOCK_STATE__ ??\n (moduleMocksGlobal.__STORYBOOK_ASTRO_STORY_MODULE_MOCK_STATE__ = {\n activeModuleMocksStack: [],\n inlineModuleExports: new Map<string, StoryModuleMockFactoryResult>(),\n inlineModuleSequence: 0\n });\n\nif (typeof moduleMocksGlobal[STORYBOOK_ASTRO_GET_MOCK_EXPORT] !== 'function') {\n moduleMocksGlobal[STORYBOOK_ASTRO_GET_MOCK_EXPORT] = getStoryModuleMockExport;\n}\n\nexport async function withStoryModuleMocks<T>(\n moduleMocks: StoryModuleMocks,\n callback: () => Promise<T>\n): Promise<T> {\n moduleMockState.activeModuleMocksStack.push(moduleMocks);\n\n try {\n return await callback();\n } finally {\n moduleMockState.activeModuleMocksStack.pop();\n cleanupInlineModuleMocks(moduleMocks);\n }\n}\n\nexport function resolveStoryModuleMock(specifier: string): string | undefined {\n return getActiveModuleMocks()?.get(specifier)?.replacement;\n}\n\nexport function createPathStoryModuleMock(replacement: string): StoryModuleMockEntry {\n return {\n replacement\n };\n}\n\nexport function createInlineStoryModuleMock(\n exportsObject: StoryModuleMockFactoryResult\n): StoryModuleMockEntry {\n const inlineModuleId = `storybook-astro-inline-module:${moduleMockState.inlineModuleSequence}`;\n\n moduleMockState.inlineModuleSequence += 1;\n moduleMockState.inlineModuleExports.set(inlineModuleId, exportsObject);\n\n return {\n replacement: `${STORYBOOK_ASTRO_INLINE_MODULE_PREFIX}${inlineModuleId}`,\n inlineModuleId\n };\n}\n\nexport function loadStoryInlineModule(resolvedId: string): string | undefined {\n const inlineModuleId = normalizeInlineModuleId(resolvedId);\n\n if (!inlineModuleId) {\n return undefined;\n }\n\n const exportsObject = moduleMockState.inlineModuleExports.get(inlineModuleId);\n\n if (!exportsObject) {\n return undefined;\n }\n\n return createInlineModuleSource(inlineModuleId, exportsObject);\n}\n\nfunction cleanupInlineModuleMocks(moduleMocks: StoryModuleMocks) {\n for (const mockEntry of moduleMocks.values()) {\n if (mockEntry.inlineModuleId) {\n moduleMockState.inlineModuleExports.delete(mockEntry.inlineModuleId);\n }\n }\n}\n\nfunction getActiveModuleMocks(): StoryModuleMocks | undefined {\n return moduleMockState.activeModuleMocksStack[moduleMockState.activeModuleMocksStack.length - 1];\n}\n\nfunction getStoryModuleMockExport(moduleId: string, exportName: string): unknown {\n const exportsObject = moduleMockState.inlineModuleExports.get(moduleId);\n\n if (!exportsObject) {\n throw new Error(`Inline story module mock is unavailable: ${moduleId}`);\n }\n\n return exportsObject[exportName];\n}\n\nfunction createInlineModuleSource(\n inlineModuleId: string,\n exportsObject: StoryModuleMockFactoryResult\n): string {\n const exportNames = Object.keys(exportsObject);\n const sourceLines = [\n `const getStoryModuleMockExport = globalThis.${STORYBOOK_ASTRO_GET_MOCK_EXPORT};`,\n \"if (typeof getStoryModuleMockExport !== 'function') {\",\n \" throw new Error('Inline story module mock helper is unavailable.');\",\n '}',\n ''\n ];\n\n if (Object.prototype.hasOwnProperty.call(exportsObject, 'default')) {\n sourceLines.push(\n `export default getStoryModuleMockExport(${JSON.stringify(inlineModuleId)}, 'default');`\n );\n }\n\n for (const exportName of exportNames) {\n if (exportName === 'default') {\n continue;\n }\n\n assertValidExportName(exportName);\n sourceLines.push(\n `export const ${exportName} = getStoryModuleMockExport(${JSON.stringify(inlineModuleId)}, ${JSON.stringify(exportName)});`\n );\n }\n\n if (sourceLines[sourceLines.length - 1] === '') {\n sourceLines.push('export {};');\n }\n\n return sourceLines.join('\\n');\n}\n\nfunction assertValidExportName(exportName: string) {\n if (!/^[$A-Z_a-z][$\\w]*$/u.test(exportName)) {\n throw new Error(`Story module mock export name is invalid: ${exportName}`);\n }\n}\n\nfunction normalizeInlineModuleId(resolvedId: string): string | undefined {\n const normalizedId = resolvedId.startsWith('\\0') ? resolvedId.slice(1) : resolvedId;\n\n if (!normalizedId.startsWith(STORYBOOK_ASTRO_INLINE_MODULE_PREFIX)) {\n return undefined;\n }\n\n return normalizedId.slice(STORYBOOK_ASTRO_INLINE_MODULE_PREFIX.length);\n}\n"],"mappings":"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","names":[]}
|