diff --git a/packages/kit/src/core/env.js b/packages/kit/src/core/env.js index c70f50502bb7..46042008c29f 100644 --- a/packages/kit/src/core/env.js +++ b/packages/kit/src/core/env.js @@ -112,12 +112,13 @@ export async function load_explicit_env(kit, file, root, mode) { } /** - * Creates the `__sveltekit/env` module + * Creates the `/env/config.js` module * @param {Record | undefined> | null} variables * @param {Record} env * @param {string | null} entry + * @param {boolean} is_dev */ -export function create_sveltekit_env(variables, env, entry) { +export function create_sveltekit_env(variables, env, entry, is_dev) { const imports = entry ? [ `import { variables } from ${JSON.stringify(entry)};`, @@ -170,33 +171,25 @@ export function create_sveltekit_env(variables, env, entry) { }` ]; - return blocks.join('\n\n'); -} + if (is_dev) { + // In dev, initialise the env immediately. Tools like `vite-node` load modules + // through the Vite config but don't run the SvelteKit dev server, which is what + // normally calls `set_env`. Without this, dynamic env vars imported from + // `$app/env/public` and `$app/env/private` would be `undefined` in such contexts. + /** @type {Record} */ + const dev_env = {}; + for (const name of Object.keys(variables ?? {})) { + if (name in env) dev_env[name] = env[name]; + } -/** - * @param {Record | undefined> | null} variables - * @param {Record} env - */ -export function create_sveltekit_env_dev(variables, env) { - // In dev, initialise the env immediately. Tools like `vite-node` load modules - // through the Vite config but don't run the SvelteKit dev server, which is what - // normally calls `set_env`. Without this, dynamic env vars imported from - // `$app/env/public` and `$app/env/private` would be `undefined` in such contexts. - /** @type {Record} */ - const dev_env = {}; - for (const name of Object.keys(variables ?? {})) { - if (name in env) dev_env[name] = env[name]; + blocks.push(`set_env(${devalue.uneval(dev_env)});`); } - return [ - `import { set_env } from './config.js';`, - `set_env(${devalue.uneval(dev_env)});`, - `export * from './config.js';` - ].join('\n\n'); + return blocks.join('\n\n'); } /** - * Creates the `__sveltekit/env/private` module + * Creates the `/env/private/server.js` module * @param {Record> | null} variables * @param {Record} env */ @@ -223,11 +216,11 @@ export function create_sveltekit_env_private(variables, env) { handle_issues(issues); - return `import { dynamic_private_env as env } from '__sveltekit/env';\n\n${exports.join('')}`; + return `import { dynamic_private_env as env } from '../config.js';\n\n${exports.join('')}`; } /** - * Creates the `__sveltekit/env/public/*` modules + * Creates the `/env/public/*` modules * @param {Record> | null} variables * @param {Record} env * @param {string} prelude @@ -259,7 +252,7 @@ export function create_sveltekit_env_public(variables, env, prelude) { } /** - * Creates the `__sveltekit/env/service-worker` module used in production. When an app uses + * Creates the `/env/service-worker.js` module used in production. When an app uses * dynamic public env vars, they're loaded at runtime via an import of the prerendered * `env.js`. If there are none, values are inlined. * @param {Record> | null} variables @@ -297,7 +290,7 @@ export function create_sveltekit_env_service_worker( } /** - * Creates the `__sveltekit/env/service-worker` module used in development + * Creates the `/env/service-worker.js` module used in development * @param {Record> | null} variables * @param {Record} env * @param {string} version diff --git a/packages/kit/src/core/postbuild/analyse.js b/packages/kit/src/core/postbuild/analyse.js index dad39d6bca64..dde9f386195e 100644 --- a/packages/kit/src/core/postbuild/analyse.js +++ b/packages/kit/src/core/postbuild/analyse.js @@ -54,7 +54,7 @@ async function analyse({ // `set_env` lives in a separate module that imports the user's `src/env` config. We import it // *after* `set_building()` so that `building`-dependent expressions resolve correctly - /** @type {typeof import('__sveltekit/env')} */ + /** @type {typeof import('/env/config.js')} */ const { set_env } = await import(pathToFileURL(`${server_root}/server/env.js`).href); set_env(env); diff --git a/packages/kit/src/core/postbuild/prerender.js b/packages/kit/src/core/postbuild/prerender.js index aeede61deec8..a32690448fb0 100644 --- a/packages/kit/src/core/postbuild/prerender.js +++ b/packages/kit/src/core/postbuild/prerender.js @@ -62,7 +62,7 @@ async function prerender({ // `set_env` and `Server` live in modules that import the user's `src/env` config. We import them // *after* `set_building()` so that `building`-dependent expressions resolve correctly - /** @type {typeof import('__sveltekit/env')} */ + /** @type {typeof import('/env/config.js')} */ const { set_env } = await import(pathToFileURL(`${out}/server/env.js`).href); set_env(env); diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index 86e18b51d7a0..ace5deebe27f 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -94,7 +94,8 @@ const enforced_config = { resolve: { alias: { $app: true, - $env: true + $env: true, + '': true } } }; @@ -455,6 +456,10 @@ function kit({ svelte_config }) { { find: '__SERVER__', replacement: `${generated}/server` }, { find: '$app', replacement: `${runtime_directory}/app` }, { find: '$env', replacement: `${runtime_directory}/env` }, + { + find: '', + replacement: `${out_dir}/generated/${is_build ? 'build' : 'dev'}` + }, { find: '__sveltekit/server', replacement: `${runtime_directory}/server/internal.js` @@ -504,7 +509,7 @@ function kit({ svelte_config }) { // because they for example use rolldown.build with `platform: 'browser'` 'esm-env', // This forces `$app/*` modules to be bundled, since they depend on - // virtual modules like `__sveltekit/env` (this isn't a valid bare + // generated modules like `/env/config.js` (this isn't a valid bare // import, but it works with vite-node's externalization logic, which // uses basic concatenation) '@sveltejs/kit/src/runtime' @@ -1063,6 +1068,9 @@ function kit({ svelte_config }) { const new_config = { environments: { serviceWorker: { + define: { + __SVELTEKIT_PAYLOAD__: kit_global + }, build: { modulePreload: false, rolldownOptions: { @@ -1198,7 +1206,7 @@ function kit({ svelte_config }) { // build time, so `env.js` is loaded at runtime. In dev, the // imported module just inlines the current values instead. return { - code: `import '__sveltekit/env/service-worker';\n${code}` + code: `import '/env/service-worker.js';\n${code}` }; } } @@ -1231,7 +1239,7 @@ function kit({ svelte_config }) { const server_input = { index: `${runtime_directory}/server/index.js`, internal: `${out_dir}/generated/server/internal.js`, - env: '__sveltekit/env', + env: '/env/config.js', ['remote-entry']: `${runtime_directory}/app/server/remote/index.js` }; @@ -1765,7 +1773,8 @@ function kit({ svelte_config }) { has_explicit_dynamic_public_env && client_chunks.some( (chunk) => - chunk.type === 'chunk' && chunk.modules[`${out_dir}/generated/env/public/client.js`] + chunk.type === 'chunk' && + chunk.modules[`${out_dir}/generated/build/env/public/client.js`] ); if (kit.output.bundleStrategy === 'split') { @@ -1965,8 +1974,11 @@ function kit({ svelte_config }) { log.info('Building service worker'); // mirror client settings that we couldn't set per environment in the config hook - builder.environments.serviceWorker.config.define = - builder.environments.client.config.define; + builder.environments.serviceWorker.config.define = { + ...builder.environments.client.config.define, + ...builder.environments.serviceWorker.config.define + }; + builder.environments.serviceWorker.config.resolve.alias = [ ...get_config_aliases(kit, vite_config.root) ]; diff --git a/packages/kit/src/exports/vite/plugins/env-vars.js b/packages/kit/src/exports/vite/plugins/env-vars.js index 45bbd6cfcb77..dfda9efa8f3a 100644 --- a/packages/kit/src/exports/vite/plugins/env-vars.js +++ b/packages/kit/src/exports/vite/plugins/env-vars.js @@ -5,7 +5,6 @@ import path from 'node:path'; import * as sync from '../../../core/sync/sync.js'; import { create_sveltekit_env, - create_sveltekit_env_dev, create_sveltekit_env_private, create_sveltekit_env_public, create_sveltekit_env_service_worker, @@ -18,7 +17,6 @@ import { s } from '../../../utils/misc.js'; import { write_if_changed } from '../../../core/sync/utils.js'; import { hash } from '../../../utils/hash.js'; import { posixify } from '../../../utils/os.js'; -import { prefixRegex } from '@rolldown/pluginutils'; /** * Generate (and, in dev, maintain) a `${outDir}/generated/env/config.js` module @@ -29,14 +27,10 @@ import { prefixRegex } from '@rolldown/pluginutils'; * @returns {Plugin} */ export function plugin_env_vars(config, callback) { - // grab these values eagerly because they get mutated (TODO stop mutating them) - const dir = config.env.dir; - const out = config.outDir; - const version_hash = hash(config.version.name); /** @type {string} */ - let out_dir; + let dir; /** @type {Record} */ let env; @@ -66,71 +60,71 @@ export function plugin_env_vars(config, callback) { deps = synced.deps; const vars = synced.variables; - const dir = `${out_dir}/generated/env`; + callback(vars); write_if_changed( `${dir}/config.js`, create_sveltekit_env( vars, env, - resolved_entry && posixify(path.relative(dir, resolved_entry)) - ) - ); - - write_if_changed(`${dir}/config-dev.js`, create_sveltekit_env_dev(vars, env)); - - write_if_changed( - `${dir}/public/client.js`, - create_sveltekit_env_public( - vars, - env, - `import { payload } from ${s(posixify(path.relative(`${dir}/public`, `${runtime_directory}/client/payload.js`)))};\nconst env = payload.env;` + resolved_entry && posixify(path.relative(dir, resolved_entry)), + !is_build ) ); write_if_changed( `${dir}/public/server.js`, - create_sveltekit_env_public( - vars, - env, - `import { rendered_env as env } from '__sveltekit/env';` - ) - ); - - write_if_changed( - `${dir}/public/service-worker.js`, - create_sveltekit_env_public( - vars, - env, - `const env = globalThis.__sveltekit_${version_hash}.env;` - ) + create_sveltekit_env_public(vars, env, `import { rendered_env as env } from '../config.js';`) ); write_if_changed(`${dir}/private/server.js`, create_sveltekit_env_private(vars, env)); - write_if_changed( - `${dir}/service-worker-prod.js`, - create_sveltekit_env_service_worker( - vars, - env, - config.version.name, - `globalThis.__sveltekit_${version_hash}`, - config.paths.base, - config.appDir - ) - ); - - write_if_changed( - `${dir}/service-worker-dev.js`, - create_sveltekit_env_service_worker_dev( - vars, - env, - config.version.name, - 'globalThis.__sveltekit_dev' - ) - ); - - callback(vars); + if (is_build) { + write_if_changed( + `${dir}/public/client.js`, + create_sveltekit_env_public( + vars, + env, + `import { payload } from ${s(posixify(path.relative(`${dir}/public`, `${runtime_directory}/client/payload.js`)))};\nconst env = payload.env;` + ) + ); + + write_if_changed( + `${dir}/public/service-worker.js`, + create_sveltekit_env_public( + vars, + env, + `const env = globalThis.__sveltekit_${version_hash}.env;` + ) + ); + + write_if_changed( + `${dir}/service-worker.js`, + create_sveltekit_env_service_worker( + vars, + env, + config.version.name, + `globalThis.__sveltekit_${version_hash}`, + config.paths.base, + config.appDir + ) + ); + } else { + write_if_changed( + `${dir}/public/client.js`, + create_sveltekit_env_public(vars, env, `const { env } = globalThis.__sveltekit_dev;`) + ); + + write_if_changed( + `${dir}/service-worker.js`, + create_sveltekit_env_service_worker_dev( + vars, + env, + config.version.name, + 'globalThis.__sveltekit_dev' + ) + ); + } } return { @@ -140,11 +134,13 @@ export function plugin_env_vars(config, callback) { resolved_config = c; const vite = await import_peer('vite', c.root); - env = vite.loadEnv(c.mode, path.resolve(c.root, dir), ''); - - out_dir = posixify(path.resolve(c.root, out)); + env = vite.loadEnv(c.mode, path.resolve(c.root, config.env.dir), ''); is_build = c.command === 'build'; + + dir = posixify( + path.resolve(c.root, config.outDir, `generated/${is_build ? 'build' : 'dev'}/env`) + ); }, async buildStart() { @@ -179,37 +175,6 @@ export function plugin_env_vars(config, callback) { async handleHotUpdate(update) { if (!deps.has(update.file)) return; await generate(); - }, - - resolveId: { - filter: { - id: prefixRegex('__sveltekit/env') - }, - handler(id) { - const dir = `${out_dir}/generated/env`; - - if (id === '__sveltekit/env') { - return is_build ? `${dir}/config.js` : `${dir}/config-dev.js`; - } - - if (id === '__sveltekit/env/private') { - return `${dir}/private/server.js`; - } - - if (id === '__sveltekit/env/public/server') { - return `${dir}/public/server.js`; - } - - if (id === '__sveltekit/env/public/client') { - return this.environment.name === 'serviceWorker' - ? `${dir}/public/service-worker.js` - : `${dir}/public/client.js`; - } - - if (id === '__sveltekit/env/service-worker') { - return is_build ? `${dir}/service-worker-prod.js` : `${dir}/service-worker-dev.js`; - } - } } }; } diff --git a/packages/kit/src/runtime/app/env/private/index.js b/packages/kit/src/runtime/app/env/private/index.js index b3cb5882c213..a8c352f3f5a5 100644 --- a/packages/kit/src/runtime/app/env/private/index.js +++ b/packages/kit/src/runtime/app/env/private/index.js @@ -1 +1 @@ -export * from '__sveltekit/env/private'; +export * from '/env/private/server.js'; diff --git a/packages/kit/src/runtime/app/env/public/client.js b/packages/kit/src/runtime/app/env/public/client.js index 3a0825440e75..ad816fbc7488 100644 --- a/packages/kit/src/runtime/app/env/public/client.js +++ b/packages/kit/src/runtime/app/env/public/client.js @@ -1 +1 @@ -export * from '__sveltekit/env/public/client'; +export * from '/env/public/client.js'; diff --git a/packages/kit/src/runtime/app/env/public/server.js b/packages/kit/src/runtime/app/env/public/server.js index 955eca9e2ede..a1a3d5c2576a 100644 --- a/packages/kit/src/runtime/app/env/public/server.js +++ b/packages/kit/src/runtime/app/env/public/server.js @@ -1 +1 @@ -export * from '__sveltekit/env/public/server'; +export * from '/env/public/server.js'; diff --git a/packages/kit/src/runtime/server/env_module.js b/packages/kit/src/runtime/server/env_module.js index dd61ba3a9b7e..e18aaae5dd1f 100644 --- a/packages/kit/src/runtime/server/env_module.js +++ b/packages/kit/src/runtime/server/env_module.js @@ -1,5 +1,5 @@ import * as devalue from 'devalue'; -import { rendered_env } from '__sveltekit/env'; +import { rendered_env } from '/env/config.js'; /** @type {string} */ let payload; diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js index 9f02fb6788f6..86112c9bfe61 100644 --- a/packages/kit/src/runtime/server/index.js +++ b/packages/kit/src/runtime/server/index.js @@ -4,7 +4,7 @@ import { respond } from './respond.js'; import { create_request_state } from './state.js'; import { options, get_hooks } from '__SERVER__/internal.js'; import { set_read_implementation, set_manifest, fix_stack_trace } from './internal.js'; -import { set_env } from '__sveltekit/env'; +import { set_env } from '/env/config.js'; import { init_tracing } from '@sveltejs/kit/internal/server'; import { DEV } from 'esm-env'; import { init_transport } from '#app/internal/transport'; diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index ca69ef91aa68..b4d131e4d7bd 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -21,7 +21,7 @@ import { try_get_request_store, with_request_store } from '@sveltejs/kit/interna import { text_encoder } from '../../utils.js'; import { count_non_ssi_comments, get_global_name } from '../utils.js'; import { handle_error_and_jsonify } from '../errors.js'; -import * as env from '__sveltekit/env'; +import * as env from '/env/config.js'; import { collect_remote_data } from '../remote-functions.js'; import Root from '../../components/root.svelte'; import { render } from 'svelte/server'; diff --git a/packages/kit/src/types/ambient-private.d.ts b/packages/kit/src/types/ambient-private.d.ts index 3ddf07b9cdcb..6978843a1f7c 100644 --- a/packages/kit/src/types/ambient-private.d.ts +++ b/packages/kit/src/types/ambient-private.d.ts @@ -21,7 +21,7 @@ declare module '__sveltekit/server' { export function set_read_implementation(fn: (path: string) => ReadableStream): void; } -declare module '__sveltekit/env' { +declare module '/env/config.js' { // exported environment variables are defined in env.d.ts /** Populate exported environment variables */ @@ -34,15 +34,15 @@ declare module '__sveltekit/env' { export const rendered_env: Record; } -declare module '__sveltekit/env/private' { +declare module '/env/private/server.js' { // exported environment variables are defined in env.d.ts } -declare module '__sveltekit/env/public/client' { +declare module '/env/public/client.js' { // exported environment variables are defined in env.d.ts } -declare module '__sveltekit/env/public/server' { +declare module '/env/public/server.js' { // exported environment variables are defined in env.d.ts }