Files
eleith 5a1d6d6066
ci/woodpecker/pr/cli Pipeline was successful
ci/woodpecker/pr/config Pipeline was successful
ci/woodpecker/pr/web Pipeline failed
Integrate SvelteKit 3 runtime
2026-11-03 05:29:51 -08:00

81 lines
2.5 KiB
TypeScript

import adapter from '@sveltejs/adapter-node';
import type { Adapter } from '@sveltejs/kit';
import { getRequest } from '@sveltejs/kit/node';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig, loadEnv } from 'vite';
import { prepareRuntimeEnvironment } from './src/lib/server/runtime-environment.js';
import Icons from 'unplugin-icons/vite';
const connectSources: ('self' | 'ws:' | 'wss:')[] = ['self'];
if (process.env.NODE_ENV === 'development') connectSources.push('ws:', 'wss:');
function createAdapter(getOrigin: () => string | undefined): Adapter {
const native = adapter();
const nativeVite = native.vite;
return {
...native,
vite: (context) => {
const settings = typeof nativeVite === 'function' ? nativeVite(context) : nativeVite;
return {
...settings,
getRequest: (options) => getRequest({ ...options, base: getOrigin() ?? options.base })
};
}
};
}
export default defineConfig(({ command, mode, isPreview }) => {
const development = command === 'serve' && !isPreview;
const environment = development ? loadEnv(mode, process.cwd(), '') : undefined;
const port = Number(environment?.PORT ?? process.env.PORT ?? 5173);
let origin: string | undefined;
return {
server: { port, strictPort: true },
optimizeDeps: { include: ['fuse.js'] },
plugins: [
{
name: 'directory-dev-environment',
enforce: 'pre',
async configureServer(server) {
if (!development) return;
Object.assign(process.env, environment);
// Config discovery also uses command=serve. Wait for a real dev server,
// after CLI overrides, before reading operator YAML.
process.env.PORT = String(server.config.server.port ?? 5173);
origin = (await prepareRuntimeEnvironment()).origin;
}
},
sveltekit({
preprocess: vitePreprocess(),
adapter: createAdapter(() => origin),
csp: {
// OIDC form redirects cross origins; state-changing requests are checked server-side.
directives: {
'default-src': ['self'],
'script-src': ['self'],
'style-src': ['self', 'unsafe-inline'],
'img-src': ['self'],
'font-src': ['self'],
'connect-src': connectSources,
'object-src': ['none'],
'base-uri': ['self'],
'frame-ancestors': ['none']
}
}
}),
Icons({ compiler: 'svelte' }),
// Kit's SSR loader does not run import.meta.hot.dispose.
{
name: 'directory-dev-cleanup',
apply: 'serve',
closeBundle() {
process.emit('directory:dev-stop');
}
}
]
};
});