@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 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.9",
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
- "nitropack": "^2.13.1",
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 '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,88 @@
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
+ /**
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 = `${nitroConfig?.output?.publicDir}/index.html${fileExt ? `${fileExt}` : ''}`;
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":"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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,7 +55,7 @@ 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');
@@ -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":"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"}
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 { defineEventHandler } from 'h3';
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 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) {
@@ -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.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
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;;;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 '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
- * 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,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"}