@@ -12,6 +12,11 @@ import { toClientRewrites } from "../packages/vinext/src/client/client-rewrites.
1212import { isValidModulePath } from "../packages/vinext/src/client/validate-module-path.js";
1313import vinext from "../packages/vinext/src/index.js";
1414import { safeJsonStringify } from "../packages/vinext/src/server/html.js";
15+ import { isProxyFile } from "../packages/vinext/src/server/middleware.js";
16+ import {
17+ resolveMiddlewareModuleHandler,
18+ type MiddlewareModule,
19+ } from "../packages/vinext/src/server/middleware-runtime.js";
1520import { buildPagesNextDataScript } from "../packages/vinext/src/server/pages-page-response.js";
1621import type { Plugin } from "vite-plus";
1722import type { NextPageContext } from "next";
@@ -8513,8 +8518,10 @@ describe("runMiddleware preserves x-middleware-request-* headers (dev mode)", ()
85138518// https://github.com/vercel/next.js/blob/canary/test/e2e/app-dir/proxy-missing-export/proxy-missing-export.test.ts
85148519
85158520describe("middleware/proxy export validation", () => {
8521+ const resolveMiddlewareForTest = (mod: MiddlewareModule, filePath: string) =>
8522+ resolveMiddlewareModuleHandler(mod, { filePath, isProxy: isProxyFile(filePath) });
8523+
85168524 it("isProxyFile returns true for proxy files", async () => {
8517- const { isProxyFile } = await import("../packages/vinext/src/server/middleware.js");
85188525 expect(isProxyFile("/app/proxy.ts")).toBe(true);
85198526 expect(isProxyFile("/app/proxy.js")).toBe(true);
85208527 expect(isProxyFile("/app/proxy.mjs")).toBe(true);
@@ -8523,117 +8530,90 @@ describe("middleware/proxy export validation", () => {
85238530 });
85248531
85258532 it("isProxyFile returns false for middleware files", async () => {
8526- const { isProxyFile } = await import("../packages/vinext/src/server/middleware.js");
85278533 expect(isProxyFile("/app/middleware.ts")).toBe(false);
85288534 expect(isProxyFile("/app/middleware.js")).toBe(false);
85298535 expect(isProxyFile("/app/middleware.mjs")).toBe(false);
85308536 expect(isProxyFile("/app/src/middleware.ts")).toBe(false);
85318537 });
85328538
8533- it("resolveMiddlewareHandler: proxy.ts with named proxy export", async () => {
8534- const { resolveMiddlewareHandler } =
8535- await import("../packages/vinext/src/server/middleware.js");
8539+ it("resolveMiddlewareModuleHandler: proxy.ts with named proxy export", async () => {
85368540 const fn = () => {};
8537- const handler = resolveMiddlewareHandler ({ proxy: fn }, "/app/proxy.ts");
8541+ const handler = resolveMiddlewareForTest ({ proxy: fn }, "/app/proxy.ts");
85388542 expect(handler).toBe(fn);
85398543 });
85408544
8541- it("resolveMiddlewareHandler: proxy.ts with default export", async () => {
8542- const { resolveMiddlewareHandler } =
8543- await import("../packages/vinext/src/server/middleware.js");
8545+ it("resolveMiddlewareModuleHandler: proxy.ts with default export", async () => {
85448546 const fn = () => {};
8545- const handler = resolveMiddlewareHandler ({ default: fn }, "/app/proxy.ts");
8547+ const handler = resolveMiddlewareForTest ({ default: fn }, "/app/proxy.ts");
85468548 expect(handler).toBe(fn);
85478549 });
85488550
8549- it("resolveMiddlewareHandler: proxy.ts prefers named proxy over default", async () => {
8550- const { resolveMiddlewareHandler } =
8551- await import("../packages/vinext/src/server/middleware.js");
8551+ it("resolveMiddlewareModuleHandler: proxy.ts prefers named proxy over default", async () => {
85528552 const proxyFn = () => {};
85538553 const defaultFn = () => {};
8554- const handler = resolveMiddlewareHandler (
8554+ const handler = resolveMiddlewareForTest (
85558555 { proxy: proxyFn, default: defaultFn },
85568556 "/app/proxy.ts",
85578557 );
85588558 expect(handler).toBe(proxyFn);
85598559 });
85608560
8561- it("resolveMiddlewareHandler: proxy.ts with default arrow function export", async () => {
8562- const { resolveMiddlewareHandler } =
8563- await import("../packages/vinext/src/server/middleware.js");
8561+ it("resolveMiddlewareModuleHandler: proxy.ts with default arrow function export", async () => {
85648562 const fn = () => {};
8565- const handler = resolveMiddlewareHandler ({ default: fn }, "/app/proxy.ts");
8563+ const handler = resolveMiddlewareForTest ({ default: fn }, "/app/proxy.ts");
85668564 expect(handler).toBe(fn);
85678565 });
85688566
8569- it("resolveMiddlewareHandler: proxy.ts throws when only 'middleware' is exported (wrong name)", async () => {
8570- const { resolveMiddlewareHandler } =
8571- await import("../packages/vinext/src/server/middleware.js");
8572- expect(() => resolveMiddlewareHandler({ middleware: () => {} }, "/app/proxy.ts")).toThrow(
8567+ it("resolveMiddlewareModuleHandler: proxy.ts throws when only 'middleware' is exported (wrong name)", async () => {
8568+ expect(() => resolveMiddlewareForTest({ middleware: () => {} }, "/app/proxy.ts")).toThrow(
85738569 'The file "./proxy.ts" must export a function, either as a default export or as a named "proxy" export.',
85748570 );
85758571 });
85768572
8577- it("resolveMiddlewareHandler: proxy.ts throws when export is aliased to wrong name", async () => {
8578- const { resolveMiddlewareHandler } =
8579- await import("../packages/vinext/src/server/middleware.js");
8580- expect(() => resolveMiddlewareHandler({ handler: () => {} }, "/app/proxy.ts")).toThrow(
8573+ it("resolveMiddlewareModuleHandler: proxy.ts throws when export is aliased to wrong name", async () => {
8574+ expect(() => resolveMiddlewareForTest({ handler: () => {} }, "/app/proxy.ts")).toThrow(
85818575 'The file "./proxy.ts" must export a function, either as a default export or as a named "proxy" export.',
85828576 );
85838577 });
85848578
8585- it("resolveMiddlewareHandler: proxy.ts throws when no exports", async () => {
8586- const { resolveMiddlewareHandler } =
8587- await import("../packages/vinext/src/server/middleware.js");
8588- expect(() => resolveMiddlewareHandler({}, "/app/proxy.ts")).toThrow(
8579+ it("resolveMiddlewareModuleHandler: proxy.ts throws when no exports", async () => {
8580+ expect(() => resolveMiddlewareForTest({}, "/app/proxy.ts")).toThrow(
85898581 'The file "./proxy.ts" must export a function, either as a default export or as a named "proxy" export.',
85908582 );
85918583 });
85928584
8593- it("resolveMiddlewareHandler: proxy.ts throws when export is not a function", async () => {
8594- const { resolveMiddlewareHandler } =
8595- await import("../packages/vinext/src/server/middleware.js");
8596- expect(() => resolveMiddlewareHandler({ proxy: "not a function" }, "/app/proxy.ts")).toThrow(
8585+ it("resolveMiddlewareModuleHandler: proxy.ts throws when export is not a function", async () => {
8586+ expect(() => resolveMiddlewareForTest({ proxy: "not a function" }, "/app/proxy.ts")).toThrow(
85978587 'The file "./proxy.ts" must export a function, either as a default export or as a named "proxy" export.',
85988588 );
85998589 });
86008590
8601- it("resolveMiddlewareHandler: proxy.ts throws when default export is not a function", async () => {
8602- const { resolveMiddlewareHandler } =
8603- await import("../packages/vinext/src/server/middleware.js");
8604- expect(() => resolveMiddlewareHandler({ default: {} }, "/app/proxy.ts")).toThrow(
8591+ it("resolveMiddlewareModuleHandler: proxy.ts throws when default export is not a function", async () => {
8592+ expect(() => resolveMiddlewareForTest({ default: {} }, "/app/proxy.ts")).toThrow(
86058593 'The file "./proxy.ts" must export a function, either as a default export or as a named "proxy" export.',
86068594 );
86078595 });
86088596
8609- it("resolveMiddlewareHandler: middleware.ts with named middleware export", async () => {
8610- const { resolveMiddlewareHandler } =
8611- await import("../packages/vinext/src/server/middleware.js");
8597+ it("resolveMiddlewareModuleHandler: middleware.ts with named middleware export", async () => {
86128598 const fn = () => {};
8613- const handler = resolveMiddlewareHandler ({ middleware: fn }, "/app/middleware.ts");
8599+ const handler = resolveMiddlewareForTest ({ middleware: fn }, "/app/middleware.ts");
86148600 expect(handler).toBe(fn);
86158601 });
86168602
8617- it("resolveMiddlewareHandler: middleware.ts with default export", async () => {
8618- const { resolveMiddlewareHandler } =
8619- await import("../packages/vinext/src/server/middleware.js");
8603+ it("resolveMiddlewareModuleHandler: middleware.ts with default export", async () => {
86208604 const fn = () => {};
8621- const handler = resolveMiddlewareHandler ({ default: fn }, "/app/middleware.ts");
8605+ const handler = resolveMiddlewareForTest ({ default: fn }, "/app/middleware.ts");
86228606 expect(handler).toBe(fn);
86238607 });
86248608
8625- it("resolveMiddlewareHandler: middleware.ts throws when only 'proxy' is exported (wrong name)", async () => {
8626- const { resolveMiddlewareHandler } =
8627- await import("../packages/vinext/src/server/middleware.js");
8628- expect(() => resolveMiddlewareHandler({ proxy: () => {} }, "/app/middleware.ts")).toThrow(
8609+ it("resolveMiddlewareModuleHandler: middleware.ts throws when only 'proxy' is exported (wrong name)", async () => {
8610+ expect(() => resolveMiddlewareForTest({ proxy: () => {} }, "/app/middleware.ts")).toThrow(
86298611 'The file "./middleware.ts" must export a function, either as a default export or as a named "middleware" export.',
86308612 );
86318613 });
86328614
8633- it("resolveMiddlewareHandler: middleware.ts throws when no exports", async () => {
8634- const { resolveMiddlewareHandler } =
8635- await import("../packages/vinext/src/server/middleware.js");
8636- expect(() => resolveMiddlewareHandler({}, "/app/middleware.ts")).toThrow(
8615+ it("resolveMiddlewareModuleHandler: middleware.ts throws when no exports", async () => {
8616+ expect(() => resolveMiddlewareForTest({}, "/app/middleware.ts")).toThrow(
86378617 'The file "./middleware.ts" must export a function, either as a default export or as a named "middleware" export.',
86388618 );
86398619 });
0 commit comments