Files
2026-08-16 18:24:52 +07:00

81 lines
2.2 KiB
TypeScript

import { defineConfig } from 'vite';
import { svelte } from '@sveltejs/vite-plugin-svelte';
import { viteSingleFile } from 'vite-plugin-singlefile';
import { execSync } from 'child_process';
import { readFileSync, writeFileSync, mkdirSync } from 'fs';
import { gzipSync } from 'zlib';
import { resolve } from 'path';
// git version baked at build time (same format as C++ ACE_VERSION)
function gitVersion(): string {
try {
const hash = execSync('git rev-parse --short HEAD', { cwd: resolve(__dirname, '../..') })
.toString()
.trim();
const date = execSync('git show -s --format=%cs HEAD', { cwd: resolve(__dirname, '../..') })
.toString()
.trim();
return `${hash} (${date})`;
} catch {
return 'unknown';
}
}
// deterministic gzip of the inlined index.html into ../public/index.html.gz.
// the .gz is committed to git so the C++ build works without npm.
// gzip timestamp and OS bytes are zeroed for reproducible output.
function aceGzipPlugin() {
return {
name: 'ace:gzip',
apply: 'build' as const,
closeBundle() {
const indexPath = resolve(__dirname, 'dist', 'index.html');
const publicDir = resolve(__dirname, '..', 'public');
const gzPath = resolve(publicDir, 'index.html.gz');
const html = readFileSync(indexPath, 'utf-8');
const compressed = gzipSync(Buffer.from(html, 'utf-8'), { level: 9 });
// zero gzip header fields that vary between builds
compressed[4] = 0; // mtime
compressed[5] = 0;
compressed[6] = 0;
compressed[7] = 0;
compressed[9] = 0; // OS
mkdirSync(publicDir, { recursive: true });
writeFileSync(gzPath, compressed);
console.log(
` index.html: ${html.length} bytes -> index.html.gz: ${compressed.length} bytes`
);
}
};
}
export default defineConfig({
plugins: [svelte(), viteSingleFile(), aceGzipPlugin()],
define: {
__ACE_VERSION__: JSON.stringify(gitVersion())
},
// dev server: proxy ace-server endpoints
server: {
proxy: {
'/lm': 'http://localhost:8080',
'/synth': 'http://localhost:8080',
'/understand': 'http://localhost:8080',
'/health': 'http://localhost:8080',
'/props': 'http://localhost:8080',
'/logs': 'http://localhost:8080'
}
},
build: {
assetsInlineLimit: Infinity,
cssCodeSplit: false
}
});