diff --git a/.changeset/fix-remote-read-top-level.md b/.changeset/fix-remote-read-top-level.md new file mode 100644 index 000000000000..59df4be0068c --- /dev/null +++ b/.changeset/fix-remote-read-top-level.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: allow `read` to be used at the top-level of remote function files diff --git a/packages/kit/src/core/postbuild/analyse.js b/packages/kit/src/core/postbuild/analyse.js index 2ea1bf759bf1..c71a8addf65a 100644 --- a/packages/kit/src/core/postbuild/analyse.js +++ b/packages/kit/src/core/postbuild/analyse.js @@ -56,7 +56,7 @@ async function analyse({ // essential we do this before analysing the code internal.set_building(); - // set env, in case it's used in initialisation + // set env, `read`, and `manifest`, in case they're used in initialisation const { publicPrefix: public_prefix, privatePrefix: private_prefix } = config.env; const private_env = filter_env(env, private_prefix, public_prefix); const public_env = filter_env(env, public_prefix, private_prefix); diff --git a/packages/kit/src/core/postbuild/prerender.js b/packages/kit/src/core/postbuild/prerender.js index d77a79f85fd1..8caa68fdfe85 100644 --- a/packages/kit/src/core/postbuild/prerender.js +++ b/packages/kit/src/core/postbuild/prerender.js @@ -485,14 +485,16 @@ async function prerender({ hash, out, manifest_path, metadata, verbose, env }) { } } - // the user's remote function modules may reference environment variables at - // the top-level so we need to set `env` before evaluating those modules - // to avoid potential runtime errors + // the user's remote function modules may reference environment variables, + // `read` or the `manifest` at the top-level so we need to set them before + // evaluating those modules to avoid potential runtime errors const { publicPrefix: public_prefix, privatePrefix: private_prefix } = config.env; const private_env = filter_env(env, private_prefix, public_prefix); const public_env = filter_env(env, public_prefix, private_prefix); internal.set_private_env(private_env); internal.set_public_env(public_env); + internal.set_manifest(manifest); + internal.set_read_implementation((file) => createReadableStream(`${out}/server/${file}`)); /** @type {Array} */ const prerender_functions = []; diff --git a/packages/kit/test/apps/basics/src/routes/remote/prerender/+page.svelte b/packages/kit/test/apps/basics/src/routes/remote/prerender/+page.svelte index 2aed2389b185..f2c7557001e1 100644 --- a/packages/kit/test/apps/basics/src/routes/remote/prerender/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/remote/prerender/+page.svelte @@ -1,8 +1,9 @@ whole-page @@ -17,3 +18,6 @@ > {live_result} + diff --git a/packages/kit/test/apps/basics/src/routes/remote/prerender/prerender.remote.js b/packages/kit/test/apps/basics/src/routes/remote/prerender/prerender.remote.js index 1f98f8c08f99..fa16970f0572 100644 --- a/packages/kit/test/apps/basics/src/routes/remote/prerender/prerender.remote.js +++ b/packages/kit/test/apps/basics/src/routes/remote/prerender/prerender.remote.js @@ -1,5 +1,11 @@ import { building, dev } from '$app/environment'; -import { prerender } from '$app/server'; +import { prerender, read } from '$app/server'; +import text from './test.txt?url'; + +// test that using `read()` at the top-level of a remote function file doesn't +// throw an error when we evaluate the remote function files during build +const response = read(text); +const content = await response.text(); export const prerendered = prerender(() => { if (!building && !dev) { @@ -23,3 +29,7 @@ export const prerendered_entries = prerender( }, { inputs: () => ['a', 'b', /* to test correct encoding */ '中文'], dynamic: true } ); + +export const with_read = prerender(() => { + return content; +}); diff --git a/packages/kit/test/apps/basics/src/routes/remote/prerender/test.txt b/packages/kit/test/apps/basics/src/routes/remote/prerender/test.txt new file mode 100644 index 000000000000..40ea33488789 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/remote/prerender/test.txt @@ -0,0 +1 @@ +test content from read()