49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
import { defineConfig } from 'vite'
|
|
import type { Plugin } from 'vite'
|
|
import vue from '@vitejs/plugin-vue'
|
|
import { mkdirSync, readdirSync, writeFileSync } from 'node:fs'
|
|
import { resolve } from 'node:path'
|
|
|
|
function presetManifestPlugin(): Plugin {
|
|
let presetDirectory = ''
|
|
const updateManifest = () => {
|
|
if (!presetDirectory) return
|
|
mkdirSync(presetDirectory, { recursive: true })
|
|
const presets = readdirSync(presetDirectory)
|
|
.filter((file) => file.toLowerCase().endsWith('.json') && file !== 'index.json')
|
|
.sort((a, b) => a.localeCompare(b, 'zh-CN'))
|
|
.map((file) => ({ name: file.replace(/\.json$/i, ''), file }))
|
|
writeFileSync(resolve(presetDirectory, 'index.json'), `${JSON.stringify(presets, null, 2)}\n`)
|
|
}
|
|
return {
|
|
name: 'spine-particle-preset-manifest',
|
|
configResolved(config) {
|
|
presetDirectory = resolve(config.root, 'public/Preset')
|
|
updateManifest()
|
|
},
|
|
buildStart() {
|
|
updateManifest()
|
|
},
|
|
configureServer(server) {
|
|
server.watcher.add(presetDirectory)
|
|
const refresh = (file: string) => {
|
|
if (file.startsWith(presetDirectory) && file.toLowerCase().endsWith('.json')) updateManifest()
|
|
}
|
|
server.watcher.on('add', refresh)
|
|
server.watcher.on('unlink', refresh)
|
|
},
|
|
}
|
|
}
|
|
|
|
export default defineConfig({
|
|
plugins: [vue(), presetManifestPlugin()],
|
|
server: {
|
|
port: 5173,
|
|
host: true,
|
|
},
|
|
// 让 node_modules 里的 ESM 依赖能直接 work
|
|
optimizeDeps: {
|
|
include: ['@esotericsoftware/spine-pixi-v7'],
|
|
},
|
|
})
|