@storybook-astro/framework 1.2.0 → 1.3.0-canary.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{base-IRZo3zgK.d.ts → base-DT67T5pi.d.ts} +1 -0
- package/dist/{chunk-T7NWIO5S.js → chunk-2EABPTOY.js} +5 -5
- package/dist/{chunk-PJEDXZVN.js → chunk-7YBE4TTI.js} +2 -1
- package/dist/chunk-7YBE4TTI.js.map +1 -0
- package/dist/{chunk-POHTFYST.js → chunk-AYYMNFI6.js} +104 -6
- package/dist/chunk-AYYMNFI6.js.map +1 -0
- package/dist/{chunk-OUEDTRBO.js → chunk-B454DGX6.js} +259 -67
- package/dist/chunk-B454DGX6.js.map +1 -0
- package/dist/chunk-B5HHF6FC.js +116 -0
- package/dist/chunk-B5HHF6FC.js.map +1 -0
- package/dist/chunk-CU57AJUW.js +1402 -0
- package/dist/chunk-CU57AJUW.js.map +1 -0
- package/dist/{chunk-DNGQBPT7.js → chunk-PUTCAN6X.js} +5 -2
- package/dist/{chunk-DNGQBPT7.js.map → chunk-PUTCAN6X.js.map} +1 -1
- package/dist/{chunk-4SWPVM6R.js → chunk-WUTCMEF5.js} +2 -2
- package/dist/index.d.ts +17 -7
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/integrations/index.d.ts +2 -1
- package/dist/integrations/index.js +1 -1
- package/dist/middleware.js +18 -131
- package/dist/middleware.js.map +1 -1
- package/dist/{types-C-jan6Px.d.ts → preset-BvgHg2of.d.ts} +8 -11
- package/dist/preset.d.ts +2 -10
- package/dist/preset.js +5 -4
- package/dist/renderer/renderer-dev.js +62 -0
- package/dist/renderer/renderer-dev.js.map +1 -0
- package/dist/renderer/renderer-server.js +92 -0
- package/dist/renderer/renderer-server.js.map +1 -0
- package/dist/renderer/renderer-static.js +54 -0
- package/dist/renderer/renderer-static.js.map +1 -0
- package/dist/testing.js +12 -11
- package/dist/testing.js.map +1 -1
- package/dist/{viteStorybookAstroMiddlewarePlugin-2EFKTECT.js → viteStorybookAstroMiddlewarePlugin-UB6ZLJ4B.js} +4 -3
- package/dist/vitest/global-setup.js +6 -5
- package/dist/vitest/global-setup.js.map +1 -1
- package/dist/vitest/index.d.ts +1 -1
- package/dist/vitest/index.js +3 -3
- package/package.json +14 -43
- package/src/astroImageService.ts +57 -0
- package/src/astroRenderHandler.ts +205 -0
- package/src/importAstroConfig.ts +1 -1
- package/src/index.ts +2 -0
- package/src/integrations/alpine.ts +1 -0
- package/src/integrations/base.ts +6 -0
- package/src/lib/revive-dates.test.ts +106 -0
- package/src/lib/revive-dates.ts +51 -0
- package/src/middleware.ts +29 -200
- package/src/module-mocks.ts +153 -5
- package/src/preset.ts +38 -8
- package/src/productionRenderRuntime.ts +187 -0
- package/src/rules.test.ts +52 -4
- package/src/rules.ts +54 -7
- package/src/server/index.ts +101 -31
- package/src/storyRulesRuntime.ts +34 -0
- package/src/storySsrVite.ts +240 -0
- package/src/types.ts +0 -9
- package/src/virtual.d.ts +17 -3
- package/src/vite/{astroFilesVirtualModulePlugin.ts → astroFilesPlugin.ts} +4 -4
- package/src/vite/sanitizeConfigPlugin.ts +18 -0
- package/src/vite/{storybookAstroServerAuthConfigVirtualModulePlugin.test.ts → serverAuthPlugin.test.ts} +7 -10
- package/src/vite/{storybookAstroServerAuthConfigVirtualModulePlugin.ts → serverAuthPlugin.ts} +6 -9
- package/src/vite/serverRuntimePlugin.ts +109 -0
- package/src/vite/{storybookAstroRulesConfigVirtualModulePlugin.ts → storyRulesPlugin.ts} +6 -7
- package/src/vite/{createVirtualModulePlugin.test.ts → virtualModulePlugin.test.ts} +5 -5
- package/src/vite/{createVirtualModulePlugin.ts → virtualModulePlugin.ts} +2 -2
- package/src/viteAstroContainerRenderersPlugin.ts +72 -2
- package/src/vitePluginAstroBuildPrerender.ts +75 -646
- package/src/vitePluginAstroBuildServer.ts +217 -165
- package/src/vitePluginAstroBuildShared.test.ts +87 -0
- package/src/vitePluginAstroBuildShared.ts +465 -0
- package/src/vitePluginStoryModuleMocks.ts +29 -0
- package/src/viteStorybookAstroMiddlewarePlugin.ts +8 -0
- package/src/viteStorybookAstroRendererPlugin.ts +13 -6
- package/src/viteStorybookRendererFallbackPlugin.ts +2 -2
- package/dist/chunk-OUEDTRBO.js.map +0 -1
- package/dist/chunk-PBISP7PA.js +0 -1137
- package/dist/chunk-PBISP7PA.js.map +0 -1
- package/dist/chunk-PJEDXZVN.js.map +0 -1
- package/dist/chunk-POHTFYST.js.map +0 -1
- package/dist/node/index.d.ts +0 -10
- package/dist/node/index.js +0 -10
- package/dist/node/index.js.map +0 -1
- package/src/vite/storybookAstroSanitizationConfigVirtualModulePlugin.ts +0 -21
- /package/dist/{chunk-T7NWIO5S.js.map → chunk-2EABPTOY.js.map} +0 -0
- /package/dist/{chunk-4SWPVM6R.js.map → chunk-WUTCMEF5.js.map} +0 -0
- /package/dist/{viteStorybookAstroMiddlewarePlugin-2EFKTECT.js.map → viteStorybookAstroMiddlewarePlugin-UB6ZLJ4B.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StorybookConfig as StorybookConfig$1, CompatibleString, Options } from 'storybook/internal/types';
|
|
2
2
|
import { InlineConfig } from 'vite';
|
|
3
|
-
import { I as Integration } from './base-
|
|
3
|
+
import { I as Integration } from './base-DT67T5pi.js';
|
|
4
4
|
import { IOptions } from 'sanitize-html';
|
|
5
5
|
|
|
6
6
|
type SanitizationOptions = {
|
|
@@ -41,15 +41,6 @@ type StaticFrameworkOptions = BaseFrameworkOptions & {
|
|
|
41
41
|
renderMode: 'static';
|
|
42
42
|
storyRules?: StoryRulesOptions;
|
|
43
43
|
server?: never;
|
|
44
|
-
/**
|
|
45
|
-
* Additional source directories (relative to `resolveFrom`) to scan for
|
|
46
|
-
* hydratable client components (JSX/TSX/Vue/Svelte). Use this when stories
|
|
47
|
-
* reference components that live outside the default `src/components` scan
|
|
48
|
-
* root — for example, workspace packages included in the `stories` globs.
|
|
49
|
-
*
|
|
50
|
-
* @example ['../../packages/components/src']
|
|
51
|
-
*/
|
|
52
|
-
componentRoots?: string[];
|
|
53
44
|
};
|
|
54
45
|
type FrameworkOptions = ServerFrameworkOptions | StaticFrameworkOptions;
|
|
55
46
|
type StorybookConfigFramework = {
|
|
@@ -64,4 +55,10 @@ type StorybookConfigVite = {
|
|
|
64
55
|
};
|
|
65
56
|
type StorybookConfig = Omit<StorybookConfig$1, 'framework'> & StorybookConfigFramework & StorybookConfigVite;
|
|
66
57
|
|
|
67
|
-
|
|
58
|
+
declare const core: {
|
|
59
|
+
builder: string;
|
|
60
|
+
renderer: string;
|
|
61
|
+
};
|
|
62
|
+
declare const viteFinal: StorybookConfigVite['viteFinal'];
|
|
63
|
+
|
|
64
|
+
export { type FrameworkOptions as F, type RenderStoryInput as R, type SanitizationOptions as S, type RenderMode as a, type ServerBuildOptions as b, type StoryRulesOptions as c, type StorybookConfig as d, core as e, viteFinal as v };
|
package/dist/preset.d.ts
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
export { e as core, v as viteFinal } from './preset-BvgHg2of.js';
|
|
2
2
|
import 'storybook/internal/types';
|
|
3
3
|
import 'vite';
|
|
4
|
-
import './base-
|
|
4
|
+
import './base-DT67T5pi.js';
|
|
5
5
|
import 'astro';
|
|
6
6
|
import 'sanitize-html';
|
|
7
|
-
|
|
8
|
-
declare const core: {
|
|
9
|
-
builder: string;
|
|
10
|
-
renderer: string;
|
|
11
|
-
};
|
|
12
|
-
declare const viteFinal: StorybookConfigVite['viteFinal'];
|
|
13
|
-
|
|
14
|
-
export { core, viteFinal };
|
package/dist/preset.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
core,
|
|
3
3
|
viteFinal
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-OUEDTRBO.js";
|
|
6
|
-
import "./chunk-POHTFYST.js";
|
|
4
|
+
} from "./chunk-CU57AJUW.js";
|
|
7
5
|
import "./chunk-E4LB75JN.js";
|
|
8
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-B454DGX6.js";
|
|
7
|
+
import "./chunk-AYYMNFI6.js";
|
|
8
|
+
import "./chunk-PUTCAN6X.js";
|
|
9
|
+
import "./chunk-B5HHF6FC.js";
|
|
9
10
|
import "./chunk-G3PMV62Z.js";
|
|
10
11
|
export {
|
|
11
12
|
core,
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import "../chunk-G3PMV62Z.js";
|
|
2
|
+
|
|
3
|
+
// src/renderer/renderer-dev.ts
|
|
4
|
+
var pendingMessages = /* @__PURE__ */ new Map();
|
|
5
|
+
var ASTRO_SERVER_UNAVAILABLE_ERROR_NAME = "AstroRenderServerUnavailableError";
|
|
6
|
+
async function render(data, timeoutMs = 5e3) {
|
|
7
|
+
const id = crypto.randomUUID();
|
|
8
|
+
const promise = new Promise((resolve, reject) => {
|
|
9
|
+
const timeoutId = setTimeout(() => {
|
|
10
|
+
pendingMessages.delete(id);
|
|
11
|
+
const error = new Error(
|
|
12
|
+
`Unable to reach Astro rendering server. No render response was received within ${timeoutMs}ms.`
|
|
13
|
+
);
|
|
14
|
+
error.name = ASTRO_SERVER_UNAVAILABLE_ERROR_NAME;
|
|
15
|
+
reject(error);
|
|
16
|
+
}, timeoutMs);
|
|
17
|
+
pendingMessages.set(id, { resolve, reject, timeoutId });
|
|
18
|
+
});
|
|
19
|
+
import.meta.hot?.send("astro:render:request", {
|
|
20
|
+
...data,
|
|
21
|
+
id
|
|
22
|
+
});
|
|
23
|
+
return promise;
|
|
24
|
+
}
|
|
25
|
+
function init() {
|
|
26
|
+
import.meta.hot?.on("vite:afterUpdate", (payload) => {
|
|
27
|
+
if (payload.updates.some((update) => isAstroStyleUpdate(update.path))) {
|
|
28
|
+
applyStyles();
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
import.meta.hot?.on("astro:render:response", (data) => {
|
|
32
|
+
if (!data.id || !pendingMessages.has(data.id)) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const pendingMessage = pendingMessages.get(data.id);
|
|
36
|
+
if (!pendingMessage) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
clearTimeout(pendingMessage.timeoutId);
|
|
40
|
+
pendingMessages.delete(data.id);
|
|
41
|
+
pendingMessage.resolve(data);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function applyStyles() {
|
|
45
|
+
Array.from(document.querySelectorAll("style[data-vite-dev-id]")).filter((element) => /__vite__updateStyle/.test(element.innerHTML)).forEach((element) => {
|
|
46
|
+
const script = document.createElement("script");
|
|
47
|
+
script.type = "module";
|
|
48
|
+
const safeScriptContent = element.innerHTML.replaceAll("import.meta.hot.accept(", "import.meta.hot?.accept(").replaceAll("import.meta.hot.prune(", "import.meta.hot?.prune(");
|
|
49
|
+
script.appendChild(document.createTextNode(safeScriptContent));
|
|
50
|
+
document.head.appendChild(script);
|
|
51
|
+
document.head.removeChild(script);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function isAstroStyleUpdate(path) {
|
|
55
|
+
return /\.astro\?astro&type=style&index=\d+&lang\.(css|scss|sass|less|stylus)$/.test(path);
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
applyStyles,
|
|
59
|
+
init,
|
|
60
|
+
render
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=renderer-dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/renderer/renderer-dev.ts"],"sourcesContent":["import type {\n RenderComponentInput,\n RenderPromise,\n RenderResponseMessage\n} from '@storybook-astro/renderer/types';\n\nconst pendingMessages = new Map<string, RenderPromise>();\nconst ASTRO_SERVER_UNAVAILABLE_ERROR_NAME = 'AstroRenderServerUnavailableError';\n\nexport async function render(data: RenderComponentInput, timeoutMs = 5000) {\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n const id = crypto.randomUUID();\n\n const promise = new Promise<RenderResponseMessage['data']>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n pendingMessages.delete(id);\n\n const error = new Error(\n `Unable to reach Astro rendering server. No render response was received within ${timeoutMs}ms.`\n );\n\n error.name = ASTRO_SERVER_UNAVAILABLE_ERROR_NAME;\n\n reject(error);\n }, timeoutMs);\n\n pendingMessages.set(id, { resolve, reject, timeoutId });\n });\n\n import.meta.hot?.send('astro:render:request', {\n ...data,\n id\n });\n\n return promise;\n}\n\nexport function init() {\n import.meta.hot?.on('vite:afterUpdate', (payload) => {\n if (payload.updates.some((update) => isAstroStyleUpdate(update.path))) {\n applyStyles();\n }\n });\n\n import.meta.hot?.on('astro:render:response', (data: RenderResponseMessage['data']) => {\n if (!data.id || !pendingMessages.has(data.id)) {\n return;\n }\n\n const pendingMessage = pendingMessages.get(data.id);\n\n if (!pendingMessage) {\n return;\n }\n\n clearTimeout(pendingMessage.timeoutId);\n pendingMessages.delete(data.id);\n pendingMessage.resolve(data);\n });\n}\n\nexport function applyStyles() {\n Array.from(document.querySelectorAll('style[data-vite-dev-id]'))\n .filter((element) => /__vite__updateStyle/.test(element.innerHTML))\n .forEach((element) => {\n const script = document.createElement('script');\n\n script.type = 'module';\n\n const safeScriptContent = element.innerHTML\n .replaceAll('import.meta.hot.accept(', 'import.meta.hot?.accept(')\n .replaceAll('import.meta.hot.prune(', 'import.meta.hot?.prune(');\n\n script.appendChild(document.createTextNode(safeScriptContent));\n document.head.appendChild(script);\n document.head.removeChild(script);\n });\n}\n\nfunction isAstroStyleUpdate(path: string): boolean {\n return /\\.astro\\?astro&type=style&index=\\d+&lang\\.(css|scss|sass|less|stylus)$/.test(path);\n}\n"],"mappings":";;;AAMA,IAAM,kBAAkB,oBAAI,IAA2B;AACvD,IAAM,sCAAsC;AAE5C,eAAsB,OAAO,MAA4B,YAAY,KAAM;AAEzE,QAAM,KAAK,OAAO,WAAW;AAE7B,QAAM,UAAU,IAAI,QAAuC,CAAC,SAAS,WAAW;AAC9E,UAAM,YAAY,WAAW,MAAM;AACjC,sBAAgB,OAAO,EAAE;AAEzB,YAAM,QAAQ,IAAI;AAAA,QAChB,kFAAkF,SAAS;AAAA,MAC7F;AAEA,YAAM,OAAO;AAEb,aAAO,KAAK;AAAA,IACd,GAAG,SAAS;AAEZ,oBAAgB,IAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,CAAC;AAAA,EACxD,CAAC;AAED,cAAY,KAAK,KAAK,wBAAwB;AAAA,IAC5C,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,SAAS,OAAO;AACrB,cAAY,KAAK,GAAG,oBAAoB,CAAC,YAAY;AACnD,QAAI,QAAQ,QAAQ,KAAK,CAAC,WAAW,mBAAmB,OAAO,IAAI,CAAC,GAAG;AACrE,kBAAY;AAAA,IACd;AAAA,EACF,CAAC;AAED,cAAY,KAAK,GAAG,yBAAyB,CAAC,SAAwC;AACpF,QAAI,CAAC,KAAK,MAAM,CAAC,gBAAgB,IAAI,KAAK,EAAE,GAAG;AAC7C;AAAA,IACF;AAEA,UAAM,iBAAiB,gBAAgB,IAAI,KAAK,EAAE;AAElD,QAAI,CAAC,gBAAgB;AACnB;AAAA,IACF;AAEA,iBAAa,eAAe,SAAS;AACrC,oBAAgB,OAAO,KAAK,EAAE;AAC9B,mBAAe,QAAQ,IAAI;AAAA,EAC7B,CAAC;AACH;AAEO,SAAS,cAAc;AAC5B,QAAM,KAAK,SAAS,iBAAiB,yBAAyB,CAAC,EAC5D,OAAO,CAAC,YAAY,sBAAsB,KAAK,QAAQ,SAAS,CAAC,EACjE,QAAQ,CAAC,YAAY;AACpB,UAAM,SAAS,SAAS,cAAc,QAAQ;AAE9C,WAAO,OAAO;AAEd,UAAM,oBAAoB,QAAQ,UAC/B,WAAW,2BAA2B,0BAA0B,EAChE,WAAW,0BAA0B,yBAAyB;AAEjE,WAAO,YAAY,SAAS,eAAe,iBAAiB,CAAC;AAC7D,aAAS,KAAK,YAAY,MAAM;AAChC,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC,CAAC;AACL;AAEA,SAAS,mBAAmB,MAAuB;AACjD,SAAO,yEAAyE,KAAK,IAAI;AAC3F;","names":[]}
|
|
@@ -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-
|
|
13
|
-
import
|
|
14
|
-
|
|
15
|
-
|
|
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-
|
|
216
|
+
const { createViteServer } = await import("./viteStorybookAstroMiddlewarePlugin-UB6ZLJ4B.js");
|
|
216
217
|
const integrations = getTestingIntegrations(resolveFrom);
|
|
217
218
|
astroSsrViteServerPromises.set(
|
|
218
219
|
resolveFrom,
|
package/dist/testing.js.map
CHANGED
|
@@ -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-
|
|
5
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
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":"
|
|
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":[]}
|
package/dist/vitest/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { InlineConfig, PluginOption, Plugin } from 'vite';
|
|
2
|
-
import { I as Integration } from '../base-
|
|
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'> & {
|
package/dist/vitest/index.js
CHANGED
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
} from "../chunk-E4LB75JN.js";
|
|
4
4
|
import {
|
|
5
5
|
registerTestingIntegrationsForRoot
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-WUTCMEF5.js";
|
|
7
7
|
import {
|
|
8
8
|
importAstroConfig
|
|
9
|
-
} from "../chunk-
|
|
10
|
-
import "../chunk-
|
|
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.
|
|
3
|
+
"version": "1.3.0-canary.2",
|
|
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": "./
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
29
32
|
"import": "./dist/index.js"
|
|
30
33
|
},
|
|
31
34
|
"./integrations": {
|
|
32
|
-
"types": "./
|
|
35
|
+
"types": "./dist/integrations/index.d.ts",
|
|
33
36
|
"import": "./dist/integrations/index.js"
|
|
34
37
|
},
|
|
35
38
|
"./testing": {
|
|
36
|
-
"types": "./
|
|
39
|
+
"types": "./dist/testing.d.ts",
|
|
37
40
|
"import": "./dist/testing.js"
|
|
38
41
|
},
|
|
39
42
|
"./vitest": {
|
|
40
|
-
"types": "./
|
|
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.
|
|
141
|
+
"@storybook-astro/renderer": "1.3.0-canary.2",
|
|
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"
|