npm-packages.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { ManagementType, Result } from './types'
  2. import {
  3. getNpmLatestVersion,
  4. getNpmPackageVersion,
  5. installNpmPackage,
  6. installNpmDevPackage,
  7. updateNpmPackage,
  8. semverLt
  9. } from './util'
  10. import logger from '../../helpers/logger'
  11. import { resolve } from '../../helpers/app-paths'
  12. import inquirer from 'inquirer'
  13. import { existsSync } from 'fs'
  14. const log = logger('dependency:npm-packages')
  15. async function manageDependencies(
  16. managementType: ManagementType,
  17. dependencies: string[]
  18. ): Promise<Result> {
  19. const installedDeps = []
  20. const updatedDeps = []
  21. if (existsSync(resolve.app('package.json'))) {
  22. for (const dependency of dependencies) {
  23. const currentVersion = await getNpmPackageVersion(dependency)
  24. if (currentVersion === null) {
  25. log(`Installing ${dependency}...`)
  26. if (managementType === ManagementType.Install) {
  27. installNpmPackage(dependency)
  28. } else if (managementType === ManagementType.InstallDev) {
  29. installNpmDevPackage(dependency)
  30. }
  31. installedDeps.push(dependency)
  32. } else if (managementType === ManagementType.Update) {
  33. const latestVersion = getNpmLatestVersion(dependency)
  34. if (semverLt(currentVersion, latestVersion)) {
  35. // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-var-requires, @typescript-eslint/no-unsafe-member-access
  36. const inquired = await inquirer.prompt([
  37. {
  38. type: 'confirm',
  39. name: 'answer',
  40. message: `[NPM]: "${dependency}" latest version is ${latestVersion}. Do you want to update?`,
  41. default: false
  42. }
  43. ])
  44. // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-var-requires, @typescript-eslint/no-unsafe-member-access
  45. if (inquired.answer) {
  46. log(`Updating ${dependency}...`)
  47. updateNpmPackage(dependency)
  48. updatedDeps.push(dependency)
  49. }
  50. } else {
  51. log(`"${dependency}" is up to date`)
  52. }
  53. } else {
  54. log(`"${dependency}" is already installed`)
  55. }
  56. }
  57. }
  58. const result: Result = new Map<ManagementType, string[]>()
  59. result.set(ManagementType.Install, installedDeps)
  60. result.set(ManagementType.Update, updatedDeps)
  61. return result
  62. }
  63. const dependencies = ['tauri']
  64. async function install(): Promise<Result> {
  65. return await manageDependencies(ManagementType.Install, dependencies)
  66. }
  67. async function installThese(dependencies: string[]): Promise<Result> {
  68. return await manageDependencies(ManagementType.Install, dependencies)
  69. }
  70. async function installTheseDev(dependencies: string[]): Promise<Result> {
  71. return await manageDependencies(ManagementType.InstallDev, dependencies)
  72. }
  73. async function update(): Promise<Result> {
  74. return await manageDependencies(ManagementType.Update, dependencies)
  75. }
  76. export { install, installThese, installTheseDev, update }