@storybook-astro/framework 1.2.0 → 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.
Files changed (85) hide show
  1. package/dist/{base-IRZo3zgK.d.ts → base-DT67T5pi.d.ts} +1 -0
  2. package/dist/{chunk-T7NWIO5S.js → chunk-2EABPTOY.js} +5 -5
  3. package/dist/{chunk-PJEDXZVN.js → chunk-7YBE4TTI.js} +2 -1
  4. package/dist/chunk-7YBE4TTI.js.map +1 -0
  5. package/dist/{chunk-POHTFYST.js → chunk-AYYMNFI6.js} +104 -6
  6. package/dist/chunk-AYYMNFI6.js.map +1 -0
  7. package/dist/chunk-B5HHF6FC.js +116 -0
  8. package/dist/chunk-B5HHF6FC.js.map +1 -0
  9. package/dist/chunk-H3XZHW6Z.js +1402 -0
  10. package/dist/chunk-H3XZHW6Z.js.map +1 -0
  11. package/dist/{chunk-DNGQBPT7.js → chunk-PUTCAN6X.js} +5 -2
  12. package/dist/{chunk-DNGQBPT7.js.map → chunk-PUTCAN6X.js.map} +1 -1
  13. package/dist/{chunk-OUEDTRBO.js → chunk-TWAO2IQW.js} +229 -67
  14. package/dist/chunk-TWAO2IQW.js.map +1 -0
  15. package/dist/{chunk-4SWPVM6R.js → chunk-WUTCMEF5.js} +2 -2
  16. package/dist/index.d.ts +17 -7
  17. package/dist/index.js +6 -5
  18. package/dist/index.js.map +1 -1
  19. package/dist/integrations/index.d.ts +2 -1
  20. package/dist/integrations/index.js +1 -1
  21. package/dist/middleware.js +18 -131
  22. package/dist/middleware.js.map +1 -1
  23. package/dist/{types-C-jan6Px.d.ts → preset-BvgHg2of.d.ts} +8 -11
  24. package/dist/preset.d.ts +2 -10
  25. package/dist/preset.js +5 -4
  26. package/dist/renderer/renderer-dev.js +62 -0
  27. package/dist/renderer/renderer-dev.js.map +1 -0
  28. package/dist/renderer/renderer-server.js +92 -0
  29. package/dist/renderer/renderer-server.js.map +1 -0
  30. package/dist/renderer/renderer-static.js +54 -0
  31. package/dist/renderer/renderer-static.js.map +1 -0
  32. package/dist/testing.js +12 -11
  33. package/dist/testing.js.map +1 -1
  34. package/dist/{viteStorybookAstroMiddlewarePlugin-2EFKTECT.js → viteStorybookAstroMiddlewarePlugin-UB6ZLJ4B.js} +4 -3
  35. package/dist/vitest/global-setup.js +6 -5
  36. package/dist/vitest/global-setup.js.map +1 -1
  37. package/dist/vitest/index.d.ts +1 -1
  38. package/dist/vitest/index.js +3 -3
  39. package/package.json +14 -43
  40. package/src/astroImageService.ts +57 -0
  41. package/src/astroRenderHandler.ts +203 -0
  42. package/src/importAstroConfig.ts +1 -1
  43. package/src/index.ts +2 -0
  44. package/src/integrations/alpine.ts +1 -0
  45. package/src/integrations/base.ts +6 -0
  46. package/src/middleware.ts +29 -200
  47. package/src/module-mocks.ts +153 -5
  48. package/src/preset.ts +38 -8
  49. package/src/productionRenderRuntime.ts +187 -0
  50. package/src/rules.test.ts +52 -4
  51. package/src/rules.ts +54 -7
  52. package/src/server/index.ts +101 -31
  53. package/src/storyRulesRuntime.ts +34 -0
  54. package/src/storySsrVite.ts +240 -0
  55. package/src/types.ts +0 -9
  56. package/src/virtual.d.ts +17 -3
  57. package/src/vite/{astroFilesVirtualModulePlugin.ts → astroFilesPlugin.ts} +4 -4
  58. package/src/vite/sanitizeConfigPlugin.ts +18 -0
  59. package/src/vite/{storybookAstroServerAuthConfigVirtualModulePlugin.test.ts → serverAuthPlugin.test.ts} +7 -10
  60. package/src/vite/{storybookAstroServerAuthConfigVirtualModulePlugin.ts → serverAuthPlugin.ts} +6 -9
  61. package/src/vite/serverRuntimePlugin.ts +109 -0
  62. package/src/vite/{storybookAstroRulesConfigVirtualModulePlugin.ts → storyRulesPlugin.ts} +6 -7
  63. package/src/vite/{createVirtualModulePlugin.test.ts → virtualModulePlugin.test.ts} +5 -5
  64. package/src/vite/{createVirtualModulePlugin.ts → virtualModulePlugin.ts} +2 -2
  65. package/src/viteAstroContainerRenderersPlugin.ts +72 -2
  66. package/src/vitePluginAstroBuildPrerender.ts +75 -646
  67. package/src/vitePluginAstroBuildServer.ts +217 -165
  68. package/src/vitePluginAstroBuildShared.test.ts +87 -0
  69. package/src/vitePluginAstroBuildShared.ts +465 -0
  70. package/src/vitePluginStoryModuleMocks.ts +29 -0
  71. package/src/viteStorybookAstroMiddlewarePlugin.ts +8 -0
  72. package/src/viteStorybookAstroRendererPlugin.ts +13 -6
  73. package/src/viteStorybookRendererFallbackPlugin.ts +2 -2
  74. package/dist/chunk-OUEDTRBO.js.map +0 -1
  75. package/dist/chunk-PBISP7PA.js +0 -1137
  76. package/dist/chunk-PBISP7PA.js.map +0 -1
  77. package/dist/chunk-PJEDXZVN.js.map +0 -1
  78. package/dist/chunk-POHTFYST.js.map +0 -1
  79. package/dist/node/index.d.ts +0 -10
  80. package/dist/node/index.js +0 -10
  81. package/dist/node/index.js.map +0 -1
  82. package/src/vite/storybookAstroSanitizationConfigVirtualModulePlugin.ts +0 -21
  83. /package/dist/{chunk-T7NWIO5S.js.map → chunk-2EABPTOY.js.map} +0 -0
  84. /package/dist/{chunk-4SWPVM6R.js.map → chunk-WUTCMEF5.js.map} +0 -0
  85. /package/dist/{viteStorybookAstroMiddlewarePlugin-2EFKTECT.js.map → viteStorybookAstroMiddlewarePlugin-UB6ZLJ4B.js.map} +0 -0
@@ -0,0 +1,92 @@
1
+ import "../chunk-G3PMV62Z.js";
2
+
3
+ // src/renderer/renderer-server.ts
4
+ var ASTRO_SERVER_UNAVAILABLE_ERROR_NAME = "AstroRenderServerUnavailableError";
5
+ function createServerRenderer(defaults = {}) {
6
+ return {
7
+ render(data, timeoutMs = 5e3) {
8
+ return renderWithHttp(data, timeoutMs, defaults);
9
+ },
10
+ init() {
11
+ return;
12
+ },
13
+ applyStyles() {
14
+ return;
15
+ }
16
+ };
17
+ }
18
+ async function renderWithHttp(data, timeoutMs, defaults) {
19
+ const id = crypto.randomUUID();
20
+ const serverUrl = resolveServerUrl(defaults);
21
+ const authToken = resolveAuthToken(defaults);
22
+ const authHeader = resolveAuthHeader(defaults);
23
+ const controller = new AbortController();
24
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
25
+ try {
26
+ const headers = {
27
+ "content-type": "application/json"
28
+ };
29
+ if (authToken) {
30
+ headers[authHeader] = authHeader.toLowerCase() === "authorization" && !authToken.startsWith("Bearer ") ? `Bearer ${authToken}` : authToken;
31
+ }
32
+ const response = await fetch(`${serverUrl}/render`, {
33
+ method: "POST",
34
+ headers,
35
+ body: JSON.stringify(data),
36
+ signal: controller.signal
37
+ });
38
+ clearTimeout(timeoutId);
39
+ if (response.status === 401 || response.status === 403) {
40
+ throw new Error(
41
+ `Astro rendering server rejected the request with ${response.status}. Check STORYBOOK_ASTRO_SERVER_TOKEN and auth header configuration.`
42
+ );
43
+ }
44
+ if (!response.ok) {
45
+ throw new Error(`Server responded with ${response.status}: ${response.statusText}`);
46
+ }
47
+ const html = await response.text();
48
+ return {
49
+ id,
50
+ html
51
+ };
52
+ } catch (error) {
53
+ clearTimeout(timeoutId);
54
+ if (error instanceof Error && error.name === "AbortError") {
55
+ throw createServerUnavailableError(
56
+ serverUrl,
57
+ `Request timed out after ${timeoutMs}ms while waiting for a render response.`
58
+ );
59
+ }
60
+ if (error instanceof TypeError) {
61
+ throw createServerUnavailableError(
62
+ serverUrl,
63
+ "The Astro rendering server is not reachable over HTTP."
64
+ );
65
+ }
66
+ throw error;
67
+ }
68
+ }
69
+ function resolveServerUrl(defaults) {
70
+ const envServerUrl = import.meta.env?.STORYBOOK_ASTRO_SERVER_URL;
71
+ const globalServerUrl = globalThis.STORYBOOK_ASTRO_SERVER_URL;
72
+ return defaults.serverUrl || envServerUrl || globalServerUrl || "http://localhost:3000";
73
+ }
74
+ function resolveAuthToken(defaults) {
75
+ const envAuthToken = import.meta.env?.STORYBOOK_ASTRO_SERVER_TOKEN;
76
+ const globalAuthToken = globalThis.STORYBOOK_ASTRO_SERVER_TOKEN;
77
+ return defaults.authToken || envAuthToken || globalAuthToken;
78
+ }
79
+ function resolveAuthHeader(defaults) {
80
+ const envAuthHeader = import.meta.env?.STORYBOOK_ASTRO_SERVER_AUTH_HEADER;
81
+ const globalAuthHeader = globalThis.STORYBOOK_ASTRO_SERVER_AUTH_HEADER;
82
+ return (defaults.authHeader || envAuthHeader || globalAuthHeader || "authorization").toLowerCase();
83
+ }
84
+ function createServerUnavailableError(serverUrl, reason) {
85
+ const error = new Error(`Unable to reach Astro rendering server at ${serverUrl}. ${reason}`);
86
+ error.name = ASTRO_SERVER_UNAVAILABLE_ERROR_NAME;
87
+ return error;
88
+ }
89
+ export {
90
+ createServerRenderer
91
+ };
92
+ //# sourceMappingURL=renderer-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/renderer/renderer-server.ts"],"sourcesContent":["import type { RenderComponentInput, RenderResponseMessage } from '@storybook-astro/renderer/types';\n\ntype StorybookImportMetaEnv = ImportMeta & {\n env?: Record<string, string | undefined>;\n};\n\ntype StorybookGlobalEnv = typeof globalThis & {\n STORYBOOK_ASTRO_SERVER_URL?: string;\n STORYBOOK_ASTRO_SERVER_TOKEN?: string;\n STORYBOOK_ASTRO_SERVER_AUTH_HEADER?: string;\n};\n\ntype ServerRendererDefaults = {\n serverUrl?: string;\n authToken?: string;\n authHeader?: string;\n};\n\nconst ASTRO_SERVER_UNAVAILABLE_ERROR_NAME = 'AstroRenderServerUnavailableError';\n\nexport function createServerRenderer(defaults: ServerRendererDefaults = {}) {\n return {\n render(data: RenderComponentInput, timeoutMs = 5000) {\n return renderWithHttp(data, timeoutMs, defaults);\n },\n init() {\n return;\n },\n applyStyles() {\n return;\n }\n };\n}\n\nasync function renderWithHttp(\n data: RenderComponentInput,\n timeoutMs: number,\n defaults: ServerRendererDefaults\n) {\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n const id = crypto.randomUUID();\n const serverUrl = resolveServerUrl(defaults);\n const authToken = resolveAuthToken(defaults);\n const authHeader = resolveAuthHeader(defaults);\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const headers: Record<string, string> = {\n 'content-type': 'application/json'\n };\n\n if (authToken) {\n headers[authHeader] =\n authHeader.toLowerCase() === 'authorization' && !authToken.startsWith('Bearer ')\n ? `Bearer ${authToken}`\n : authToken;\n }\n\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n const response = await fetch(`${serverUrl}/render`, {\n method: 'POST',\n headers,\n body: JSON.stringify(data),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 401 || response.status === 403) {\n throw new Error(\n `Astro rendering server rejected the request with ${response.status}. ` +\n `Check STORYBOOK_ASTRO_SERVER_TOKEN and auth header configuration.`\n );\n }\n\n if (!response.ok) {\n throw new Error(`Server responded with ${response.status}: ${response.statusText}`);\n }\n\n const html = await response.text();\n\n return {\n id,\n html\n } satisfies RenderResponseMessage['data'];\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw createServerUnavailableError(\n serverUrl,\n `Request timed out after ${timeoutMs}ms while waiting for a render response.`\n );\n }\n\n if (error instanceof TypeError) {\n throw createServerUnavailableError(\n serverUrl,\n 'The Astro rendering server is not reachable over HTTP.'\n );\n }\n\n throw error;\n }\n}\n\nfunction resolveServerUrl(defaults: ServerRendererDefaults) {\n const envServerUrl = (import.meta as StorybookImportMetaEnv).env?.STORYBOOK_ASTRO_SERVER_URL;\n const globalServerUrl = (globalThis as StorybookGlobalEnv).STORYBOOK_ASTRO_SERVER_URL;\n\n return defaults.serverUrl || envServerUrl || globalServerUrl || 'http://localhost:3000';\n}\n\nfunction resolveAuthToken(defaults: ServerRendererDefaults) {\n const envAuthToken = (import.meta as StorybookImportMetaEnv).env?.STORYBOOK_ASTRO_SERVER_TOKEN;\n const globalAuthToken = (globalThis as StorybookGlobalEnv).STORYBOOK_ASTRO_SERVER_TOKEN;\n\n return defaults.authToken || envAuthToken || globalAuthToken;\n}\n\nfunction resolveAuthHeader(defaults: ServerRendererDefaults) {\n const envAuthHeader = (import.meta as StorybookImportMetaEnv).env?.STORYBOOK_ASTRO_SERVER_AUTH_HEADER;\n const globalAuthHeader = (globalThis as StorybookGlobalEnv).STORYBOOK_ASTRO_SERVER_AUTH_HEADER;\n\n return (defaults.authHeader || envAuthHeader || globalAuthHeader || 'authorization').toLowerCase();\n}\n\nfunction createServerUnavailableError(serverUrl: string, reason: string) {\n const error = new Error(`Unable to reach Astro rendering server at ${serverUrl}. ${reason}`);\n\n error.name = ASTRO_SERVER_UNAVAILABLE_ERROR_NAME;\n\n return error;\n}\n"],"mappings":";;;AAkBA,IAAM,sCAAsC;AAErC,SAAS,qBAAqB,WAAmC,CAAC,GAAG;AAC1E,SAAO;AAAA,IACL,OAAO,MAA4B,YAAY,KAAM;AACnD,aAAO,eAAe,MAAM,WAAW,QAAQ;AAAA,IACjD;AAAA,IACA,OAAO;AACL;AAAA,IACF;AAAA,IACA,cAAc;AACZ;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,eACb,MACA,WACA,UACA;AAEA,QAAM,KAAK,OAAO,WAAW;AAC7B,QAAM,YAAY,iBAAiB,QAAQ;AAC3C,QAAM,YAAY,iBAAiB,QAAQ;AAC3C,QAAM,aAAa,kBAAkB,QAAQ;AAC7C,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAEhE,MAAI;AACF,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AAEA,QAAI,WAAW;AACb,cAAQ,UAAU,IAChB,WAAW,YAAY,MAAM,mBAAmB,CAAC,UAAU,WAAW,SAAS,IAC3E,UAAU,SAAS,KACnB;AAAA,IACR;AAGA,UAAM,WAAW,MAAM,MAAM,GAAG,SAAS,WAAW;AAAA,MAClD,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,QAAQ,WAAW;AAAA,IACrB,CAAC;AAED,iBAAa,SAAS;AAEtB,QAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,YAAM,IAAI;AAAA,QACR,oDAAoD,SAAS,MAAM;AAAA,MAErE;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,IACpF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,iBAAa,SAAS;AAEtB,QAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,YAAM;AAAA,QACJ;AAAA,QACA,2BAA2B,SAAS;AAAA,MACtC;AAAA,IACF;AAEA,QAAI,iBAAiB,WAAW;AAC9B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,iBAAiB,UAAkC;AAC1D,QAAM,eAAgB,YAAuC,KAAK;AAClE,QAAM,kBAAmB,WAAkC;AAE3D,SAAO,SAAS,aAAa,gBAAgB,mBAAmB;AAClE;AAEA,SAAS,iBAAiB,UAAkC;AAC1D,QAAM,eAAgB,YAAuC,KAAK;AAClE,QAAM,kBAAmB,WAAkC;AAE3D,SAAO,SAAS,aAAa,gBAAgB;AAC/C;AAEA,SAAS,kBAAkB,UAAkC;AAC3D,QAAM,gBAAiB,YAAuC,KAAK;AACnE,QAAM,mBAAoB,WAAkC;AAE5D,UAAQ,SAAS,cAAc,iBAAiB,oBAAoB,iBAAiB,YAAY;AACnG;AAEA,SAAS,6BAA6B,WAAmB,QAAgB;AACvE,QAAM,QAAQ,IAAI,MAAM,6CAA6C,SAAS,KAAK,MAAM,EAAE;AAE3F,QAAM,OAAO;AAEb,SAAO;AACT;","names":[]}
@@ -0,0 +1,54 @@
1
+ import "../chunk-G3PMV62Z.js";
2
+
3
+ // src/renderer/renderer-static.ts
4
+ var PRERENDERED_STORIES_FILE = "astro-prerendered-stories.json";
5
+ var prerenderedStoriesPromise;
6
+ async function render(data) {
7
+ const id = crypto.randomUUID();
8
+ const storyId = data.story?.id;
9
+ if (!storyId) {
10
+ throw new Error(
11
+ "Astro static renderer expected a story id, but none was provided in the render payload."
12
+ );
13
+ }
14
+ const prerenderedStories = await loadPrerenderedStories();
15
+ const html = prerenderedStories[storyId];
16
+ if (html === void 0) {
17
+ throw new Error(
18
+ `No prerendered HTML was found for story "${storyId}". Rebuild Storybook static output.`
19
+ );
20
+ }
21
+ return {
22
+ id,
23
+ html
24
+ };
25
+ }
26
+ function init() {
27
+ return;
28
+ }
29
+ function applyStyles() {
30
+ return;
31
+ }
32
+ async function loadPrerenderedStories() {
33
+ if (!prerenderedStoriesPromise) {
34
+ const jsonPath = resolvePrerenderedStoriesUrl();
35
+ prerenderedStoriesPromise = fetch(jsonPath).then(async (response) => {
36
+ if (!response.ok) {
37
+ throw new Error(
38
+ `Failed to load ${PRERENDERED_STORIES_FILE}. Received ${response.status} ${response.statusText}.`
39
+ );
40
+ }
41
+ return await response.json();
42
+ });
43
+ }
44
+ return prerenderedStoriesPromise;
45
+ }
46
+ function resolvePrerenderedStoriesUrl() {
47
+ return new URL(PRERENDERED_STORIES_FILE, window.location.href).toString();
48
+ }
49
+ export {
50
+ applyStyles,
51
+ init,
52
+ render
53
+ };
54
+ //# sourceMappingURL=renderer-static.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/renderer/renderer-static.ts"],"sourcesContent":["import type { RenderComponentInput, RenderResponseMessage } from '@storybook-astro/renderer/types';\n\nconst PRERENDERED_STORIES_FILE = 'astro-prerendered-stories.json';\n\nlet prerenderedStoriesPromise: Promise<Record<string, string>> | undefined;\n\nexport async function render(data: RenderComponentInput) {\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n const id = crypto.randomUUID();\n const storyId = data.story?.id;\n\n if (!storyId) {\n throw new Error(\n 'Astro static renderer expected a story id, but none was provided in the render payload.'\n );\n }\n\n const prerenderedStories = await loadPrerenderedStories();\n const html = prerenderedStories[storyId];\n\n if (html === undefined) {\n throw new Error(\n `No prerendered HTML was found for story \"${storyId}\". Rebuild Storybook static output.`\n );\n }\n\n return {\n id,\n html\n } satisfies RenderResponseMessage['data'];\n}\n\nexport function init() {\n return;\n}\n\nexport function applyStyles() {\n return;\n}\n\nasync function loadPrerenderedStories() {\n if (!prerenderedStoriesPromise) {\n const jsonPath = resolvePrerenderedStoriesUrl();\n\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n prerenderedStoriesPromise = fetch(jsonPath).then(async (response) => {\n if (!response.ok) {\n throw new Error(\n `Failed to load ${PRERENDERED_STORIES_FILE}. Received ${response.status} ${response.statusText}.`\n );\n }\n\n return (await response.json()) as Record<string, string>;\n });\n }\n\n return prerenderedStoriesPromise;\n}\n\nfunction resolvePrerenderedStoriesUrl() {\n return new URL(PRERENDERED_STORIES_FILE, window.location.href).toString();\n}\n"],"mappings":";;;AAEA,IAAM,2BAA2B;AAEjC,IAAI;AAEJ,eAAsB,OAAO,MAA4B;AAEvD,QAAM,KAAK,OAAO,WAAW;AAC7B,QAAM,UAAU,KAAK,OAAO;AAE5B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM,uBAAuB;AACxD,QAAM,OAAO,mBAAmB,OAAO;AAEvC,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI;AAAA,MACR,4CAA4C,OAAO;AAAA,IACrD;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,OAAO;AACrB;AACF;AAEO,SAAS,cAAc;AAC5B;AACF;AAEA,eAAe,yBAAyB;AACtC,MAAI,CAAC,2BAA2B;AAC9B,UAAM,WAAW,6BAA6B;AAG9C,gCAA4B,MAAM,QAAQ,EAAE,KAAK,OAAO,aAAa;AACnE,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI;AAAA,UACR,kBAAkB,wBAAwB,cAAc,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QAChG;AAAA,MACF;AAEA,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,+BAA+B;AACtC,SAAO,IAAI,IAAI,0BAA0B,OAAO,SAAS,IAAI,EAAE,SAAS;AAC1E;","names":[]}
package/dist/testing.js CHANGED
@@ -1,20 +1,21 @@
1
+ import {
2
+ renderViaTestingRendererDaemon,
3
+ runWithWorkingDirectory
4
+ } from "./chunk-2EABPTOY.js";
5
+ import {
6
+ resolveTestingIntegrationsForRoot
7
+ } from "./chunk-WUTCMEF5.js";
1
8
  import {
2
9
  composeStories,
3
10
  composeStory,
4
11
  setProjectAnnotations
5
12
  } from "./chunk-KXAAX3GN.js";
6
- import {
7
- renderViaTestingRendererDaemon,
8
- runWithWorkingDirectory
9
- } from "./chunk-T7NWIO5S.js";
10
13
  import {
11
14
  ssrLoadModuleWithFsFallback
12
- } from "./chunk-POHTFYST.js";
13
- import {
14
- resolveTestingIntegrationsForRoot
15
- } from "./chunk-4SWPVM6R.js";
16
- import "./chunk-DNGQBPT7.js";
17
- import "./chunk-PJEDXZVN.js";
15
+ } from "./chunk-AYYMNFI6.js";
16
+ import "./chunk-PUTCAN6X.js";
17
+ import "./chunk-B5HHF6FC.js";
18
+ import "./chunk-7YBE4TTI.js";
18
19
  import "./chunk-G3PMV62Z.js";
19
20
 
20
21
  // src/testing/story-composition.ts
@@ -212,7 +213,7 @@ async function getAstroContainer() {
212
213
  }
213
214
  async function getAstroSsrViteServer(resolveFrom) {
214
215
  if (!astroSsrViteServerPromises.has(resolveFrom)) {
215
- const { createViteServer } = await import("./viteStorybookAstroMiddlewarePlugin-2EFKTECT.js");
216
+ const { createViteServer } = await import("./viteStorybookAstroMiddlewarePlugin-UB6ZLJ4B.js");
216
217
  const integrations = getTestingIntegrations(resolveFrom);
217
218
  astroSsrViteServerPromises.set(
218
219
  resolveFrom,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/testing/story-composition.ts","../src/testing/astro-runtime.ts","../src/testing/project-root.ts","../src/testing/component-utils.ts"],"sourcesContent":["import {\n composeStories as portableComposeStories,\n composeStory as portableComposeStory,\n setProjectAnnotations as portableSetProjectAnnotations,\n} from '../portable-stories.ts';\nimport type { ProjectAnnotations, Store_CSFExports as StoreCsfExports } from 'storybook/internal/types';\nimport type { AstroRenderer } from '../portable-stories.ts';\nimport type { ComposedStory, StoryMeta } from './types.ts';\n\nexport function composeStories<\n TModule extends StoreCsfExports<AstroRenderer> & Record<string, unknown>\n>(\n storiesImport: TModule,\n projectAnnotations?: ProjectAnnotations<AstroRenderer>\n) {\n const composed = portableComposeStories(storiesImport, projectAnnotations);\n\n for (const [storyExportName, story] of Object.entries(composed)) {\n if (typeof story === 'function') {\n const composedStory = story as ComposedStory;\n\n composedStory.__storybookAstroMeta = storiesImport.default as StoryMeta;\n composedStory.__storybookAstroStoryExport = storiesImport[\n storyExportName as keyof TModule\n ] as ComposedStory['__storybookAstroStoryExport'];\n }\n }\n\n return composed;\n}\n\nexport const composeStory = portableComposeStory;\nexport const setProjectAnnotations = portableSetProjectAnnotations;\n","import { fileURLToPath } from 'node:url';\nimport type { ViteDevServer } from 'vite';\nimport type { Integration as StorybookAstroIntegration } from '../integrations/base.ts';\nimport { resolveTestingIntegrationsForRoot } from './integration-config.ts';\nimport { resolveTestingProjectRoot } from './project-root.ts';\nimport { runWithWorkingDirectory } from './working-directory.ts';\nimport { getComponentModuleId, isAstroComponentFactory, isStorybookAstroClientStub } from './component-utils.ts';\nimport { ssrLoadModuleWithFsFallback } from '../lib/ssr-load-module-with-fs-fallback.ts';\nimport type { ComposedStory } from './types.ts';\nimport { renderViaTestingRendererDaemon } from './renderer-daemon.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet astroContainerPromise: Promise<any> | null = null;\n\nconst astroSsrViteServerPromises = new Map<string, Promise<ViteDevServer>>();\n\nconst astroSsrHandlerPromises = new Map<\n string,\n Promise<(data: { component: string; args?: Record<string, unknown> }) => Promise<string>>\n>();\n\nconst testingIntegrationsCache = new Map<string, StorybookAstroIntegration[]>();\n\nfunction getTestingIntegrations(resolveFrom: string) {\n if (!testingIntegrationsCache.has(resolveFrom)) {\n testingIntegrationsCache.set(resolveFrom, resolveTestingIntegrationsForRoot(resolveFrom));\n }\n\n return testingIntegrationsCache.get(resolveFrom)!;\n}\n\nasync function getAstroContainer() {\n if (!astroContainerPromise) {\n const { experimental_AstroContainer: AstroContainer } = await import('astro/container');\n\n astroContainerPromise = AstroContainer.create();\n }\n\n return astroContainerPromise;\n}\n\nasync function getAstroSsrViteServer(resolveFrom: string) {\n if (!astroSsrViteServerPromises.has(resolveFrom)) {\n const { createViteServer } = await import('../viteStorybookAstroMiddlewarePlugin.ts');\n const integrations = getTestingIntegrations(resolveFrom);\n\n astroSsrViteServerPromises.set(\n resolveFrom,\n runWithWorkingDirectory(resolveFrom, () => createViteServer(integrations, resolveFrom))\n );\n }\n\n return astroSsrViteServerPromises.get(resolveFrom)!;\n}\n\nasync function getAstroSsrHandler(resolveFrom: string) {\n if (!astroSsrHandlerPromises.has(resolveFrom)) {\n astroSsrHandlerPromises.set(resolveFrom, (async () => {\n const integrations = getTestingIntegrations(resolveFrom);\n const viteServer = await getAstroSsrViteServer(resolveFrom);\n const middlewareModulePath = fileURLToPath(new URL('../middleware', import.meta.url));\n const middleware = await runWithWorkingDirectory(resolveFrom, () =>\n viteServer.ssrLoadModule(middlewareModulePath, {\n fixStacktrace: true\n })\n );\n\n return middleware.handlerFactory(integrations, {\n loadModule: (id: string) =>\n ssrLoadModuleWithFsFallback(viteServer, id, {\n fixStacktrace: true\n })\n });\n })());\n }\n\n return astroSsrHandlerPromises.get(resolveFrom)!;\n}\n\nasync function resolveAstroComponent(component: unknown, resolveFrom: string) {\n let resolvedComponent = component;\n\n if (!isAstroComponentFactory(resolvedComponent)) {\n throw new Error('Story meta.component must be an Astro component factory.');\n }\n\n if ('moduleId' in resolvedComponent && typeof resolvedComponent.moduleId === 'string') {\n const moduleId = resolvedComponent.moduleId;\n const normalizedModuleId = moduleId.split('?')[0].split('#')[0];\n\n try {\n const mod = await import(/* @vite-ignore */ normalizedModuleId) as Record<string, unknown>;\n\n if (isAstroComponentFactory(mod.default)) {\n resolvedComponent = mod.default;\n }\n } catch {\n // keep current component when direct module import is unavailable\n }\n\n if (isStorybookAstroClientStub(resolvedComponent)) {\n try {\n const viteServer = await getAstroSsrViteServer(resolveFrom);\n const mod = (await ssrLoadModuleWithFsFallback(viteServer, normalizedModuleId)) as Record<string, unknown>;\n\n if (isAstroComponentFactory(mod.default)) {\n resolvedComponent = mod.default;\n }\n } catch {\n // keep current component when SSR module loading is unavailable\n }\n }\n }\n\n return resolvedComponent;\n}\n\nasync function renderAstroComponentToDom(\n component: unknown,\n args: Record<string, unknown>,\n resolveFrom: string\n) {\n const moduleId = getComponentModuleId(component);\n\n if (moduleId) {\n try {\n // Fast path: reuse a single shared SSR daemon instead of spinning SSR in each worker.\n const html = await renderViaTestingRendererDaemon({\n resolveFrom,\n component: moduleId,\n args\n });\n\n if (typeof html === 'string') {\n if (typeof document !== 'undefined') {\n document.body.innerHTML = html;\n }\n\n return html;\n }\n } catch {\n // Fall back to in-worker rendering below when daemon render fails.\n }\n\n try {\n const handler = await getAstroSsrHandler(resolveFrom);\n const html = await handler({\n component: moduleId,\n args\n });\n\n if (typeof document !== 'undefined') {\n document.body.innerHTML = html;\n }\n\n return html;\n } catch {\n // Fall back to direct Container rendering below\n }\n }\n\n const resolvedComponent = await resolveAstroComponent(component, resolveFrom);\n const container = await getAstroContainer();\n \n if (!container) {\n throw new Error('Failed to initialize Astro container for rendering');\n }\n \n const html = await container.renderToString(resolvedComponent, {\n props: args\n });\n\n if (typeof document !== 'undefined') {\n document.body.innerHTML = html;\n }\n\n return html;\n}\n\nasync function renderComposedStory(story: ComposedStory) {\n const meta = story.__storybookAstroMeta;\n const storyExport = story.__storybookAstroStoryExport;\n let component = meta?.component ?? story.component;\n\n if (!isAstroComponentFactory(component)) {\n const maybeRendered = await story();\n\n if (isAstroComponentFactory(maybeRendered)) {\n component = maybeRendered;\n } else if (\n typeof maybeRendered === 'object' &&\n maybeRendered !== null &&\n 'component' in maybeRendered &&\n isAstroComponentFactory((maybeRendered as { component: unknown }).component)\n ) {\n component = (maybeRendered as { component: unknown }).component;\n }\n }\n\n if (!component) {\n throw new Error('Unable to resolve Astro component from composed story.');\n }\n\n const args = {\n ...(meta?.args ?? {}),\n ...(storyExport?.args ?? {}),\n ...(story.args ?? {})\n };\n\n const resolveFrom = await resolveTestingProjectRoot(component);\n\n return renderAstroComponentToDom(component, args, resolveFrom);\n}\n\nexport async function renderStory(story: ComposedStory) {\n return renderComposedStory(story);\n}\n\nexport const renderAstroStory = renderStory;\n","import { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { getComponentModuleFilePath } from './component-utils.ts';\n\nconst VITEST_CONFIG_FILES = [\n 'vitest.config.ts',\n 'vitest.config.mts',\n 'vitest.config.js',\n 'vitest.config.mjs',\n 'vitest.config.cjs'\n];\n\nfunction extractStackFilePath(line: string) {\n const trimmed = line.trim();\n\n const match = trimmed.match(/\\((.+):(\\d+):(\\d+)\\)$/) ?? trimmed.match(/^at\\s+(.+):(\\d+):(\\d+)$/);\n\n if (!match) {\n return null;\n }\n\n const rawPath = match[1];\n\n if (rawPath.startsWith('node:')) {\n return null;\n }\n\n if (rawPath.startsWith('file://')) {\n return fileURLToPath(rawPath);\n }\n\n if (rawPath.startsWith('/')) {\n return rawPath;\n }\n\n return null;\n}\n\nasync function getCurrentTestFilePath() {\n try {\n const { expect } = await import('vitest');\n const vitestState = expect.getState() as {\n testPath?: string;\n filepath?: string;\n filePath?: string;\n };\n\n const fromVitestState = vitestState.testPath ?? vitestState.filepath ?? vitestState.filePath;\n\n if (typeof fromVitestState === 'string') {\n const absolutePath = fromVitestState.startsWith('/')\n ? fromVitestState\n : resolve(process.cwd(), fromVitestState);\n\n if (existsSync(absolutePath)) {\n return absolutePath;\n }\n }\n } catch {\n // Fall through to stack-based lookup when Vitest state is unavailable.\n }\n\n const stack = new Error().stack;\n\n if (!stack) {\n return null;\n }\n\n const thisFilePath = fileURLToPath(import.meta.url);\n\n for (const line of stack.split('\\n')) {\n const filePath = extractStackFilePath(line);\n\n if (!filePath) {\n continue;\n }\n\n if (filePath === thisFilePath || filePath.includes('/node_modules/')) {\n continue;\n }\n\n if (existsSync(filePath)) {\n return filePath;\n }\n }\n\n return null;\n}\n\nfunction findNearestVitestConfigDir(startPath: string) {\n let dir = dirname(startPath);\n\n while (true) {\n if (VITEST_CONFIG_FILES.some((name) => existsSync(join(dir, name)))) {\n return dir;\n }\n\n const parent = dirname(dir);\n\n if (parent === dir) {\n break;\n }\n\n dir = parent;\n }\n\n return null;\n}\n\nfunction packageJsonDeclaresAstro(packageJsonPath: string) {\n if (!existsSync(packageJsonPath)) {\n return false;\n }\n\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\n return ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'].some(\n (field) =>\n packageJson[field] &&\n typeof packageJson[field] === 'object' &&\n Object.prototype.hasOwnProperty.call(packageJson[field], 'astro')\n );\n } catch {\n return false;\n }\n}\n\nfunction findNearestAstroPackageDir(startPath: string) {\n let dir = dirname(startPath);\n\n while (true) {\n const packageJsonPath = join(dir, 'package.json');\n\n if (packageJsonDeclaresAstro(packageJsonPath)) {\n return dir;\n }\n\n const parent = dirname(dir);\n\n if (parent === dir) {\n break;\n }\n\n dir = parent;\n }\n\n return null;\n}\n\nfunction canResolveAstroFrom(dir: string) {\n try {\n const require = createRequire(`${join(dir, '__storybook-astro-testing-resolve__.js')}`);\n\n require.resolve('astro/package.json');\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function resolveTestingProjectRoot(component: unknown) {\n const currentTestFilePath = await getCurrentTestFilePath();\n const componentModulePath = getComponentModuleFilePath(component);\n const candidates = [\n currentTestFilePath ? findNearestVitestConfigDir(currentTestFilePath) : null,\n currentTestFilePath ? findNearestAstroPackageDir(currentTestFilePath) : null,\n componentModulePath ? findNearestAstroPackageDir(componentModulePath) : null,\n packageJsonDeclaresAstro(join(process.cwd(), 'package.json')) ? process.cwd() : null,\n process.env.INIT_CWD && packageJsonDeclaresAstro(join(process.env.INIT_CWD, 'package.json'))\n ? process.env.INIT_CWD\n : null\n ].filter((value): value is string => Boolean(value));\n\n for (const candidate of candidates) {\n if (canResolveAstroFrom(candidate)) {\n return candidate;\n }\n }\n\n return process.cwd();\n}\n","export function isStorybookAstroClientStub(component: unknown) {\n return (\n typeof component === 'function' &&\n String(component).includes('Astro components are rendered server-side by Storybook')\n );\n}\n\nexport function isAstroComponentFactory(component: unknown) {\n return typeof component === 'function' && 'isAstroComponentFactory' in component;\n}\n\nexport function getComponentModuleId(component: unknown) {\n if (typeof component !== 'function' || !('moduleId' in component)) {\n return null;\n }\n\n if (typeof component.moduleId !== 'string') {\n return null;\n }\n\n return component.moduleId.split('?')[0].split('#')[0];\n}\n\nexport function getComponentModuleFilePath(component: unknown) {\n const moduleId = getComponentModuleId(component);\n\n if (!moduleId || !moduleId.startsWith('/')) {\n return null;\n }\n\n return moduleId;\n}\n"],"mappings":"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","names":["composeStories","composeStory","setProjectAnnotations","fileURLToPath","require","fileURLToPath","html"]}
1
+ {"version":3,"sources":["../src/testing/story-composition.ts","../src/testing/astro-runtime.ts","../src/testing/project-root.ts","../src/testing/component-utils.ts"],"sourcesContent":["import {\n composeStories as portableComposeStories,\n composeStory as portableComposeStory,\n setProjectAnnotations as portableSetProjectAnnotations,\n} from '../portable-stories.ts';\nimport type { ProjectAnnotations, Store_CSFExports as StoreCsfExports } from 'storybook/internal/types';\nimport type { AstroRenderer } from '../portable-stories.ts';\nimport type { ComposedStory, StoryMeta } from './types.ts';\n\nexport function composeStories<\n TModule extends StoreCsfExports<AstroRenderer> & Record<string, unknown>\n>(\n storiesImport: TModule,\n projectAnnotations?: ProjectAnnotations<AstroRenderer>\n) {\n const composed = portableComposeStories(storiesImport, projectAnnotations);\n\n for (const [storyExportName, story] of Object.entries(composed)) {\n if (typeof story === 'function') {\n const composedStory = story as ComposedStory;\n\n composedStory.__storybookAstroMeta = storiesImport.default as StoryMeta;\n composedStory.__storybookAstroStoryExport = storiesImport[\n storyExportName as keyof TModule\n ] as ComposedStory['__storybookAstroStoryExport'];\n }\n }\n\n return composed;\n}\n\nexport const composeStory = portableComposeStory;\nexport const setProjectAnnotations = portableSetProjectAnnotations;\n","import { fileURLToPath } from 'node:url';\nimport type { ViteDevServer } from 'vite';\nimport type { Integration as StorybookAstroIntegration } from '../integrations/base.ts';\nimport { resolveTestingIntegrationsForRoot } from './integration-config.ts';\nimport { resolveTestingProjectRoot } from './project-root.ts';\nimport { runWithWorkingDirectory } from './working-directory.ts';\nimport { getComponentModuleId, isAstroComponentFactory, isStorybookAstroClientStub } from './component-utils.ts';\nimport { ssrLoadModuleWithFsFallback } from '../lib/ssr-load-module-with-fs-fallback.ts';\nimport type { ComposedStory } from './types.ts';\nimport { renderViaTestingRendererDaemon } from './renderer-daemon.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet astroContainerPromise: Promise<any> | null = null;\n\nconst astroSsrViteServerPromises = new Map<string, Promise<ViteDevServer>>();\n\nconst astroSsrHandlerPromises = new Map<\n string,\n Promise<(data: { component: string; args?: Record<string, unknown> }) => Promise<string>>\n>();\n\nconst testingIntegrationsCache = new Map<string, StorybookAstroIntegration[]>();\n\nfunction getTestingIntegrations(resolveFrom: string) {\n if (!testingIntegrationsCache.has(resolveFrom)) {\n testingIntegrationsCache.set(resolveFrom, resolveTestingIntegrationsForRoot(resolveFrom));\n }\n\n return testingIntegrationsCache.get(resolveFrom)!;\n}\n\nasync function getAstroContainer() {\n if (!astroContainerPromise) {\n const { experimental_AstroContainer: AstroContainer } = await import('astro/container');\n\n astroContainerPromise = AstroContainer.create();\n }\n\n return astroContainerPromise;\n}\n\nasync function getAstroSsrViteServer(resolveFrom: string) {\n if (!astroSsrViteServerPromises.has(resolveFrom)) {\n const { createViteServer } = await import('../viteStorybookAstroMiddlewarePlugin.ts');\n const integrations = getTestingIntegrations(resolveFrom);\n\n astroSsrViteServerPromises.set(\n resolveFrom,\n runWithWorkingDirectory(resolveFrom, () => createViteServer(integrations, resolveFrom))\n );\n }\n\n return astroSsrViteServerPromises.get(resolveFrom)!;\n}\n\nasync function getAstroSsrHandler(resolveFrom: string) {\n if (!astroSsrHandlerPromises.has(resolveFrom)) {\n astroSsrHandlerPromises.set(resolveFrom, (async () => {\n const integrations = getTestingIntegrations(resolveFrom);\n const viteServer = await getAstroSsrViteServer(resolveFrom);\n const middlewareModulePath = fileURLToPath(new URL('../middleware', import.meta.url));\n const middleware = await runWithWorkingDirectory(resolveFrom, () =>\n viteServer.ssrLoadModule(middlewareModulePath, {\n fixStacktrace: true\n })\n );\n\n return middleware.handlerFactory(integrations, {\n loadModule: (id: string) =>\n ssrLoadModuleWithFsFallback(viteServer, id, {\n fixStacktrace: true\n })\n });\n })());\n }\n\n return astroSsrHandlerPromises.get(resolveFrom)!;\n}\n\nasync function resolveAstroComponent(component: unknown, resolveFrom: string) {\n let resolvedComponent = component;\n\n if (!isAstroComponentFactory(resolvedComponent)) {\n throw new Error('Story meta.component must be an Astro component factory.');\n }\n\n if ('moduleId' in resolvedComponent && typeof resolvedComponent.moduleId === 'string') {\n const moduleId = resolvedComponent.moduleId;\n const normalizedModuleId = moduleId.split('?')[0].split('#')[0];\n\n try {\n const mod = await import(/* @vite-ignore */ normalizedModuleId) as Record<string, unknown>;\n\n if (isAstroComponentFactory(mod.default)) {\n resolvedComponent = mod.default;\n }\n } catch {\n // keep current component when direct module import is unavailable\n }\n\n if (isStorybookAstroClientStub(resolvedComponent)) {\n try {\n const viteServer = await getAstroSsrViteServer(resolveFrom);\n const mod = (await ssrLoadModuleWithFsFallback(viteServer, normalizedModuleId)) as Record<string, unknown>;\n\n if (isAstroComponentFactory(mod.default)) {\n resolvedComponent = mod.default;\n }\n } catch {\n // keep current component when SSR module loading is unavailable\n }\n }\n }\n\n return resolvedComponent;\n}\n\nasync function renderAstroComponentToDom(\n component: unknown,\n args: Record<string, unknown>,\n resolveFrom: string\n) {\n const moduleId = getComponentModuleId(component);\n\n if (moduleId) {\n try {\n // Fast path: reuse a single shared SSR daemon instead of spinning SSR in each worker.\n const html = await renderViaTestingRendererDaemon({\n resolveFrom,\n component: moduleId,\n args\n });\n\n if (typeof html === 'string') {\n if (typeof document !== 'undefined') {\n document.body.innerHTML = html;\n }\n\n return html;\n }\n } catch {\n // Fall back to in-worker rendering below when daemon render fails.\n }\n\n try {\n const handler = await getAstroSsrHandler(resolveFrom);\n const html = await handler({\n component: moduleId,\n args\n });\n\n if (typeof document !== 'undefined') {\n document.body.innerHTML = html;\n }\n\n return html;\n } catch {\n // Fall back to direct Container rendering below\n }\n }\n\n const resolvedComponent = await resolveAstroComponent(component, resolveFrom);\n const container = await getAstroContainer();\n \n if (!container) {\n throw new Error('Failed to initialize Astro container for rendering');\n }\n \n const html = await container.renderToString(resolvedComponent, {\n props: args\n });\n\n if (typeof document !== 'undefined') {\n document.body.innerHTML = html;\n }\n\n return html;\n}\n\nasync function renderComposedStory(story: ComposedStory) {\n const meta = story.__storybookAstroMeta;\n const storyExport = story.__storybookAstroStoryExport;\n let component = meta?.component ?? story.component;\n\n if (!isAstroComponentFactory(component)) {\n const maybeRendered = await story();\n\n if (isAstroComponentFactory(maybeRendered)) {\n component = maybeRendered;\n } else if (\n typeof maybeRendered === 'object' &&\n maybeRendered !== null &&\n 'component' in maybeRendered &&\n isAstroComponentFactory((maybeRendered as { component: unknown }).component)\n ) {\n component = (maybeRendered as { component: unknown }).component;\n }\n }\n\n if (!component) {\n throw new Error('Unable to resolve Astro component from composed story.');\n }\n\n const args = {\n ...(meta?.args ?? {}),\n ...(storyExport?.args ?? {}),\n ...(story.args ?? {})\n };\n\n const resolveFrom = await resolveTestingProjectRoot(component);\n\n return renderAstroComponentToDom(component, args, resolveFrom);\n}\n\nexport async function renderStory(story: ComposedStory) {\n return renderComposedStory(story);\n}\n\nexport const renderAstroStory = renderStory;\n","import { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { getComponentModuleFilePath } from './component-utils.ts';\n\nconst VITEST_CONFIG_FILES = [\n 'vitest.config.ts',\n 'vitest.config.mts',\n 'vitest.config.js',\n 'vitest.config.mjs',\n 'vitest.config.cjs'\n];\n\nfunction extractStackFilePath(line: string) {\n const trimmed = line.trim();\n\n const match = trimmed.match(/\\((.+):(\\d+):(\\d+)\\)$/) ?? trimmed.match(/^at\\s+(.+):(\\d+):(\\d+)$/);\n\n if (!match) {\n return null;\n }\n\n const rawPath = match[1];\n\n if (rawPath.startsWith('node:')) {\n return null;\n }\n\n if (rawPath.startsWith('file://')) {\n return fileURLToPath(rawPath);\n }\n\n if (rawPath.startsWith('/')) {\n return rawPath;\n }\n\n return null;\n}\n\nasync function getCurrentTestFilePath() {\n try {\n const { expect } = await import('vitest');\n const vitestState = expect.getState() as {\n testPath?: string;\n filepath?: string;\n filePath?: string;\n };\n\n const fromVitestState = vitestState.testPath ?? vitestState.filepath ?? vitestState.filePath;\n\n if (typeof fromVitestState === 'string') {\n const absolutePath = fromVitestState.startsWith('/')\n ? fromVitestState\n : resolve(process.cwd(), fromVitestState);\n\n if (existsSync(absolutePath)) {\n return absolutePath;\n }\n }\n } catch {\n // Fall through to stack-based lookup when Vitest state is unavailable.\n }\n\n const stack = new Error().stack;\n\n if (!stack) {\n return null;\n }\n\n const thisFilePath = fileURLToPath(import.meta.url);\n\n for (const line of stack.split('\\n')) {\n const filePath = extractStackFilePath(line);\n\n if (!filePath) {\n continue;\n }\n\n if (filePath === thisFilePath || filePath.includes('/node_modules/')) {\n continue;\n }\n\n if (existsSync(filePath)) {\n return filePath;\n }\n }\n\n return null;\n}\n\nfunction findNearestVitestConfigDir(startPath: string) {\n let dir = dirname(startPath);\n\n while (true) {\n if (VITEST_CONFIG_FILES.some((name) => existsSync(join(dir, name)))) {\n return dir;\n }\n\n const parent = dirname(dir);\n\n if (parent === dir) {\n break;\n }\n\n dir = parent;\n }\n\n return null;\n}\n\nfunction packageJsonDeclaresAstro(packageJsonPath: string) {\n if (!existsSync(packageJsonPath)) {\n return false;\n }\n\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\n return ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'].some(\n (field) =>\n packageJson[field] &&\n typeof packageJson[field] === 'object' &&\n Object.prototype.hasOwnProperty.call(packageJson[field], 'astro')\n );\n } catch {\n return false;\n }\n}\n\nfunction findNearestAstroPackageDir(startPath: string) {\n let dir = dirname(startPath);\n\n while (true) {\n const packageJsonPath = join(dir, 'package.json');\n\n if (packageJsonDeclaresAstro(packageJsonPath)) {\n return dir;\n }\n\n const parent = dirname(dir);\n\n if (parent === dir) {\n break;\n }\n\n dir = parent;\n }\n\n return null;\n}\n\nfunction canResolveAstroFrom(dir: string) {\n try {\n const require = createRequire(`${join(dir, '__storybook-astro-testing-resolve__.js')}`);\n\n require.resolve('astro/package.json');\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function resolveTestingProjectRoot(component: unknown) {\n const currentTestFilePath = await getCurrentTestFilePath();\n const componentModulePath = getComponentModuleFilePath(component);\n const candidates = [\n currentTestFilePath ? findNearestVitestConfigDir(currentTestFilePath) : null,\n currentTestFilePath ? findNearestAstroPackageDir(currentTestFilePath) : null,\n componentModulePath ? findNearestAstroPackageDir(componentModulePath) : null,\n packageJsonDeclaresAstro(join(process.cwd(), 'package.json')) ? process.cwd() : null,\n process.env.INIT_CWD && packageJsonDeclaresAstro(join(process.env.INIT_CWD, 'package.json'))\n ? process.env.INIT_CWD\n : null\n ].filter((value): value is string => Boolean(value));\n\n for (const candidate of candidates) {\n if (canResolveAstroFrom(candidate)) {\n return candidate;\n }\n }\n\n return process.cwd();\n}\n","export function isStorybookAstroClientStub(component: unknown) {\n return (\n typeof component === 'function' &&\n String(component).includes('Astro components are rendered server-side by Storybook')\n );\n}\n\nexport function isAstroComponentFactory(component: unknown) {\n return typeof component === 'function' && 'isAstroComponentFactory' in component;\n}\n\nexport function getComponentModuleId(component: unknown) {\n if (typeof component !== 'function' || !('moduleId' in component)) {\n return null;\n }\n\n if (typeof component.moduleId !== 'string') {\n return null;\n }\n\n return component.moduleId.split('?')[0].split('#')[0];\n}\n\nexport function getComponentModuleFilePath(component: unknown) {\n const moduleId = getComponentModuleId(component);\n\n if (!moduleId || !moduleId.startsWith('/')) {\n return null;\n }\n\n return moduleId;\n}\n"],"mappings":"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","names":["composeStories","composeStory","setProjectAnnotations","fileURLToPath","require","fileURLToPath","html"]}
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  createViteServer,
3
3
  vitePluginStorybookAstroMiddleware
4
- } from "./chunk-POHTFYST.js";
5
- import "./chunk-DNGQBPT7.js";
4
+ } from "./chunk-AYYMNFI6.js";
5
+ import "./chunk-PUTCAN6X.js";
6
+ import "./chunk-B5HHF6FC.js";
6
7
  import "./chunk-G3PMV62Z.js";
7
8
  export {
8
9
  createViteServer,
9
10
  vitePluginStorybookAstroMiddleware
10
11
  };
11
- //# sourceMappingURL=viteStorybookAstroMiddlewarePlugin-2EFKTECT.js.map
12
+ //# sourceMappingURL=viteStorybookAstroMiddlewarePlugin-UB6ZLJ4B.js.map
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  TESTING_RENDERER_DAEMON_URL_ENV,
3
3
  startTestingRendererDaemon
4
- } from "../chunk-T7NWIO5S.js";
5
- import "../chunk-POHTFYST.js";
6
- import "../chunk-4SWPVM6R.js";
7
- import "../chunk-DNGQBPT7.js";
8
- import "../chunk-PJEDXZVN.js";
4
+ } from "../chunk-2EABPTOY.js";
5
+ import "../chunk-WUTCMEF5.js";
6
+ import "../chunk-AYYMNFI6.js";
7
+ import "../chunk-PUTCAN6X.js";
8
+ import "../chunk-B5HHF6FC.js";
9
+ import "../chunk-7YBE4TTI.js";
9
10
  import "../chunk-G3PMV62Z.js";
10
11
 
11
12
  // src/vitest/global-setup.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/vitest/global-setup.ts"],"sourcesContent":["import {\n TESTING_RENDERER_DAEMON_URL_ENV,\n startTestingRendererDaemon\n} from '../testing/renderer-daemon.ts';\n\n/**\n * Patterns for warnings that are always benign in the test context and should\n * be silenced so they don't pollute test output.\n *\n * - \"Missing pages directory\" — Astro emits this when the project root has no\n * src/pages directory. Component tests never have pages.\n * - \"points to missing source files\" — Sourcemap gaps in the `entities` package;\n * a third-party packaging issue, not actionable.\n */\nconst SUPPRESSED_WARNING_PATTERNS = [\n 'Missing pages directory',\n 'points to missing source files',\n 'Failed to load source map for'\n];\n\nfunction shouldSuppress(chunk: Buffer | string): boolean {\n const msg = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk);\n\n return SUPPRESSED_WARNING_PATTERNS.some((pattern) => msg.includes(pattern));\n}\n\nexport default async function globalSetup() {\n // Intercept stderr before starting the daemon so that Astro's own logger\n // (which bypasses Vite's customLogger) doesn't leak benign noise into output.\n const originalWrite = process.stderr.write.bind(process.stderr);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (process.stderr as any).write = function (\n chunk: Buffer | string,\n encodingOrCb?: BufferEncoding | ((err?: Error | null) => void),\n cb?: (err?: Error | null) => void\n ): boolean {\n if (shouldSuppress(chunk)) {\n const done = typeof encodingOrCb === 'function' ? encodingOrCb : cb;\n\n done?.();\n\n return true;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (originalWrite as any)(chunk, encodingOrCb, cb);\n };\n\n const daemon = await startTestingRendererDaemon();\n\n // Workers discover the shared renderer via env instead of creating their own SSR stack.\n process.env[TESTING_RENDERER_DAEMON_URL_ENV] = daemon.url;\n\n return async () => {\n await daemon.close();\n delete process.env[TESTING_RENDERER_DAEMON_URL_ENV];\n // Restore stderr so post-teardown output is unaffected.\n process.stderr.write = originalWrite;\n };\n}\n"],"mappings":";;;;;;;;;;;AAcA,IAAM,8BAA8B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,eAAe,OAAiC;AACvD,QAAM,MAAM,OAAO,SAAS,KAAK,IAAI,MAAM,SAAS,MAAM,IAAI,OAAO,KAAK;AAE1E,SAAO,4BAA4B,KAAK,CAAC,YAAY,IAAI,SAAS,OAAO,CAAC;AAC5E;AAEA,eAAO,cAAqC;AAG1C,QAAM,gBAAgB,QAAQ,OAAO,MAAM,KAAK,QAAQ,MAAM;AAG9D,EAAC,QAAQ,OAAe,QAAQ,SAC9B,OACA,cACA,IACS;AACT,QAAI,eAAe,KAAK,GAAG;AACzB,YAAM,OAAO,OAAO,iBAAiB,aAAa,eAAe;AAEjE,aAAO;AAEP,aAAO;AAAA,IACT;AAGA,WAAQ,cAAsB,OAAO,cAAc,EAAE;AAAA,EACvD;AAEA,QAAM,SAAS,MAAM,2BAA2B;AAGhD,UAAQ,IAAI,+BAA+B,IAAI,OAAO;AAEtD,SAAO,YAAY;AACjB,UAAM,OAAO,MAAM;AACnB,WAAO,QAAQ,IAAI,+BAA+B;AAElD,YAAQ,OAAO,QAAQ;AAAA,EACzB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/vitest/global-setup.ts"],"sourcesContent":["import {\n TESTING_RENDERER_DAEMON_URL_ENV,\n startTestingRendererDaemon\n} from '../testing/renderer-daemon.ts';\n\n/**\n * Patterns for warnings that are always benign in the test context and should\n * be silenced so they don't pollute test output.\n *\n * - \"Missing pages directory\" — Astro emits this when the project root has no\n * src/pages directory. Component tests never have pages.\n * - \"points to missing source files\" — Sourcemap gaps in the `entities` package;\n * a third-party packaging issue, not actionable.\n */\nconst SUPPRESSED_WARNING_PATTERNS = [\n 'Missing pages directory',\n 'points to missing source files',\n 'Failed to load source map for'\n];\n\nfunction shouldSuppress(chunk: Buffer | string): boolean {\n const msg = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk);\n\n return SUPPRESSED_WARNING_PATTERNS.some((pattern) => msg.includes(pattern));\n}\n\nexport default async function globalSetup() {\n // Intercept stderr before starting the daemon so that Astro's own logger\n // (which bypasses Vite's customLogger) doesn't leak benign noise into output.\n const originalWrite = process.stderr.write.bind(process.stderr);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (process.stderr as any).write = function (\n chunk: Buffer | string,\n encodingOrCb?: BufferEncoding | ((err?: Error | null) => void),\n cb?: (err?: Error | null) => void\n ): boolean {\n if (shouldSuppress(chunk)) {\n const done = typeof encodingOrCb === 'function' ? encodingOrCb : cb;\n\n done?.();\n\n return true;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (originalWrite as any)(chunk, encodingOrCb, cb);\n };\n\n const daemon = await startTestingRendererDaemon();\n\n // Workers discover the shared renderer via env instead of creating their own SSR stack.\n process.env[TESTING_RENDERER_DAEMON_URL_ENV] = daemon.url;\n\n return async () => {\n await daemon.close();\n delete process.env[TESTING_RENDERER_DAEMON_URL_ENV];\n // Restore stderr so post-teardown output is unaffected.\n process.stderr.write = originalWrite;\n };\n}\n"],"mappings":";;;;;;;;;;;;AAcA,IAAM,8BAA8B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,eAAe,OAAiC;AACvD,QAAM,MAAM,OAAO,SAAS,KAAK,IAAI,MAAM,SAAS,MAAM,IAAI,OAAO,KAAK;AAE1E,SAAO,4BAA4B,KAAK,CAAC,YAAY,IAAI,SAAS,OAAO,CAAC;AAC5E;AAEA,eAAO,cAAqC;AAG1C,QAAM,gBAAgB,QAAQ,OAAO,MAAM,KAAK,QAAQ,MAAM;AAG9D,EAAC,QAAQ,OAAe,QAAQ,SAC9B,OACA,cACA,IACS;AACT,QAAI,eAAe,KAAK,GAAG;AACzB,YAAM,OAAO,OAAO,iBAAiB,aAAa,eAAe;AAEjE,aAAO;AAEP,aAAO;AAAA,IACT;AAGA,WAAQ,cAAsB,OAAO,cAAc,EAAE;AAAA,EACvD;AAEA,QAAM,SAAS,MAAM,2BAA2B;AAGhD,UAAQ,IAAI,+BAA+B,IAAI,OAAO;AAEtD,SAAO,YAAY;AACjB,UAAM,OAAO,MAAM;AACnB,WAAO,QAAQ,IAAI,+BAA+B;AAElD,YAAQ,OAAO,QAAQ;AAAA,EACzB;AACF;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { InlineConfig, PluginOption, Plugin } from 'vite';
2
- import { I as Integration } from '../base-IRZo3zgK.js';
2
+ import { I as Integration } from '../base-DT67T5pi.js';
3
3
  import { AstroIntegration } from 'astro';
4
4
 
5
5
  type TestingDefineConfig = Omit<InlineConfig, 'plugins' | 'test'> & {
@@ -3,11 +3,11 @@ import {
3
3
  } from "../chunk-E4LB75JN.js";
4
4
  import {
5
5
  registerTestingIntegrationsForRoot
6
- } from "../chunk-4SWPVM6R.js";
6
+ } from "../chunk-WUTCMEF5.js";
7
7
  import {
8
8
  importAstroConfig
9
- } from "../chunk-DNGQBPT7.js";
10
- import "../chunk-PJEDXZVN.js";
9
+ } from "../chunk-PUTCAN6X.js";
10
+ import "../chunk-7YBE4TTI.js";
11
11
  import "../chunk-G3PMV62Z.js";
12
12
 
13
13
  // ../../../node_modules/vitest/dist/config.js
package/package.json CHANGED
@@ -1,7 +1,10 @@
1
1
  {
2
2
  "name": "@storybook-astro/framework",
3
- "version": "1.2.0",
3
+ "version": "1.3.0-canary.1",
4
4
  "description": "Community-supported Storybook framework for Astro 5 & 6 components",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
5
8
  "type": "module",
6
9
  "license": "MIT",
7
10
  "repository": {
@@ -25,64 +28,31 @@
25
28
  ],
26
29
  "exports": {
27
30
  ".": {
28
- "types": "./src/index.ts",
31
+ "types": "./dist/index.d.ts",
29
32
  "import": "./dist/index.js"
30
33
  },
31
34
  "./integrations": {
32
- "types": "./src/integrations/index.ts",
35
+ "types": "./dist/integrations/index.d.ts",
33
36
  "import": "./dist/integrations/index.js"
34
37
  },
35
38
  "./testing": {
36
- "types": "./src/testing.ts",
39
+ "types": "./dist/testing.d.ts",
37
40
  "import": "./dist/testing.js"
38
41
  },
39
42
  "./vitest": {
40
- "types": "./src/vitest/index.ts",
43
+ "types": "./dist/vitest/index.d.ts",
41
44
  "import": "./dist/vitest/index.js"
42
45
  },
43
- "./node": {
44
- "types": "./src/node/index.ts",
45
- "import": "./dist/node/index.js"
46
- },
47
46
  "./preset": {
48
- "types": "./preset.ts",
47
+ "types": "./dist/preset.d.ts",
49
48
  "import": "./dist/preset.js"
50
49
  },
51
- "./package.json": "./package.json",
52
- "./*": "./src/*"
53
- },
54
- "publishConfig": {
55
- "exports": {
56
- ".": {
57
- "types": "./src/index.ts",
58
- "import": "./dist/index.js"
59
- },
60
- "./integrations": {
61
- "types": "./src/integrations/index.ts",
62
- "import": "./dist/integrations/index.js"
63
- },
64
- "./testing": {
65
- "types": "./src/testing.ts",
66
- "import": "./dist/testing.js"
67
- },
68
- "./vitest": {
69
- "types": "./src/vitest/index.ts",
70
- "import": "./dist/vitest/index.js"
71
- },
72
- "./node": {
73
- "types": "./src/node/index.ts",
74
- "import": "./dist/node/index.js"
75
- },
76
- "./preset": {
77
- "types": "./preset.ts",
78
- "import": "./dist/preset.js"
79
- },
80
- "./package.json": "./package.json",
81
- "./*": "./src/*"
82
- }
50
+ "./package.json": "./package.json"
83
51
  },
84
52
  "scripts": {
85
53
  "build": "tsup",
54
+ "dev": "tsup --watch --no-clean",
55
+ "lint": "eslint .",
86
56
  "prepublishOnly": "tsup"
87
57
  },
88
58
  "devDependencies": {
@@ -97,6 +67,7 @@
97
67
  "@vitest/coverage-v8": "4.0.18",
98
68
  "alpinejs": "^3.14.9",
99
69
  "astro": "^5.6.1 || ^6.0.0",
70
+ "eslint": "^9.39.2",
100
71
  "storybook-solidjs": "^1.0.0-beta.7",
101
72
  "tsup": "^8.5.1",
102
73
  "vite-plugin-solid": "^2.11.10",
@@ -167,7 +138,7 @@
167
138
  }
168
139
  },
169
140
  "dependencies": {
170
- "@storybook-astro/renderer": "1.2.0",
141
+ "@storybook-astro/renderer": "1.3.0-canary.1",
171
142
  "hono": "^4.11.12",
172
143
  "sanitize-html": "^2.17.0",
173
144
  "vite": "^6.4.1 || ^7.0.0 || ^8.0.0"
@@ -0,0 +1,57 @@
1
+ export function ensureAstroPassthroughImageService() {
2
+ if (!globalThis.astroAsset) {
3
+ (globalThis as Record<string, unknown>).astroAsset = {};
4
+ }
5
+
6
+ (globalThis.astroAsset as Record<string, unknown>).imageService = {
7
+ propertiesToHash: ['src'],
8
+ validateOptions(options: Record<string, unknown>) {
9
+ return options;
10
+ },
11
+ getURL(options: { src: unknown }) {
12
+ const src = options.src;
13
+
14
+ if (
15
+ src != null &&
16
+ typeof src === 'object' &&
17
+ 'src' in src &&
18
+ typeof (src as Record<string, unknown>).src === 'string'
19
+ ) {
20
+ return (src as Record<string, unknown>).src as string;
21
+ }
22
+
23
+ return typeof src === 'string' ? src : '';
24
+ },
25
+ getHTMLAttributes(options: Record<string, unknown>) {
26
+ const {
27
+ src,
28
+ width,
29
+ height,
30
+ format,
31
+ quality,
32
+ densities,
33
+ widths,
34
+ formats,
35
+ layout,
36
+ priority,
37
+ fit,
38
+ position,
39
+ background,
40
+ ...attrs
41
+ } = options;
42
+ const srcObject =
43
+ src != null && typeof src === 'object' ? (src as Record<string, unknown>) : null;
44
+
45
+ return {
46
+ ...attrs,
47
+ width: width ?? srcObject?.width,
48
+ height: height ?? srcObject?.height,
49
+ loading: (attrs.loading as string | undefined) ?? 'lazy',
50
+ decoding: (attrs.decoding as string | undefined) ?? 'async'
51
+ };
52
+ },
53
+ getSrcSet() {
54
+ return [];
55
+ }
56
+ };
57
+ }