Browse Source

chore: tsify auto-updater (#24328)

Jeremy Rose 4 years ago
parent
commit
354ea00f17

+ 4 - 4
filenames.auto.gni

@@ -186,10 +186,10 @@ auto_filenames = {
 
   browser_bundle_deps = [
     "lib/browser/api/app.ts",
-    "lib/browser/api/auto-updater.js",
-    "lib/browser/api/auto-updater/auto-updater-native.js",
-    "lib/browser/api/auto-updater/auto-updater-win.js",
-    "lib/browser/api/auto-updater/squirrel-update-win.js",
+    "lib/browser/api/auto-updater.ts",
+    "lib/browser/api/auto-updater/auto-updater-native.ts",
+    "lib/browser/api/auto-updater/auto-updater-win.ts",
+    "lib/browser/api/auto-updater/squirrel-update-win.ts",
     "lib/browser/api/base-window.ts",
     "lib/browser/api/browser-view.ts",
     "lib/browser/api/browser-window.ts",

+ 0 - 7
lib/browser/api/auto-updater.js

@@ -1,7 +0,0 @@
-'use strict';
-
-if (process.platform === 'win32') {
-  module.exports = require('@electron/internal/browser/api/auto-updater/auto-updater-win');
-} else {
-  module.exports = require('@electron/internal/browser/api/auto-updater/auto-updater-native');
-}

+ 5 - 0
lib/browser/api/auto-updater.ts

@@ -0,0 +1,5 @@
+if (process.platform === 'win32') {
+  module.exports = require('./auto-updater/auto-updater-win');
+} else {
+  module.exports = require('./auto-updater/auto-updater-native');
+}

+ 2 - 4
lib/browser/api/auto-updater/auto-updater-native.js → lib/browser/api/auto-updater/auto-updater-native.ts

@@ -1,10 +1,8 @@
-'use strict';
-
-const EventEmitter = require('events').EventEmitter;
+import { EventEmitter } from 'events';
 const { autoUpdater, AutoUpdater } = process._linkedBinding('electron_browser_auto_updater');
 
 // AutoUpdater is an EventEmitter.
 Object.setPrototypeOf(AutoUpdater.prototype, EventEmitter.prototype);
 EventEmitter.call(autoUpdater);
 
-module.exports = autoUpdater;
+export default autoUpdater;

+ 18 - 16
lib/browser/api/auto-updater/auto-updater-win.js → lib/browser/api/auto-updater/auto-updater-win.ts

@@ -1,13 +1,14 @@
-'use strict';
-
-const { app } = require('electron');
-const { EventEmitter } = require('events');
-const squirrelUpdate = require('@electron/internal/browser/api/auto-updater/squirrel-update-win');
+import { app } from 'electron';
+import { EventEmitter } from 'events';
+import * as squirrelUpdate from './squirrel-update-win';
 
 class AutoUpdater extends EventEmitter {
+  updateAvailable: boolean = false;
+  updateURL: string | null = null;
+
   quitAndInstall () {
     if (!this.updateAvailable) {
-      return this.emitError('No update available, can\'t quit and install');
+      return this.emitError(new Error('No update available, can\'t quit and install'));
     }
     squirrelUpdate.processStart();
     app.quit();
@@ -17,8 +18,8 @@ class AutoUpdater extends EventEmitter {
     return this.updateURL;
   }
 
-  setFeedURL (options) {
-    let updateURL;
+  setFeedURL (options: { url: string } | string) {
+    let updateURL: string;
     if (typeof options === 'object') {
       if (typeof options.url === 'string') {
         updateURL = options.url;
@@ -34,14 +35,15 @@ class AutoUpdater extends EventEmitter {
   }
 
   checkForUpdates () {
-    if (!this.updateURL) {
-      return this.emitError('Update URL is not set');
+    const url = this.updateURL;
+    if (!url) {
+      return this.emitError(new Error('Update URL is not set'));
     }
     if (!squirrelUpdate.supported()) {
-      return this.emitError('Can not find Squirrel');
+      return this.emitError(new Error('Can not find Squirrel'));
     }
     this.emit('checking-for-update');
-    squirrelUpdate.checkForUpdate(this.updateURL, (error, update) => {
+    squirrelUpdate.checkForUpdate(url, (error, update) => {
       if (error != null) {
         return this.emitError(error);
       }
@@ -50,7 +52,7 @@ class AutoUpdater extends EventEmitter {
       }
       this.updateAvailable = true;
       this.emit('update-available');
-      squirrelUpdate.update(this.updateURL, (error) => {
+      squirrelUpdate.update(url, (error) => {
         if (error != null) {
           return this.emitError(error);
         }
@@ -66,9 +68,9 @@ class AutoUpdater extends EventEmitter {
 
   // Private: Emit both error object and message, this is to keep compatibility
   // with Old APIs.
-  emitError (message) {
-    this.emit('error', new Error(message), message);
+  emitError (error: Error) {
+    this.emit('error', error, error.message);
   }
 }
 
-module.exports = new AutoUpdater();
+export default new AutoUpdater();

+ 20 - 22
lib/browser/api/auto-updater/squirrel-update-win.js → lib/browser/api/auto-updater/squirrel-update-win.ts

@@ -1,8 +1,6 @@
-'use strict';
-
-const fs = require('fs');
-const path = require('path');
-const spawn = require('child_process').spawn;
+import * as fs from 'fs';
+import * as path from 'path';
+import { spawn, ChildProcessWithoutNullStreams } from 'child_process';
 
 // i.e. my-app/app-0.1.13/
 const appFolder = path.dirname(process.execPath);
@@ -10,15 +8,15 @@ const appFolder = path.dirname(process.execPath);
 // i.e. my-app/Update.exe
 const updateExe = path.resolve(appFolder, '..', 'Update.exe');
 const exeName = path.basename(process.execPath);
-let spawnedArgs = [];
-let spawnedProcess;
+let spawnedArgs: string[] = [];
+let spawnedProcess: ChildProcessWithoutNullStreams | undefined;
 
-const isSameArgs = (args) => args.length === spawnedArgs.length && args.every((e, i) => e === spawnedArgs[i]);
+const isSameArgs = (args: string[]) => args.length === spawnedArgs.length && args.every((e, i) => e === spawnedArgs[i]);
 
 // Spawn a command and invoke the callback when it completes with an error
 // and the output from standard out.
-const spawnUpdate = function (args, detached, callback) {
-  let error, errorEmitted, stderr, stdout;
+const spawnUpdate = function (args: string[], detached: boolean, callback: Function) {
+  let error: Error, errorEmitted: boolean, stderr: string, stdout: string;
 
   try {
     // Ensure we don't spawn multiple squirrel processes
@@ -79,13 +77,13 @@ const spawnUpdate = function (args, detached, callback) {
 };
 
 // Start an instance of the installed app.
-exports.processStart = function () {
+export function processStart () {
   return spawnUpdate(['--processStartAndWait', exeName], true, function () {});
-};
+}
 
 // Download the releases specified by the URL and write new results to stdout.
-exports.checkForUpdate = function (updateURL, callback) {
-  return spawnUpdate(['--checkForUpdate', updateURL], false, function (error, stdout) {
+export function checkForUpdate (updateURL: string, callback: (error: Error | null, update?: any) => void) {
+  return spawnUpdate(['--checkForUpdate', updateURL], false, function (error: Error, stdout: string) {
     let ref, ref1, update;
     if (error != null) {
       return callback(error);
@@ -93,27 +91,27 @@ exports.checkForUpdate = function (updateURL, callback) {
     try {
       // Last line of output is the JSON details about the releases
       const json = stdout.trim().split('\n').pop();
-      update = (ref = JSON.parse(json)) != null ? (ref1 = ref.releasesToApply) != null ? typeof ref1.pop === 'function' ? ref1.pop() : undefined : undefined : undefined;
+      update = (ref = JSON.parse(json!)) != null ? (ref1 = ref.releasesToApply) != null ? typeof ref1.pop === 'function' ? ref1.pop() : undefined : undefined : undefined;
     } catch {
       // Disabled for backwards compatibility:
       // eslint-disable-next-line standard/no-callback-literal
-      return callback(`Invalid result:\n${stdout}`);
+      return callback(new Error(`Invalid result:\n${stdout}`));
     }
     return callback(null, update);
   });
-};
+}
 
 // Update the application to the latest remote version specified by URL.
-exports.update = function (updateURL, callback) {
+export function update (updateURL: string, callback: (error: Error) => void) {
   return spawnUpdate(['--update', updateURL], false, callback);
-};
+}
 
 // Is the Update.exe installed with the current application?
-exports.supported = function () {
+export function supported () {
   try {
-    fs.accessSync(updateExe, fs.R_OK);
+    fs.accessSync(updateExe, fs.constants.R_OK);
     return true;
   } catch {
     return false;
   }
-};
+}