codePush.mjs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #!/usr/bin/env node
  2. import CodePush from 'code-push'
  3. import { build } from 'vite'
  4. import { MobileProject } from '@trapezedev/project'
  5. import fs from 'fs'
  6. import path from 'path'
  7. import inquirer from 'inquirer'
  8. import { sync } from '@capacitor/cli/dist/tasks/sync.js'
  9. import { loadConfig } from '@capacitor/cli/dist/config.js'
  10. import ProgressBar from 'progress'
  11. const token = '064853a8cdbfb94ed9b62ce30da17f162a1444a0'
  12. const androidName = 'ASNFTNGFHP-Android'
  13. const iosName = 'ASNFTNGFHP-iOS'
  14. inquirer
  15. .prompt([
  16. {
  17. name: 'type',
  18. type: 'list',
  19. message: 'Deployment Type',
  20. choices: ['Development', 'Release'],
  21. default: 'Development'
  22. },
  23. {
  24. name: 'platform',
  25. type: 'checkbox',
  26. message: 'Platform',
  27. choices: ['Android', 'iOS'],
  28. default: ['Android']
  29. },
  30. { name: 'build', type: 'list', message: 'Build Package', choices: ['YES', 'NO'], default: 'YES' }
  31. ])
  32. .then(async answers => {
  33. console.log(answers)
  34. let mode = 'app'
  35. if (answers.type === 'Development') {
  36. process.env.NODE_ENV = 'dev'
  37. mode = 'test'
  38. }
  39. const capacitorConfig = await loadConfig()
  40. const codePush = new CodePush(token)
  41. const projectConfig = {
  42. ios: {
  43. path: 'ios/App'
  44. },
  45. android: {
  46. path: 'android'
  47. }
  48. }
  49. const project = new MobileProject(process.cwd(), projectConfig)
  50. await project.load()
  51. if (answers.platform.includes('Android')) await project.android.incrementVersionCode()
  52. if (answers.platform.includes('iOS')) await project.ios.incrementBuild('App')
  53. project.commit()
  54. let meta = String(fs.readFileSync(path.resolve(process.cwd(), 'public', 'meta.js')))
  55. if (answers.build === 'YES') {
  56. meta = meta.replace(
  57. /(window.www_version = )\d+/,
  58. `$1${parseInt(/window.www_version = (\d+)/.exec(meta)[1]) + 1}`
  59. )
  60. fs.writeFileSync(path.resolve(process.cwd(), 'public', 'meta.js'), meta)
  61. await build({
  62. configFile: 'vite.config.js',
  63. mode
  64. })
  65. }
  66. if (answers.platform.includes('Android')) {
  67. var bar1 = new ProgressBar('Upload Android Bundle [:bar] :percent', { total: 100 })
  68. await sync(capacitorConfig, 'android', null, false)
  69. await codePush
  70. .release(androidName, answers.type, 'android/app/src/main/assets/public/', '~1.0.0', {}, percent => {
  71. bar1.tick(percent)
  72. })
  73. .then(res => {
  74. console.log('Upload Android Bundle Success', res)
  75. })
  76. }
  77. if (answers.platform.includes('iOS')) {
  78. var bar2 = new ProgressBar('Upload iOS Bundle [:bar] :percent', { total: 100 })
  79. await sync(capacitorConfig, 'ios', null, false)
  80. await codePush
  81. .release(androidName, answers.type, 'ios/App/App/public/', '~1.0.0', {}, percent => {
  82. bar2.tick(percent)
  83. })
  84. .then(res => {
  85. console.log('Upload iOS Bundle Success', res)
  86. })
  87. }
  88. fs.readdirSync(process.cwd()).forEach(file => {
  89. if (/^\w+\.zip$/.test(file)) {
  90. fs.unlinkSync(path.resolve(process.cwd(), file))
  91. }
  92. })
  93. })
  94. .catch(error => {
  95. console.log(error)
  96. if (error.isTtyError) {
  97. // Prompt couldn't be rendered in the current environment
  98. } else {
  99. // Something else went wrong
  100. }
  101. })