Skip to content

Commit 64449a7

Browse files
feat: Move hooks.{js|ts} init to Server.init instead of Server.respond (#6179)
* feat: Move hooks.js initialization into Server.init * fix: Server type * feat: Await Server.init in adapters * feat: Await server.init in preview * fix: Init server during prerender * feat: Init hooks when dev mode starts instead of on first request * fix: Prerendering, but better * feat: Test env vars in prerender * fix: Remove console.log * fix: Import in hooks.js of basics test app * changeset * Update packages/adapter-netlify/src/serverless.js Co-authored-by: Rich Harris <richard.a.harris@gmail.com> * Update packages/kit/src/vite/build/build_server.js Co-authored-by: Rich Harris <richard.a.harris@gmail.com> * feat: Enable top-level await in `adapter-node` * feat: Add warning comment for future devs * fix: Init env prior to hooks * fix: Remove dear Rich * fix: Apparently didn't like my tsconfig * fix: Move env and hooks initialization later * move user_hooks init back from whence it came Co-authored-by: Rich Harris <richard.a.harris@gmail.com> Co-authored-by: Rich Harris <hello@rich-harris.dev>
1 parent 349dc2d commit 64449a7

File tree

19 files changed

+90
-19
lines changed

19 files changed

+90
-19
lines changed

.changeset/curvy-students-march.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
'@sveltejs/adapter-cloudflare': patch
3+
'@sveltejs/adapter-cloudflare-workers': patch
4+
'@sveltejs/adapter-netlify': patch
5+
'@sveltejs/adapter-node': patch
6+
'@sveltejs/adapter-vercel': patch
7+
'@sveltejs/kit': patch
8+
---
9+
10+
[feat] Moved hooks.js initialization from Server.respond into Server.init

packages/adapter-cloudflare-workers/files/entry.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export default {
1515
* @param {any} context
1616
*/
1717
async fetch(req, env, context) {
18-
server.init({ env });
18+
await server.init({ env });
1919

2020
const url = new URL(req.url);
2121

packages/adapter-cloudflare/src/worker.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const prefix = `/${manifest.appDir}/`;
99
/** @type {import('worktop/cfw').Module.Worker<{ ASSETS: import('worktop/cfw.durable').Durable.Object }>} */
1010
const worker = {
1111
async fetch(req, env, context) {
12-
server.init({ env });
12+
await server.init({ env });
1313
// skip cache if "cache-control: no-cache" in request
1414
let pragma = req.headers.get('cache-control') || '';
1515
let res = !pragma.includes('no-cache') && (await Cache.lookup(req));

packages/adapter-netlify/src/serverless.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,16 @@ import { split_headers } from './headers';
99
export function init(manifest) {
1010
const server = new Server(manifest);
1111

12-
server.init({
12+
let init_promise = server.init({
1313
env: process.env
1414
});
1515

1616
return async (event, context) => {
17+
if (init_promise !== null) {
18+
await init_promise;
19+
init_promise = null;
20+
}
21+
1722
const response = await server.respond(to_request(event), {
1823
platform: { context },
1924
getClientAddress() {

packages/adapter-node/src/handler.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { env } from './env.js';
1111
/* global ENV_PREFIX */
1212

1313
const server = new Server(manifest);
14-
server.init({ env: process.env });
14+
await server.init({ env: process.env });
1515
const origin = env('ORIGIN', undefined);
1616
const xff_depth = parseInt(env('XFF_DEPTH', '1'));
1717

packages/adapter-node/tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
"noImplicitAny": true,
77
"allowSyntheticDefaultImports": true,
88
"moduleResolution": "node",
9-
"module": "es2020",
9+
"module": "es2022",
10+
"target": "es2017",
1011
"baseUrl": ".",
1112
"paths": {
1213
"@sveltejs/kit": ["../kit/types/index"]

packages/adapter-vercel/files/serverless.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ installPolyfills();
77

88
const server = new Server(manifest);
99

10-
server.init({
10+
await server.init({
1111
env: process.env
1212
});
1313

packages/kit/src/core/prerender/prerender.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { load_config } from '../config/index.js';
1515
* @typedef {import('types').Logger} Logger
1616
*/
1717

18-
const [, , client_out_dir, results_path, manifest_path, verbose] = process.argv;
18+
const [, , client_out_dir, results_path, manifest_path, verbose, env] = process.argv;
1919

2020
prerender();
2121

@@ -159,6 +159,7 @@ export async function prerender() {
159159
});
160160

161161
const server = new Server(manifest);
162+
await server.init({ env: JSON.parse(env) });
162163

163164
const error = normalise_error_handler(log, config);
164165

packages/kit/src/vite/build/build_server.js

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,12 @@ export class Server {
8484
};
8585
}
8686
87-
init({ env }) {
87+
/**
88+
* Take care: Some adapters may have to call \`Server.init\` per-request to set env vars,
89+
* so anything that shouldn't be rerun should be wrapped in an \`if\` block to make sure it hasn't
90+
* been done already.
91+
*/
92+
async init({ env }) {
8893
const entries = Object.entries(env);
8994
9095
const prv = Object.fromEntries(entries.filter(([k]) => !k.startsWith('${
@@ -99,12 +104,6 @@ export class Server {
99104
set_public_env(pub);
100105
101106
this.options.public_env = pub;
102-
}
103-
104-
async respond(request, options = {}) {
105-
if (!(request instanceof Request)) {
106-
throw new Error('The first argument to server.respond must be a Request object. See https://github.com/sveltejs/kit/pull/3384 for details');
107-
}
108107
109108
if (!this.options.hooks) {
110109
const module = await import(${s(hooks)});
@@ -114,6 +113,12 @@ export class Server {
114113
externalFetch: module.externalFetch || fetch
115114
};
116115
}
116+
}
117+
118+
async respond(request, options = {}) {
119+
if (!(request instanceof Request)) {
120+
throw new Error('The first argument to server.respond must be a Request object. See https://github.com/sveltejs/kit/pull/3384 for details');
121+
}
117122
118123
return respond(request, this.options, options);
119124
}

packages/kit/src/vite/index.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,13 @@ function kit() {
411411

412412
const child = fork(
413413
script,
414-
[vite_config.build.outDir, results_path, manifest_path, '' + verbose],
414+
[
415+
vite_config.build.outDir,
416+
results_path,
417+
manifest_path,
418+
'' + verbose,
419+
JSON.stringify({ ...env.private, ...env.public })
420+
],
415421
{
416422
stdio: 'inherit'
417423
}

0 commit comments

Comments
 (0)