130 lines
3.5 KiB
TypeScript
130 lines
3.5 KiB
TypeScript
import type { ChildProcessWithoutNullStreams } from 'node:child_process'
|
|
import {
|
|
type UserConfig as ViteConfig,
|
|
type ViteDevServer,
|
|
createServer as ViteCreateServer,
|
|
build as viteBuild,
|
|
createLogger,
|
|
mergeConfig
|
|
} from 'vite'
|
|
import colors from 'picocolors'
|
|
import { type InlineConfig, resolveConfig } from './config'
|
|
import { resolveHostname } from './utils'
|
|
import { startElectron } from './electron'
|
|
|
|
export async function createServer(inlineConfig: InlineConfig = {}): Promise<void> {
|
|
process.env.NODE_ENV_ELECTRON_VITE = 'development'
|
|
const config = await resolveConfig(inlineConfig, 'serve', 'development')
|
|
if (config.config) {
|
|
const logger = createLogger(inlineConfig.logLevel)
|
|
|
|
let server: ViteDevServer | undefined
|
|
let ps: ChildProcessWithoutNullStreams | undefined
|
|
|
|
const mainViteConfig = config.config?.main
|
|
if (mainViteConfig) {
|
|
const watchHook = (): void => {
|
|
logger.info(colors.green(`\nrebuild the electron main process successfully`))
|
|
|
|
if (ps) {
|
|
logger.info(colors.cyan(`\n waiting for electron to exit...`))
|
|
|
|
ps.removeAllListeners()
|
|
ps.kill()
|
|
ps = startElectron(inlineConfig.root, logger)
|
|
|
|
logger.info(colors.green(`\nrestart electron app...`))
|
|
}
|
|
}
|
|
|
|
await doBuild(mainViteConfig, watchHook)
|
|
|
|
logger.info(colors.green(`\nbuild the electron main process successfully`))
|
|
}
|
|
|
|
const preloadViteConfig = config.config?.preload
|
|
if (preloadViteConfig) {
|
|
logger.info(colors.gray(`\n-----\n`))
|
|
|
|
const watchHook = (): void => {
|
|
logger.info(colors.green(`\nrebuild the electron preload files successfully`))
|
|
|
|
if (server) {
|
|
logger.info(colors.cyan(`\n trigger renderer reload`))
|
|
|
|
server.ws.send({ type: 'full-reload' })
|
|
}
|
|
}
|
|
|
|
await doBuild(preloadViteConfig, watchHook)
|
|
|
|
logger.info(colors.green(`\nbuild the electron preload files successfully`))
|
|
}
|
|
|
|
const rendererViteConfig = config.config?.renderer
|
|
if (rendererViteConfig) {
|
|
logger.info(colors.gray(`\n-----\n`))
|
|
|
|
server = await ViteCreateServer(rendererViteConfig)
|
|
|
|
if (!server.httpServer) {
|
|
throw new Error('HTTP server not available')
|
|
}
|
|
|
|
await server.listen()
|
|
|
|
const conf = server.config.server
|
|
|
|
const protocol = conf.https ? 'https:' : 'http:'
|
|
const host = resolveHostname(conf.host)
|
|
const port = conf.port
|
|
process.env.ELECTRON_RENDERER_URL = `${protocol}//${host}:${port}`
|
|
|
|
const slogger = server.config.logger
|
|
|
|
slogger.info(colors.green(`dev server running for the electron renderer process at:\n`), {
|
|
clear: !slogger.hasWarned
|
|
})
|
|
|
|
server.printUrls()
|
|
}
|
|
|
|
ps = startElectron(inlineConfig.root, logger)
|
|
|
|
logger.info(colors.green(`\nstart electron app...`))
|
|
}
|
|
}
|
|
|
|
type UserConfig = ViteConfig & { configFile?: string | false }
|
|
|
|
async function doBuild(config: UserConfig, watchHook: () => void): Promise<void> {
|
|
return new Promise(resolve => {
|
|
if (config.build?.watch) {
|
|
let firstBundle = true
|
|
const closeBundle = (): void => {
|
|
if (firstBundle) {
|
|
firstBundle = false
|
|
resolve()
|
|
} else {
|
|
watchHook()
|
|
}
|
|
}
|
|
|
|
config = mergeConfig(config, {
|
|
plugins: [
|
|
{
|
|
name: 'vite:electron-watcher',
|
|
closeBundle
|
|
}
|
|
]
|
|
})
|
|
}
|
|
|
|
viteBuild(config).then(() => {
|
|
if (!config.build?.watch) {
|
|
resolve()
|
|
}
|
|
})
|
|
})
|
|
}
|