Skip to content

Commit f702d16

Browse files
authored
refactor(middleware): remove dead resolver wrapper (#2972)
1 parent 0fcb7e1 commit f702d16

2 files changed

Lines changed: 34 additions & 73 deletions

File tree

packages/vinext/src/server/middleware.ts

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import path from "pathslash";
2424
import type { NextI18nConfig } from "../config/next-config.js";
2525
import { ValidFileMatcher } from "../routing/file-matcher.js";
2626
import {
27-
resolveMiddlewareModuleHandler,
2827
runGeneratedMiddleware,
2928
type MiddlewareModule,
3029
type MiddlewareResult,
@@ -46,24 +45,6 @@ export function isProxyFile(filePath: string): boolean {
4645
return base === "proxy" || base.startsWith("proxy.");
4746
}
4847

49-
/**
50-
* Resolve the middleware/proxy handler function from a module's exports.
51-
* Matches Next.js behavior: for proxy files, check `proxy` then `default`;
52-
* for middleware files, check `middleware` then `default`.
53-
*
54-
* Throws if the file exists but doesn't export a valid function, matching
55-
* Next.js's ProxyMissingExportError behavior.
56-
*
57-
* @see https://github.com/vercel/next.js/blob/canary/packages/next/src/build/templates/middleware.ts
58-
* @see https://github.com/vercel/next.js/blob/canary/test/e2e/app-dir/proxy-missing-export/proxy-missing-export.test.ts
59-
*/
60-
export function resolveMiddlewareHandler(mod: MiddlewareModule, filePath: string) {
61-
return resolveMiddlewareModuleHandler(mod, {
62-
filePath,
63-
isProxy: isProxyFile(filePath),
64-
});
65-
}
66-
6748
/**
6849
* Find the proxy or middleware file at the selected app/pages convention level.
6950
* Checks for proxy.ts (Next.js 16) first, then falls back to middleware.ts.

tests/shims.test.ts

Lines changed: 34 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ import { toClientRewrites } from "../packages/vinext/src/client/client-rewrites.
1212
import { isValidModulePath } from "../packages/vinext/src/client/validate-module-path.js";
1313
import vinext from "../packages/vinext/src/index.js";
1414
import { 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";
1520
import { buildPagesNextDataScript } from "../packages/vinext/src/server/pages-page-response.js";
1621
import type { Plugin } from "vite-plus";
1722
import 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

85158520
describe("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

Comments
 (0)