Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[fix] prerendering always false in global code of hooks.js #4265 #4322

Merged
merged 13 commits into from Mar 14, 2022
5 changes: 5 additions & 0 deletions .changeset/stale-crabs-carry.md
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': patch
---

load hooks after server initialisation, to ensure `prerendering` is correct
27 changes: 13 additions & 14 deletions packages/kit/src/core/build/build_server.js
Expand Up @@ -35,15 +35,6 @@ let read = null;

set_paths(${s(config.kit.paths)});

// this looks redundant, but the indirection allows us to access
// named imports without triggering Rollup's missing import detection
const get_hooks = hooks => ({
getSession: hooks.getSession || (() => ({})),
handle: hooks.handle || (({ event, resolve }) => resolve(event)),
handleError: hooks.handleError || (({ error }) => console.error(error.stack)),
externalFetch: hooks.externalFetch || fetch
});

let default_protocol = 'https';

// allow paths to be globally overridden
Expand All @@ -57,16 +48,14 @@ export function override(settings) {

export class Server {
constructor(manifest) {
const hooks = get_hooks(user_hooks);

this.options = {
amp: ${config.kit.amp},
csp: ${s(config.kit.csp)},
dev: false,
floc: ${config.kit.floc},
get_stack: error => String(error), // for security
handle_error: (error, event) => {
hooks.handleError({
this.options.hooks.handleError({
error,
event,

Expand All @@ -78,7 +67,7 @@ export class Server {
});
error.stack = this.options.get_stack(error);
},
hooks,
hooks: null,
hydrate: ${s(config.kit.browser.hydrate)},
manifest,
method_override: ${s(config.kit.methodOverride)},
Expand All @@ -95,11 +84,21 @@ export class Server {
};
}

respond(request, options = {}) {
async respond(request, options = {}) {
if (!(request instanceof Request)) {
throw new Error('The first argument to server.respond must be a Request object. See https://github.com/sveltejs/kit/pull/3384 for details');
}

if (!this.options.hooks) {
const module = await import(${s(hooks)});
this.options.hooks = {
getSession: module.getSession || (() => ({})),
handle: module.handle || (({ event, resolve }) => resolve(event)),
handleError: module.handleError || (({ error }) => console.error(error.stack)),
externalFetch: module.externalFetch || fetch
};
}

return respond(request, this.options, options);
}
}
Expand Down
15 changes: 15 additions & 0 deletions packages/kit/test/prerendering/basics/src/hooks.js
@@ -0,0 +1,15 @@
import { prerendering } from '$app/env';

const initial_prerendering = prerendering;

export const handle = async ({ event, resolve }) => {
if (event.url.pathname === '/prerendering-true' && prerendering) {
return await resolve(event, {
transformPage: ({ html }) =>
html
.replace('__INITIAL_PRERENDERING__', initial_prerendering)
.replace('__PRERENDERING__', prerendering)
});
}
return await resolve(event);
};
@@ -0,0 +1 @@
<h1>prerendering: __INITIAL_PRERENDERING__/__PRERENDERING__</h1>
5 changes: 5 additions & 0 deletions packages/kit/test/prerendering/basics/test/test.js
Expand Up @@ -104,4 +104,9 @@ test('decodes paths when writing files', () => {
assert.equal(content, JSON.stringify({ path: 'path with encoded spaces' }));
});

test('prerendering is set to true in global code of hooks.js', () => {
const content = read('prerendering-true.html');
assert.ok(content.includes('<h1>prerendering: true/true</h1>'), content);
});

test.run();