openpencil/apps/web/vite.config.ts
2026-05-03 21:00:00 +08:00

81 lines
2.4 KiB
TypeScript

import { defineConfig } from 'vitest/config';
import { devtools } from '@tanstack/devtools-vite';
import { tanstackStart } from '@tanstack/react-start/plugin/vite';
import viteReact from '@vitejs/plugin-react';
import viteTsConfigPaths from 'vite-tsconfig-paths';
import { fileURLToPath, URL } from 'node:url';
import tailwindcss from '@tailwindcss/vite';
import { nitro } from 'nitro/vite';
import { copyFileSync, mkdirSync, existsSync } from 'node:fs';
import { resolve } from 'node:path';
import { vitePluginSkills } from '../../packages/pen-ai-skills/vite-plugin-skills';
const isElectronBuild = process.env.BUILD_TARGET === 'electron';
// Copy CanvasKit WASM files to public directory for runtime loading
function copyCanvasKitWasm() {
const wasmDir = resolve('public/canvaskit');
if (!existsSync(wasmDir)) mkdirSync(wasmDir, { recursive: true });
const ckDir = resolve('../../node_modules/canvaskit-wasm/bin');
const files = ['canvaskit.wasm'];
for (const file of files) {
const src = resolve(ckDir, file);
const dest = resolve(wasmDir, file);
if (existsSync(src) && !existsSync(dest)) {
copyFileSync(src, dest);
}
}
}
copyCanvasKitWasm();
const config = defineConfig({
test: {
teardownTimeout: 1000,
include: [
'src/**/*.test.{ts,tsx}',
'server/**/*.test.ts',
'../../packages/*/src/**/*.test.{ts,tsx}',
'../desktop/git/__tests__/**/*.test.ts',
'../../scripts/**/__tests__/**/*.test.ts',
],
setupFiles: ['./src/__tests__/setup-react.ts'],
},
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
ssr: {
external: ['@zseven-w/agent-native'],
},
assetsInclude: ['**/*.wasm'],
plugins: [
vitePluginSkills(fileURLToPath(new URL('../../packages/pen-ai-skills', import.meta.url))),
...(process.env.NODE_ENV === 'production' ? [] : [devtools()]),
nitro({
rollupConfig: {
external: [
/^@sentry\//,
'canvas',
'jsdom',
'cssstyle',
'canvaskit-wasm',
'@zseven-w/agent-native',
],
},
serverDir: './server',
output: { dir: '../../out/web' },
...(isElectronBuild ? { preset: 'node-server' } : {}),
}),
// this is the plugin that enables path aliases
viteTsConfigPaths({
projects: ['./tsconfig.json'],
}),
tailwindcss(),
tanstackStart(),
viteReact(),
],
});
export default config;