pluginManager.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import { promisify } from 'util'
  2. export class PluginManager {
  3. npm: any
  4. npmReady?: Promise<void>
  5. async ensureLoaded (): Promise<void> {
  6. if (!this.npmReady) {
  7. this.npmReady = new Promise(resolve => {
  8. const npm = require('npm')
  9. npm.load(err => {
  10. if (err) {
  11. console.error(err)
  12. return
  13. }
  14. npm.config.set('global', false)
  15. this.npm = npm
  16. resolve()
  17. })
  18. })
  19. }
  20. return this.npmReady
  21. }
  22. async install (path: string, name: string, version: string): Promise<void> {
  23. await this.ensureLoaded()
  24. this.npm.prefix = path
  25. return promisify(this.npm.commands.install)([`${name}@${version}`])
  26. }
  27. async uninstall (path: string, name: string): Promise<void> {
  28. await this.ensureLoaded()
  29. this.npm.prefix = path
  30. return promisify(this.npm.commands.remove)([name])
  31. }
  32. }
  33. export const pluginManager = new PluginManager()