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/.idea/runConfigurations/winPackagerTest.xml b/.idea/runConfigurations/winPackagerTest.xml deleted file mode 100644 index cdf93413e9a..00000000000 --- a/.idea/runConfigurations/winPackagerTest.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 878fad4194e..b8dd1a06788 100755 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,13 @@ -osx_image: xcode7.3 - matrix: include: - os: osx - env: TEST_FILES=BuildTest,linuxPackagerTest,globTest NODE_VERSION=7 PUBLISH_TO_NPM=true + env: TEST_FILES=BuildTest,extraMetadataTest,globTest,filesTest,ignoreTest,linux.* NODE_VERSION=7 PUBLISH_TO_NPM=true - os: osx - env: TEST_FILES=winPackagerTest,nsisTest,macPackagerTest NODE_VERSION=6 + env: TEST_FILES=windows.*,mac.* NODE_VERSION=7 - os: osx - env: TEST_FILES=macPackagerTest,CodeSignTest NODE_VERSION=6 + env: TEST_FILES=mac.* NODE_VERSION=6 language: c @@ -17,6 +15,7 @@ cache: directories: - node_modules - $HOME/.electron + - /tmp/jest-electron-builder-tests before_install: - curl -L https://dl.bintray.com/develar/bin/7za -o /tmp/7za diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dc79f4ece0c..91f89ff9794 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,7 +12,7 @@ This includes: - log of the terminal output - node version - npm version -- on which system do you want to create installers (MacOS, Windows or Linux) +- on which system do you want to create installers (macOS, Windows or Linux) # Pull Requests To check that your contributions match the project coding style make sure `npm test` passes. diff --git a/README.md b/README.md index eeef43c008f..84a47de0909 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # electron-builder [![npm version](https://img.shields.io/npm/v/electron-builder.svg)](https://npmjs.org/package/electron-builder) [![donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W6V79R2RGCCHL) -A complete solution to package and build a ready for distribution Electron app for MacOS, Windows and Linux with “auto update” support out of the box. +A complete solution to package and build a ready for distribution Electron app for macOS, Windows and Linux with “auto update” support out of the box. * NPM packages management: * [Native application dependencies](http://electron.atom.io/docs/latest/tutorial/using-native-node-modules/) compilation. @@ -9,8 +9,8 @@ A complete solution to package and build a ready for distribution Electron app f * [Build version management](https://github.com/electron-userland/electron-builder/wiki/Options#build-version-management). * 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`. + * [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](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/appveyor.yml b/appveyor.yml index 903913fb726..f4f5064fc71 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,6 +5,9 @@ cache: - node_modules - '%USERPROFILE%\.electron' +environment: + RUN_IN_BAND: true + install: - ps: Install-Product node 6 x64 # unknown yarn error diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 080113d8228..1eb54385db5 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 --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/Multi Platform Build.md b/docs/Multi Platform Build.md index 0b60619939b..be04daa33ec 100755 --- a/docs/Multi Platform Build.md +++ b/docs/Multi Platform Build.md @@ -20,17 +20,17 @@ build -mwl Build performed in parallel, so, it is highly recommended to not use npm task per platform (e.g. `npm run dist:mac && npm run dist:win32`), but specify multiple platforms/targets in one build command. You don't need to clean dist output before build — output directory is cleaned automatically. -## MacOS +## macOS Use [brew](http://brew.sh) to install required packages. -### To build app for Windows on MacOS: +### To build app for Windows on macOS: ``` brew install wine --without-x11 brew install mono ``` -### To build app for Linux on MacOS: +### To build app for Linux on macOS: ``` brew install gnu-tar graphicsmagick xz ``` diff --git a/docs/Options.md b/docs/Options.md index cdf1721dd68..94cd28513dd 100644 --- a/docs/Options.md +++ b/docs/Options.md @@ -88,6 +88,7 @@ Don't customize paths to background and icon, — just follow conventions. | npmArgs | Additional command line arguments to use when installing app native deps. Defaults to `null`. | nodeGypRebuild | Whether to execute `node-gyp rebuild` before starting to package the app. Defaults to `false`. | electronDist | The path to custom Electron build (e.g. `~/electron/out/R`). Only macOS supported, file issue if need for Linux or Windows. +| electronDownload | The [electron-download](https://github.com/electron-userland/electron-download#usage) options. | publish | See [.build.publish](#PublishConfiguration). @@ -142,7 +143,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 9195297aa9e..3aedf91f2ea 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ ], "bin": { "build": "./out/build-cli.js", - "cleanup": "./out/cleanup.js", "install-app-deps": "./out/install-app-deps.js", "node-gyp-rebuild": "./out/node-gyp-rebuild.js" }, @@ -68,8 +67,8 @@ "cli-cursor": "^1.0.2", "cuint": "^0.2.2", "debug": "^2.3.2", - "electron-download": "2.1.2", - "electron-macos-sign": "1.0.1", + "electron-download-tf": "3.1.0", + "electron-macos-sign": "^1.3.4", "fs-extra-p": "^2.0.7", "hosted-git-info": "^2.1.5", "ini": "^1.3.4", @@ -97,24 +96,24 @@ "devDependencies": { "@develar/semantic-release": "^6.3.21", "@types/ini": "^1.3.29", + "@types/jest": "^16.0.0", "@types/js-yaml": "^3.5.28", "@types/source-map-support": "^0.2.28", - "ava-tf": "^0.16.4", "babel-plugin-array-includes": "^2.0.3", "babel-plugin-transform-async-to-module-method": "^6.16.0", - "babel-plugin-transform-es2015-destructuring": "^6.18.0", + "babel-plugin-transform-es2015-destructuring": "^6.19.0", "babel-plugin-transform-es2015-parameters": "^6.18.0", "babel-plugin-transform-es2015-spread": "^6.8.0", "babel-plugin-transform-inline-imports-commonjs": "^1.2.0", - "babel-register": "^6.18.0", "decompress-zip": "^0.3.0", - "depcheck": "^0.6.4", + "depcheck": "^0.6.5", "diff": "^3.0.1", "husky": "^0.11.9", + "jest-cli": "^17.0.3", "json8": "^0.9.2", "path-sort": "^0.1.0", "ts-babel": "^1.1.4", - "tslint": "^4.0.0-dev.1", + "tslint": "4.0.0-dev.1", "typescript": "^2.1.1", "validate-commit-msg": "^2.8.2", "whitespace": "^2.1.0" @@ -142,15 +141,25 @@ ] ] }, - "ava": { - "verbose": true, - "cache": false, - "files": [ - "test/out/*.js" - ] + "jest": { + "testEnvironment": "node", + "testPathDirs": [ + "test/out" + ], + "testPathIgnorePatterns": [ + "/helpers/" + ], + "testRegex": "\\.js$", + "modulePaths": [ + "" + ], + "setupTestFrameworkScriptFile": "test/jestSetup.js" }, "release": { "verifyConditions": [] }, - "typings": "./out/electron-builder.d.ts" + "typings": "./out/electron-builder.d.ts", + "publishConfig": { + "tag": "next" + } } diff --git a/src/cleanup.ts b/src/cleanup.ts deleted file mode 100644 index 1ed6c3b0dfe..00000000000 --- a/src/cleanup.ts +++ /dev/null @@ -1,59 +0,0 @@ -#! /usr/bin/env node - -import { readdir, lstat, Stats, remove, readFile } from "fs-extra-p" -import BluebirdPromise from "bluebird-lst-c" -import * as path from "path" -import { getCacheDirectory } from "./util/util" - -async function main() { - const dir = path.join(getCacheDirectory(), "fpm") - let items: string[] | null = null - try { - items = await readdir(dir) - } - catch (e) { - if (e.code !== "ENOENT") { - throw e - } - return - } - - await BluebirdPromise.map(items, <(item: string) => BluebirdPromise> (async (it) => { - let stat: Stats | null = null - const itemPath = path.join(dir, it) - try { - stat = await lstat(itemPath) - } - catch (e) { - if (e.code !== "ENOENT") { - throw e - } - return - } - - if (!stat!.isDirectory() || !(await isRecentlyUsed(itemPath))) { - console.log(`remove unused ${itemPath}`) - await remove(itemPath) - } - })) - - await BluebirdPromise.map(items, remove) -} - -async function isRecentlyUsed(dir: string) { - try { - const lastUsed = parseInt(await readFile(path.join(dir, ".lastUsed"), "utf8"), 10) - if (!isNaN(lastUsed) && (Date.now() - lastUsed) < (3600000 * 2)) { - return true - } - } - catch (e) { - if (e.code !== "ENOENT") { - throw e - } - } - - return false -} - -main() \ No newline at end of file diff --git a/src/cliOptions.ts b/src/cliOptions.ts index 99f748179e1..8a5226de300 100644 --- a/src/cliOptions.ts +++ b/src/cliOptions.ts @@ -8,14 +8,14 @@ const deprecated = "Deprecated:" export function createYargs(): any { //noinspection ReservedWordAsName return yargs - .example("build -mwl", "build for MacOS, Windows and Linux") + .example("build -mwl", "build for macOS, Windows and Linux") .example("build --linux deb tar.xz", "build deb and tar.xz for Linux") .example("build --win --ia32", "build for Windows ia32") .example("build --em.foo=bar", "set application package.json property `foo` to `bar`") .option("mac", { group: buildGroup, alias: ["m", "o", "macos"], - describe: `Build for MacOS, accepts target list (see ${underline("https://goo.gl/HAnnq8")}).`, + describe: `Build for macOS, accepts target list (see ${underline("https://goo.gl/HAnnq8")}).`, type: "array", }) .option("linux", { diff --git a/src/linuxPackager.ts b/src/linuxPackager.ts index e3458ba849f..b20f625e0d9 100755 --- a/src/linuxPackager.ts +++ b/src/linuxPackager.ts @@ -1,14 +1,14 @@ import * as path from "path" -import BluebirdPromise from "bluebird-lst-c" -import { PlatformPackager, BuildInfo, Target, TargetEx } from "./platformPackager" -import { Platform, Arch } from "./metadata" +import { PlatformPackager, BuildInfo, Target } from "./platformPackager" +import { Platform } from "./metadata" import FpmTarget from "./targets/fpm" -import { createCommonTarget, DEFAULT_TARGET } from "./targets/targetFactory" +import { createCommonTarget, DEFAULT_TARGET, DIR_TARGET } from "./targets/targetFactory" import { LinuxTargetHelper } from "./targets/LinuxTargetHelper" 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 @@ -17,7 +17,7 @@ export class LinuxPackager extends PlatformPackager { super(info) let executableName = this.platformSpecificBuildOptions.executableName - this.executableName = sanitizeFileName(executableName == null ? this.appInfo.name : executableName) + this.executableName = sanitizeFileName(executableName == null ? this.appInfo.name : executableName).toLowerCase() } normalizePlatformSpecificBuildOptions(options: LinuxBuildOptions | n): LinuxBuildOptions { @@ -33,7 +33,7 @@ export class LinuxPackager extends PlatformPackager { createTargets(targets: Array, mapper: (name: string, factory: (outDir: string) => Target) => void, cleanupTasks: Array<() => Promise>): void { for (let name of targets) { - if (name === "dir") { + if (name === DIR_TARGET) { continue } @@ -49,12 +49,16 @@ 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)) } else { - mapper(name, () => createCommonTarget(name)) + mapper(name, outDir => createCommonTarget(name, outDir, this)) } } } @@ -63,36 +67,7 @@ export class LinuxPackager extends PlatformPackager { return Platform.LINUX } - async pack(outDir: string, arch: Arch, targets: Array, postAsyncTasks: Array>): Promise { - const appOutDir = this.computeAppOutDir(outDir, arch) - await this.doPack(outDir, appOutDir, this.platform.nodeName, arch, this.platformSpecificBuildOptions) - postAsyncTasks.push(this.packageInDistributableFormat(outDir, appOutDir, arch, targets)) - } - protected postInitApp(appOutDir: string): Promise { return rename(path.join(appOutDir, "electron"), path.join(appOutDir, this.executableName)) } - - protected async packageInDistributableFormat(outDir: string, appOutDir: string, arch: Arch, targets: Array): Promise { - // todo fix fpm - if run in parallel, get strange tar errors - // https://github.com/electron-userland/electron-builder/issues/460 - // for some reasons in parallel to fmp we cannot use tar - for (let t of targets) { - if (t instanceof TargetEx && !t.isAsyncSupported) { - await t.build(appOutDir, arch) - } - } - - await BluebirdPromise.map(targets, it => { - const target = it.name - if (target === "zip" || target === "7z" || target.startsWith("tar.")) { - const destination = path.join(outDir, this.generateName(target, arch, true)) - return this.archiveApp(target, appOutDir, destination) - .then(() => this.dispatchArtifactCreated(destination)) - } - else { - return it instanceof TargetEx && it.isAsyncSupported ? it.build(appOutDir, arch) : null - } - }) - } } \ No newline at end of file diff --git a/src/macPackager.ts b/src/macPackager.ts index eb86c01ff49..83c687d3fd7 100644 --- a/src/macPackager.ts +++ b/src/macPackager.ts @@ -1,14 +1,14 @@ -import { PlatformPackager, BuildInfo, Target, TargetEx } from "./platformPackager" +import { PlatformPackager, BuildInfo, Target } from "./platformPackager" import { Platform, Arch } from "./metadata" import { MasBuildOptions, MacOptions } from "./options/macOptions" import * as path from "path" import BluebirdPromise from "bluebird-lst-c" -import { log, warn, task } from "./util/log" +import { warn, task } from "./util/log" import { createKeychain, CodeSigningInfo, findIdentity, appleCertificatePrefixes } from "./codeSign" import { deepAssign } from "./util/deepAssign" import { signAsync, SignOptions } from "electron-macos-sign" import { DmgTarget } from "./targets/dmg" -import { createCommonTarget, DEFAULT_TARGET, DIR_TARGET } from "./targets/targetFactory" +import { createCommonTarget, DEFAULT_TARGET, DIR_TARGET, NoOpTarget } from "./targets/targetFactory" import { AppInfo } from "./appInfo" import { PkgTarget, prepareProductBuildArgs } from "./targets/pkg" import { exec } from "./util/util" @@ -39,7 +39,7 @@ export default class MacPackager extends PlatformPackager { return iconPath == null ? await this.getDefaultIcon("icns") : path.resolve(this.projectDir, iconPath) } - createTargets(targets: Array, mapper: (name: string, factory: () => Target) => void, cleanupTasks: Array<() => Promise>): void { + createTargets(targets: Array, mapper: (name: string, factory: (outDir: string) => Target) => void, cleanupTasks: Array<() => Promise>): void { for (let name of targets) { switch (name) { case DIR_TARGET: @@ -47,7 +47,7 @@ export default class MacPackager extends PlatformPackager { case DEFAULT_TARGET: mapper("dmg", () => new DmgTarget(this)) - mapper("zip", () => new Target("zip")) + mapper("zip", outDir => createCommonTarget("zip", outDir, this)) break case "dmg": @@ -59,7 +59,7 @@ export default class MacPackager extends PlatformPackager { break default: - mapper(name, () => name === "mas" ? new Target(name) : createCommonTarget(name)) + mapper(name, outDir => name === "mas" ? new NoOpTarget(name) : createCommonTarget(name, outDir, this)) break } } @@ -78,7 +78,7 @@ export default class MacPackager extends PlatformPackager { const appOutDir = this.computeAppOutDir(outDir, arch) nonMasPromise = this.doPack(outDir, appOutDir, this.platform.nodeName, arch, this.platformSpecificBuildOptions) .then(() => this.sign(appOutDir, null)) - .then(() => this.packageInDistributableFormat(appOutDir, targets, postAsyncTasks)) + .then(() => this.packageInDistributableFormat(appOutDir, Arch.x64, targets, postAsyncTasks)) } if (hasMas) { @@ -199,20 +199,4 @@ export default class MacPackager extends PlatformPackager { args.push(outFile) return exec("productbuild", args) } - - protected packageInDistributableFormat(appOutDir: string, targets: Array, promises: Array>): void { - for (let t of targets) { - const target = t.name - if (t instanceof TargetEx) { - promises.push(t.build(appOutDir, Arch.x64)) - } - else if (target !== "mas") { - log(`Building macOS ${target}`) - // we use app name here - see https://github.com/electron-userland/electron-builder/pull/204 - const outFile = path.join(appOutDir, this.generateName2(target, "mac", false)) - promises.push(this.archiveApp(target, appOutDir, outFile) - .then(() => this.dispatchArtifactCreated(outFile, this.generateName2(target, "mac", true)))) - } - } - } } \ No newline at end of file diff --git a/src/metadata.ts b/src/metadata.ts index bff15156c9e..cc67e49cd91 100755 --- a/src/metadata.ts +++ b/src/metadata.ts @@ -219,11 +219,16 @@ export interface BuildMetadata { */ readonly nodeGypRebuild?: boolean - /** + /* The path to custom Electron build (e.g. `~/electron/out/R`). Only macOS supported, file issue if need for Linux or Windows. */ readonly electronDist?: string + /* + The [electron-download](https://github.com/electron-userland/electron-download#usage) options. + */ + readonly electronDownload?: any + readonly icon?: string | null // deprecated 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.ts b/src/packager.ts index 16fee034dfa..7710a96371e 100644 --- a/src/packager.ts +++ b/src/packager.ts @@ -109,7 +109,7 @@ export class Packager implements BuildInfo { let checkWine = this.options.platformPackagerFactory == null for (let [platform, archToType] of this.options.targets!) { if (platform === Platform.MAC && process.platform === Platform.WINDOWS.nodeName) { - throw new Error("Build for MacOS is supported only on MacOS, please see https://github.com/electron-userland/electron-builder/wiki/Multi-Platform-Build") + throw new Error("Build for macOS is supported only on macOS, please see https://github.com/electron-userland/electron-builder/wiki/Multi-Platform-Build") } let wineCheck: Promise | null = null diff --git a/src/packager/dirPackager.ts b/src/packager/dirPackager.ts index af4651e1161..a7e1423524b 100644 --- a/src/packager/dirPackager.ts +++ b/src/packager/dirPackager.ts @@ -6,13 +6,17 @@ 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) { + if (opts.download != null) { + warn(`"build.download is deprecated — please use build.electronDownload instead`) + } + const downloadOpts = Object.assign({ cache: opts.cache, strictSSL: opts["strict-ssl"] - }, opts.download) + }, opts.electronDownload || opts.download) subOptionWarning(downloadOpts, "download", "platform", platform) subOptionWarning(downloadOpts, "download", "arch", arch) @@ -27,7 +31,7 @@ function subOptionWarning (properties: any, optionName: any, parameter: any, val properties[parameter] = value } -export async function pack(packager: PlatformPackager, out: string, platform: string, arch: string, electronVersion: string, initializeApp: () => Promise) { +export async function unpackElectron(packager: PlatformPackager, out: string, platform: string, arch: string, electronVersion: string) { const electronDist = packager.devMetadata.build.electronDist if (electronDist == null) { const zipPath = (await BluebirdPromise.all([ @@ -50,11 +54,4 @@ export async function pack(packager: PlatformPackager, out: string, platfor chmod(path.join(out, "resources"), "0755") ]) } - - if (platform === "darwin" || platform === "mas") { - await(require("./mac")).createApp(packager, out, initializeApp) - } - else { - await initializeApp() - } } \ No newline at end of file diff --git a/src/packager/mac.ts b/src/packager/mac.ts index 5c389598b46..47c5b82d40e 100644 --- a/src/packager/mac.ts +++ b/src/packager/mac.ts @@ -24,7 +24,7 @@ function filterCFBundleIdentifier(identifier: string) { return identifier.replace(/ /g, "-").replace(/[^a-zA-Z0-9.-]/g, "") } -export async function createApp(packager: PlatformPackager, appOutDir: string, initializeApp: () => Promise) { +export async function createApp(packager: PlatformPackager, appOutDir: string) { const appInfo = packager.appInfo const appFilename = appInfo.productFilename @@ -37,12 +37,7 @@ export async function createApp(packager: PlatformPackager, appOutDir: stri const helperNPPlistFilename = path.join(frameworksPath, "Electron Helper NP.app", "Contents", "Info.plist") const buildMetadata = packager.devMetadata.build! - - const result = await BluebirdPromise.all([ - initializeApp(), - BluebirdPromise.map([appPlistFilename, helperPlistFilename, helperEHPlistFilename, helperNPPlistFilename, (buildMetadata)["extend-info"]], it => it == null ? it : readFile(it, "utf8")) - ]) - const fileContents: Array = result[1]! + const fileContents: Array = await BluebirdPromise.map([appPlistFilename, helperPlistFilename, helperEHPlistFilename, helperNPPlistFilename, (buildMetadata)["extend-info"]], it => it == null ? it : readFile(it, "utf8")) const appPlist = parsePlist(fileContents[0]) const helperPlist = parsePlist(fileContents[1]) const helperEHPlist = parsePlist(fileContents[2]) diff --git a/src/platformPackager.ts b/src/platformPackager.ts index bb0c847bce9..9585e907050 100644 --- a/src/platformPackager.ts +++ b/src/platformPackager.ts @@ -2,17 +2,16 @@ import { AppMetadata, DevMetadata, Platform, PlatformSpecificBuildOptions, Arch, import EventEmitter = NodeJS.EventEmitter import BluebirdPromise from "bluebird-lst-c" import * as path from "path" -import { readdir, remove } from "fs-extra-p" +import { readdir, remove, rename } from "fs-extra-p" import { statOrNull, use, unlinkIfExists, isEmptyOrSpaces, asArray, debug } from "./util/util" import { Packager } from "./packager" import { AsarOptions } from "asar-electron-builder" -import { archiveApp } from "./targets/archive" import { Minimatch } from "minimatch" import { checkFileInArchive, createAsarArchive } from "./asarUtil" import { warn, log } from "./util/log" import { AppInfo } from "./appInfo" import { copyFiltered } from "./util/filter" -import { pack } from "./packager/dirPackager" +import { unpackElectron } from "./packager/dirPackager" import { TmpDir } from "./util/tmp" import { FileMatchOptions, FileMatcher, FilePattern, deprecatedUserIgnoreFilter } from "./fileMatcher" import { BuildOptions } from "./builder" @@ -75,23 +74,17 @@ export interface BuildInfo { readonly tempDirManager: TmpDir } -export class Target { - constructor(public readonly name: string) { +export abstract class Target { + constructor(public readonly name: string, public readonly isAsyncSupported: boolean = true) { } + abstract build(appOutDir: string, arch: Arch): Promise + finishBuild(): Promise { return BluebirdPromise.resolve() } } -export abstract class TargetEx extends Target { - constructor(name: string, public readonly isAsyncSupported: boolean = true) { - super(name) - } - - abstract build(appOutDir: string, arch: Arch): Promise -} - export abstract class PlatformPackager { readonly options: PackagerOptions @@ -167,7 +160,16 @@ export abstract class PlatformPackager }) } - abstract pack(outDir: string, arch: Arch, targets: Array, postAsyncTasks: Array>): Promise + async pack(outDir: string, arch: Arch, targets: Array, postAsyncTasks: Array>): Promise { + const appOutDir = this.computeAppOutDir(outDir, arch) + await this.doPack(outDir, appOutDir, this.platform.nodeName, arch, this.platformSpecificBuildOptions) + this.packageInDistributableFormat(appOutDir, arch, targets, postAsyncTasks) + } + + protected packageInDistributableFormat(appOutDir: string, arch: Arch, targets: Array, postAsyncTasks: Array>): void { + postAsyncTasks.push(BluebirdPromise.map(targets, it => it.isAsyncSupported ? it.build(appOutDir, arch) : null) + .then(() => BluebirdPromise.each(targets, it => it.isAsyncSupported ? null : it.build(appOutDir, arch)))) + } private getExtraFileMatchers(isResources: boolean, appOutDir: string, fileMatchOptions: FileMatchOptions, customBuildOptions: DC): Array | null { const base = isResources ? this.getResourcesDir(appOutDir) : (this.platform === Platform.MAC ? path.join(appOutDir, `${this.appInfo.productFilename}.app`, "Contents") : appOutDir) @@ -187,81 +189,89 @@ export abstract class PlatformPackager const resourcesPath = this.platform === Platform.MAC ? path.join(appOutDir, "Electron.app", "Contents", "Resources") : path.join(appOutDir, "resources") log(`Packaging for ${platformName} ${Arch[arch]} using electron ${this.info.electronVersion} to ${path.relative(this.projectDir, appOutDir)}`) - await pack(this, appOutDir, platformName, Arch[arch], this.info.electronVersion, async () => { - const appDir = this.info.appDir - const ignoreFiles = new Set([path.resolve(appDir, outDir), path.resolve(appDir, this.buildResourcesDir)]) - // prune dev or not listed dependencies - await dependencies(appDir, true, ignoreFiles) - - if (debug.enabled) { - const nodeModulesDir = path.join(appDir, "node_modules") - debug(`Pruned dev or extraneous dependencies: ${Array.from(ignoreFiles).slice(2).map(it => path.relative(nodeModulesDir, it)).join(", ")}`) - } - const patterns = this.getFileMatchers("files", appDir, path.join(resourcesPath, "app"), false, fileMatchOptions, platformSpecificBuildOptions) - let defaultMatcher = patterns == null ? new FileMatcher(appDir, path.join(resourcesPath, "app"), fileMatchOptions) : patterns[0] - if (defaultMatcher.isEmpty()) { - defaultMatcher.addPattern("**/*") + const appDir = this.info.appDir + const ignoreFiles = new Set([path.resolve(appDir, outDir), path.resolve(appDir, this.buildResourcesDir)]) + // prune dev or not listed dependencies + await BluebirdPromise.all([ + dependencies(appDir, true, ignoreFiles), + unpackElectron(this, appOutDir, platformName, Arch[arch], this.info.electronVersion), + ]) + + if (debug.enabled) { + const nodeModulesDir = path.join(appDir, "node_modules") + debug(`Pruned dev or extraneous dependencies: ${Array.from(ignoreFiles).slice(2).map(it => path.relative(nodeModulesDir, it)).join(", ")}`) + } + + const patterns = this.getFileMatchers("files", appDir, path.join(resourcesPath, "app"), false, fileMatchOptions, platformSpecificBuildOptions) + let defaultMatcher = patterns == null ? new FileMatcher(appDir, path.join(resourcesPath, "app"), fileMatchOptions) : patterns[0] + if (defaultMatcher.isEmpty()) { + defaultMatcher.addPattern("**/*") + } + else { + defaultMatcher.addPattern("package.json") + } + defaultMatcher.addPattern("!**/node_modules/*/{CHANGELOG.md,ChangeLog,changelog.md,README.md,README,readme.md,readme,test,__tests__,tests,powered-test,example,examples,*.d.ts}") + defaultMatcher.addPattern("!**/node_modules/.bin") + defaultMatcher.addPattern("!**/*.{o,hprof,orig,pyc,pyo,rbc,swp}") + defaultMatcher.addPattern("!**/._*") + defaultMatcher.addPattern("!.idea") + defaultMatcher.addPattern("!*.iml") + //noinspection SpellCheckingInspection + defaultMatcher.addPattern("!**/{.DS_Store,.git,.hg,.svn,CVS,RCS,SCCS,__pycache__,thumbs.db,.gitignore,.gitattributes,.editorconfig,.flowconfig,.yarn-metadata.json,.idea,appveyor.yml,.travis.yml,circle.yml,npm-debug.log,.nyc_output,yarn.lock,.yarn-integrity}") + + let rawFilter: any = null + const deprecatedIgnore = (this.devMetadata.build).ignore + if (deprecatedIgnore != null) { + if (typeof deprecatedIgnore === "function") { + warn(`"ignore" is specified as function, may be new "files" option will be suit your needs? Please see https://github.com/electron-userland/electron-builder/wiki/Options#BuildMetadata-files`) } else { - defaultMatcher.addPattern("package.json") - } - defaultMatcher.addPattern("!**/node_modules/*/{CHANGELOG.md,ChangeLog,changelog.md,README.md,README,readme.md,readme,test,__tests__,tests,powered-test,example,examples,*.d.ts}") - defaultMatcher.addPattern("!**/node_modules/.bin") - defaultMatcher.addPattern("!**/*.{o,hprof,orig,pyc,pyo,rbc,swp}") - defaultMatcher.addPattern("!**/._*") - defaultMatcher.addPattern("!.idea") - defaultMatcher.addPattern("!*.iml") - //noinspection SpellCheckingInspection - defaultMatcher.addPattern("!**/{.DS_Store,.git,.hg,.svn,CVS,RCS,SCCS,__pycache__,thumbs.db,.gitignore,.gitattributes,.editorconfig,.flowconfig,.yarn-metadata.json,.idea,appveyor.yml,.travis.yml,circle.yml,npm-debug.log,.nyc_output,yarn.lock,.yarn-integrity}") - - let rawFilter: any = null - const deprecatedIgnore = (this.devMetadata.build).ignore - if (deprecatedIgnore != null) { - if (typeof deprecatedIgnore === "function") { - warn(`"ignore" is specified as function, may be new "files" option will be suit your needs? Please see https://github.com/electron-userland/electron-builder/wiki/Options#BuildMetadata-files`) - } - else { - warn(`"ignore" is deprecated, please use "files", see https://github.com/electron-userland/electron-builder/wiki/Options#BuildMetadata-files`) - } - rawFilter = deprecatedUserIgnoreFilter(deprecatedIgnore, appDir) + warn(`"ignore" is deprecated, please use "files", see https://github.com/electron-userland/electron-builder/wiki/Options#BuildMetadata-files`) } + rawFilter = deprecatedUserIgnoreFilter(deprecatedIgnore, appDir) + } - let excludePatterns: Array = [] - if (extraResourceMatchers != null) { - for (let i = 0; i < extraResourceMatchers.length; i++) { - const patterns = extraResourceMatchers[i].getParsedPatterns(this.info.projectDir) - excludePatterns = excludePatterns.concat(patterns) - } + let excludePatterns: Array = [] + if (extraResourceMatchers != null) { + for (let i = 0; i < extraResourceMatchers.length; i++) { + const patterns = extraResourceMatchers[i].getParsedPatterns(this.info.projectDir) + excludePatterns = excludePatterns.concat(patterns) } - if (extraFileMatchers != null) { - for (let i = 0; i < extraFileMatchers.length; i++) { - const patterns = extraFileMatchers[i].getParsedPatterns(this.info.projectDir) - excludePatterns = excludePatterns.concat(patterns) - } + } + if (extraFileMatchers != null) { + for (let i = 0; i < extraFileMatchers.length; i++) { + const patterns = extraFileMatchers[i].getParsedPatterns(this.info.projectDir) + excludePatterns = excludePatterns.concat(patterns) } + } - const filter = defaultMatcher.createFilter(ignoreFiles, rawFilter, excludePatterns.length ? excludePatterns : null) - let promise - if (asarOptions == null) { - promise = copyFiltered(appDir, path.join(resourcesPath, "app"), filter, this.info.devMetadata.build.dereference || this.platform === Platform.WINDOWS) - } - else { - const unpackPattern = this.getFileMatchers("asarUnpack", appDir, path.join(resourcesPath, "app"), false, fileMatchOptions, platformSpecificBuildOptions) - const fileMatcher = unpackPattern == null ? null : unpackPattern[0] - //noinspection ES6MissingAwait - promise = createAsarArchive(appDir, resourcesPath, asarOptions, filter, fileMatcher == null ? null : fileMatcher.createFilter()) - } + const filter = defaultMatcher.createFilter(ignoreFiles, rawFilter, excludePatterns.length ? excludePatterns : null) + let promise + if (asarOptions == null) { + promise = copyFiltered(appDir, path.join(resourcesPath, "app"), filter, this.info.devMetadata.build.dereference || this.platform === Platform.WINDOWS) + } + else { + const unpackPattern = this.getFileMatchers("asarUnpack", appDir, path.join(resourcesPath, "app"), false, fileMatchOptions, platformSpecificBuildOptions) + const fileMatcher = unpackPattern == null ? null : unpackPattern[0] + promise = createAsarArchive(appDir, resourcesPath, asarOptions, filter, fileMatcher == null ? null : fileMatcher.createFilter()) + } - const promises = [promise, unlinkIfExists(path.join(resourcesPath, "default_app.asar")), unlinkIfExists(path.join(appOutDir, "version"))] - if (this.info.electronVersion != null && this.info.electronVersion[0] === "0") { - // electron release >= 0.37.4 - the default_app/ folder is a default_app.asar file - promises.push(remove(path.join(resourcesPath, "default_app"))) - } + //noinspection ES6MissingAwait + const promises = [promise, unlinkIfExists(path.join(resourcesPath, "default_app.asar")), unlinkIfExists(path.join(appOutDir, "version")), this.postInitApp(appOutDir)] + if (this.platform !== Platform.MAC) { + promises.push(rename(path.join(appOutDir, "LICENSE"), path.join(appOutDir, "LICENSE.electron.txt")) .catch(() => {/* ignore */})) + } + if (this.info.electronVersion != null && this.info.electronVersion[0] === "0") { + // electron release >= 0.37.4 - the default_app/ folder is a default_app.asar file + promises.push(remove(path.join(resourcesPath, "default_app"))) + } - promises.push(this.postInitApp(appOutDir)) - await BluebirdPromise.all(promises) - }) + await BluebirdPromise.all(promises) + + if (platformName === "darwin" || platformName === "mas") { + await (require("./packager/mac")).createApp(this, appOutDir) + } await this.doCopyExtraFiles(extraResourceMatchers) await this.doCopyExtraFiles(extraFileMatchers) @@ -278,8 +288,7 @@ export abstract class PlatformPackager await this.sanityCheckPackage(appOutDir, asarOptions != null) } - protected postInitApp(executableFile: string): Promise { - return BluebirdPromise.resolve(null) + protected async postInitApp(executableFile: string): Promise { } async getIconPath(): Promise { @@ -436,11 +445,6 @@ export abstract class PlatformPackager await this.checkFileInPackage(resourcesDir, "package.json", "Application", isAsar) } - protected archiveApp(format: string, appOutDir: string, outFile: string): Promise { - const isMac = this.platform === Platform.MAC - return archiveApp(this.devMetadata.build.compression, format, outFile, isMac ? path.join(appOutDir, `${this.appInfo.productFilename}.app`) : appOutDir, isMac) - } - generateName(ext: string | null, arch: Arch, deployment: boolean, classifier: string | null = null): string { let c: string | null = null if (arch === Arch.x64) { @@ -451,6 +455,9 @@ export abstract class PlatformPackager c = "amd64" } } + else if (arch === Arch.ia32 && ext === "deb") { + c = "i386" + } else { c = Arch[arch] } @@ -635,4 +642,8 @@ export async function getResolvedPublishConfig(packager: BuildInfo, publishConfi else { return null } +} + +export function toDebArch(arch: Arch) { + return arch === Arch.ia32 ? "i386" : "amd64" } \ No newline at end of file diff --git a/src/publish/gitHubPublisher.ts b/src/publish/gitHubPublisher.ts index f8f7271f629..6aa27d4076d 100644 --- a/src/publish/gitHubPublisher.ts +++ b/src/publish/gitHubPublisher.ts @@ -25,7 +25,7 @@ interface Asset { export class GitHubPublisher extends Publisher { private tag: string - private _releasePromise: BluebirdPromise + private _releasePromise: Promise private readonly token: string private readonly policy: PublishPolicy @@ -54,7 +54,7 @@ export class GitHubPublisher extends Publisher { } this.tag = info.vPrefixedTagName === false ? version : `v${version}` - this._releasePromise = this.token === "__test__" ? BluebirdPromise.resolve(null) : >this.init() + this._releasePromise = this.token === "__test__" ? BluebirdPromise.resolve(null) : this.init() } private async init(): Promise { @@ -153,16 +153,12 @@ export class GitHubPublisher extends Publisher { // test only //noinspection JSUnusedGlobalSymbols async getRelease(): Promise { - return githubRequest(`/repos/${this.info.owner}/${this.info.repo}/releases/${this._releasePromise.value().id}`, this.token) + return githubRequest(`/repos/${this.info.owner}/${this.info.repo}/releases/${(await this._releasePromise).id}`, this.token) } //noinspection JSUnusedGlobalSymbols async deleteRelease(): Promise { - if (!this._releasePromise.isFulfilled()) { - return - } - - const release = this._releasePromise.value() + const release = await this._releasePromise if (release == null) { return } @@ -172,8 +168,14 @@ export class GitHubPublisher extends Publisher { return await githubRequest(`/repos/${this.info.owner}/${this.info.repo}/releases/${release.id}`, this.token, null, "DELETE") } catch (e) { - if (e instanceof HttpError && (e.response.statusCode === 405 || e.response.statusCode === 502)) { - continue + if (e instanceof HttpError) { + if (e.response.statusCode === 404) { + warn(`Cannot delete release ${release.id} — doesn't exist`) + return + } + else if (e.response.statusCode === 405 || e.response.statusCode === 502) { + continue + } } throw e diff --git a/src/targets/LinuxTargetHelper.ts b/src/targets/LinuxTargetHelper.ts index 3605ad1864c..7656e7a5668 100644 --- a/src/targets/LinuxTargetHelper.ts +++ b/src/targets/LinuxTargetHelper.ts @@ -63,19 +63,23 @@ export class LinuxTargetHelper { return iconPath == null ? await this.packager.getDefaultIcon("icns") : path.resolve(this.packager.projectDir, iconPath) } - async computeDesktopEntry(platformSpecificBuildOptions: LinuxBuildOptions, exec?: string, extra?: { [key: string]: string; }): Promise { + getDescription(options: LinuxBuildOptions) { + return options.description || this.packager.appInfo.description + } + + async computeDesktopEntry(platformSpecificBuildOptions: LinuxBuildOptions, exec?: string, destination?: string | null, extra?: { [key: string]: string; }): Promise { const appInfo = this.packager.appInfo const productFilename = appInfo.productFilename - const tempFile = await this.packager.getTempFile(`${productFilename}.desktop`) 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", Icon: appInfo.name, + StartupWMClass: `"${productFilename}"`, }, extra, platformSpecificBuildOptions.desktop) const category = platformSpecificBuildOptions.category @@ -90,6 +94,7 @@ export class LinuxTargetHelper { } data += "\n" + const tempFile = destination || await this.packager.getTempFile(`${productFilename}.desktop`) await outputFile(tempFile, data) return tempFile } diff --git a/src/targets/appImage.ts b/src/targets/appImage.ts index bbf2ab98736..814e52a782b 100644 --- a/src/targets/appImage.ts +++ b/src/targets/appImage.ts @@ -1,4 +1,4 @@ -import { TargetEx } from "../platformPackager" +import { Target } from "../platformPackager" import { Arch } from "../metadata" import * as path from "path" import { exec, unlinkIfExists } from "../util/util" @@ -16,7 +16,7 @@ const appImageSha256 = process.platform === "darwin" ? "5d4a954876654403698a01ef //noinspection SpellCheckingInspection const appImagePathPromise = getBin("AppImage", appImageVersion, `https://dl.bintray.com/electron-userland/bin/${appImageVersion}.7z`, appImageSha256) -export default class AppImageTarget extends TargetEx { +export default class AppImageTarget extends Target { private readonly options = Object.assign({}, this.packager.platformSpecificBuildOptions, (this.packager.devMetadata.build)[this.name]) private readonly desktopEntry: Promise @@ -25,26 +25,26 @@ export default class AppImageTarget extends TargetEx { // we add X-AppImage-BuildId to ensure that new desktop file will be installed this.desktopEntry = BluebirdPromise.promisify(uuid1)({mac: false}) - .then(uuid => helper.computeDesktopEntry(this.options, "AppRun", { + .then(uuid => helper.computeDesktopEntry(this.options, "AppRun", null, { "X-AppImage-Version": `${packager.appInfo.buildVersion}`, "X-AppImage-BuildId": uuid, })) } 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", @@ -65,18 +65,18 @@ export default class AppImageTarget extends TargetEx { args.push("-zisofs", `level=${packager.devMetadata.build.compression === "store" ? "0" : "9"}:block_size=128k:by_magic=off`) args.push("set_filter_r", "--zisofs", "/") - await exec(process.env.USE_SYSTEM_FPM === "true" || process.arch !== "x64" ? "xorriso" : path.join(appImagePath, "xorriso"), args) + await exec(process.arch === "x64" ? path.join(appImagePath, "xorriso") : "xorriso", args) 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) } } \ No newline at end of file diff --git a/src/targets/archive.ts b/src/targets/archive.ts index 78c30d5a1bf..fa61ea146c5 100644 --- a/src/targets/archive.ts +++ b/src/targets/archive.ts @@ -16,32 +16,30 @@ const extToCompressionDescriptor: { [key: string]: CompressionDescriptor; } = { "tar.bz2": new CompressionDescriptor("--bzip2", "BZIP2", "-1"), } -// withoutDir - not applicable for tar.* formats -export async function archiveApp(compression: CompressionLevel | n, format: string, outFile: string, dirToArchive: string, isMacApp: boolean = false, withoutDir: boolean = false): Promise { - const storeOnly = compression === "store" - - if (format.startsWith("tar.")) { - // we don't use 7z here - develar: I spent a lot of time making pipe working - but it works on MacOS and often hangs on Linux (even if use pipe-io lib) - // and in any case it is better to use system tools (in the light of docker - it is not problem for user because we provide complete docker image). - const info = extToCompressionDescriptor[format] - let tarEnv = process.env - if (compression != null && compression !== "normal") { - tarEnv = Object.assign({}, process.env) - tarEnv[info.env] = storeOnly ? info.minLevel : info.maxLevel - } +export async function tar(compression: CompressionLevel | n, format: string, outFile: string, dirToArchive: string, isMacApp: boolean = false) { + // we don't use 7z here - develar: I spent a lot of time making pipe working - but it works on MacOS and often hangs on Linux (even if use pipe-io lib) + // and in any case it is better to use system tools (in the light of docker - it is not problem for user because we provide complete docker image). + const info = extToCompressionDescriptor[format] + let tarEnv = process.env + if (compression != null && compression !== "normal") { + tarEnv = Object.assign({}, process.env) + tarEnv[info.env] = compression === "store" ? info.minLevel : info.maxLevel + } - const args = [info.flag, "-cf", outFile] - if (!isMacApp) { - args.push("--transform", `s,^\.,${path.basename(outFile, "." + format)},`) - } - args.push(isMacApp ? path.basename(dirToArchive) : ".") - await spawn(process.platform === "darwin" || process.platform === "freebsd" ? "gtar" : "tar", args, { - cwd: isMacApp ? path.dirname(dirToArchive) : dirToArchive, - env: tarEnv - }) - return outFile + const args = [info.flag, "-cf", outFile] + if (!isMacApp) { + args.push("--transform", `s,^\.,${path.basename(outFile, "." + format)},`) } + args.push(isMacApp ? path.basename(dirToArchive) : ".") + await spawn(process.platform === "darwin" || process.platform === "freebsd" ? "gtar" : "tar", args, { + cwd: isMacApp ? path.dirname(dirToArchive) : dirToArchive, + env: tarEnv + }) + return outFile +} +export async function archive(compression: CompressionLevel | n, format: string, outFile: string, dirToArchive: string, withoutDir: boolean = false): Promise { + const storeOnly = compression === "store" const args = debug7zArgs("a") if (format === "7z" || format.endsWith(".7z")) { if (!storeOnly) { diff --git a/src/targets/dmg.ts b/src/targets/dmg.ts index 4375606aa94..443eacaa6bf 100644 --- a/src/targets/dmg.ts +++ b/src/targets/dmg.ts @@ -1,7 +1,7 @@ import { deepAssign } from "../util/deepAssign" import * as path from "path" import { log, warn } from "../util/log" -import { PlatformPackager, TargetEx } from "../platformPackager" +import { PlatformPackager, Target } from "../platformPackager" import { MacOptions, DmgOptions, DmgContent } from "../options/macOptions" import BluebirdPromise from "bluebird-lst-c" import { debug, use, exec, statOrNull, isEmptyOrSpaces, spawn, exists } from "../util/util" @@ -10,7 +10,7 @@ import { executeFinally } from "../util/promise" import sanitizeFileName from "sanitize-filename" import { Arch } from "../metadata" -export class DmgTarget extends TargetEx { +export class DmgTarget extends Target { private helperDir = path.join(__dirname, "..", "..", "templates", "dmg") constructor(private packager: PlatformPackager) { diff --git a/src/targets/fpm.ts b/src/targets/fpm.ts index f900bdbe347..082b8f4c75e 100644 --- a/src/targets/fpm.ts +++ b/src/targets/fpm.ts @@ -1,5 +1,5 @@ import { Arch } from "../metadata" -import { smarten, TargetEx } from "../platformPackager" +import { smarten, Target } from "../platformPackager" import { use, exec } from "../util/util" import * as path from "path" import { getBin } from "../util/binDownload" @@ -28,7 +28,7 @@ function downloadFpm(): Promise { .then(it => path.join(it, "fpm")) } -export default class FpmTarget extends TargetEx { +export default class FpmTarget extends Target { private readonly options = Object.assign({}, this.packager.platformSpecificBuildOptions, (this.packager.devMetadata.build)[this.name]) private readonly scriptFiles: Promise> @@ -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/nsis.ts b/src/targets/nsis.ts index a71c5a01360..78ac609f3a0 100644 --- a/src/targets/nsis.ts +++ b/src/targets/nsis.ts @@ -5,9 +5,9 @@ import * as path from "path" import BluebirdPromise from "bluebird-lst-c" import { getBinFromBintray } from "../util/binDownload" import { v5 as uuid5 } from "uuid-1345" -import { normalizeExt, TargetEx, getPublishConfigs, getResolvedPublishConfig, ArtifactCreated } from "../platformPackager" -import { archiveApp } from "./archive" -import { subTask, log } from "../util/log" +import { normalizeExt, Target, getPublishConfigs, getResolvedPublishConfig, ArtifactCreated } from "../platformPackager" +import { archive } from "./archive" +import { subTask, log, warn } from "../util/log" import { unlink, readFile, writeFile, createReadStream } from "fs-extra-p" import { SemVer } from "semver" import { NsisOptions } from "../options/winOptions" @@ -24,7 +24,7 @@ const ELECTRON_BUILDER_NS_UUID = "50e065bc-3134-11e6-9bab-38c9862bdaf3" const nsisPathPromise = getBinFromBintray("nsis", NSIS_VERSION, NSIS_SHA2) -export default class NsisTarget extends TargetEx { +export default class NsisTarget extends Target { private readonly options: NsisOptions = this.packager.info.devMetadata.build.nsis || Object.create(null) private archs: Map> = new Map() @@ -35,6 +35,11 @@ export default class NsisTarget extends TargetEx { constructor(private packager: WinPackager, private outDir: string) { super("nsis") + + const deps = packager.info.metadata.dependencies + if (deps != null && deps["electron-squirrel-startup"] != null) { + warn('"electron-squirrel-startup" dependency is not required for NSIS') + } } private computePublishConfigs(): Promise | null> { @@ -62,7 +67,7 @@ export default class NsisTarget extends TargetEx { const packager = this.packager const archiveFile = path.join(this.outDir, `${packager.appInfo.name}-${packager.appInfo.version}-${Arch[arch]}.nsis.7z`) - return await archiveApp(packager.devMetadata.build.compression, "7z", archiveFile, appOutDir, false, true) + return await archive(packager.devMetadata.build.compression, "7z", archiveFile, appOutDir, true) } async finishBuild(): Promise { diff --git a/src/targets/pkg.ts b/src/targets/pkg.ts index 3e6d56cf737..036403cd9a6 100644 --- a/src/targets/pkg.ts +++ b/src/targets/pkg.ts @@ -1,10 +1,10 @@ import { exec } from "../util/util" -import { TargetEx } from "../platformPackager" +import { Target } from "../platformPackager" import { Arch } from "../metadata" import MacPackager from "../macPackager" import * as path from "path" -export class PkgTarget extends TargetEx { +export class PkgTarget extends Target { constructor(private packager: MacPackager) { super("pkg") } diff --git a/src/targets/snap.ts b/src/targets/snap.ts new file mode 100644 index 00000000000..8588f867c07 --- /dev/null +++ b/src/targets/snap.ts @@ -0,0 +1,105 @@ +import { Target, toDebArch } 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, rename, copy } from "fs-extra-p" +import * as path from "path" +import { safeDump } from "js-yaml" +import { spawn } from "../util/util" +import { homedir } from "os" + +export default class SnapTarget extends Target { + private readonly options: SnapOptions = Object.assign({}, this.packager.platformSpecificBuildOptions, (this.packager.devMetadata.build)[this.name]) + + constructor(private packager: LinuxPackager, private helper: LinuxTargetHelper, private outDir: string) { + super("snap") + } + + 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 snapDir = `${appOutDir}-snap` + await emptyDir(snapDir) + + const snap: any = {} + snap.name = packager.executableName + 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" + + await this.helper.icons + if (this.helper.maxIconPath != null) { + snap.icon = "setup/gui/icon.png" + await copy(this.helper.maxIconPath, path.join(snapDir, "setup", "gui", "icon.png")) + } + + if (options.assumes != null) { + if (!Array.isArray(options.assumes)) { + throw new Error("snap.assumes must be an array of strings") + } + snap.assumes = options.assumes + } + + snap.apps = { + [snap.name]: { + command: `desktop-launch $SNAP/${packager.executableName}`, + plugs: [ + "home", "unity7", "x11", "browser-support", "network", "gsettings", "pulseaudio", "opengl", + ] + } + } + + await this.helper.computeDesktopEntry(this.options, "$snap.$app", path.join(snapDir, "setup", "gui", `${snap.name}.desktop`), { + "Icon": "${SNAP}/meta/gui/icon.png" + }) + + const isUseDocker = process.platform !== "linux" + snap.parts = { + app: { + plugin: "dump", + "stage-packages": ["libappindicator1", "libdbusmenu-glib4", "libnotify4", "libunity9", "libgconf-2-4", "libnss3", "libxss1", "fontconfig-config", "libnotify-bin"], + source: isUseDocker ? `/out/${path.basename(snapDir)}` : appOutDir, + filesets: { + app: [`${appOutDir}/*`], + }, + after: ["desktop-glib-only"] + } + } + + const snapcraft = path.join(snapDir, "snapcraft.yaml") + await writeFile(snapcraft, safeDump(snap)) + + // 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, + }) + } + + const snapName = `${snap.name}_${snap.version}_${toDebArch(arch)}.snap` + const resultFile = path.join(this.outDir, snapName) + await rename(path.join(snapDir, snapName), resultFile) + packager.dispatchArtifactCreated(resultFile) + } +} \ No newline at end of file diff --git a/src/targets/squirrelPack.ts b/src/targets/squirrelPack.ts index 0c8ac7db093..92bb8bc7ab0 100644 --- a/src/targets/squirrelPack.ts +++ b/src/targets/squirrelPack.ts @@ -152,7 +152,6 @@ async function pack(options: SquirrelOptions, directory: string, updateFile: str - diff --git a/src/targets/squirrelWindows.ts b/src/targets/squirrelWindows.ts index fd83737b7f9..71b85c39c86 100644 --- a/src/targets/squirrelWindows.ts +++ b/src/targets/squirrelWindows.ts @@ -1,5 +1,5 @@ import { WinPackager } from "../winPackager" -import { getArchSuffix, TargetEx } from "../platformPackager" +import { getArchSuffix, Target } from "../platformPackager" import { Arch } from "../metadata" import * as path from "path" import { warn, log } from "../util/log" @@ -12,7 +12,7 @@ const SW_VERSION = "1.4.4" //noinspection SpellCheckingInspection const SW_SHA2 = "98e1d81c80d7afc1bcfb37f3b224dc4f761088506b9c28ccd72d1cf8752853ba" -export default class SquirrelWindowsTarget extends TargetEx { +export default class SquirrelWindowsTarget extends Target { private readonly options: SquirrelWindowsOptions = Object.assign({}, this.packager.platformSpecificBuildOptions, this.packager.devMetadata.build.squirrelWindows) constructor(private packager: WinPackager) { diff --git a/src/targets/targetFactory.ts b/src/targets/targetFactory.ts index 681126cd941..70184d7471d 100644 --- a/src/targets/targetFactory.ts +++ b/src/targets/targetFactory.ts @@ -1,6 +1,10 @@ import { PlatformPackager, Target } from "../platformPackager" +import { Arch, Platform } from "../metadata" +import { tar, archive } from "./archive" +import * as path from "path" +import { log } from "../util/log" -const commonTargets = new Set(["dir", "zip", "7z", "tar.xz", "tar.lz", "tar.gz", "tar.bz2"]) +const archiveTargets = new Set(["zip", "7z", "tar.xz", "tar.lz", "tar.gz", "tar.bz2"]) export const DEFAULT_TARGET = "default" export const DIR_TARGET = "dir" @@ -30,9 +34,59 @@ function normalizeTargets(targets: Array | string | null | undefined): A } } -export function createCommonTarget(target: string): Target { - if (commonTargets.has(target)) { - return new Target(target) +export function createCommonTarget(target: string, outDir: string, packager: PlatformPackager): Target { + if (archiveTargets.has(target)) { + return new ArchiveTarget(target, outDir, packager) + } + else if (target === "dir") { + return new NoOpTarget("dir") + } + else { + throw new Error(`Unknown target: ${target}`) + } +} + +export class NoOpTarget extends Target { + async build(appOutDir: string, arch: Arch): Promise { + // no build + } +} + +class ArchiveTarget extends Target { + constructor(name: string, private outDir: string, private readonly packager: PlatformPackager) { + super(name) + } + + async build(appOutDir: string, arch: Arch): Promise { + const packager = this.packager + const isMac = packager.platform === Platform.MAC + const outDir = this.outDir + + const format = this.name + log(`Building ${isMac ? "macOS " : ""}${format}`) + + // we use app name here - see https://github.com/electron-userland/electron-builder/pull/204 + const outFile = (() => { + switch (packager.platform) { + case Platform.MAC: + return path.join(appOutDir, packager.generateName2(format, "mac", false)) + case Platform.WINDOWS: + return path.join(outDir, packager.generateName(format, arch, false, "win")) + case Platform.LINUX: + return path.join(outDir, packager.generateName(format, arch, true)) + default: + throw new Error(`Unknown platform: ${packager.platform}`) + } + })() + + const dirToArchive = isMac ? path.join(appOutDir, `${packager.appInfo.productFilename}.app`) : appOutDir + if (format.startsWith("tar.")) { + await tar(packager.devMetadata.build.compression, format, outFile, dirToArchive, isMac) + } + else { + await archive(packager.devMetadata.build.compression, format, outFile, dirToArchive) + } + + packager.dispatchArtifactCreated(outFile, isMac ? packager.generateName2(format, "mac", true) : packager.generateName(format, arch, true, packager.platform === Platform.WINDOWS ? "win" : null)) } - throw new Error(`Unknown target: ${target}`) } \ No newline at end of file diff --git a/src/util/tmp.ts b/src/util/tmp.ts index 0cfca70b5f2..add7de741fb 100644 --- a/src/util/tmp.ts +++ b/src/util/tmp.ts @@ -7,6 +7,8 @@ import { warn } from "./log" const mkdtemp: any | null = require("fs-extra-p").mkdtemp +process.setMaxListeners(30) + export class TmpDir { private tmpFileCounter = 0 private tempDirectoryPromise: BluebirdPromise @@ -27,7 +29,7 @@ export class TmpDir { this.tempDirectoryPromise = promise .then(dir => { this.dir = dir - process.on("SIGINT", () => { + const cleanup = () => { if (this.dir == null) { return } @@ -41,7 +43,10 @@ export class TmpDir { warn(`Cannot delete temporary dir "${dir}": ${(e.stack || e).toString()}`) } } - }) + } + process.on("exit", cleanup) + process.on("uncaughtException", cleanup) + process.on("SIGINT", cleanup) return dir }) } 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/src/winPackager.ts b/src/winPackager.ts index 83f3dd52f8a..1cf07014d14 100644 --- a/src/winPackager.ts +++ b/src/winPackager.ts @@ -1,7 +1,7 @@ import { downloadCertificate } from "./codeSign" import BluebirdPromise from "bluebird-lst-c" -import { PlatformPackager, BuildInfo, Target, TargetEx } from "./platformPackager" -import { Platform, Arch } from "./metadata" +import { PlatformPackager, BuildInfo, Target } from "./platformPackager" +import { Platform } from "./metadata" import * as path from "path" import { log } from "./util/log" import { exec, use } from "./util/util" @@ -23,7 +23,7 @@ export interface FileCodeSigningInfo { export class WinPackager extends PlatformPackager { readonly cscInfo: Promise | null - private readonly iconPath: Promise + private iconPath: Promise | null constructor(info: BuildInfo) { super(info) @@ -59,8 +59,6 @@ export class WinPackager extends PlatformPackager { subjectName: subjectName }) } - - this.iconPath = this.getValidIconPath() } protected doGetCscPassword(): string { @@ -86,7 +84,7 @@ export class WinPackager extends PlatformPackager { }) } else { - mapper(name, () => createCommonTarget(name)) + mapper(name, outDir => createCommonTarget(name, outDir, this)) } } } @@ -95,8 +93,11 @@ export class WinPackager extends PlatformPackager { return Platform.WINDOWS } - async getIconPath() { - return await this.iconPath + getIconPath() { + if (this.iconPath == null) { + this.iconPath = this.getValidIconPath() + } + return this.iconPath } private async getValidIconPath(): Promise { @@ -114,29 +115,25 @@ export class WinPackager extends PlatformPackager { return iconPath } - async pack(outDir: string, arch: Arch, targets: Array, postAsyncTasks: Array>): Promise { - const appOutDir = this.computeAppOutDir(outDir, arch) - await this.doPack(outDir, appOutDir, this.platform.nodeName, arch, this.platformSpecificBuildOptions) - this.packageInDistributableFormat(outDir, appOutDir, arch, targets, postAsyncTasks) - } - async sign(file: string) { const cscInfo = await this.cscInfo - if (cscInfo != null) { - log(`Signing ${path.basename(file)} (certificate file "${cscInfo.file}")`) - await this.doSign({ - path: file, - - cert: cscInfo.file, - subjectName: cscInfo.subjectName, - - password: cscInfo.password, - name: this.appInfo.productName, - site: await this.appInfo.computePackageUrl(), - hash: this.platformSpecificBuildOptions.signingHashAlgorithms, - tr: this.platformSpecificBuildOptions.rfc3161TimeStampServer, - }) + if (cscInfo == null) { + return } + + log(`Signing ${path.basename(file)} (certificate file "${cscInfo.file}")`) + await this.doSign({ + path: file, + + cert: cscInfo.file, + subjectName: cscInfo.subjectName, + + password: cscInfo.password, + name: this.appInfo.productName, + site: await this.appInfo.computePackageUrl(), + hash: this.platformSpecificBuildOptions.signingHashAlgorithms, + tr: this.platformSpecificBuildOptions.rfc3161TimeStampServer, + }) } //noinspection JSMethodCanBeStatic @@ -177,22 +174,6 @@ export class WinPackager extends PlatformPackager { await rename(path.join(appOutDir, "electron.exe"), executable) await this.signAndEditResources(executable) } - - protected packageInDistributableFormat(outDir: string, appOutDir: string, arch: Arch, targets: Array, promises: Array>): void { - for (let target of targets) { - if (target instanceof TargetEx) { - promises.push(target.build(appOutDir, arch)) - } - else { - const format = target.name - log(`Building Windows ${format}`) - // we use app name here - see https://github.com/electron-userland/electron-builder/pull/204 - const outFile = path.join(outDir, this.generateName(format, arch, false, "win")) - promises.push(this.archiveApp(format, appOutDir, outFile) - .then(() => this.dispatchArtifactCreated(outFile, this.generateName(format, arch, true, "win")))) - } - } - } } async function checkIcon(file: string): Promise { diff --git a/test/fixtures/test-app-one/package.json b/test/fixtures/test-app-one/package.json index 39e6921f118..ee0671ce0a4 100755 --- a/test/fixtures/test-app-one/package.json +++ b/test/fixtures/test-app-one/package.json @@ -12,6 +12,7 @@ "appId": "org.electron-builder.testApp", "iconUrl": "https://raw.githubusercontent.com/szwacz/electron-boilerplate/master/resources/windows/icon.ico", "compression": "store", + "npmRebuild": false, "mac": { "category": "your.app.category.type" }, diff --git a/test/jestSetup.js b/test/jestSetup.js new file mode 100644 index 00000000000..875417259ad --- /dev/null +++ b/test/jestSetup.js @@ -0,0 +1,36 @@ +"use strict" + +require('source-map-support').install() + +const isWindows = process.platform === "win32" +const isCi = (process.env.CI || "").toLowerCase() === "true" + +// Squirrel.Windows msi is very slow +jasmine.DEFAULT_TIMEOUT_INTERVAL = (isWindows ? 30 : 10) * 1000 * 60 + +const skip = test.skip + +if (process.env.RUN_IN_BAND !== "true") { + //noinspection JSUnresolvedVariable + // it = it.concurrent + //noinspection JSUnresolvedVariable + // test = it +} + +test.ifMac = process.platform === "darwin" ? test : skip +test.ifNotWindows = isWindows ? skip : test + +if (isCi) { + test.ifCi = test + test.ifNotCi = skip +} +else { + test.ifCi = skip + test.ifNotCi = test +} + +test.ifNotCiMac = isCi && process.platform === "darwin" ? skip : test + +test.ifDevOrWinCi = !isCi || isWindows ? test : skip +test.ifDevOrLinuxCi = !isCi || process.platform === "linux" ? test : skip +test.ifWinCi = isCi && isWindows ? test : skip \ No newline at end of file diff --git a/test/src/ArtifactPublisherTest.ts b/test/src/ArtifactPublisherTest.ts index dce86c51943..1cb4f1c5b0c 100644 --- a/test/src/ArtifactPublisherTest.ts +++ b/test/src/ArtifactPublisherTest.ts @@ -1,4 +1,3 @@ -import test from "./helpers/avaEx" import { GitHubPublisher } from "out/publish/gitHubPublisher" import { HttpError } from "out/publish/restApiRequest" import { join } from "path" @@ -6,6 +5,12 @@ import { assertThat } from "./helpers/fileAssert" import { BintrayPublisher } from "out/publish/BintrayPublisher" import { createPublisher } from "out/builder" +if (process.env.CI && process.platform === "win32") { + fit("Skip ArtifactPublisherTest suite on Windows CI", () => { + console.warn("[SKIP] Skip ArtifactPublisherTest suite on Windows CI") + }) +} + function getRandomInt(min: number, max: number) { return Math.floor(Math.random() * (max - min + 1)) + min } @@ -103,7 +108,7 @@ testAndIgnoreApiRate("GitHub upload org", async () => { } }) -test("create publisher", async () => { +it("create publisher", async () => { const packager: any = { metadata: { version: "2.0.0", diff --git a/test/src/BuildTest.ts b/test/src/BuildTest.ts index 53d23cb65f1..9fbe11ab9d3 100755 --- a/test/src/BuildTest.ts +++ b/test/src/BuildTest.ts @@ -1,5 +1,7 @@ -import test from "./helpers/avaEx" -import { assertPack, modifyPackageJson, platform, getPossiblePlatforms, app, appThrows, packageJson } from "./helpers/packTester" +import { + assertPack, modifyPackageJson, getPossiblePlatforms, app, appThrows, packageJson, + appTwoThrows, allPlatforms +} from "./helpers/packTester" import { move, outputJson } from "fs-extra-p" import BluebirdPromise from "bluebird-lst-c" import * as path from "path" @@ -10,7 +12,7 @@ import { createYargs } from "out/cliOptions" import { extractFile } from "asar-electron-builder" import { ELECTRON_VERSION } from "./helpers/config" -test("cli", () => { +test("cli", async () => { const yargs = createYargs() function expected(opt: BuildOptions): any { @@ -82,81 +84,22 @@ test("custom output dir", app(allPlatforms(false), { } })) -test("build in the app package.json", t => t.throws(assertPack("test-app", allPlatforms(), { +test("build in the app package.json", appTwoThrows(/'build' in the application package\.json .+/, allPlatforms(), { projectDirCreated: it => modifyPackageJson(it, data => { data.build = { "iconUrl": "bar", } }, true) -}), /'build' in the application package\.json .+/)) +})) test("name in the build", appThrows(/'name' in the 'build' is forbidden/, currentPlatform(), {projectDirCreated: packageJson(it => it.build = {"name": "Cool App"})})) // this test also test appMetadata, so, we must use test-app here -test("empty description", t => t.throws(assertPack("test-app", { +test("empty description", appTwoThrows(/Please specify 'description'/, { targets: Platform.LINUX.createTarget(), appMetadata: { description: "", } -}), /Please specify 'description'/)) - -test("invalid main in the app package.json", t => t.throws(assertPack("test-app", allPlatforms(false), { - projectDirCreated: projectDir => modifyPackageJson(projectDir, data => { - data.main = "main.js" - }, true) -}), /Application entry file "main.js" in the /)) - -test("invalid main in the app package.json (no asar)", t => t.throws(assertPack("test-app", allPlatforms(false), { - projectDirCreated: projectDir => { - return BluebirdPromise.all([ - modifyPackageJson(projectDir, data => { - data.main = "main.js" - }, true), - modifyPackageJson(projectDir, data => { - data.build.asar = false - }) - ]) - } -}), `Application entry file "main.js" does not exist. Seems like a wrong configuration.`)) - -test("invalid main in the app package.json (custom asar)", t => t.throws(assertPack("test-app", allPlatforms(false), { - projectDirCreated: projectDir => { - return BluebirdPromise.all([ - modifyPackageJson(projectDir, data => { - data.main = "path/app.asar/main.js" - }, true), - modifyPackageJson(projectDir, data => { - data.build.asar = false - }) - ]) - } -}), /Application entry file "main.js" in the ("[^"]*") does not exist\. Seems like a wrong configuration\./)) - -test("main in the app package.json (no asar)", () => assertPack("test-app", allPlatforms(false), { - projectDirCreated: projectDir => { - return BluebirdPromise.all([ - move(path.join(projectDir, "app", "index.js"), path.join(projectDir, "app", "main.js")), - modifyPackageJson(projectDir, data => { - data.main = "main.js" - }, true), - modifyPackageJson(projectDir, data => { - data.build.asar = false - }) - ]) - } -})) - -test("main in the app package.json (custom asar)", () => assertPack("test-app", allPlatforms(false), { - projectDirCreated: projectDir => { - return BluebirdPromise.all([ - modifyPackageJson(projectDir, data => { - data.main = "path/app.asar/index.js" - }, true), - modifyPackageJson(projectDir, data => { - data.build.asar = false - }) - ]) - } })) test("relative index", () => assertPack("test-app", allPlatforms(false), { @@ -165,7 +108,7 @@ test("relative index", () => assertPack("test-app", allPlatforms(false), { }, true) })) -test.ifDevOrLinuxCi("electron version from electron-prebuilt dependency", app({ +it.ifDevOrLinuxCi("electron version from electron-prebuilt dependency", app({ targets: Platform.LINUX.createTarget(DIR_TARGET), }, { projectDirCreated: projectDir => BluebirdPromise.all([ @@ -206,7 +149,7 @@ test("www as default dir", () => assertPack("test-app", currentPlatform(), { projectDirCreated: projectDir => move(path.join(projectDir, "app"), path.join(projectDir, "www")) })) -test("afterPack", t => { +test("afterPack", () => { const targets = process.env.CI ? Platform.fromString(process.platform).createTarget(DIR_TARGET) : getPossiblePlatforms(DIR_TARGET) let called = 0 return assertPack("test-app-one", { @@ -221,82 +164,13 @@ test("afterPack", t => { } }, { packed: () => { - t.is(called, targets.size) + expect(called).toEqual(targets.size) return BluebirdPromise.resolve() } }) }) -test.ifDevOrLinuxCi("extra metadata", () => { - const extraMetadata = { - foo: { - bar: 12, - }, - build: { - linux: { - executableName: "NewName" - } - } - } - return assertPack("test-app-one", { - targets: Platform.LINUX.createTarget(DIR_TARGET), - extraMetadata: extraMetadata, - }, { - projectDirCreated: projectDir => modifyPackageJson(projectDir, data => { - data.foo = { - bar: 42, - existingProp: 22, - } - }), - packed: async context => { - await assertThat(path.join(context.getContent(Platform.LINUX), "NewName")).isFile() - assertThat(JSON.parse(extractFile(path.join(context.getResources(Platform.LINUX), "app.asar"), "package.json").toString())).hasProperties({ - foo: { - bar: 12, - existingProp: 22, - } - }) - } - }) -}) - -test.ifDevOrLinuxCi("extra metadata - two", () => { - const extraMetadata = { - build: { - linux: { - executableName: "NewName" - } - } - } - return assertPack("test-app", { - targets: Platform.LINUX.createTarget(DIR_TARGET), - extraMetadata: extraMetadata, - }, { - packed: async context => { - await assertThat(path.join(context.getContent(Platform.LINUX), "NewName")).isFile() - } - }) -}) - -test.ifOsx("extra metadata - override icon", t => t.throws((() => { - const extraMetadata = { - build: { - mac: { - icon: "dev" - } - }, - } - return assertPack("test-app", { - targets: Platform.OSX.createTarget(DIR_TARGET), - extraMetadata: extraMetadata, - }, { - packed: async context => { - await assertThat(path.join(context.getContent(Platform.LINUX), "NewName")).isFile() - } - }) -})(), /ENOENT: no such file or directory/)) - -// test.ifOsx("app-executable-deps", () => { +// ifMac("app-executable-deps", () => { // return assertPack("app-executable-deps", { // targets: Platform.current().createTarget(DIR_TARGET), // }, { @@ -332,14 +206,6 @@ test.ifDevOrLinuxCi("smart unpack", () => { }) }) -test.ifWinCi("Build MacOS on Windows is not supported", appThrows(/Build for MacOS is supported only on MacOS.+/, platform(Platform.MAC))) - -function allPlatforms(dist: boolean = true): PackagerOptions { - return { - targets: getPossiblePlatforms(dist ? null : DIR_TARGET), - } -} - function currentPlatform(): PackagerOptions { return { targets: Platform.fromString(process.platform).createTarget(DIR_TARGET), diff --git a/test/src/CodeSignTest.ts b/test/src/CodeSignTest.ts deleted file mode 100644 index ac16002e276..00000000000 --- a/test/src/CodeSignTest.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { createKeychain } from "out/codeSign" -import { assertThat } from "./helpers/fileAssert" -import test from "./helpers/avaEx" -import { CSC_LINK } from "./helpers/codeSignData" -import { removePassword } from "out/util/util" -import { TmpDir } from "out/util/tmp" - -const tmpDir = new TmpDir() - -if (process.env.CSC_KEY_PASSWORD == null) { - console.warn("Skip keychain-specific tests because CSC_KEY_PASSWORD is not defined") -} -else { - test.ifOsx("create keychain", async () => { - const result = await createKeychain(tmpDir, CSC_LINK, process.env.CSC_KEY_PASSWORD) - assertThat(result.keychainName).isNotEmpty() - }) - - test.ifOsx("create keychain with installers", async () => { - const result = await createKeychain(tmpDir, CSC_LINK, process.env.CSC_KEY_PASSWORD) - assertThat(result.keychainName).isNotEmpty() - }) -} - -test.ifOsx("remove password from log", async () => { - assertThat(removePassword("seq -P foo -B")).isEqualTo("seq -P 2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae (sha256 hash) -B") - assertThat(removePassword("pass:foo")).isEqualTo("pass:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae (sha256 hash)") -}) \ No newline at end of file diff --git a/test/src/RepoSlugTest.ts b/test/src/RepoSlugTest.ts index 68f512dd1a7..69cfc2e6d0e 100644 --- a/test/src/RepoSlugTest.ts +++ b/test/src/RepoSlugTest.ts @@ -1,14 +1,11 @@ -import { Info } from "hosted-git-info" import { assertThat } from "./helpers/fileAssert" -import test from "ava-tf" -import BluebirdPromise from "bluebird-lst-c" import { getRepositoryInfo } from "out/repositoryInfo" -test("repo slug from TRAVIS_REPO_SLUG", () => { +test("repo slug from TRAVIS_REPO_SLUG", async () => { const oldValue = process.env.TRAVIS_REPO_SLUG try { process.env.TRAVIS_REPO_SLUG = "travis-ci/travis-build" - const info = (>getRepositoryInfo()).value() + const info = await getRepositoryInfo() assertThat(info).hasProperties({ user: "travis-ci", project: "travis-build", @@ -21,14 +18,7 @@ test("repo slug from TRAVIS_REPO_SLUG", () => { } }) -function restoreEnv(name: string, value: string) { - if (value != null) { - // otherwise will be set to string value "undefined" - process.env[name] = value - } -} - -test("repo slug from APPVEYOR", () => { +test("repo slug from APPVEYOR", async () => { const oldAppveyorAccountName = process.env.APPVEYOR_ACCOUNT_NAME const oldAppveyorProjectName = process.env.APPVEYOR_PROJECT_NAME const travisSlug = process.env.TRAVIS_REPO_SLUG @@ -39,7 +29,7 @@ test("repo slug from APPVEYOR", () => { process.env.APPVEYOR_ACCOUNT_NAME = "travis-ci" process.env.APPVEYOR_PROJECT_NAME = "travis-build" - const info = (>getRepositoryInfo()).value() + const info = await getRepositoryInfo() assertThat(info).hasProperties({ user: "travis-ci", project: "travis-build", @@ -52,4 +42,11 @@ test("repo slug from APPVEYOR", () => { process.env.TRAVIS_REPO_SLUG = travisSlug } } -}) \ No newline at end of file +}) + +function restoreEnv(name: string, value: string) { + if (value != null) { + // otherwise will be set to string value "undefined" + process.env[name] = value + } +} \ No newline at end of file diff --git a/test/src/extraMetadataTest.ts b/test/src/extraMetadataTest.ts new file mode 100644 index 00000000000..f2a50e446c1 --- /dev/null +++ b/test/src/extraMetadataTest.ts @@ -0,0 +1,71 @@ +import { assertPack, modifyPackageJson, appTwoThrows } from "./helpers/packTester" +import { Platform, DIR_TARGET } from "out" +import { assertThat } from "./helpers/fileAssert" +import * as path from "path" +import { extractFile } from "asar-electron-builder" + +test.ifDevOrLinuxCi("extra metadata", () => { + const extraMetadata = { + foo: { + bar: 12, + }, + build: { + linux: { + executableName: "new-name" + } + } + } + return assertPack("test-app-one", { + targets: Platform.LINUX.createTarget(DIR_TARGET), + extraMetadata: extraMetadata, + }, { + projectDirCreated: projectDir => modifyPackageJson(projectDir, data => { + data.foo = { + bar: 42, + existingProp: 22, + } + }), + packed: async context => { + await assertThat(path.join(context.getContent(Platform.LINUX), "new-name")).isFile() + assertThat(JSON.parse(extractFile(path.join(context.getResources(Platform.LINUX), "app.asar"), "package.json").toString())).hasProperties({ + foo: { + bar: 12, + existingProp: 22, + } + }) + } + }) +}) + +test.ifDevOrLinuxCi("extra metadata - two", () => { + const extraMetadata = { + build: { + linux: { + executableName: "new-name" + } + } + } + return assertPack("test-app", { + targets: Platform.LINUX.createTarget(DIR_TARGET), + extraMetadata: extraMetadata, + }, { + packed: async context => { + await assertThat(path.join(context.getContent(Platform.LINUX), "new-name")).isFile() + } + }) +}) + +test.ifMac("extra metadata - override icon", appTwoThrows(/ENOENT: no such file or directory/, { + targets: Platform.MAC.createTarget(DIR_TARGET), + extraMetadata: { + build: { + mac: { + icon: "dev" + } + }, + }, +}, { + packed: async context => { + await assertThat(path.join(context.getContent(Platform.LINUX), "new-name")).isFile() + } +})) \ No newline at end of file diff --git a/test/src/filesTest.ts b/test/src/filesTest.ts new file mode 100644 index 00000000000..8260340b29b --- /dev/null +++ b/test/src/filesTest.ts @@ -0,0 +1,167 @@ +import { expectedWinContents } from "./helpers/expectedContents" +import { outputFile } from "fs-extra-p" +import { assertPack, modifyPackageJson, getPossiblePlatforms, app } from "./helpers/packTester" +import BluebirdPromise from "bluebird-lst-c" +import * as path from "path" +import { assertThat } from "./helpers/fileAssert" +import { Platform, DIR_TARGET } from "out" +import pathSorter from "path-sort" + +test.ifDevOrLinuxCi("files", app({ + targets: Platform.LINUX.createTarget(DIR_TARGET), + devMetadata: { + build: { + asar: false, + files: ["**/*", "!ignoreMe${/*}"] + } + } +}, { + projectDirCreated: projectDir => { + return outputFile(path.join(projectDir, "ignoreMe", "foo"), "data") + }, + packed: context => { + return assertThat(path.join(context.getResources(Platform.LINUX), "app", "ignoreMe")).doesNotExist() + }, +})) + +test("extraResources", async () => { + for (let platform of getPossiblePlatforms().keys()) { + const osName = platform.buildConfigurationKey + + const winDirPrefix = "lib/net45/resources/" + + //noinspection SpellCheckingInspection + await assertPack("test-app-one", { + // to check NuGet package + targets: platform.createTarget(platform === Platform.WINDOWS ? "squirrel" : DIR_TARGET), + }, { + projectDirCreated: projectDir => { + return BluebirdPromise.all([ + modifyPackageJson(projectDir, data => { + data.build.extraResources = [ + "foo", + "bar/hello.txt", + "bar/${arch}.txt", + "${os}/${arch}.txt", + ] + + data.build[osName] = { + extraResources: [ + "platformSpecificR" + ], + extraFiles: [ + "platformSpecificF" + ], + } + }), + outputFile(path.join(projectDir, "foo/nameWithoutDot"), "nameWithoutDot"), + outputFile(path.join(projectDir, "bar/hello.txt"), "data"), + outputFile(path.join(projectDir, `bar/${process.arch}.txt`), "data"), + outputFile(path.join(projectDir, `${osName}/${process.arch}.txt`), "data"), + outputFile(path.join(projectDir, "platformSpecificR"), "platformSpecificR"), + outputFile(path.join(projectDir, "ignoreMe.txt"), "ignoreMe"), + ]) + }, + packed: context => { + const base = path.join(context.outDir, `${platform.buildConfigurationKey}${platform === Platform.MAC ? "" : "-unpacked"}`) + let resourcesDir = path.join(base, "resources") + if (platform === Platform.MAC) { + resourcesDir = path.join(base, `${context.packager.appInfo.productFilename}.app`, "Contents", "Resources") + } + + return BluebirdPromise.all([ + assertThat(path.join(resourcesDir, "foo")).isDirectory(), + assertThat(path.join(resourcesDir, "foo", "nameWithoutDot")).isFile(), + assertThat(path.join(resourcesDir, "bar", "hello.txt")).isFile(), + assertThat(path.join(resourcesDir, "bar", `${process.arch}.txt`)).isFile(), + assertThat(path.join(resourcesDir, osName, `${process.arch}.txt`)).isFile(), + assertThat(path.join(resourcesDir, "platformSpecificR")).isFile(), + assertThat(path.join(resourcesDir, "ignoreMe.txt")).doesNotExist(), + ]) + }, + expectedContents: platform === Platform.WINDOWS ? pathSorter(expectedWinContents.concat( + winDirPrefix + "bar/hello.txt", + winDirPrefix + "bar/x64.txt", + winDirPrefix + "foo/nameWithoutDot", + winDirPrefix + "platformSpecificR", + winDirPrefix + "win/x64.txt" + )) : null, + }) + } +}) + +test("extraResources - one-package", async () => { + for (let platform of [process.platform === "win32" ? Platform.WINDOWS : Platform.LINUX]) { + const osName = platform.buildConfigurationKey + + const winDirPrefix = "lib/net45/resources/" + + //noinspection SpellCheckingInspection + await assertPack("test-app-one", { + // to check NuGet package + targets: platform.createTarget(platform === Platform.WINDOWS ? "squirrel" : DIR_TARGET), + devMetadata: { + build: { + asar: true, + }, + }, + }, { + projectDirCreated: projectDir => { + return BluebirdPromise.all([ + modifyPackageJson(projectDir, data => { + data.build.extraResources = [ + "foo", + "bar/hello.txt", + "bar/${arch}.txt", + "${os}/${arch}.txt", + ] + + data.build[osName] = { + extraResources: [ + "platformSpecificR" + ], + extraFiles: [ + "platformSpecificF" + ], + } + }), + outputFile(path.join(projectDir, "foo/nameWithoutDot"), "nameWithoutDot"), + outputFile(path.join(projectDir, "bar/hello.txt"), "data"), + outputFile(path.join(projectDir, `bar/${process.arch}.txt`), "data"), + outputFile(path.join(projectDir, `${osName}/${process.arch}.txt`), "data"), + outputFile(path.join(projectDir, "platformSpecificR"), "platformSpecificR"), + outputFile(path.join(projectDir, "ignoreMe.txt"), "ignoreMe"), + ]) + }, + packed: async context => { + const base = path.join(context.outDir, platform.buildConfigurationKey + `${platform === Platform.MAC ? "" : "-unpacked"}`) + let resourcesDir = path.join(base, "resources") + if (platform === Platform.MAC) { + resourcesDir = path.join(base, "TestApp.app", "Contents", "Resources") + } + const appDir = path.join(resourcesDir, "app") + + await assertThat(path.join(resourcesDir, "foo")).isDirectory() + await assertThat(path.join(appDir, "foo")).doesNotExist() + + await assertThat(path.join(resourcesDir, "foo", "nameWithoutDot")).isFile() + await assertThat(path.join(appDir, "foo", "nameWithoutDot")).doesNotExist() + + await assertThat(path.join(resourcesDir, "bar", "hello.txt")).isFile() + await assertThat(path.join(resourcesDir, "bar", `${process.arch}.txt`)).isFile() + await assertThat(path.join(appDir, "bar", `${process.arch}.txt`)).doesNotExist() + + await assertThat(path.join(resourcesDir, osName, `${process.arch}.txt`)).isFile() + await assertThat(path.join(resourcesDir, "platformSpecificR")).isFile() + await assertThat(path.join(resourcesDir, "ignoreMe.txt")).doesNotExist() + }, + expectedContents: platform === Platform.WINDOWS ? pathSorter(expectedWinContents.concat( + winDirPrefix + "bar/hello.txt", + winDirPrefix + "bar/x64.txt", + winDirPrefix + "foo/nameWithoutDot", + winDirPrefix + "platformSpecificR", + winDirPrefix + "win/x64.txt" + )) : null, + }) + } +}) \ No newline at end of file diff --git a/test/src/globTest.ts b/test/src/globTest.ts index ac6dde2505d..d85afcd7311 100644 --- a/test/src/globTest.ts +++ b/test/src/globTest.ts @@ -1,71 +1,11 @@ -import test from "./helpers/avaEx" -import { expectedWinContents } from "./helpers/expectedContents" import { outputFile, symlink } from "fs-extra-p" -import { assertPack, modifyPackageJson, getPossiblePlatforms, app } from "./helpers/packTester" +import { assertPack, modifyPackageJson, app } from "./helpers/packTester" import BluebirdPromise from "bluebird-lst-c" import * as path from "path" import { assertThat } from "./helpers/fileAssert" import { Platform, DIR_TARGET } from "out" -import pathSorter from "path-sort" import { statFile } from "asar-electron-builder" -test.ifDevOrLinuxCi("ignore build resources", app({ - targets: Platform.LINUX.createTarget(DIR_TARGET), - devMetadata: { - build: { - asar: false - } - } -}, { - projectDirCreated: projectDir => { - return outputFile(path.join(projectDir, "one/build/foo.txt"), "data") - }, - packed: context => { - return assertThat(path.join(context.getResources(Platform.LINUX), "app", "one", "build", "foo.txt")).isFile() - }, -})) - -test.ifDevOrLinuxCi("ignore known ignored files", app({ - targets: Platform.LINUX.createTarget(DIR_TARGET), - devMetadata: { - build: { - asar: false - } - } -}, { - projectDirCreated: projectDir => BluebirdPromise.all([ - outputFile(path.join(projectDir, ".svn", "foo"), "data"), - outputFile(path.join(projectDir, ".git", "foo"), "data"), - outputFile(path.join(projectDir, "foo", "bar", "f.o"), "data"), - outputFile(path.join(projectDir, "node_modules", ".bin", "f.txt"), "data"), - outputFile(path.join(projectDir, "node_modules", ".bin2", "f.txt"), "data"), - ]), - packed: async context => { - await assertThat(path.join(context.getResources(Platform.LINUX), "app", ".svn")).doesNotExist() - await assertThat(path.join(context.getResources(Platform.LINUX), "app", ".git")).doesNotExist() - await assertThat(path.join(context.getResources(Platform.LINUX), "app", "foo", "bar", "f.o")).doesNotExist() - await assertThat(path.join(context.getResources(Platform.LINUX), "app", "node_modules", ".bin")).doesNotExist() - await assertThat(path.join(context.getResources(Platform.LINUX), "app", "node_modules", ".bin2")).isDirectory() - }, -})) - -test.ifDevOrLinuxCi("files", app({ - targets: Platform.LINUX.createTarget(DIR_TARGET), - devMetadata: { - build: { - asar: false, - files: ["**/*", "!ignoreMe${/*}"] - } - } -}, { - projectDirCreated: projectDir => { - return outputFile(path.join(projectDir, "ignoreMe", "foo"), "data") - }, - packed: context => { - return assertThat(path.join(context.getResources(Platform.LINUX), "app", "ignoreMe")).doesNotExist() - }, -})) - test.ifDevOrLinuxCi("unpackDir one", app({ targets: Platform.LINUX.createTarget(DIR_TARGET), devMetadata: { @@ -129,41 +69,6 @@ test.ifNotWindows("link", app({ }, })) -// skip on MacOS because we want test only / and \ -test.ifNotCiOsx("ignore node_modules dev dep", () => { - const build: any = { - asar: false, - ignore: (file: string) => { - return file === "/ignoreMe" - } - } - - return assertPack("test-app-one", { - targets: Platform.LINUX.createTarget(DIR_TARGET), - devMetadata: { - build: build - } - }, { - projectDirCreated: projectDir => { - return BluebirdPromise.all([ - modifyPackageJson(projectDir, data => { - data.devDependencies = Object.assign({ - "electron-macos-sign": "*", - }, data.devDependencies) - }), - outputFile(path.join(projectDir, "node_modules", "electron-macos-sign", "package.json"), "{}"), - outputFile(path.join(projectDir, "ignoreMe"), ""), - ]) - }, - packed: context => { - return BluebirdPromise.all([ - assertThat(path.join(context.getResources(Platform.LINUX), "app", "node_modules", "electron-macos-sign")).doesNotExist(), - assertThat(path.join(context.getResources(Platform.LINUX), "app", "ignoreMe")).doesNotExist(), - ]) - }, - }) -}) - // https://github.com/electron-userland/electron-builder/issues/611 test.ifDevOrLinuxCi("failed peer dep", () => { return assertPack("test-app-one", { @@ -179,143 +84,4 @@ test.ifDevOrLinuxCi("failed peer dep", () => { } }), }) -}) - -test("extraResources", async () => { - for (let platform of getPossiblePlatforms().keys()) { - const osName = platform.buildConfigurationKey - - const winDirPrefix = "lib/net45/resources/" - - //noinspection SpellCheckingInspection - await assertPack("test-app", { - // to check NuGet package - targets: platform.createTarget(platform === Platform.WINDOWS ? "squirrel" : DIR_TARGET), - }, { - projectDirCreated: projectDir => { - return BluebirdPromise.all([ - modifyPackageJson(projectDir, data => { - data.build.extraResources = [ - "foo", - "bar/hello.txt", - "bar/${arch}.txt", - "${os}/${arch}.txt", - ] - - data.build[osName] = { - extraResources: [ - "platformSpecificR" - ], - extraFiles: [ - "platformSpecificF" - ], - } - }), - outputFile(path.join(projectDir, "foo/nameWithoutDot"), "nameWithoutDot"), - outputFile(path.join(projectDir, "bar/hello.txt"), "data"), - outputFile(path.join(projectDir, `bar/${process.arch}.txt`), "data"), - outputFile(path.join(projectDir, `${osName}/${process.arch}.txt`), "data"), - outputFile(path.join(projectDir, "platformSpecificR"), "platformSpecificR"), - outputFile(path.join(projectDir, "ignoreMe.txt"), "ignoreMe"), - ]) - }, - packed: async context => { - const base = path.join(context.outDir, platform.buildConfigurationKey + `${platform === Platform.MAC ? "" : "-unpacked"}`) - let resourcesDir = path.join(base, "resources") - if (platform === Platform.MAC) { - resourcesDir = path.join(base, "TestApp.app", "Contents", "Resources") - } - await assertThat(path.join(resourcesDir, "foo")).isDirectory() - await assertThat(path.join(resourcesDir, "foo", "nameWithoutDot")).isFile() - await assertThat(path.join(resourcesDir, "bar", "hello.txt")).isFile() - await assertThat(path.join(resourcesDir, "bar", `${process.arch}.txt`)).isFile() - await assertThat(path.join(resourcesDir, osName, `${process.arch}.txt`)).isFile() - await assertThat(path.join(resourcesDir, "platformSpecificR")).isFile() - await assertThat(path.join(resourcesDir, "ignoreMe.txt")).doesNotExist() - }, - expectedContents: platform === Platform.WINDOWS ? pathSorter(expectedWinContents.concat( - winDirPrefix + "bar/hello.txt", - winDirPrefix + "bar/x64.txt", - winDirPrefix + "foo/nameWithoutDot", - winDirPrefix + "platformSpecificR", - winDirPrefix + "win/x64.txt" - )) : null, - }) - } -}) - -test("extraResources - one-package", async () => { - for (let platform of [process.platform === "win32" ? Platform.WINDOWS : Platform.LINUX]) { - const osName = platform.buildConfigurationKey - - const winDirPrefix = "lib/net45/resources/" - - //noinspection SpellCheckingInspection - await assertPack("test-app-one", { - // to check NuGet package - targets: platform.createTarget(platform === Platform.WINDOWS ? "squirrel" : DIR_TARGET), - devMetadata: { - build: { - asar: true, - }, - }, - }, { - projectDirCreated: projectDir => { - return BluebirdPromise.all([ - modifyPackageJson(projectDir, data => { - data.build.extraResources = [ - "foo", - "bar/hello.txt", - "bar/${arch}.txt", - "${os}/${arch}.txt", - ] - - data.build[osName] = { - extraResources: [ - "platformSpecificR" - ], - extraFiles: [ - "platformSpecificF" - ], - } - }), - outputFile(path.join(projectDir, "foo/nameWithoutDot"), "nameWithoutDot"), - outputFile(path.join(projectDir, "bar/hello.txt"), "data"), - outputFile(path.join(projectDir, `bar/${process.arch}.txt`), "data"), - outputFile(path.join(projectDir, `${osName}/${process.arch}.txt`), "data"), - outputFile(path.join(projectDir, "platformSpecificR"), "platformSpecificR"), - outputFile(path.join(projectDir, "ignoreMe.txt"), "ignoreMe"), - ]) - }, - packed: async context => { - const base = path.join(context.outDir, platform.buildConfigurationKey + `${platform === Platform.MAC ? "" : "-unpacked"}`) - let resourcesDir = path.join(base, "resources") - if (platform === Platform.MAC) { - resourcesDir = path.join(base, "TestApp.app", "Contents", "Resources") - } - const appDir = path.join(resourcesDir, "app") - - await assertThat(path.join(resourcesDir, "foo")).isDirectory() - await assertThat(path.join(appDir, "foo")).doesNotExist() - - await assertThat(path.join(resourcesDir, "foo", "nameWithoutDot")).isFile() - await assertThat(path.join(appDir, "foo", "nameWithoutDot")).doesNotExist() - - await assertThat(path.join(resourcesDir, "bar", "hello.txt")).isFile() - await assertThat(path.join(resourcesDir, "bar", `${process.arch}.txt`)).isFile() - await assertThat(path.join(appDir, "bar", `${process.arch}.txt`)).doesNotExist() - - await assertThat(path.join(resourcesDir, osName, `${process.arch}.txt`)).isFile() - await assertThat(path.join(resourcesDir, "platformSpecificR")).isFile() - await assertThat(path.join(resourcesDir, "ignoreMe.txt")).doesNotExist() - }, - expectedContents: platform === Platform.WINDOWS ? pathSorter(expectedWinContents.concat( - winDirPrefix + "bar/hello.txt", - winDirPrefix + "bar/x64.txt", - winDirPrefix + "foo/nameWithoutDot", - winDirPrefix + "platformSpecificR", - winDirPrefix + "win/x64.txt" - )) : null, - }) - } }) \ No newline at end of file diff --git a/test/src/helpers/avaEx.ts b/test/src/helpers/avaEx.ts deleted file mode 100644 index 04503f644b6..00000000000 --- a/test/src/helpers/avaEx.ts +++ /dev/null @@ -1,67 +0,0 @@ -import test from "ava-tf" - -/* tslint:disable:no-invalid-this no-namespace */ - -declare module "ava-tf" { - namespace test { - export const ifNotWindows: typeof test - export const ifOsx: typeof test - export const ifNotCi: typeof test - export const ifCi: typeof test - export const ifNotCiOsx: typeof test - export const ifDevOrWinCi: typeof test - export const ifWinCi: typeof test - export const ifDevOrLinuxCi: typeof test - export const ifNotTravis: typeof test - } -} - -Object.defineProperties(test, { - "ifNotWindows": { - get: function () { - return process.platform === "win32" ? this.skip : this - } - }, - "ifNotCi": { - get: function () { - return process.env.CI ? this.skip : this - } - }, - "ifCi": { - get: function () { - return process.env.CI ? this : this.skip - } - }, - "ifNotCiOsx": { - get: function () { - return process.env.CI && process.platform === "darwin" ? this.skip : this - } - }, - "ifNotTravis": { - get: function () { - return process.env.TRAVIS ? this.skip : this - } - }, - "ifOsx": { - get: function () { - return process.platform === "darwin" ? this : this.skip - } - }, - "ifDevOrWinCi": { - get: function () { - return process.env.CI == null || process.platform === "win32" ? this : this.skip - } - }, - "ifDevOrLinuxCi": { - get: function () { - return process.env.CI == null || process.platform === "linux" ? this : this.skip - } - }, - "ifWinCi": { - get: function () { - return (process.env.CI || "").toLowerCase() === "true" && process.platform === "win32" ? this : this.skip - } - } -}) - -export default test \ No newline at end of file diff --git a/test/src/helpers/checkDeps.ts b/test/src/helpers/checkDeps.ts index 1263c395bc1..5dba7087f24 100644 --- a/test/src/helpers/checkDeps.ts +++ b/test/src/helpers/checkDeps.ts @@ -7,13 +7,14 @@ const printErrorAndExit = require("../../../out/util/promise").printErrorAndExit const knownUnusedDevDependencies = new Set([ "@develar/types", - "ava-tf", + "jest-cli", "decompress-zip", "diff", "husky", "json8", "path-sort", "typescript", + "tslint", "depcheck" ]) diff --git a/test/src/helpers/expectedContents.ts b/test/src/helpers/expectedContents.ts index 5c190a879fa..ddf3598f11b 100755 --- a/test/src/helpers/expectedContents.ts +++ b/test/src/helpers/expectedContents.ts @@ -11,11 +11,11 @@ export const expectedLinuxContents = ["/", "/opt/TestApp/icudtl.dat", "/opt/TestApp/libffmpeg.so", "/opt/TestApp/libnode.so", - "/opt/TestApp/LICENSE", + "/opt/TestApp/LICENSE.electron.txt", "/opt/TestApp/LICENSES.chromium.html", "/opt/TestApp/natives_blob.bin", "/opt/TestApp/snapshot_blob.bin", - "/opt/TestApp/TestApp", + "/opt/TestApp/testapp", "/opt/TestApp/ui_resources_200_percent.pak", "/opt/TestApp/views_resources_200_percent.pak", "/usr/share/", @@ -67,7 +67,7 @@ export const expectedWinContents = [ "lib/net45/icudtl.dat", "lib/net45/libEGL.dll", "lib/net45/libGLESv2.dll", - "lib/net45/LICENSE", + "lib/net45/LICENSE.electron.txt", "lib/net45/LICENSES.chromium.html", "lib/net45/natives_blob.bin", "lib/net45/node.dll", @@ -96,7 +96,7 @@ export const nsisPerMachineInstall = pathSorter([ "Program Files/TestApp/1.1.0/icudtl.dat", "Program Files/TestApp/1.1.0/libEGL.dll", "Program Files/TestApp/1.1.0/libGLESv2.dll", - "Program Files/TestApp/1.1.0/LICENSE", + "Program Files/TestApp/1.1.0/LICENSE.electron.txt", "Program Files/TestApp/1.1.0/LICENSES.chromium.html", "Program Files/TestApp/1.1.0/locales", "Program Files/TestApp/1.1.0/natives_blob.bin", diff --git a/test/src/helpers/fileAssert.ts b/test/src/helpers/fileAssert.ts index a1a4dc88d75..728f1bc2b56 100644 --- a/test/src/helpers/fileAssert.ts +++ b/test/src/helpers/fileAssert.ts @@ -1,4 +1,4 @@ -import { stat, Stats } from "fs-extra-p" +import { stat, Stats, access } from "fs-extra-p" import * as json8 from "json8" import { green, red, gray } from "chalk" import { diffJson } from "diff" @@ -26,24 +26,10 @@ class Assertions { compare(this.actual, expected) } - isNotEqualTo(expected: any) { - compare(this.actual, expected, true) - } - isNotEmpty() { compare(this.actual, "", true) } - isNotNull() { - compare(this.actual, null, true) - } - - doesNotMatch(pattern: RegExp) { - if ((this.actual).match(pattern)) { - throw new Error(`${this.actual} matches ${pattern}`) - } - } - containsAll(expected: Iterable) { compare(this.actual.slice().sort(), Array.from(expected).slice().sort()) } @@ -80,7 +66,7 @@ class Assertions { async doesNotExist() { try { - await stat(this.actual) + await access(this.actual) } catch (e) { return @@ -88,6 +74,26 @@ class Assertions { throw new Error(`Path ${this.actual} must not exist`) } + + async throws(error: string | RegExp) { + let actualError: Error | null + let result: any + try { + result = await this.actual + } + catch (e) { + actualError = e + } + + expect(() => { + if (actualError == null) { + return result + } + else { + throw actualError + } + }).toThrowError(error) + } } export function prettyDiff(actual: any, expected: any): string { diff --git a/test/src/helpers/packTester.ts b/test/src/helpers/packTester.ts index 6735ea53739..faffeca7d44 100755 --- a/test/src/helpers/packTester.ts +++ b/test/src/helpers/packTester.ts @@ -1,4 +1,4 @@ -import { copy, emptyDir, remove, writeJson, readJson, readFile } from "fs-extra-p" +import { copy, emptyDir, remove, writeJson, readJson, readFile, mkdir } from "fs-extra-p" import { assertThat } from "./fileAssert" import * as path from "path" import { parse as parsePlist } from "plist" @@ -14,9 +14,18 @@ import DecompressZip from "decompress-zip" import { convertVersion } from "out/targets/squirrelPack" import { TEST_DIR } from "./config" import { deepAssign } from "out/util/deepAssign" -import { AssertContext } from "ava-tf" import { SquirrelWindowsOptions } from "out/options/winOptions" import { spawn } from "out/util/util" +import { SignOptions } from "out/windowsCodeSign" +import { BuildInfo } from "out/platformPackager" +import { WinPackager } from "out/winPackager" +import SquirrelWindowsTarget from "out/targets/squirrelWindows" +import { DmgTarget } from "out/targets/dmg" +import { MacOptions } from "out/options/macOptions" +import OsXPackager from "out/macPackager" +import { SignOptions as MacSignOptions } from "electron-macos-sign" +import { MacOsTargetName } from "out/options/macOptions" +import { getTempName } from "out/util/util" if (process.env.TRAVIS !== "true") { process.env.CIRCLE_BUILD_NUM = 42 @@ -44,13 +53,19 @@ interface PackedContext { readonly getResources: (platform: Platform, arch?: Arch) => string readonly getContent: (platform: Platform) => string + + readonly packager: Packager } let tmpDirCounter = 0 const testDir = path.join(TEST_DIR, process.pid.toString(16)) export function appThrows(error: RegExp, packagerOptions: PackagerOptions, checkOptions: AssertPackOptions = {}) { - return (t: AssertContext) => t.throws(assertPack("test-app-one", packagerOptions, checkOptions), error) + return () => assertThat(assertPack("test-app-one", packagerOptions, checkOptions)).throws(error) +} + +export function appTwoThrows(error: string | RegExp, packagerOptions: PackagerOptions, checkOptions: AssertPackOptions = {}) { + return () => assertThat(assertPack("test-app", packagerOptions, checkOptions)).throws(error) } export function app(packagerOptions: PackagerOptions, checkOptions: AssertPackOptions = {}) { @@ -109,7 +124,7 @@ export async function assertPack(fixtureName: string, packagerOptions: PackagerO } const outDir = useTempDir ? path.join(projectDir, OUT_DIR_NAME) : dirToDelete - await packAndCheck(outDir, Object.assign({ + const packager = await packAndCheck(outDir, Object.assign({ projectDir: projectDir, }, packagerOptions), checkOptions) @@ -118,11 +133,12 @@ export async function assertPack(fixtureName: string, packagerOptions: PackagerO return path.join(outDir, `${platform.buildConfigurationKey}${getArchSuffix(arch == null ? Arch.x64 : arch)}${platform === Platform.MAC ? "" : "-unpacked"}`) } - await checkOptions.packed({ - projectDir: projectDir, - outDir: outDir, - getResources: (platform, arch) => path.join(base(platform, arch), "resources"), - getContent: platform => base(platform), + await checkOptions.packed({ + projectDir: projectDir, + outDir: outDir, + getResources: (platform, arch) => path.join(base(platform, arch), "resources"), + getContent: platform => base(platform), + packager: packager, }) } } @@ -142,7 +158,7 @@ export function getTestAsset(file: string) { return path.join(__dirname, "..", "..", "fixtures", file) } -async function packAndCheck(outDir: string, packagerOptions: PackagerOptions, checkOptions: AssertPackOptions): Promise { +async function packAndCheck(outDir: string, packagerOptions: PackagerOptions, checkOptions: AssertPackOptions): Promise { const packager = new Packager(packagerOptions) const artifacts: Map> = new Map() @@ -159,7 +175,7 @@ async function packAndCheck(outDir: string, packagerOptions: PackagerOptions, ch const platformToTarget = await packager.build() if (packagerOptions.platformPackagerFactory != null || packagerOptions.effectiveOptionComputed != null) { - return + return packager } c: for (let [platform, archToType] of packagerOptions.targets) { @@ -180,6 +196,8 @@ async function packAndCheck(outDir: string, packagerOptions: PackagerOptions, ch } } } + + return packager } async function checkLinuxResult(outDir: string, packager: Packager, checkOptions: AssertPackOptions, artifacts: Array, arch: Arch, nameToTarget: Map) { @@ -220,10 +238,10 @@ async function checkLinuxResult(outDir: string, packager: Packager, checkOptions } })) - const packageFile = `${outDir}/TestApp_${appInfo.version}_${arch === Arch.ia32 ? "ia32" : (arch === Arch.x64 ? "amd64" : "armv7l")}.deb` - assertThat(await getContents(packageFile)).isEqualTo(expectedContents) + const packageFile = `${outDir}/TestApp_${appInfo.version}_${arch === Arch.ia32 ? "i386" : (arch === Arch.x64 ? "amd64" : "armv7l")}.deb` + expect(await getContents(packageFile)).toEqual(expectedContents) if (arch === Arch.ia32) { - assertThat(await getContents(`${outDir}/TestApp_${appInfo.version}_i386.deb`)).isEqualTo(expectedContents) + expect(await getContents(`${outDir}/TestApp_${appInfo.version}_i386.deb`)).toEqual(expectedContents) } assertThat(parseDebControl(await exec("dpkg", ["--info", packageFile]))).hasProperties({ @@ -270,20 +288,20 @@ async function checkOsXResult(packager: Packager, packagerOptions: PackagerOptio if (packagerOptions.cscLink != null) { const result = await exec("codesign", ["--verify", packedAppDir]) - assertThat(result).doesNotMatch(/is not signed at all/) + expect(result).not.toMatch(/is not signed at all/) } const actualFiles = artifacts.map(it => path.basename(it.file)).sort() if (checkOptions != null && checkOptions.expectedContents != null) { - assertThat(actualFiles).isEqualTo(checkOptions.expectedContents) + expect(actualFiles).toEqual(checkOptions.expectedContents) } else { - assertThat(actualFiles).isEqualTo([ + expect(actualFiles).toEqual([ `${appInfo.productFilename}-${appInfo.version}-mac.zip`, `${appInfo.productFilename}-${appInfo.version}.dmg`, ].sort()) - assertThat(artifacts.map(it => it.artifactName).sort()).isEqualTo([ + expect(artifacts.map(it => it.artifactName).sort()).toEqual([ `TestApp-${appInfo.version}-mac.zip`, `TestApp-${appInfo.version}.dmg`, ].sort()) @@ -339,7 +357,7 @@ async function checkWindowsResult(packager: Packager, checkOptions: AssertPackOp // console.log(JSON.stringify(files, null, 2)) const expectedContents = checkOptions == null || checkOptions.expectedContents == null ? expectedWinContents : checkOptions.expectedContents - assertThat(files).isEqualTo(pathSorter(expectedContents.map(it => { + expect(files).toEqual(pathSorter(expectedContents.map(it => { if (it === "lib/net45/TestApp.exe") { if (appInfo.productFilename === "Test App ßW") { return `lib/net45/Test%20App%20%C3%9FW.exe` @@ -357,7 +375,7 @@ async function checkWindowsResult(packager: Packager, checkOptions: AssertPackOp }) const expectedSpec = (await readFile(path.join(path.dirname(packageFile), "TestApp.nuspec"), "utf8")).replace(/\r\n/g, "\n") // console.log(expectedSpec) - assertThat(expectedSpec).isEqualTo(` + expect(expectedSpec).toEqual(` TestApp @@ -414,9 +432,7 @@ export function signed(packagerOptions: PackagerOptions): PackagerOptions { export function getPossiblePlatforms(type?: string): Map> { const platforms = [Platform.fromString(process.platform)] if (process.platform === Platform.MAC.nodeName) { - if (process.env.LINUX_SKIP == null) { - platforms.push(Platform.LINUX) - } + platforms.push(Platform.LINUX) if (process.env.CI == null) { platforms.push(Platform.WINDOWS) } @@ -425,4 +441,99 @@ export function getPossiblePlatforms(type?: string): Map, postAsyncTasks: Array>): Promise { + // skip pack + const helperClass: typeof SquirrelWindowsTarget = require("out/targets/squirrelWindows").default + this.effectiveDistOptions = await (new helperClass(this).computeEffectiveDistOptions()) + + await this.sign(this.computeAppOutDir(outDir, arch)) + } + + packageInDistributableFormat(appOutDir: string, arch: Arch, targets: Array, promises: Array>): void { + // skip + } + + protected async doSign(opts: SignOptions): Promise { + this.signOptions = opts + } +} + +export class CheckingMacPackager extends OsXPackager { + effectiveDistOptions: any + effectiveSignOptions: MacSignOptions + + constructor(info: BuildInfo) { + super(info) + } + + async pack(outDir: string, arch: Arch, targets: Array, postAsyncTasks: Array>): Promise { + for (let target of targets) { + // do not use instanceof to avoid dmg require + if (target.name === "dmg") { + this.effectiveDistOptions = await (target).computeDmgOptions() + break + } + } + // http://madole.xyz/babel-plugin-transform-async-to-module-method-gotcha/ + return await OsXPackager.prototype.pack.call(this, outDir, arch, targets, postAsyncTasks) + } + + async doPack(outDir: string, appOutDir: string, platformName: string, arch: Arch, customBuildOptions: MacOptions, postAsyncTasks: Array> = null) { + // skip + } + + async doSign(opts: MacSignOptions): Promise { + this.effectiveSignOptions = opts + } + + async doFlat(appPath: string, outFile: string, identity: string, keychain?: string | null): Promise { + // skip + } + + packageInDistributableFormat(appOutDir: string, arch: Arch, targets: Array, promises: Array>): void { + // skip + } +} + +export function createMacTargetTest(target: Array, expectedContents: Array) { + return app({ + targets: Platform.MAC.createTarget(), + devMetadata: { + build: { + mac: { + target: target, + } + } + } + }, { + useTempDir: true, + expectedContents: expectedContents, + signed: target.includes("mas") || target.includes("pkg"), + packed: async (context) => { + if (!target.includes("tar.gz")) { + return + } + + const tempDir = path.join(context.outDir, getTempName()) + await mkdir(tempDir) + await exec("tar", ["xf", path.join(context.outDir, "mac", "Test App ßW-1.1.0-mac.tar.gz")], {cwd: tempDir}) + await assertThat(path.join(tempDir, "Test App ßW.app")).isDirectory() + } + }) +} + +export function allPlatforms(dist: boolean = true): PackagerOptions { + return { + targets: getPossiblePlatforms(dist ? null : DIR_TARGET), + } } \ No newline at end of file diff --git a/test/src/helpers/runTests.ts b/test/src/helpers/runTests.ts index b8eb6fec65f..860680c96ab 100755 --- a/test/src/helpers/runTests.ts +++ b/test/src/helpers/runTests.ts @@ -1,17 +1,14 @@ import * as path from "path" import BluebirdPromise from "bluebird-lst-c" -import { emptyDir, readdir, unlink, removeSync } from "fs-extra-p" -import { cpus, homedir } from "os" +import { emptyDir, readdir, unlink, removeSync, readJson } from "fs-extra-p" +import { homedir } from "os" import { TEST_DIR, ELECTRON_VERSION } from "./config" // we set NODE_PATH in this file, so, we cannot use 'out/awaiter' path here const util = require("../../../out/util/util") -const utilSpawn = util.spawn const isEmptyOrSpaces = util.isEmptyOrSpaces -const downloadElectron: (options: any) => Promise = BluebirdPromise.promisify(require("electron-download")) - -const rootDir = path.join(__dirname, "..", "..", "..") +const downloadElectron: (options: any) => Promise = BluebirdPromise.promisify(require("electron-download-tf")) async function main() { const testDir = TEST_DIR @@ -21,15 +18,12 @@ async function main() { emptyDir(testDir), ]) - process.on("SIGINT", () => { - removeSync(testDir) - }) - try { - await runTests() - } - finally { + const exitHandler = () => { removeSync(testDir) } + process.on("SIGINT", exitHandler) + process.on("exit", exitHandler) + await runTests() } main() @@ -88,23 +82,15 @@ function downloadAllRequiredElectronVersions(): Promise { /** * CIRCLE_NODE_INDEX=2 — test nodejs 4 (on Circle). */ -function runTests(): BluebirdPromise { - const args: Array = [] - const testFiles = process.env.TEST_FILES +async function runTests() { + const testFiles: string | null = process.env.TEST_FILES - args.push(`--concurrency=${cpus().length}`) - - if (process.env.FAIL_FAST === "true") { - args.push("--fail-fast") - } - - const baseDir = path.join("test", "out") - const baseForLinuxTests = [path.join(baseDir, "ArtifactPublisherTest.js"), path.join(baseDir, "httpRequestTest.js"), path.join(baseDir, "RepoSlugTest.js")] + const args = [] + const baseForLinuxTests = ["ArtifactPublisherTest.js", "httpRequestTest.js", "RepoSlugTest.js"] let skipWin = false if (!isEmptyOrSpaces(testFiles)) { - args.push(...testFiles.split(",").map((it: string) => path.join(baseDir, it.trim() + ".js"))) + args.push(...testFiles.split(",").map(it => `${it.trim()}.js`)) if (process.platform === "linux") { - // test it only on Linux in any case args.push(...baseForLinuxTests) } } @@ -112,31 +98,35 @@ function runTests(): BluebirdPromise { const circleNodeIndex = parseInt(process.env.CIRCLE_NODE_INDEX, 10) if (circleNodeIndex === 0 || circleNodeIndex === 2) { skipWin = true - args.push(path.join(baseDir, "linuxPackagerTest.js"), path.join(baseDir, "BuildTest.js"), path.join(baseDir, "globTest.js")) + args.push("linux.*", "BuildTest.js", "extraMetadataTest.js", "mainEntryTest.js", "globTest.js", "filesTest.js", "ignoreTest.js") } else { - args.push(path.join(baseDir, "winPackagerTest.js"), path.join(baseDir, "nsisTest.js"), path.join(baseDir, "macPackagerTest.js")) + args.push("windows.*", "mac.*") args.push(...baseForLinuxTests) } console.log(`Test files for node ${circleNodeIndex}: ${args.join(", ")}`) } - else if (process.platform === "win32") { - args.push("test/out/*.js", "!test/out/macPackagerTest.js", "!test/out/linuxPackagerTest.js", "!test/out/CodeSignTest.js", "!test/out/ArtifactPublisherTest.js", "!test/out/httpRequestTest.js") - } - else if (!util.isCi()) { - args.push("test/out/*.js", "!test/out/httpRequestTest.js") - } - console.log(args) - return utilSpawn(path.join(rootDir, "node_modules", ".bin", "ava"), args, { - cwd: rootDir, - env: Object.assign({}, process.env, { - NODE_PATH: rootDir, - SKIP_WIN: skipWin, - CSC_IDENTITY_AUTO_DISCOVERY: "false", - TEST_DIR: TEST_DIR, - }), - shell: process.platform === "win32", - stdio: "inherit" + process.env.SKIP_WIN = skipWin + process.env.CSC_IDENTITY_AUTO_DISCOVERY = "false" + process.env.TEST_DIR = TEST_DIR + + const rootDir = path.join(__dirname, "..", "..", "..") + + const config = (await readJson(path.join(rootDir, "package.json"))).jest + // use custom cache dir to avoid https://github.com/facebook/jest/issues/1903#issuecomment-261212137 + config.cacheDirectory = process.env.JEST_CACHE_DIR || "/tmp/jest-electron-builder-tests" + // no need to transform — compiled before + config.transformIgnorePatterns = [".*"] + + require("jest-cli").runCLI({ + verbose: true, + config: config, + bail: process.env.TEST_BAIL === "true", + runInBand: process.env.RUN_IN_BAND === "true", + testPathPattern: args.length > 0 ? args.join("|") : null, + }, rootDir, (result: any) => { + const code = !result || result.success ? 0 : 1 + process.on("exit", () => process.exit(code)) }) } diff --git a/test/src/httpRequestTest.ts b/test/src/httpRequestTest.ts index ae63a06339b..3f9b30f537f 100644 --- a/test/src/httpRequestTest.ts +++ b/test/src/httpRequestTest.ts @@ -1,12 +1,11 @@ -import test from "./helpers/avaEx" import { download } from "out/util/httpRequest" import { tmpdir } from "os" import { randomBytes } from "crypto" import { assertThat } from "./helpers/fileAssert" import * as path from "path" -test("download to nonexistent dir", () => { +test.ifDevOrLinuxCi("download to nonexistent dir", async () => { const tempFile = path.join(tmpdir(), `${process.pid}-${randomBytes(8).toString("hex")}`, Date.now().toString(), "foo.txt") - return download("https://drive.google.com/uc?export=download&id=0Bz3JwZ-jqfRONTkzTGlsMkM2TlE", tempFile) - .then(() => assertThat(tempFile).isFile()) + await download("https://drive.google.com/uc?export=download&id=0Bz3JwZ-jqfRONTkzTGlsMkM2TlE", tempFile) + await assertThat(tempFile).isFile() }) \ No newline at end of file diff --git a/test/src/ignoreTest.ts b/test/src/ignoreTest.ts new file mode 100644 index 00000000000..baae0184c56 --- /dev/null +++ b/test/src/ignoreTest.ts @@ -0,0 +1,82 @@ +import { outputFile } from "fs-extra-p" +import { assertPack, modifyPackageJson, app } from "./helpers/packTester" +import BluebirdPromise from "bluebird-lst-c" +import * as path from "path" +import { assertThat } from "./helpers/fileAssert" +import { Platform, DIR_TARGET } from "out" + +test.ifDevOrLinuxCi("ignore build resources", app({ + targets: Platform.LINUX.createTarget(DIR_TARGET), + devMetadata: { + build: { + asar: false + } + } +}, { + projectDirCreated: projectDir => { + return outputFile(path.join(projectDir, "one/build/foo.txt"), "data") + }, + packed: context => { + return assertThat(path.join(context.getResources(Platform.LINUX), "app", "one", "build", "foo.txt")).isFile() + }, +})) + +test.ifDevOrLinuxCi("ignore known ignored files", app({ + targets: Platform.LINUX.createTarget(DIR_TARGET), + devMetadata: { + build: { + asar: false + } + } +}, { + projectDirCreated: projectDir => BluebirdPromise.all([ + outputFile(path.join(projectDir, ".svn", "foo"), "data"), + outputFile(path.join(projectDir, ".git", "foo"), "data"), + outputFile(path.join(projectDir, "foo", "bar", "f.o"), "data"), + outputFile(path.join(projectDir, "node_modules", ".bin", "f.txt"), "data"), + outputFile(path.join(projectDir, "node_modules", ".bin2", "f.txt"), "data"), + ]), + packed: context => BluebirdPromise.all([ + assertThat(path.join(context.getResources(Platform.LINUX), "app", ".svn")).doesNotExist(), + assertThat(path.join(context.getResources(Platform.LINUX), "app", ".git")).doesNotExist(), + assertThat(path.join(context.getResources(Platform.LINUX), "app", "foo", "bar", "f.o")).doesNotExist(), + assertThat(path.join(context.getResources(Platform.LINUX), "app", "node_modules", ".bin")).doesNotExist(), + assertThat(path.join(context.getResources(Platform.LINUX), "app", "node_modules", ".bin")).doesNotExist(), + assertThat(path.join(context.getResources(Platform.LINUX), "app", "node_modules", ".bin2")).isDirectory() + ]), +})) + +// skip on macOS because we want test only / and \ +test.ifNotCiMac("ignore node_modules dev dep", () => { + const build: any = { + asar: false, + ignore: (file: string) => { + return file === "/ignoreMe" + } + } + + return assertPack("test-app-one", { + targets: Platform.LINUX.createTarget(DIR_TARGET), + devMetadata: { + build: build + } + }, { + projectDirCreated: projectDir => { + return BluebirdPromise.all([ + modifyPackageJson(projectDir, data => { + data.devDependencies = Object.assign({ + "electron-macos-sign": "*", + }, data.devDependencies) + }), + outputFile(path.join(projectDir, "node_modules", "electron-macos-sign", "package.json"), "{}"), + outputFile(path.join(projectDir, "ignoreMe"), ""), + ]) + }, + packed: context => { + return BluebirdPromise.all([ + assertThat(path.join(context.getResources(Platform.LINUX), "app", "node_modules", "electron-macos-sign")).doesNotExist(), + assertThat(path.join(context.getResources(Platform.LINUX), "app", "ignoreMe")).doesNotExist(), + ]) + }, + }) +}) \ No newline at end of file diff --git a/test/src/linux/debTest.ts b/test/src/linux/debTest.ts new file mode 100644 index 00000000000..5a20d27f3bc --- /dev/null +++ b/test/src/linux/debTest.ts @@ -0,0 +1,20 @@ +import { Platform, Arch } from "out" +import { app } from "../helpers/packTester" + +test.ifNotWindows("deb", app({targets: Platform.LINUX.createTarget("deb")})) + +test.ifNotWindows("arm deb", app({targets: Platform.LINUX.createTarget("deb", Arch.armv7l)})) + +test.ifNotWindows("custom depends", app({ + targets: Platform.LINUX.createTarget("deb"), + devMetadata: { + build: { + deb: { + depends: ["foo"], + } + } + } + }, + { + expectedDepends: "foo" + })) \ No newline at end of file diff --git a/test/src/linux/fpmTest.ts b/test/src/linux/fpmTest.ts new file mode 100644 index 00000000000..3928d80ef2d --- /dev/null +++ b/test/src/linux/fpmTest.ts @@ -0,0 +1,9 @@ +// "apk" is very slow, don't test for now +import { Platform } from "out" +import { app } from "../helpers/packTester" + +test.ifDevOrLinuxCi("targets", app({targets: Platform.LINUX.createTarget(["sh", "freebsd", "pacman", "zip", "7z"])})) + +// https://github.com/electron-userland/electron-builder/issues/460 +// for some reasons in parallel to fmp we cannot use tar +test.ifDevOrLinuxCi("rpm and tar.gz", app({targets: Platform.LINUX.createTarget(["rpm", "tar.gz"])})) \ No newline at end of file diff --git a/test/src/linux/linuxArchiveTest.ts b/test/src/linux/linuxArchiveTest.ts new file mode 100644 index 00000000000..ef321459279 --- /dev/null +++ b/test/src/linux/linuxArchiveTest.ts @@ -0,0 +1,4 @@ +import { Platform } from "out" +import { app } from "../helpers/packTester" + +test.ifDevOrLinuxCi("tar", app({targets: Platform.LINUX.createTarget(["tar.xz", "tar.lz", "tar.bz2"])})) \ No newline at end of file diff --git a/test/src/linux/linuxPackagerTest.ts b/test/src/linux/linuxPackagerTest.ts new file mode 100755 index 00000000000..803e6c3aa62 --- /dev/null +++ b/test/src/linux/linuxPackagerTest.ts @@ -0,0 +1,31 @@ +import { modifyPackageJson, app, appThrows } from "../helpers/packTester" +import { remove } from "fs-extra-p" +import * as path from "path" +import { Platform } from "out" + +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: { + build: { + linux: { + executableName: "foo", + } + } + } +}, { + projectDirCreated: projectDir => remove(path.join(projectDir, "build")) +})) + +test.ifNotWindows("icons from ICNS", app({targets: Platform.LINUX.createTarget()}, { + projectDirCreated: it => remove(path.join(it, "build", "icons")) +})) + +test.ifNotWindows("no-author-email", appThrows(/Please specify author 'email' in .+/, {targets: Platform.LINUX.createTarget("deb")}, { + projectDirCreated: projectDir => modifyPackageJson(projectDir, data => { + data.author = "Foo" + }) +})) \ No newline at end of file diff --git a/test/src/linuxPackagerTest.ts b/test/src/linuxPackagerTest.ts deleted file mode 100755 index 9a293dc7357..00000000000 --- a/test/src/linuxPackagerTest.ts +++ /dev/null @@ -1,58 +0,0 @@ -import test from "./helpers/avaEx" -import { modifyPackageJson, app, appThrows } from "./helpers/packTester" -import { remove } from "fs-extra-p" -import * as path from "path" -import { Platform } from "out" -import { Arch } from "out/metadata" - -test.ifNotWindows("deb", app({targets: Platform.LINUX.createTarget("deb")})) - -test.ifNotWindows("arm deb", app({targets: Platform.LINUX.createTarget("deb", Arch.armv7l)})) - -test.ifDevOrLinuxCi("AppImage", app({targets: Platform.LINUX.createTarget()})) - -test.ifDevOrLinuxCi("AppImage - default icon", app({ - targets: Platform.LINUX.createTarget("appimage"), - devMetadata: { - build: { - linux: { - executableName: "foo", - } - } - } -}, { - projectDirCreated: projectDir => remove(path.join(projectDir, "build")) -})) - -// "apk" is very slow, don't test for now -test.ifDevOrLinuxCi("targets", app({targets: Platform.LINUX.createTarget(["sh", "freebsd", "pacman", "zip", "7z"])})) - -test.ifDevOrLinuxCi("tar", app({targets: Platform.LINUX.createTarget(["tar.xz", "tar.lz", "tar.bz2"])})) - -// https://github.com/electron-userland/electron-builder/issues/460 -// for some reasons in parallel to fmp we cannot use tar -test.ifDevOrLinuxCi("rpm and tar.gz", app({targets: Platform.LINUX.createTarget(["rpm", "tar.gz"])})) - -test.ifNotWindows("icons from ICNS", app({targets: Platform.LINUX.createTarget()}, { - projectDirCreated: it => remove(path.join(it, "build", "icons")) -})) - -test.ifNotWindows("custom depends", app({ - targets: Platform.LINUX.createTarget("deb"), - devMetadata: { - build: { - deb: { - depends: ["foo"], - } - } - } - }, - { - expectedDepends: "foo" - })) - -test.ifNotWindows("no-author-email", appThrows(/Please specify author 'email' in .+/, {targets: Platform.LINUX.createTarget("deb")}, { - projectDirCreated: projectDir => modifyPackageJson(projectDir, data => { - data.author = "Foo" - }) -})) \ No newline at end of file diff --git a/test/src/mac/CodeSignTest.ts b/test/src/mac/CodeSignTest.ts new file mode 100644 index 00000000000..a8fd5304ea5 --- /dev/null +++ b/test/src/mac/CodeSignTest.ts @@ -0,0 +1,28 @@ +import { createKeychain } from "out/codeSign" +import { assertThat } from "../helpers/fileAssert" +import { CSC_LINK } from "../helpers/codeSignData" +import { removePassword } from "out/util/util" +import { TmpDir } from "out/util/tmp" + +if (process.env.CSC_KEY_PASSWORD == null) { + fit("Skip keychain-specific tests because CSC_KEY_PASSWORD is not defined", () => { + console.warn("[SKIP] Skip keychain-specific tests because CSC_KEY_PASSWORD is not defined") + }) +} + +const tmpDir = new TmpDir() + +test.ifMac("create keychain", async () => { + const result = await createKeychain(tmpDir, CSC_LINK, process.env.CSC_KEY_PASSWORD) + assertThat(result.keychainName).isNotEmpty() +}) + +test.ifMac("create keychain with installers", async () => { + const result = await createKeychain(tmpDir, CSC_LINK, process.env.CSC_KEY_PASSWORD) + assertThat(result.keychainName).isNotEmpty() +}) + +test.ifDevOrLinuxCi("remove password from log", async () => { + expect(removePassword("seq -P foo -B")).toEqual("seq -P 2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae (sha256 hash) -B") + expect(removePassword("pass:foo")).toEqual("pass:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae (sha256 hash)") +}) \ No newline at end of file diff --git a/test/src/mac/dmgTest.ts b/test/src/mac/dmgTest.ts new file mode 100644 index 00000000000..0144a50634d --- /dev/null +++ b/test/src/mac/dmgTest.ts @@ -0,0 +1,117 @@ +import { assertPack, modifyPackageJson, app, CheckingMacPackager } from "../helpers/packTester" +import { remove, copy } from "fs-extra-p" +import * as path from "path" +import BluebirdPromise from "bluebird-lst-c" +import { assertThat } from "../helpers/fileAssert" +import { Platform } from "out" +import { attachAndExecute } from "out/targets/dmg" + +test.ifMac("no build directory", app({ + targets: Platform.MAC.createTarget("dmg"), + devMetadata: { + build: { + // dmg can mount only one volume name, so, to test in parallel, we set different product name + productName: "NoBuildDirectory", + } + } +}, { + expectedContents: ["NoBuildDirectory-1.1.0.dmg"], + projectDirCreated: projectDir => remove(path.join(projectDir, "build")) +})) + +test.ifMac("custom background - new way", () => { + let platformPackager: CheckingMacPackager = null + const customBackground = "customBackground.png" + return assertPack("test-app-one", { + targets: Platform.MAC.createTarget(), + platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingMacPackager(packager) + }, { + projectDirCreated: projectDir => BluebirdPromise.all([ + copy(path.join(__dirname, "..", "..", "..", "templates", "dmg", "background.tiff"), path.join(projectDir, customBackground)), + modifyPackageJson(projectDir, data => { + data.build.mac = { + icon: "customIcon" + } + + data.build.dmg = { + background: customBackground, + icon: "foo.icns", + } + }) + ]), + packed: async context => { + expect(platformPackager.effectiveDistOptions.background).toEqual(customBackground) + expect(platformPackager.effectiveDistOptions.icon).toEqual("foo.icns") + expect(await platformPackager.getIconPath()).toEqual(path.join(context.projectDir, "customIcon.icns")) + }, + }) +}) + +test.ifMac("unset dmg icon", app({ + targets: Platform.MAC.createTarget("dmg"), + devMetadata: { + build: { + // dmg can mount only one volume name, so, to test in parallel, we set different product name + productName: "Test ß No Volume Icon", + dmg: { + icon: null, + }, + } + } +}, { + expectedContents: ["Test ß No Volume Icon-1.1.0.dmg"], + packed: (context) => { + return attachAndExecute(path.join(context.outDir, "mac/Test ß No Volume Icon-1.1.0.dmg"), false, () => { + return BluebirdPromise.all([ + assertThat(path.join("/Volumes/Test ß No Volume Icon 1.1.0/.background/background.tiff")).isFile(), + assertThat(path.join("/Volumes/Test ß No Volume Icon 1.1.0/.VolumeIcon.icns")).doesNotExist(), + ]) + }) + } +})) + +// test also "only dmg" +test.ifMac("no background", app({ + targets: Platform.MAC.createTarget("dmg"), + devMetadata: { + build: { + // dmg can mount only one volume name, so, to test in parallel, we set different product name + productName: "NoBackground", + dmg: { + background: null, + title: "Foo", + }, + } + } +}, { + expectedContents: ["NoBackground-1.1.0.dmg"], + packed: (context) => { + return attachAndExecute(path.join(context.outDir, "mac/NoBackground-1.1.0.dmg"), false, () => { + return assertThat(path.join("/Volumes/NoBackground 1.1.0/.background")).doesNotExist() + }) + } +})) + +test.ifMac("disable dmg icon (light), bundleVersion", () => { + let platformPackager: CheckingMacPackager = null + return assertPack("test-app-one", { + targets: Platform.MAC.createTarget(), + platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingMacPackager(packager), + devMetadata: { + build: { + dmg: { + icon: null, + }, + mac: { + bundleVersion: "50" + }, + }, + } + }, { + packed: async () => { + expect(platformPackager.effectiveDistOptions.icon).toBeNull() + expect(await platformPackager.getIconPath()).not.toBeNull() + expect(platformPackager.appInfo.buildVersion).toEqual("50") + }, + }) +}) \ No newline at end of file diff --git a/test/src/mac/macArchiveTest.ts b/test/src/mac/macArchiveTest.ts new file mode 100644 index 00000000000..fb3173af19e --- /dev/null +++ b/test/src/mac/macArchiveTest.ts @@ -0,0 +1,13 @@ +import { createMacTargetTest } from "../helpers/packTester" +import { assertThat } from "../helpers/fileAssert" + +test.ifMac("invalid target", () => assertThat(createMacTargetTest(["ttt"], [])()).throws("Unknown target: ttt")) + +test("only zip", createMacTargetTest(["zip"], ["Test App ßW-1.1.0-mac.zip"])) + +test.ifMac("pkg", createMacTargetTest(["pkg"], ["Test App ßW-1.1.0.pkg"])) + +test("tar.gz", createMacTargetTest(["tar.gz"], ["Test App ßW-1.1.0-mac.tar.gz"])) + +// todo failed on Travis CI +//test("tar.xz", createTargetTest(["tar.xz"], ["Test App ßW-1.1.0-mac.tar.xz"])) \ No newline at end of file diff --git a/test/src/mac/macPackagerTest.ts b/test/src/mac/macPackagerTest.ts new file mode 100644 index 00000000000..bcbd6a26357 --- /dev/null +++ b/test/src/mac/macPackagerTest.ts @@ -0,0 +1,17 @@ +import { assertPack, platform, modifyPackageJson, app, appThrows } from "../helpers/packTester" +import { Platform, createTargets } from "out" +import { DIR_TARGET } from "out/targets/targetFactory" + +test.ifMac("two-package", () => assertPack("test-app", {targets: createTargets([Platform.MAC], null, "all")}, {signed: true, useTempDir: true})) + +test.ifMac("one-package", app(platform(Platform.MAC), {signed: true})) + +test.ifMac("electronDist", appThrows(/ENOENT: no such file or directory/, { + targets: Platform.OSX.createTarget(DIR_TARGET), +}, { + projectDirCreated: projectDir => modifyPackageJson(projectDir, data => { + data.build.electronDist = "foo" + }) +})) + +test.ifWinCi("Build macOS on Windows is not supported", appThrows(/Build for macOS is supported only on macOS.+/, platform(Platform.MAC))) \ No newline at end of file diff --git a/test/src/mac/masTest.ts b/test/src/mac/masTest.ts new file mode 100644 index 00000000000..cbfa77b664e --- /dev/null +++ b/test/src/mac/masTest.ts @@ -0,0 +1,91 @@ +import { assertPack, signed, CheckingMacPackager, createMacTargetTest } from "../helpers/packTester" +import { writeFile } from "fs-extra-p" +import * as path from "path" +import BluebirdPromise from "bluebird-lst-c" +import { assertThat } from "../helpers/fileAssert" +import { Platform } from "out" + +if (process.platform !== "darwin") { + fit("Skip mas tests because platform is not macOS", () => { + console.warn("[SKIP] Skip mas tests because platform is not macOS") + }) +} +else if (process.env.CSC_KEY_PASSWORD == null) { + fit("Skip mas tests because CSC_KEY_PASSWORD is not defined", () => { + console.warn("[SKIP] Skip mas tests because CSC_KEY_PASSWORD is not defined") + }) +} + +test("mas", createMacTargetTest(["mas"], ["Test App ßW-1.1.0.pkg"])) +test("mas and 7z", createMacTargetTest(["mas", "7z"], ["Test App ßW-1.1.0-mac.7z", "Test App ßW-1.1.0.pkg"])) + +test("custom mas", () => { + let platformPackager: CheckingMacPackager = null + return assertPack("test-app-one", signed({ + targets: Platform.MAC.createTarget(), + platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingMacPackager(packager), + devMetadata: { + build: { + mac: { + target: ["mas"], + }, + mas: { + entitlements: "mas-entitlements file path", + entitlementsInherit: "mas-entitlementsInherit file path", + } + } + } + }), { + packed: () => { + assertThat(platformPackager.effectiveSignOptions).hasProperties({ + entitlements: "mas-entitlements file path", + "entitlements-inherit": "mas-entitlementsInherit file path", + }) + return BluebirdPromise.resolve(null) + } + }) +}) + +test("entitlements in the package.json", () => { + let platformPackager: CheckingMacPackager = null + return assertPack("test-app-one", signed({ + targets: Platform.MAC.createTarget(), + platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingMacPackager(packager), + devMetadata: { + build: { + mac: { + entitlements: "osx-entitlements file path", + entitlementsInherit: "osx-entitlementsInherit file path", + } + } + } + }), { + packed: () => { + assertThat(platformPackager.effectiveSignOptions).hasProperties({ + entitlements: "osx-entitlements file path", + "entitlements-inherit": "osx-entitlementsInherit file path", + }) + return BluebirdPromise.resolve() + } + }) +}) + +test("entitlements in build dir", () => { + let platformPackager: CheckingMacPackager = null + return assertPack("test-app-one", signed({ + targets: Platform.MAC.createTarget(), + platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingMacPackager(packager), + }), { + projectDirCreated: projectDir => BluebirdPromise.all([ + writeFile(path.join(projectDir, "build", "entitlements.mac.plist"), ""), + writeFile(path.join(projectDir, "build", "entitlements.mac.inherit.plist"), ""), + ]), + packed: context => { + assertThat(platformPackager.effectiveSignOptions).hasProperties({ + entitlements: path.join(context.projectDir, "build", "entitlements.mac.plist"), + "entitlements-inherit": path.join(context.projectDir, "build", "entitlements.mac.inherit.plist"), + }) + return BluebirdPromise.resolve() + } + }) +}) diff --git a/test/src/macPackagerTest.ts b/test/src/macPackagerTest.ts deleted file mode 100644 index f0b20c54b5f..00000000000 --- a/test/src/macPackagerTest.ts +++ /dev/null @@ -1,285 +0,0 @@ -import test from "./helpers/avaEx" -import { assertPack, platform, modifyPackageJson, signed, app, appThrows } from "./helpers/packTester" -import OsXPackager from "out/macPackager" -import { writeFile, remove, copy, mkdir } from "fs-extra-p" -import * as path from "path" -import { BuildInfo } from "out/platformPackager" -import BluebirdPromise from "bluebird-lst-c" -import { assertThat } from "./helpers/fileAssert" -import { Platform, MacOptions, createTargets } from "out" -import { SignOptions } from "electron-macos-sign" -import { Arch } from "out" -import { Target } from "out/platformPackager" -import { DmgTarget } from "out/targets/dmg" -import { DIR_TARGET } from "out/targets/targetFactory" -import { attachAndExecute } from "out/targets/dmg" -import { getTempName } from "out/util/util" -import { exec } from "out/util/util" -import { MacOsTargetName } from "out/options/macOptions" - -test.ifOsx("two-package", () => assertPack("test-app", {targets: createTargets([Platform.MAC], null, "all")}, {signed: true, useTempDir: true})) - -test.ifOsx("one-package", app(platform(Platform.MAC), {signed: true})) - -function createTargetTest(target: Array, expectedContents: Array) { - return app({ - targets: Platform.MAC.createTarget(), - devMetadata: { - build: { - mac: { - target: target, - } - } - } - }, { - useTempDir: true, - expectedContents: expectedContents, - signed: target.includes("mas") || target.includes("pkg"), - packed: async (context) => { - if (!target.includes("tar.gz")) { - return - } - - const tempDir = path.join(context.outDir, getTempName()) - await mkdir(tempDir) - await exec("tar", ["xf", path.join(context.outDir, "mac", "Test App ßW-1.1.0-mac.tar.gz")], {cwd: tempDir}) - await assertThat(path.join(tempDir, "Test App ßW.app")).isDirectory() - } - }) -} - -test("only zip", createTargetTest(["zip"], ["Test App ßW-1.1.0-mac.zip"])) - -test.ifOsx("pkg", createTargetTest(["pkg"], ["Test App ßW-1.1.0.pkg"])) - -test("tar.gz", createTargetTest(["tar.gz"], ["Test App ßW-1.1.0-mac.tar.gz"])) - -// todo failed on Travis CI -//test("tar.xz", createTargetTest(["tar.xz"], ["Test App ßW-1.1.0-mac.tar.xz"])) - -test.ifOsx("invalid target", t => t.throws(createTargetTest(["ttt"], [])(), "Unknown target: ttt")) - -if (process.env.CSC_KEY_PASSWORD == null || process.platform !== "darwin") { - console.warn("Skip mas tests because CSC_KEY_PASSWORD is not defined") -} -else { - test.ifOsx("mas", createTargetTest(["mas"], ["Test App ßW-1.1.0.pkg"])) - test.ifOsx("mas and 7z", createTargetTest(["mas", "7z"], ["Test App ßW-1.1.0-mac.7z", "Test App ßW-1.1.0.pkg"])) - - test.ifOsx("custom mas", () => { - let platformPackager: CheckingMacPackager = null - return assertPack("test-app-one", signed({ - targets: Platform.MAC.createTarget(), - platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingMacPackager(packager), - devMetadata: { - build: { - mac: { - target: ["mas"], - }, - mas: { - entitlements: "mas-entitlements file path", - entitlementsInherit: "mas-entitlementsInherit file path", - } - } - } - }), { - packed: () => { - assertThat(platformPackager.effectiveSignOptions).hasProperties({ - entitlements: "mas-entitlements file path", - "entitlements-inherit": "mas-entitlementsInherit file path", - }) - return BluebirdPromise.resolve(null) - } - }) - }) - - test.ifOsx("entitlements in the package.json", () => { - let platformPackager: CheckingMacPackager = null - return assertPack("test-app-one", signed({ - targets: Platform.MAC.createTarget(), - platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingMacPackager(packager), - devMetadata: { - build: { - mac: { - entitlements: "osx-entitlements file path", - entitlementsInherit: "osx-entitlementsInherit file path", - } - } - } - }), { - packed: () => { - assertThat(platformPackager.effectiveSignOptions).hasProperties({ - entitlements: "osx-entitlements file path", - "entitlements-inherit": "osx-entitlementsInherit file path", - }) - return BluebirdPromise.resolve() - } - }) - }) - - test.ifOsx("entitlements in build dir", () => { - let platformPackager: CheckingMacPackager = null - return assertPack("test-app-one", signed({ - targets: Platform.MAC.createTarget(), - platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingMacPackager(packager), - }), { - projectDirCreated: projectDir => BluebirdPromise.all([ - writeFile(path.join(projectDir, "build", "entitlements.mac.plist"), ""), - writeFile(path.join(projectDir, "build", "entitlements.mac.inherit.plist"), ""), - ]), - packed: context => { - assertThat(platformPackager.effectiveSignOptions).hasProperties({ - entitlements: path.join(context.projectDir, "build", "entitlements.mac.plist"), - "entitlements-inherit": path.join(context.projectDir, "build", "entitlements.mac.inherit.plist"), - }) - return BluebirdPromise.resolve() - } - }) - }) -} - -// test also "only dmg" -test.ifOsx("no background", app({ - targets: Platform.MAC.createTarget("dmg"), - devMetadata: { - build: { - // dmg can mount only one volume name, so, to test in parallel, we set different product name - productName: "Test ß", - dmg: { - background: null, - title: "Foo", - }, - } - } -}, { - expectedContents: ["Test ß-1.1.0.dmg"], - packed: (context) => { - return attachAndExecute(path.join(context.outDir, "mac/Test ß-1.1.0.dmg"), false, () => { - return assertThat(path.join("/Volumes/Test ß 1.1.0/.background")).doesNotExist() - }) - } -})) - -test.ifOsx("unset dmg icon", app({ - targets: Platform.MAC.createTarget("dmg"), - devMetadata: { - build: { - // dmg can mount only one volume name, so, to test in parallel, we set different product name - productName: "Test ß No Volume Icon", - dmg: { - icon: null, - }, - } - } -}, { - expectedContents: ["Test ß No Volume Icon-1.1.0.dmg"], - packed: (context) => { - return attachAndExecute(path.join(context.outDir, "mac/Test ß No Volume Icon-1.1.0.dmg"), false, () => { - return BluebirdPromise.all([ - assertThat(path.join("/Volumes/Test ß No Volume Icon 1.1.0/.background/background.tiff")).isFile(), - assertThat(path.join("/Volumes/Test ß No Volume Icon 1.1.0/.VolumeIcon.icns")).doesNotExist(), - ]) - }) - } -})) - -test.ifOsx("no build directory", app(platform(Platform.MAC), { - projectDirCreated: projectDir => remove(path.join(projectDir, "build")) -})) - -test.ifOsx("custom background - new way", () => { - let platformPackager: CheckingMacPackager = null - const customBackground = "customBackground.png" - return assertPack("test-app-one", { - targets: Platform.MAC.createTarget(), - platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingMacPackager(packager) - }, { - projectDirCreated: projectDir => BluebirdPromise.all([ - copy(path.join(__dirname, "..", "..", "templates", "dmg", "background.tiff"), path.join(projectDir, customBackground)), - modifyPackageJson(projectDir, data => { - data.build.mac = { - icon: "customIcon" - } - - data.build.dmg = { - background: customBackground, - icon: "foo.icns", - } - }) - ]), - packed: async context => { - assertThat(platformPackager.effectiveDistOptions.background).isEqualTo(customBackground) - assertThat(platformPackager.effectiveDistOptions.icon).isEqualTo("foo.icns") - assertThat(await platformPackager.getIconPath()).isEqualTo(path.join(context.projectDir, "customIcon.icns")) - }, - }) -}) - -test.ifOsx("disable dmg icon (light), bundleVersion", () => { - let platformPackager: CheckingMacPackager = null - return assertPack("test-app-one", { - targets: Platform.MAC.createTarget(), - platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingMacPackager(packager), - devMetadata: { - build: { - dmg: { - icon: null, - }, - mac: { - bundleVersion: "50" - }, - }, - } - }, { - packed: async () => { - assertThat(platformPackager.effectiveDistOptions.icon).isEqualTo(null) - assertThat(await platformPackager.getIconPath()).isNotEqualTo(null) - assertThat(platformPackager.appInfo.buildVersion).isEqualTo("50") - }, - }) -}) - -test.ifOsx("electronDist", appThrows(/ENOENT: no such file or directory/, { - targets: Platform.OSX.createTarget(DIR_TARGET), -}, { - projectDirCreated: projectDir => modifyPackageJson(projectDir, data => { - data.build.electronDist = "foo" - }) -})) - -class CheckingMacPackager extends OsXPackager { - effectiveDistOptions: any - effectiveSignOptions: SignOptions - - constructor(info: BuildInfo) { - super(info) - } - - async pack(outDir: string, arch: Arch, targets: Array, postAsyncTasks: Array>): Promise { - for (let target of targets) { - // do not use instanceof to avoid dmg require - if (target.name === "dmg") { - this.effectiveDistOptions = await (target).computeDmgOptions() - break - } - } - // http://madole.xyz/babel-plugin-transform-async-to-module-method-gotcha/ - return await OsXPackager.prototype.pack.call(this, outDir, arch, targets, postAsyncTasks) - } - - async doPack(outDir: string, appOutDir: string, platformName: string, arch: Arch, customBuildOptions: MacOptions, postAsyncTasks: Array> = null) { - // skip - } - - async doSign(opts: SignOptions): Promise { - this.effectiveSignOptions = opts - } - - async doFlat(appPath: string, outFile: string, identity: string, keychain?: string | null): Promise { - // skip - } - - packageInDistributableFormat(appOutDir: string, targets: Array, promises: Array>): void { - // skip - } -} \ No newline at end of file diff --git a/test/src/mainEntryTest.ts b/test/src/mainEntryTest.ts new file mode 100644 index 00000000000..aba8f0b9a11 --- /dev/null +++ b/test/src/mainEntryTest.ts @@ -0,0 +1,63 @@ +import { assertPack, modifyPackageJson, appTwoThrows, allPlatforms } from "./helpers/packTester" +import { move } from "fs-extra-p" +import BluebirdPromise from "bluebird-lst-c" +import * as path from "path" + +test("invalid main in the app package.json", appTwoThrows(/Application entry file "main.js" in the /, allPlatforms(false), { + projectDirCreated: projectDir => modifyPackageJson(projectDir, data => { + data.main = "main.js" + }, true) +})) + +test("invalid main in the app package.json (no asar)", appTwoThrows(`Application entry file "main.js" does not exist. Seems like a wrong configuration.`, allPlatforms(false), { + projectDirCreated: projectDir => { + return BluebirdPromise.all([ + modifyPackageJson(projectDir, data => { + data.main = "main.js" + }, true), + modifyPackageJson(projectDir, data => { + data.build.asar = false + }) + ]) + } +})) + +test("invalid main in the app package.json (custom asar)", appTwoThrows(/Application entry file "main.js" in the ("[^"]*") does not exist\. Seems like a wrong configuration\./, allPlatforms(false), { + projectDirCreated: projectDir => { + return BluebirdPromise.all([ + modifyPackageJson(projectDir, data => { + data.main = "path/app.asar/main.js" + }, true), + modifyPackageJson(projectDir, data => { + data.build.asar = false + }) + ]) + } +})) + +test("main in the app package.json (no asar)", () => assertPack("test-app", allPlatforms(false), { + projectDirCreated: projectDir => { + return BluebirdPromise.all([ + move(path.join(projectDir, "app", "index.js"), path.join(projectDir, "app", "main.js")), + modifyPackageJson(projectDir, data => { + data.main = "main.js" + }, true), + modifyPackageJson(projectDir, data => { + data.build.asar = false + }) + ]) + } +})) + +test("main in the app package.json (custom asar)", () => assertPack("test-app", allPlatforms(false), { + projectDirCreated: projectDir => { + return BluebirdPromise.all([ + modifyPackageJson(projectDir, data => { + data.main = "path/app.asar/index.js" + }, true), + modifyPackageJson(projectDir, data => { + data.build.asar = false + }) + ]) + } +})) \ No newline at end of file diff --git a/test/src/nsisUpdaterTest.ts b/test/src/nsisUpdaterTest.ts index 3703112224b..23ed9adf8b7 100644 --- a/test/src/nsisUpdaterTest.ts +++ b/test/src/nsisUpdaterTest.ts @@ -1,4 +1,3 @@ -import test from "./helpers/avaEx" import { assertThat } from "./helpers/fileAssert" import { NsisUpdater } from "out/nsis-auto-updater/src/NsisUpdater" import * as path from "path" @@ -22,24 +21,24 @@ g.__test_app = { }, } -test("check updates - no versions at all", async (t) => { +test("check updates - no versions at all", async () => { const updater: NsisUpdater = new NsisUpdaterClass({ provider: "bintray", owner: "actperepo", package: "no-versions", }) - t.throws(updater.checkForUpdates(), /No latest version, please ensure that/) + await assertThat(updater.checkForUpdates()).throws(/No latest version, please ensure that/) }) -test("cannot find suitable file for version", async (t) => { +test("cannot find suitable file for version", async () => { const updater: NsisUpdater = new NsisUpdaterClass({ provider: "bintray", owner: "actperepo", package: "incorrect-file-version", }) - t.throws(updater.checkForUpdates(), /Cannot find suitable file for version 1.0.0 in/) + await assertThat(updater.checkForUpdates()).throws(/Cannot find suitable file for version 1.0.0 in/) }) test("file url", async () => { @@ -67,7 +66,7 @@ test("file url", async () => { }) await assertThat(path.join(await updateCheckResult.downloadPromise)).isFile() - assertThat(actualEvents).isEqualTo(expectedEvents) + expect(actualEvents).toEqual(expectedEvents) }) test("file url generic", async () => { @@ -94,7 +93,7 @@ test("file url generic", async () => { }) await assertThat(path.join(await updateCheckResult.downloadPromise)).isFile() - assertThat(actualEvents).isEqualTo(expectedEvents) + expect(actualEvents).toEqual(expectedEvents) }) test("file url github", async () => { @@ -122,10 +121,10 @@ test("file url github", async () => { }) await assertThat(path.join(await updateCheckResult.downloadPromise)).isFile() - assertThat(actualEvents).isEqualTo(expectedEvents) + expect(actualEvents).toEqual(expectedEvents) }) -test("test error", async (t) => { +test("test error", async () => { const updater: NsisUpdater = new NsisUpdaterClass() const actualEvents: Array = [] @@ -136,11 +135,11 @@ test("test error", async (t) => { }) } - t.throws(updater.checkForUpdates(), "Path must be a string. Received undefined") + await assertThat(updater.checkForUpdates()).throws("Path must be a string. Received undefined") await new BluebirdPromise(function (resolve, reject) { setTimeout(() => { try { - assertThat(actualEvents).isEqualTo(expectedEvents) + expect(actualEvents).toEqual(expectedEvents) } catch (e) { reject(e) diff --git a/test/src/winPackagerTest.ts b/test/src/winPackagerTest.ts deleted file mode 100755 index b57e3936b32..00000000000 --- a/test/src/winPackagerTest.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { Platform, Arch, BuildInfo } from "out" -import test from "./helpers/avaEx" -import { assertPack, platform, modifyPackageJson, getTestAsset, app } from "./helpers/packTester" -import { outputFile, rename, copy } from "fs-extra-p" -import * as path from "path" -import { WinPackager } from "out/winPackager" -import BluebirdPromise from "bluebird-lst-c" -import { assertThat } from "./helpers/fileAssert" -import { SignOptions } from "out/windowsCodeSign" -import SquirrelWindowsTarget from "out/targets/squirrelWindows" -import { Target } from "out/platformPackager" - -test.ifNotCiOsx("win", app({targets: Platform.WINDOWS.createTarget(["squirrel", "zip"])}, {signed: true})) - -// very slow -test.skip("delta and msi", app({ - targets: Platform.WINDOWS.createTarget("squirrel", Arch.ia32), - devMetadata: { - build: { - squirrelWindows: { - remoteReleases: "https://github.com/develar/__test-app-releases", - msi: true, - }, - } - }, -})) - -test.ifDevOrWinCi("beta version", app({ - targets: Platform.WINDOWS.createTarget(["squirrel", "nsis"]), - devMetadata: { - version: "3.0.0-beta.2", - } -})) - -test.ifDevOrWinCi("beta version", app({ - targets: Platform.WINDOWS.createTarget(["squirrel", "nsis"]), - devMetadata: { - version: "3.0.0-beta.2", - } -})) - -test.ifNotCiOsx("msi as string", t => t.throws(assertPack("test-app-one", {targets: Platform.WINDOWS.createTarget("squirrel")}, { - projectDirCreated: it => modifyPackageJson(it, data => { - data.build.win = { - msi: "false", - } - }) - }), `msi expected to be boolean value, but string '"false"' was specified`) -) - -test("detect install-spinner, certificateFile/password", () => { - let platformPackager: CheckingWinPackager = null - let loadingGifPath: string = null - - return assertPack("test-app-one", { - targets: Platform.WINDOWS.createTarget("squirrel"), - platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingWinPackager(packager), - devMetadata: { - build: { - win: { - certificatePassword: "pass", - } - } - } - }, { - projectDirCreated: it => { - loadingGifPath = path.join(it, "build", "install-spinner.gif") - return BluebirdPromise.all([ - copy(getTestAsset("install-spinner.gif"), loadingGifPath), - modifyPackageJson(it, data => { - data.build.win = { - certificateFile: "secretFile", - certificatePassword: "mustBeOverridden", - } - })]) - }, - packed: async () => { - assertThat(platformPackager.effectiveDistOptions.loadingGif).isEqualTo(loadingGifPath) - assertThat(platformPackager.signOptions.cert).isEqualTo("secretFile") - assertThat(platformPackager.signOptions.password).isEqualTo("pass") - }, - }) -}) - -test.ifNotCiOsx("icon < 256", t => t.throws(assertPack("test-app-one", platform(Platform.WINDOWS), { - projectDirCreated: projectDir => rename(path.join(projectDir, "build", "incorrect.ico"), path.join(projectDir, "build", "icon.ico")) -}), /Windows icon size must be at least 256x256, please fix ".+/)) - -test.ifNotCiOsx("icon not an image", t => t.throws(assertPack("test-app-one", platform(Platform.WINDOWS), { - projectDirCreated: projectDir => outputFile(path.join(projectDir, "build", "icon.ico"), "foo") -}), /Windows icon is not valid ico file, please fix ".+/)) - -test.ifOsx("custom icon", () => { - let platformPackager: CheckingWinPackager = null - return assertPack("test-app-one", { - targets: Platform.WINDOWS.createTarget("squirrel"), - platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingWinPackager(packager) - }, { - projectDirCreated: projectDir => BluebirdPromise.all([ - rename(path.join(projectDir, "build", "icon.ico"), path.join(projectDir, "customIcon.ico")), - modifyPackageJson(projectDir, data => { - data.build.win = { - icon: "customIcon" - } - }) - ]), - packed: async context => { - assertThat(await platformPackager.getIconPath()).isEqualTo(path.join(context.projectDir, "customIcon.ico")) - }, - }) -}) - -test.ifNotWindows("ev", t => t.throws(assertPack("test-app-one", { - targets: Platform.WINDOWS.createTarget(["dir"]), - devMetadata: { - build: { - win: { - certificateSubjectName: "ev", - } - } - } -}), /certificateSubjectName supported only on Windows/)) - -class CheckingWinPackager extends WinPackager { - effectiveDistOptions: any - signOptions: SignOptions | null - - constructor(info: BuildInfo) { - super(info) - } - - async pack(outDir: string, arch: Arch, targets: Array, postAsyncTasks: Array>): Promise { - // skip pack - const helperClass: typeof SquirrelWindowsTarget = require("out/targets/squirrelWindows").default - this.effectiveDistOptions = await (new helperClass(this).computeEffectiveDistOptions()) - - await this.sign(this.computeAppOutDir(outDir, arch)) - } - - packageInDistributableFormat(outDir: string, appOutDir: string, arch: Arch, targets: Array, promises: Array>): void { - // skip - } - - protected doSign(opts: SignOptions): Promise { - this.signOptions = opts - return BluebirdPromise.resolve(null) - } -} \ No newline at end of file diff --git a/test/src/windows/nsisBoring.ts b/test/src/windows/nsisBoring.ts new file mode 100644 index 00000000000..7f101294163 --- /dev/null +++ b/test/src/windows/nsisBoring.ts @@ -0,0 +1,95 @@ +import { Platform, Arch } from "out" +import { assertPack, getTestAsset, app } from "../helpers/packTester" +import { copy } from "fs-extra-p" +import * as path from "path" + +const nsisTarget = Platform.WINDOWS.createTarget(["nsis"]) + +test.ifNotCiMac("boring, MUI_HEADER", () => { + let installerHeaderPath: string | null = null + return assertPack("test-app-one", { + targets: nsisTarget, + devMetadata: { + build: { + nsis: { + oneClick: false, + } + } + }, + effectiveOptionComputed: options => { + const defines = options[0] + expect(defines.MUI_HEADERIMAGE).toBeNull() + expect(defines.MUI_HEADERIMAGE_BITMAP).toEqual(installerHeaderPath) + expect(defines.MUI_HEADERIMAGE_RIGHT).toBeNull() + // speedup, do not build - another MUI_HEADER test will test build + return true + } + }, { + projectDirCreated: projectDir => { + installerHeaderPath = path.join(projectDir, "build", "installerHeader.bmp") + return copy(getTestAsset("installerHeader.bmp"), installerHeaderPath) + } + } + ) +}) + +test.ifNotCiMac("boring, MUI_HEADER as option", () => { + let installerHeaderPath: string | null = null + return assertPack("test-app-one", { + targets: Platform.WINDOWS.createTarget(["nsis"], Arch.ia32, Arch.x64), + devMetadata: { + build: { + nsis: { + oneClick: false, + installerHeader: "foo.bmp" + } + } + }, + effectiveOptionComputed: options => { + const defines = options[0] + expect(defines.MUI_HEADERIMAGE).toBeNull() + expect(defines.MUI_HEADERIMAGE_BITMAP).toEqual(installerHeaderPath) + expect(defines.MUI_HEADERIMAGE_RIGHT).toBeNull() + // test that we can build such installer + return false + } + }, { + projectDirCreated: projectDir => { + installerHeaderPath = path.join(projectDir, "foo.bmp") + return copy(getTestAsset("installerHeader.bmp"), installerHeaderPath) + }, + } + ) +}) + +test.ifNotCiMac("boring, only perMachine", app({ + targets: nsisTarget, + devMetadata: { + build: { + nsis: { + oneClick: false, + perMachine: true, + } + } + } +})) + +test.ifNotCiMac("boring", app({ + targets: nsisTarget, + devMetadata: { + build: { + nsis: { + oneClick: false, + language: "1031", + }, + win: { + legalTrademarks: "My Trademark" + }, + } + } +}, { + signed: true, + projectDirCreated: projectDir => { + return copy(getTestAsset("license.txt"), path.join(projectDir, "build", "license.txt")) + }, +})) diff --git a/test/src/nsisTest.ts b/test/src/windows/nsisTest.ts similarity index 64% rename from test/src/nsisTest.ts rename to test/src/windows/nsisTest.ts index 6202d175fa9..2670d97b03c 100644 --- a/test/src/nsisTest.ts +++ b/test/src/windows/nsisTest.ts @@ -1,14 +1,13 @@ import { Platform, Arch } from "out" -import test from "./helpers/avaEx" -import { assertPack, getTestAsset, app } from "./helpers/packTester" +import { assertPack, getTestAsset, app } from "../helpers/packTester" import { copy, outputFile, readFile } from "fs-extra-p" import * as path from "path" import BluebirdPromise from "bluebird-lst-c" -import { assertThat } from "./helpers/fileAssert" +import { assertThat } from "../helpers/fileAssert" import { extractFile } from "asar-electron-builder" import { walk } from "out/asarUtil" -import { nsisPerMachineInstall } from "./helpers/expectedContents" -import { WineManager, diff } from "./helpers/wine" +import { nsisPerMachineInstall } from "../helpers/expectedContents" +import { WineManager, diff } from "../helpers/wine" import { safeLoad } from "js-yaml" const nsisTarget = Platform.WINDOWS.createTarget(["nsis"]) @@ -113,8 +112,8 @@ async function doTest(outDir: string, perUser: boolean) { let fsAfter = await listFiles() let fsChanges = diff(fsBefore, fsAfter, driveC) - assertThat(fsChanges.added).isEqualTo(nsisPerMachineInstall) - assertThat(fsChanges.deleted).isEqualTo([]) + expect(fsChanges.added).toEqual(nsisPerMachineInstall) + expect(fsChanges.deleted).toEqual([]) // run installer again to test uninstall const appDataFile = path.join(wine.userDir, "Application Data", "TestApp", "doNotDeleteMe") @@ -124,8 +123,8 @@ async function doTest(outDir: string, perUser: boolean) { fsAfter = await listFiles() fsChanges = diff(fsBefore, fsAfter, driveC) - assertThat(fsChanges.added).isEqualTo([]) - assertThat(fsChanges.deleted).isEqualTo([]) + expect(fsChanges.added).toEqual([]) + expect(fsChanges.deleted).toEqual([]) await assertThat(appDataFile).isFile() @@ -133,45 +132,13 @@ async function doTest(outDir: string, perUser: boolean) { await assertThat(appDataFile).doesNotExist() } -test.ifNotCiOsx("boring", app({ - targets: nsisTarget, - devMetadata: { - build: { - nsis: { - oneClick: false, - language: "1031", - }, - win: { - legalTrademarks: "My Trademark" - }, - } - } -}, { - signed: true, - projectDirCreated: projectDir => { - return copy(getTestAsset("license.txt"), path.join(projectDir, "build", "license.txt")) - }, -})) - -test.ifNotCiOsx("boring, only perMachine", app({ - targets: nsisTarget, - devMetadata: { - build: { - nsis: { - oneClick: false, - perMachine: true, - } - } - } -})) - -test.ifNotCiOsx("installerHeaderIcon", () => { +test.ifNotCiMac("installerHeaderIcon", () => { let headerIconPath: string | null = null return assertPack("test-app-one", { targets: nsisTarget, effectiveOptionComputed: options => { const defines = options[0] - assertThat(defines.HEADER_ICO).isEqualTo(headerIconPath) + expect(defines.HEADER_ICO).toEqual(headerIconPath) return false } }, { @@ -183,63 +150,6 @@ test.ifNotCiOsx("installerHeaderIcon", () => { ) }) -test.ifNotCiOsx("boring, MUI_HEADER", () => { - let installerHeaderPath: string | null = null - return assertPack("test-app-one", { - targets: nsisTarget, - devMetadata: { - build: { - nsis: { - oneClick: false, - } - } - }, - effectiveOptionComputed: options => { - const defines = options[0] - assertThat(defines.MUI_HEADERIMAGE).isEqualTo(null) - assertThat(defines.MUI_HEADERIMAGE_BITMAP).isEqualTo(installerHeaderPath) - assertThat(defines.MUI_HEADERIMAGE_RIGHT).isEqualTo(null) - // speedup, do not build - another MUI_HEADER test will test build - return true - } - }, { - projectDirCreated: projectDir => { - installerHeaderPath = path.join(projectDir, "build", "installerHeader.bmp") - return copy(getTestAsset("installerHeader.bmp"), installerHeaderPath) - } - } - ) -}) - -test.ifNotCiOsx("boring, MUI_HEADER as option", () => { - let installerHeaderPath: string | null = null - return assertPack("test-app-one", { - targets: Platform.WINDOWS.createTarget(["nsis"], Arch.ia32, Arch.x64), - devMetadata: { - build: { - nsis: { - oneClick: false, - installerHeader: "foo.bmp" - } - } - }, - effectiveOptionComputed: options => { - const defines = options[0] - assertThat(defines.MUI_HEADERIMAGE).isEqualTo(null) - assertThat(defines.MUI_HEADERIMAGE_BITMAP).isEqualTo(installerHeaderPath) - assertThat(defines.MUI_HEADERIMAGE_RIGHT).isEqualTo(null) - // test that we can build such installer - return false - } - }, { - projectDirCreated: projectDir => { - installerHeaderPath = path.join(projectDir, "foo.bmp") - return copy(getTestAsset("installerHeader.bmp"), installerHeaderPath) - }, - } - ) -}) - test.ifDevOrLinuxCi("custom include", () => assertPack("test-app-one", {targets: nsisTarget}, { projectDirCreated: projectDir => copy(getTestAsset("installer.nsh"), path.join(projectDir, "build", "installer.nsh")), packed: context => BluebirdPromise.all([ diff --git a/test/src/windows/squirrelWindowsTest.ts b/test/src/windows/squirrelWindowsTest.ts new file mode 100644 index 00000000000..a6967a77c0a --- /dev/null +++ b/test/src/windows/squirrelWindowsTest.ts @@ -0,0 +1,62 @@ +import { Platform, Arch } from "out" +import { app, modifyPackageJson, appThrows, getTestAsset, assertPack, CheckingWinPackager } from "../helpers/packTester" +import * as path from "path" +import BluebirdPromise from "bluebird-lst-c" +import { copy } from "fs-extra-p" + +test.ifNotCiMac("Squirrel.Windows", app({targets: Platform.WINDOWS.createTarget(["squirrel", "zip"])}, {signed: true})) + +// very slow +test.skip("delta and msi", app({ + targets: Platform.WINDOWS.createTarget("squirrel", Arch.ia32), + devMetadata: { + build: { + squirrelWindows: { + remoteReleases: "https://github.com/develar/__test-app-releases", + msi: true, + }, + } + }, +})) + +test.ifNotCiMac("msi as string", appThrows(/msi expected to be boolean value, but string '"false"' was specified/, {targets: Platform.WINDOWS.createTarget("squirrel")}, { + projectDirCreated: it => modifyPackageJson(it, data => { + data.build.win = { + msi: "false", + } + }) +})) + +test("detect install-spinner, certificateFile/password", () => { + let platformPackager: CheckingWinPackager = null + let loadingGifPath: string = null + + return assertPack("test-app-one", { + targets: Platform.WINDOWS.createTarget("squirrel"), + platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingWinPackager(packager), + devMetadata: { + build: { + win: { + certificatePassword: "pass", + } + } + } + }, { + projectDirCreated: it => { + loadingGifPath = path.join(it, "build", "install-spinner.gif") + return BluebirdPromise.all([ + copy(getTestAsset("install-spinner.gif"), loadingGifPath), + modifyPackageJson(it, data => { + data.build.win = { + certificateFile: "secretFile", + certificatePassword: "mustBeOverridden", + } + })]) + }, + packed: async () => { + expect(platformPackager.effectiveDistOptions.loadingGif).toEqual(loadingGifPath) + expect(platformPackager.signOptions.cert).toEqual("secretFile") + expect(platformPackager.signOptions.password).toEqual("pass") + }, + }) +}) \ No newline at end of file diff --git a/test/src/windows/winPackagerTest.ts b/test/src/windows/winPackagerTest.ts new file mode 100755 index 00000000000..b06a9df6ae4 --- /dev/null +++ b/test/src/windows/winPackagerTest.ts @@ -0,0 +1,51 @@ +import { Platform } from "out" +import { assertPack, platform, modifyPackageJson, app, appThrows, CheckingWinPackager } from "../helpers/packTester" +import { outputFile, rename } from "fs-extra-p" +import * as path from "path" +import BluebirdPromise from "bluebird-lst-c" + +test.ifDevOrWinCi("beta version", app({ + targets: Platform.WINDOWS.createTarget(["squirrel", "nsis"]), + devMetadata: { + version: "3.0.0-beta.2", + } +})) + +test.ifNotCiMac("icon < 256", appThrows(/Windows icon size must be at least 256x256, please fix ".+/, platform(Platform.WINDOWS), { + projectDirCreated: projectDir => rename(path.join(projectDir, "build", "incorrect.ico"), path.join(projectDir, "build", "icon.ico")) +})) + +test.ifNotCiMac("icon not an image", appThrows(/Windows icon is not valid ico file, please fix ".+/, platform(Platform.WINDOWS), { + projectDirCreated: projectDir => outputFile(path.join(projectDir, "build", "icon.ico"), "foo") +})) + +test.ifMac("custom icon", () => { + let platformPackager: CheckingWinPackager = null + return assertPack("test-app-one", { + targets: Platform.WINDOWS.createTarget("squirrel"), + platformPackagerFactory: (packager, platform, cleanupTasks) => platformPackager = new CheckingWinPackager(packager) + }, { + projectDirCreated: projectDir => BluebirdPromise.all([ + rename(path.join(projectDir, "build", "icon.ico"), path.join(projectDir, "customIcon.ico")), + modifyPackageJson(projectDir, data => { + data.build.win = { + icon: "customIcon" + } + }) + ]), + packed: async context => { + expect(await platformPackager.getIconPath()).toEqual(path.join(context.projectDir, "customIcon.ico")) + }, + }) +}) + +it.ifNotWindows("ev", appThrows(/certificateSubjectName supported only on Windows/, { + targets: Platform.WINDOWS.createTarget(["dir"]), + devMetadata: { + build: { + win: { + certificateSubjectName: "ev", + } + } + } +})) \ No newline at end of file diff --git a/test/tsconfig.json b/test/tsconfig.json index 0529b7d5a61..db8991fa48d 100755 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -23,7 +23,6 @@ "../typings/*.d.ts", "typings/*.d.ts", "src/**/*.ts", - "../node_modules/ava-tf/types/generated.d.ts", "../node_modules/fs-extra-p/index.d.ts", "../node_modules/bluebird-lst-c/index.d.ts", "../node_modules/electron-macos-sign/index.d.ts", diff --git a/test/typings/jest-ex.d.ts b/test/typings/jest-ex.d.ts new file mode 100644 index 00000000000..85d51b3a101 --- /dev/null +++ b/test/typings/jest-ex.d.ts @@ -0,0 +1,12 @@ +declare module jest { + interface It { + ifNotWindows: jest.It + ifMac: jest.It + ifNotCi: jest.It + ifCi: jest.It + ifNotCiMac: jest.It + ifDevOrWinCi: jest.It + ifWinCi: jest.It + ifDevOrLinuxCi: jest.It + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 3e43def67e0..2adaabd4167 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -34,7 +34,10 @@ "include": [ "src/**/*.ts", "typings/*.d.ts", - "node_modules/@types/**/*.d.ts" + "node_modules/@types/ini/*.d.ts", + "node_modules/@types/js-yaml/*.d.ts", + "node_modules/@types/node/*.d.ts", + "node_modules/@types/source-map-support/*.d.ts" ], "exclude": [ ] diff --git a/yarn.lock b/yarn.lock index 9c6450f130f..57e6ff7b8d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -58,13 +58,17 @@ version "1.3.29" resolved "https://registry.yarnpkg.com/@types/ini/-/ini-1.3.29.tgz#1325e981e047d40d13ce0359b821475b97741d2f" +"@types/jest@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-16.0.0.tgz#5fe49adee6db194357a52438c0d80695b59a45e9" + "@types/js-yaml@^3.5.28": version "3.5.28" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.5.28.tgz#efd7614f8eb1b924c41235ff653b7370da467fac" "@types/node@*": - version "6.0.47" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.47.tgz#07dd004f05d0b74344ebf943b559659bd7f445b1" + version "6.0.48" + resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.48.tgz#86ccc15f66b73cbbc5eb3483398936c585122b3c" "@types/source-map-support@^0.2.28": version "0.2.28" @@ -79,10 +83,24 @@ JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" -abbrev@1: +abab@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + +abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" +acorn-globals@^1.0.4: + version "1.0.9" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" + dependencies: + acorn "^2.1.0" + +acorn@^2.1.0, acorn@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" + agent-base@2: version "2.0.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e" @@ -120,16 +138,13 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" -anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" - dependencies: - arrify "^1.0.0" - micromatch "^2.1.5" +append-transform@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.3.0.tgz#d6933ce4a85f09445d9ccc4cc119051b7381a813" aproba@^1.0.3: version "1.0.4" @@ -178,10 +193,6 @@ arr-diff@^2.0.0: dependencies: arr-flatten "^1.0.1" -arr-exclude@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/arr-exclude/-/arr-exclude-1.0.0.tgz#dfc7c2e552a270723ccda04cf3128c8cbfe5c631" - arr-flatten@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" @@ -190,6 +201,10 @@ array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -198,13 +213,13 @@ array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" -array-union@^1.0.1, array-union@^1.0.2: +array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" dependencies: array-uniq "^1.0.1" -array-uniq@^1.0.1, array-uniq@^1.0.3: +array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -242,11 +257,7 @@ assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async@^1.4.0: +async@1.x, async@^1.4.0, async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -264,113 +275,6 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -auto-bind@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-0.1.0.tgz#7a29efc8c2388d3d578e02fc2df531c81ffc1ee1" - -ava-files@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ava-files/-/ava-files-0.2.0.tgz#c7b8b6e2e0cea63b57a6e27e0db145c7c19cfe20" - dependencies: - auto-bind "^0.1.0" - bluebird "^3.4.1" - globby "^6.0.0" - ignore-by-default "^1.0.1" - lodash.flatten "^4.2.0" - multimatch "^2.1.0" - slash "^1.0.0" - -ava-init@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ava-init/-/ava-init-0.1.6.tgz#ef19ed0b24b6bf359dad6fbadf1a05d836395c91" - dependencies: - arr-exclude "^1.0.0" - cross-spawn "^4.0.0" - pinkie-promise "^2.0.0" - read-pkg-up "^1.0.1" - the-argv "^1.0.0" - write-pkg "^1.0.0" - -ava-tf@^0.16.4: - version "0.16.4" - resolved "https://registry.yarnpkg.com/ava-tf/-/ava-tf-0.16.4.tgz#5bb9d054bb17ca588dd8ffa5df4b15e3df55fa18" - dependencies: - arr-flatten "^1.0.1" - array-union "^1.0.2" - array-uniq "^1.0.3" - arrify "^1.0.1" - auto-bind "^0.1.0" - ava-files "^0.2.0" - ava-init "^0.1.6" - babel-code-frame "^6.16.0" - babel-core "^6.17.0" - babel-plugin-ava-throws-helper "^0.1.0" - babel-plugin-detective "^2.0.0" - babel-plugin-espower "^2.3.1" - babel-plugin-transform-runtime "^6.15.0" - babel-preset-es2015 "^6.16.0" - babel-preset-es2015-node4 "^2.1.0" - babel-preset-stage-2 "^6.17.0" - babel-runtime "^6.11.6" - bluebird "^3.4.6" - caching-transform "^1.0.1" - chalk "^1.1.3" - chokidar "^1.6.1" - clean-yaml-object "^0.1.0" - cli-cursor "^1.0.2" - cli-spinners "^0.3.0" - cli-truncate "^0.2.1" - co-with-promise "^4.6.0" - common-path-prefix "^1.0.0" - convert-source-map "^1.3.0" - core-assert "^0.2.1" - currently-unhandled "^0.4.1" - debug "^2.2.0" - empower-core "^0.6.1" - figures "^1.7.0" - find-cache-dir "^0.1.1" - fn-name "^2.0.1" - get-port "^2.1.0" - has-flag "^2.0.0" - ignore-by-default "^1.0.1" - is-ci "^1.0.9" - is-generator-fn "^1.0.0" - is-obj "^1.0.1" - is-observable "^0.2.0" - is-promise "^2.1.0" - last-line-stream "^1.0.0" - lodash.debounce "^4.0.8" - lodash.difference "^4.5.0" - lodash.isequal "^4.4.0" - loud-rejection "^1.6.0" - matcher "^0.1.2" - max-timeout "^1.0.0" - md5-hex "^1.3.0" - meow "^3.7.0" - ms "^0.7.1" - object-assign "^4.1.0" - observable-to-promise "^0.4.0" - option-chain "^0.1.1" - package-hash "^1.2.0" - pkg-conf "^2.0.0" - plur "^2.1.2" - power-assert-context-formatter "^1.1.0" - power-assert-renderer-assertion "^1.1.0" - power-assert-renderer-succinct "^1.1.0" - pretty-ms "^2.1.0" - repeating "^3.0.0" - require-precompiled "^0.1.0" - resolve-cwd "^1.0.0" - semver "^5.3.0" - set-immediate-shim "^1.0.1" - source-map-support "^0.4.4" - stack-utils "^0.4.0" - strip-ansi "^3.0.1" - strip-bom "^3.0.0" - time-require "^0.1.2" - unique-temp-dir "^1.0.0" - update-notifier "^1.0.2" - aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" @@ -387,7 +291,7 @@ babel-code-frame@^6.16.0: esutils "^2.0.2" js-tokens "^2.0.0" -babel-core@^6.17.0, babel-core@^6.18.0, babel-core@^6.18.2: +babel-core@^6.0.0, babel-core@^6.18.0, babel-core@^6.18.2: version "6.18.2" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.2.tgz#d8bb14dd6986fa4f3566a26ceda3964fa0e04e5b" dependencies: @@ -411,34 +315,18 @@ babel-core@^6.17.0, babel-core@^6.18.0, babel-core@^6.18.2: slash "^1.0.0" source-map "^0.5.0" -babel-generator@^6.1.0, babel-generator@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.18.0.tgz#e4f104cb3063996d9850556a45aae4a022060a07" +babel-generator@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.19.0.tgz#9b2f244204777a3d6810ec127c673c87b349fac5" dependencies: babel-messages "^6.8.0" babel-runtime "^6.9.0" - babel-types "^6.18.0" + babel-types "^6.19.0" detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.2.0" source-map "^0.5.0" -babel-helper-bindify-decorators@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.18.0.tgz#fc00c573676a6e702fffa00019580892ec8780a5" - dependencies: - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.18.0.tgz#8ae814989f7a53682152e3401a04fabd0bb333a6" - dependencies: - babel-helper-explode-assignable-expression "^6.18.0" - babel-runtime "^6.0.0" - babel-types "^6.18.0" - babel-helper-call-delegate@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" @@ -448,33 +336,7 @@ babel-helper-call-delegate@^6.18.0: babel-traverse "^6.18.0" babel-types "^6.18.0" -babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" - dependencies: - babel-helper-function-name "^6.18.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" - -babel-helper-explode-assignable-expression@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.18.0.tgz#14b8e8c2d03ad735d4b20f1840b24cd1f65239fe" - dependencies: - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helper-explode-class@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.18.0.tgz#c44f76f4fa23b9c5d607cbac5d4115e7a76f62cb" - dependencies: - babel-helper-bindify-decorators "^6.18.0" - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: +babel-helper-function-name@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" dependencies: @@ -498,22 +360,7 @@ babel-helper-hoist-variables@^6.18.0: babel-runtime "^6.0.0" babel-types "^6.18.0" -babel-helper-optimise-call-expression@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-helper-regex@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" - dependencies: - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" - -babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-generator@^6.16.2: +babel-helper-remap-async-to-generator@^6.16.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.18.0.tgz#336cdf3cab650bb191b02fc16a3708e7be7f9ce5" dependencies: @@ -523,17 +370,6 @@ babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-gener babel-traverse "^6.18.0" babel-types "^6.18.0" -babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" - dependencies: - babel-helper-optimise-call-expression "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babel-helpers@^6.16.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" @@ -541,6 +377,14 @@ babel-helpers@^6.16.0: babel-runtime "^6.0.0" babel-template "^6.16.0" +babel-jest@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-17.0.2.tgz#8d51e0d03759713c331f108eb0b2eaa4c6efff74" + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^2.0.0" + babel-preset-jest "^17.0.2" + babel-messages@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" @@ -551,83 +395,23 @@ babel-plugin-array-includes@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/babel-plugin-array-includes/-/babel-plugin-array-includes-2.0.3.tgz#cf5452e81c7b803fb7959f1045ac88e2ec28ff76" -babel-plugin-ava-throws-helper@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ava-throws-helper/-/babel-plugin-ava-throws-helper-0.1.0.tgz#951107708a12208026bf8ca4cef18a87bc9b0cfe" - dependencies: - babel-template "^6.7.0" - babel-types "^6.7.2" - -babel-plugin-check-es2015-constants@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" +babel-plugin-istanbul@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-2.0.3.tgz#266b304b9109607d60748474394676982f660df4" dependencies: - babel-runtime "^6.0.0" - -babel-plugin-detective@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-detective/-/babel-plugin-detective-2.0.0.tgz#6e642e83c22a335279754ebe2d754d2635f49f13" + find-up "^1.1.2" + istanbul-lib-instrument "^1.1.4" + object-assign "^4.1.0" + test-exclude "^2.1.1" -babel-plugin-espower@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-espower/-/babel-plugin-espower-2.3.1.tgz#d15e904bc9949b14ac233b7965c2a5dc7a19a6a9" - dependencies: - babel-generator "^6.1.0" - babylon "^6.1.0" - call-matcher "^1.0.0" - core-js "^2.0.0" - espower-location-detector "^0.1.1" - espurify "^1.6.0" - estraverse "^4.1.1" +babel-plugin-jest-hoist@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-17.0.2.tgz#213488ce825990acd4c30f887dca09fffeb45235" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" -babel-plugin-syntax-async-generators@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - -babel-plugin-syntax-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" - -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-syntax-trailing-function-commas@^6.3.13: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" - -babel-plugin-transform-async-generator-functions@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz#d0b5a2b2f0940f2b245fa20a00519ed7bc6cae54" - dependencies: - babel-helper-remap-async-to-generator "^6.16.2" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-async-to-generator@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999" - dependencies: - babel-helper-remap-async-to-generator "^6.16.0" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.0.0" - babel-plugin-transform-async-to-module-method@^6.16.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-module-method/-/babel-plugin-transform-async-to-module-method-6.16.0.tgz#3c88b4f0c5bf65e7b5960a48731f21ad0fb5a55f" @@ -637,143 +421,13 @@ babel-plugin-transform-async-to-module-method@^6.16.0: babel-runtime "^6.0.0" babel-types "^6.16.0" -babel-plugin-transform-class-properties@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.18.0.tgz#bc1266a39d4c8726e0bd7b15c56235177e6ede57" - dependencies: - babel-helper-function-name "^6.18.0" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.9.1" - -babel-plugin-transform-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz#82d65c1470ae83e2d13eebecb0a1c2476d62da9d" - dependencies: - babel-helper-define-map "^6.8.0" - babel-helper-explode-class "^6.8.0" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-types "^6.13.0" - -babel-plugin-transform-es2015-arrow-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-block-scoping@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" +babel-plugin-transform-es2015-destructuring@^6.19.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" dependencies: babel-runtime "^6.9.0" - babel-template "^6.15.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - lodash "^4.2.0" -babel-plugin-transform-es2015-classes@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" - dependencies: - babel-helper-define-map "^6.18.0" - babel-helper-function-name "^6.18.0" - babel-helper-optimise-call-expression "^6.18.0" - babel-helper-replace-supers "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-template "^6.14.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-computed-properties@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" - dependencies: - babel-helper-define-map "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - -babel-plugin-transform-es2015-destructuring@^6.18.0, babel-plugin-transform-es2015-destructuring@^6.6.5: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.18.0.tgz#a08fb89415ab82058649558bedb7bf8dafa76ba5" - dependencies: - babel-runtime "^6.9.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.8.0" - -babel-plugin-transform-es2015-for-of@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-function-name@^6.5.0, babel-plugin-transform-es2015-function-name@^6.9.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" - dependencies: - babel-helper-function-name "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.9.0" - -babel-plugin-transform-es2015-literals@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-modules-amd@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - -babel-plugin-transform-es2015-modules-commonjs@^6.18.0, babel-plugin-transform-es2015-modules-commonjs@^6.7.4: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" - dependencies: - babel-plugin-transform-strict-mode "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.18.0.tgz#f09294707163edae4d3b3e8bfacecd01d920b7ad" - dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.11.6" - babel-template "^6.14.0" - -babel-plugin-transform-es2015-modules-umd@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - -babel-plugin-transform-es2015-object-super@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" - dependencies: - babel-helper-replace-supers "^6.8.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-parameters@^6.18.0, babel-plugin-transform-es2015-parameters@^6.7.0: +babel-plugin-transform-es2015-parameters@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" dependencies: @@ -784,55 +438,12 @@ babel-plugin-transform-es2015-parameters@^6.18.0, babel-plugin-transform-es2015- babel-traverse "^6.18.0" babel-types "^6.18.0" -babel-plugin-transform-es2015-shorthand-properties@^6.18.0, babel-plugin-transform-es2015-shorthand-properties@^6.5.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-spread@^6.3.13, babel-plugin-transform-es2015-spread@^6.6.5, babel-plugin-transform-es2015-spread@^6.8.0: +babel-plugin-transform-es2015-spread@^6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" dependencies: babel-runtime "^6.0.0" -babel-plugin-transform-es2015-sticky-regex@^6.3.13, babel-plugin-transform-es2015-sticky-regex@^6.5.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" - dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - babel-types "^6.8.0" - -babel-plugin-transform-es2015-template-literals@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-unicode-regex@^6.3.13, babel-plugin-transform-es2015-unicode-regex@^6.5.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" - dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.8.0.tgz#db25742e9339eade676ca9acec46f955599a68a4" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.8.0" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.0.0" - babel-plugin-transform-inline-imports-commonjs@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-imports-commonjs/-/babel-plugin-transform-inline-imports-commonjs-1.2.0.tgz#20c7d192bafc54c8727386e3387d8ee4ef19e6a5" @@ -840,94 +451,18 @@ babel-plugin-transform-inline-imports-commonjs@^1.2.0: babel-plugin-transform-strict-mode "^6.8.0" builtin-modules "^1.1.1" -babel-plugin-transform-object-rest-spread@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.16.0.tgz#db441d56fffc1999052fdebe2e2f25ebd28e36a9" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-regenerator@^6.16.0: - version "6.16.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" - dependencies: - babel-runtime "^6.9.0" - babel-types "^6.16.0" - private "~0.1.5" - -babel-plugin-transform-runtime@^6.15.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.15.0.tgz#3d75b4d949ad81af157570273846fb59aeb0d57c" - dependencies: - babel-runtime "^6.9.0" - -babel-plugin-transform-strict-mode@^6.18.0, babel-plugin-transform-strict-mode@^6.8.0: +babel-plugin-transform-strict-mode@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" dependencies: babel-runtime "^6.0.0" babel-types "^6.18.0" -babel-preset-es2015-node4@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-es2015-node4/-/babel-preset-es2015-node4-2.1.0.tgz#9852f281e2332b57d49c189841ac25466a6ebe98" - dependencies: - babel-plugin-transform-es2015-destructuring "^6.6.5" - babel-plugin-transform-es2015-function-name "^6.5.0" - babel-plugin-transform-es2015-modules-commonjs "^6.7.4" - babel-plugin-transform-es2015-parameters "^6.7.0" - babel-plugin-transform-es2015-shorthand-properties "^6.5.0" - babel-plugin-transform-es2015-spread "^6.6.5" - babel-plugin-transform-es2015-sticky-regex "^6.5.0" - babel-plugin-transform-es2015-unicode-regex "^6.5.0" - -babel-preset-es2015@^6.16.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz#b8c70df84ec948c43dcf2bf770e988eb7da88312" - dependencies: - babel-plugin-check-es2015-constants "^6.3.13" - babel-plugin-transform-es2015-arrow-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoping "^6.18.0" - babel-plugin-transform-es2015-classes "^6.18.0" - babel-plugin-transform-es2015-computed-properties "^6.3.13" - babel-plugin-transform-es2015-destructuring "^6.18.0" - babel-plugin-transform-es2015-duplicate-keys "^6.6.0" - babel-plugin-transform-es2015-for-of "^6.18.0" - babel-plugin-transform-es2015-function-name "^6.9.0" - babel-plugin-transform-es2015-literals "^6.3.13" - babel-plugin-transform-es2015-modules-amd "^6.18.0" - babel-plugin-transform-es2015-modules-commonjs "^6.18.0" - babel-plugin-transform-es2015-modules-systemjs "^6.18.0" - babel-plugin-transform-es2015-modules-umd "^6.18.0" - babel-plugin-transform-es2015-object-super "^6.3.13" - babel-plugin-transform-es2015-parameters "^6.18.0" - babel-plugin-transform-es2015-shorthand-properties "^6.18.0" - babel-plugin-transform-es2015-spread "^6.3.13" - babel-plugin-transform-es2015-sticky-regex "^6.3.13" - babel-plugin-transform-es2015-template-literals "^6.6.0" - babel-plugin-transform-es2015-typeof-symbol "^6.18.0" - babel-plugin-transform-es2015-unicode-regex "^6.3.13" - babel-plugin-transform-regenerator "^6.16.0" - -babel-preset-stage-2@^6.17.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.18.0.tgz#9eb7bf9a8e91c68260d5ba7500493caaada4b5b5" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-plugin-transform-class-properties "^6.18.0" - babel-plugin-transform-decorators "^6.13.0" - babel-preset-stage-3 "^6.17.0" - -babel-preset-stage-3@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz#b6638e46db6e91e3f889013d8ce143917c685e39" +babel-preset-jest@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-17.0.2.tgz#141e935debe164aaa0364c220d31ccb2176493b2" dependencies: - babel-plugin-syntax-trailing-function-commas "^6.3.13" - babel-plugin-transform-async-generator-functions "^6.17.0" - babel-plugin-transform-async-to-generator "^6.16.0" - babel-plugin-transform-exponentiation-operator "^6.3.13" - babel-plugin-transform-object-rest-spread "^6.16.0" + babel-plugin-jest-hoist "^17.0.2" babel-register@^6.18.0: version "6.18.0" @@ -948,7 +483,7 @@ babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime core-js "^2.4.0" regenerator-runtime "^0.9.5" -babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.7.0, babel-template@^6.8.0: +babel-template@^6.16.0, babel-template@^6.8.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" dependencies: @@ -959,31 +494,31 @@ babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-te lodash "^4.2.0" babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.7.3: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.18.0.tgz#5aeaa980baed2a07c8c47329cd90c3b90c80f05e" + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.19.0.tgz#68363fb821e26247d52a519a84b2ceab8df4f55a" dependencies: babel-code-frame "^6.16.0" babel-messages "^6.8.0" babel-runtime "^6.9.0" - babel-types "^6.18.0" + babel-types "^6.19.0" babylon "^6.11.0" debug "^2.2.0" globals "^9.0.0" invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.13.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.7.2, babel-types@^6.8.0, babel-types@^6.9.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.18.0.tgz#1f7d5a73474c59eb9151b2417bbff4e4fce7c3f8" +babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.19.0.tgz#8db2972dbed01f1192a8b602ba1e1e4c516240b9" dependencies: babel-runtime "^6.9.1" esutils "^2.0.2" lodash "^4.2.0" to-fast-properties "^1.0.1" -babylon@^6.1.0, babylon@^6.1.21, babylon@^6.11.0: - version "6.13.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.1.tgz#adca350e088f0467647157652bafead6ddb8dfdb" +babylon@^6.1.21, babylon@^6.11.0, babylon@^6.13.0: + 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" @@ -999,10 +534,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -binary-extensions@^1.0.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" - binary@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" @@ -1016,19 +547,13 @@ bl@^1.0.0: dependencies: readable-stream "~2.0.5" -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - bluebird-lst-c@^1.0.2, bluebird-lst-c@^1.0.3, bluebird-lst-c@^1.0.4, bluebird-lst-c@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/bluebird-lst-c/-/bluebird-lst-c-1.0.5.tgz#50da657dcde337a0e29d9e080ba714c5a52016e2" dependencies: bluebird "^3.4.6" -bluebird@^3.4.1, bluebird@^3.4.6: +bluebird@^3.4.6: version "3.4.6" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" @@ -1067,13 +592,21 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -buf-compare@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a" +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +bser@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + dependencies: + node-int64 "^0.4.0" buffer-crc32@^0.2.1: - version "0.2.5" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.5.tgz#db003ac2671e62ebd6ece78ea2c2e1b405736e91" + version "0.2.6" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.6.tgz#612b318074fc6c4c30504b297247a1f91641253b" buffer-shims@^1.0.0: version "1.0.0" @@ -1087,26 +620,9 @@ builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" -caching-transform@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" - dependencies: - md5-hex "^1.2.0" - mkdirp "^0.5.1" - write-file-atomic "^1.1.4" - -call-matcher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/call-matcher/-/call-matcher-1.0.0.tgz#eafa31036dbfaa9c0d1716f12ddacfd9c69ef22f" - dependencies: - core-js "^2.0.0" - deep-equal "^1.0.0" - espurify "^1.6.0" - estraverse "^4.0.0" - -call-signature@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996" +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" camelcase-keys@^2.0.0: version "2.1.0" @@ -1131,6 +647,13 @@ capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" +cardinal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + dependencies: + ansicolors "~0.2.1" + redeyed "~1.0.0" + caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -1148,14 +671,6 @@ chainsaw@~0.1.0: dependencies: traverse ">=0.3.0 <0.4" -chalk@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" - dependencies: - ansi-styles "~1.0.0" - has-color "~0.1.0" - strip-ansi "~0.1.0" - chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -1166,21 +681,6 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chokidar@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - chromium-pickle-js@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" @@ -1189,10 +689,6 @@ ci-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" -clean-yaml-object@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" - cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -1203,16 +699,18 @@ cli-cursor@^1.0.2: dependencies: restore-cursor "^1.0.1" -cli-spinners@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.3.0.tgz#d822cc65116aa70ae7f6d2a826eda845fc0e4ef1" +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" -cli-truncate@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" +cli-usage@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" dependencies: - slice-ansi "0.0.4" - string-width "^1.0.1" + marked "^0.3.6" + marked-terminal "^1.6.2" cliui@^2.1.0: version "2.1.0" @@ -1230,11 +728,9 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -co-with-promise@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co-with-promise/-/co-with-promise-4.6.0.tgz#413e7db6f5893a60b942cf492c4bec93db415ab7" - dependencies: - pinkie-promise "^1.0.0" +clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" code-point-at@^1.0.0: version "1.1.0" @@ -1244,6 +740,10 @@ color-convert@~0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + colors@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -1268,14 +768,6 @@ commander@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781" -common-path-prefix@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-1.0.0.tgz#cd52f6f0712e0baab97d6f9732874f22f47752c0" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - compare-func@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" @@ -1326,6 +818,10 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + conventional-changelog-angular@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.3.0.tgz#3f64185978aa13ab0954c9e46a78969fd59c6801" @@ -1464,18 +960,11 @@ conventional-commits-parser@^1.0.0, conventional-commits-parser@^1.3.0: through2 "^2.0.0" trim-off-newlines "^1.0.0" -convert-source-map@^1.1.0, convert-source-map@^1.3.0: +convert-source-map@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" -core-assert@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/core-assert/-/core-assert-0.2.1.tgz#f85e2cf9bfed28f773cc8b3fa5c5b69bdc02fe3f" - dependencies: - buf-compare "^1.0.0" - is-error "^2.2.0" - -core-js@^2.0.0, core-js@^2.4.0: +core-js@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" @@ -1496,19 +985,22 @@ create-error-class@^3.0.1: dependencies: capture-stack-trace "^1.0.0" -cross-spawn@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" dependencies: boom "2.x.x" +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.1.tgz#c9e37ef2490e64f6d1baa10fda852257082c25d3" + +"cssstyle@>= 0.2.36 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + cuint@^0.2.1, cuint@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" @@ -1531,10 +1023,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-time@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/date-time/-/date-time-0.1.1.tgz#ed2f6d93d9790ce2fd66d5b5ff3edd5bbcbf3b07" - dateformat@^1.0.11, dateformat@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" @@ -1548,12 +1036,6 @@ debug@2, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.2: dependencies: ms "0.7.2" -debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -1574,14 +1056,14 @@ decompress-zip@^0.3.0: readable-stream "^1.1.8" touch "0.0.3" -deep-equal@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - deep-extend@~0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1590,25 +1072,25 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -depcheck@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/depcheck/-/depcheck-0.6.4.tgz#a64042fd024d48baba41029697c4f53ccfa94561" +depcheck@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/depcheck/-/depcheck-0.6.5.tgz#baee2148e83f1295d372d7c50fd6f7205ccdb8fa" dependencies: babel-traverse "^6.7.3" babylon "^6.1.21" builtin-modules "^1.1.1" - deprecate "^0.1.0" + deprecate "^1.0.0" deps-regex "^0.1.4" js-yaml "^3.4.2" lodash "^4.5.1" minimatch "^3.0.2" require-package-name "^2.0.1" walkdir "0.0.11" - yargs "^4.0.0" + yargs "^6.0.0" -deprecate@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/deprecate/-/deprecate-0.1.0.tgz#c49058612dc6c8e5145eafe4839b8c2c7d041c14" +deprecate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/deprecate/-/deprecate-1.0.0.tgz#661490ed2428916a6c8883d8834e5646f4e4a4a8" deps-regex@^0.1.4: version "0.1.4" @@ -1634,7 +1116,7 @@ dezalgo@^1.0.0, dezalgo@^1.0.1: asap "^2.0.0" wrappy "1" -diff@^3.0.1: +diff@^3.0.0, diff@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/diff/-/diff-3.0.1.tgz#a52d90cc08956994be00877bff97110062582c35" @@ -1654,47 +1136,35 @@ duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" -eastasianwidth@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.1.1.tgz#44d656de9da415694467335365fb3147b8572b7c" - ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 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" - resolved "https://registry.yarnpkg.com/electron-macos-sign/-/electron-macos-sign-1.0.1.tgz#689dc5dd5dff713585aa8c0bc631863f287b86f4" +electron-macos-sign@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/electron-macos-sign/-/electron-macos-sign-1.3.4.tgz#641e011f974b26879f05ac505dde94b86481376a" dependencies: bluebird "^3.4.6" compare-version "^0.1.2" - debug "^2.2.0" + debug "^2.3.2" isbinaryfile "^3.0.1" minimist "^1.2.0" plist "^2.0.1" - tempfile "^1.1.1" - -empower-core@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-0.6.1.tgz#6c187f502fcef7554d57933396aac655483772b1" - dependencies: - call-signature "0.0.2" - core-js "^2.0.0" end-of-stream@^1.0.0: version "1.1.0" @@ -1706,38 +1176,48 @@ entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" +"errno@>=0.1.1 <0.2.0-0": + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + error-ex@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" dependencies: is-arrayish "^0.2.1" -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: +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" -espower-location-detector@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/espower-location-detector/-/espower-location-detector-0.1.2.tgz#d43be738af3e0b18197eeb5c22b95512dee6b83c" +escodegen@1.8.x, escodegen@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" dependencies: - is-url "^1.2.1" - path-is-absolute "^1.0.0" - source-map "^0.5.0" - xtend "^4.0.0" + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" -esprima@^2.6.0: +esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" -espurify@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.6.0.tgz#6cb993582d9422bd6f2d4b258aadb14833f394f0" - dependencies: - core-js "^2.0.0" +esprima@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" esutils@^2.0.2: version "2.0.2" @@ -1755,6 +1235,12 @@ event-stream@^3.3.0: stream-combiner "~0.0.4" through "~2.3.1" +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -1785,17 +1271,27 @@ extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" -figures@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" +fast-levenshtein@~2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" + +fb-watchman@^1.8.0, fb-watchman@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.0.tgz#6f268f1f347a6b3c875d1e89da7e1ed79adfc0ec" dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" + bser "^1.0.2" filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" +fileset@0.2.x: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.2.1.tgz#588ef8973c6623b2a76df465105696b96aac8067" + dependencies: + glob "5.x" + minimatch "2.x" + fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -1810,27 +1306,13 @@ filled-array@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - -find-up@^1.0.0: +find-up@^1.0.0, find-up@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.0.0.tgz#71e6dc2dad9222143cfc0fa5de7ab739e7320c05" - dependencies: - path-exists "^2.0.0" - findup-sync@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" @@ -1844,10 +1326,6 @@ findup@0.1.5: colors "~0.6.0-1" commander "~2.1.0" -fn-name@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" - follow-redirects@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-0.0.7.tgz#34b90bab2a911aa347571da90f22bd36ecd8a919" @@ -1900,37 +1378,21 @@ fs-extra-tf@^1.0.0: jsonfile "^2.4.0" klaw "^1.3.1" -fs.realpath@^1.0.0: +fs-extra@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0: - version "1.0.15" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.29" - -fstream-ignore@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" dependencies: graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "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" -gauge@~2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" +gauge@~2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.1.tgz#388473894fe8be5e13ffcdb8b93e4ed0616428c7" dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -1966,12 +1428,6 @@ get-pkg-repo@^1.0.0: parse-github-repo-url "^1.3.0" through2 "^2.0.0" -get-port@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-2.1.0.tgz#8783f9dcebd1eea495a334e1a6a251e78887ab1a" - dependencies: - pinkie-promise "^2.0.0" - get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -2055,9 +1511,9 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@^6.0.0, glob@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" +glob@5.x, glob@^5.0.15, glob@~5.0.0: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" dependencies: inflight "^1.0.4" inherits "2" @@ -2065,24 +1521,24 @@ glob@^6.0.0, glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" +glob@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.2" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" -glob@~5.0.0: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" +glob@^7.0.0, glob@^7.0.5, glob@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.2" once "^1.3.0" path-is-absolute "^1.0.0" @@ -2090,16 +1546,6 @@ globals@^9.0.0: version "9.13.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.13.0.tgz#d97706b61600d8dbe94708c367d3fdcf48470b8f" -globby@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - got@^5.0.0: version "5.7.1" resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" @@ -2128,7 +1574,11 @@ graceful-fs@^4.1.0, graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.3, version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" -handlebars@^4.0.2: +growly@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.1, handlebars@^4.0.2, handlebars@^4.0.3: version "4.0.6" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" dependencies: @@ -2153,13 +1603,13 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-color@^0.1.7, has-color@~0.1.0: +has-color@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" has-unicode@^2.0.0: version "2.0.1" @@ -2185,14 +1635,16 @@ 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" +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -2216,9 +1668,9 @@ husky@^0.11.9: is-ci "^1.0.9" normalize-path "^1.0.0" -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" +iconv-lite@0.4.13, iconv-lite@^0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" imurmurhash@^0.1.4: version "0.1.4" @@ -2237,7 +1689,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: +inherits@2, inherits@~2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -2246,8 +1698,8 @@ ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" invariant@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.1.tgz#b097010547668c7e337028ebe816ebe36c8a8d54" + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" dependencies: loose-envify "^1.0.0" @@ -2255,20 +1707,10 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" -irregular-plurals@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.2.0.tgz#38f299834ba8c00c30be9c554e137269752ff3ac" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - is-buffer@^1.0.2: version "1.1.4" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" @@ -2295,10 +1737,6 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-error@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.1.tgz#684a96d84076577c98f4cdb40c6d26a5123bf19c" - is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -2319,10 +1757,6 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" -is-generator-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" - is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -2348,20 +1782,10 @@ is-number@^2.0.2, is-number@^2.1.0: dependencies: kind-of "^3.0.2" -is-obj@^1.0.0, is-obj@^1.0.1: +is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" -is-observable@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2" - dependencies: - symbol-observable "^0.2.2" - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -2370,10 +1794,6 @@ is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" @@ -2404,10 +1824,6 @@ is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" -is-url@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.2.tgz#498905a593bf47cc2d9e7f738372bbf7696c7f26" - is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -2438,6 +1854,265 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" +istanbul-api@^1.0.0-aplha.10: + version "1.0.0-aplha.10" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.0.0-aplha.10.tgz#902edf5cf5404e0eba7e00ef46408488a0d3e337" + dependencies: + async "1.x" + clone "^1.0.2" + fileset "0.2.x" + istanbul-lib-coverage "^1.0.0-alpha" + istanbul-lib-hook "^1.0.0-alpha" + istanbul-lib-instrument "^1.0.0-alpha" + istanbul-lib-report "^1.0.0-alpha" + istanbul-lib-source-maps "^1.0.0-alpha" + istanbul-reports "^1.0.0-alpha" + js-yaml "3.x" + mkdirp "0.5.x" + once "1.x" + +istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0.tgz#c3f9b6d226da12424064cce87fce0fb57fdfa7a2" + +istanbul-lib-hook@^1.0.0-alpha: + version "1.0.0-alpha.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0-alpha.4.tgz#8c5bb9f6fbd8526e0ae6cf639af28266906b938f" + dependencies: + append-transform "^0.3.0" + +istanbul-lib-instrument@^1.0.0-alpha, istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.1.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.3.0.tgz#19f0a973397454989b98330333063a5b56df0e58" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.13.0" + istanbul-lib-coverage "^1.0.0" + semver "^5.3.0" + +istanbul-lib-report@^1.0.0-alpha: + version "1.0.0-alpha.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af" + dependencies: + async "^1.4.2" + istanbul-lib-coverage "^1.0.0-alpha" + mkdirp "^0.5.1" + path-parse "^1.0.5" + rimraf "^2.4.3" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.0.0-alpha: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.0.tgz#9d429218f35b823560ea300a96ff0c3bbdab785f" + dependencies: + istanbul-lib-coverage "^1.0.0-alpha.0" + mkdirp "^0.5.1" + rimraf "^2.4.4" + source-map "^0.5.3" + +istanbul-reports@^1.0.0-alpha: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.0.tgz#24b4eb2b1d29d50f103b369bd422f6e640aa0777" + dependencies: + handlebars "^4.0.3" + +istanbul@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +jest-changed-files@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" + +jest-cli@^17.0.3: + version "17.0.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-17.0.3.tgz#700b8c02a9ea0ec9eab0cd5a9fd42d8a858ce146" + dependencies: + ansi-escapes "^1.4.0" + callsites "^2.0.0" + chalk "^1.1.1" + graceful-fs "^4.1.6" + is-ci "^1.0.9" + istanbul-api "^1.0.0-aplha.10" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-instrument "^1.1.1" + jest-changed-files "^17.0.2" + jest-config "^17.0.3" + jest-environment-jsdom "^17.0.2" + jest-file-exists "^17.0.0" + jest-haste-map "^17.0.3" + jest-jasmine2 "^17.0.3" + jest-mock "^17.0.2" + jest-resolve "^17.0.3" + jest-resolve-dependencies "^17.0.3" + jest-runtime "^17.0.3" + jest-snapshot "^17.0.3" + jest-util "^17.0.2" + json-stable-stringify "^1.0.0" + node-notifier "^4.6.1" + sane "~1.4.1" + strip-ansi "^3.0.1" + throat "^3.0.0" + which "^1.1.1" + worker-farm "^1.3.1" + yargs "^6.3.0" + +jest-config@^17.0.3: + version "17.0.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-17.0.3.tgz#b6ed75d90d090b731fd894231904cadb7d5a5df2" + dependencies: + chalk "^1.1.1" + istanbul "^0.4.5" + jest-environment-jsdom "^17.0.2" + jest-environment-node "^17.0.2" + jest-jasmine2 "^17.0.3" + jest-mock "^17.0.2" + jest-resolve "^17.0.3" + jest-util "^17.0.2" + json-stable-stringify "^1.0.0" + +jest-diff@^17.0.3: + version "17.0.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-17.0.3.tgz#8fb31efab3b314d7b61b7b66b0bdea617ef1c02f" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^17.0.3" + pretty-format "~4.2.1" + +jest-environment-jsdom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-17.0.2.tgz#a3098dc29806d40802c52b62b848ab6aa00fdba0" + dependencies: + jest-mock "^17.0.2" + jest-util "^17.0.2" + jsdom "^9.8.1" + +jest-environment-node@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-17.0.2.tgz#aff6133f4ca2faddcc5b0ce7d25cec83e16d8463" + dependencies: + jest-mock "^17.0.2" + jest-util "^17.0.2" + +jest-file-exists@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" + +jest-haste-map@^17.0.3: + version "17.0.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-17.0.3.tgz#5232783e70577217b6b17d2a1c1766637a1d2fbd" + dependencies: + fb-watchman "^1.9.0" + graceful-fs "^4.1.6" + multimatch "^2.1.0" + sane "~1.4.1" + worker-farm "^1.3.1" + +jest-jasmine2@^17.0.3: + version "17.0.3" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-17.0.3.tgz#d4336b89f3ad288269a1c8e2bfc180dcf89c6ad1" + dependencies: + graceful-fs "^4.1.6" + jest-matchers "^17.0.3" + jest-snapshot "^17.0.3" + jest-util "^17.0.2" + +jest-matcher-utils@^17.0.3: + version "17.0.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-17.0.3.tgz#f108e49b956e152c6626dcc0aba864f59ab7b0d3" + dependencies: + chalk "^1.1.3" + pretty-format "~4.2.1" + +jest-matchers@^17.0.3: + version "17.0.3" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-17.0.3.tgz#88b95348c919343db86d08f12354a8650ae7eddf" + dependencies: + jest-diff "^17.0.3" + jest-matcher-utils "^17.0.3" + jest-util "^17.0.2" + +jest-mock@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-17.0.2.tgz#3dfe9221afd9aa61b3d9992840813a358bb2f429" + +jest-resolve-dependencies@^17.0.3: + version "17.0.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-17.0.3.tgz#bbd37f4643704b97a980927212f3ab12b06e8894" + dependencies: + jest-file-exists "^17.0.0" + jest-resolve "^17.0.3" + +jest-resolve@^17.0.3: + version "17.0.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-17.0.3.tgz#7692a79de2831874375e9d664bc782c29e4da262" + dependencies: + browser-resolve "^1.11.2" + jest-file-exists "^17.0.0" + jest-haste-map "^17.0.3" + resolve "^1.1.6" + +jest-runtime@^17.0.3: + version "17.0.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-17.0.3.tgz#eff4055fe8c3e17c95ed1aaaf5f719c420b86b1f" + dependencies: + babel-core "^6.0.0" + babel-jest "^17.0.2" + babel-plugin-istanbul "^2.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.6" + jest-config "^17.0.3" + jest-file-exists "^17.0.0" + jest-haste-map "^17.0.3" + jest-mock "^17.0.2" + jest-resolve "^17.0.3" + jest-snapshot "^17.0.3" + jest-util "^17.0.2" + json-stable-stringify "^1.0.0" + multimatch "^2.1.0" + yargs "^6.3.0" + +jest-snapshot@^17.0.3: + version "17.0.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-17.0.3.tgz#c8199db4ccbd5515cfecc8e800ab076bdda7abc0" + dependencies: + jest-diff "^17.0.3" + jest-file-exists "^17.0.0" + jest-matcher-utils "^17.0.3" + jest-util "^17.0.2" + natural-compare "^1.4.0" + pretty-format "~4.2.1" + +jest-util@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-17.0.2.tgz#9fd9da8091e9904fb976da7e4d8912ca26968638" + dependencies: + chalk "^1.1.1" + diff "^3.0.0" + graceful-fs "^4.1.6" + jest-file-exists "^17.0.0" + jest-mock "^17.0.2" + mkdirp "^0.5.1" + jju@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jju/-/jju-1.3.0.tgz#dadd9ef01924bc728b03f2f7979bdbd62f7a2aaa" @@ -2452,7 +2127,7 @@ js-tokens@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" -js-yaml@^3.4.2, js-yaml@^3.7.0: +js-yaml@3.x, js-yaml@^3.4.2, js-yaml@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" dependencies: @@ -2463,14 +2138,35 @@ jsbn@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" +jsdom@^9.8.1: + version "9.8.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.8.3.tgz#fde29c109c32a1131e0b6c65914e64198f97c370" + dependencies: + abab "^1.0.0" + acorn "^2.4.0" + acorn-globals "^1.0.4" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.0 < 0.4.0" + cssstyle ">= 0.2.36 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + iconv-lite "^0.4.13" + nwmatcher ">= 1.3.7 < 2.0.0" + parse5 "^1.5.1" + request "^2.55.0" + sax "^1.1.4" + symbol-tree ">= 3.1.0 < 4.0.0" + tough-cookie "^2.3.1" + webidl-conversions "^3.0.1" + whatwg-encoding "^1.0.1" + whatwg-url "^3.0.0" + xml-name-validator ">= 2.0.1 < 3.0.0" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - json-parse-helpfulerror@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc" @@ -2481,6 +2177,12 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-stable-stringify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -2493,12 +2195,16 @@ 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: graceful-fs "^4.1.6" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + jsonparse@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.2.0.tgz#5c0c5685107160e72fe7489bddea0b44c2bc67bd" @@ -2521,18 +2227,12 @@ 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: graceful-fs "^4.1.9" -last-line-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/last-line-stream/-/last-line-stream-1.0.0.tgz#d1b64d69f86ff24af2d04883a2ceee14520a5600" - dependencies: - through2 "^2.0.0" - latest-version@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" @@ -2559,6 +2259,13 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + linkify-it@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.2.tgz#994629a4adfa5a7d34e08c075611575ab9b6fcfc" @@ -2575,14 +2282,13 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" +lodash._arraycopy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" + +lodash._arrayeach@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" lodash._baseassign@^3.0.0: version "3.2.0" @@ -2591,10 +2297,25 @@ lodash._baseassign@^3.0.0: lodash._basecopy "^3.0.0" lodash.keys "^3.0.0" +lodash._baseclone@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" + dependencies: + lodash._arraycopy "^3.0.0" + lodash._arrayeach "^3.0.0" + lodash._baseassign "^3.0.0" + lodash._basefor "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" +lodash._basefor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" + lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" @@ -2627,21 +2348,16 @@ lodash.assign@^3.0.0: lodash._createassigner "^3.0.0" lodash.keys "^3.0.0" -lodash.assign@^4.0.3, lodash.assign@^4.0.6: +lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - -lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" +lodash.clonedeep@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" + dependencies: + lodash._baseclone "^3.0.0" + lodash._bindcallback "^3.0.0" lodash.isarguments@^3.0.0: version "3.1.0" @@ -2651,10 +2367,6 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" -lodash.isequal@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.4.0.tgz#6295768e98e14dc15ce8d362ef6340db82852031" - lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -2685,8 +2397,8 @@ lodash@^3.6.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" lodash@^4.0.0, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.5.1, lodash@^4.8.0: - version "4.17.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.1.tgz#e75eaf17a34730c6491d9956f4d81f3a044f01bf" + version "4.17.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" longest@^1.0.1: version "1.0.1" @@ -2698,7 +2410,7 @@ loose-envify@^1.0.0: dependencies: js-tokens "^2.0.0" -loud-rejection@^1.0.0, loud-rejection@^1.6.0: +loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" dependencies: @@ -2709,17 +2421,16 @@ lowercase-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" -lru-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.1.tgz#1343955edaf2e37d9b9e7ee7241e27c4b9fb72be" - dependencies: - pseudomap "^1.0.1" - yallist "^2.0.0" - macaddress@^0.2.7: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -2738,31 +2449,25 @@ markdown-it@^8.1.0: mdurl "^1.0.1" uc.micro "^1.0.3" -matcher@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-0.1.2.tgz#ef20cbde64c24c50cc61af5b83ee0b1b8ff00101" - dependencies: - escape-string-regexp "^1.0.4" - -max-timeout@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/max-timeout/-/max-timeout-1.0.0.tgz#b68f69a2f99e0b476fd4cb23e2059ca750715e1f" - -md5-hex@^1.2.0, md5-hex@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" +marked-terminal@^1.6.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" dependencies: - md5-o-matic "^0.1.1" + cardinal "^1.0.0" + chalk "^1.1.3" + cli-table "^0.3.1" + lodash.assign "^4.2.0" + node-emoji "^1.4.1" -md5-o-matic@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" +marked@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" -meow@^3.1.0, meow@^3.3.0, meow@^3.7.0: +meow@^3.1.0, meow@^3.3.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" dependencies: @@ -2777,7 +2482,11 @@ meow@^3.1.0, meow@^3.3.0, meow@^3.7.0: redent "^1.0.0" trim-newlines "^1.0.0" -micromatch@^2.1.5: +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -2795,15 +2504,15 @@ micromatch@^2.1.5: parse-glob "^3.0.4" regex-cache "^0.4.2" -mime-db@~1.24.0: - version "1.24.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" +mime-db@~1.25.0: + version "1.25.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" mime-types@^2.1.12, mime-types@~2.1.7: - version "2.1.12" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" + version "2.1.13" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" dependencies: - mime-db "~1.24.0" + mime-db "~1.25.0" mime@^1.2.11, mime@^1.3.4: version "1.3.4" @@ -2815,15 +2524,21 @@ mime@^1.2.11, mime@^1.3.4: dependencies: brace-expansion "^1.0.0" +minimatch@2.x: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: +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 0", 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: @@ -2837,11 +2552,7 @@ modify-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2" -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - -ms@0.7.2, ms@^0.7.1: +ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" @@ -2854,21 +2565,9 @@ 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" - -nan@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" - -ncp@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" node-emoji@^1.4.1: version "1.4.1" @@ -2876,29 +2575,27 @@ node-emoji@^1.4.1: dependencies: string.prototype.codepointat "^0.2.0" -node-pre-gyp@^0.6.29: - version "0.6.31" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.31.tgz#d8a00ddaa301a940615dbcc8caad4024d58f6017" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" dependencies: - mkdirp "~0.5.1" - nopt "~3.0.6" - npmlog "^4.0.0" - rc "~1.1.6" - request "^2.75.0" - rimraf "~2.5.4" - semver "~5.3.0" - tar "~2.2.1" - tar-pack "~3.3.0" + cli-usage "^0.1.1" + growly "^1.2.0" + lodash.clonedeep "^3.0.0" + minimist "^1.1.1" + semver "^5.1.0" + shellwords "^0.1.0" + which "^1.0.5" node-status-codes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" -node-uuid@~1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" - -nopt@^3.0.1, nopt@~3.0.6: +nopt@3.x, nopt@^3.0.1: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -2943,8 +2640,8 @@ normalize-path@^2.0.0, normalize-path@^2.0.1: semver "^5.1.0" npm-registry-client@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-7.3.0.tgz#f2a390e8b13b78fafe26e9fa9d8bc74e17bcaa50" + version "7.4.1" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-7.4.1.tgz#e9e5de15bb498fe49fff87f7cf9aece21e071e42" dependencies: concat-stream "^1.5.2" graceful-fs "^4.1.6" @@ -2956,42 +2653,37 @@ npm-registry-client@^7.3.0: semver "2 >=2.2.1 || 3.x || 4 || 5" slide "^1.1.3" optionalDependencies: - npmlog "~2.0.0 || ~3.1.0" - -npmlog@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.6.0" - set-blocking "~2.0.0" + npmlog "2 || ^3.1.0 || ^4.0.0" -"npmlog@~2.0.0 || ~3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" +"npmlog@2 || ^3.1.0 || ^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.1.tgz#d14f503b4cd79710375553004ba96e6662fbc0b8" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" - gauge "~2.6.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: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" +"nwmatcher@>= 1.3.7 < 2.0.0": + version "1.3.9" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" + oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -3011,20 +2703,13 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -observable-to-promise@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-0.4.0.tgz#28afe71645308f2d41d71f47ad3fece1a377e52b" - dependencies: - is-observable "^0.2.0" - symbol-observable "^0.2.2" - -once@^1.3.0, once@^1.3.3: +once@1.x, once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: wrappy "1" -once@~1.3.0, once@~1.3.3: +once@~1.3.0: version "1.3.3" resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" dependencies: @@ -3041,11 +2726,16 @@ optimist@^0.6.1, optimist@~0.6.0: minimist "~0.0.1" wordwrap "~0.0.2" -option-chain@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/option-chain/-/option-chain-0.1.1.tgz#e9b811e006f1c0f54802f28295bfc8970f8dcfbd" +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: - object-assign "^4.0.1" + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" os-homedir@^1.0.0: version "1.0.2" @@ -3068,12 +2758,6 @@ osenv@^0.1.0: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -package-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-1.2.0.tgz#003e56cd57b736a6ed6114cc2b81542672770e44" - dependencies: - md5-hex "^1.3.0" - package-json@^2.0.0: version "2.4.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" @@ -3108,17 +2792,13 @@ parse-json@^2.1.0, parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse-ms@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-0.1.2.tgz#dd3fa25ed6c2efc7bdde12ad9b46c163aa29224e" - parse-ms@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" -path-exists@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" path-exists@^2.0.0: version "2.1.0" @@ -3126,6 +2806,10 @@ path-exists@^2.0.0: 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" @@ -3137,6 +2821,10 @@ path-object@^2.3.0: core-util-is "^1.0.1" lodash.assign "^3.0.0" +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + path-sort@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/path-sort/-/path-sort-0.1.0.tgz#cb0175d4ecbfa5a18fe674cc6d720bfe15e0b805" @@ -3159,39 +2847,16 @@ pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" -pinkie-promise@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-1.0.0.tgz#d1da67f5482563bb7cf57f286ae2822ecfbf3670" - dependencies: - pinkie "^1.0.0" - pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" dependencies: pinkie "^2.0.0" -pinkie@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-1.0.0.tgz#5a47f28ba1015d0201bda7bf0f358e47bec8c7e4" - pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pkg-conf@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.0.0.tgz#071c87650403bccfb9c627f58751bfe47c067279" - dependencies: - find-up "^2.0.0" - load-json-file "^2.0.0" - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - dependencies: - find-up "^1.0.0" - plist@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/plist/-/plist-2.0.1.tgz#0a32ca9481b1c364e92e18dc55c876de9d01da8b" @@ -3204,58 +2869,9 @@ plur@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" -plur@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" - dependencies: - irregular-plurals "^1.0.0" - -power-assert-context-formatter@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/power-assert-context-formatter/-/power-assert-context-formatter-1.1.1.tgz#edba352d3ed8a603114d667265acce60d689ccdf" - dependencies: - core-js "^2.0.0" - power-assert-context-traversal "^1.1.1" - -power-assert-context-traversal@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/power-assert-context-traversal/-/power-assert-context-traversal-1.1.1.tgz#88cabca0d13b6359f07d3d3e8afa699264577ed9" - dependencies: - core-js "^2.0.0" - estraverse "^4.1.0" - -power-assert-renderer-assertion@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.1.1.tgz#cbfc0e77e0086a8f96af3f1d8e67b9ee7e28ce98" - dependencies: - power-assert-renderer-base "^1.1.1" - power-assert-util-string-width "^1.1.1" - -power-assert-renderer-base@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz#96a650c6fd05ee1bc1f66b54ad61442c8b3f63eb" - -power-assert-renderer-diagram@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.1.1.tgz#7e0c82cc08a84b155e51b5ae94f59709778a65fb" - dependencies: - core-js "^2.0.0" - power-assert-renderer-base "^1.1.1" - power-assert-util-string-width "^1.1.1" - stringifier "^1.3.0" - -power-assert-renderer-succinct@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/power-assert-renderer-succinct/-/power-assert-renderer-succinct-1.1.1.tgz#c2a468b23822abd6f80e2aba5322347b09df476e" - dependencies: - core-js "^2.0.0" - power-assert-renderer-diagram "^1.1.1" - -power-assert-util-string-width@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/power-assert-util-string-width/-/power-assert-util-string-width-1.1.1.tgz#be659eb7937fdd2e6c9a77268daaf64bd5b7c592" - dependencies: - eastasianwidth "^0.1.1" +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" prepend-http@^1.0.1: version "1.0.4" @@ -3272,11 +2888,9 @@ pretty-bytes@^1.0.2: get-stdin "^4.0.1" meow "^3.1.0" -pretty-ms@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-0.2.2.tgz#da879a682ff33a37011046f13d627f67c73b84f6" - dependencies: - parse-ms "^0.1.0" +pretty-format@~4.2.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-4.2.3.tgz#8894c2ac81419cf801629d8f66320a25380d8b05" pretty-ms@^2.1.0: version "2.1.0" @@ -3286,7 +2900,7 @@ pretty-ms@^2.1.0: parse-ms "^1.0.0" plur "^1.0.0" -private@^0.1.6, private@~0.1.5: +private@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" @@ -3305,9 +2919,9 @@ progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" -pseudomap@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" punycode@^1.4.1: version "1.4.1" @@ -3328,7 +2942,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.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: @@ -3414,18 +3028,6 @@ readable-stream@~2.0.0, readable-stream@~2.0.5: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readable-stream@~2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" - dependencies: - buffer-shims "^1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" @@ -3435,15 +3037,6 @@ readdir-scoped-modules@^1.0.0: graceful-fs "^4.1.2" once "^1.3.0" -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -3451,9 +3044,11 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -regenerate@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" +redeyed@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + dependencies: + esprima "~3.0.0" regenerator-runtime@^0.9.5: version "0.9.6" @@ -3466,14 +3061,6 @@ regex-cache@^0.4.2: is-equal-shallow "^0.1.3" is-primitive "^2.0.0" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - registry-auth-token@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.0.tgz#997c08256e0c7999837b90e944db39d8a790276b" @@ -3486,16 +3073,6 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" @@ -3510,13 +3087,9 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -repeating@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-3.0.0.tgz#f4c376fdd2015761f6f96f4303b1224d581e802f" - -request@^2.45.0, request@^2.74.0, request@^2.75.0: - version "2.78.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.78.0.tgz#e1c8dec346e1c81923b24acdb337f11decabe9cc" +request@^2.45.0, request@^2.55.0, request@^2.74.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" @@ -3532,12 +3105,12 @@ request@^2.45.0, request@^2.74.0, request@^2.75.0: isstream "~0.1.2" json-stringify-safe "~5.0.1" mime-types "~2.1.7" - node-uuid "~1.4.7" oauth-sign "~0.8.1" qs "~6.3.0" stringstream "~0.0.4" tough-cookie "~2.3.0" tunnel-agent "~0.4.1" + uuid "^3.0.0" require-directory@^2.1.1: version "2.1.1" @@ -3551,25 +3124,11 @@ require-package-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" -require-precompiled@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" - require-relative@^0.8.7: version "0.8.7" resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" -resolve-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-1.0.0.tgz#4eaeea41ed040d1702457df64a42b2b07d246f9f" - dependencies: - resolve-from "^2.0.0" - -resolve-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - -resolve@^1.1.7: +resolve@1.1.7, resolve@1.1.x, resolve@^1.1.6, resolve@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" @@ -3590,18 +3149,12 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@~2.5.1, rimraf@~2.5.4: +rimraf@^2.4.3, rimraf@^2.4.4: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: glob "^7.0.5" -rimraf@~2.4.0: - version "2.4.5" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" - dependencies: - glob "^6.0.1" - run-auto@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/run-auto/-/run-auto-2.0.0.tgz#5f4353f58adbd6b74926489b4f259e1dad6a78d6" @@ -3612,12 +3165,27 @@ run-series@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/run-series/-/run-series-1.1.4.tgz#89a73ddc5e75c9ef8ab6320c0a1600d6a41179b9" +sane@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.4.1.tgz#88f763d74040f5f0c256b6163db399bf110ac715" + dependencies: + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + sanitize-filename@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" dependencies: truncate-utf8-bytes "^1.0.0" +sax@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" @@ -3628,7 +3196,7 @@ semver-regex@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" -"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -3644,26 +3212,24 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +shellwords@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" 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" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - slide@^1.1.3, slide@^1.1.5, slide@~1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -3674,13 +3240,7 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -sort-keys@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - dependencies: - is-plain-obj "^1.0.0" - -source-map-support@^0.4.2, source-map-support@^0.4.4, source-map-support@^0.4.6: +source-map-support@^0.4.2, source-map-support@^0.4.6: version "0.4.6" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb" dependencies: @@ -3696,6 +3256,12 @@ source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -3751,10 +3317,6 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -stack-utils@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-0.4.0.tgz#940cb82fccfa84e8ff2f3fdf293fe78016beccd1" - stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -3781,14 +3343,6 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" -stringifier@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/stringifier/-/stringifier-1.3.0.tgz#def18342f6933db0f2dbfc9aa02175b448c17959" - dependencies: - core-js "^2.0.0" - traverse "^0.6.6" - type-name "^2.0.1" - stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -3799,20 +3353,12 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" -strip-ansi@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -3823,26 +3369,26 @@ 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" -symbol-observable@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" - -tar-pack@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" +supports-color@^3.1.0, supports-color@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" dependencies: - debug "~2.2.0" - fstream "~1.0.10" - fstream-ignore "~1.0.5" - once "~1.3.3" - readable-stream "~2.1.4" - rimraf "~2.5.1" - tar "~2.2.1" - uid-number "~0.0.6" + has-flag "^1.0.0" + +"symbol-tree@>= 3.1.0 < 4.0.0": + version "3.1.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.1.4.tgz#02b279348d337debc39694c5c95f882d448a312a" tar-stream@^1.5.0: version "1.5.2" @@ -3853,32 +3399,23 @@ tar-stream@^1.5.0: readable-stream "^2.0.0" xtend "^4.0.0" -tar@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -tempfile@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" +test-exclude@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-2.1.3.tgz#a8d8968e1da83266f9864f2852c55e220f06434a" dependencies: - os-tmpdir "^1.0.0" - uuid "^2.0.1" + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" text-extensions@^1.0.0: version "1.3.3" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.3.3.tgz#fef0c8ce07f5bb3b8297bcf075304531754124bf" -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -the-argv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/the-argv/-/the-argv-1.0.0.tgz#0084705005730dd84db755253c931ae398db9522" +throat@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6" throttleit@0.0.2: version "0.0.2" @@ -3902,19 +3439,14 @@ through@2, "through@>=2.2.7 <3", through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -time-require@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/time-require/-/time-require-0.1.2.tgz#f9e12cb370fc2605e11404582ba54ef5ca2b2d98" - dependencies: - chalk "^0.4.0" - date-time "^0.1.1" - pretty-ms "^0.2.1" - text-table "^0.2.0" - timed-out@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.0.0.tgz#ff88de96030ce960eabd42487db61d3add229273" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + to-fast-properties@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" @@ -3925,20 +3457,20 @@ touch@0.0.3: dependencies: nopt "~1.0.10" -tough-cookie@~2.3.0: +tough-cookie@^2.3.1, tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" dependencies: punycode "^1.4.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + "traverse@>=0.3.0 <0.4": version "0.3.9" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" -traverse@^0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" - trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -3964,7 +3496,7 @@ ts-babel@^1.1.4: markdown-it "^8.1.0" source-map-support "^0.4.6" -tslint@^4.0.0-dev.1: +tslint@4.0.0-dev.1: version "4.0.0-dev.1" resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.0.0-dev.1.tgz#10146c7ff47e18ce41315c146ff03dbdb5eb8abc" dependencies: @@ -3984,9 +3516,11 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" -type-name@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/type-name/-/type-name-2.0.2.tgz#efe7d4123d8ac52afff7f40c7e4dec5266008fb4" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" typedarray@~0.0.5: version "0.0.6" @@ -4013,14 +3547,6 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" -uid-number@~0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -uid2@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" - underscore.string@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" @@ -4028,14 +3554,6 @@ underscore.string@^3.3.4: sprintf-js "^1.0.3" util-deprecate "^1.0.2" -unique-temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz#6dce95b2681ca003eebfb304a415f9cbabcc5385" - dependencies: - mkdirp "^0.5.1" - os-tmpdir "^1.0.1" - uid2 "0.0.3" - unzip-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" @@ -4081,6 +3599,10 @@ uuid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" +uuid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.0.tgz#6728fc0459c450d796a99c31837569bdf672d728" + validate-commit-msg@^2.8.2: version "2.8.2" resolved "https://registry.yarnpkg.com/validate-commit-msg/-/validate-commit-msg-2.8.2.tgz#3020c4227523e6964214537427c1fb058007eaab" @@ -4112,11 +3634,38 @@ walkdir@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +webidl-conversions@^3.0.0, webidl-conversions@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + +whatwg-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-3.0.0.tgz#b9033c50c7ce763e91d78777ce825a6d7f56dac5" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@^1.2.9: +which@^1.0.5, which@^1.1.1: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" dependencies: @@ -4154,10 +3703,21 @@ wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" +worker-farm@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + wrap-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f" @@ -4168,7 +3728,7 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: +write-file-atomic@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" dependencies: @@ -4176,30 +3736,16 @@ write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: imurmurhash "^0.1.4" slide "^1.1.5" -write-json-file@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-1.2.0.tgz#2d5dfe96abc3c889057c93971aa4005efb548134" - dependencies: - graceful-fs "^4.1.2" - mkdirp "^0.5.1" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - sort-keys "^1.1.1" - write-file-atomic "^1.1.2" - -write-pkg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-1.0.0.tgz#aeb8aa9d4d788e1d893dfb0854968b543a919f57" - dependencies: - write-json-file "^1.1.0" - xdg-basedir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" dependencies: os-homedir "^1.0.0" +"xml-name-validator@>= 2.0.1 < 3.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + xmlbuilder@8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" @@ -4208,7 +3754,7 @@ xmldom@0.1.x: version "0.1.22" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.22.tgz#10de4e5e964981f03c8cc72fadc08d14b6c3aa26" -xtend@^4.0.0, xtend@~4.0.0: +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -4222,43 +3768,13 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -yallist@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" - -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - yargs-parser@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.1.0.tgz#313df030f20124124aeae8fbab2da53ec28c56d7" dependencies: camelcase "^3.0.0" -yargs@^4.0.0: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" - -yargs@^6.4.0: +yargs@^6.0.0, yargs@^6.3.0, yargs@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.4.0.tgz#816e1a866d5598ccf34e5596ddce22d92da490d4" dependencies: