spawn.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // Copyright 2019-2021 Tauri Programme within The Commons Conservancy
  2. // SPDX-License-Identifier: Apache-2.0
  3. // SPDX-License-Identifier: MIT
  4. import crossSpawn from 'cross-spawn'
  5. import logger from './logger'
  6. import chalk from 'chalk'
  7. const log = logger('app:spawn')
  8. const warn = logger('app:spawn', chalk.red)
  9. /*
  10. Returns pid, takes onClose
  11. */
  12. export const spawn = (
  13. cmd: string,
  14. params: string[],
  15. cwd: string,
  16. onClose?: (code: number, pid: number) => void
  17. ): number => {
  18. log(`Running "${cmd} ${params.join(' ')}"`)
  19. log()
  20. // TODO: move to execa?
  21. const runner = crossSpawn(cmd, params, {
  22. stdio: 'inherit',
  23. cwd,
  24. env: process.env
  25. })
  26. runner.on('close', (code) => {
  27. log()
  28. if (code) {
  29. // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
  30. log(`Command "${cmd}" failed with exit code: ${code}`)
  31. }
  32. // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
  33. onClose && onClose(code ?? 0, runner.pid)
  34. })
  35. return runner.pid
  36. }
  37. /*
  38. Returns nothing, takes onFail
  39. */
  40. export const spawnSync = (
  41. cmd: string,
  42. params: string[],
  43. cwd: string,
  44. onFail?: () => void
  45. ): void => {
  46. log(`[sync] Running "${cmd} ${params.join(' ')}"`)
  47. log()
  48. const runner = crossSpawn.sync(cmd, params, {
  49. stdio: 'inherit',
  50. cwd
  51. })
  52. // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
  53. if (runner.status || runner.error) {
  54. warn()
  55. // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
  56. warn(`⚠️ Command "${cmd}" failed with exit code: ${runner.status}`)
  57. if (runner.status === null) {
  58. warn(`⚠️ Please globally install "${cmd}"`)
  59. }
  60. // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
  61. onFail && onFail()
  62. process.exit(1)
  63. }
  64. }