diff --git a/.idea/dictionaries/develar.xml b/.idea/dictionaries/develar.xml index 2d9292eed22..22e88d0493b 100644 --- a/.idea/dictionaries/develar.xml +++ b/.idea/dictionaries/develar.xml @@ -34,6 +34,7 @@ customfunction debian depcheck + devmode difflet digester disturl @@ -44,6 +45,7 @@ enoent eperm finishpage + fontconfig fseventsd github globaldots @@ -82,10 +84,15 @@ langs lcid libappindicator + libdbusmenu libexec + libgconf libgcrypt libgnome libnotify + libnss + libunity + libxss localappdata lockfile lzfse @@ -112,6 +119,7 @@ nuget nupkg nuspec + opengl osslsigncode packagejson pacman @@ -124,6 +132,7 @@ progexe promisify psmdcp + pulseaudio rcedit readpass regedit @@ -136,6 +145,7 @@ signcode signtool smprograms + snapcraft srcfolder templating testapp diff --git a/.idea/runConfigurations/linuxPackagerTest.xml b/.idea/runConfigurations/linuxPackagerTest.xml deleted file mode 100644 index dc6fad857b3..00000000000 --- a/.idea/runConfigurations/linuxPackagerTest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index efeb36b0bf6..84a47de0909 100755 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ A complete solution to package and build a ready for distribution Electron app f * Numerous target formats: * All platforms: `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir` (unpacked directory). * [macOS](https://github.com/electron-userland/electron-builder/wiki/Options#MacOptions-target): `dmg`, `pkg`, `mas`. - * [Linux](https://github.com/electron-userland/electron-builder/wiki/Options#LinuxBuildOptions-target): `AppImage`, `deb`, `rpm`, `freebsd`, `pacman`, `p5p`, `apk`. + * [Linux](https://github.com/electron-userland/electron-builder/wiki/Options#LinuxBuildOptions-target): [AppImage](http://appimage.org), [snap](http://snapcraft.io), `deb`, `rpm`, `freebsd`, `pacman`, `p5p`, `apk`. * [Windows](https://github.com/electron-userland/electron-builder/wiki/Options#WinBuildOptions-target): NSIS, Squirrel.Windows. * [Two package.json Structure](https://github.com/electron-userland/electron-builder/wiki/Two-package.json-Structure) is supported, but you are not forced to use it even if you have native production dependencies. * [Publishing artifacts](https://github.com/electron-userland/electron-builder/wiki/Publishing-Artifacts) to GitHub Releases and Bintray. diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 080113d8228..8a75f85fe19 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -1,4 +1,4 @@ -FROM buildpack-deps:xenial-curl +FROM buildpack-deps:yakkety-curl # rpm is required for FPM to build rpm package # yasm is required to build p7zip @@ -15,10 +15,9 @@ ENV USE_SYSTEM_7ZA true ENV DEBUG_COLORS true ENV FORCE_COLOR true -RUN apt-key adv --keyserver pgp.mit.edu --recv D101F7899D41F3C3 && echo "deb http://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list - -RUN apt-get update -y && \ - apt-get install --no-install-recommends -y yarn xorriso bsdtar build-essential autoconf libssl-dev icnsutils graphicsmagick gcc-multilib g++-multilib libgnome-keyring-dev lzip rpm yasm && \ +RUN apt-key adv --keyserver pgp.mit.edu --recv D101F7899D41F3C3 && apt-key adv --fetch-keys http://dl.yarnpkg.com/debian/pubkey.gpg && echo "deb http://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ +apt-get update -y && \ + apt-get install --no-install-recommends -y git snapcraft yarn xorriso bsdtar build-essential autoconf libssl-dev icnsutils graphicsmagick gcc-multilib g++-multilib libgnome-keyring-dev lzip rpm yasm && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ curl -L http://tukaani.org/xz/xz-$XZ_VERSION.tar.xz | tar -xJ && cd xz-$XZ_VERSION && ./configure && make && make install && cd .. && rm -rf xz-$XZ_VERSION && ldconfig && \ diff --git a/docker/wine/Dockerfile b/docker/wine/Dockerfile index 6967f5c7796..df96a42f3a5 100644 --- a/docker/wine/Dockerfile +++ b/docker/wine/Dockerfile @@ -2,7 +2,7 @@ FROM electronuserland/electron-builder:latest # libgnome-keyring-dev — to build keytar RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F9CB8DB0 && \ -echo "deb http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu xenial main " | tee /etc/apt/sources.list.d/wine.list && \ +echo "deb http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu yakkety main " | tee /etc/apt/sources.list.d/wine.list && \ dpkg --add-architecture i386 && \ apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF && \ echo "deb http://download.mono-project.com/repo/debian wheezy main" | tee /etc/apt/sources.list.d/mono-xamarin.list && \ diff --git a/docs/Options.md b/docs/Options.md index cdf1721dd68..3aa67303f78 100644 --- a/docs/Options.md +++ b/docs/Options.md @@ -142,7 +142,7 @@ Linux specific build options. | category | The [application category](https://specifications.freedesktop.org/menu-spec/latest/apa.html#main-category-registry). | packageCategory | The [package category](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Section). Not applicable for AppImage. | description | As [description](#AppMetadata-description) from application package.json, but allows you to specify different for Linux. -| target |

Target package type: list of AppImage, deb, rpm, freebsd, pacman, p5p, apk, 7z, zip, tar.xz, tar.lz, tar.gz, tar.bz2, dir. Defaults to AppImage.

The most effective [xz](https://en.wikipedia.org/wiki/Xz) compression format used by default.

Only deb and AppImage is tested. Feel free to file issues for rpm and other package formats.

+| target |

Target package type: list of AppImage, snap, deb, rpm, freebsd, pacman, p5p, apk, 7z, zip, tar.xz, tar.lz, tar.gz, tar.bz2, dir. Defaults to AppImage.

The most effective [xz](https://en.wikipedia.org/wiki/Xz) compression format used by default.

| synopsis | *deb-only.* The [short description](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Description). | maintainer | The maintainer. Defaults to [author](#AppMetadata-author). | vendor | The vendor. Defaults to [author](#AppMetadata-author). diff --git a/package.json b/package.json index 849b5a70759..1e083a52320 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "lint": "node ./test/lint.js", "pretest": "yarn run compile && yarn run lint", "check-deps": "node ./test/out/helpers/checkDeps.js", - "test": "node ./test/out/helpers/runTests.js", + "test": "node --trace-warnings ./test/out/helpers/runTests.js", "test-linux": "docker run --rm -ti -v ${PWD}:/project -v ${PWD##*/}-node-modules:/project/node_modules -v ~/.electron:/root/.electron electronuserland/electron-builder:wine /test.sh", "pack-updater": "cd nsis-auto-updater && yarn --production && cd ..", "semantic-release": "semantic-release pre && npm publish && semantic-release post", @@ -68,7 +68,7 @@ "cli-cursor": "^1.0.2", "cuint": "^0.2.2", "debug": "^2.3.2", - "electron-download": "2.1.2", + "electron-download-tf": "3.1.0", "electron-macos-sign": "1.0.1", "fs-extra-p": "^2.0.7", "hosted-git-info": "^2.1.5", @@ -143,13 +143,6 @@ ] ] }, - "ava": { - "verbose": true, - "cache": false, - "files": [ - "test/out/*.js" - ] - }, "jest": { "testEnvironment": "node", "testPathDirs": [ @@ -167,5 +160,8 @@ "release": { "verifyConditions": [] }, - "typings": "./out/electron-builder.d.ts" + "typings": "./out/electron-builder.d.ts", + "publishConfig": { + "tag": "next" + } } diff --git a/src/linuxPackager.ts b/src/linuxPackager.ts index e3458ba849f..4920bbf6e49 100755 --- a/src/linuxPackager.ts +++ b/src/linuxPackager.ts @@ -9,6 +9,7 @@ import AppImageTarget from "./targets/appImage" import { rename } from "fs-extra-p" import { LinuxBuildOptions } from "./options/linuxOptions" import sanitizeFileName from "sanitize-filename" +import SnapTarget from "./targets/snap" export class LinuxPackager extends PlatformPackager { readonly executableName: string @@ -49,6 +50,10 @@ export class LinuxPackager extends PlatformPackager { const targetClass: typeof AppImageTarget = require("./targets/appImage").default mapper("appimage", outDir => new targetClass(this, getHelper(), outDir)) } + else if (name === "snap") { + const targetClass: typeof SnapTarget = require("./targets/snap").default + mapper("snap", outDir => new targetClass(this, getHelper(), outDir)) + } else if (name === "deb" || name === "rpm" || name === "sh" || name === "freebsd" || name === "pacman" || name === "apk" || name === "p5p") { const targetClass: typeof FpmTarget = require("./targets/fpm").default mapper(name, outDir => new targetClass(name, this, getHelper(), outDir)) diff --git a/src/options/linuxOptions.ts b/src/options/linuxOptions.ts index 6573b3355dc..3ad910b9fa6 100644 --- a/src/options/linuxOptions.ts +++ b/src/options/linuxOptions.ts @@ -22,11 +22,9 @@ export interface LinuxBuildOptions extends PlatformSpecificBuildOptions { readonly description?: string | null /* - Target package type: list of `AppImage`, `deb`, `rpm`, `freebsd`, `pacman`, `p5p`, `apk`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`. Defaults to `AppImage`. + Target package type: list of `AppImage`, `snap`, `deb`, `rpm`, `freebsd`, `pacman`, `p5p`, `apk`, `7z`, `zip`, `tar.xz`, `tar.lz`, `tar.gz`, `tar.bz2`, `dir`. Defaults to `AppImage`. The most effective [xz](https://en.wikipedia.org/wiki/Xz) compression format used by default. - - Only `deb` and `AppImage` is tested. Feel free to file issues for `rpm` and other package formats. */ readonly target?: Array | null @@ -73,3 +71,26 @@ export interface LinuxBuildOptions extends PlatformSpecificBuildOptions { */ readonly executableName?: string | null } + +export interface SnapOptions extends LinuxBuildOptions { + /* + The type of confinement supported by the snap. Can be either `devmode` (i.e. this snap doesn’t support running under confinement) or `strict` (i.e. full confinement supported via interfaces). + */ + confinement?: "devmode" | "strict" | null + + /* + The 78 character long summary. Defaults to [productName](#AppMetadata-productName). + */ + summary?: string | null + + /* + The quality grade of the snap. It can be either `devel` (i.e. a development version of the snap, so not to be published to the “stable” or “candidate” channels) or “stable” (i.e. a stable release or release candidate, which can be released to all channels). + Defaults to `stable`. + */ + grade?: "devel" | "stable" | null + + /* + The list of features that must be supported by the core in order for this snap to install. + */ + assumes?: Array | null +} \ No newline at end of file diff --git a/src/packager/dirPackager.ts b/src/packager/dirPackager.ts index af4651e1161..71b599b60df 100644 --- a/src/packager/dirPackager.ts +++ b/src/packager/dirPackager.ts @@ -6,7 +6,7 @@ import { debug7zArgs, spawn } from "../util/util" import { path7za } from "7zip-bin" import * as path from "path" -const downloadElectron: (options: any) => Promise = BluebirdPromise.promisify(require("electron-download")) +const downloadElectron: (options: any) => Promise = BluebirdPromise.promisify(require("electron-download-tf")) function createDownloadOpts(opts: any, platform: string, arch: string, electronVersion: string) { const downloadOpts = Object.assign({ diff --git a/src/targets/LinuxTargetHelper.ts b/src/targets/LinuxTargetHelper.ts index 3605ad1864c..e05d0af87c7 100644 --- a/src/targets/LinuxTargetHelper.ts +++ b/src/targets/LinuxTargetHelper.ts @@ -63,6 +63,10 @@ export class LinuxTargetHelper { return iconPath == null ? await this.packager.getDefaultIcon("icns") : path.resolve(this.packager.projectDir, iconPath) } + getDescription(options: LinuxBuildOptions) { + return options.description || this.packager.appInfo.description + } + async computeDesktopEntry(platformSpecificBuildOptions: LinuxBuildOptions, exec?: string, extra?: { [key: string]: string; }): Promise { const appInfo = this.packager.appInfo @@ -71,7 +75,7 @@ export class LinuxTargetHelper { const desktopMeta: any = Object.assign({ Name: appInfo.productName, - Comment: platformSpecificBuildOptions.description || appInfo.description, + Comment: this.getDescription(platformSpecificBuildOptions), Exec: exec == null ? `"${installPrefix}/${productFilename}/${this.packager.executableName}"` : exec, Terminal: "false", Type: "Application", diff --git a/src/targets/appImage.ts b/src/targets/appImage.ts index bbf2ab98736..2fd559fb24a 100644 --- a/src/targets/appImage.ts +++ b/src/targets/appImage.ts @@ -32,19 +32,19 @@ export default class AppImageTarget extends TargetEx { } async build(appOutDir: string, arch: Arch): Promise { - log(`Building AppImage`) + log(`Building AppImage for arch ${Arch[arch]}`) const packager = this.packager // avoid spaces in the file name - const image = path.join(this.outDir, packager.generateName("AppImage", arch, true)) - await unlinkIfExists(image) + const resultFile = path.join(this.outDir, packager.generateName("AppImage", arch, true)) + await unlinkIfExists(resultFile) const appImagePath = await appImagePathPromise const args = [ "-joliet", "on", "-volid", "AppImage", - "-dev", image, + "-dev", resultFile, "-padding", "0", "-map", appOutDir, "/usr/bin", "-map", path.join(__dirname, "..", "..", "templates", "linux", "AppRun.sh"), "/AppRun", @@ -70,13 +70,13 @@ export default class AppImageTarget extends TargetEx { await new BluebirdPromise((resolve, reject) => { const rd = createReadStream(path.join(appImagePath, arch === Arch.ia32 ? "32" : "64", "runtime")) rd.on("error", reject) - const wr = createWriteStream(image, {flags: "r+"}) + const wr = createWriteStream(resultFile, {flags: "r+"}) wr.on("error", reject) wr.on("finish", resolve) rd.pipe(wr) }) - const fd = await open(image, "r+") + const fd = await open(resultFile, "r+") try { const magicData = new Buffer([0x41, 0x49, 0x01]) await write(fd, magicData, 0, magicData.length, 8) @@ -85,8 +85,8 @@ export default class AppImageTarget extends TargetEx { await close(fd) } - await chmod(image, "0755") + await chmod(resultFile, "0755") - packager.dispatchArtifactCreated(image, packager.generateName("AppImage", arch, true)) + packager.dispatchArtifactCreated(resultFile, packager.generateName("AppImage", arch, true)) } } \ No newline at end of file diff --git a/src/targets/fpm.ts b/src/targets/fpm.ts index f900bdbe347..5c7bcdfc248 100644 --- a/src/targets/fpm.ts +++ b/src/targets/fpm.ts @@ -99,7 +99,7 @@ export default class FpmTarget extends TargetEx { "--force", "--after-install", scripts[0], "--after-remove", scripts[1], - "--description", smarten(target === "rpm" ? options.description! : `${synopsis || ""}\n ${options.description}`), + "--description", smarten(target === "rpm" ? this.helper.getDescription(options)! : `${synopsis || ""}\n ${this.helper.getDescription(options)}`), "--maintainer", author, "--vendor", options.vendor || author, "--version", appInfo.version, diff --git a/src/targets/snap.ts b/src/targets/snap.ts new file mode 100644 index 00000000000..64cb50d1ab5 --- /dev/null +++ b/src/targets/snap.ts @@ -0,0 +1,111 @@ +import { TargetEx } from "../platformPackager" +import { Arch } from "../metadata" +import { LinuxTargetHelper } from "./LinuxTargetHelper" +import { LinuxPackager } from "../linuxPackager" +import { log } from "../util/log" +import { SnapOptions } from "../options/linuxOptions" +import { emptyDir, writeFile } from "fs-extra-p" +import * as path from "path" +import { safeDump } from "js-yaml" +import { spawn, unlinkIfExists } from "../util/util" +import { homedir } from "os" + +export default class SnapTarget extends TargetEx { + private readonly options: SnapOptions = Object.assign({}, this.packager.platformSpecificBuildOptions, (this.packager.devMetadata.build)[this.name]) + private readonly desktopEntry: Promise + + constructor(private packager: LinuxPackager, private helper: LinuxTargetHelper, private outDir: string) { + super("snap") + + // we add X-AppImage-BuildId to ensure that new desktop file will be installed + this.desktopEntry = helper.computeDesktopEntry(this.options, "AppRun") + } + + async build(appOutDir: string, arch: Arch): Promise { + log(`Building Snap for arch ${Arch[arch]}`) + + const packager = this.packager + const appInfo = packager.appInfo + const options = this.options + + const resultFile = path.join(this.outDir, packager.generateName("snap", arch, true)) + await unlinkIfExists(resultFile) + + const snap: any = {} + snap.name = appInfo.name.toLowerCase() + snap.version = appInfo.version + snap.summary = options.summary || appInfo.productName + snap.description = this.helper.getDescription(options) + snap.confinement = options.confinement || "strict" + snap.grade = options.grade || "stable" + + if (options.assumes != null) { + if (!Array.isArray(options.assumes)) { + throw new Error("snap.assumes must be an array of strings") + } + snap.assumes = options.assumes + } + + const snapDir = `${appOutDir}-snap` + + snap.apps = {} + snap.apps[snap.name] = { + command: `desktop-launch $SNAP/${packager.executableName}`, + plugs: [ + "browser-support", "network", "unity7", "gsettings", "pulseaudio", "opengl", + ] + } + + const isUseDocker = process.platform !== "linux" + snap.parts = { + "deps": { + plugin: "nil", + "stage-packages": ["libgconf-2-4", "libnss3", "libxss1", "fontconfig-config"], + }, + "desktop-integration": { + plugin: "nil", + "stage-packages": ["libappindicator1", "libdbusmenu-glib4", "libnotify4", "libunity9"], + }, + app: { + plugin: "dump", + source: isUseDocker ? `/out/${path.basename(snapDir)}` : appOutDir, + filesets: { + app: [`${appOutDir}/*`] + }, + after: ["desktop-glib-only"] + } + } + + const snapcraft = path.join(snapDir, "snapcraft.yaml") + await emptyDir(snapDir) + await writeFile(snapcraft, safeDump(snap)) + +// await writeFile(path.join(snapDir, "wrapper"), ` +// #!/bin/bash +// unset XDG_CONFIG_DIRS +// exec $SNAP/${packager.executableName} +// `) + + // const args = ["snapcraft", path.relative(snapDir)] + // snap /out/${path.basename(snapDir)} --output /out/${path.basename(resultFile)} + if (isUseDocker) { + await spawn("docker", ["run", "--rm", + "-v", `${packager.info.projectDir}:/project`, + "-v", `${homedir()}/.electron:/root/.electron`, + // dist dir can be outside of project dir + "-v", `${this.outDir}:/out`, + "-w", `/out/${path.basename(snapDir)}`, + "electronuserland/electron-builder:latest", + "/bin/bash", "-c", `env && snapcraft snap`], { + cwd: packager.info.projectDir, + }) + } + else { + await spawn("snapcraft", ["snap"], { + cwd: snapDir, + }) + } + + packager.dispatchArtifactCreated(resultFile, packager.generateName("snap", arch, true)) + } +} \ No newline at end of file diff --git a/src/util/util.ts b/src/util/util.ts index 72e3728b6e8..a5ff44f4539 100644 --- a/src/util/util.ts +++ b/src/util/util.ts @@ -78,12 +78,13 @@ export function doSpawn(command: string, args: Array, options?: SpawnOpt } if (debug.enabled) { - debug(`Spawning ${command} ${removePassword(args.join(" "))}`) + const argsString = args.join(" ") + debug(`Spawning ${command} ${command === "docker" ? argsString : removePassword(argsString)}`) } return _spawn(command, args, options) } -export function spawn(command: string, args?: Array | null, options?: SpawnOptions): BluebirdPromise { +export function spawn(command: string, args?: Array | null, options?: SpawnOptions): Promise { return new BluebirdPromise((resolve, reject) => { handleProcess("close", doSpawn(command, args || [], options), command, resolve, reject) }) diff --git a/test/jestSetup.js b/test/jestSetup.js index b859caa0de4..8e277191b4b 100644 --- a/test/jestSetup.js +++ b/test/jestSetup.js @@ -8,7 +8,7 @@ const isCi = (process.env.CI || "").toLowerCase() === "true" // Squirrel.Windows msi is very slow jasmine.DEFAULT_TIMEOUT_INTERVAL = (isWindows ? 10 : 10) * 1000 * 60 -if (!isWindows || isCi) { +if (process.env.RUN_IN_BAND !== "true" && (!isWindows || isCi)) { //noinspection JSUnresolvedVariable it = it.concurrent //noinspection JSUnresolvedVariable diff --git a/test/src/helpers/runTests.ts b/test/src/helpers/runTests.ts index 9dc6326c160..7290465861e 100755 --- a/test/src/helpers/runTests.ts +++ b/test/src/helpers/runTests.ts @@ -8,7 +8,7 @@ import { TEST_DIR, ELECTRON_VERSION } from "./config" const util = require("../../../out/util/util") const isEmptyOrSpaces = util.isEmptyOrSpaces -const downloadElectron: (options: any) => Promise = BluebirdPromise.promisify(require("electron-download")) +const downloadElectron: (options: any) => Promise = BluebirdPromise.promisify(require("electron-download-tf")) async function main() { const testDir = TEST_DIR diff --git a/test/src/linuxPackagerTest.ts b/test/src/linuxPackagerTest.ts index fe908f4aeb8..10216dcc8ca 100755 --- a/test/src/linuxPackagerTest.ts +++ b/test/src/linuxPackagerTest.ts @@ -10,6 +10,8 @@ test.ifNotWindows("arm deb", app({targets: Platform.LINUX.createTarget("deb", Ar test.ifDevOrLinuxCi("AppImage", app({targets: Platform.LINUX.createTarget()})) +test.ifNotCi("snap", app({targets: Platform.LINUX.createTarget("snap")})) + test.ifDevOrLinuxCi("AppImage - default icon", app({ targets: Platform.LINUX.createTarget("appimage"), devMetadata: { diff --git a/yarn.lock b/yarn.lock index 1a15a587ac8..68e10f35697 100644 --- a/yarn.lock +++ b/yarn.lock @@ -517,8 +517,8 @@ babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0: to-fast-properties "^1.0.1" babylon@^6.1.21, babylon@^6.11.0, babylon@^6.13.0: - version "6.14.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.0.tgz#c8ba4b69b544b2cd8f3fb96b06614660a49b7128" + version "6.14.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" balanced-match@^0.4.1: version "0.4.2" @@ -1142,18 +1142,18 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" -electron-download@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-2.1.2.tgz#913b35b07a90ff1b644834e9bf03f5f1d6f24f64" +electron-download-tf@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/electron-download-tf/-/electron-download-tf-3.1.0.tgz#c6d62c0e0a4c63b67295f57b6b66514c13b8ed8d" dependencies: - debug "^2.2.0" - home-path "^1.0.1" + debug "^2.3.2" + fs-extra "^1.0.0" minimist "^1.2.0" - mkdirp "^0.5.0" - mv "^2.0.3" - nugget "^1.5.1" - path-exists "^1.0.0" - rc "^1.1.2" + nugget "^2.0.1" + path-exists "^3.0.0" + rc "^1.1.6" + semver "^5.3.0" + sumchecker "^1.2.0" electron-macos-sign@1.0.1: version "1.0.1" @@ -1189,6 +1189,10 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + escape-string-regexp@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -1375,6 +1379,14 @@ fs-extra-tf@^1.0.0: jsonfile "^2.4.0" klaw "^1.3.1" +fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1624,10 +1636,6 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -home-path@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.3.tgz#9ece59fec3f032e6d10b5434fee264df4c2de32f" - hosted-git-info@^2.1.4, hosted-git-info@^2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" @@ -2188,7 +2196,7 @@ json8@^0.9.2: version "0.9.2" resolved "https://registry.yarnpkg.com/json8/-/json8-0.9.2.tgz#dced62a24c8ed457702d45c71068081925c3011f" -jsonfile@^2.4.0: +jsonfile@^2.1.0, jsonfile@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" optionalDependencies: @@ -2220,7 +2228,7 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.0.2" -klaw@^1.3.1: +klaw@^1.0.0, klaw@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" optionalDependencies: @@ -2531,7 +2539,7 @@ minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -2558,22 +2566,10 @@ multimatch@^2.1.0: arrify "^1.0.0" minimatch "^3.0.0" -mv@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" - dependencies: - mkdirp "~0.5.1" - ncp "~2.0.0" - rimraf "~2.4.0" - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" -ncp@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - node-emoji@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.4.1.tgz#c9fa0cf91094335bcb967a6f42b2305c15af2ebc" @@ -2673,16 +2669,16 @@ npm-registry-client@^7.3.0: gauge "~2.7.1" set-blocking "~2.0.0" -nugget@^1.5.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/nugget/-/nugget-1.6.2.tgz#88ca6e03ba5706a99173f5da0902593d6bcae107" +nugget@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" dependencies: debug "^2.1.3" minimist "^1.1.0" pretty-bytes "^1.0.2" progress-stream "^1.1.0" request "^2.45.0" - single-line-log "^0.4.1" + single-line-log "^1.1.2" throttleit "0.0.2" number-is-nan@^1.0.0: @@ -2809,16 +2805,16 @@ parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" -path-exists@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" - path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" dependencies: pinkie-promise "^2.0.0" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -2951,7 +2947,7 @@ randomatic@^1.1.3: is-number "^2.0.2" kind-of "^3.0.2" -rc@^1.0.1, rc@^1.1.2, rc@^1.1.6: +rc@^1.0.1, rc@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" dependencies: @@ -3158,7 +3154,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.4.0: +rimraf@^2.4.3, rimraf@^2.4.4: version "2.4.5" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" dependencies: @@ -3229,9 +3225,11 @@ signal-exit@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" -single-line-log@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-0.4.1.tgz#87a55649f749d783ec0dcd804e8140d9873c7cee" +single-line-log@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" + dependencies: + string-width "^1.0.1" slash@^1.0.0: version "1.0.0" @@ -3376,6 +3374,13 @@ strip-json-comments@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" +sumchecker@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-1.2.0.tgz#8c79282f6b5d74e7fbcfb49505e50d096c63f38d" + dependencies: + debug "^2.2.0" + es6-promise "^3.2.1" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"