Skip to content

Commit aa76bdc

Browse files
authored
[breaking] merge resolve options when using sequence (#6401)
Closes #4051
1 parent 63c7515 commit aa76bdc

File tree

4 files changed

+150
-5
lines changed

4 files changed

+150
-5
lines changed

.changeset/red-rice-bathe.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
[breaking] merge resolve options when using sequence helper

packages/kit/src/exports/hooks/sequence.js

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,40 @@ export function sequence(...handlers) {
77
if (!length) return ({ event, resolve }) => resolve(event);
88

99
return ({ event, resolve }) => {
10-
return apply_handle(0, event);
10+
return apply_handle(0, event, {});
1111

1212
/**
1313
* @param {number} i
1414
* @param {import('types').RequestEvent} event
15+
* @param {import('types').ResolveOptions | undefined} parent_options
1516
* @returns {import('types').MaybePromise<Response>}
1617
*/
17-
function apply_handle(i, event) {
18+
function apply_handle(i, event, parent_options) {
1819
const handle = handlers[i];
1920

2021
return handle({
2122
event,
22-
resolve: i < length - 1 ? (event) => apply_handle(i + 1, event) : resolve
23+
resolve: (event, options) => {
24+
/** @param {{ html: string, done: boolean }} opts */
25+
const transformPageChunk = async ({ html, done }) => {
26+
if (options?.transformPageChunk) {
27+
html = (await options.transformPageChunk({ html, done })) ?? '';
28+
}
29+
30+
if (parent_options?.transformPageChunk) {
31+
html = (await parent_options.transformPageChunk({ html, done })) ?? '';
32+
}
33+
34+
return html;
35+
};
36+
37+
// TODO remove post-https://github.com/sveltejs/kit/pull/6197
38+
const ssr = options?.ssr ?? parent_options?.ssr;
39+
40+
return i < length - 1
41+
? apply_handle(i + 1, event, { transformPageChunk, ssr })
42+
: resolve(event, { transformPageChunk, ssr });
43+
}
2344
});
2445
}
2546
};
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import { test } from 'uvu';
2+
import * as assert from 'uvu/assert';
3+
import { sequence } from './sequence.js';
4+
import { installPolyfills } from '../node/polyfills.js';
5+
6+
installPolyfills();
7+
8+
test('applies handlers in sequence', async () => {
9+
/** @type {string[]} */
10+
const order = [];
11+
12+
const handler = sequence(
13+
async ({ event, resolve }) => {
14+
order.push('1a');
15+
const response = await resolve(event);
16+
order.push('1b');
17+
return response;
18+
},
19+
async ({ event, resolve }) => {
20+
order.push('2a');
21+
const response = await resolve(event);
22+
order.push('2b');
23+
return response;
24+
},
25+
async ({ event, resolve }) => {
26+
order.push('3a');
27+
const response = await resolve(event);
28+
order.push('3b');
29+
return response;
30+
}
31+
);
32+
33+
const event = /** @type {import('types').RequestEvent} */ ({});
34+
const response = new Response();
35+
36+
assert.equal(await handler({ event, resolve: () => response }), response);
37+
assert.equal(order, ['1a', '2a', '3a', '3b', '2b', '1b']);
38+
});
39+
40+
test('uses transformPageChunk option passed to non-terminal handle function', async () => {
41+
const handler = sequence(
42+
async ({ event, resolve }) => {
43+
return resolve(event, {
44+
transformPageChunk: ({ html, done }) => html + (done ? '-1-done' : '-1')
45+
});
46+
},
47+
async ({ event, resolve }) => resolve(event),
48+
async ({ event, resolve }) => resolve(event)
49+
);
50+
51+
const event = /** @type {import('types').RequestEvent} */ ({});
52+
const response = await handler({
53+
event,
54+
resolve: async (_event, opts = {}) => {
55+
let html = '';
56+
57+
const { transformPageChunk = ({ html }) => html } = opts;
58+
59+
html += await transformPageChunk({ html: '0', done: false });
60+
html += await transformPageChunk({ html: ' 0', done: true });
61+
62+
return new Response(html);
63+
}
64+
});
65+
66+
assert.equal(await response.text(), '0-1 0-1-done');
67+
});
68+
69+
test('merges transformPageChunk option', async () => {
70+
const handler = sequence(
71+
async ({ event, resolve }) => {
72+
return resolve(event, {
73+
transformPageChunk: ({ html, done }) => html + (done ? '-1-done' : '-1')
74+
});
75+
},
76+
async ({ event, resolve }) => {
77+
return resolve(event, {
78+
transformPageChunk: ({ html, done }) => html + (done ? '-2-done' : '-2')
79+
});
80+
},
81+
async ({ event, resolve }) => {
82+
return resolve(event, {
83+
transformPageChunk: ({ html, done }) => html + (done ? '-3-done' : '-3')
84+
});
85+
}
86+
);
87+
88+
const event = /** @type {import('types').RequestEvent} */ ({});
89+
const response = await handler({
90+
event,
91+
resolve: async (_event, opts = {}) => {
92+
let html = '';
93+
94+
const { transformPageChunk = ({ html }) => html } = opts;
95+
96+
html += await transformPageChunk({ html: '0', done: false });
97+
html += await transformPageChunk({ html: ' 0', done: true });
98+
99+
return new Response(html);
100+
}
101+
});
102+
103+
assert.equal(await response.text(), '0-3-2-1 0-3-done-2-done-1-done');
104+
});
105+
106+
test.run();

packages/kit/types/ambient.d.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,15 +253,26 @@ declare module '@sveltejs/kit/hooks' {
253253
* /** @type {import('@sveltejs/kit').Handle} *\/
254254
* async function first({ event, resolve }) {
255255
* console.log('first pre-processing');
256-
* const result = await resolve(event);
256+
* const result = await resolve(event, {
257+
* transformPageChunk: ({ html }) => {
258+
* // transforms are applied in reverse order
259+
* console.log('first transform');
260+
* return html;
261+
* }
262+
* });
257263
* console.log('first post-processing');
258264
* return result;
259265
* }
260266
*
261267
* /** @type {import('@sveltejs/kit').Handle} *\/
262268
* async function second({ event, resolve }) {
263269
* console.log('second pre-processing');
264-
* const result = await resolve(event);
270+
* const result = await resolve(event, {
271+
* transformPageChunk: ({ html }) => {
272+
* console.log('second transform');
273+
* return html;
274+
* }
275+
* });
265276
* console.log('second post-processing');
266277
* return result;
267278
* }
@@ -274,6 +285,8 @@ declare module '@sveltejs/kit/hooks' {
274285
* ```
275286
* first pre-processing
276287
* second pre-processing
288+
* second transform
289+
* first transform
277290
* second post-processing
278291
* first post-processing
279292
* ```

0 commit comments

Comments
 (0)