@analogjs/vite-plugin-nitro 2.8.0-beta.9 → 2.8.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/lib/build-server.js +9 -0
- package/src/lib/build-server.js.map +1 -1
- package/src/lib/utils/i18n-prerender.d.ts +1 -0
- package/src/lib/utils/i18n-prerender.js +11 -9
- package/src/lib/utils/i18n-prerender.js.map +1 -1
- package/src/lib/utils/renderers.d.ts +2 -1
- package/src/lib/utils/renderers.js +34 -12
- package/src/lib/utils/renderers.js.map +1 -1
package/package.json
CHANGED
package/src/lib/build-server.js
CHANGED
|
@@ -5,6 +5,7 @@ import { dirname, join } from 'node:path';
|
|
|
5
5
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
6
6
|
import { addPostRenderingHooks } from './hooks/post-rendering-hook.js';
|
|
7
7
|
import { validateI18nWorkers } from './utils/i18n-workers.js';
|
|
8
|
+
import { createSsrStreamRenderer } from './utils/renderers.js';
|
|
8
9
|
export async function buildServer(options, nitroConfig = {}, routeSourceFiles, i18nWorkers = false) {
|
|
9
10
|
if (i18nWorkers && options?.i18n) {
|
|
10
11
|
validateI18nWorkers(options, nitroConfig);
|
|
@@ -37,6 +38,14 @@ export async function buildServer(options, nitroConfig = {}, routeSourceFiles, i
|
|
|
37
38
|
...nitroConfig,
|
|
38
39
|
});
|
|
39
40
|
try {
|
|
41
|
+
if (options?.experimental?.streaming) {
|
|
42
|
+
nitro.hooks.hook('prerender:init', (renderer) => {
|
|
43
|
+
renderer.options.virtual = {
|
|
44
|
+
...renderer.options.virtual,
|
|
45
|
+
'#ANALOG_SSR_RENDERER': createSsrStreamRenderer(true),
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
}
|
|
40
49
|
if (options?.prerender?.postRenderingHooks) {
|
|
41
50
|
addPostRenderingHooks(nitro, options.prerender.postRenderingHooks);
|
|
42
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-server.js","sourceRoot":"","sources":["../../../../../packages/vite-plugin-nitro/src/lib/build-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"build-server.js","sourceRoot":"","sources":["../../../../../packages/vite-plugin-nitro/src/lib/build-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAiB,EACjB,cAA2B,EAAE,EAC7B,gBAAyC,EACzC,WAAW,GAAG,KAAK;IAEnB,IAAI,WAAW,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;QACjC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1C,WAAW,GAAG;YACZ,GAAG,WAAW;YACd,KAAK,EAAE,aAAa,CAClB,IAAI,GAAG,CAAC,mCAAmC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAC9D;YACD,SAAS,EAAE;gBACT,GAAG,WAAW,CAAC,SAAS;gBACxB,MAAM,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,kBAAkB,CAAC;aACvE;YACD,OAAO,EAAE;gBACP,GAAG,WAAW,CAAC,OAAO;gBACtB,wBAAwB,EAAE,mCAAmC;gBAC7D,0BAA0B,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;gBACtE,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;aAC1D;YACD,OAAO,EAAE;gBACP,GAAG,WAAW,CAAC,OAAO;gBACtB,sBAAsB,EAAE,kBAAkB,IAAI,CAAC,SAAS,CAAC;oBACvD,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO;oBAC7B,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa;oBACzC,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,GAAG;iBACpC,CAAC,EAAE;aACL;SACF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;QAC9B,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACnC,GAAG,WAAW;KACf,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,IAAI,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;YACrC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC9C,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG;oBACzB,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO;oBAC3B,sBAAsB,EAAE,uBAAuB,CAAC,IAAI,CAAC;iBACtD,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;YAC3C,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QACrB,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE9B,IACE,OAAO,EAAE,GAAG;YACZ,WAAW,EAAE,SAAS,EAAE,MAAM;YAC9B,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC;gBAC5D,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,EAC/C,CAAC;YACD,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAEzC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAChC,4CAA4C;gBAC5C,MAAM,aAAa,GAAG,GAAG,WAAW,EAAE,MAAM,EAAE,SAAS,cAAc,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAEnG,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC9B,UAAU,CAAC,aAAa,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IACE,WAAW,EAAE,SAAS,EAAE,MAAM;YAC9B,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAC1C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,IAAI,gBAAmD,CAAC;YACxD,IAAI,WAA8B,CAAC;YACnC,MAAM,MAAM,GAAG,WAAW;gBACxB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,EAAE;oBAC9C,WAAW,GAAG,QAAQ,CAAC;oBACvB,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;wBACzC,MAAM,QAAQ,GACZ,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,CAAC;wBACxD,MAAM,KAAK,GAAG,IAAI,CAChB,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EACjC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CACtD,CAAC;wBACF,gFAAgF;wBAChF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;wBACxD,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;oBAC9C,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC;gBACJ,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;oBAAS,CAAC;gBACT,MAAM,EAAE,EAAE,CAAC;gBACX,IAAI,CAAC;oBACH,MAAM,gBAAgB,EAAE,EAAE,CAAC;gBAC7B,CAAC;wBAAS,CAAC;oBACT,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,gBAAgB,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,MAAM,SAAS,GAAG,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC;YACjD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;YACJ,CAAC;YAED,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAChE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC;gBAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;gBAEtC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5C,CAAC;gBAED,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -8,6 +8,7 @@ import { I18nPrerenderOptions } from '../options.js';
|
|
|
8
8
|
*
|
|
9
9
|
* The default locale's routes are included both with and without the prefix
|
|
10
10
|
* so that `/about` and `/en/about` both render.
|
|
11
|
+
* Routes that already have a configured locale prefix are kept as-is.
|
|
11
12
|
*
|
|
12
13
|
* @param routes - The original routes to expand
|
|
13
14
|
* @param i18n - The i18n prerender configuration
|
|
@@ -6,30 +6,32 @@
|
|
|
6
6
|
*
|
|
7
7
|
* The default locale's routes are included both with and without the prefix
|
|
8
8
|
* so that `/about` and `/en/about` both render.
|
|
9
|
+
* Routes that already have a configured locale prefix are kept as-is.
|
|
9
10
|
*
|
|
10
11
|
* @param routes - The original routes to expand
|
|
11
12
|
* @param i18n - The i18n prerender configuration
|
|
12
13
|
* @returns Expanded routes with locale prefixes
|
|
13
14
|
*/
|
|
14
15
|
export function expandRoutesWithLocales(routes, i18n) {
|
|
15
|
-
const expanded =
|
|
16
|
+
const expanded = new Set();
|
|
16
17
|
for (const route of routes) {
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
// API routes and explicitly localized routes don't need locale prefixes.
|
|
19
|
+
const firstSegment = route.split('/').filter(Boolean)[0];
|
|
20
|
+
if (route.includes('/_analog/') ||
|
|
21
|
+
route.startsWith('/api/') ||
|
|
22
|
+
i18n.locales.includes(firstSegment)) {
|
|
23
|
+
expanded.add(route);
|
|
20
24
|
continue;
|
|
21
25
|
}
|
|
22
26
|
for (const locale of i18n.locales) {
|
|
23
27
|
const prefix = `/${locale}`;
|
|
24
28
|
const localizedRoute = route === '/' ? prefix : `${prefix}${route}`;
|
|
25
|
-
expanded.
|
|
29
|
+
expanded.add(localizedRoute);
|
|
26
30
|
}
|
|
27
31
|
// Keep the unprefixed route for the default locale
|
|
28
|
-
|
|
29
|
-
expanded.push(route);
|
|
30
|
-
}
|
|
32
|
+
expanded.add(route);
|
|
31
33
|
}
|
|
32
|
-
return expanded;
|
|
34
|
+
return [...expanded];
|
|
33
35
|
}
|
|
34
36
|
/**
|
|
35
37
|
* Creates a post-rendering hook that injects the `lang` attribute
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n-prerender.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/i18n-prerender.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"i18n-prerender.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/i18n-prerender.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAgB,EAChB,IAA0B;IAE1B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,yEAAyE;QACzE,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IACE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC3B,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EACnC,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,cAAc,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC;YACpE,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;QAED,mDAAmD;QACnD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAA0B;IAE1B,OAAO,KAAK,EAAE,KAAqB,EAAE,EAAE;QACrC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,iDAAiD;QACjD,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAa,EACb,IAA0B;IAE1B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEjC,IAAI,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACxD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC,aAAa,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACtD,kCAAkC;IAClC,IAAI,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,OAAO,CACjB,0CAA0C,EAC1C,WAAW,MAAM,GAAG,CACrB,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,MAAM,GAAG,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare const ssrRenderer = "\nimport { eventHandler, getResponseHeader } from 'h3';\n// @ts-ignore\nimport renderer from '#analog/ssr';\n// @ts-ignore\nimport template from '#analog/index';\n\nexport default eventHandler(async (event) => {\n const noSSR = getResponseHeader(event, 'x-analog-no-ssr');\n\n if (noSSR === 'true') {\n return template;\n }\n\n const html = await renderer(event.node.req.url, template, {\n req: event.node.req,\n res: event.node.res,\n });\n\n return html;\n});";
|
|
2
|
-
export declare const ssrStreamRenderer
|
|
2
|
+
export declare const ssrStreamRenderer: string;
|
|
3
|
+
export declare function createSsrStreamRenderer(prerender?: boolean): string;
|
|
3
4
|
export declare const clientRenderer = "\nimport { eventHandler } from 'h3';\n\n// @ts-ignore\nimport template from '#analog/index';\n\nexport default eventHandler(async () => {\n return template;\n});\n";
|
|
4
5
|
export declare const apiMiddleware = "\nimport { createError, eventHandler, proxyRequest } from 'h3';\nimport { useRuntimeConfig } from '#imports';\n\nexport default eventHandler(async (event) => {\n const prefix = useRuntimeConfig().prefix;\n const apiPrefix = `${prefix}/${useRuntimeConfig().apiPrefix}`;\n\n const url = event.node.req.url || '';\n\n // only match the prefix on a path boundary, otherwise a URL such as\n // '/apihttp://internal-host' would pass startsWith() and be forwarded verbatim\n if (\n url === apiPrefix ||\n url.startsWith(`${apiPrefix}/`) ||\n url.startsWith(`${apiPrefix}?`)\n ) {\n let reqUrl = url.slice(apiPrefix.length);\n if (reqUrl === '' || reqUrl.startsWith('?')) {\n reqUrl = `/${reqUrl}`;\n }\n\n // reject absolute and protocol-relative targets to prevent SSRF\n if (!reqUrl.startsWith('/') || reqUrl.startsWith('//')) {\n throw createError({ statusCode: 400, statusMessage: 'Invalid API route' });\n }\n\n if (\n event.node.req.method === 'GET' &&\n // in the case of XML routes, we want to proxy the request so that nitro gets the correct headers\n // and can render the XML correctly as a static asset\n !event.node.req.url?.endsWith('.xml')\n ) {\n return $fetch(reqUrl, { headers: event.node.req.headers });\n }\n\n return proxyRequest(event, reqUrl, {\n // @ts-ignore\n fetch: $fetch.native,\n });\n }\n});";
|
|
@@ -19,7 +19,9 @@ export default eventHandler(async (event) => {
|
|
|
19
19
|
|
|
20
20
|
return html;
|
|
21
21
|
});`;
|
|
22
|
-
export const ssrStreamRenderer =
|
|
22
|
+
export const ssrStreamRenderer = createSsrStreamRenderer();
|
|
23
|
+
export function createSsrStreamRenderer(prerender = false) {
|
|
24
|
+
return `
|
|
23
25
|
import { eventHandler, getResponseHeader, setResponseHeader } from 'h3';
|
|
24
26
|
// @ts-ignore
|
|
25
27
|
import renderer from '#analog/ssr';
|
|
@@ -33,21 +35,40 @@ export default eventHandler(async (event) => {
|
|
|
33
35
|
return template;
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
38
|
+
const noStreaming = ${prerender} || getResponseHeader(event, 'x-analog-no-streaming') === 'true';
|
|
39
|
+
const abort = new AbortController();
|
|
40
|
+
const response = event.node.res;
|
|
41
|
+
const cleanup = () => {
|
|
42
|
+
response.removeListener('close', disconnected);
|
|
43
|
+
response.removeListener('finish', cleanup);
|
|
44
|
+
};
|
|
45
|
+
const disconnected = () => {
|
|
46
|
+
cleanup();
|
|
47
|
+
if (!response.writableEnded) abort.abort();
|
|
48
|
+
};
|
|
49
|
+
response.once('close', disconnected);
|
|
50
|
+
response.once('finish', cleanup);
|
|
51
|
+
|
|
52
|
+
let stream;
|
|
53
|
+
try {
|
|
54
|
+
stream = await renderer(event.node.req.url, template, {
|
|
55
|
+
req: event.node.req,
|
|
56
|
+
res: response,
|
|
57
|
+
streaming: !noStreaming,
|
|
58
|
+
signal: abort.signal,
|
|
59
|
+
renderErrorsAsHtml: true,
|
|
60
|
+
});
|
|
61
|
+
} catch (error) {
|
|
62
|
+
cleanup();
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
43
65
|
|
|
44
66
|
setResponseHeader(event, 'content-type', 'text/html;charset=utf-8');
|
|
45
67
|
|
|
46
68
|
// A \`streaming: false\` route rule sets this header; renderStream then emits
|
|
47
69
|
// the buffered render() output as a single chunk. Collect it into a string so
|
|
48
70
|
// the response is a normal buffered document (content-length), not chunked.
|
|
49
|
-
|
|
50
|
-
if (noStreaming === 'true') {
|
|
71
|
+
if (noStreaming) {
|
|
51
72
|
const reader = stream.getReader();
|
|
52
73
|
const decoder = new TextDecoder();
|
|
53
74
|
let html = '';
|
|
@@ -60,10 +81,11 @@ export default eventHandler(async (event) => {
|
|
|
60
81
|
return html;
|
|
61
82
|
}
|
|
62
83
|
|
|
63
|
-
|
|
64
|
-
|
|
84
|
+
setResponseHeader(event, 'content-encoding', 'identity');
|
|
85
|
+
setResponseHeader(event, 'cache-control', 'no-store, no-transform');
|
|
65
86
|
return stream;
|
|
66
87
|
});`;
|
|
88
|
+
}
|
|
67
89
|
export const clientRenderer = `
|
|
68
90
|
import { eventHandler } from 'h3';
|
|
69
91
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/renderers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;IAoBvB,CAAC;AAEL,MAAM,CAAC,MAAM,iBAAiB,GAAG
|
|
1
|
+
{"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/renderers.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;IAoBvB,CAAC;AAEL,MAAM,CAAC,MAAM,iBAAiB,GAAG,uBAAuB,EAAE,CAAC;AAE3D,MAAM,UAAU,uBAAuB,CAAC,SAAS,GAAG,KAAK;IACvD,OAAO;;;;;;;;;;;;;;wBAce,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiD7B,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;CAS7B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAyCzB,CAAC"}
|