@analogjs/vite-plugin-nitro 2.4.0-beta.9 → 3.0.0-alpha.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/README.md +2 -2
- package/package.json +3 -2
- package/src/index.d.ts +1 -1
- package/src/lib/build-server.d.ts +1 -1
- package/src/lib/build-server.js +79 -3
- 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 +4 -2
- package/src/lib/plugins/dev-server-plugin.js.map +1 -1
- package/src/lib/plugins/page-endpoints.js +33 -10
- package/src/lib/plugins/page-endpoints.js.map +1 -1
- package/src/lib/utils/get-content-files.js +1 -4
- 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 +5 -3
- package/src/lib/utils/get-page-handlers.js.map +1 -1
- package/src/lib/utils/node-web-bridge.d.ts +3 -0
- package/src/lib/utils/node-web-bridge.js +50 -0
- package/src/lib/utils/node-web-bridge.js.map +1 -0
- package/src/lib/utils/register-dev-middleware.d.ts +4 -32
- package/src/lib/utils/register-dev-middleware.js +22 -43
- package/src/lib/utils/register-dev-middleware.js.map +1 -1
- package/src/lib/utils/renderers.d.ts +42 -3
- package/src/lib/utils/renderers.js +98 -26
- 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 +322 -69
- package/src/lib/vite-plugin-nitro.js.map +1 -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 { defineHandler } from 'h3';
|
|
85
85
|
|
|
86
|
-
export default
|
|
86
|
+
export default defineHandler(() => ({ 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": "
|
|
3
|
+
"version": "3.0.0-alpha.2",
|
|
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,7 +30,8 @@
|
|
|
30
30
|
"url": "https://github.com/sponsors/brandonroberts"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"
|
|
33
|
+
"nitro": "3.0.260311-beta",
|
|
34
|
+
"ofetch": "2.0.0-alpha.3",
|
|
34
35
|
"xmlbuilder2": "^4.0.3",
|
|
35
36
|
"esbuild": "^0.27.3",
|
|
36
37
|
"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 'nitro/types' {
|
|
4
4
|
interface NitroRouteConfig {
|
|
5
5
|
ssr?: boolean;
|
|
6
6
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { NitroConfig } from '
|
|
1
|
+
import type { NitroConfig } from 'nitro/types';
|
|
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,13 +1,88 @@
|
|
|
1
|
-
import { copyPublicAssets, prerender } from '
|
|
2
|
-
import { createNitro, build, prepare } from 'nitropack';
|
|
1
|
+
import { build, copyPublicAssets, createNitro, prepare, prerender, } from 'nitro/builder';
|
|
3
2
|
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
4
3
|
import { dirname, join } from 'node:path';
|
|
5
4
|
import { addPostRenderingHooks } from './hooks/post-rendering-hook.js';
|
|
5
|
+
/**
|
|
6
|
+
* Ensures a minimal `tsconfig.json` exists in the SSR output directory.
|
|
7
|
+
*
|
|
8
|
+
* Nitro v3's `nitro:oxc` Rollup plugin uses OXC's resolver for every
|
|
9
|
+
* file it transforms. OXC walks up the directory tree looking for a
|
|
10
|
+
* `tsconfig.json` to load path aliases. The SSR output directory
|
|
11
|
+
* (`dist/<app>/ssr/`) is outside the source tree, so no tsconfig
|
|
12
|
+
* exists there. On Windows, OXC's upward directory walk also fails to
|
|
13
|
+
* reach the project root's tsconfig due to path normalisation issues,
|
|
14
|
+
* causing:
|
|
15
|
+
*
|
|
16
|
+
* [TSCONFIG_ERROR] Failed to load tsconfig for
|
|
17
|
+
* '../../dist/apps/blog-app/ssr/main.server.js': Tsconfig not found
|
|
18
|
+
*
|
|
19
|
+
* Writing a minimal tsconfig satisfies the resolver without adding any
|
|
20
|
+
* path aliases that would interfere with Nitro's own module resolution.
|
|
21
|
+
*/
|
|
22
|
+
function ensureSsrTsconfig(nitroConfig) {
|
|
23
|
+
const ssrEntry = nitroConfig?.alias?.['#analog/ssr'];
|
|
24
|
+
if (!ssrEntry) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// The alias value is a normalized absolute path (forward slashes on
|
|
28
|
+
// all platforms). Convert to a native path for dirname().
|
|
29
|
+
const ssrDir = dirname(ssrEntry.replace(/\//g, join('a', 'b')[1]));
|
|
30
|
+
const tsconfigPath = join(ssrDir, 'tsconfig.json');
|
|
31
|
+
if (existsSync(tsconfigPath)) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
writeFileSync(tsconfigPath, JSON.stringify({ compilerOptions: { module: 'ESNext', moduleResolution: 'bundler' } }, null, 2), 'utf8');
|
|
35
|
+
}
|
|
36
|
+
function isVercelPreset(preset) {
|
|
37
|
+
return !!preset?.toLowerCase().includes('vercel');
|
|
38
|
+
}
|
|
39
|
+
function ensureVercelFunctionConfig(nitro) {
|
|
40
|
+
if (!isVercelPreset(nitro.options.preset)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const serverDir = nitro.options.output.serverDir;
|
|
44
|
+
const functionConfigPath = join(serverDir, '.vc-config.json');
|
|
45
|
+
if (existsSync(functionConfigPath)) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
mkdirSync(serverDir, { recursive: true });
|
|
49
|
+
writeFileSync(functionConfigPath, JSON.stringify({
|
|
50
|
+
handler: 'index.mjs',
|
|
51
|
+
launcherType: 'Nodejs',
|
|
52
|
+
shouldAddHelpers: false,
|
|
53
|
+
supportsResponseStreaming: true,
|
|
54
|
+
...nitro.options.vercel?.functions,
|
|
55
|
+
}, null, 2), 'utf8');
|
|
56
|
+
}
|
|
6
57
|
export async function buildServer(options, nitroConfig, routeSourceFiles) {
|
|
58
|
+
// ── Ensure the SSR output has a tsconfig for OXC ─────────────────
|
|
59
|
+
//
|
|
60
|
+
// Must run before createNitro() so the tsconfig is on disk when the
|
|
61
|
+
// nitro:oxc plugin initialises its resolver.
|
|
62
|
+
ensureSsrTsconfig(nitroConfig);
|
|
63
|
+
// ── Force Rollup as the server bundler ────────────────────────────
|
|
64
|
+
//
|
|
65
|
+
// Nitro v3 defaults to Rolldown when available. Rolldown is faster,
|
|
66
|
+
// but its module resolver cannot resolve relative chunk imports
|
|
67
|
+
// (e.g. `./assets/core-DTazUigR.js`) from a rebundled SSR entry on
|
|
68
|
+
// Windows. The prerender build fails with:
|
|
69
|
+
//
|
|
70
|
+
// [RESOLVE_ERROR] Could not resolve './assets/core-DTazUigR.js'
|
|
71
|
+
// in ../../dist/apps/blog-app/ssr/main.server.js
|
|
72
|
+
//
|
|
73
|
+
// This is a known Rolldown limitation with cross-directory relative
|
|
74
|
+
// paths on Windows (backslash vs forward-slash normalisation).
|
|
75
|
+
// Rollup handles these paths correctly on all platforms.
|
|
76
|
+
//
|
|
77
|
+
// The dev server already uses `builder: 'rollup'` for the same
|
|
78
|
+
// reason. Default to Rollup here too until Rolldown's resolver
|
|
79
|
+
// matures. The caller can still opt in to Rolldown explicitly via
|
|
80
|
+
// nitroConfig.builder if their platform supports it.
|
|
7
81
|
const nitro = await createNitro({
|
|
8
82
|
dev: false,
|
|
9
83
|
preset: process.env['BUILD_PRESET'],
|
|
10
84
|
...nitroConfig,
|
|
85
|
+
builder: nitroConfig?.builder ?? 'rollup',
|
|
11
86
|
});
|
|
12
87
|
if (options?.prerender?.postRenderingHooks) {
|
|
13
88
|
addPostRenderingHooks(nitro, options.prerender.postRenderingHooks);
|
|
@@ -21,7 +96,7 @@ export async function buildServer(options, nitroConfig, routeSourceFiles) {
|
|
|
21
96
|
const indexFileExts = ['', '.br', '.gz'];
|
|
22
97
|
indexFileExts.forEach((fileExt) => {
|
|
23
98
|
// Remove the root index.html(.br|.gz) files
|
|
24
|
-
const indexFilePath =
|
|
99
|
+
const indexFilePath = join(nitroConfig?.output?.publicDir ?? '', `index.html${fileExt}`);
|
|
25
100
|
if (existsSync(indexFilePath)) {
|
|
26
101
|
unlinkSync(indexFilePath);
|
|
27
102
|
}
|
|
@@ -49,6 +124,7 @@ export async function buildServer(options, nitroConfig, routeSourceFiles) {
|
|
|
49
124
|
if (!options?.static) {
|
|
50
125
|
console.log('Building Server...');
|
|
51
126
|
await build(nitro);
|
|
127
|
+
ensureVercelFunctionConfig(nitro);
|
|
52
128
|
}
|
|
53
129
|
await nitro.close();
|
|
54
130
|
}
|
|
@@ -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 { Nitro, PrerenderRoute } from '
|
|
1
|
+
import type { Nitro, PrerenderRoute } from 'nitro/types';
|
|
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';
|
|
7
6
|
import { createRouter as createRadixRouter, toRouteMatcher } from 'radix3';
|
|
8
7
|
import { defu } from 'defu';
|
|
9
8
|
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,6 +21,7 @@ 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',
|
|
24
25
|
resolve: {
|
|
25
26
|
alias: {
|
|
26
27
|
'~analog/entry-server': options.entryServer || `${root}/${sourceRoot}/main.server.ts`,
|
|
@@ -54,7 +55,7 @@ export function devServerPlugin(options) {
|
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
57
|
if (result instanceof Response) {
|
|
57
|
-
|
|
58
|
+
await writeWebResponseToNode(res, result);
|
|
58
59
|
return;
|
|
59
60
|
}
|
|
60
61
|
res.setHeader('Content-Type', 'text/html');
|
|
@@ -94,6 +95,7 @@ function remove_html_middlewares(server) {
|
|
|
94
95
|
'viteIndexHtmlMiddleware',
|
|
95
96
|
'vite404Middleware',
|
|
96
97
|
'viteSpaFallbackMiddleware',
|
|
98
|
+
'viteHtmlFallbackMiddleware',
|
|
97
99
|
];
|
|
98
100
|
for (let i = server.stack.length - 1; i > 0; i--) {
|
|
99
101
|
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,8 +23,24 @@ 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.
|
|
26
41
|
const code = `
|
|
27
|
-
import {
|
|
42
|
+
import { defineHandler, fetchWithEvent } from 'nitro/h3';
|
|
43
|
+
import { createFetch } from 'ofetch';
|
|
28
44
|
|
|
29
45
|
${fileExports.includes('load')
|
|
30
46
|
? _code
|
|
@@ -39,17 +55,24 @@ export function pageEndpointsPlugin() {
|
|
|
39
55
|
: `
|
|
40
56
|
export const action = () => {
|
|
41
57
|
return {};
|
|
42
|
-
}
|
|
58
|
+
}
|
|
43
59
|
`}
|
|
44
60
|
|
|
45
|
-
export default
|
|
61
|
+
export default defineHandler(async(event) => {
|
|
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
|
+
|
|
46
69
|
if (event.method === 'GET') {
|
|
47
70
|
try {
|
|
48
71
|
return await load({
|
|
49
72
|
params: event.context.params,
|
|
50
|
-
req: event.node
|
|
51
|
-
res: event.node
|
|
52
|
-
fetch:
|
|
73
|
+
req: event.node?.req,
|
|
74
|
+
res: event.node?.res,
|
|
75
|
+
fetch: serverFetch,
|
|
53
76
|
event
|
|
54
77
|
});
|
|
55
78
|
} catch(e) {
|
|
@@ -60,15 +83,15 @@ export function pageEndpointsPlugin() {
|
|
|
60
83
|
try {
|
|
61
84
|
return await action({
|
|
62
85
|
params: event.context.params,
|
|
63
|
-
req: event.node
|
|
64
|
-
res: event.node
|
|
65
|
-
fetch:
|
|
86
|
+
req: event.node?.req,
|
|
87
|
+
res: event.node?.res,
|
|
88
|
+
fetch: serverFetch,
|
|
66
89
|
event
|
|
67
90
|
});
|
|
68
91
|
} catch(e) {
|
|
69
92
|
console.error(\` An error occurred: \${e}\`)
|
|
70
93
|
throw e;
|
|
71
|
-
}
|
|
94
|
+
}
|
|
72
95
|
}
|
|
73
96
|
});
|
|
74
97
|
`;
|
|
@@ -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,MAAM,IAAI,GAAG
|
|
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,mEAAmE;gBACnE,kEAAkE;gBAClE,gEAAgE;gBAChE,6CAA6C;gBAC7C,gEAAgE;gBAChE,wCAAwC;gBACxC,EAAE;gBACF,uEAAuE;gBACvE,uEAAuE;gBACvE,qBAAqB;gBACrB,sDAAsD;gBACtD,kEAAkE;gBAClE,EAAE;gBACF,wEAAwE;gBACxE,8DAA8D;gBAC9D,MAAM,IAAI,GAAG;;;;cAKP,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAsCD,CAAC;gBAEJ,OAAO;oBACL,IAAI;oBACJ,GAAG,EAAE,IAAI;iBACV,CAAC;YACJ,CAAC;YAED,OAAO;QACT,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -78,10 +78,7 @@ 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
|
-
|
|
82
|
-
const filepath = f.replace(root, '');
|
|
83
|
-
// Extract file name and extension using regex
|
|
84
|
-
// Matches: /filename.ext or /filename (with optional extension)
|
|
81
|
+
const filepath = normalizePath(f).replace(root, '');
|
|
85
82
|
const match = filepath.match(/\/([^/.]+)(\.([^/.]+))?$/);
|
|
86
83
|
let name = '';
|
|
87
84
|
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,
|
|
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,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEpD,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,9 +64,11 @@ 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
|
-
|
|
67
|
+
// Normalize the endpoint file path for consistent path handling
|
|
68
|
+
const normalized = normalizePath(endpointFile);
|
|
69
|
+
// Transform the normalized path into a route pattern
|
|
70
|
+
const route = normalized
|
|
71
|
+
.replace(/^(.*?)\/pages/, '/pages')
|
|
70
72
|
.replace(/\.server\.ts$/, '') // Remove .server.ts extension
|
|
71
73
|
.replace(/\[\.{3}(.+)\]/g, '**:$1') // Convert [...param] to **:param (catch-all routes)
|
|
72
74
|
.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,gEAAgE;QAChE,MAAM,UAAU,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC/C,qDAAqD;QACrD,MAAM,KAAK,GAAG,UAAU;aACrB,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC;aAClC,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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Readable } from 'node:stream';
|
|
2
|
+
import { pipeline } from 'node:stream/promises';
|
|
3
|
+
function toWebHeaders(headers) {
|
|
4
|
+
return Object.entries(headers).reduce((acc, [key, value]) => {
|
|
5
|
+
if (value) {
|
|
6
|
+
acc.set(key, Array.isArray(value) ? value.join(', ') : value);
|
|
7
|
+
}
|
|
8
|
+
return acc;
|
|
9
|
+
}, new Headers());
|
|
10
|
+
}
|
|
11
|
+
export function toWebRequest(req) {
|
|
12
|
+
const protocol = 'http';
|
|
13
|
+
const host = req.headers.host || 'localhost';
|
|
14
|
+
const url = new URL(req.url || '/', `${protocol}://${host}`);
|
|
15
|
+
const body = req.method && !['GET', 'HEAD'].includes(req.method)
|
|
16
|
+
? Readable.toWeb(req)
|
|
17
|
+
: undefined;
|
|
18
|
+
return new Request(url, {
|
|
19
|
+
method: req.method,
|
|
20
|
+
headers: toWebHeaders(req.headers),
|
|
21
|
+
body,
|
|
22
|
+
// @ts-expect-error duplex is required for streaming request bodies in Node.js
|
|
23
|
+
duplex: body ? 'half' : undefined,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export async function writeWebResponseToNode(res, response) {
|
|
27
|
+
res.statusCode = response.status;
|
|
28
|
+
res.statusMessage = response.statusText;
|
|
29
|
+
const setCookies = 'getSetCookie' in response.headers &&
|
|
30
|
+
typeof response.headers.getSetCookie === 'function'
|
|
31
|
+
? response.headers.getSetCookie()
|
|
32
|
+
: [];
|
|
33
|
+
if (setCookies.length > 0) {
|
|
34
|
+
res.setHeader('set-cookie', setCookies);
|
|
35
|
+
}
|
|
36
|
+
response.headers.forEach((value, key) => {
|
|
37
|
+
if (key !== 'set-cookie') {
|
|
38
|
+
res.setHeader(key, value);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
if (!response.body) {
|
|
42
|
+
res.end();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// The Web ReadableStream and Node.js stream/web ReadableStream types
|
|
46
|
+
// are structurally identical at runtime but TypeScript treats them as
|
|
47
|
+
// distinct nominal types. The double-cast bridges this gap safely.
|
|
48
|
+
await pipeline(Readable.fromWeb(response.body), res);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=node-web-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-web-bridge.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/node-web-bridge.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,SAAS,YAAY,CAAC,OAA4B;IAChD,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC1D,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAoB;IAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC;IACxB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,QAAQ,MAAM,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAI,GACR,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;QACjD,CAAC,CAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAgC;QACrD,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;QAClC,IAAI;QACJ,8EAA8E;QAC9E,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAClC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAmB,EACnB,QAAkB;IAElB,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;IACjC,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC,UAAU,CAAC;IAExC,MAAM,UAAU,GACd,cAAc,IAAI,QAAQ,CAAC,OAAO;QAClC,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,KAAK,UAAU;QACjD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE;QACjC,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtC,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,qEAAqE;IACrE,sEAAsE;IACtE,mEAAmE;IACnE,MAAM,QAAQ,CACZ,QAAQ,CAAC,OAAO,CACd,QAAQ,CAAC,IAA2D,CACrE,EACD,GAAG,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -2,41 +2,13 @@ import { ViteDevServer } from 'vite';
|
|
|
2
2
|
/**
|
|
3
3
|
* Registers development server middleware by discovering and loading middleware files.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* 4. Handles middleware execution flow and error handling
|
|
5
|
+
* Each discovered h3 middleware module is loaded through Vite's SSR loader,
|
|
6
|
+
* wrapped in a temporary H3 app, then bridged back into Vite's Connect stack.
|
|
7
|
+
* If the middleware does not write a response, control falls through to the
|
|
8
|
+
* next Vite middleware.
|
|
10
9
|
*
|
|
11
10
|
* @param root The project root directory path
|
|
12
11
|
* @param sourceRoot The source directory path (e.g., 'src')
|
|
13
12
|
* @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
|
|
41
13
|
*/
|
|
42
14
|
export declare function registerDevServerMiddleware(root: string, sourceRoot: string, viteServer: ViteDevServer): Promise<void>;
|
|
@@ -1,67 +1,46 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { H3 } from 'nitro/h3';
|
|
2
2
|
import { globSync } from 'tinyglobby';
|
|
3
|
+
import { toWebRequest, writeWebResponseToNode } from './node-web-bridge.js';
|
|
4
|
+
const PASSTHROUGH_HEADER = 'x-analog-passthrough';
|
|
3
5
|
/**
|
|
4
6
|
* Registers development server middleware by discovering and loading middleware files.
|
|
5
7
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* 4. Handles middleware execution flow and error handling
|
|
8
|
+
* Each discovered h3 middleware module is loaded through Vite's SSR loader,
|
|
9
|
+
* wrapped in a temporary H3 app, then bridged back into Vite's Connect stack.
|
|
10
|
+
* If the middleware does not write a response, control falls through to the
|
|
11
|
+
* next Vite middleware.
|
|
11
12
|
*
|
|
12
13
|
* @param root The project root directory path
|
|
13
14
|
* @param sourceRoot The source directory path (e.g., 'src')
|
|
14
15
|
* @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
|
|
42
16
|
*/
|
|
43
17
|
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
|
|
46
18
|
const middlewareFiles = globSync([`${root}/${sourceRoot}/server/middleware/**/*.ts`], {
|
|
47
19
|
dot: true,
|
|
48
20
|
absolute: true,
|
|
49
21
|
});
|
|
50
|
-
// Register each discovered middleware file with the Vite dev server
|
|
51
22
|
middlewareFiles.forEach((file) => {
|
|
52
23
|
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
|
|
55
24
|
const middlewareHandler = await viteServer
|
|
56
25
|
.ssrLoadModule(file)
|
|
57
26
|
.then((m) => m.default);
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
|
|
27
|
+
// Bridge h3 event handler using H3.fetch() (web-first API).
|
|
28
|
+
// A sentinel catch-all is appended so that when the middleware
|
|
29
|
+
// returns undefined (does not handle the request), h3 does not
|
|
30
|
+
// emit its default 404 — instead we detect the passthrough
|
|
31
|
+
// header and let the Connect stack continue.
|
|
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') {
|
|
63
40
|
next();
|
|
41
|
+
return;
|
|
64
42
|
}
|
|
43
|
+
await writeWebResponseToNode(res, response);
|
|
65
44
|
});
|
|
66
45
|
});
|
|
67
46
|
}
|
|
@@ -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,EAAE,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE5E,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;AAElD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAAY,EACZ,UAAkB,EAClB,UAAyB;IAEzB,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,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,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,4DAA4D;YAC5D,+DAA+D;YAC/D,+DAA+D;YAC/D,2DAA2D;YAC3D,6CAA6C;YAC7C,MAAM,GAAG,GAAG,IAAI,EAAE,EAAE,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC3B,GAAG,CAAC,GAAG,CACL,GAAG,EAAE,CACH,IAAI,QAAQ,CAAC,IAAI,EAAE;gBACjB,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE;aACvC,CAAC,CACL,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YAEpD,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,GAAG,EAAE,CAAC;gBACrD,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YAED,MAAM,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|