diff --git a/.changeset/honest-beers-sing.md b/.changeset/honest-beers-sing.md new file mode 100644 index 000000000000..2dca43cc372a --- /dev/null +++ b/.changeset/honest-beers-sing.md @@ -0,0 +1,9 @@ +--- +'@sveltejs/adapter-cloudflare': patch +'@sveltejs/adapter-cloudflare-workers': patch +'@sveltejs/adapter-netlify': patch +'@sveltejs/adapter-node': patch +'@sveltejs/adapter-vercel': patch +--- + +Update adapters to provide app.render with a url diff --git a/.changeset/rude-balloons-return.md b/.changeset/rude-balloons-return.md new file mode 100644 index 000000000000..7542f48c7220 --- /dev/null +++ b/.changeset/rude-balloons-return.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Error if adapter provides wrong input to app.render diff --git a/.changeset/shy-oranges-sin.md b/.changeset/shy-oranges-sin.md new file mode 100644 index 000000000000..51dbd9476aad --- /dev/null +++ b/.changeset/shy-oranges-sin.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Replace [request|page].[origin|path|query] with url object diff --git a/packages/adapter-cloudflare-workers/files/entry.js b/packages/adapter-cloudflare-workers/files/entry.js index 0422ab397828..4ec7e7bfca63 100644 --- a/packages/adapter-cloudflare-workers/files/entry.js +++ b/packages/adapter-cloudflare-workers/files/entry.js @@ -26,12 +26,10 @@ async function handle(event) { // fall back to an app route const request = event.request; - const request_url = new URL(request.url); try { const rendered = await app.render({ - path: request_url.pathname, - query: request_url.searchParams, + url: request.url, rawBody: await read(request), headers: Object.fromEntries(request.headers), method: request.method diff --git a/packages/adapter-cloudflare/files/worker.js b/packages/adapter-cloudflare/files/worker.js index 4d5296022925..aaf128a26bc5 100644 --- a/packages/adapter-cloudflare/files/worker.js +++ b/packages/adapter-cloudflare/files/worker.js @@ -33,8 +33,7 @@ export default { // dynamically-generated pages try { const rendered = await app.render({ - path: url.pathname, - query: url.searchParams, + url, rawBody: new Uint8Array(await req.arrayBuffer()), headers: Object.fromEntries(req.headers), method: req.method diff --git a/packages/adapter-netlify/src/handler.js b/packages/adapter-netlify/src/handler.js index 4c8c18547810..6673a957b3c7 100644 --- a/packages/adapter-netlify/src/handler.js +++ b/packages/adapter-netlify/src/handler.js @@ -7,18 +7,15 @@ export function init(manifest) { const app = new App(manifest); return async (event) => { - const { path, httpMethod, headers, rawQuery, body, isBase64Encoded } = event; - - const query = new URLSearchParams(rawQuery); + const { httpMethod, headers, rawUrl, body, isBase64Encoded } = event; const encoding = isBase64Encoded ? 'base64' : headers['content-encoding'] || 'utf-8'; const rawBody = typeof body === 'string' ? Buffer.from(body, encoding) : body; const rendered = await app.render({ + url: rawUrl, method: httpMethod, headers, - path, - query, rawBody }); diff --git a/packages/adapter-node/src/handler.js b/packages/adapter-node/src/handler.js index 35bbcbfcca7f..1bfeecb2b3af 100644 --- a/packages/adapter-node/src/handler.js +++ b/packages/adapter-node/src/handler.js @@ -39,14 +39,6 @@ const serve_prerendered = sirv(path.join(__dirname, '/prerendered'), { /** @type {import('polka').Middleware} */ const ssr = async (req, res) => { - let parsed; - try { - parsed = new URL(req.url || '', 'http://localhost'); - } catch (e) { - res.statusCode = 400; - return res.end('Invalid URL'); - } - let body; try { @@ -57,10 +49,9 @@ const ssr = async (req, res) => { } const rendered = await app.render({ + url: req.url, method: req.method, headers: req.headers, // TODO: what about repeated headers, i.e. string[] - path: parsed.pathname, - query: parsed.searchParams, rawBody: body }); diff --git a/packages/adapter-vercel/files/entry.js b/packages/adapter-vercel/files/entry.js index 48994586526b..a477ecc950bf 100644 --- a/packages/adapter-vercel/files/entry.js +++ b/packages/adapter-vercel/files/entry.js @@ -8,8 +8,6 @@ __fetch_polyfill(); const app = new App(manifest); export default async (req, res) => { - const { pathname, searchParams } = new URL(req.url || '', 'http://localhost'); - let body; try { @@ -20,10 +18,9 @@ export default async (req, res) => { } const rendered = await app.render({ + url: req.url, method: req.method, headers: req.headers, - path: pathname, - query: searchParams, rawBody: body }); diff --git a/packages/kit/src/core/build/build_server.js b/packages/kit/src/core/build/build_server.js index 0411241f351c..b88da0e2c889 100644 --- a/packages/kit/src/core/build/build_server.js +++ b/packages/kit/src/core/build/build_server.js @@ -88,6 +88,11 @@ export class App { render(request, { prerender } = {}) { + // TODO remove this for 1.0 + if (Object.keys(request).sort().join() !== 'headers,method,rawBody,url') { + throw new Error('Adapters should call app.render({ url, method, headers, rawBody })'); + } + const host = ${ config.kit.host ? s(config.kit.host)