import * as program from 'commander'; import * as fetch from 'node-fetch'; import { I18nService } from 'jslib-common/abstractions/i18n.service'; import { PlatformUtilsService } from 'jslib-common/abstractions/platformUtils.service'; import { Response } from '../models/response'; import { MessageResponse } from '../models/response/messageResponse'; export class UpdateCommand { inPkg: boolean = false; constructor(private platformUtilsService: PlatformUtilsService, private i18nService: I18nService, private repoName: string, private executableName: string, private showExtendedMessage: boolean) { this.inPkg = !!(process as any).pkg; } async run(): Promise { const currentVersion = await this.platformUtilsService.getApplicationVersion(); const response = await fetch.default('https://api.github.com/repos/bitwarden/' + this.repoName + '/releases/latest'); if (response.status === 200) { const responseJson = await response.json(); const res = new MessageResponse(null, null); const tagName: string = responseJson.tag_name; if (tagName === ('v' + currentVersion)) { res.title = 'No update available.'; res.noColor = true; return Response.success(res); } let downloadUrl: string = null; if (responseJson.assets != null) { for (const a of responseJson.assets) { const download: string = a.browser_download_url; if (download == null) { continue; } if (download.indexOf('.zip') === -1) { continue; } if (process.platform === 'win32' && download.indexOf(this.executableName + '-windows') > -1) { downloadUrl = download; break; } else if (process.platform === 'darwin' && download.indexOf(this.executableName + '-macos') > -1) { downloadUrl = download; break; } else if (process.platform === 'linux' && download.indexOf(this.executableName + '-linux') > -1) { downloadUrl = download; break; } } } res.title = 'A new version is available: ' + tagName; if (downloadUrl == null) { downloadUrl = 'https://github.com/bitwarden/' + this.repoName + '/releases'; } else { res.raw = downloadUrl; } res.message = ''; if (responseJson.body != null && responseJson.body !== '') { res.message = responseJson.body + '\n\n'; } res.message += 'You can download this update at ' + downloadUrl; if (this.showExtendedMessage) { if (this.inPkg) { res.message += '\n\nIf you installed this CLI through a package manager ' + 'you should probably update using its update command instead.'; } else { res.message += '\n\nIf you installed this CLI through NPM ' + 'you should update using `npm install -g @bitwarden/' + this.repoName + '`'; } } return Response.success(res); } else { return Response.error('Error contacting update API: ' + response.status); } } }