diff --git a/filenames.auto.gni b/filenames.auto.gni index d8baa35249d6..295cea72aaaf 100644 --- a/filenames.auto.gni +++ b/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", diff --git a/lib/browser/api/auto-updater.js b/lib/browser/api/auto-updater.js deleted file mode 100644 index 3435247a68cc..000000000000 --- a/lib/browser/api/auto-updater.js +++ /dev/null @@ -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'); -} diff --git a/lib/browser/api/auto-updater.ts b/lib/browser/api/auto-updater.ts new file mode 100644 index 000000000000..d433cda0e689 --- /dev/null +++ b/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'); +} diff --git a/lib/browser/api/auto-updater/auto-updater-native.js b/lib/browser/api/auto-updater/auto-updater-native.ts similarity index 70% rename from lib/browser/api/auto-updater/auto-updater-native.js rename to lib/browser/api/auto-updater/auto-updater-native.ts index c3ecba78d8d7..82a66b96e088 100644 --- a/lib/browser/api/auto-updater/auto-updater-native.js +++ b/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; diff --git a/lib/browser/api/auto-updater/auto-updater-win.js b/lib/browser/api/auto-updater/auto-updater-win.ts similarity index 66% rename from lib/browser/api/auto-updater/auto-updater-win.js rename to lib/browser/api/auto-updater/auto-updater-win.ts index 93e7a94ac58e..371927460640 100644 --- a/lib/browser/api/auto-updater/auto-updater-win.js +++ b/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(); diff --git a/lib/browser/api/auto-updater/squirrel-update-win.js b/lib/browser/api/auto-updater/squirrel-update-win.ts similarity index 72% rename from lib/browser/api/auto-updater/squirrel-update-win.js rename to lib/browser/api/auto-updater/squirrel-update-win.ts index fd237620617d..0a197ab8906c 100644 --- a/lib/browser/api/auto-updater/squirrel-update-win.js +++ b/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; } -}; +}