diff --git a/.changeset/late-dancers-vanish.md b/.changeset/late-dancers-vanish.md new file mode 100644 index 000000000000..2d3e6b3951e9 --- /dev/null +++ b/.changeset/late-dancers-vanish.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-node': patch +--- + +fix: make serve_prerendered middleware work with node http server diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index e530fc192d28..d07c26e11639 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -32,6 +32,7 @@ "prepublishOnly": "pnpm build" }, "devDependencies": { + "@polka/url": "^1.0.0-next.21", "@sveltejs/kit": "workspace:^", "@types/node": "^16.18.6", "c8": "^7.12.0", diff --git a/packages/adapter-node/rollup.config.js b/packages/adapter-node/rollup.config.js index 93c9b3502f26..4c00ce5f1eb0 100644 --- a/packages/adapter-node/rollup.config.js +++ b/packages/adapter-node/rollup.config.js @@ -1,7 +1,7 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import json from '@rollup/plugin-json'; -import { builtinModules } from 'module'; +import { builtinModules } from 'node:module'; export default [ { diff --git a/packages/adapter-node/src/handler.js b/packages/adapter-node/src/handler.js index 650ab3ce6018..331b6cccaff2 100644 --- a/packages/adapter-node/src/handler.js +++ b/packages/adapter-node/src/handler.js @@ -3,6 +3,7 @@ import fs from 'node:fs'; import path from 'node:path'; import sirv from 'sirv'; import { fileURLToPath } from 'node:url'; +import { parse as polka_url_parser } from '@polka/url'; import { getRequest, setResponse } from '@sveltejs/kit/node'; import { Server } from 'SERVER'; import { manifest, prerendered } from 'MANIFEST'; @@ -50,7 +51,7 @@ function serve_prerendered() { const handler = serve(path.join(dir, 'prerendered')); return (req, res, next) => { - let pathname = req.path; + let { pathname, search, query } = polka_url_parser(req); try { pathname = decodeURIComponent(pathname); @@ -65,8 +66,7 @@ function serve_prerendered() { // remove or add trailing slash as appropriate let location = pathname.at(-1) === '/' ? pathname.slice(0, -1) : pathname + '/'; if (prerendered.has(location)) { - const search = req.url.split('?')[1]; - if (search) location += `?${search}`; + if (query) location += search; res.writeHead(308, { location }).end(); } else { next(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0be98413f85..45775bbe7bd0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -114,6 +114,7 @@ importers: packages/adapter-node: specifiers: + '@polka/url': ^1.0.0-next.21 '@rollup/plugin-commonjs': ^24.0.0 '@rollup/plugin-json': ^6.0.0 '@rollup/plugin-node-resolve': ^15.0.1 @@ -132,6 +133,7 @@ importers: '@rollup/plugin-node-resolve': 15.0.1_rollup@3.7.0 rollup: 3.7.0 devDependencies: + '@polka/url': 1.0.0-next.21 '@sveltejs/kit': link:../kit '@types/node': 16.18.6 c8: 7.12.0