build.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. 'use strict'
  2. process.env.NODE_ENV = 'production'
  3. const { say } = require('cfonts')
  4. const chalk = require('chalk')
  5. const del = require('del')
  6. const webpack = require('webpack')
  7. const { Listr } = require('listr2')
  8. const mainConfig = require('./webpack.main.config')
  9. const rendererConfig = require('./webpack.renderer.config')
  10. const doneLog = chalk.bgGreen.white(' DONE ') + ' '
  11. const errorLog = chalk.bgRed.white(' ERROR ') + ' '
  12. const okayLog = chalk.bgBlue.white(' OKAY ') + ' '
  13. const isCI = process.env.CI || false
  14. if (process.env.BUILD_TARGET === 'web') web()
  15. else build()
  16. function clean() {
  17. del.sync(['dist/electron/*', 'build/*', '!build/icons', '!build/lib', '!build/lib/electron-build.*', '!build/icons/icon.*'])
  18. console.log(`\n${doneLog}clear done`)
  19. if (process.env.BUILD_TARGET === 'onlyClean') process.exit()
  20. }
  21. function build() {
  22. greeting()
  23. if (process.env.BUILD_TARGET === 'clean' || process.env.BUILD_TARGET === 'onlyClean') clean()
  24. const tasksLister = new Listr([
  25. {
  26. title: 'building main process',
  27. task: async (_, tasks) => {
  28. try {
  29. await pack(mainConfig)
  30. } catch (error) {
  31. console.error(`\n${error}\n`)
  32. console.log(`\n ${errorLog}failed to build main process`)
  33. process.exit(1)
  34. }
  35. }
  36. },
  37. {
  38. title: "building renderer process",
  39. task: async (_, tasks) => {
  40. try {
  41. await pack(rendererConfig)
  42. tasks.output = `${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`
  43. } catch (error) {
  44. console.error(`\n${error}\n`)
  45. console.log(`\n ${errorLog}failed to build renderer process`)
  46. process.exit(1)
  47. }
  48. },
  49. options: { persistentOutput: true }
  50. }
  51. ], {
  52. exitOnError: true
  53. })
  54. tasksLister.run()
  55. }
  56. function pack(config) {
  57. return new Promise((resolve, reject) => {
  58. config.mode = 'production'
  59. webpack(config, (err, stats) => {
  60. if (err) reject(err.stack || err)
  61. else if (stats.hasErrors()) {
  62. let err = ''
  63. stats.toString({
  64. chunks: false,
  65. colors: true
  66. })
  67. .split(/\r?\n/)
  68. .forEach(line => {
  69. err += ` ${line}\n`
  70. })
  71. reject(err)
  72. } else {
  73. resolve(stats.toString({
  74. chunks: false,
  75. colors: true
  76. }))
  77. }
  78. })
  79. })
  80. }
  81. function web() {
  82. del.sync(['dist/web/*', '!.gitkeep'])
  83. rendererConfig.mode = 'production'
  84. webpack(rendererConfig, (err, stats) => {
  85. if (err || stats.hasErrors()) console.log(err)
  86. console.log(stats.toString({
  87. chunks: false,
  88. colors: true
  89. }))
  90. process.exit()
  91. })
  92. }
  93. function greeting() {
  94. const cols = process.stdout.columns
  95. let text = ''
  96. if (cols > 85) text = `let's-build`
  97. else if (cols > 60) text = `let's-|build`
  98. else text = false
  99. if (text && !isCI) {
  100. say(text, {
  101. colors: ['yellow'],
  102. font: 'simple3d',
  103. space: false
  104. })
  105. } else console.log(chalk.yellow.bold(`\n let's-build`))
  106. console.log()
  107. }