import adapter from '@sveltejs/adapter-static';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
import { execSync } from 'node:child_process';
import tokens from './src/lib/styles/tokens.json' with { type: 'json' };
const THEME_DARK = tokens.colors.dark.obsidian;
const THEME_LIGHT = tokens.colors.light.obsidian;
const tokensPlugin = {
name: 'minstrel-tokens',
buildStart() {
execSync('node scripts/tokens-to-css.js', { stdio: 'inherit' });
}
};
// Build-only plugin that injects Go html/template tokens into the
// rendered index.html so the runtime Go server can substitute per-
// instance branding. In dev (`vite dev`), the marker stays as a
// comment and the SPA falls back to the literal app.html title.
// `enforce: 'post'` ensures this runs after SvelteKit's own
// transformIndexHtml so %sveltekit.head% is already expanded into
// hydration markup before our anchors are rewritten.
const injectGoTokensPlugin = {
name: 'minstrel-inject-go-tokens',
apply: 'build' as const,
enforce: 'post' as const,
transformIndexHtml(html: string) {
const titleTag = `
{{ .AppName }}`;
const headBlock = `
`;
// Fail loudly if either anchor drifts. A silent .replace() no-op
// would ship a build with un-substituted Go template tokens missing,
// and the runtime brand override would silently break — exactly the
// class of regression a build-time plugin should catch.
if (!html.includes('Minstrel')) {
throw new Error('minstrel-inject-go-tokens: Minstrel anchor missing from rendered index.html');
}
if (!html.includes('')) {
throw new Error('minstrel-inject-go-tokens: anchor missing from app.html');
}
return html
.replace('Minstrel', titleTag)
.replace('', headBlock);
}
};
// SvelteKit's options, which lived in svelte.config.js before kit 3. Exported
// so vitest.config.ts runs the same kit setup (the $test-utils alias above all).
export const kitOptions = {
preprocess: vitePreprocess(),
adapter: adapter({
pages: 'build',
assets: 'build',
fallback: 'index.html',
precompress: false,
strict: false
}),
files: { assets: 'static' },
alias: {
// test-only helper barrel; resolves the same way #lib does so test
// files can import shared mock factories without ../../../ chains.
'$test-utils': 'src/test-utils',
'$test-utils/*': 'src/test-utils/*'
}
};
export default defineConfig({
plugins: [tokensPlugin, sveltekit(kitOptions), injectGoTokensPlugin],
server: {
port: 5173,
proxy: {
'/api': {
target: 'http://localhost:4533',
changeOrigin: true
},
'/rest': {
target: 'http://localhost:4533',
changeOrigin: true
}
}
}
});