import { viteSingleFile } from 'vite-plugin-singlefile'; import path from 'path'; import fs from 'fs'; import zlib from 'zlib'; const MAX_BUNDLE_SIZE = 1.5 * 1024 * 1024; // only increase when absolutely necessary const GUIDE_FOR_FRONTEND = ` `.trim(); const BUILD_PLUGINS = [ viteSingleFile(), (function llamaCppPlugin() { let config; return { name: 'llamacpp:build', apply: 'build', async configResolved(_config) { config = _config; }, writeBundle() { const outputIndexHtml = path.join(config.build.outDir, 'index.html'); const content = GUIDE_FOR_FRONTEND + '\n' + fs.readFileSync(outputIndexHtml, 'utf-8'); const compressed = zlib.gzipSync(Buffer.from(content, 'utf-8'), { level: 9 }); // because gzip header contains machine-specific info, we must remove these data from the header // timestamp compressed[0x4] = 0; compressed[0x5] = 0; compressed[0x6] = 0; compressed[0x7] = 0; // OS compressed[0x9] = 0; if (compressed.byteLength > MAX_BUNDLE_SIZE) { throw new Error( `Bundle size is too large (${Math.ceil(compressed.byteLength / 1024)} KB).\n` + `Please reduce the size of the frontend or increase MAX_BUNDLE_SIZE in vite.config.js.\n`, ); } const targetOutputFile = path.join(config.build.outDir, '../../public/index.html.gz'); fs.writeFileSync(targetOutputFile, compressed); } } })(), ]; /** @type {import('vite').UserConfig} */ export default { plugins: process.env.ANALYZE ? [] : BUILD_PLUGINS, };