@analogjs/vite-plugin-nitro 2.4.0-alpha.3 → 2.4.0-beta.10
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/README.md +2 -2
- package/package.json +2 -4
- package/src/index.d.ts +1 -1
- package/src/lib/build-server.d.ts +1 -1
- package/src/lib/build-server.js +3 -30
- package/src/lib/build-server.js.map +1 -1
- package/src/lib/hooks/post-rendering-hook.d.ts +1 -1
- package/src/lib/options.d.ts +1 -1
- package/src/lib/plugins/dev-server-plugin.js +2 -4
- package/src/lib/plugins/dev-server-plugin.js.map +1 -1
- package/src/lib/plugins/page-endpoints.js +10 -33
- package/src/lib/plugins/page-endpoints.js.map +1 -1
- package/src/lib/utils/get-content-files.js +4 -1
- package/src/lib/utils/get-content-files.js.map +1 -1
- package/src/lib/utils/get-page-handlers.d.ts +1 -1
- package/src/lib/utils/get-page-handlers.js +3 -5
- package/src/lib/utils/get-page-handlers.js.map +1 -1
- package/src/lib/utils/register-dev-middleware.d.ts +32 -4
- package/src/lib/utils/register-dev-middleware.js +43 -22
- package/src/lib/utils/register-dev-middleware.js.map +1 -1
- package/src/lib/utils/renderers.d.ts +3 -42
- package/src/lib/utils/renderers.js +26 -98
- package/src/lib/utils/renderers.js.map +1 -1
- package/src/lib/vite-plugin-nitro.d.ts +1 -1
- package/src/lib/vite-plugin-nitro.js +68 -207
- package/src/lib/vite-plugin-nitro.js.map +1 -1
- package/src/lib/utils/node-web-bridge.d.ts +0 -3
- package/src/lib/utils/node-web-bridge.js +0 -50
- package/src/lib/utils/node-web-bridge.js.map +0 -1
package/README.md
CHANGED
|
@@ -81,9 +81,9 @@ and are exposed under the default `/api` prefix.
|
|
|
81
81
|
|
|
82
82
|
```ts
|
|
83
83
|
// src/server/routes/api/v1/hello
|
|
84
|
-
import {
|
|
84
|
+
import { defineEventHandler } from 'h3';
|
|
85
85
|
|
|
86
|
-
export default
|
|
86
|
+
export default defineEventHandler(() => ({ message: 'Hello World' }));
|
|
87
87
|
```
|
|
88
88
|
|
|
89
89
|
The API route can be accessed as `/api/v1/hello`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@analogjs/vite-plugin-nitro",
|
|
3
|
-
"version": "2.4.0-
|
|
3
|
+
"version": "2.4.0-beta.10",
|
|
4
4
|
"description": "A Vite plugin for adding a nitro API server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Brandon Roberts <robertsbt@gmail.com>",
|
|
@@ -30,9 +30,7 @@
|
|
|
30
30
|
"url": "https://github.com/sponsors/brandonroberts"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"
|
|
34
|
-
"h3": "2.0.1-rc.16",
|
|
35
|
-
"ofetch": "2.0.0-alpha.3",
|
|
33
|
+
"nitropack": "^2.13.1",
|
|
36
34
|
"xmlbuilder2": "^4.0.3",
|
|
37
35
|
"esbuild": "^0.27.3",
|
|
38
36
|
"radix3": "^1.1.2",
|
package/src/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { nitro } from './lib/vite-plugin-nitro.js';
|
|
2
2
|
export { Options, SitemapConfig, PrerenderRouteConfig, PrerenderContentDir, PrerenderContentFile, } from './lib/options.js';
|
|
3
|
-
declare module '
|
|
3
|
+
declare module 'nitropack' {
|
|
4
4
|
interface NitroRouteConfig {
|
|
5
5
|
ssr?: boolean;
|
|
6
6
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { NitroConfig } from 'nitropack';
|
|
2
2
|
import { Options } from './options.js';
|
|
3
3
|
export declare function buildServer(options?: Options, nitroConfig?: NitroConfig, routeSourceFiles?: Record<string, string>): Promise<void>;
|
package/src/lib/build-server.js
CHANGED
|
@@ -1,39 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { copyPublicAssets, prerender } from 'nitropack';
|
|
2
|
+
import { createNitro, build, prepare } from 'nitropack';
|
|
2
3
|
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
3
4
|
import { dirname, join } from 'node:path';
|
|
4
5
|
import { addPostRenderingHooks } from './hooks/post-rendering-hook.js';
|
|
5
|
-
function isVercelPreset(preset) {
|
|
6
|
-
return !!preset?.toLowerCase().includes('vercel');
|
|
7
|
-
}
|
|
8
|
-
function ensureVercelFunctionConfig(nitro) {
|
|
9
|
-
if (!isVercelPreset(nitro.options.preset)) {
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
const serverDir = nitro.options.output.serverDir;
|
|
13
|
-
const functionConfigPath = join(serverDir, '.vc-config.json');
|
|
14
|
-
if (existsSync(functionConfigPath)) {
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
mkdirSync(serverDir, { recursive: true });
|
|
18
|
-
writeFileSync(functionConfigPath, JSON.stringify({
|
|
19
|
-
handler: 'index.mjs',
|
|
20
|
-
launcherType: 'Nodejs',
|
|
21
|
-
shouldAddHelpers: false,
|
|
22
|
-
supportsResponseStreaming: true,
|
|
23
|
-
...nitro.options.vercel?.functions,
|
|
24
|
-
}, null, 2), 'utf8');
|
|
25
|
-
}
|
|
26
6
|
export async function buildServer(options, nitroConfig, routeSourceFiles) {
|
|
27
7
|
const nitro = await createNitro({
|
|
28
8
|
dev: false,
|
|
29
9
|
preset: process.env['BUILD_PRESET'],
|
|
30
10
|
...nitroConfig,
|
|
31
|
-
// Nitro v3 alpha prefers `rolldown` when available, but its resolver can
|
|
32
|
-
// fail rebundling the generated SSR entry under `dist/.../main.server.js`
|
|
33
|
-
// with Vite 8 / Rolldown-specific "Tsconfig not found" resolve errors.
|
|
34
|
-
// Default production server builds back to Nitro's Rollup builder unless
|
|
35
|
-
// the caller explicitly opts into a different builder.
|
|
36
|
-
builder: nitroConfig?.builder ?? 'rollup',
|
|
37
11
|
});
|
|
38
12
|
if (options?.prerender?.postRenderingHooks) {
|
|
39
13
|
addPostRenderingHooks(nitro, options.prerender.postRenderingHooks);
|
|
@@ -47,7 +21,7 @@ export async function buildServer(options, nitroConfig, routeSourceFiles) {
|
|
|
47
21
|
const indexFileExts = ['', '.br', '.gz'];
|
|
48
22
|
indexFileExts.forEach((fileExt) => {
|
|
49
23
|
// Remove the root index.html(.br|.gz) files
|
|
50
|
-
const indexFilePath =
|
|
24
|
+
const indexFilePath = `${nitroConfig?.output?.publicDir}/index.html${fileExt ? `${fileExt}` : ''}`;
|
|
51
25
|
if (existsSync(indexFilePath)) {
|
|
52
26
|
unlinkSync(indexFilePath);
|
|
53
27
|
}
|
|
@@ -75,7 +49,6 @@ export async function buildServer(options, nitroConfig, routeSourceFiles) {
|
|
|
75
49
|
if (!options?.static) {
|
|
76
50
|
console.log('Building Server...');
|
|
77
51
|
await build(nitro);
|
|
78
|
-
ensureVercelFunctionConfig(nitro);
|
|
79
52
|
}
|
|
80
53
|
await nitro.close();
|
|
81
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-server.js","sourceRoot":"","sources":["../../../../../packages/vite-plugin-nitro/src/lib/build-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build-server.js","sourceRoot":"","sources":["../../../../../packages/vite-plugin-nitro/src/lib/build-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Nitro, PrerenderRoute } from 'nitropack';
|
|
2
2
|
export declare function addPostRenderingHooks(nitro: Nitro, hooks: ((pr: PrerenderRoute) => Promise<void>)[]): void;
|
package/src/lib/options.d.ts
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
import { normalizePath, } from 'vite';
|
|
4
4
|
import { resolve } from 'node:path';
|
|
5
5
|
import { readFileSync } from 'node:fs';
|
|
6
|
+
import { createEvent, sendWebResponse } from 'h3';
|
|
6
7
|
import { createRouter as createRadixRouter, toRouteMatcher } from 'radix3';
|
|
7
8
|
import { defu } from 'defu';
|
|
8
9
|
import { registerDevServerMiddleware } from '../utils/register-dev-middleware.js';
|
|
9
|
-
import { writeWebResponseToNode } from '../utils/node-web-bridge.js';
|
|
10
10
|
export function devServerPlugin(options) {
|
|
11
11
|
const workspaceRoot = options?.workspaceRoot || process.cwd();
|
|
12
12
|
const sourceRoot = options?.sourceRoot ?? 'src';
|
|
@@ -21,7 +21,6 @@ export function devServerPlugin(options) {
|
|
|
21
21
|
root = normalizePath(resolve(workspaceRoot, config.root || '.') || '.');
|
|
22
22
|
isTest = isTest ? isTest : mode === 'test';
|
|
23
23
|
return {
|
|
24
|
-
appType: 'custom',
|
|
25
24
|
resolve: {
|
|
26
25
|
alias: {
|
|
27
26
|
'~analog/entry-server': options.entryServer || `${root}/${sourceRoot}/main.server.ts`,
|
|
@@ -55,7 +54,7 @@ export function devServerPlugin(options) {
|
|
|
55
54
|
});
|
|
56
55
|
}
|
|
57
56
|
if (result instanceof Response) {
|
|
58
|
-
|
|
57
|
+
sendWebResponse(createEvent(req, res), result);
|
|
59
58
|
return;
|
|
60
59
|
}
|
|
61
60
|
res.setHeader('Content-Type', 'text/html');
|
|
@@ -95,7 +94,6 @@ function remove_html_middlewares(server) {
|
|
|
95
94
|
'viteIndexHtmlMiddleware',
|
|
96
95
|
'vite404Middleware',
|
|
97
96
|
'viteSpaFallbackMiddleware',
|
|
98
|
-
'viteHtmlFallbackMiddleware',
|
|
99
97
|
];
|
|
100
98
|
for (let i = server.stack.length - 1; i > 0; i--) {
|
|
101
99
|
const handler = server.stack[i]?.handle;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server-plugin.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/plugins/dev-server-plugin.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,gFAAgF;AAEhF,OAAO,EAKL,aAAa,GACd,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dev-server-plugin.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/plugins/dev-server-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,24 +23,8 @@ export function pageEndpointsPlugin() {
|
|
|
23
23
|
fileExports = compiled.metafile?.outputs[key].exports;
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
-
// In h3 v2 / Nitro v3, event.node is undefined during prerendering
|
|
27
|
-
// (which uses the fetch-based pipeline, not Node.js http). We use
|
|
28
|
-
// optional chaining so that page endpoints work in both Node.js
|
|
29
|
-
// server and fetch-based prerender contexts.
|
|
30
|
-
// Nitro v3 no longer guarantees the private `nitro/deps/ofetch`
|
|
31
|
-
// subpath that older codegen relied on.
|
|
32
|
-
//
|
|
33
|
-
// Page loaders expect Nitro-style `$fetch` semantics (parsed data plus
|
|
34
|
-
// internal relative-route support), so construct a request-local fetch
|
|
35
|
-
// using public APIs:
|
|
36
|
-
// - `createFetch` from `ofetch` for `$fetch` behavior
|
|
37
|
-
// - `fetchWithEvent` from `h3` for internal Nitro request routing
|
|
38
|
-
//
|
|
39
|
-
// This avoids both unstable private Nitro imports and assumptions about
|
|
40
|
-
// a global runtime `$fetch` being available during prerender.
|
|
41
26
|
const code = `
|
|
42
|
-
import {
|
|
43
|
-
import { createFetch } from 'ofetch';
|
|
27
|
+
import { defineEventHandler } from 'h3';
|
|
44
28
|
|
|
45
29
|
${fileExports.includes('load')
|
|
46
30
|
? _code
|
|
@@ -55,24 +39,17 @@ export function pageEndpointsPlugin() {
|
|
|
55
39
|
: `
|
|
56
40
|
export const action = () => {
|
|
57
41
|
return {};
|
|
58
|
-
}
|
|
42
|
+
}
|
|
59
43
|
`}
|
|
60
44
|
|
|
61
|
-
export default
|
|
62
|
-
const serverFetch = createFetch({
|
|
63
|
-
fetch: (resource, init) => {
|
|
64
|
-
const url = resource instanceof Request ? resource.url : resource.toString();
|
|
65
|
-
return fetchWithEvent(event, url, init);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
|
|
45
|
+
export default defineEventHandler(async(event) => {
|
|
69
46
|
if (event.method === 'GET') {
|
|
70
47
|
try {
|
|
71
48
|
return await load({
|
|
72
49
|
params: event.context.params,
|
|
73
|
-
req: event.node
|
|
74
|
-
res: event.node
|
|
75
|
-
fetch:
|
|
50
|
+
req: event.node.req,
|
|
51
|
+
res: event.node.res,
|
|
52
|
+
fetch: $fetch,
|
|
76
53
|
event
|
|
77
54
|
});
|
|
78
55
|
} catch(e) {
|
|
@@ -83,15 +60,15 @@ export function pageEndpointsPlugin() {
|
|
|
83
60
|
try {
|
|
84
61
|
return await action({
|
|
85
62
|
params: event.context.params,
|
|
86
|
-
req: event.node
|
|
87
|
-
res: event.node
|
|
88
|
-
fetch:
|
|
63
|
+
req: event.node.req,
|
|
64
|
+
res: event.node.res,
|
|
65
|
+
fetch: $fetch,
|
|
89
66
|
event
|
|
90
67
|
});
|
|
91
68
|
} catch(e) {
|
|
92
69
|
console.error(\` An error occurred: \${e}\`)
|
|
93
70
|
throw e;
|
|
94
|
-
}
|
|
71
|
+
}
|
|
95
72
|
}
|
|
96
73
|
});
|
|
97
74
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-endpoints.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/plugins/page-endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,IAAI,EAAE,iDAAiD;QACvD,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,EAAU;YACvC,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACvE,MAAM,QAAQ,GAAG,SAAS,CAAC;oBACzB,KAAK,EAAE;wBACL,QAAQ,EAAE,KAAK;wBACf,UAAU,EAAE,EAAE;wBACd,MAAM,EAAE,IAAI;qBACb;oBACD,KAAK,EAAE,KAAK;oBACZ,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,SAAS;oBACnB,MAAM,EAAE,KAAK;oBACb,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;gBAEH,IAAI,WAAW,GAAa,EAAE,CAAC;gBAE/B,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;oBAC7C,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;wBAC/C,WAAW,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;oBACxD,CAAC;gBACH,CAAC;gBAED,
|
|
1
|
+
{"version":3,"file":"page-endpoints.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/plugins/page-endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,IAAI,EAAE,iDAAiD;QACvD,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,EAAU;YACvC,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACvE,MAAM,QAAQ,GAAG,SAAS,CAAC;oBACzB,KAAK,EAAE;wBACL,QAAQ,EAAE,KAAK;wBACf,UAAU,EAAE,EAAE;wBACd,MAAM,EAAE,IAAI;qBACb;oBACD,KAAK,EAAE,KAAK;oBACZ,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,SAAS;oBACnB,MAAM,EAAE,KAAK;oBACb,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;gBAEH,IAAI,WAAW,GAAa,EAAE,CAAC;gBAE/B,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;oBAC7C,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;wBAC/C,WAAW,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;oBACxD,CAAC;gBACH,CAAC;gBAED,MAAM,IAAI,GAAG;;;cAIP,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC1B,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC;kBACA,KAAK;;;kBAIX;;cAGE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAC5B,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC;;;;eAKN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA+BD,CAAC;gBAEJ,OAAO;oBACL,IAAI;oBACJ,GAAG,EAAE,IAAI;iBACV,CAAC;YACJ,CAAC;YAED,OAAO;QACT,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -78,7 +78,10 @@ export function getMatchingContentFilesWithFrontMatter(workspaceRoot, rootDir, g
|
|
|
78
78
|
const fileContents = readFileSync(f, 'utf8');
|
|
79
79
|
// Parse front matter from the file content
|
|
80
80
|
const raw = fm(fileContents);
|
|
81
|
-
|
|
81
|
+
// Get the relative file path by removing the root directory
|
|
82
|
+
const filepath = f.replace(root, '');
|
|
83
|
+
// Extract file name and extension using regex
|
|
84
|
+
// Matches: /filename.ext or /filename (with optional extension)
|
|
82
85
|
const match = filepath.match(/\/([^/.]+)(\.([^/.]+))?$/);
|
|
83
86
|
let name = '';
|
|
84
87
|
let extension = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-content-files.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/get-content-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,UAAU,sCAAsC,CACpD,aAAqB,EACrB,OAAe,EACf,IAAY;IAEZ,2CAA2C;IAC3C,8DAA8D;IAC9D,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEnC,+DAA+D;IAC/D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5D,kEAAkE;IAClE,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpE,wDAAwD;IACxD,yDAAyD;IACzD,MAAM,YAAY,GAAa,QAAQ,CAAC,CAAC,GAAG,IAAI,IAAI,WAAW,IAAI,CAAC,EAAE;QACpE,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,4EAA4E;IAC5E,MAAM,iBAAiB,GAA2B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACvE,uCAAuC;QACvC,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7C,2CAA2C;QAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;QAE7B,MAAM,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"get-content-files.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/get-content-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,UAAU,sCAAsC,CACpD,aAAqB,EACrB,OAAe,EACf,IAAY;IAEZ,2CAA2C;IAC3C,8DAA8D;IAC9D,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEnC,+DAA+D;IAC/D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5D,kEAAkE;IAClE,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpE,wDAAwD;IACxD,yDAAyD;IACzD,MAAM,YAAY,GAAa,QAAQ,CAAC,CAAC,GAAG,IAAI,IAAI,WAAW,IAAI,CAAC,EAAE;QACpE,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,4EAA4E;IAC5E,MAAM,iBAAiB,GAA2B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACvE,uCAAuC;QACvC,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7C,2CAA2C;QAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;QAE7B,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAErC,8CAA8C;QAC9C,gEAAgE;QAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACzD,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,8BAA8B;YAC/C,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,iDAAiD;QAC/E,CAAC;QAED,uDAAuD;QACvD,OAAO;YACL,IAAI;YACJ,SAAS;YACT,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,GAAG,CAAC,UAAiD;YACjE,OAAO,EAAE,YAAY;SACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
|
|
@@ -64,11 +64,9 @@ export function getPageHandlers({ workspaceRoot, sourceRoot, rootDir, additional
|
|
|
64
64
|
], { dot: true, absolute: true });
|
|
65
65
|
// Transform each discovered file into a Nitro event handler
|
|
66
66
|
const handlers = endpointFiles.map((endpointFile) => {
|
|
67
|
-
//
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
const route = normalized
|
|
71
|
-
.replace(/^(.*?)\/pages/, '/pages')
|
|
67
|
+
// Convert file path to route pattern using Angular-style route syntax
|
|
68
|
+
const route = endpointFile
|
|
69
|
+
.replace(/^(.*?)\/pages/, '/pages') // Remove everything before /pages
|
|
72
70
|
.replace(/\.server\.ts$/, '') // Remove .server.ts extension
|
|
73
71
|
.replace(/\[\.{3}(.+)\]/g, '**:$1') // Convert [...param] to **:param (catch-all routes)
|
|
74
72
|
.replace(/\[\.{3}(\w+)\]/g, '**:$1') // Alternative catch-all pattern
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-page-handlers.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/get-page-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAUrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,aAAa,EACb,UAAU,EACV,OAAO,EACP,mBAAmB,EACnB,SAAS,GACO;IAChB,+DAA+D;IAC/D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5D,4FAA4F;IAC5F,iGAAiG;IACjG,MAAM,aAAa,GAAa,QAAQ,CACtC;QACE,GAAG,IAAI,IAAI,UAAU,2BAA2B;QAChD,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,GAAG,CAChC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,aAAa,GAAG,GAAG,iBAAiB,CACjD;KACF,EACD,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAC9B,CAAC;IAEF,4DAA4D;IAC5D,MAAM,QAAQ,GAAwB,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;QACvE,
|
|
1
|
+
{"version":3,"file":"get-page-handlers.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/get-page-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAUrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,aAAa,EACb,UAAU,EACV,OAAO,EACP,mBAAmB,EACnB,SAAS,GACO;IAChB,+DAA+D;IAC/D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5D,4FAA4F;IAC5F,iGAAiG;IACjG,MAAM,aAAa,GAAa,QAAQ,CACtC;QACE,GAAG,IAAI,IAAI,UAAU,2BAA2B;QAChD,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,GAAG,CAChC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,aAAa,GAAG,GAAG,iBAAiB,CACjD;KACF,EACD,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAC9B,CAAC;IAEF,4DAA4D;IAC5D,MAAM,QAAQ,GAAwB,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;QACvE,sEAAsE;QACtE,MAAM,KAAK,GAAG,YAAY;aACvB,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,kCAAkC;aACrE,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,8BAA8B;aAC3D,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,oDAAoD;aACvF,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,gCAAgC;aACpE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,4CAA4C;aAC7E,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,6CAA6C;aAC1E,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,kCAAkC;QAE1D,8EAA8E;QAC9E,OAAO;YACL,OAAO,EAAE,YAAY;YACrB,KAAK,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,KAAK,EAAE;YACnD,IAAI,EAAE,IAAI;SACX,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -2,13 +2,41 @@ import { ViteDevServer } from 'vite';
|
|
|
2
2
|
/**
|
|
3
3
|
* Registers development server middleware by discovering and loading middleware files.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* This function:
|
|
6
|
+
* 1. Discovers all TypeScript middleware files in the server/middleware directory
|
|
7
|
+
* 2. Dynamically loads each middleware module using Vite's SSR module loader
|
|
8
|
+
* 3. Registers each middleware handler with the Vite development server
|
|
9
|
+
* 4. Handles middleware execution flow and error handling
|
|
9
10
|
*
|
|
10
11
|
* @param root The project root directory path
|
|
11
12
|
* @param sourceRoot The source directory path (e.g., 'src')
|
|
12
13
|
* @param viteServer The Vite development server instance
|
|
14
|
+
*
|
|
15
|
+
* Example usage:
|
|
16
|
+
* await registerDevServerMiddleware('/workspace/my-app', 'src', viteServer);
|
|
17
|
+
*
|
|
18
|
+
* Sample middleware file paths that would be discovered:
|
|
19
|
+
* - /workspace/my-app/src/server/middleware/auth.ts
|
|
20
|
+
* - /workspace/my-app/src/server/middleware/cors.ts
|
|
21
|
+
* - /workspace/my-app/src/server/middleware/logging.ts
|
|
22
|
+
* - /workspace/my-app/src/server/middleware/validation.ts
|
|
23
|
+
*
|
|
24
|
+
* tinyglobby vs fast-glob comparison:
|
|
25
|
+
* - Both support the same glob patterns for file discovery
|
|
26
|
+
* - Both are efficient for finding middleware files
|
|
27
|
+
* - tinyglobby is now used instead of fast-glob
|
|
28
|
+
* - tinyglobby provides similar functionality with smaller bundle size
|
|
29
|
+
* - tinyglobby's globSync returns absolute paths when absolute: true is set
|
|
30
|
+
*
|
|
31
|
+
* globSync options explained:
|
|
32
|
+
* - dot: true - Includes files/directories that start with a dot (e.g., .env.middleware)
|
|
33
|
+
* - absolute: true - Returns absolute file paths instead of relative paths
|
|
34
|
+
*
|
|
35
|
+
* Middleware execution flow:
|
|
36
|
+
* 1. Request comes to Vite dev server
|
|
37
|
+
* 2. Each registered middleware is executed in order
|
|
38
|
+
* 3. If middleware returns a result, request processing stops
|
|
39
|
+
* 4. If middleware returns no result, next middleware is called
|
|
40
|
+
* 5. If no middleware handles the request, it continues to normal Vite processing
|
|
13
41
|
*/
|
|
14
42
|
export declare function registerDevServerMiddleware(root: string, sourceRoot: string, viteServer: ViteDevServer): Promise<void>;
|
|
@@ -1,46 +1,67 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createEvent } from 'h3';
|
|
2
2
|
import { globSync } from 'tinyglobby';
|
|
3
|
-
import { toWebRequest, writeWebResponseToNode } from './node-web-bridge.js';
|
|
4
|
-
const PASSTHROUGH_HEADER = 'x-analog-passthrough';
|
|
5
3
|
/**
|
|
6
4
|
* Registers development server middleware by discovering and loading middleware files.
|
|
7
5
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
6
|
+
* This function:
|
|
7
|
+
* 1. Discovers all TypeScript middleware files in the server/middleware directory
|
|
8
|
+
* 2. Dynamically loads each middleware module using Vite's SSR module loader
|
|
9
|
+
* 3. Registers each middleware handler with the Vite development server
|
|
10
|
+
* 4. Handles middleware execution flow and error handling
|
|
12
11
|
*
|
|
13
12
|
* @param root The project root directory path
|
|
14
13
|
* @param sourceRoot The source directory path (e.g., 'src')
|
|
15
14
|
* @param viteServer The Vite development server instance
|
|
15
|
+
*
|
|
16
|
+
* Example usage:
|
|
17
|
+
* await registerDevServerMiddleware('/workspace/my-app', 'src', viteServer);
|
|
18
|
+
*
|
|
19
|
+
* Sample middleware file paths that would be discovered:
|
|
20
|
+
* - /workspace/my-app/src/server/middleware/auth.ts
|
|
21
|
+
* - /workspace/my-app/src/server/middleware/cors.ts
|
|
22
|
+
* - /workspace/my-app/src/server/middleware/logging.ts
|
|
23
|
+
* - /workspace/my-app/src/server/middleware/validation.ts
|
|
24
|
+
*
|
|
25
|
+
* tinyglobby vs fast-glob comparison:
|
|
26
|
+
* - Both support the same glob patterns for file discovery
|
|
27
|
+
* - Both are efficient for finding middleware files
|
|
28
|
+
* - tinyglobby is now used instead of fast-glob
|
|
29
|
+
* - tinyglobby provides similar functionality with smaller bundle size
|
|
30
|
+
* - tinyglobby's globSync returns absolute paths when absolute: true is set
|
|
31
|
+
*
|
|
32
|
+
* globSync options explained:
|
|
33
|
+
* - dot: true - Includes files/directories that start with a dot (e.g., .env.middleware)
|
|
34
|
+
* - absolute: true - Returns absolute file paths instead of relative paths
|
|
35
|
+
*
|
|
36
|
+
* Middleware execution flow:
|
|
37
|
+
* 1. Request comes to Vite dev server
|
|
38
|
+
* 2. Each registered middleware is executed in order
|
|
39
|
+
* 3. If middleware returns a result, request processing stops
|
|
40
|
+
* 4. If middleware returns no result, next middleware is called
|
|
41
|
+
* 5. If no middleware handles the request, it continues to normal Vite processing
|
|
16
42
|
*/
|
|
17
43
|
export async function registerDevServerMiddleware(root, sourceRoot, viteServer) {
|
|
44
|
+
// Discover all TypeScript middleware files in the server/middleware directory
|
|
45
|
+
// Pattern: looks for any .ts files in server/middleware/**/*.ts
|
|
18
46
|
const middlewareFiles = globSync([`${root}/${sourceRoot}/server/middleware/**/*.ts`], {
|
|
19
47
|
dot: true,
|
|
20
48
|
absolute: true,
|
|
21
49
|
});
|
|
50
|
+
// Register each discovered middleware file with the Vite dev server
|
|
22
51
|
middlewareFiles.forEach((file) => {
|
|
23
52
|
viteServer.middlewares.use(async (req, res, next) => {
|
|
53
|
+
// Dynamically load the middleware module using Vite's SSR module loader
|
|
54
|
+
// This allows for hot module replacement during development
|
|
24
55
|
const middlewareHandler = await viteServer
|
|
25
56
|
.ssrLoadModule(file)
|
|
26
57
|
.then((m) => m.default);
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
const app = new H3();
|
|
33
|
-
app.use(middlewareHandler);
|
|
34
|
-
app.use(() => new Response(null, {
|
|
35
|
-
status: 204,
|
|
36
|
-
headers: { [PASSTHROUGH_HEADER]: '1' },
|
|
37
|
-
}));
|
|
38
|
-
const response = await app.fetch(toWebRequest(req));
|
|
39
|
-
if (response.headers.get(PASSTHROUGH_HEADER) === '1') {
|
|
58
|
+
// Execute the middleware handler with the request/response event
|
|
59
|
+
const result = await middlewareHandler(createEvent(req, res));
|
|
60
|
+
// If middleware doesn't return a result, continue to next middleware
|
|
61
|
+
// If middleware returns a result, stop processing (middleware handled the request)
|
|
62
|
+
if (!result) {
|
|
40
63
|
next();
|
|
41
|
-
return;
|
|
42
64
|
}
|
|
43
|
-
await writeWebResponseToNode(res, response);
|
|
44
65
|
});
|
|
45
66
|
});
|
|
46
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-dev-middleware.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/register-dev-middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,
|
|
1
|
+
{"version":3,"file":"register-dev-middleware.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/register-dev-middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,WAAW,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAAY,EACZ,UAAkB,EAClB,UAAyB;IAEzB,8EAA8E;IAC9E,gEAAgE;IAChE,MAAM,eAAe,GAAG,QAAQ,CAC9B,CAAC,GAAG,IAAI,IAAI,UAAU,4BAA4B,CAAC,EACnD;QACE,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,IAAI;KACf,CACF,CAAC;IAEF,oEAAoE;IACpE,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/B,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAClD,wEAAwE;YACxE,4DAA4D;YAC5D,MAAM,iBAAiB,GAAiB,MAAM,UAAU;iBACrD,aAAa,CAAC,IAAI,CAAC;iBACnB,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE,CAAE,CAA+B,CAAC,OAAO,CAAC,CAAC;YAElE,iEAAiE;YACjE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAE9D,qEAAqE;YACrE,mFAAmF;YACnF,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,42 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* This code runs inside Nitro's server runtime (Node.js context) where
|
|
5
|
-
* event.node is always populated. In h3 v2, event.node is typed as optional,
|
|
6
|
-
* so we use h3's first-class event properties (event.path, event.method) where
|
|
7
|
-
* possible and apply optional chaining when accessing the Node.js context for
|
|
8
|
-
* the Angular renderer which requires raw req/res objects.
|
|
9
|
-
*
|
|
10
|
-
* h3 v2 idiomatic APIs used:
|
|
11
|
-
* - defineHandler (replaces defineEventHandler / eventHandler)
|
|
12
|
-
* - event.path (replaces event.node.req.url)
|
|
13
|
-
* - getResponseHeader compat shim (still available in h3 v2)
|
|
14
|
-
*/
|
|
15
|
-
export declare function ssrRenderer(templatePath: string): string;
|
|
16
|
-
/**
|
|
17
|
-
* Client-only renderer virtual module content.
|
|
18
|
-
*
|
|
19
|
-
* Used when SSR is disabled — simply serves the static index.html template
|
|
20
|
-
* for every route, letting the client-side Angular router handle navigation.
|
|
21
|
-
*/
|
|
22
|
-
export declare function clientRenderer(templatePath: string): string;
|
|
23
|
-
/**
|
|
24
|
-
* API middleware virtual module content.
|
|
25
|
-
*
|
|
26
|
-
* Intercepts requests matching the configured API prefix and either:
|
|
27
|
-
* - Uses event-bound internal forwarding for GET requests (except .xml routes)
|
|
28
|
-
* - Uses request proxying for all other methods to forward the full request
|
|
29
|
-
*
|
|
30
|
-
* h3 v2 idiomatic APIs used:
|
|
31
|
-
* - defineHandler (replaces defineEventHandler / eventHandler)
|
|
32
|
-
* - event.path (replaces event.node.req.url)
|
|
33
|
-
* - event.method (replaces event.node.req.method)
|
|
34
|
-
* - proxyRequest is retained internally because it preserves Nitro route
|
|
35
|
-
* matching for event-bound server requests during SSR/prerender
|
|
36
|
-
* - Object.fromEntries(event.req.headers.entries()) replaces direct event.node.req.headers access
|
|
37
|
-
*
|
|
38
|
-
* `fetchWithEvent` keeps the active event context while forwarding to a
|
|
39
|
-
* rewritten path, which avoids falling through to the HTML renderer when
|
|
40
|
-
* SSR code makes relative API requests.
|
|
41
|
-
*/
|
|
42
|
-
export declare const apiMiddleware = "\nimport { defineHandler, fetchWithEvent, proxyRequest } from 'h3';\nimport { useRuntimeConfig } from 'nitro/runtime-config';\n\nexport default defineHandler(async (event) => {\n const prefix = useRuntimeConfig().prefix;\n const apiPrefix = `${prefix}/${useRuntimeConfig().apiPrefix}`;\n\n if (event.path?.startsWith(apiPrefix)) {\n const reqUrl = event.path?.replace(apiPrefix, '');\n\n if (\n event.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.path?.endsWith('.xml')\n ) {\n return fetchWithEvent(event, reqUrl, {\n headers: Object.fromEntries(event.req.headers.entries()),\n });\n }\n\n return proxyRequest(event, reqUrl);\n }\n});";
|
|
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 clientRenderer = "\nimport { eventHandler } from 'h3';\n\n// @ts-ignore\nimport template from '#analog/index';\n\nexport default eventHandler(async () => {\n return template;\n});\n";
|
|
3
|
+
export declare const apiMiddleware = "\nimport { 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 if (event.node.req.url?.startsWith(apiPrefix)) {\n const reqUrl = event.node.req.url?.replace(apiPrefix, '');\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});";
|