import { createReadStream, existsSync, statSync, cpSync } from 'node:fs'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import { defineConfig, type Plugin } from 'vite'
import vue from '@vitejs/plugin-vue'
// kit.css ссылается на шрифты/иконки через абсолютные /assets/... URL —
// по контракту кита хост обязан отдавать его dist/assets на /assets.
// В dev — middleware, в build — копирование в dist/assets.
const kitAssetsDir = path.resolve(
fileURLToPath(new URL('.', import.meta.url)),
'node_modules/gnexus-ui-kit/dist/assets',
)
const mimeByExt: Record<string, string> = {
'.css': 'text/css',
'.js': 'text/javascript',
'.svg': 'image/svg+xml',
'.png': 'image/png',
'.jpg': 'image/jpeg',
'.woff': 'font/woff',
'.woff2': 'font/woff2',
'.ttf': 'font/ttf',
}
function kitAssetsPlugin(): Plugin {
return {
name: 'gnexus-kit-assets',
configureServer(server) {
server.middlewares.use((req, res, next) => {
const url = (req.url ?? '').split('?')[0]
if (!url.startsWith('/assets/')) return next()
const file = path.join(kitAssetsDir, url.slice('/assets/'.length))
if (!existsSync(file) || !statSync(file).isFile()) return next()
res.setHeader('Content-Type', mimeByExt[path.extname(file)] ?? 'application/octet-stream')
createReadStream(file).pipe(res)
})
},
closeBundle() {
cpSync(kitAssetsDir, path.resolve(fileURLToPath(new URL('.', import.meta.url)), 'dist/assets'), {
recursive: true,
})
},
}
}
// Dev: /api и /auth проксируются на backend. В проде nginx отдаёт статику и проксирует сам.
export default defineConfig({
plugins: [vue(), kitAssetsPlugin()],
server: {
port: 15134, // 5173 занят другими проектами; мнемоника: 1 + API 8134
proxy: {
'/api': {
target: 'http://localhost:8134',
changeOrigin: true,
},
'/auth': {
target: 'http://localhost:8134',
changeOrigin: true,
},
},
},
})