mirror of
https://github.com/AstrBotDevs/AstrBot
synced 2026-07-01 01:10:21 +08:00
121 lines
3.1 KiB
TypeScript
121 lines
3.1 KiB
TypeScript
import { readFileSync } from 'fs';
|
|
import { fileURLToPath, URL } from 'url';
|
|
import { defineConfig, type Plugin } from 'vite';
|
|
import vue from '@vitejs/plugin-vue';
|
|
import vuetify from 'vite-plugin-vuetify';
|
|
import webfontDl from 'vite-plugin-webfont-dl';
|
|
// @ts-ignore — .mjs not in TS project scope; Vite resolves this at runtime
|
|
import { runMdiSubset } from './scripts/subset-mdi-font.mjs';
|
|
|
|
const t2iShikiRuntimePath = fileURLToPath(
|
|
new URL('../astrbot/core/utils/t2i/template/shiki_runtime.iife.js', import.meta.url)
|
|
);
|
|
|
|
// Vite plugin: run MDI icon font subsetting (build only)
|
|
function mdiSubset() {
|
|
return {
|
|
name: 'vite-plugin-mdi-subset',
|
|
async buildStart() {
|
|
console.log('\n🔧 Running MDI icon font subsetting...');
|
|
await runMdiSubset();
|
|
},
|
|
};
|
|
}
|
|
|
|
function t2iShikiRuntimeAsset(): Plugin {
|
|
return {
|
|
name: 'vite-plugin-t2i-shiki-runtime',
|
|
configureServer(server) {
|
|
server.middlewares.use('/t2i/shiki_runtime.iife.js', (_req, res) => {
|
|
try {
|
|
res.statusCode = 200;
|
|
res.setHeader('Content-Type', 'text/javascript; charset=utf-8');
|
|
res.end(readFileSync(t2iShikiRuntimePath));
|
|
} catch (error) {
|
|
res.statusCode = 404;
|
|
res.end(`T2I Shiki runtime not found: ${error instanceof Error ? error.message : String(error)}`);
|
|
}
|
|
});
|
|
},
|
|
generateBundle() {
|
|
try {
|
|
this.emitFile({
|
|
type: 'asset',
|
|
fileName: 't2i/shiki_runtime.iife.js',
|
|
source: readFileSync(t2iShikiRuntimePath)
|
|
});
|
|
} catch (error) {
|
|
this.warn(
|
|
`Skipping T2I Shiki runtime asset because it could not be read: ${
|
|
error instanceof Error ? error.message : String(error)
|
|
}`
|
|
);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
// https://vitejs.dev/config/
|
|
export default defineConfig(({ command }) => ({
|
|
plugins: [
|
|
// Only run MDI subsetting during production builds, skip in dev server
|
|
...(command === 'build' ? [mdiSubset()] : []),
|
|
t2iShikiRuntimeAsset(),
|
|
vue({
|
|
template: {
|
|
compilerOptions: {
|
|
isCustomElement: (tag) => ['v-list-recognize-title'].includes(tag)
|
|
}
|
|
}
|
|
}),
|
|
vuetify({
|
|
autoImport: true
|
|
}),
|
|
webfontDl()
|
|
],
|
|
resolve: {
|
|
alias: [
|
|
{
|
|
find: /^shiki$/,
|
|
replacement: fileURLToPath(new URL('./src/utils/shikiLimitedBundle.js', import.meta.url))
|
|
},
|
|
{
|
|
find: /^stream-monaco$/,
|
|
replacement: fileURLToPath(new URL('./src/utils/streamMonacoDisabled.js', import.meta.url))
|
|
},
|
|
{
|
|
find: 'mermaid',
|
|
replacement: 'mermaid/dist/mermaid.js'
|
|
},
|
|
{
|
|
find: '@',
|
|
replacement: fileURLToPath(new URL('./src', import.meta.url))
|
|
}
|
|
]
|
|
},
|
|
css: {
|
|
preprocessorOptions: {
|
|
scss: {}
|
|
}
|
|
},
|
|
build: {
|
|
sourcemap: false,
|
|
chunkSizeWarningLimit: 1024 * 1024 // Set the limit to 1 MB
|
|
},
|
|
optimizeDeps: {
|
|
exclude: ['vuetify'],
|
|
entries: ['./src/**/*.vue']
|
|
},
|
|
server: {
|
|
host: '0.0.0.0',
|
|
port: 3000,
|
|
proxy: {
|
|
'/api': {
|
|
target: 'http://127.0.0.1:6185/',
|
|
changeOrigin: true,
|
|
ws: true
|
|
}
|
|
}
|
|
}
|
|
}));
|