Skip to content

Commit 57fd31e

Browse files
authored
Merge pull request #16 from vordgi/nmc-15
nmc-15 chain item rules
2 parents ddce4bc + 2b5c87e commit 57fd31e

File tree

8 files changed

+34
-11
lines changed

8 files changed

+34
-11
lines changed
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export default function Home() {
22
return (
33
<div>
4-
<p>Home page</p>
4+
<p>Home page (dk)</p>
55
</div>
66
);
77
}
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export default function Home() {
22
return (
33
<div>
4-
<p>Home page</p>
4+
<p>Home page (en)</p>
55
</div>
66
);
77
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export default function Private() {
2+
return (
3+
<div>
4+
<p>Private page</p>
5+
</div>
6+
);
7+
}

examples/auth-intl/src/middleware.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ const intlMiddleware = createMiddleware({
88
});
99

1010
export default chain([
11-
intlMiddleware,
11+
[intlMiddleware, { exclude: /^\/private(\/.*)?$/ }],
1212
(req) => {
1313
if (req.summary.type === "redirect") return FinalNextResponse.next();
1414
},
15-
nextAuth,
15+
[nextAuth, { include: /^\/private(\/.*)?$/ }],
1616
]);
1717

1818
export const config = {

package/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nimpl/middleware-chain",
3-
"version": "0.1.3",
3+
"version": "0.2.0",
44
"description": "",
55
"main": "./dist/chain.js",
66
"files": [
@@ -33,4 +33,4 @@
3333
"next": ">= 14.0.0",
3434
"react": ">= 18.2.0"
3535
}
36-
}
36+
}

package/src/chain.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { type NextRequest } from "next/server";
22
import { collectData } from "./lib/collect-data";
3-
import { Middleware } from "./lib/types";
3+
import { ChainItem } from "./lib/types";
44
import { formatResponse } from "./lib/format-response";
55
export { FinalNextResponse } from "./lib/final-next-response";
66

7-
export const chain = (middlewares: Middleware[]) => async (req: NextRequest) => {
7+
export const chain = (middlewares: ChainItem[]) => async (req: NextRequest) => {
88
const summary = await collectData(req, middlewares);
99
const next = formatResponse(summary);
1010

package/src/lib/collect-data.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { NextResponse, type NextRequest } from "next/server";
2-
import { type ChainNextResponse, type Middleware, type Summary } from "./types";
2+
import { ChainItem, Middleware, type ChainNextResponse, type Summary } from "./types";
33
import { FinalSymbol } from "./final-next-response";
44
import { INTERNAL_HEADERS } from "./constants";
55

6-
export const collectData = async (req: NextRequest, middlewares: Middleware[]) => {
6+
export const collectData = async (req: NextRequest, chainItems: ChainItem[]) => {
77
const summary: Summary = {
88
type: "none",
99
destination: req.nextUrl,
@@ -13,7 +13,21 @@ export const collectData = async (req: NextRequest, middlewares: Middleware[]) =
1313
body: undefined,
1414
};
1515

16-
for await (const middleware of middlewares) {
16+
for await (const chainItem of chainItems) {
17+
let middleware: Middleware;
18+
if (Array.isArray(chainItem)) {
19+
const [itemMiddleware, itemRules] = chainItem;
20+
if (
21+
itemRules &&
22+
((itemRules.include && !itemRules.include?.test(req.nextUrl.pathname)) ||
23+
itemRules.exclude?.test(req.nextUrl.pathname))
24+
) {
25+
continue;
26+
}
27+
middleware = itemMiddleware;
28+
} else {
29+
middleware = chainItem;
30+
}
1731
const middlewareNext = await middleware(Object.assign(req, { summary: Object.freeze({ ...summary }) }));
1832

1933
if (!middlewareNext) continue;

package/src/lib/types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,5 @@ export type ChainNextResponse = FinalNextResponse | (NextResponse & { [FinalSymb
2424
export type MiddlewareResult = ChainNextResponse | Response | void | undefined | null | Promise<MiddlewareResult>;
2525

2626
export type Middleware = (req: ChainNextRequest) => MiddlewareResult;
27+
28+
export type ChainItem = Middleware | [Middleware, { include?: RegExp; exclude?: RegExp }?];

0 commit comments

Comments
 (0)