Merges Renovate's kit 3 (PR #149) and adapter-static 4 (PR #148) bumps, plus the migration they need. The mechanical part is `sv migrate sveltekit-3`, run one task at a time and reviewed: - svelte.config.js is gone. Its options move into sveltekit() in vite.config.ts, exported as kitOptions so vitest.config.ts runs the same kit setup, including the $test-utils alias the tests import. - $lib becomes #lib through package.json "imports". There is no src/lib/index, so only the "#lib/*" entry is kept. - tsconfig extends $app/tsconfig. - Peer floors raised to kit 3's requirements: svelte ^5.57.1, vite ^8.0.12, svelte-check ^4.7.5. By hand, from the codemod's list of non-automated tasks: - goto's replaceState option is now replace; keepFocus becomes reset: false. For the search typeahead, reset: false also stops the scroll-to-top, which is wanted while typing. - The test setup mocks drop pushState/replaceState and $app/paths base/assets, which kit 3 removed, and mock refreshAll in place of invalidateAll. - The other flagged files only read page.url or goto internal routes, so they needed no change. TypeScript goes to ^6, not the ^7 Renovate offers: kit 3 declares typescript ^6 as a peer and svelte-check 4.7 accepts ^5 || ^6. Move to 7 once both accept it. With Tailwind 4 and kit 3 in, `npm audit` on the whole tree reports 0, so the web lane now audits every dependency rather than only what ships to browsers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
94 lines
3.5 KiB
TypeScript
94 lines
3.5 KiB
TypeScript
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 = `<title>{{ .AppName }}</title>`;
|
|
const headBlock = `
|
|
<meta name="description" content="{{ .Description }}">
|
|
<meta property="og:title" content="{{ .AppName }}">
|
|
<meta property="og:description" content="{{ .Description }}">
|
|
<meta property="og:image" content="/brand/og-image.png">
|
|
<meta property="og:type" content="website">
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="${THEME_DARK}">
|
|
<meta name="theme-color" media="(prefers-color-scheme: light)" content="${THEME_LIGHT}">
|
|
<script>window.__MINSTREL__ = { appName: "{{ .AppName }}" };</script>`;
|
|
|
|
// 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('<title>Minstrel</title>')) {
|
|
throw new Error('minstrel-inject-go-tokens: <title>Minstrel</title> anchor missing from rendered index.html');
|
|
}
|
|
if (!html.includes('<!-- MINSTREL_TOKENS -->')) {
|
|
throw new Error('minstrel-inject-go-tokens: <!-- MINSTREL_TOKENS --> anchor missing from app.html');
|
|
}
|
|
return html
|
|
.replace('<title>Minstrel</title>', titleTag)
|
|
.replace('<!-- MINSTREL_TOKENS -->', 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
|
|
}
|
|
}
|
|
}
|
|
});
|