Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
97eea56
wip
teemingc Mar 20, 2026
e5c72dd
Merge branch 'main' into fetchable-dev-environment
teemingc Mar 20, 2026
d248b16
Merge branch 'version-3' into fetchable-dev-environment
teemingc Mar 20, 2026
5346ed5
update before_handle type
teemingc Mar 20, 2026
013fa51
format
teemingc Mar 20, 2026
fa879ba
fix type
teemingc Mar 20, 2026
6f40268
format
teemingc Mar 21, 2026
49e07b9
fix test
teemingc Mar 21, 2026
c844a5f
dev only plugins
teemingc Mar 21, 2026
c5f22d7
format again
teemingc Mar 21, 2026
3e19d7c
no more cf pages test app
teemingc Mar 21, 2026
0a39981
fix lint
teemingc Mar 21, 2026
139c567
Merge branch 'version-3' into fetchable-dev-environment
teemingc Mar 22, 2026
96ca6d5
hooray ipc
teemingc Mar 23, 2026
a74f3c7
im so stupid
teemingc Mar 24, 2026
af7a216
Merge branch 'version-3' into fetchable-dev-environment
teemingc Mar 24, 2026
0a73d63
move server entry to file
teemingc Mar 24, 2026
9f0694a
only one config path as source of truth
teemingc Mar 24, 2026
585fc7a
deduplicate to_fs
teemingc Mar 24, 2026
8c875c9
clean up ipc
teemingc Mar 24, 2026
ca2adb6
add test todo
teemingc Mar 24, 2026
c3e5074
we did it?
teemingc Mar 24, 2026
95dc4b8
space
teemingc Mar 24, 2026
eadcb7a
whoops
teemingc Mar 24, 2026
f5396cb
run instrumentation if it exists
teemingc Mar 24, 2026
3c7138b
correctly serialise nodes
teemingc Mar 24, 2026
7897025
fix ts
teemingc Mar 24, 2026
0922686
Merge branch 'version-3' into fetchable-dev-environment
teemingc Mar 24, 2026
5db8285
changesets
teemingc Mar 24, 2026
ad2fe73
split cloudflare changes
teemingc Mar 24, 2026
a83420d
split cf changes
teemingc Mar 24, 2026
46aa98e
changeset
teemingc Mar 24, 2026
0b0cfaa
always provide ssr dev config
teemingc Mar 24, 2026
332a28f
leftover
teemingc Mar 24, 2026
4d21e64
leftover
teemingc Mar 24, 2026
6859adf
split into new pr
teemingc Mar 24, 2026
4f9d543
no need to generate types for internal
teemingc Mar 24, 2026
de27959
Merge branch 'version-3' into fetchable-dev-environment
teemingc Mar 24, 2026
48a1d41
fix up paths in error stack traces
teemingc Mar 24, 2026
195ddd7
fix relative paths on server
teemingc Mar 25, 2026
8528b99
promise with resolvers
teemingc Mar 25, 2026
0e068be
Merge branch 'version-3' into fetchable-dev-environment
teemingc Mar 26, 2026
4f5fa31
fix remotes detection
teemingc Mar 26, 2026
c15f3c2
fix remotes population
teemingc Mar 26, 2026
6a7bdf1
fix dev remotes analysis
teemingc Mar 26, 2026
1a423eb
fix reading files outside app root in dev
teemingc Mar 26, 2026
9787112
Merge branch 'version-3' into fetchable-dev-environment
teemingc Mar 26, 2026
81c18cd
fix vite globals being defined late
teemingc Mar 26, 2026
bc1bae7
todo
teemingc Mar 26, 2026
fb82c52
use file protocol
teemingc Mar 27, 2026
4865f81
forgot to stringify this
teemingc Mar 27, 2026
08770ae
timing issue
teemingc Mar 27, 2026
26d68b9
try to fix timing issues
teemingc Mar 27, 2026
810efdb
scope hot code
teemingc Mar 27, 2026
66d15b2
fix windows posix and drive letter issue
teemingc Mar 28, 2026
5bbf998
add comments
teemingc Mar 28, 2026
8fb8b8b
invalidate ssr manifest on file changes
teemingc Mar 31, 2026
fda77ef
Apply suggestion from @teemingc
teemingc Mar 31, 2026
011698a
Apply suggestion from @teemingc
teemingc Mar 31, 2026
7a90e03
move applyEnvironment hook
teemingc Mar 31, 2026
5305038
Merge branch 'version-3' into fetchable-dev-environment
teemingc Mar 31, 2026
886bdfc
revert
teemingc Mar 31, 2026
9e69f8a
don't think we need to change the preview server
teemingc Mar 31, 2026
9bb226f
fix loud ssr load module
teemingc Mar 31, 2026
08a9f62
format
teemingc Mar 31, 2026
c773b76
fix prerendering?
teemingc Mar 31, 2026
2e9f7a7
fix
teemingc Mar 31, 2026
ccbe06c
Merge branch 'version-3' into fetchable-dev-environment
teemingc Apr 2, 2026
33d52e1
Merge branch 'version-3' into fetchable-dev-environment
teemingc Apr 2, 2026
ea3034a
split out these changes for 15250
teemingc Apr 2, 2026
4ae4899
fix import
teemingc Apr 2, 2026
93ab144
and this one too
teemingc Apr 2, 2026
a2fa7c8
and theeeese too
teemingc Apr 2, 2026
25f4b05
line order
teemingc Apr 2, 2026
3373a34
remove module runner usage
teemingc Apr 3, 2026
02ae873
Merge branch 'version-3' into fetchable-dev-environment
teemingc Apr 3, 2026
22be360
Merge branch 'version-3' into fetchable-dev-environment
teemingc Apr 3, 2026
057b516
Merge branch 'version-3' into fetchable-dev-environment
teemingc Apr 4, 2026
5ee8b3f
move ssr manifest to file
teemingc Apr 4, 2026
fa52c38
chore: autofix lint
github-actions[bot] Apr 4, 2026
a2bf6ec
Revert "chore: autofix lint"
teemingc Apr 4, 2026
67be19c
Reapply "chore: autofix lint"
teemingc Apr 4, 2026
941c0c6
forgot this
teemingc Apr 4, 2026
909cb20
forgot to re-export respond
teemingc Apr 4, 2026
c9ed8a0
add root to matcher filepath
teemingc Apr 4, 2026
93569a7
fix
teemingc Apr 5, 2026
764b56e
Merge branch 'version-3' into fetchable-dev-environment
teemingc Apr 5, 2026
1026dcf
Merge branch 'version-3' into fetchable-dev-environment
teemingc Apr 6, 2026
d4cbc8c
fix
teemingc Apr 6, 2026
e274198
consider base path
teemingc Apr 6, 2026
419bf40
make it a public path
teemingc Apr 6, 2026
6ceb134
posixify
teemingc Apr 6, 2026
a5b6f7e
docs draft
teemingc Apr 6, 2026
c13f2f4
avoid node.js modules
teemingc Apr 6, 2026
b632257
docs?
teemingc Apr 6, 2026
8b41fbc
generate type
teemingc Apr 6, 2026
a6385d1
fixes
teemingc Apr 6, 2026
57b9291
fix types
teemingc Apr 6, 2026
028f34b
revert removing internal read
teemingc Apr 6, 2026
a9a509a
generate types
teemingc Apr 6, 2026
6ce7a8f
fix docs?
teemingc Apr 6, 2026
4b22aca
add types
teemingc Apr 6, 2026
d4b5f15
Merge branch 'version-3' into fetchable-dev-environment
teemingc Apr 23, 2026
c337119
port changes from cloudflare integration branch
teemingc Apr 23, 2026
200b919
delete
teemingc Apr 23, 2026
ca4f597
docs
teemingc Apr 23, 2026
3142fd5
docs
teemingc Apr 23, 2026
03b8bcb
try to fix build error test
teemingc Apr 23, 2026
dda5926
fix static file access during dev
teemingc Apr 23, 2026
2026619
fix prerender tests
teemingc Apr 24, 2026
e99e307
include base path when fetching against vite dev server
teemingc Apr 25, 2026
60c53d7
regenerate types
teemingc Apr 25, 2026
92e8a8e
try this
teemingc Apr 25, 2026
a2bfef8
manual escape
teemingc Apr 25, 2026
6d9d327
clean up import.meta.hot usage
teemingc Apr 25, 2026
cf6086f
correct escaping
teemingc Apr 25, 2026
3be94b7
allow optimizing server deps now that we use rolldown instead of esbuild
teemingc Apr 25, 2026
79d0542
is chai doing its own escaping? try escaping everything
teemingc Apr 25, 2026
3d6bbee
give up on chai api
teemingc Apr 25, 2026
8ec1aab
fix prerendering
teemingc Apr 25, 2026
0b2255e
oops don't reuse name
teemingc Apr 25, 2026
a00415e
avoid chai completely
teemingc Apr 25, 2026
4bdf831
regex hell
teemingc Apr 25, 2026
908a4a6
fix redirected prerendered pages
teemingc Apr 25, 2026
56daa19
revert
teemingc Apr 25, 2026
e55644a
fix prerender redirects for good
teemingc Apr 25, 2026
f23b300
revert to forked processes
teemingc Apr 26, 2026
23741e1
Merge branch 'version-3' into fetchable-dev-environment
teemingc Apr 26, 2026
a8c7be9
optional \r to accomodate windows
teemingc Apr 26, 2026
44e4075
update manifest data when file is changed
teemingc Apr 26, 2026
e4449c7
format
teemingc Apr 26, 2026
c35cbdd
Merge branch 'version-3' into fetchable-dev-environment
teemingc Apr 26, 2026
3aa39e5
add comment to explain
teemingc Apr 26, 2026
97e9c08
improve docs
teemingc Apr 26, 2026
a5507cb
Apply suggestion from @teemingc
teemingc Apr 27, 2026
f68d5ce
fix indentation
teemingc Apr 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/rich-wombats-flash.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': major
---

breaking: remove `adapter.emulate`
5 changes: 5 additions & 0 deletions .changeset/short-chefs-stare.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': major
---

feat: use the Vite Environment API in development, preview, build analysis and prerendering
56 changes: 47 additions & 9 deletions documentation/docs/25-build-and-deploy/99-writing-adapters.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,6 @@ export default function (options) {
async adapt(builder) {
// adapter implementation
},
async emulate() {
return {
async platform({ config, prerender }) {
// the returned object becomes `event.platform` during dev, build and
// preview. Its shape is that of `App.Platform`
}
}
},
supports: {
read: ({ config, route }) => {
// Return `true` if the route with the given `config` can use `read`
Expand All @@ -39,14 +31,19 @@ export default function (options) {
// Return `true` if this adapter supports loading `instrumentation.server.js`.
// Return `false if it can't, or throw a descriptive error.
}
},
vite: {
plugins: [
// add plugins here to integrate with Vite
]
}
};

return adapter;
}
```

Of these, `name` and `adapt` are required. `emulate` and `supports` are optional.
Of these, `name` and `adapt` are required. `vite.plugins` and `supports` are optional.

Within the `adapt` method, there are a number of things that an adapter should do:

Expand All @@ -61,3 +58,44 @@ Within the `adapt` method, there are a number of things that an adapter should d
- Put the user's static files and the generated JS/CSS in the correct location for the target platform

Where possible, we recommend putting the adapter output under the `build/` directory with any intermediate output placed under `.svelte-kit/[adapter-name]`.

## Configuring the development and preview experience

By default, SvelteKit runs your server code through a Node.js runtime when running `vite dev` and `vite preview`. You can change this behaviour by adding a Vite plugin that has a `configureServer` and `configurePreviewServer` hook to route requests to [a different runtime](https://vite.dev/guide/api-environment-runtimes).

The main Vite server environment SvelteKit uses is named `ssr`. You can change its settings by referencing it in the `config` hook of a Vite plugin.

```js
// @errors: 2304 1005 1109
config(userConfig) {
userConfig.environments.ssr = { ... }
}
```

You can also create your own server entry file by importing the `Server` class from `sveltekit:server`, the environment variables loaded by Vite through `env` from `sveltekit:env`, and your app-specific information as `manifest` from `sveltekit:server-manifest`.

```js
import { env } from 'sveltekit:env';
import { Server } from 'sveltekit:server';
import { manifest } from 'sveltekit:server-manifest';

const server = new Server(manifest);

await server.init({ env });

export default {
/**
* @param {Request} request
* @returns {Promise<Response>}
*/
async fetch(request) {
return await server.respond(request, {
getClientAddress: () => {
return request.headers.get('how-your-platform-exposes-the-remote-address')
}
});
}
}

import.meta.hot?.accept();
```
37 changes: 1 addition & 36 deletions packages/adapter-cloudflare/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { copyFileSync, existsSync, readFileSync, writeFileSync } from 'node:fs';
import path from 'node:path';
import process from 'node:process';
import { fileURLToPath } from 'node:url';
import { getPlatformProxy, unstable_readConfig } from 'wrangler';
import { unstable_readConfig } from 'wrangler';
import {
is_building_for_cloudflare_pages,
validate_worker_settings,
Expand Down Expand Up @@ -175,41 +175,6 @@ export default function (options = {}) {
writeFileSync(`${dest}/.assetsignore`, generate_assetsignore(), { flag: 'a' });
}
},
emulate() {
// we want to invoke `getPlatformProxy` only once, but await it only when it is accessed.
// If we would await it here, it would hang indefinitely because the platform proxy only resolves once a request happens
const get_emulated = async () => {
const proxy = await getPlatformProxy(options.platformProxy);
const platform = /** @type {App.Platform} */ ({
env: proxy.env,
ctx: proxy.ctx,
context: proxy.ctx, // deprecated in favor of ctx
caches: proxy.caches,
cf: proxy.cf
});
/** @type {Record<string, any>} */
const env = {};
const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env }));
for (const key in proxy.env) {
Object.defineProperty(env, key, {
get: () => {
throw new Error(`Cannot access platform.env.${key} in a prerenderable route`);
}
});
}
return { platform, prerender_platform };
};

/** @type {{ platform: App.Platform, prerender_platform: App.Platform }} */
let emulated;

return {
platform: async ({ prerender }) => {
emulated ??= await get_emulated();
return prerender ? emulated.prerender_platform : emulated.platform;
}
};
},
supports: {
read: () => true,
instrumentation: () => true
Expand Down
3 changes: 2 additions & 1 deletion packages/adapter-cloudflare/test/apps/workers/test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ test('worker', async ({ page }) => {
await expect(page.locator('h1')).toContainText('Sum: 3');
});

test('ctx', async ({ request }) => {
// TODO: re-enable once we add the vite cloudflare plugin
test.skip('ctx', async ({ request }) => {
const res = await request.get('/ctx');
expect(await res.text()).toBe('ctx works');
});
Expand Down
2 changes: 1 addition & 1 deletion packages/adapter-static/test/apps/prerendered/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "~TODO~",
"name": "test-static-prerendered",
"version": "0.0.1",
"private": true,
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/adapter-static/test/apps/spa/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "~TODO~",
"name": "test-static-spa",
"version": "0.0.1",
"private": true,
"scripts": {
Expand Down
12 changes: 7 additions & 5 deletions packages/kit/src/core/adapt/builder.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { extname, resolve, join, dirname, relative } from 'node:path';
import { pipeline } from 'node:stream';
import { promisify, styleText } from 'node:util';
import zlib from 'node:zlib';
import { copy, rimraf, mkdirp, posixify } from '../../utils/filesystem.js';
import { copy, rimraf, mkdirp } from '../../utils/filesystem.js';
import { generate_manifest } from '../generate_manifest/index.js';
import { get_route_segments } from '../../utils/routing.js';
import { get_env } from '../../exports/vite/utils.js';
Expand All @@ -16,6 +16,7 @@ import { write } from '../sync/utils.js';
import { list_files } from '../utils.js';
import { find_server_assets } from '../generate_manifest/find_server_assets.js';
import { reserved } from '../env.js';
import { posixify } from '../../utils/os.js';

const pipe = promisify(pipeline);
const extensions = ['.html', '.js', '.mjs', '.json', '.css', '.svg', '.xml', '.wasm', '.txt'];
Expand All @@ -31,7 +32,8 @@ const extensions = ['.html', '.js', '.mjs', '.json', '.css', '.svg', '.xml', '.w
* prerender_map: PrerenderMap;
* log: Logger;
* vite_config: ResolvedConfig;
* remotes: RemoteChunk[]
* remotes: RemoteChunk[];
* out: string;
* }} opts
* @returns {Builder}
*/
Expand All @@ -44,7 +46,8 @@ export function create_builder({
prerender_map,
log,
vite_config,
remotes
remotes,
out
}) {
/** @type {Map<RouteDefinition, RouteData>} */
const lookup = new Map();
Expand Down Expand Up @@ -113,11 +116,10 @@ export function create_builder({

async generateFallback(dest) {
const manifest_path = `${config.kit.outDir}/output/server/manifest-full.js`;
const env = get_env(config.kit.env, vite_config.mode);

const fallback = await generate_fallback({
manifest_path,
env: { ...env.private, ...env.public },
out,
root: vite_config.root
});

Expand Down
2 changes: 1 addition & 1 deletion packages/kit/src/core/adapt/builder.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { join, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import { assert, expect, test } from 'vitest';
import { create_builder } from './builder.js';
import { posixify } from '../../utils/filesystem.js';
import { posixify } from '../../utils/os.js';
import { list_files } from '../utils.js';

test('copy files', () => {
Expand Down
7 changes: 5 additions & 2 deletions packages/kit/src/core/adapt/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { create_builder } from './builder.js';
* @param {import('types').Logger} log
* @param {import('types').RemoteChunk[]} remotes
* @param {import('vite').ResolvedConfig} vite_config
* @param {string} out
*/
export async function adapt(
config,
Expand All @@ -19,7 +20,8 @@ export async function adapt(
prerender_map,
log,
remotes,
vite_config
vite_config,
out
) {
// This is only called when adapter is truthy, so the cast is safe
const { name, adapt } = /** @type {import('@sveltejs/kit').Adapter} */ (config.kit.adapter);
Expand All @@ -35,7 +37,8 @@ export async function adapt(
prerender_map,
log,
remotes,
vite_config
vite_config,
out
});

await adapt(builder);
Expand Down
1 change: 1 addition & 0 deletions packages/kit/src/core/generate_manifest/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ export function generate_manifest({
appDir: ${s(build_data.app_dir)},
appPath: ${s(build_data.app_path)},
assets: new Set(${s(assets)}),
base: ${s(build_data.base)},
mimeTypes: ${s(mime_types)},
_: {
client: ${uneval(build_data.client)},
Expand Down
3 changes: 3 additions & 0 deletions packages/kit/src/core/postbuild/ambient.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
declare module '__SERVER__/index.js' {
export { Server } from '@sveltejs/kit';
}
Loading
Loading