From 6b215b0c1d91c998bb2ab953b502e87868527ed9 Mon Sep 17 00:00:00 2001 From: Erick Zhao Date: Thu, 13 Oct 2022 14:21:22 -0700 Subject: [PATCH] chore: remove `install` command (#2958) --- package.json | 2 - .../api/cli/src/electron-forge-install.ts | 45 ----- packages/api/core/package.json | 6 - packages/api/core/src/api/index.ts | 12 -- packages/api/core/src/api/install.ts | 177 ------------------ .../api/core/test/slow/install_spec_slow.ts | 158 ---------------- packages/installer/base/package.json | 20 -- packages/installer/base/src/Installer.ts | 28 --- .../installer/base/test/Installer_spec.ts | 20 -- packages/installer/darwin/package.json | 22 --- .../installer/darwin/src/InstallerDarwin.ts | 35 ---- .../installer/darwin/typings/ambient.d.ts | 0 packages/installer/deb/package.json | 19 -- packages/installer/deb/src/InstallerDeb.ts | 11 -- packages/installer/dmg/package.json | 22 --- packages/installer/dmg/src/InstallerDMG.ts | 38 ---- packages/installer/dmg/src/util/hdiutil.ts | 50 ----- packages/installer/exe/package.json | 20 -- packages/installer/exe/src/InstallerExe.ts | 13 -- packages/installer/linux/package.json | 20 -- .../installer/linux/src/InstallerLinux.ts | 20 -- packages/installer/linux/typings/ambient.d.ts | 0 packages/installer/rpm/package.json | 19 -- packages/installer/rpm/src/InstallerRpm.ts | 11 -- packages/installer/zip/package.json | 21 --- packages/installer/zip/src/InstallerZip.ts | 28 --- yarn.lock | 2 +- 27 files changed, 1 insertion(+), 818 deletions(-) delete mode 100644 packages/api/cli/src/electron-forge-install.ts delete mode 100644 packages/api/core/src/api/install.ts delete mode 100644 packages/api/core/test/slow/install_spec_slow.ts delete mode 100644 packages/installer/base/package.json delete mode 100644 packages/installer/base/src/Installer.ts delete mode 100644 packages/installer/base/test/Installer_spec.ts delete mode 100644 packages/installer/darwin/package.json delete mode 100644 packages/installer/darwin/src/InstallerDarwin.ts delete mode 100644 packages/installer/darwin/typings/ambient.d.ts delete mode 100644 packages/installer/deb/package.json delete mode 100644 packages/installer/deb/src/InstallerDeb.ts delete mode 100644 packages/installer/dmg/package.json delete mode 100644 packages/installer/dmg/src/InstallerDMG.ts delete mode 100644 packages/installer/dmg/src/util/hdiutil.ts delete mode 100644 packages/installer/exe/package.json delete mode 100644 packages/installer/exe/src/InstallerExe.ts delete mode 100644 packages/installer/linux/package.json delete mode 100644 packages/installer/linux/src/InstallerLinux.ts delete mode 100644 packages/installer/linux/typings/ambient.d.ts delete mode 100644 packages/installer/rpm/package.json delete mode 100644 packages/installer/rpm/src/InstallerRpm.ts delete mode 100644 packages/installer/zip/package.json delete mode 100644 packages/installer/zip/src/InstallerZip.ts diff --git a/package.json b/package.json index fc738ec699..5cf748c3ac 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "bolt": { "workspaces": [ "packages/api/*", - "packages/installer/*", "packages/maker/*", "packages/publisher/*", "packages/utils/*", @@ -70,7 +69,6 @@ "mime-types": "^2.1.25", "node-fetch": "^2.6.7", "nugget": "^2.0.1", - "open": "^8.1.0", "ora": "^5.0.0", "parse-author": "^2.0.0", "pretty-ms": "^7.0.0", diff --git a/packages/api/cli/src/electron-forge-install.ts b/packages/api/cli/src/electron-forge-install.ts deleted file mode 100644 index ff1b43ad5d..0000000000 --- a/packages/api/cli/src/electron-forge-install.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { api, InstallAsset } from '@electron-forge/core'; - -import chalk from 'chalk'; -import fs from 'fs-extra'; -import inquirer from 'inquirer'; -import program from 'commander'; -import path from 'path'; - -import './util/terminate'; - -(async () => { - let repo!: string; - - program - .version((await fs.readJson(path.resolve(__dirname, '../package.json'))).version) - .arguments('[repository]') - .option('--prerelease', 'Fetch prerelease versions') - .action((repository) => { - repo = repository; - }) - .parse(process.argv); - - const chooseAsset = async (assets: InstallAsset[]) => { - const choices: { name: string; value: string }[] = []; - assets.forEach((asset) => { - choices.push({ name: asset.name, value: asset.id }); - }); - const { assetID } = await inquirer.createPromptModule()<{ assetID: string }>({ - choices, - type: 'list', - name: 'assetID', - message: chalk.cyan('Multiple potential assets found, please choose one from the list below:'), - }); - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return assets.find((asset) => asset.id === assetID)!; - }; - - await api.install({ - chooseAsset, - repo, - interactive: true, - prerelease: program.prerelease, - }); -})(); diff --git a/packages/api/core/package.json b/packages/api/core/package.json index bf0276f5cb..47e233d934 100644 --- a/packages/api/core/package.json +++ b/packages/api/core/package.json @@ -38,12 +38,6 @@ }, "dependencies": { "@electron-forge/async-ora": "6.0.0-beta.67", - "@electron-forge/installer-base": "6.0.0-beta.67", - "@electron-forge/installer-deb": "6.0.0-beta.67", - "@electron-forge/installer-dmg": "6.0.0-beta.67", - "@electron-forge/installer-exe": "6.0.0-beta.67", - "@electron-forge/installer-rpm": "6.0.0-beta.67", - "@electron-forge/installer-zip": "6.0.0-beta.67", "@electron-forge/maker-base": "6.0.0-beta.67", "@electron-forge/plugin-base": "6.0.0-beta.67", "@electron-forge/publisher-base": "6.0.0-beta.67", diff --git a/packages/api/core/src/api/index.ts b/packages/api/core/src/api/index.ts index cd152b9c23..205ce57433 100644 --- a/packages/api/core/src/api/index.ts +++ b/packages/api/core/src/api/index.ts @@ -2,7 +2,6 @@ import { ElectronProcess, ForgeMakeResult } from '@electron-forge/shared-types'; import _import, { ImportOptions } from './import'; import init, { InitOptions } from './init'; -import install, { InstallOptions, Asset as InstallAsset } from './install'; import lint, { LintOptions } from './lint'; import make, { MakeOptions } from './make'; import _package, { PackageOptions } from './package'; @@ -29,15 +28,6 @@ export class ForgeAPI { return init(opts); } - /** - * Install an Electron application from GitHub. - * - * Works on all three platforms for all major distributable types. - */ - install(opts: InstallOptions): Promise { - return install(opts); - } - /** * Lint a local Electron application. * @@ -88,8 +78,6 @@ export { ForgeUtils, ImportOptions, InitOptions, - InstallAsset, - InstallOptions, LintOptions, MakeOptions, PackageOptions, diff --git a/packages/api/core/src/api/install.ts b/packages/api/core/src/api/install.ts deleted file mode 100644 index 1284b48ed4..0000000000 --- a/packages/api/core/src/api/install.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { asyncOra } from '@electron-forge/async-ora'; -import chalk from 'chalk'; -import debug from 'debug'; -import fetch from 'node-fetch'; -import fs from 'fs-extra'; -import os from 'os'; -import path from 'path'; -import semver from 'semver'; - -import InstallerBase from '@electron-forge/installer-base'; -import DMGInstaller from '@electron-forge/installer-dmg'; -import ZipInstaller from '@electron-forge/installer-zip'; -import DebInstaller from '@electron-forge/installer-deb'; -import RPMInstaller from '@electron-forge/installer-rpm'; -import ExeInstaller from '@electron-forge/installer-exe'; - -import { info } from '../util/messages'; -import { downloadToFile } from '../util/download-to-file'; - -const d = debug('electron-forge:install'); - -const GITHUB_API = 'https://api.github.com'; - -class InstallerImpl extends InstallerBase { - name = 'impl'; -} - -export interface Asset { - id: string; - name: string; - size: number; - browser_download_url: string; -} - -interface Release { - tag_name: string; - prerelease: boolean; - assets: Asset[]; -} - -export interface InstallOptions { - /** - * Whether to use sensible defaults or prompt the user visually - */ - interactive?: boolean; - /** - * Whether to install prerelease versions - */ - prerelease?: boolean; - /** - * The GitHub repository to install from, in the format owner/name - */ - repo: string; - /** - * A function that must return the asset to use/install from a provided array of compatible - * GitHub assets. - */ - chooseAsset: (assets: Asset[]) => Promise | Asset; -} - -export default async ({ interactive = false, prerelease = false, repo, chooseAsset }: InstallOptions): Promise => { - asyncOra.interactive = interactive; - - if (typeof chooseAsset !== 'function') { - throw new Error('Expected chooseAsset to be a function in install call'); - } - - let latestRelease!: Release; - let possibleAssets: Asset[] = []; - - await asyncOra('Searching for Application', async (searchSpinner) => { - if (!repo || !repo.includes('/')) { - throw new Error('Invalid repository name, must be in the format owner/name'); - } - - d('searching for repo:', repo); - let releases!: Release[]; - try { - releases = await (await fetch(`${GITHUB_API}/repos/${repo}/releases`)).json(); - } catch (err) { - // Ignore error - } - - // TODO: fix up the type so that errors are handled correctly - // eslint-disable-next-line @typescript-eslint/no-explicit-any - if (!releases || (releases as any).message === 'Not Found' || !Array.isArray(releases)) { - throw new Error(`Failed to find releases for repository "${repo}". Please check the name and try again.`); - } - - if (releases.length === 0) { - throw new Error(`Repository "${repo}" has no releases`); - } - - releases = releases.filter((release) => !release.prerelease || prerelease); - - const sortedReleases = releases.sort((releaseA, releaseB) => { - let tagA = releaseA.tag_name; - if (tagA.substr(0, 1) === 'v') tagA = tagA.substr(1); - let tagB = releaseB.tag_name; - if (tagB.substr(0, 1) === 'v') tagB = tagB.substr(1); - return semver.gt(tagB, tagA) ? 1 : -1; - }); - latestRelease = sortedReleases[0]; - - searchSpinner.text = 'Searching for Releases'; - - const { assets } = latestRelease; - if (!assets || !Array.isArray(assets) || assets.length === 0) { - throw new Error('Could not find any assets for the latest release'); - } - - const installTargets: { - [key: string]: RegExp[]; - } = { - win32: [/\.exe$/], - darwin: [/OSX.*\.zip$/, /darwin.*\.zip$/, /macOS.*\.zip$/, /mac.*\.zip$/, /\.dmg$/], - linux: [/\.rpm$/, /\.deb$/], - }; - - possibleAssets = assets.filter((asset) => { - const targetSuffixes = installTargets[process.platform]; - for (const suffix of targetSuffixes) { - if (suffix.test(asset.name)) return true; - } - return false; - }); - - if (possibleAssets.length === 0) { - throw new Error(`Failed to find any installable assets for target platform: ${chalk.cyan(`${process.platform}`)}`); - } - }); - - info(interactive, `Found latest release${prerelease ? ' (including prereleases)' : ''}: ${chalk.cyan(latestRelease.tag_name)}`); - - let targetAsset = possibleAssets[0]; - if (possibleAssets.length > 1) { - targetAsset = await Promise.resolve(chooseAsset(possibleAssets)); - } - - const tmpdir = path.resolve(os.tmpdir(), 'forge-install'); - const pathSafeRepo = repo.replace(/[/\\]/g, '-'); - const filename = `${pathSafeRepo}-${latestRelease.tag_name}-${targetAsset.name}`; - - const fullFilePath = path.resolve(tmpdir, filename); - if (!(await fs.pathExists(fullFilePath)) || (await fs.stat(fullFilePath)).size !== targetAsset.size) { - await fs.mkdirs(tmpdir); - await downloadToFile(fullFilePath, targetAsset.browser_download_url); - } - - await asyncOra('Installing Application', async (installSpinner) => { - const installActions: { - [key: string]: { - [key: string]: typeof InstallerImpl; - }; - } = { - win32: { - '.exe': ExeInstaller, - }, - darwin: { - '.zip': ZipInstaller, - '.dmg': DMGInstaller, - }, - linux: { - '.deb': DebInstaller, - '.rpm': RPMInstaller, - }, - }; - - const suffixFnIdent = Object.keys(installActions[process.platform]).find((suffix) => targetAsset.name.endsWith(suffix)); - if (!suffixFnIdent) { - throw new Error(`No installer to handle "${targetAsset.name}"`); - } - const InstallerClass = installActions[process.platform][suffixFnIdent]; - const installer = new InstallerClass(); - await installer.install({ installSpinner, filePath: fullFilePath }); - }); -}; diff --git a/packages/api/core/test/slow/install_spec_slow.ts b/packages/api/core/test/slow/install_spec_slow.ts deleted file mode 100644 index 7230d00f81..0000000000 --- a/packages/api/core/test/slow/install_spec_slow.ts +++ /dev/null @@ -1,158 +0,0 @@ -import chalk from 'chalk'; -import { expect } from 'chai'; -import fetchMock, { FetchMockSandbox } from 'fetch-mock'; -import proxyquire from 'proxyquire'; -import { SinonSpy, spy, stub } from 'sinon'; - -import { InstallOptions, InstallAsset } from '../../src/api'; - -describe('install', () => { - let install: (opts: InstallOptions) => Promise; - let downloadToFileSpy: SinonSpy; - let fetch: FetchMockSandbox; - class MockInstaller { - async install() { - return undefined; - } - } - const chooseAsset = (arr: InstallAsset[]) => arr[0]; - - beforeEach(() => { - fetch = fetchMock.sandbox(); - downloadToFileSpy = stub(); - - install = proxyquire.noCallThru().load('../../src/api/install', { - 'node-fetch': fetch, - '../../src/util/download-to-file': { downloadToFile: downloadToFileSpy }, - '@electron-forge/installer-dmg': MockInstaller, - '@electron-forge/installer-zip': MockInstaller, - '@electron-forge/installer-deb': MockInstaller, - '@electron-forge/installer-rpm': MockInstaller, - '@electron-forge/installer-exe': MockInstaller, - }).default; - }); - - afterEach(() => { - fetch.restore(); - }); - - it('should throw an error when a repo name is not given', async () => { - await expect(install({} as InstallOptions)).to.eventually.be.rejected; - }); - - it('should throw an error when given an invalid repository name', async () => { - await expect(install({ chooseAsset, repo: 'foobar', interactive: false })).to.eventually.be.rejected; - }); - - it('should throw an error if the fetch fails', async () => { - fetch.get('*', { - throws: new Error('it broke'), - }); - await expect(install({ chooseAsset, repo: 'a/b', interactive: false })).to.eventually.be.rejectedWith( - 'Failed to find releases for repository "a/b". Please check the name and try again.' - ); - }); - - it("should throw an error if we can't find the repo", async () => { - fetch.get('*', { - message: 'Not Found', - }); - await expect(install({ chooseAsset, repo: 'b/c', interactive: false })).to.eventually.be.rejectedWith( - 'Failed to find releases for repository "b/c". Please check the name and try again.' - ); - }); - - it('should throw an error if the API does not return a release array', async () => { - fetch.get('*', { - lolz: 'this aint no array', - }); - await expect(install({ chooseAsset, repo: 'c/d', interactive: false })).to.eventually.be.rejectedWith( - 'Failed to find releases for repository "c/d". Please check the name and try again.' - ); - }); - - it('should throw an error if the latest release has no assets', async () => { - fetch.get('*', [{ tag_name: 'v1.0.0' }, { tag_name: '0.3.0' }, { tag_name: 'v1.2.0' }, { tag_name: '0.1.0' }]); - await expect(install({ chooseAsset, repo: 'e/f', interactive: false })).to.eventually.be.rejectedWith('Could not find any assets for the latest release'); - }); - - it('should throw an error if there are no release compatible with the current platform', async () => { - fetch.get('*', [ - { - tag_name: '1.0.0', - assets: [ - { - name: 'installer.unicorn', - }, - ], - }, - ]); - await expect(install({ chooseAsset, repo: 'f/g', interactive: false })).to.eventually.be.rejectedWith( - `Failed to find any installable assets for target platform: ${chalk.cyan(process.platform)}` - ); - }); - - const compatSuffix = process.platform === 'darwin' ? 'dmg' : process.platform === 'win32' ? 'exe' : 'deb'; - - it('should download a release if there is a single compatible asset', async () => { - fetch.get('*', [ - { - tag_name: '1.0.0', - assets: [ - { - name: `installer.${compatSuffix}`, - browser_download_url: 'fetch.it', - }, - ], - }, - ]); - expect(downloadToFileSpy.callCount).to.equal(0); - await install({ chooseAsset, repo: 'g/h', interactive: false }); - expect(downloadToFileSpy.callCount).to.equal(1); - expect(downloadToFileSpy.firstCall.args[1]).to.equal('fetch.it'); - }); - - it('should throw an error if there is more than one compatible asset with no chooseAsset method', async () => { - fetch.get('*', [ - { - tag_name: '1.0.0', - assets: [ - { - name: `installer.${compatSuffix}`, - browser_download_url: 'fetch.it', - }, - { - name: `installer2.${compatSuffix}`, - browser_download_url: 'fetch.it.2', - }, - ], - }, - ]); - await expect(install({ repo: 'h/i', interactive: false } as InstallOptions)).to.eventually.be.rejectedWith( - 'Expected chooseAsset to be a function in install call' - ); - }); - - it('should provide compatible assets to chooseAsset if more than one exists', async () => { - const chooseAssetSpy = spy(async (assets: InstallAsset[]) => assets[0]); - fetch.get('*', [ - { - tag_name: '1.0.0', - assets: [ - { - name: `installer.${compatSuffix}`, - browser_download_url: 'fetch.it', - }, - { - name: `installer2.${compatSuffix}`, - browser_download_url: 'fetch.it.2', - }, - ], - }, - ]); - expect(chooseAssetSpy.callCount).to.equal(0); - await install({ repo: 'i/j', interactive: false, chooseAsset: chooseAssetSpy }); - expect(chooseAssetSpy.callCount).to.equal(1); - expect(chooseAssetSpy.firstCall.args[0].length).to.equal(2); - }); -}); diff --git a/packages/installer/base/package.json b/packages/installer/base/package.json deleted file mode 100644 index d5265fca99..0000000000 --- a/packages/installer/base/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "@electron-forge/installer-base", - "version": "6.0.0-beta.67", - "description": "Base installer helper for Electron Forge", - "repository": "https://github.com/electron-userland/electron-forge", - "author": "Samuel Attard", - "license": "MIT", - "main": "dist/Installer.js", - "typings": "dist/Installer.d.ts", - "devDependencies": { - "chai": "^4.3.3", - "mocha": "^9.0.1" - }, - "engines": { - "node": ">= 14.17.5" - }, - "dependencies": { - "@electron-forge/async-ora": "6.0.0-beta.67" - } -} diff --git a/packages/installer/base/src/Installer.ts b/packages/installer/base/src/Installer.ts deleted file mode 100644 index d506793134..0000000000 --- a/packages/installer/base/src/Installer.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { OraImpl } from '@electron-forge/async-ora'; - -export interface InstallerOptions { - filePath: string; - installSpinner: OraImpl; -} - -export default abstract class Installer { - abstract name: string; - - __isElectronForgeInstaller!: boolean; - - constructor() { - Object.defineProperty(this, '__isElectronForgeInstaller', { - value: true, - enumerable: false, - configurable: false, - }); - } - - /** - * Installers must implement this method and install the given filePath - * when called. This method must return a promise - */ - async install(_opts: InstallerOptions): Promise { - throw new Error(`Installer ${this.name} did not implement the install method`); - } -} diff --git a/packages/installer/base/test/Installer_spec.ts b/packages/installer/base/test/Installer_spec.ts deleted file mode 100644 index 6e0742af0b..0000000000 --- a/packages/installer/base/test/Installer_spec.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { expect } from 'chai'; - -import Installer, { InstallerOptions } from '../src/Installer'; - -class InstallerImpl extends Installer { - name = 'test'; -} - -describe('Installer', () => { - it('should define __isElectronForgeInstaller', () => { - const installer = new InstallerImpl(); - expect(installer).to.have.property('__isElectronForgeInstaller', true); - expect(installer.name).to.equal('test'); - }); - - it('should throw an error when install is called', async () => { - const installer = new InstallerImpl(); - await expect(installer.install({} as InstallerOptions)).to.eventually.be.rejected; - }); -}); diff --git a/packages/installer/darwin/package.json b/packages/installer/darwin/package.json deleted file mode 100644 index ad223a3793..0000000000 --- a/packages/installer/darwin/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "@electron-forge/installer-darwin", - "version": "6.0.0-beta.67", - "description": "Base darwin file installer for Electron Forge", - "repository": "https://github.com/electron-userland/electron-forge", - "author": "Samuel Attard", - "license": "MIT", - "main": "dist/InstallerDarwin.js", - "typings": "dist/InstallerDarwin.d.ts", - "devDependencies": { - "mocha": "^9.0.1" - }, - "engines": { - "node": ">= 14.17.5" - }, - "dependencies": { - "@electron-forge/async-ora": "6.0.0-beta.67", - "@electron-forge/installer-base": "6.0.0-beta.67", - "fs-extra": "^10.0.0", - "sudo-prompt": "^9.1.1" - } -} diff --git a/packages/installer/darwin/src/InstallerDarwin.ts b/packages/installer/darwin/src/InstallerDarwin.ts deleted file mode 100644 index 987582a309..0000000000 --- a/packages/installer/darwin/src/InstallerDarwin.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { OraImpl } from '@electron-forge/async-ora'; -import InstallerBase, { InstallerOptions } from '@electron-forge/installer-base'; - -import fs from 'fs-extra'; -import path from 'path'; -import { promisify } from 'util'; -import sudo from 'sudo-prompt'; -import { exec } from 'child_process'; - -export { InstallerOptions }; - -export default abstract class InstallerDarwin extends InstallerBase { - async moveApp(appPath: string, targetApplicationPath: string, spinner: OraImpl, copyInstead = false): Promise { - let writeAccess = true; - try { - await fs.access('/Applications', fs.constants.W_OK); - } catch (err) { - writeAccess = false; - } - - if (await fs.pathExists(targetApplicationPath)) { - spinner.fail(); - throw new Error(`The application "${path.basename(targetApplicationPath)}" appears to already exist in /Applications.`); - } - - const moveCommand = `${copyInstead ? 'cp -r' : 'mv'} "${appPath}" "${targetApplicationPath}"`; - if (writeAccess) { - await promisify(exec)(moveCommand); - } else { - await (promisify(sudo.exec) as (cmd: string, opts: unknown) => Promise)(moveCommand, { - name: 'Electron Forge', - }); - } - } -} diff --git a/packages/installer/darwin/typings/ambient.d.ts b/packages/installer/darwin/typings/ambient.d.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/installer/deb/package.json b/packages/installer/deb/package.json deleted file mode 100644 index b0d00545b9..0000000000 --- a/packages/installer/deb/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@electron-forge/installer-deb", - "version": "6.0.0-beta.67", - "description": "Deb file installer for Electron Forge", - "repository": "https://github.com/electron-userland/electron-forge", - "author": "Samuel Attard", - "license": "MIT", - "main": "dist/InstallerDeb.js", - "typings": "dist/InstallerDeb.d.ts", - "devDependencies": { - "mocha": "^9.0.1" - }, - "engines": { - "node": ">= 14.17.5" - }, - "dependencies": { - "@electron-forge/installer-linux": "6.0.0-beta.67" - } -} diff --git a/packages/installer/deb/src/InstallerDeb.ts b/packages/installer/deb/src/InstallerDeb.ts deleted file mode 100644 index f5ad5912b4..0000000000 --- a/packages/installer/deb/src/InstallerDeb.ts +++ /dev/null @@ -1,11 +0,0 @@ -import InstallerLinux, { InstallerOptions } from '@electron-forge/installer-linux'; - -export default class InstallerDeb extends InstallerLinux { - name = 'deb'; - - async install({ filePath }: InstallerOptions): Promise { - await this.sudo('Debian', 'gdebi', `-n ${filePath}`); - } -} - -export { InstallerOptions }; diff --git a/packages/installer/dmg/package.json b/packages/installer/dmg/package.json deleted file mode 100644 index e33aa68832..0000000000 --- a/packages/installer/dmg/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "@electron-forge/installer-dmg", - "version": "6.0.0-beta.67", - "description": "DMG file installer for Electron Forge", - "repository": "https://github.com/electron-userland/electron-forge", - "author": "Samuel Attard", - "license": "MIT", - "main": "dist/InstallerDMG.js", - "typings": "dist/InstallerDMG.d.ts", - "devDependencies": { - "mocha": "^9.0.1" - }, - "engines": { - "node": ">= 14.17.5" - }, - "dependencies": { - "@electron-forge/installer-darwin": "6.0.0-beta.67", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "fs-extra": "^10.0.0" - } -} diff --git a/packages/installer/dmg/src/InstallerDMG.ts b/packages/installer/dmg/src/InstallerDMG.ts deleted file mode 100644 index 327422212b..0000000000 --- a/packages/installer/dmg/src/InstallerDMG.ts +++ /dev/null @@ -1,38 +0,0 @@ -import InstallerDarwin, { InstallerOptions } from '@electron-forge/installer-darwin'; - -import { spawn } from '@malept/cross-spawn-promise'; -import fs from 'fs-extra'; -import path from 'path'; - -import { getMountedImages, mountImage, unmountImage } from './util/hdiutil'; - -export default class InstallerDMG extends InstallerDarwin { - name = 'dmg'; - - async install({ filePath, installSpinner }: InstallerOptions): Promise { - const mounts = await getMountedImages(); - let targetMount = mounts.find((mount) => mount.imagePath === filePath); - - if (!targetMount) { - targetMount = await mountImage(filePath); - } - - try { - const volumePath = path.resolve('/Volumes', targetMount.mountPath); - const appName = (await fs.readdir(volumePath)).find((file) => file.endsWith('.app')); - if (!appName) { - throw new Error('Failed to find .app file in DMG'); - } - const appPath = path.resolve(volumePath, appName); - const targetApplicationPath = `/Applications/${path.basename(appPath)}`; - - await this.moveApp(appPath, targetApplicationPath, installSpinner, true); - - await spawn('open', ['-R', targetApplicationPath], { detached: true }); - } finally { - await unmountImage(targetMount); - } - } -} - -export { InstallerOptions }; diff --git a/packages/installer/dmg/src/util/hdiutil.ts b/packages/installer/dmg/src/util/hdiutil.ts deleted file mode 100644 index 803b1c6ee6..0000000000 --- a/packages/installer/dmg/src/util/hdiutil.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { spawn } from '@malept/cross-spawn-promise'; -import debug from 'debug'; - -const d = debug('electron-forge:hdiutil'); - -export interface Mount { - mountPath: string; - imagePath: string; -} - -export const getMountedImages = async (): Promise => { - const output = await spawn('hdiutil', ['info']); - const mounts = output.toString().split(/====\n/g); - mounts.shift(); - - const mountObjects = []; - - for (const mount of mounts) { - try { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const mountPath = /\/Volumes\/(.+)\n/g.exec(mount)![1]; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const imagePath = /image-path +: +(.+)\n/g.exec(mount)![1]; - mountObjects.push({ mountPath, imagePath }); - } catch { - // Ignore - } - } - - d('identified active mounts', mountObjects); - return mountObjects; -}; - -export const mountImage = async (filePath: string): Promise => { - d('mounting image:', filePath); - const output = await spawn('hdiutil', ['attach', '-noautoopen', '-nobrowse', '-noverify', filePath]); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const mountPath = /\/Volumes\/(.+)\n/g.exec(output.toString())![1]; - d('mounted at:', mountPath); - - return { - mountPath, - imagePath: filePath, - }; -}; - -export const unmountImage = async (mount: Mount): Promise => { - d('unmounting current mount:', mount); - await spawn('hdiutil', ['unmount', '-force', `/Volumes/${mount.mountPath}`]); -}; diff --git a/packages/installer/exe/package.json b/packages/installer/exe/package.json deleted file mode 100644 index eca7702913..0000000000 --- a/packages/installer/exe/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "@electron-forge/installer-exe", - "version": "6.0.0-beta.67", - "description": "EXE file installer for Electron Forge", - "repository": "https://github.com/electron-userland/electron-forge", - "author": "Samuel Attard", - "license": "MIT", - "main": "dist/InstallerExe.js", - "typings": "dist/InstallerExe.d.ts", - "devDependencies": { - "mocha": "^9.0.1" - }, - "engines": { - "node": ">= 14.17.5" - }, - "dependencies": { - "@electron-forge/installer-base": "6.0.0-beta.67", - "open": "^8.1.0" - } -} diff --git a/packages/installer/exe/src/InstallerExe.ts b/packages/installer/exe/src/InstallerExe.ts deleted file mode 100644 index 240f7b6d0c..0000000000 --- a/packages/installer/exe/src/InstallerExe.ts +++ /dev/null @@ -1,13 +0,0 @@ -import InstallerBase, { InstallerOptions } from '@electron-forge/installer-base'; - -import open from 'open'; - -export default class InstallerExe extends InstallerBase { - name = 'exe'; - - async install({ filePath }: InstallerOptions): Promise { - await open(filePath, { wait: false }); - } -} - -export { InstallerOptions }; diff --git a/packages/installer/linux/package.json b/packages/installer/linux/package.json deleted file mode 100644 index f9c6dcca65..0000000000 --- a/packages/installer/linux/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "@electron-forge/installer-linux", - "version": "6.0.0-beta.67", - "description": "Base linux file installer for Electron Forge", - "repository": "https://github.com/electron-userland/electron-forge", - "author": "Samuel Attard", - "license": "MIT", - "main": "dist/InstallerLinux.js", - "typings": "dist/InstallerLinux.d.ts", - "devDependencies": { - "mocha": "^9.0.1" - }, - "engines": { - "node": ">= 14.17.5" - }, - "dependencies": { - "@electron-forge/installer-base": "6.0.0-beta.67", - "sudo-prompt": "^9.1.1" - } -} diff --git a/packages/installer/linux/src/InstallerLinux.ts b/packages/installer/linux/src/InstallerLinux.ts deleted file mode 100644 index bee86fffbf..0000000000 --- a/packages/installer/linux/src/InstallerLinux.ts +++ /dev/null @@ -1,20 +0,0 @@ -import InstallerBase, { InstallerOptions } from '@electron-forge/installer-base'; - -import { spawnSync } from 'child_process'; -import { promisify } from 'util'; -import sudoPrompt from 'sudo-prompt'; - -export { InstallerOptions }; - -export default abstract class InstallerLinux extends InstallerBase { - which = async (type: string, prog: string, promise: () => Promise): Promise => { - if (spawnSync('which', [prog]).status === 0) { - await promise(); - } else { - throw new Error(`${prog} is required to install ${type} packages`); - } - }; - - sudo = (type: string, program: string, args: string): Promise => - this.which(type, program, () => promisify(sudoPrompt.exec)(`${program} ${args}`, { name: 'Electron Forge' })); -} diff --git a/packages/installer/linux/typings/ambient.d.ts b/packages/installer/linux/typings/ambient.d.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/installer/rpm/package.json b/packages/installer/rpm/package.json deleted file mode 100644 index 5edbd8bd66..0000000000 --- a/packages/installer/rpm/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@electron-forge/installer-rpm", - "version": "6.0.0-beta.67", - "description": "RPM file installer for Electron Forge", - "repository": "https://github.com/electron-userland/electron-forge", - "author": "Samuel Attard", - "license": "MIT", - "main": "dist/InstallerRpm.js", - "typings": "dist/InstallerRpm.d.ts", - "devDependencies": { - "mocha": "^9.0.1" - }, - "engines": { - "node": ">= 14.17.5" - }, - "dependencies": { - "@electron-forge/installer-linux": "6.0.0-beta.67" - } -} diff --git a/packages/installer/rpm/src/InstallerRpm.ts b/packages/installer/rpm/src/InstallerRpm.ts deleted file mode 100644 index 3c9b5e697c..0000000000 --- a/packages/installer/rpm/src/InstallerRpm.ts +++ /dev/null @@ -1,11 +0,0 @@ -import InstallerLinux, { InstallerOptions } from '@electron-forge/installer-linux'; - -export default class InstallerRpm extends InstallerLinux { - name = 'rpm'; - - async install({ filePath }: InstallerOptions): Promise { - await this.sudo('RPM', 'dnf', `--assumeyes --nogpgcheck install ${filePath}`); - } -} - -export { InstallerOptions }; diff --git a/packages/installer/zip/package.json b/packages/installer/zip/package.json deleted file mode 100644 index 6e9f6af24b..0000000000 --- a/packages/installer/zip/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@electron-forge/installer-zip", - "version": "6.0.0-beta.67", - "description": "ZIP file helper for Electron Forge", - "repository": "https://github.com/electron-userland/electron-forge", - "author": "Samuel Attard", - "license": "MIT", - "main": "dist/InstallerZip.js", - "typings": "dist/InstallerZip.d.ts", - "devDependencies": { - "mocha": "^9.0.1" - }, - "engines": { - "node": ">= 14.17.5" - }, - "dependencies": { - "@electron-forge/installer-darwin": "6.0.0-beta.67", - "@malept/cross-spawn-promise": "^2.0.0", - "fs-extra": "^10.0.0" - } -} diff --git a/packages/installer/zip/src/InstallerZip.ts b/packages/installer/zip/src/InstallerZip.ts deleted file mode 100644 index 76a170f6e5..0000000000 --- a/packages/installer/zip/src/InstallerZip.ts +++ /dev/null @@ -1,28 +0,0 @@ -import InstallerDarwin, { InstallerOptions } from '@electron-forge/installer-darwin'; - -import { spawn } from '@malept/cross-spawn-promise'; -import fs from 'fs-extra'; -import path from 'path'; - -export default class InstallerZip extends InstallerDarwin { - name = 'zip'; - - async install({ filePath, installSpinner }: InstallerOptions): Promise { - await spawn('unzip', ['-q', '-o', path.basename(filePath)], { - cwd: path.dirname(filePath), - }); - - const appPath = (await fs.readdir(path.dirname(filePath))) - .filter((file) => file.endsWith('.app')) - .map((file) => path.resolve(path.dirname(filePath), file)) - .sort((fA, fB) => fs.statSync(fA).ctime.getTime() - fs.statSync(fB).ctime.getTime())[0]; - - const targetApplicationPath = `/Applications/${path.basename(appPath)}`; - - await this.moveApp(appPath, targetApplicationPath, installSpinner); - - await spawn('open', ['-R', targetApplicationPath], { detached: true }); - } -} - -export { InstallerOptions }; diff --git a/yarn.lock b/yarn.lock index df1bc39b82..467b26516e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7206,7 +7206,7 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^8.0.9, open@^8.1.0: +open@^8.0.9: version "8.4.0" resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==