@storybook-astro/framework 0.1.0-beta.8 → 1.0.0

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 (92) hide show
  1. package/README.md +38 -0
  2. package/dist/base-IRZo3zgK.d.ts +23 -0
  3. package/dist/chunk-4SWPVM6R.js +96 -0
  4. package/dist/chunk-4SWPVM6R.js.map +1 -0
  5. package/dist/chunk-5EF25G5S.js +69 -0
  6. package/dist/chunk-5EF25G5S.js.map +1 -0
  7. package/dist/chunk-7GHEQUPV.js +439 -0
  8. package/dist/chunk-7GHEQUPV.js.map +1 -0
  9. package/dist/chunk-C5OH4VBR.js +492 -0
  10. package/dist/chunk-C5OH4VBR.js.map +1 -0
  11. package/dist/chunk-DNGQBPT7.js +15 -0
  12. package/dist/chunk-DNGQBPT7.js.map +1 -0
  13. package/dist/chunk-E4LB75JN.js +89 -0
  14. package/dist/chunk-E4LB75JN.js.map +1 -0
  15. package/dist/chunk-PJEDXZVN.js +240 -0
  16. package/dist/chunk-PJEDXZVN.js.map +1 -0
  17. package/dist/chunk-UK43WNEA.js +657 -0
  18. package/dist/chunk-UK43WNEA.js.map +1 -0
  19. package/dist/dist-HJOEPVRQ.js +15574 -0
  20. package/dist/dist-HJOEPVRQ.js.map +1 -0
  21. package/dist/index.d.ts +42 -0
  22. package/dist/index.js +13 -64
  23. package/dist/index.js.map +1 -1
  24. package/dist/integrations/index.d.ts +138 -0
  25. package/dist/integrations/index.js +8 -196
  26. package/dist/integrations/index.js.map +1 -1
  27. package/dist/middleware.d.ts +26 -0
  28. package/dist/middleware.js +179 -0
  29. package/dist/middleware.js.map +1 -0
  30. package/dist/portable-stories-BvdaQigq.d.ts +83 -0
  31. package/dist/preset.d.ts +14 -0
  32. package/dist/preset.js +5 -1
  33. package/dist/testing.d.ts +27 -0
  34. package/dist/testing.js +324 -15539
  35. package/dist/testing.js.map +1 -1
  36. package/dist/types-CHTsRtA7.d.ts +42 -0
  37. package/dist/viteStorybookAstroMiddlewarePlugin-NP2E52IC.js +11 -0
  38. package/dist/viteStorybookAstroMiddlewarePlugin-NP2E52IC.js.map +1 -0
  39. package/dist/vitest/index.d.ts +19 -0
  40. package/dist/vitest/index.js +229 -0
  41. package/dist/vitest/index.js.map +1 -0
  42. package/package.json +31 -17
  43. package/src/importAstroConfig.ts +11 -0
  44. package/src/index.ts +20 -6
  45. package/src/integrations/alpine.ts +5 -2
  46. package/src/integrations/base.ts +2 -2
  47. package/src/integrations/moduleResolver.ts +43 -0
  48. package/src/integrations/preact.ts +5 -2
  49. package/src/integrations/react.ts +5 -2
  50. package/src/integrations/solid.ts +5 -2
  51. package/src/integrations/svelte.ts +5 -2
  52. package/src/integrations/vue.ts +5 -2
  53. package/src/lib/sanitization.test.ts +232 -0
  54. package/src/lib/sanitization.ts +338 -0
  55. package/src/lib/ssr-load-module-with-fs-fallback.ts +29 -0
  56. package/src/middleware.test.ts +48 -0
  57. package/src/middleware.ts +204 -96
  58. package/src/module-mocks.ts +16 -0
  59. package/src/msw-helpers.ts +1 -0
  60. package/src/msw.ts +58 -0
  61. package/src/preset.ts +38 -3
  62. package/src/rules-options.test.ts +71 -0
  63. package/src/rules-options.ts +87 -0
  64. package/src/rules.test.ts +183 -0
  65. package/src/rules.ts +314 -0
  66. package/src/testing/astro-runtime.ts +219 -0
  67. package/src/testing/component-utils.ts +32 -0
  68. package/src/testing/index.ts +2 -0
  69. package/src/testing/integration-config.ts +121 -0
  70. package/src/testing/project-root.ts +185 -0
  71. package/src/testing/renderer-daemon.ts +269 -0
  72. package/src/testing/story-composition.ts +33 -0
  73. package/src/testing/types.ts +14 -0
  74. package/src/testing/working-directory.ts +28 -0
  75. package/src/testing.ts +1 -254
  76. package/src/types.ts +16 -4
  77. package/src/virtual.d.ts +2 -1
  78. package/src/vite/createVirtualModulePlugin.test.ts +80 -0
  79. package/src/vite/createVirtualModulePlugin.ts +25 -0
  80. package/src/viteAstroContainerRenderersPlugin.ts +60 -26
  81. package/src/vitePluginAstro.ts +12 -5
  82. package/src/vitePluginAstroBuildPrerender.ts +665 -204
  83. package/src/vitePluginAstroRoutesFallback.ts +37 -0
  84. package/src/vitePluginAstroVueFallback.ts +47 -0
  85. package/src/viteStorybookAstroMiddlewarePlugin.ts +88 -12
  86. package/src/viteStorybookRendererFallbackPlugin.ts +13 -23
  87. package/src/vitest/config.ts +95 -0
  88. package/src/vitest/global-setup.ts +16 -0
  89. package/src/vitest/index.ts +2 -0
  90. package/src/vitest/vite-plugins.ts +187 -0
  91. package/dist/chunk-SAOPE6SA.js +0 -557
  92. package/dist/chunk-SAOPE6SA.js.map +0 -1
@@ -0,0 +1,439 @@
1
+ import {
2
+ importAstroConfig
3
+ } from "./chunk-DNGQBPT7.js";
4
+
5
+ // src/viteStorybookAstroMiddlewarePlugin.ts
6
+ import { createRequire } from "module";
7
+ import { fileURLToPath } from "url";
8
+ import { createServer } from "vite";
9
+
10
+ // src/vite/createVirtualModulePlugin.ts
11
+ function createVirtualModulePlugin(options) {
12
+ const resolvedVirtualModuleId = `\0${options.virtualModuleId}`;
13
+ return {
14
+ name: options.pluginName,
15
+ resolveId(id) {
16
+ if (id === options.virtualModuleId) {
17
+ return resolvedVirtualModuleId;
18
+ }
19
+ },
20
+ async load(id) {
21
+ if (id === resolvedVirtualModuleId) {
22
+ return options.load(id);
23
+ }
24
+ }
25
+ };
26
+ }
27
+
28
+ // src/viteAstroContainerRenderersPlugin.ts
29
+ function viteAstroContainerRenderersPlugin(integrations, options = {}) {
30
+ const safeIntegrations = integrations ?? [];
31
+ const mode = options.mode ?? "development";
32
+ const staticModuleMap = options.staticModuleMap ?? {};
33
+ return createVirtualModulePlugin({
34
+ pluginName: "storybook-astro:container-renderers",
35
+ virtualModuleId: "virtual:astro-container-renderers",
36
+ load() {
37
+ const importStatements = buildImportStatements(safeIntegrations);
38
+ const clientResolvers = mode === "development" ? safeIntegrations.filter((integration) => typeof integration.resolveClient === "function").map(
39
+ (integration) => integration.resolveClient.toString().replace(/^resolveClient/, "function")
40
+ ).join(",\n") : "";
41
+ return `
42
+ ${importStatements}
43
+
44
+ export function addRenderers(container) {
45
+ ${safeIntegrations.map((integration) => buildServerRenderer(integration) + "\n" + buildClientRenderer(integration)).join("\n")}
46
+ }
47
+
48
+ const staticClientModules = ${JSON.stringify(staticModuleMap, null, 2)};
49
+
50
+ const clientModulesResolvers = [
51
+ ${clientResolvers}
52
+ ];
53
+
54
+ export function resolveClientModules(specifier) {
55
+ if (Object.hasOwn(staticClientModules, specifier)) {
56
+ return staticClientModules[specifier];
57
+ }
58
+
59
+ const normalizedSpecifier = specifier.replace(/\\\\/g, '/').replace(/\\?.*$/, '');
60
+
61
+ if (Object.hasOwn(staticClientModules, normalizedSpecifier)) {
62
+ return staticClientModules[normalizedSpecifier];
63
+ }
64
+
65
+ for (const resolver of clientModulesResolvers) {
66
+ const resolution = resolver(specifier);
67
+
68
+ if (resolution) {
69
+ return resolution;
70
+ }
71
+ }
72
+ }
73
+ `;
74
+ }
75
+ });
76
+ }
77
+ function buildImportStatements(integrations) {
78
+ return integrations.filter((integration) => integration.renderer.server).map(
79
+ (integration) => `import ${integration.name}Renderer from '${integration.renderer.server?.entrypoint}';`
80
+ ).join("\n");
81
+ }
82
+ function buildServerRenderer(integration) {
83
+ const serverRenderer = integration.renderer.server;
84
+ if (!serverRenderer) {
85
+ return "";
86
+ }
87
+ if (integration.name === "solid") {
88
+ return `
89
+ container.addServerRenderer({
90
+ name: '${serverRenderer.name}',
91
+ renderer: {
92
+ ...${integration.name}Renderer,
93
+ name: '${serverRenderer.name}'
94
+ }
95
+ });
96
+ `;
97
+ }
98
+ return `
99
+ container.addServerRenderer({
100
+ name: '${serverRenderer.name}',
101
+ renderer: ${integration.name}Renderer
102
+ });
103
+ `;
104
+ }
105
+ function buildClientRenderer(integration) {
106
+ const clientRenderer = integration.renderer.client;
107
+ if (clientRenderer) {
108
+ return `
109
+ container.addClientRenderer({
110
+ name: '${clientRenderer.name}',
111
+ entrypoint: '${clientRenderer.entrypoint}'
112
+ });
113
+ `;
114
+ }
115
+ return "";
116
+ }
117
+
118
+ // src/vitePluginAstroFontsFallback.ts
119
+ var FONTS_RUNTIME_STUB = `
120
+ export const fontData = {};
121
+ export function createGetFontData(fontsMod) {
122
+ return fontsMod?.fontDataByCssVariable ?? {};
123
+ }
124
+ `;
125
+ var FONTS_INTERNAL_STUB = `
126
+ export const componentDataByCssVariable = new Map();
127
+ export const fontDataByCssVariable = {};
128
+ `;
129
+ function vitePluginAstroFontsFallback() {
130
+ const VIRTUAL_ID = "virtual:astro:assets/fonts/internal";
131
+ const RUNTIME_VIRTUAL_ID = "virtual:astro:assets/fonts/runtime";
132
+ const RESOLVED_VIRTUAL_ID = "\0" + VIRTUAL_ID;
133
+ const RESOLVED_RUNTIME_VIRTUAL_ID = "\0" + RUNTIME_VIRTUAL_ID;
134
+ const RESOLVED_FONTS_RUNTIME_ID = "\0storybook:astro-fonts-runtime";
135
+ return {
136
+ name: "storybook-astro-fonts-fallback",
137
+ // Must run before vite:resolve to intercept virtual modules
138
+ // before Vite tries to resolve them as Node package imports
139
+ enforce: "pre",
140
+ resolveId(id) {
141
+ if (id === VIRTUAL_ID) {
142
+ return RESOLVED_VIRTUAL_ID;
143
+ }
144
+ if (id === RUNTIME_VIRTUAL_ID) {
145
+ return RESOLVED_RUNTIME_VIRTUAL_ID;
146
+ }
147
+ if (id === "astro/assets/fonts/runtime" || id === "astro/assets/fonts/runtime.js") {
148
+ return RESOLVED_FONTS_RUNTIME_ID;
149
+ }
150
+ },
151
+ load(id) {
152
+ if (id === RESOLVED_VIRTUAL_ID) {
153
+ return { code: FONTS_INTERNAL_STUB };
154
+ }
155
+ if (id === RESOLVED_RUNTIME_VIRTUAL_ID || id === RESOLVED_FONTS_RUNTIME_ID) {
156
+ return { code: FONTS_RUNTIME_STUB };
157
+ }
158
+ }
159
+ };
160
+ }
161
+
162
+ // src/vitePluginAstroVueFallback.ts
163
+ var VUE_APP_STUB = `
164
+ export const setup = () => {};
165
+ `;
166
+ var VIRTUAL_IDS = ["virtual:astro:vue-app", "virtual:@astrojs/vue/app"];
167
+ function vitePluginAstroVueFallback() {
168
+ const resolvedIds = new Map(VIRTUAL_IDS.map((id) => [id, "\0" + id]));
169
+ const resolvedIdSet = new Set(resolvedIds.values());
170
+ return {
171
+ name: "storybook-astro-vue-fallback",
172
+ // Must run before vite:resolve to intercept virtual modules
173
+ // before Vite tries to resolve them as Node package imports
174
+ enforce: "pre",
175
+ resolveId(id) {
176
+ const resolved = resolvedIds.get(id);
177
+ if (resolved) {
178
+ return resolved;
179
+ }
180
+ },
181
+ load(id) {
182
+ if (resolvedIdSet.has(id)) {
183
+ return { code: VUE_APP_STUB };
184
+ }
185
+ }
186
+ };
187
+ }
188
+
189
+ // src/vitePluginAstroRoutesFallback.ts
190
+ var ROUTES_STUB = `
191
+ export const routes = [];
192
+ `;
193
+ function vitePluginAstroRoutesFallback() {
194
+ const VIRTUAL_ID = "virtual:astro:routes";
195
+ const RESOLVED_VIRTUAL_ID = "\0" + VIRTUAL_ID;
196
+ return {
197
+ name: "storybook-astro-routes-fallback",
198
+ // Must run before vite:resolve to intercept virtual modules
199
+ // before Vite tries to resolve them as Node package imports
200
+ enforce: "pre",
201
+ resolveId(id) {
202
+ if (id === VIRTUAL_ID) {
203
+ return RESOLVED_VIRTUAL_ID;
204
+ }
205
+ },
206
+ load(id) {
207
+ if (id === RESOLVED_VIRTUAL_ID) {
208
+ return { code: ROUTES_STUB };
209
+ }
210
+ }
211
+ };
212
+ }
213
+
214
+ // src/lib/ssr-load-module-with-fs-fallback.ts
215
+ async function ssrLoadModuleWithFsFallback(viteServer, id, options) {
216
+ const ids = [id];
217
+ if (id.startsWith("/") && !id.startsWith("/@fs/")) {
218
+ ids.push(`/@fs${id}`);
219
+ }
220
+ let lastError;
221
+ for (const candidate of ids) {
222
+ try {
223
+ return await viteServer.ssrLoadModule(candidate, options);
224
+ } catch (error) {
225
+ lastError = error;
226
+ }
227
+ }
228
+ throw lastError;
229
+ }
230
+
231
+ // src/rules-options.ts
232
+ import { existsSync, statSync } from "fs";
233
+ import { extname, resolve } from "path";
234
+ function resolveRulesConfigFilePath(options, resolveFrom = process.cwd()) {
235
+ if (options === void 0) {
236
+ return void 0;
237
+ }
238
+ const configFile = normalizeConfigFileOption(options);
239
+ const resolvedConfigFilePath = resolve(resolveFrom, configFile);
240
+ const normalizedConfigFilePath = resolveConfigFilePath(resolvedConfigFilePath);
241
+ if (!normalizedConfigFilePath) {
242
+ throw new Error(
243
+ `framework.options.storyRules config file was not found: ${resolvedConfigFilePath}. Provide an existing path in framework.options.storyRules.`
244
+ );
245
+ }
246
+ return normalizedConfigFilePath;
247
+ }
248
+ function normalizeConfigFileOption(options) {
249
+ const configFile = typeof options === "string" ? options : typeof options === "object" && options !== null ? options.configFile : void 0;
250
+ if (typeof configFile !== "string") {
251
+ throw new Error(
252
+ "framework.options.storyRules must be either a string path or an object with a string configFile."
253
+ );
254
+ }
255
+ const normalizedConfigFile = configFile.trim();
256
+ if (!normalizedConfigFile) {
257
+ throw new Error("framework.options.storyRules config file path cannot be empty.");
258
+ }
259
+ return normalizedConfigFile;
260
+ }
261
+ function resolveConfigFilePath(filePath) {
262
+ if (existsSync(filePath)) {
263
+ const fileStats = statSync(filePath);
264
+ if (fileStats.isFile()) {
265
+ return filePath;
266
+ }
267
+ }
268
+ if (extname(filePath)) {
269
+ return void 0;
270
+ }
271
+ const extensions = [".ts", ".mts", ".cts", ".js", ".mjs", ".cjs"];
272
+ for (const extension of extensions) {
273
+ const candidateFilePath = `${filePath}${extension}`;
274
+ if (existsSync(candidateFilePath)) {
275
+ return candidateFilePath;
276
+ }
277
+ }
278
+ for (const extension of extensions) {
279
+ const candidateFilePath = resolve(filePath, `index${extension}`);
280
+ if (existsSync(candidateFilePath)) {
281
+ return candidateFilePath;
282
+ }
283
+ }
284
+ return void 0;
285
+ }
286
+
287
+ // src/viteStorybookAstroMiddlewarePlugin.ts
288
+ async function vitePluginStorybookAstroMiddleware(options) {
289
+ let viteServer = null;
290
+ const resolveFrom = options.resolveFrom ?? process.cwd();
291
+ const vitePlugin = {
292
+ name: "storybook-astro-middleware-plugin",
293
+ async configureServer(server) {
294
+ viteServer = await createViteServer(options.integrations, resolveFrom);
295
+ const storyRulesConfigFilePath = resolveRulesConfigFilePath(options.storyRules, resolveFrom);
296
+ const filePath = fileURLToPath(new URL("./middleware", import.meta.url));
297
+ const middleware = await viteServer.ssrLoadModule(filePath, {
298
+ fixStacktrace: true
299
+ });
300
+ const createHandler = () => middleware.handlerFactory(options.integrations ?? [], {
301
+ mode: "development",
302
+ sanitization: options.sanitization,
303
+ rulesConfigFilePath: storyRulesConfigFilePath,
304
+ resolveRulesConfigModule: () => loadRulesConfigModule(viteServer, storyRulesConfigFilePath),
305
+ loadModule: (id) => ssrLoadModuleWithFsFallback(viteServer, id, {
306
+ fixStacktrace: true
307
+ })
308
+ });
309
+ let handlerPromise = createHandler();
310
+ const resetHandler = () => {
311
+ handlerPromise = createHandler();
312
+ };
313
+ server.watcher.on("add", resetHandler);
314
+ server.watcher.on("change", resetHandler);
315
+ server.watcher.on("unlink", resetHandler);
316
+ server.ws.on("astro:render:request", async (data) => {
317
+ try {
318
+ const handler = await handlerPromise;
319
+ const html = await handler(data);
320
+ server.ws.send("astro:render:response", {
321
+ html,
322
+ id: data.id
323
+ });
324
+ } catch (err) {
325
+ const errorMessage = err instanceof Error ? err.message : String(err);
326
+ const errorStack = err instanceof Error ? err.stack : "";
327
+ console.error("[storybook-astro] Render error:", errorMessage);
328
+ if (errorStack) {
329
+ console.error(errorStack);
330
+ }
331
+ server.ws.send("astro:render:response", {
332
+ id: data.id,
333
+ html: '<div style="background: #d73838; padding: 12px; color: #f0f0f0; font-family: monospace; border-radius: 4px"><strong>Error rendering Astro component</strong><br/><pre style="white-space: pre-wrap; margin-top: 8px; font-size: 12px">' + errorMessage.replace(/</g, "&lt;").replace(/>/g, "&gt;") + "</pre></div>"
334
+ });
335
+ }
336
+ });
337
+ }
338
+ };
339
+ const assetServingPlugin = {
340
+ name: "storybook-astro-assets",
341
+ configureServer(server) {
342
+ server.middlewares.use("/_image", (req, res, next) => {
343
+ if (!viteServer) {
344
+ next();
345
+ return;
346
+ }
347
+ viteServer.middlewares.handle(req, res, (err) => {
348
+ if (err) {
349
+ console.error("Asset serving error:", err);
350
+ next();
351
+ }
352
+ });
353
+ });
354
+ }
355
+ };
356
+ return {
357
+ vitePlugin,
358
+ viteConfig: {
359
+ plugins: [
360
+ assetServingPlugin
361
+ ].filter(Boolean)
362
+ }
363
+ };
364
+ }
365
+ async function createViteServer(integrations, resolveFrom = process.cwd()) {
366
+ const { getViteConfig } = await importAstroConfig(resolveFrom);
367
+ const safeIntegrations = integrations ?? [];
368
+ const projectAstroResolutionPlugin = createProjectAstroResolutionPlugin(resolveFrom);
369
+ const config = await getViteConfig(
370
+ { root: resolveFrom },
371
+ {
372
+ configFile: false,
373
+ integrations: await Promise.all(
374
+ safeIntegrations.map((integration) => integration.loadIntegration(resolveFrom))
375
+ )
376
+ }
377
+ )({ mode: "development", command: "serve" });
378
+ const viteServer = await createServer({
379
+ configFile: false,
380
+ ...config,
381
+ plugins: [
382
+ projectAstroResolutionPlugin,
383
+ // Fallbacks must come first to intercept before Astro's plugins
384
+ vitePluginAstroFontsFallback(),
385
+ vitePluginAstroVueFallback(),
386
+ vitePluginAstroRoutesFallback(),
387
+ ...config.plugins?.filter(Boolean) ?? [],
388
+ viteAstroContainerRenderersPlugin(safeIntegrations)
389
+ ]
390
+ });
391
+ await viteServer.pluginContainer.buildStart({});
392
+ return viteServer;
393
+ }
394
+ function createProjectAstroResolutionPlugin(resolveFrom) {
395
+ const require2 = createRequire(import.meta.url);
396
+ return {
397
+ name: "storybook-astro:resolve-project-astro",
398
+ enforce: "pre",
399
+ resolveId(id) {
400
+ if (id !== "astro" && !id.startsWith("astro/")) {
401
+ return null;
402
+ }
403
+ try {
404
+ return require2.resolve(id, {
405
+ paths: [resolveFrom]
406
+ });
407
+ } catch {
408
+ return null;
409
+ }
410
+ }
411
+ };
412
+ }
413
+ async function loadRulesConfigModule(viteServer, configFilePath) {
414
+ if (!configFilePath) {
415
+ return void 0;
416
+ }
417
+ try {
418
+ return await ssrLoadModuleWithFsFallback(viteServer, configFilePath, {
419
+ fixStacktrace: true
420
+ });
421
+ } catch (error) {
422
+ const reason = error instanceof Error ? error.message : String(error);
423
+ throw new Error(
424
+ `Unable to load framework.options.storyRules config module at ${configFilePath}: ${reason}`
425
+ );
426
+ }
427
+ }
428
+
429
+ export {
430
+ createVirtualModulePlugin,
431
+ vitePluginAstroFontsFallback,
432
+ vitePluginAstroVueFallback,
433
+ vitePluginAstroRoutesFallback,
434
+ ssrLoadModuleWithFsFallback,
435
+ resolveRulesConfigFilePath,
436
+ vitePluginStorybookAstroMiddleware,
437
+ createViteServer
438
+ };
439
+ //# sourceMappingURL=chunk-7GHEQUPV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/viteStorybookAstroMiddlewarePlugin.ts","../src/vite/createVirtualModulePlugin.ts","../src/viteAstroContainerRenderersPlugin.ts","../src/vitePluginAstroFontsFallback.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 { createServer, 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 { 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 mode: 'development',\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) {\n server.middlewares.use('/_image', (req, res, next) => {\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) => {\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\nexport async function createViteServer(integrations: Integration[], resolveFrom = process.cwd()) {\n const { getViteConfig } = 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 }\n )({ mode: 'development', command: 'serve' });\n\n const viteServer = await createServer({\n configFile: false,\n ...config,\n plugins: [\n projectAstroResolutionPlugin,\n // Fallbacks must come first to intercept before Astro's plugins\n vitePluginAstroFontsFallback(),\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 { PluginOption } 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): PluginOption {\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 PluginOption;\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 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":["require"]}