Skip to content

Commit 6aa0d38

Browse files
WIP
1 parent 49f5cff commit 6aa0d38

4 files changed

Lines changed: 37 additions & 22 deletions

File tree

src/middlewares/mod.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,22 @@ export type Middleware<State> = MiddlewareFn<State> | MiddlewareFn<State>[];
8383

8484
export function compileMiddlewares<State>(
8585
middlewares: MiddlewareFn<State>[],
86-
init: MiddlewareFn<State>,
8786
): MiddlewareFn<State> {
88-
let fn: MiddlewareFn<State> = init;
87+
if (middlewares.length === 0) return (ctx) => ctx.next();
8988

90-
for (let i = middlewares.length - 1; i >= 0; i--) {
91-
const local = middlewares[i];
92-
const next = fn;
89+
let fn: MiddlewareFn<State>;
90+
let last: MiddlewareFn<State>;
9391

92+
for (let i = middlewares.length - 1; i >= 0; i--) {
9493
fn = async (ctx) => {
9594
const internals = getInternals(ctx);
9695
const { app: prevApp, layouts: prevLayouts } = internals;
9796

98-
ctx.next = async () => await next(ctx);
97+
ctx.next = i < middlewares.length - 1
98+
? async () => await middlewares[i + 1](ctx)
99+
: async () => await last(ctx);
99100
try {
100-
return await local(ctx);
101+
return await middlewares[i](ctx);
101102
} catch (err) {
102103
ctx.error = err;
103104
throw err;
@@ -108,5 +109,8 @@ export function compileMiddlewares<State>(
108109
};
109110
}
110111

111-
return fn;
112+
return (ctx) => {
113+
last = ctx.next;
114+
return fn(ctx);
115+
};
112116
}

src/middlewares/mod_test.ts

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@ import { expect } from "@std/expect";
33
import { serveMiddleware } from "../test_utils.ts";
44
import type { MiddlewareFn } from "./mod.ts";
55

6-
const THROWER = () => {
7-
throw new Error("fail");
8-
};
9-
106
Deno.test("compileMiddlewares", async () => {
117
const middlewares: MiddlewareFn<{ text: string }>[] = [
128
(ctx) => {
@@ -28,7 +24,7 @@ Deno.test("compileMiddlewares", async () => {
2824
];
2925

3026
const server = serveMiddleware<{ text: string }>(
31-
compileMiddlewares(middlewares, THROWER),
27+
compileMiddlewares(middlewares),
3228
);
3329

3430
const res = await server.get("/");
@@ -50,7 +46,7 @@ Deno.test("compileMiddlewares - middlewares should only be called once", async (
5046
new Response(String(ctx.state.count));
5147

5248
const server = serveMiddleware<{ count: number }>(
53-
compileMiddlewares([A], final),
49+
compileMiddlewares([A, final]),
5450
);
5551

5652
const res = await server.get("/");
@@ -80,8 +76,7 @@ Deno.test("runMiddleware - runs multiple stacks", async () => {
8076
new Response(String(ctx.state.text));
8177

8278
const server = serveMiddleware<State>(compileMiddlewares(
83-
[A, B, C, D],
84-
final,
79+
[A, B, C, D, final],
8580
));
8681

8782
const res = await server.get("/");
@@ -118,14 +113,13 @@ Deno.test("runMiddleware - throws errors", async () => {
118113
throw err;
119114
}
120115
},
116+
() => {
117+
throw new Error("fail");
118+
},
121119
];
122120

123-
const final = () => {
124-
throw new Error("fail");
125-
};
126-
127121
const server = serveMiddleware<{ text: string }>(
128-
compileMiddlewares(middlewares, final),
122+
compileMiddlewares(middlewares),
129123
);
130124

131125
try {
@@ -137,3 +131,19 @@ Deno.test("runMiddleware - throws errors", async () => {
137131
expect(thrownB).toBeInstanceOf(Error);
138132
expect(thrownC).toBeInstanceOf(Error);
139133
});
134+
135+
Deno.test("compileMiddlewares - calls last next", async () => {
136+
const middlewares: MiddlewareFn<{ text: string }>[] = [
137+
(ctx) => ctx.next(),
138+
];
139+
140+
const next = () => Promise.resolve(new Response("next"));
141+
142+
const server = serveMiddleware<{ text: string }>(
143+
compileMiddlewares(middlewares),
144+
{ next },
145+
);
146+
147+
const res = await server.get("/");
148+
expect(await res.text()).toEqual("next");
149+
});

tests/partials_test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2593,6 +2593,7 @@ Deno.test({
25932593
});
25942594

25952595
Deno.test({
2596+
only: true,
25962597
name: "partials - render 404 partial",
25972598
fn: async () => {
25982599
const app = testApp()

tests/test_utils.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const browser = await launch({
3535
? ["--no-sandbox"]
3636
: []),
3737
],
38-
headless: true,
38+
headless: false,
3939
});
4040

4141
export function getIsland(pathname: string) {

0 commit comments

Comments
 (0)