/* eslint-disable no-undef */ import path from 'path' import { fileURLToPath } from 'url' import { defineConfig } from 'vite' import assert from 'assert' import react from '@vitejs/plugin-react-swc' import getConfig from './libs/config.js' import { rmdir } from './libs/file.js' import { increase } from './libs/version.js' import Music from './libs/music.js'; import Background from './libs/background.js' import directory from './libs/directory.js' import { PerfseePlugin } from '@perfsee/rollup' global.__projectRoot = path.dirname(fileURLToPath(import.meta.url)) class ViteRunner { #globalConfig = getConfig() #mode #baseViteConfig = { configFile: false, base: "", server: { host: '0.0.0.0', }, build: { emptyOutDir: false, }, } get config() { let result; const temp = process.env.npm_lifecycle_event.split(':') this.#mode = temp[0] === "vite" ? temp[1] : process.argv[2] switch (this.#mode) { case 'directory': result = { data: this.#directoryConfig, versionDir: path.join(__projectRoot, "directory"), } const op = temp[2] || process.argv[3] if (op !== 'preview') { rmdir(path.resolve(__projectRoot, this.#globalConfig.folder.release, "_directory")) rmdir(path.resolve(__projectRoot, this.#globalConfig.folder.release, "index.html")) } break case 'dev': case 'build': case 'build-all': case 'preview': result = { data: this.#operatorConfig, versionDir: path.join(__projectRoot), } break default: return null } return result } async start() { const configObj = this.config const viteConfig = configObj.data; switch (this.#mode) { case 'dev': this.#dev(viteConfig) break case 'build': this.#globalConfig.version.showcase = increase(configObj.versionDir) case 'build-all': this.#build(viteConfig) break case 'preview': this.#preview(viteConfig) break default: return } } #dev(viteConfig) { ; (async () => { const { createServer } = await import('vite') const server = await createServer(viteConfig) await server.listen() server.printUrls() })() } #build(viteConfig) { ; (async () => { const { build } = await import('vite') await build({ ...viteConfig, logLevel: 'silent', }) })() } #preview(viteConfig) { ; (async () => { const { preview } = await import('vite') const previewServer = await preview({ ...viteConfig, }) previewServer.printUrls() })() } get #operatorConfig() { const operatorName = process.env.O || process.argv[3] assert(operatorName, 'Please set the operator name by using environment variable O.') const assetsDir = 'assets' return { ...this.#baseViteConfig, envDir: path.join(__projectRoot, this.#globalConfig.folder.operator, operatorName), publicDir: path.resolve(__projectRoot, this.#globalConfig.folder.release, operatorName), root: path.resolve(__projectRoot), server: { ...this.#baseViteConfig.server, }, resolve: { alias: { '@': path.resolve(__projectRoot, './src'), '!': path.resolve(__projectRoot, this.#globalConfig.folder.operator, operatorName), }, }, build: { ...this.#baseViteConfig.build, chunkSizeWarningLimit: 10000, outDir: path.resolve(__projectRoot, this.#globalConfig.folder.release, operatorName), rollupOptions: { output: { entryFileNames: `${assetsDir}/[name].js`, chunkFileNames: `${assetsDir}/[name].js`, assetFileNames: `${assetsDir}/[name].[ext]`, } } }, } } get #directoryConfig() { if (process.env.npm_lifecycle_event === 'vite:directory:build') { this.#globalConfig.version.directory = increase(path.join(__projectRoot, "directory")) global.__config = this.#globalConfig } const directoryDir = path.resolve(__projectRoot, 'directory') this.#mode = process.argv[3] const publicDir = path.resolve(__projectRoot, this.#globalConfig.folder.release) const assetsDir = '_directory' return { ...this.#baseViteConfig, envDir: directoryDir, base: "/", plugins: [ react(), // PerfseePlugin({ // project: 'aklive2d', // artifactName: 'directory', // }), ], publicDir: path.resolve(__projectRoot, this.#globalConfig.folder.release), root: directoryDir, server: { ...this.#baseViteConfig.server, }, resolve: { alias: { '@': path.resolve(directoryDir, './src'), '!': path.resolve(__projectRoot, './src'), '#': path.resolve(publicDir, this.#globalConfig.folder.directory), }, }, build: { ...this.#baseViteConfig.build, outDir: path.resolve(__projectRoot, this.#globalConfig.folder.release), rollupOptions: { output: { entryFileNames: `${assetsDir}/[name].js`, chunkFileNames: `${assetsDir}/[name].js`, assetFileNames: `${assetsDir}/[name].[ext]`, manualChunks: { 'react': ['react', 'react-dom', 'react-router-dom'], }, } } }, } } } async function main() { if (process.env.npm_lifecycle_event.includes('vite')) { global.__config = getConfig() const background = new Background() await background.process() const backgrounds = ['operator_bg.png', ...background.files] const { musicMapping } = Music() directory({ backgrounds, musicMapping }) return } const runner = new ViteRunner() await runner.start() } main() export default defineConfig((new ViteRunner()).config.data)