diff --git a/packages/dev-server/src/dev-server.ts b/packages/dev-server/src/dev-server.ts index 22f1de78..5e346b57 100644 --- a/packages/dev-server/src/dev-server.ts +++ b/packages/dev-server/src/dev-server.ts @@ -8,8 +8,11 @@ import type { Env, Fetch, EnvFunc } from './types.js' export type DevServerOptions = { entry?: string injectClientScript?: boolean + include?: (string | RegExp)[] exclude?: (string | RegExp)[] env?: Env | EnvFunc + // Returning `undefined` will skip the middleware and pass the request to Vite. + middleware?: (req: Request) => Response | undefined } & { /** * @deprecated @@ -19,7 +22,9 @@ export type DevServerOptions = { cf?: Parameters[0] } -export const defaultOptions: Required> = { +export const defaultOptions: Required< + Omit +> = { entry: './src/index.ts', injectClientScript: true, exclude: [ @@ -39,10 +44,32 @@ export function devServer(options?: DevServerOptions): Plugin { configureServer: async (server) => { async function createMiddleware(server: ViteDevServer): Promise { return async function ( - req: http.IncomingMessage, + req: Connect.IncomingMessage, res: http.ServerResponse, next: Connect.NextFunction ): Promise { + if (options?.include) { + let matched = false + + for (const pattern of options.include) { + if (req.url) { + if (pattern instanceof RegExp) { + if (pattern.test(req.originalUrl || req.url)) { + matched = true + break + } + } else if (minimatch(req.url?.toString(), pattern)) { + matched = true + break + } + } + } + + if (!matched) { + return next() + } + } + const exclude = options?.exclude ?? defaultOptions.exclude for (const pattern of exclude) { @@ -84,6 +111,9 @@ export function devServer(options?: DevServerOptions): Plugin { env = await cloudflarePagesGetEnv(options.cf)() } + const result = options?.middleware?.(request) + if (result instanceof Response) return result + let response = await app.fetch(request, env, { waitUntil: async (fn) => fn, passThroughOnException: () => {