import type { Plugin } from 'vite' import fs from 'node:fs' import path from 'node:path' import Vue from '@vitejs/plugin-vue' import { resolve } from 'pathe' import { presetIcons, presetWind3, transformerDirectives } from 'unocss' import Unocss from 'unocss/vite' import { defineConfig } from 'vite' import { resolveApiToken } from '../vitest/src/node/config/apiToken' export default defineConfig({ base: './', resolve: { // TODO: keep manual alias for vite 7 CI // tsconfigPaths: true, alias: { '~/': `${resolve(import.meta.dirname, 'client')}/`, }, }, plugins: [ Vue(), Unocss({ presets: [presetWind3(), presetIcons()], content: { pipeline: { include: [ // by default .ts is excluded /\/client\/.*\.(ts|vue)($|\?)/, ], }, }, shortcuts: { 'bg-base': 'bg-white dark:bg-[#111]', 'bg-overlay': 'bg-[#eee]:50 dark:bg-[#222]:50', 'bg-header': 'bg-gray-500:5', 'bg-active': 'bg-gray-500:8', 'bg-hover': 'bg-gray-500:20', 'border-base': 'border-gray-500:10', 'focus-base': 'border-gray-500 dark:border-gray-400', highlight: 'bg-[#eab306] text-[#323238] dark:bg-[#323238] dark:text-[#eab306]', 'tab-button': 'font-light op50 hover:op80 h-full px-4', 'tab-button-active': 'op100 bg-gray-500:10', }, transformers: [transformerDirectives()], safelist: 'absolute origin-top mt-[8px]'.split(' '), }), process.env.HTML_REPORT_DIR ? devHtmlReportPlugin({ htmlDir: process.env.HTML_REPORT_DIR }) : devUiScriptPlugin(), { // workaround `crossorigin` issues on some browsers // https://github.com/vitejs/vite/issues/6648 name: 'no-crossorigin-for-same-assets', apply: 'build', transformIndexHtml(html) { return html .replace('crossorigin src="./assets/', 'src="./assets/') .replace('crossorigin href="./assets/', 'href="./assets/') }, }, ], build: { outDir: './dist/client', }, }) function devUiScriptPlugin(): Plugin { const BROWSER_SCRIPT_RE = /