From 700f8083a2b85a526fdada75ce9760b7a51824ef Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 16 Jan 2024 10:54:22 -0500 Subject: [PATCH 1/3] implement serverAssets --- packages/kit/src/core/sync/write_server.js | 4 ++-- packages/kit/src/exports/vite/dev/index.js | 3 ++- packages/kit/src/exports/vite/index.js | 7 +++++++ packages/kit/src/exports/vite/preview/index.js | 5 ++++- packages/kit/src/runtime/app/paths/index.js | 2 +- packages/kit/src/runtime/app/paths/types.d.ts | 14 ++++++++++++++ packages/kit/src/types/ambient-private.d.ts | 2 ++ 7 files changed, 32 insertions(+), 5 deletions(-) diff --git a/packages/kit/src/core/sync/write_server.js b/packages/kit/src/core/sync/write_server.js index a781711bbfe9..649ccf9fecf6 100644 --- a/packages/kit/src/core/sync/write_server.js +++ b/packages/kit/src/core/sync/write_server.js @@ -29,7 +29,7 @@ const server_template = ({ }) => ` import root from '../root.${isSvelte5Plus() ? 'js' : 'svelte'}'; import { set_building, set_prerendering } from '__sveltekit/environment'; -import { set_assets } from '__sveltekit/paths'; +import { set_assets, set_server_assets } from '__sveltekit/paths'; import { set_private_env, set_public_env, set_safe_public_env } from '${runtime_directory}/shared-server.js'; export const options = { @@ -68,7 +68,7 @@ export async function get_hooks() { }; } -export { set_assets, set_building, set_prerendering, set_private_env, set_public_env, set_safe_public_env }; +export { set_assets, set_server_assets, set_building, set_prerendering, set_private_env, set_public_env, set_safe_public_env }; `; // TODO need to re-run this whenever src/app.html or src/error.html are diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index 7ebf66444548..a8c06d7d1a19 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -465,8 +465,9 @@ export async function dev(vite, vite_config, svelte_config) { ); set_fix_stack_trace(fix_stack_trace); - const { set_assets } = await vite.ssrLoadModule('__sveltekit/paths'); + const { set_assets, set_server_assets } = await vite.ssrLoadModule('__sveltekit/paths'); set_assets(assets); + set_server_assets(process.cwd()); const server = new Server(manifest); diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index 98e487c4fae7..c19a3fb88259 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -447,12 +447,14 @@ async function kit({ svelte_config }) { return dedent` export const base = ${global}?.base ?? ${s(base)}; export const assets = ${global}?.assets ?? ${assets ? s(assets) : 'base'}; + export let serverAssets = ''; `; } return dedent` export let base = ${s(base)}; export let assets = ${assets ? s(assets) : 'base'}; + export let serverAssets = ''; export const relative = ${svelte_config.kit.paths.relative}; @@ -472,6 +474,11 @@ async function kit({ svelte_config }) { export function set_assets(path) { assets = initial.assets = path; } + + /** @param {string} path */ + export function set_server_assets(path) { + serverAssets = path; + } `; } diff --git a/packages/kit/src/exports/vite/preview/index.js b/packages/kit/src/exports/vite/preview/index.js index 997922bb5272..f8bc973aa68b 100644 --- a/packages/kit/src/exports/vite/preview/index.js +++ b/packages/kit/src/exports/vite/preview/index.js @@ -36,7 +36,9 @@ export async function preview(vite, vite_config, svelte_config) { } /** @type {import('types').ServerInternalModule} */ - const { set_assets } = await import(pathToFileURL(join(dir, 'internal.js')).href); + const { set_assets, set_server_assets } = await import( + pathToFileURL(join(dir, 'internal.js')).href + ); /** @type {import('types').ServerModule} */ const { Server } = await import(pathToFileURL(join(dir, 'index.js')).href); @@ -44,6 +46,7 @@ export async function preview(vite, vite_config, svelte_config) { const { manifest } = await import(pathToFileURL(join(dir, 'manifest.js')).href); set_assets(assets); + set_server_assets(dir); const server = new Server(manifest); await server.init({ diff --git a/packages/kit/src/runtime/app/paths/index.js b/packages/kit/src/runtime/app/paths/index.js index 5a150fbfaa0f..db14b5998c6e 100644 --- a/packages/kit/src/runtime/app/paths/index.js +++ b/packages/kit/src/runtime/app/paths/index.js @@ -1,4 +1,4 @@ -export { base, assets } from '__sveltekit/paths'; +export { base, assets, serverAssets } from '__sveltekit/paths'; import { base } from '__sveltekit/paths'; import { resolve_route } from '../../../utils/routing.js'; diff --git a/packages/kit/src/runtime/app/paths/types.d.ts b/packages/kit/src/runtime/app/paths/types.d.ts index 0bc521a9fdb8..d926fc5f5840 100644 --- a/packages/kit/src/runtime/app/paths/types.d.ts +++ b/packages/kit/src/runtime/app/paths/types.d.ts @@ -12,6 +12,20 @@ export let base: '' | `/${string}`; */ export let assets: '' | `https://${string}` | `http://${string}` | '/_svelte_kit_assets'; +/** + * The directory containing assets imported by files on the server. On Node-based platforms, this allows you to read assets from the filesystem. + * + * @example + * ```js + * import fs from 'node:fs'; + * import somefile from './somefile.txt'; + * import { serverAssets } from '$app/paths'; + * + * const data = fs.readFileSync(`${serverAssets}/${somefile}`, 'utf-8'); + * ``` + */ +export let serverAssets: string; + /** * Populate a route ID with params to resolve a pathname. * @example diff --git a/packages/kit/src/types/ambient-private.d.ts b/packages/kit/src/types/ambient-private.d.ts index 544c9a73b78a..f768609c5834 100644 --- a/packages/kit/src/types/ambient-private.d.ts +++ b/packages/kit/src/types/ambient-private.d.ts @@ -11,8 +11,10 @@ declare module '__sveltekit/environment' { declare module '__sveltekit/paths' { export let base: '' | `/${string}`; export let assets: '' | `https://${string}` | `http://${string}` | '/_svelte_kit_assets'; + export let serverAssets: string; export let relative: boolean; export function reset(): void; export function override(paths: { base: string; assets: string }): void; export function set_assets(path: string): void; + export function set_server_assets(path: string): void; } From 047ac599c1cfcbedaf6679a93720fe5635a56b08 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 16 Jan 2024 11:34:20 -0500 Subject: [PATCH 2/3] update generated types --- packages/kit/types/index.d.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index acb9442b783d..b60803674e84 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2091,6 +2091,20 @@ declare module '$app/paths' { */ export let assets: '' | `https://${string}` | `http://${string}` | '/_svelte_kit_assets'; + /** + * The directory containing assets imported by files on the server. On Node-based platforms, this allows you to read assets from the filesystem. + * + * @example + * ```js + * import fs from 'node:fs'; + * import somefile from './somefile.txt'; + * import { serverAssets } from '$app/paths'; + * + * const data = fs.readFileSync(`${serverAssets}/${somefile}`, 'utf-8'); + * ``` + */ + export let serverAssets: string; + /** * Populate a route ID with params to resolve a pathname. * @example From 95279b4148960fe5e3eed817e22cb5bbf1f6ca7b Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 16 Jan 2024 14:57:11 -0500 Subject: [PATCH 3/3] lint --- packages/kit/src/types/internal.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index 22f7209be380..1114f76910c4 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -34,6 +34,7 @@ export interface ServerInternalModule { set_private_env(environment: Record): void; set_public_env(environment: Record): void; set_safe_public_env(environment: Record): void; + set_server_assets(path: string): void; set_version(version: string): void; set_fix_stack_trace(fix_stack_trace: (error: unknown) => string): void; }