UNPKG

@analogjs/vite-plugin-nitro

Version:

A Vite plugin for adding a nitro API server

68 lines 3.24 kB
import { createEvent } from 'h3'; import { globSync } from 'tinyglobby'; /** * Registers development server middleware by discovering and loading middleware files. * * This function: * 1. Discovers all TypeScript middleware files in the server/middleware directory * 2. Dynamically loads each middleware module using Vite's SSR module loader * 3. Registers each middleware handler with the Vite development server * 4. Handles middleware execution flow and error handling * * @param root The project root directory path * @param sourceRoot The source directory path (e.g., 'src') * @param viteServer The Vite development server instance * * Example usage: * await registerDevServerMiddleware('/workspace/my-app', 'src', viteServer); * * Sample middleware file paths that would be discovered: * - /workspace/my-app/src/server/middleware/auth.ts * - /workspace/my-app/src/server/middleware/cors.ts * - /workspace/my-app/src/server/middleware/logging.ts * - /workspace/my-app/src/server/middleware/validation.ts * * tinyglobby vs fast-glob comparison: * - Both support the same glob patterns for file discovery * - Both are efficient for finding middleware files * - tinyglobby is now used instead of fast-glob * - tinyglobby provides similar functionality with smaller bundle size * - tinyglobby's globSync returns absolute paths when absolute: true is set * * globSync options explained: * - dot: true - Includes files/directories that start with a dot (e.g., .env.middleware) * - absolute: true - Returns absolute file paths instead of relative paths * * Middleware execution flow: * 1. Request comes to Vite dev server * 2. Each registered middleware is executed in order * 3. If middleware returns a result, request processing stops * 4. If middleware returns no result, next middleware is called * 5. If no middleware handles the request, it continues to normal Vite processing */ export async function registerDevServerMiddleware(root, sourceRoot, viteServer) { // Discover all TypeScript middleware files in the server/middleware directory // Pattern: looks for any .ts files in server/middleware/**/*.ts const middlewareFiles = globSync([`${root}/${sourceRoot}/server/middleware/**/*.ts`], { dot: true, absolute: true, }); // Register each discovered middleware file with the Vite dev server middlewareFiles.forEach((file) => { viteServer.middlewares.use(async (req, res, next) => { // Dynamically load the middleware module using Vite's SSR module loader // This allows for hot module replacement during development const middlewareHandler = await viteServer .ssrLoadModule(file) .then((m) => m.default); // Execute the middleware handler with the request/response event const result = await middlewareHandler(createEvent(req, res)); // If middleware doesn't return a result, continue to next middleware // If middleware returns a result, stop processing (middleware handled the request) if (!result) { next(); } }); }); } //# sourceMappingURL=register-dev-middleware.js.map