YesPlayMusic/packages/electron/scripts/build.main.mjs
2022-05-12 02:45:43 +08:00

114 lines
2.5 KiB
JavaScript

import { build } from 'esbuild'
import ora from 'ora'
import { builtinModules } from 'module'
import electron from 'electron'
import { spawn } from 'child_process'
import path from 'path'
import waitOn from 'wait-on'
import dotenv from 'dotenv'
import pc from 'picocolors'
import minimist from 'minimist'
const env = dotenv.config({
path: path.resolve(process.cwd(), '../../.env'),
})
const envForEsbuild = {}
Object.entries(env.parsed || {}).forEach(([key, value]) => {
envForEsbuild[`process.env.${key}`] = `"${value}"`
})
console.log(envForEsbuild)
const argv = minimist(process.argv.slice(2))
const TAG = '[script/build.main.ts]'
const spinner = ora(`${TAG} Main Process Building...`)
const options = {
entryPoints: ['./index.ts', './rendererPreload.ts'],
outdir: './dist',
platform: 'node',
format: 'cjs',
bundle: true,
sourcemap: true,
define: envForEsbuild,
external: [
...builtinModules.filter(
x => !/^_|^(internal|v8|node-inspect)\/|\//.test(x)
),
'electron',
'NeteaseCloudMusicApi',
'better-sqlite3',
'@unblockneteasemusic/rust-napi',
],
}
const runApp = () => {
return spawn(electron, [path.resolve(process.cwd(), './dist/index.js')], {
stdio: 'inherit',
env: {
...process.env,
NODE_ENV: 'development',
},
})
}
if (argv.watch) {
waitOn(
{
resources: [
`http://127.0.0.1:${process.env.ELECTRON_WEB_SERVER_PORT}/index.html`,
],
timeout: 5000,
},
err => {
if (err) {
console.log(err)
process.exit(1)
} else {
let child
build({
...options,
watch: {
onRebuild(error) {
if (error) {
console.error(pc.red('Rebuild Failed:'), error)
} else {
console.log(pc.green('Rebuild Succeeded'))
if (child) child.kill()
child = runApp()
}
},
},
sourcemap: true,
}).then(() => {
console.log(pc.yellow(`⚡ Run App`))
if (child) child.kill()
child = runApp()
})
}
}
)
} else {
spinner.start()
build({
...options,
define: {
...options.define,
'process.env.NODE_ENV': '"production"',
},
minify: true,
})
.then(() => {
console.log(TAG, pc.green('Main Process Build Succeeded.'))
})
.catch(error => {
console.log(
`\n${TAG} ${pc.red('Main Process Build Failed')}\n`,
error,
'\n'
)
})
.finally(() => {
spinner.stop()
})
}