@analogjs/vite-plugin-nitro 2.4.0-beta.5 → 3.0.0-alpha.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/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 { defineEventHandler } from 'h3';
84
+ import { defineHandler } from 'h3';
85
85
 
86
- export default defineEventHandler(() => ({ message: 'Hello World' }));
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": "2.4.0-beta.5",
3
+ "version": "3.0.0-alpha.1",
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,9 @@
30
30
  "url": "https://github.com/sponsors/brandonroberts"
31
31
  },
32
32
  "dependencies": {
33
- "nitropack": "^2.13.1",
33
+ "nitro": "3.0.1-alpha.2",
34
+ "h3": "2.0.1-rc.16",
35
+ "ofetch": "2.0.0-alpha.3",
34
36
  "xmlbuilder2": "^4.0.3",
35
37
  "esbuild": "^0.27.3",
36
38
  "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 'nitropack' {
3
+ declare module 'nitro/types' {
4
4
  interface NitroRouteConfig {
5
5
  ssr?: boolean;
6
6
  }
@@ -1,3 +1,3 @@
1
- import { NitroConfig } from 'nitropack';
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>;
@@ -1,13 +1,39 @@
1
- import { copyPublicAssets, prerender } from 'nitropack';
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
+ 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
+ }
6
26
  export async function buildServer(options, nitroConfig, routeSourceFiles) {
7
27
  const nitro = await createNitro({
8
28
  dev: false,
9
29
  preset: process.env['BUILD_PRESET'],
10
30
  ...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',
11
37
  });
12
38
  if (options?.prerender?.postRenderingHooks) {
13
39
  addPostRenderingHooks(nitro, options.prerender.postRenderingHooks);
@@ -21,7 +47,7 @@ export async function buildServer(options, nitroConfig, routeSourceFiles) {
21
47
  const indexFileExts = ['', '.br', '.gz'];
22
48
  indexFileExts.forEach((fileExt) => {
23
49
  // Remove the root index.html(.br|.gz) files
24
- const indexFilePath = `${nitroConfig?.output?.publicDir}/index.html${fileExt ? `${fileExt}` : ''}`;
50
+ const indexFilePath = join(nitroConfig?.output?.publicDir ?? '', `index.html${fileExt}`);
25
51
  if (existsSync(indexFilePath)) {
26
52
  unlinkSync(indexFilePath);
27
53
  }
@@ -34,6 +60,9 @@ export async function buildServer(options, nitroConfig, routeSourceFiles) {
34
60
  }
35
61
  if (routeSourceFiles && Object.keys(routeSourceFiles).length > 0) {
36
62
  const publicDir = nitroConfig?.output?.publicDir;
63
+ if (!publicDir) {
64
+ throw new Error('Nitro public output directory is required to write route source files.');
65
+ }
37
66
  for (const [route, content] of Object.entries(routeSourceFiles)) {
38
67
  const outputPath = join(publicDir, `${route}.md`);
39
68
  const outputDir = dirname(outputPath);
@@ -46,6 +75,7 @@ export async function buildServer(options, nitroConfig, routeSourceFiles) {
46
75
  if (!options?.static) {
47
76
  console.log('Building Server...');
48
77
  await build(nitro);
78
+ ensureVercelFunctionConfig(nitro);
49
79
  }
50
80
  await nitro.close();
51
81
  }
@@ -1 +1 @@
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
+ {"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 'nitropack';
1
+ import type { Nitro, PrerenderRoute } from 'nitro/types';
2
2
  export declare function addPostRenderingHooks(nitro: Nitro, hooks: ((pr: PrerenderRoute) => Promise<void>)[]): void;
@@ -1,4 +1,4 @@
1
- import { PrerenderRoute } from 'nitropack';
1
+ import type { PrerenderRoute } from 'nitro/types';
2
2
  export interface Options {
3
3
  ssr?: boolean;
4
4
  ssrBuildDir?: string;
@@ -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,14 +55,14 @@ export function devServerPlugin(options) {
54
55
  });
55
56
  }
56
57
  if (result instanceof Response) {
57
- sendWebResponse(createEvent(req, res), result);
58
+ await writeWebResponseToNode(res, result);
58
59
  return;
59
60
  }
60
61
  res.setHeader('Content-Type', 'text/html');
61
62
  res.end(result);
62
63
  }
63
64
  catch (e) {
64
- viteServer && viteServer.ssrFixStacktrace(e);
65
+ viteServer.ssrFixStacktrace(e);
65
66
  res.statusCode = 500;
66
67
  res.end(`
67
68
  <!DOCTYPE html>
@@ -94,10 +95,12 @@ 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
- // @ts-ignore
100
- if (html_middlewares.includes(server.stack[i].handle.name)) {
101
+ const handler = server.stack[i]?.handle;
102
+ const handlerName = typeof handler === 'function' ? handler.name : undefined;
103
+ if (handlerName && html_middlewares.includes(handlerName)) {
101
104
  server.stack.splice(i, 1);
102
105
  }
103
106
  }
@@ -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,WAAW,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAClD,OAAO,EAAE,YAAY,IAAI,iBAAiB,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAKlF,MAAM,UAAU,eAAe,CAAC,OAAsB;IACpD,MAAM,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9D,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,KAAK,CAAC;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;IAC5C,IAAI,MAAkB,CAAC;IACvB,IAAI,IAAY,CAAC;IACjB,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE;YACzB,MAAM,GAAG,UAAU,CAAC;YACpB,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;YACxE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE;oBACP,KAAK,EAAE;wBACL,sBAAsB,EACpB,OAAO,CAAC,WAAW,IAAI,GAAG,IAAI,IAAI,UAAU,iBAAiB;qBAChE;iBACF;aACF,CAAC;QACJ,CAAC;QACD,eAAe,CAAC,UAAU;YACxB,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,OAAO,KAAK,IAAI,EAAE;gBAChB,uBAAuB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;gBAChD,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;gBAE1D,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;oBAC5C,IAAI,QAAQ,GAAG,YAAY,CACzB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EACtC,OAAO,CACR,CAAC;oBAEF,QAAQ,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAC5C,GAAG,CAAC,WAAqB,EACzB,QAAQ,CACT,CAAC;oBAEF,MAAM,kBAAkB,GAAG,cAAc,CACvC,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAClD,CAAC;oBACF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE,CACtC,IAAI,CACF,EAAE,EACF,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAC5B,CAAC;oBAEvB,IAAI,CAAC;wBACH,IAAI,MAAyB,CAAC;wBAC9B,iDAAiD;wBACjD,IAAI,cAAc,CAAC,GAAG,CAAC,WAAqB,CAAC,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;4BAC5D,MAAM,GAAG,QAAQ,CAAC;wBACpB,CAAC;6BAAM,CAAC;4BACN,MAAM,WAAW,GAAG,CAClB,MAAM,UAAU,CAAC,aAAa,CAAC,sBAAsB,CAAC,CACvD,CAAC,SAAS,CAAC,CAAC;4BACb,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE;gCACpD,GAAG;gCACH,GAAG;6BACJ,CAAC,CAAC;wBACL,CAAC;wBAED,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;4BAC/B,eAAe,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;4BAC/C,OAAO;wBACT,CAAC;wBACD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;wBAC3C,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAClB,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,UAAU,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAU,CAAC,CAAC;wBACtD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;wBACrB,GAAG,CAAC,GAAG,CAAC;;;;;;;;iEAQ6C,IAAI,CAAC,SAAS,CACzD,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CACrB,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;;;;;;aAMjC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,MAAoC;IACnE,MAAM,gBAAgB,GAAG;QACvB,yBAAyB;QACzB,mBAAmB;QACnB,2BAA2B;KAC5B,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,aAAa;QACb,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,GAA4B,EAAE,KAAc;IAChE,MAAM,CAAC,GAAG,KAAc,CAAC;IACzB,OAAO;QACL,OAAO,EAAE,2CAA2C,GAAG,CAAC,GAAG,UACzD,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAChC,GAAG;QACH,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;KAC5C,CAAC;AACJ,CAAC"}
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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"}
@@ -18,13 +18,29 @@ export function pageEndpointsPlugin() {
18
18
  logLevel: 'silent',
19
19
  });
20
20
  let fileExports = [];
21
- for (let key in compiled.metafile?.outputs) {
21
+ for (const key in compiled.metafile?.outputs) {
22
22
  if (compiled.metafile?.outputs[key].entryPoint) {
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 { defineEventHandler } from 'h3';
42
+ import { defineHandler, fetchWithEvent } from 'h3';
43
+ import { createFetch } from 'ofetch';
28
44
 
29
45
  ${fileExports.includes('load')
30
46
  ? _code
@@ -39,36 +55,43 @@ export function pageEndpointsPlugin() {
39
55
  : `
40
56
  export const action = () => {
41
57
  return {};
42
- }
58
+ }
43
59
  `}
44
60
 
45
- export default defineEventHandler(async(event) => {
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.req,
51
- res: event.node.res,
52
- fetch: $fetch,
73
+ req: event.node?.req,
74
+ res: event.node?.res,
75
+ fetch: serverFetch,
53
76
  event
54
77
  });
55
78
  } catch(e) {
56
- console.error(\` An error occurred: \$\{e\}\`)
79
+ console.error(\` An error occurred: \${e}\`)
57
80
  throw e;
58
81
  }
59
82
  } else {
60
83
  try {
61
84
  return await action({
62
85
  params: event.context.params,
63
- req: event.node.req,
64
- res: event.node.res,
65
- fetch: $fetch,
86
+ req: event.node?.req,
87
+ res: event.node?.res,
88
+ fetch: serverFetch,
66
89
  event
67
90
  });
68
91
  } catch(e) {
69
- console.error(\` An error occurred: \$\{e\}\`)
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,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;oBAC3C,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"}
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
- // 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)
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,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"}
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"}
@@ -1,4 +1,4 @@
1
- import { NitroEventHandler } from 'nitropack';
1
+ import type { NitroEventHandler } from 'nitro/types';
2
2
  type GetHandlersArgs = {
3
3
  workspaceRoot: string;
4
4
  sourceRoot: string;
@@ -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
- // Convert file path to route pattern using Angular-style route syntax
68
- const route = endpointFile
69
- .replace(/^(.*?)\/pages/, '/pages') // Remove everything before /pages
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,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"}
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,3 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ export declare function toWebRequest(req: IncomingMessage): Request;
3
+ export declare function writeWebResponseToNode(res: ServerResponse, response: Response): Promise<void>;
@@ -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
- * 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
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 { createEvent } from 'h3';
1
+ import { H3 } from '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
- * 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
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
- // 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) {
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,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
+ {"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,IAAI,CAAC;AACtC,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"}