81 lines
2.2 KiB
TypeScript
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
|
|
}
|
|
});
|