diff --git a/scripts/build-linux.js b/scripts/build-linux.js index 4d81e0f4..763a76f4 100755 --- a/scripts/build-linux.js +++ b/scripts/build-linux.js @@ -8,4 +8,6 @@ builder({ extraMetadata: { version: vars.version, }, + publish: 'onTag', + draft: false }) diff --git a/scripts/build-macos.js b/scripts/build-macos.js index ef45159a..1e4673bd 100755 --- a/scripts/build-macos.js +++ b/scripts/build-macos.js @@ -8,4 +8,6 @@ builder({ extraMetadata: { version: vars.version, }, + publish: 'onTag', + draft: false }) diff --git a/scripts/build-windows.js b/scripts/build-windows.js index 669cfdad..eb468ca1 100755 --- a/scripts/build-windows.js +++ b/scripts/build-windows.js @@ -8,5 +8,6 @@ builder({ extraMetadata: { version: vars.version, }, - publish: 'onTagOrDraft', + publish: 'onTag', + draft: false }) diff --git a/terminus-core/package.json b/terminus-core/package.json index bec38558..e0ce016b 100644 --- a/terminus-core/package.json +++ b/terminus-core/package.json @@ -20,8 +20,10 @@ "@types/js-yaml": "^3.9.0", "@types/node": "^7.0.37", "@types/webpack-env": "^1.13.0", + "axios": "^0.16.2", "bootstrap": "4.0.0-alpha.6", "core-js": "^2.4.1", + "electron-updater": "^2.8.9", "ngx-perfect-scrollbar": "4.0.0", "typescript": "^2.4.1" }, diff --git a/terminus-core/src/components/appRoot.component.pug b/terminus-core/src/components/appRoot.component.pug index 6a63790f..07b2907d 100644 --- a/terminus-core/src/components/appRoot.component.pug +++ b/terminus-core/src/components/appRoot.component.pug @@ -39,6 +39,13 @@ title-bar( (click)='button.click()', ) i.fa([class]='"fa fa-" + button.icon') + button.btn.btn-secondary.btn-tab-bar( + *ngIf='appUpdate', + title='Update available', + (click)='updateApp()', + ) + i.fa.fa-arrow-up.text-info + span.text-info Update window-controls( *ngIf='config.store.appearance.frame == "thin" && (hostApp.platform == Platform.Windows || hostApp.platform == Platform.Linux)', diff --git a/terminus-core/src/components/appRoot.component.ts b/terminus-core/src/components/appRoot.component.ts index 30940085..68b9778b 100644 --- a/terminus-core/src/components/appRoot.component.ts +++ b/terminus-core/src/components/appRoot.component.ts @@ -10,6 +10,7 @@ import { ConfigService } from '../services/config.service' import { DockingService } from '../services/docking.service' import { TabRecoveryService } from '../services/tabRecovery.service' import { ThemesService } from '../services/themes.service' +import { UpdaterService, Update } from '../services/updater.service' import { SafeModeModalComponent } from './safeModeModal.component' import { AppService, IToolbarButton, ToolbarButtonProvider } from '../api' @@ -53,12 +54,14 @@ export class AppRootComponent { @Input() leftToolbarButtons: IToolbarButton[] @Input() rightToolbarButtons: IToolbarButton[] private logger: Logger + private appUpdate: Update constructor ( private docking: DockingService, private electron: ElectronService, private tabRecovery: TabRecoveryService, private hotkeys: HotkeysService, + private updater: UpdaterService, public hostApp: HostAppService, public config: ConfigService, public app: AppService, @@ -111,6 +114,10 @@ export class AppRootComponent { if (window['safeModeReason']) { ngbModal.open(SafeModeModalComponent) } + + this.updater.check().then(update => { + this.appUpdate = update + }) } onGlobalHotkey () { @@ -155,6 +162,10 @@ export class AppRootComponent { return false } + updateApp () { + this.electron.shell.openExternal(this.appUpdate.url) + } + private getToolbarButtons (aboveZero: boolean): IToolbarButton[] { let buttons: IToolbarButton[] = [] this.toolbarButtonProviders.forEach((provider) => { diff --git a/terminus-core/src/index.ts b/terminus-core/src/index.ts index 69fb76f1..d039f2fb 100644 --- a/terminus-core/src/index.ts +++ b/terminus-core/src/index.ts @@ -14,6 +14,7 @@ import { HotkeysService, AppHotkeyProvider } from './services/hotkeys.service' import { DockingService } from './services/docking.service' import { TabRecoveryService } from './services/tabRecovery.service' import { ThemesService } from './services/themes.service' +import { UpdaterService } from './services/updater.service' import { AppRootComponent } from './components/appRoot.component' import { TabBodyComponent } from './components/tabBody.component' @@ -43,6 +44,7 @@ const PROVIDERS = [ LogService, TabRecoveryService, ThemesService, + UpdaterService, { provide: HotkeyProvider, useClass: AppHotkeyProvider, multi: true }, { provide: Theme, useClass: StandardTheme, multi: true }, { provide: ConfigProvider, useClass: CoreConfigProvider, multi: true }, diff --git a/terminus-core/src/services/updater.service.ts b/terminus-core/src/services/updater.service.ts new file mode 100644 index 00000000..027d0057 --- /dev/null +++ b/terminus-core/src/services/updater.service.ts @@ -0,0 +1,36 @@ +import axios from 'axios' +import { Injectable } from '@angular/core' +import { Logger, LogService } from './log.service' +import { ElectronService } from './electron.service' + +const UPDATES_URL = 'https://api.github.com/repos/eugeny/terminus/releases/latest' + +export interface Update { + version: string + url: string +} + +@Injectable() +export class UpdaterService { + private logger: Logger + + constructor ( + log: LogService, + private electron: ElectronService, + ) { + this.logger = log.create('updater') + } + + async check (): Promise { + this.logger.debug('Checking for updates') + let response = await axios.get(UPDATES_URL) + let data = response.data + let version = data.tag_name.substring(1) + if (this.electron.app.getVersion() !== version) { + this.logger.info('Update available:', version) + return { version, url: data.html_url } + } + this.logger.info('No updates') + return null + } +} diff --git a/terminus-core/yarn.lock b/terminus-core/yarn.lock new file mode 100644 index 00000000..09ac10c3 --- /dev/null +++ b/terminus-core/yarn.lock @@ -0,0 +1,216 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/js-yaml@^3.9.0": + version "3.9.1" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.9.1.tgz#2f3c142771bb345829ce690c5838760b6b9ba553" + +"@types/node@^7.0.37": + version "7.0.43" + resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" + +"@types/webpack-env@^1.13.0": + version "1.13.1" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.1.tgz#b45c222e24301bd006e3edfc762cc6b51bda236a" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +axios@^0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.2.tgz#ba4f92f17167dfbab40983785454b9ac149c3c6d" + dependencies: + follow-redirects "^1.2.3" + is-buffer "^1.1.5" + +bluebird-lst@^1.0.2, bluebird-lst@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.3.tgz#cc56c18660eff0a0b86e2c33d1659618f7005158" + dependencies: + bluebird "^3.5.0" + +bluebird@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +bootstrap@4.0.0-alpha.6: + version "4.0.0-alpha.6" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz#4f54dd33ac0deac3b28407bc2df7ec608869c9c8" + dependencies: + jquery ">=1.9.1" + tether "^1.4.0" + +core-js@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + +debug@^2.4.5: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +debug@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.0.1.tgz#0564c612b521dc92d9f2988f0549e34f9c98db64" + dependencies: + ms "2.0.0" + +deepmerge@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.1.tgz#c053bf06fd7276f1994f70c09a0760cb61a56237" + +electron-builder-http@~19.27.5: + version "19.27.5" + resolved "https://registry.yarnpkg.com/electron-builder-http/-/electron-builder-http-19.27.5.tgz#800865df2e618ffab9e5b3b895c15b4ce7fd7f17" + dependencies: + bluebird-lst "^1.0.3" + debug "^3.0.1" + fs-extra-p "^4.4.0" + +electron-is-dev@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.3.0.tgz#14e6fda5c68e9e4ecbeff9ccf037cbd7c05c5afe" + +electron-updater@^2.8.9: + version "2.8.9" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-2.8.9.tgz#e2525dcbd7c27ff173bdfd2e87056d67310e2555" + dependencies: + bluebird-lst "^1.0.3" + debug "^3.0.1" + electron-builder-http "~19.27.5" + electron-is-dev "^0.3.0" + fs-extra-p "^4.4.0" + js-yaml "^3.9.1" + lazy-val "^1.0.2" + lodash.isequal "^4.5.0" + semver "^5.4.1" + source-map-support "^0.4.16" + uuid-1345 "^0.99.6" + xelement "^1.0.16" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +follow-redirects@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.4.tgz#355e8f4d16876b43f577b0d5ce2668b9723214ea" + dependencies: + debug "^2.4.5" + +fs-extra-p@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-4.4.0.tgz#729c601c4f4c701328921adc7cfe9b236f100660" + dependencies: + bluebird-lst "^1.0.2" + fs-extra "^4.0.0" + +fs-extra@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.1.tgz#7fc0c6c8957f983f57f306a24e5b9ddd8d0dd880" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +jquery@>=1.9.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" + +js-yaml@^3.9.0, js-yaml@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + +lazy-val@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.2.tgz#d9b07fb1fce54cbc99b3c611de431b83249369b6" + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + +macaddress@^0.2.7: + version "0.2.8" + resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +ngx-perfect-scrollbar@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ngx-perfect-scrollbar/-/ngx-perfect-scrollbar-4.0.0.tgz#f1e19449fa97d7f16e1ceb1fe1739e4bb646bebe" + dependencies: + perfect-scrollbar "~0.6.0" + +perfect-scrollbar@~0.6.0: + version "0.6.16" + resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-0.6.16.tgz#b1d61a5245cf3962bb9a8407a3fc669d923212fc" + +sax@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +semver@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + +source-map-support@^0.4.16: + version "0.4.17" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.17.tgz#6f2150553e6375375d0ccb3180502b78c18ba430" + dependencies: + source-map "^0.5.6" + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +tether@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/tether/-/tether-1.4.0.tgz#0f9fa171f75bf58485d8149e94799d7ae74d1c1a" + +typescript@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.2.tgz#038a95f7d9bbb420b1bf35ba31d4c5c1dd3ffe34" + +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + +uuid-1345@^0.99.6: + version "0.99.6" + resolved "https://registry.yarnpkg.com/uuid-1345/-/uuid-1345-0.99.6.tgz#b1270ae015a7721c7adec6c46ec169c6098aed40" + dependencies: + macaddress "^0.2.7" + +xelement@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/xelement/-/xelement-1.0.16.tgz#900bb46c20fc2dffadff778a9d2dc36699d0ff7e" + dependencies: + sax "^1.2.1"