From 8363b2ff44a5b13043f4d8d82970e5cc44df22c4 Mon Sep 17 00:00:00 2001 From: develar Date: Wed, 7 Feb 2018 17:27:08 +0100 Subject: [PATCH] refactor: move doGetBin implementation to app-builder --- package.json | 6 +- packages/builder-util/package.json | 2 +- packages/builder-util/src/binDownload.ts | 71 ++--- packages/builder-util/src/util.ts | 36 +-- packages/electron-builder-lib/package.json | 2 +- packages/electron-builder-lib/src/codeSign.ts | 16 +- .../electron-builder-lib/src/targets/tools.ts | 2 +- packages/electron-publisher-s3/package.json | 2 +- yarn.lock | 264 +++++++++--------- 9 files changed, 178 insertions(+), 223 deletions(-) diff --git a/package.json b/package.json index d8ba6f3b0c3..c309c4b7660 100644 --- a/package.json +++ b/package.json @@ -29,10 +29,10 @@ "////": "All typings are added into root `package.json` to avoid duplication errors in the IDE compiler (several `node.d.ts` files).", "dependencies": { "7zip-bin": "~3.1.0", - "app-builder-bin": "1.0.5", + "app-builder-bin": "1.1.0", "archiver": "^2.1.1", "async-exit-hook": "^2.0.1", - "aws-sdk": "^2.188.0", + "aws-sdk": "^2.190.0", "bluebird-lst": "^1.0.5", "chalk": "^2.3.0", "chromium-pickle-js": "^0.2.0", @@ -95,7 +95,7 @@ "gitbook-plugin-github": "^2.0.0", "gitbook-plugin-github-buttons": "^3.0.0", "globby": "^7.1.1", - "jest-cli": "^22.1.4", + "jest-cli": "^22.2.1", "jest-junit": "^3.5.0", "jsdoc-to-markdown": "^4.0.1", "path-sort": "^0.1.0", diff --git a/packages/builder-util/package.json b/packages/builder-util/package.json index 49ab69df7db..e19f17ea63a 100644 --- a/packages/builder-util/package.json +++ b/packages/builder-util/package.json @@ -11,7 +11,7 @@ "out" ], "dependencies": { - "app-builder-bin": "1.0.5", + "app-builder-bin": "1.1.0", "temp-file": "^3.1.1", "fs-extra-p": "^4.5.0", "is-ci": "^1.1.0", diff --git a/packages/builder-util/src/binDownload.ts b/packages/builder-util/src/binDownload.ts index b4d0c7a0078..5c3de427082 100644 --- a/packages/builder-util/src/binDownload.ts +++ b/packages/builder-util/src/binDownload.ts @@ -1,72 +1,45 @@ import { path7za } from "7zip-bin" import { appBuilderPath } from "app-builder-bin" -import { emptyDir, rename, unlink } from "fs-extra-p" -import * as path from "path" -import { getTempName } from "temp-file" -import { statOrNull } from "./fs" -import { debug7zArgs, getCacheDirectory, log, spawn } from "./util" +import { spawn } from "./util" const versionToPromise = new Map>() +export function download(url: string, output: string, checksum?: string | null): Promise { + const args = ["download", "--url", url, "--output", output] + if (checksum != null) { + args.push("--sha512", checksum) + } + return spawn(appBuilderPath, args) +} + export function getBinFromGithub(name: string, version: string, checksum: string): Promise { const dirName = `${name}-${version}` - return getBin(name, dirName, `https://github.com/electron-userland/electron-builder-binaries/releases/download/${dirName}/${dirName}.7z`, checksum) + return getBin(dirName, `https://github.com/electron-userland/electron-builder-binaries/releases/download/${dirName}/${dirName}.7z`, checksum) } -export function getBin(name: string, dirName: string, url: string, checksum: string): Promise { - let promise = versionToPromise.get(dirName) +export function getBin(name: string, url: string, checksum: string): Promise { + let promise = versionToPromise.get(name) // if rejected, we will try to download again if (promise != null) { return promise } - promise = doGetBin(name, dirName, url, checksum) - versionToPromise.set(dirName, promise) + promise = doGetBin(name, url, checksum) + versionToPromise.set(name, promise) return promise } -export function download(url: string, output: string, checksum?: string | null): Promise { - const args = ["download", "--url", url, "--output", output] +function doGetBin(name: string, url: string, checksum: string): Promise { + const args = ["download-artifact", "--url", url, "--name", name] if (checksum != null) { args.push("--sha512", checksum) } - return spawn(appBuilderPath, args) -} - -// we cache in the global location - in the home dir, not in the node_modules/.cache (https://www.npmjs.com/package/find-cache-dir) because -// * don't need to find node_modules -// * don't pollute user project dir (important in case of 1-package.json project structure) -// * simplify/speed-up tests (don't download fpm for each test project) -async function doGetBin(name: string, dirName: string, url: string, checksum: string): Promise { - const cachePath = path.join(getCacheDirectory(), name) - const dirPath = path.join(cachePath, dirName) - const logFlags = {path: dirPath} - - const dirStat = await statOrNull(dirPath) - if (dirStat != null && dirStat.isDirectory()) { - log.debug(logFlags, "found existing") - return dirPath - } - - log.info({...logFlags, url}, "downloading") - - // 7z cannot be extracted from the input stream, temp file is required - const tempUnpackDir = path.join(cachePath, getTempName()) - const archiveName = `${tempUnpackDir}.7z` - // 7z doesn't create out dir, so, we don't create dir in parallel to download - dir creation will create parent dirs for archive file also - await emptyDir(tempUnpackDir) - await download(url, archiveName, checksum) - await spawn(path7za, debug7zArgs("x").concat(archiveName, `-o${tempUnpackDir}`), { - cwd: cachePath, + return spawn(appBuilderPath, args, { + env: { + ...process.env, + SZA_PATH: path7za, + }, + stdio: ["ignore", "pipe", "inherit"] }) - - await Promise.all([ - rename(tempUnpackDir, dirPath) - .catch(e => log.debug({...logFlags, tempUnpackDir, e}, `cannot move downloaded into final location (another process downloaded faster?)`)), - unlink(archiveName), - ]) - - log.debug(logFlags, `downloaded`) - return dirPath } \ No newline at end of file diff --git a/packages/builder-util/src/util.ts b/packages/builder-util/src/util.ts index 6695d96a7ed..9e472bf80b8 100644 --- a/packages/builder-util/src/util.ts +++ b/packages/builder-util/src/util.ts @@ -5,7 +5,6 @@ import { ChildProcess, execFile, ExecFileOptions, spawn as _spawn, SpawnOptions import { createHash } from "crypto" import _debug from "debug" import { safeDump } from "js-yaml" -import { homedir, tmpdir } from "os" import * as path from "path" import "source-map-support/register" import { debug, log } from "./log" @@ -147,8 +146,8 @@ export function doSpawn(command: string, args: Array, options?: SpawnOpt options.env = getProcessEnv(options.env) - const isDebugEnabled = extraOptions == null || extraOptions.isDebugEnabled == null ? debug.enabled : extraOptions.isDebugEnabled if (options.stdio == null) { + const isDebugEnabled = extraOptions == null || extraOptions.isDebugEnabled == null ? debug.enabled : extraOptions.isDebugEnabled // do not ignore stdout/stderr if not debug, because in this case we will read into buffer and print on error options.stdio = [extraOptions != null && extraOptions.isPipeInput ? "pipe" : "ignore", isDebugEnabled ? "inherit" : "pipe", isDebugEnabled ? "inherit" : "pipe"] } @@ -178,7 +177,7 @@ export function spawnAndWrite(command: string, args: Array, data: string const childProcess = doSpawn(command, args, options, {isPipeInput: true, isDebugEnabled}) const timeout = setTimeout(() => childProcess.kill(), 4 * 60 * 1000) return new BluebirdPromise((resolve, reject) => { - handleProcess("close", childProcess, command, () => { + handleProcess("close", childProcess, command, false, () => { try { clearTimeout(timeout) } @@ -200,15 +199,16 @@ export function spawnAndWrite(command: string, args: Array, data: string export function spawn(command: string, args?: Array | null, options?: SpawnOptions, extraOptions?: ExtraSpawnOptions): Promise { return new BluebirdPromise((resolve, reject) => { - handleProcess("close", doSpawn(command, args || [], options, extraOptions), command, resolve, reject) + const isCollectOutput = options != null && (options.stdio === "pipe" || (Array.isArray(options.stdio) && options.stdio.length === 3 && options.stdio[1] === "pipe")) + handleProcess("close", doSpawn(command, args || [], options, extraOptions), command, isCollectOutput, resolve, reject) }) } -export function handleProcess(event: string, childProcess: ChildProcess, command: string, resolve: ((value?: any) => void) | null, reject: (reason?: any) => void) { +function handleProcess(event: string, childProcess: ChildProcess, command: string, isCollectOutput: boolean, resolve: ((value?: any) => void) | null, reject: (reason?: any) => void) { childProcess.on("error", reject) let out = "" - if (!debug.enabled && childProcess.stdout != null) { + if (isCollectOutput && childProcess.stdout != null) { childProcess.stdout.on("data", (data: string) => { out += data }) @@ -232,7 +232,7 @@ export function handleProcess(event: string, childProcess: ChildProcess, command if (code === 0) { if (resolve != null) { - resolve() + resolve(out) } } else { @@ -265,28 +265,6 @@ export function isTokenCharValid(token: string) { return /^[\w\/=+-]+$/.test(token) } -export function getCacheDirectory(): string { - const env = process.env.ELECTRON_BUILDER_CACHE - if (!isEmptyOrSpaces(env)) { - return env! - } - - if (process.platform === "darwin") { - return path.join(homedir(), "Library", "Caches", "electron-builder") - } - - const localappdata = process.env.LOCALAPPDATA - if (process.platform === "win32" && localappdata != null) { - // https://github.com/electron-userland/electron-builder/issues/1164 - if (localappdata.toLowerCase().includes("\\windows\\system32\\") || (process.env.USERNAME || "").toLowerCase() === "system") { - return path.join(tmpdir(), "electron-builder-cache") - } - return path.join(localappdata, "electron-builder", "cache") - } - - return path.join(homedir(), ".cache", "electron-builder") -} - // fpm bug - rpm build --description is not escaped, well... decided to replace quite to smart quote // http://leancrew.com/all-this/2010/11/smart-quotes-in-javascript/ export function smarten(s: string): string { diff --git a/packages/electron-builder-lib/package.json b/packages/electron-builder-lib/package.json index f138fdfeefc..53ac2af347b 100644 --- a/packages/electron-builder-lib/package.json +++ b/packages/electron-builder-lib/package.json @@ -42,7 +42,7 @@ "homepage": "https://github.com/electron-userland/electron-builder", "dependencies": { "7zip-bin": "~3.1.0", - "app-builder-bin": "1.0.5", + "app-builder-bin": "1.1.0", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.5", "chromium-pickle-js": "^0.2.0", diff --git a/packages/electron-builder-lib/src/codeSign.ts b/packages/electron-builder-lib/src/codeSign.ts index d6f5b17a5dd..b3a97a7b7ec 100644 --- a/packages/electron-builder-lib/src/codeSign.ts +++ b/packages/electron-builder-lib/src/codeSign.ts @@ -1,6 +1,6 @@ import { appBuilderPath } from "app-builder-bin" import BluebirdPromise from "bluebird-lst" -import { exec, getCacheDirectory, InvalidConfigurationError, isEmptyOrSpaces, isEnvTrue, isMacOsSierra, isPullRequest, log, TmpDir } from "builder-util" +import { exec, InvalidConfigurationError, isEmptyOrSpaces, isEnvTrue, isMacOsSierra, isPullRequest, log, TmpDir } from "builder-util" import { copyFile, statOrNull, unlinkIfExists } from "builder-util/out/fs" import { Fields, Logger } from "builder-util/out/log" import { randomBytes } from "crypto" @@ -132,16 +132,15 @@ export async function downloadCertificate(urlOrBase64: string, tmpDir: TmpDir, c } } -const bundledCertKeychainAdded = new Lazy(createCustomCertKeychain) - // "Note that filename will not be searched to resolve the signing identity's certificate chain unless it is also on the user's keychain search list." // but "security list-keychains" doesn't support add - we should 1) get current list 2) set new list - it is very bad http://stackoverflow.com/questions/10538942/add-a-keychain-to-search-list // "overly complicated and introduces a race condition." // https://github.com/electron-userland/electron-builder/issues/398 -async function createCustomCertKeychain() { +const bundledCertKeychainAdded = new Lazy(async () => { // copy to temp and then atomic rename to final path - const tmpKeychainPath = path.join(getCacheDirectory(), getTempName("electron-builder-root-certs")) - const keychainPath = path.join(getCacheDirectory(), "electron-builder-root-certs.keychain") + const cacheDir = getCacheDirectory() + const tmpKeychainPath = path.join(cacheDir, getTempName("electron-builder-root-certs")) + const keychainPath = path.join(cacheDir, "electron-builder-root-certs.keychain") const results = await Promise.all([ listUserKeychains(), copyFile(path.join(__dirname, "..", "certs", "root_certs.keychain"), tmpKeychainPath) @@ -151,6 +150,11 @@ async function createCustomCertKeychain() { if (!list.includes(keychainPath)) { await exec("security", ["list-keychains", "-d", "user", "-s", keychainPath].concat(list)) } +}) + +function getCacheDirectory(): string { + const env = process.env.ELECTRON_BUILDER_CACHE + return isEmptyOrSpaces(env) ? path.join(homedir(), "Library", "Caches", "electron-builder") : env!! } function listUserKeychains(): Promise> { diff --git a/packages/electron-builder-lib/src/targets/tools.ts b/packages/electron-builder-lib/src/targets/tools.ts index 679d87ea645..049f3f19c3c 100644 --- a/packages/electron-builder-lib/src/targets/tools.ts +++ b/packages/electron-builder-lib/src/targets/tools.ts @@ -114,6 +114,6 @@ export function getTool(descriptor: ToolDescriptor): Promise { const name = descriptor.name const repository = descriptor.repository || "electron-userland/electron-builder-binaries" const tagPrefix = descriptor.repository == null ? `${name}-` : "v" - return getBin(name, `${name}-v${version}-${process.arch}`, `https://github.com/${repository}/releases/download/${tagPrefix}${version}/${name}-v${version}-${platform.buildConfigurationKey}${archQualifier}.7z`, checksum) + return getBin(`${name}-${version}-${process.arch}`, `https://github.com/${repository}/releases/download/${tagPrefix}${version}/${name}-v${version}-${platform.buildConfigurationKey}${archQualifier}.7z`, checksum) .then(it => path.join(it, `${name}${platform === Platform.WINDOWS ? ".exe" : ""}`)) } \ No newline at end of file diff --git a/packages/electron-publisher-s3/package.json b/packages/electron-publisher-s3/package.json index d734a5f53b5..d03f84fc9a6 100644 --- a/packages/electron-publisher-s3/package.json +++ b/packages/electron-publisher-s3/package.json @@ -12,7 +12,7 @@ ], "dependencies": { "fs-extra-p": "^4.5.0", - "aws-sdk": "^2.188.0", + "aws-sdk": "^2.190.0", "mime": "^2.2.0", "electron-publish": "~0.0.0-semantic-release", "builder-util": "^0.0.0-semantic-release", diff --git a/yarn.lock b/yarn.lock index 19be3809122..24e72ce2054 100644 --- a/yarn.lock +++ b/yarn.lock @@ -262,25 +262,25 @@ anymatch@^1.3.0: micromatch "^2.1.5" normalize-path "^2.0.0" -app-builder-bin-linux@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/app-builder-bin-linux/-/app-builder-bin-linux-1.0.4.tgz#946b9d42574a8b8c894fc5c5f2141fc98289a267" +app-builder-bin-linux@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/app-builder-bin-linux/-/app-builder-bin-linux-1.1.0.tgz#923a6d8af2e18514415bc16ace2f8ef9c16a2153" -app-builder-bin-mac@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/app-builder-bin-mac/-/app-builder-bin-mac-1.0.4.tgz#0716f67736161502c2acac1eaafd3c5cb5bf187d" +app-builder-bin-mac@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/app-builder-bin-mac/-/app-builder-bin-mac-1.1.0.tgz#9b02001b38edef4189dfb134f8bba220836f8e0c" -app-builder-bin-win@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/app-builder-bin-win/-/app-builder-bin-win-1.0.4.tgz#5b22829baed14587799c2c9ca72f45e33d31bc84" +app-builder-bin-win@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/app-builder-bin-win/-/app-builder-bin-win-1.1.0.tgz#575accb70f8b77b60fa48d376da9730b662cad95" -app-builder-bin@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-1.0.5.tgz#261324fb4d1ade0a23fb1d393c3a72ef048125bc" +app-builder-bin@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-1.1.0.tgz#2de4d922fdd61cfcd8bff0216ec4d7fa6df6617f" optionalDependencies: - app-builder-bin-linux "1.0.4" - app-builder-bin-mac "1.0.4" - app-builder-bin-win "1.0.4" + app-builder-bin-linux "1.1.0" + app-builder-bin-mac "1.1.0" + app-builder-bin-win "1.1.0" append-transform@^0.4.0: version "0.4.0" @@ -451,9 +451,9 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -aws-sdk@^2.188.0: - version "2.188.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.188.0.tgz#9062abc7dba6393459fa2f3423cf5d294f004611" +aws-sdk@^2.190.0: + version "2.190.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.190.0.tgz#c7b48b3845345b60795943eb919700cf7edf5734" dependencies: buffer "4.9.1" events "^1.1.1" @@ -556,12 +556,12 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.1.0.tgz#7fae6f655fffe77e818a8c2868c754a42463fdfd" +babel-jest@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.2.0.tgz#2d04087f5d149585e14f641d529551963fc9b4f8" dependencies: babel-plugin-istanbul "^4.1.5" - babel-preset-jest "^22.1.0" + babel-preset-jest "^22.2.0" babel-messages@^6.23.0: version "6.23.0" @@ -577,9 +577,9 @@ babel-plugin-istanbul@^4.1.5: istanbul-lib-instrument "^1.7.5" test-exclude "^4.1.1" -babel-plugin-jest-hoist@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.1.0.tgz#c1281dd7887d77a1711dc760468c3b8285dde9ee" +babel-plugin-jest-hoist@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.2.0.tgz#bd34f39d652406669713b8c89e23ef25c890b993" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" @@ -612,11 +612,11 @@ babel-plugin-transform-strict-mode@^6.8.0: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-preset-jest@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.1.0.tgz#ff4e704102f9642765e2254226050561d8942ec9" +babel-preset-jest@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.2.0.tgz#f77b43f06ef4d8547214b2e206cc76a25c3ba0e2" dependencies: - babel-plugin-jest-hoist "^22.1.0" + babel-plugin-jest-hoist "^22.2.0" babel-plugin-syntax-object-rest-spread "^6.13.0" babel-preset-ts-node6-bluebird@^1.0.1: @@ -1767,15 +1767,15 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expect@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-22.1.0.tgz#f8f9b019ab275d859cbefed531fbaefe8972431d" +expect@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-22.2.0.tgz#dddcaab2e22ccc9f51e7c1732e0aa723f2f1f2b8" dependencies: ansi-styles "^3.2.0" jest-diff "^22.1.0" jest-get-type "^22.1.0" - jest-matcher-utils "^22.1.0" - jest-message-util "^22.1.0" + jest-matcher-utils "^22.2.0" + jest-message-util "^22.2.0" jest-regex-util "^22.1.0" extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: @@ -2665,15 +2665,15 @@ istanbul-reports@^1.1.3: dependencies: handlebars "^4.0.3" -jest-changed-files@^22.1.4: - version "22.1.4" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.1.4.tgz#1f7844bcb739dec07e5899a633c0cb6d5069834e" +jest-changed-files@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.2.0.tgz#517610c4a8ca0925bdc88b0ca53bd678aa8d019e" dependencies: throat "^4.0.0" -jest-cli@^22.1.4: - version "22.1.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.1.4.tgz#0fe9f3ac881b0cdc00227114c58583a2ebefcc04" +jest-cli@^22.2.1: + version "22.2.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.2.1.tgz#f1df6675cd719e0773be77d6314c5f4b1d8af47f" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -2686,21 +2686,21 @@ jest-cli@^22.1.4: istanbul-lib-coverage "^1.1.1" istanbul-lib-instrument "^1.8.0" istanbul-lib-source-maps "^1.2.1" - jest-changed-files "^22.1.4" - jest-config "^22.1.4" - jest-environment-jsdom "^22.1.4" + jest-changed-files "^22.2.0" + jest-config "^22.2.1" + jest-environment-jsdom "^22.2.0" jest-get-type "^22.1.0" - jest-haste-map "^22.1.0" - jest-message-util "^22.1.0" + jest-haste-map "^22.2.0" + jest-message-util "^22.2.0" jest-regex-util "^22.1.0" jest-resolve-dependencies "^22.1.0" - jest-runner "^22.1.4" - jest-runtime "^22.1.4" - jest-snapshot "^22.1.2" - jest-util "^22.1.4" - jest-worker "^22.1.0" + jest-runner "^22.2.1" + jest-runtime "^22.2.1" + jest-snapshot "^22.2.0" + jest-util "^22.2.0" + jest-worker "^22.2.0" micromatch "^2.3.11" - node-notifier "^5.1.2" + node-notifier "^5.2.1" realpath-native "^1.0.0" rimraf "^2.5.4" slash "^1.0.0" @@ -2709,20 +2709,20 @@ jest-cli@^22.1.4: which "^1.2.12" yargs "^10.0.3" -jest-config@^22.1.4: - version "22.1.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.1.4.tgz#075ffacce83c3e38cf85b1b9ba0d21bd3ee27ad0" +jest-config@^22.2.1: + version "22.2.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.2.1.tgz#8617e99cff0544f0a5f254a5dde37f43b5383934" dependencies: chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^22.1.4" - jest-environment-node "^22.1.4" + jest-environment-jsdom "^22.2.0" + jest-environment-node "^22.2.0" jest-get-type "^22.1.0" - jest-jasmine2 "^22.1.4" + jest-jasmine2 "^22.2.1" jest-regex-util "^22.1.0" - jest-resolve "^22.1.4" - jest-util "^22.1.4" - jest-validate "^22.1.2" + jest-resolve "^22.2.0" + jest-util "^22.2.0" + jest-validate "^22.2.0" pretty-format "^22.1.0" jest-diff@^22.1.0: @@ -2734,56 +2734,56 @@ jest-diff@^22.1.0: jest-get-type "^22.1.0" pretty-format "^22.1.0" -jest-docblock@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.1.0.tgz#3fe5986d5444cbcb149746eb4b07c57c5a464dfd" +jest-docblock@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.2.0.tgz#4d054eac354751e94a43a0ea2e2fe5c04cc61bbb" dependencies: detect-newline "^2.1.0" -jest-environment-jsdom@^22.1.4: - version "22.1.4" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.1.4.tgz#704518ce8375f7ec5de048d1e9c4268b08a03e00" +jest-environment-jsdom@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.2.0.tgz#e9537400cbdef2d1e61d7196f8afa40e826fe9d8" dependencies: - jest-mock "^22.1.0" - jest-util "^22.1.4" + jest-mock "^22.2.0" + jest-util "^22.2.0" jsdom "^11.5.1" -jest-environment-node@^22.1.4: - version "22.1.4" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.1.4.tgz#0f2946e8f8686ce6c5d8fa280ce1cd8d58e869eb" +jest-environment-node@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.2.0.tgz#ba7d0183fac076d34867367a4ac53ced69e3d3a9" dependencies: - jest-mock "^22.1.0" - jest-util "^22.1.4" + jest-mock "^22.2.0" + jest-util "^22.2.0" jest-get-type@^22.1.0: version "22.1.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9" -jest-haste-map@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.1.0.tgz#1174c6ff393f9818ebf1163710d8868b5370da2a" +jest-haste-map@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.2.0.tgz#c9f508b8f63322490339ba02343dd688474d9ad5" dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" - jest-docblock "^22.1.0" - jest-worker "^22.1.0" + jest-docblock "^22.2.0" + jest-worker "^22.2.0" micromatch "^2.3.11" sane "^2.0.0" -jest-jasmine2@^22.1.4: - version "22.1.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.1.4.tgz#cada0baf50a220c616a9575728b80d4ddedebe8b" +jest-jasmine2@^22.2.1: + version "22.2.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.2.1.tgz#58d115f3f4a0a186b5e90c5db8ac68aecfc41051" dependencies: callsites "^2.0.0" chalk "^2.0.1" co "^4.6.0" - expect "^22.1.0" + expect "^22.2.0" graceful-fs "^4.1.11" is-generator-fn "^1.0.0" jest-diff "^22.1.0" - jest-matcher-utils "^22.1.0" - jest-message-util "^22.1.0" - jest-snapshot "^22.1.2" + jest-matcher-utils "^22.2.0" + jest-message-util "^22.2.0" + jest-snapshot "^22.2.0" source-map-support "^0.5.0" jest-junit@^3.5.0: @@ -2800,17 +2800,17 @@ jest-leak-detector@^22.1.0: dependencies: pretty-format "^22.1.0" -jest-matcher-utils@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.1.0.tgz#e164665b5d313636ac29f7f6fe9ef0a6ce04febc" +jest-matcher-utils@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.2.0.tgz#5390f823c18c748543d463825aa8e4df0db253ca" dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" pretty-format "^22.1.0" -jest-message-util@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.1.0.tgz#51ba0794cb6e579bfc4e9adfac452f9f1a0293fc" +jest-message-util@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.2.0.tgz#84a6bb34186d8b9af7e0732fabbef63f7355f7b2" dependencies: "@babel/code-frame" "^7.0.0-beta.35" chalk "^2.0.1" @@ -2818,9 +2818,9 @@ jest-message-util@^22.1.0: slash "^1.0.0" stack-utils "^1.0.1" -jest-mock@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.1.0.tgz#87ec21c0599325671c9a23ad0e05c86fb5879b61" +jest-mock@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.2.0.tgz#444b3f9488a7473adae09bc8a77294afded397a7" jest-regex-util@^22.1.0: version "22.1.0" @@ -2832,45 +2832,45 @@ jest-resolve-dependencies@^22.1.0: dependencies: jest-regex-util "^22.1.0" -jest-resolve@^22.1.4: - version "22.1.4" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.1.4.tgz#72b9b371eaac48f84aad4ad732222ffe37692602" +jest-resolve@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.2.0.tgz#25aa8b887b31ab8c79763503e209d7c136f74ab1" dependencies: browser-resolve "^1.11.2" chalk "^2.0.1" -jest-runner@^22.1.4: - version "22.1.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.1.4.tgz#e039039110cb1b31febc0f99e349bf7c94304a2f" +jest-runner@^22.2.1: + version "22.2.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.2.1.tgz#539b2b7eb0ceb34e63a1ca78a1eda46ace70b940" dependencies: exit "^0.1.2" - jest-config "^22.1.4" - jest-docblock "^22.1.0" - jest-haste-map "^22.1.0" - jest-jasmine2 "^22.1.4" + jest-config "^22.2.1" + jest-docblock "^22.2.0" + jest-haste-map "^22.2.0" + jest-jasmine2 "^22.2.1" jest-leak-detector "^22.1.0" - jest-message-util "^22.1.0" - jest-runtime "^22.1.4" - jest-util "^22.1.4" - jest-worker "^22.1.0" + jest-message-util "^22.2.0" + jest-runtime "^22.2.1" + jest-util "^22.2.0" + jest-worker "^22.2.0" throat "^4.0.0" -jest-runtime@^22.1.4: - version "22.1.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.1.4.tgz#1474d9f5cda518b702e0b25a17d4ef3fc563a20c" +jest-runtime@^22.2.1: + version "22.2.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.2.1.tgz#c5b0173a7f5274b28da30019cf7bb7b8cda68040" dependencies: babel-core "^6.0.0" - babel-jest "^22.1.0" + babel-jest "^22.2.0" babel-plugin-istanbul "^4.1.5" chalk "^2.0.1" convert-source-map "^1.4.0" exit "^0.1.2" graceful-fs "^4.1.11" - jest-config "^22.1.4" - jest-haste-map "^22.1.0" + jest-config "^22.2.1" + jest-haste-map "^22.2.0" jest-regex-util "^22.1.0" - jest-resolve "^22.1.4" - jest-util "^22.1.4" + jest-resolve "^22.2.0" + jest-util "^22.2.0" json-stable-stringify "^1.0.1" micromatch "^2.3.11" realpath-native "^1.0.0" @@ -2879,41 +2879,41 @@ jest-runtime@^22.1.4: write-file-atomic "^2.1.0" yargs "^10.0.3" -jest-snapshot@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.1.2.tgz#b270cf6e3098f33aceeafda02b13eb0933dc6139" +jest-snapshot@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.2.0.tgz#0c0ba152d296ef70fa198cc84977a2cc269ee4cf" dependencies: chalk "^2.0.1" jest-diff "^22.1.0" - jest-matcher-utils "^22.1.0" + jest-matcher-utils "^22.2.0" mkdirp "^0.5.1" natural-compare "^1.4.0" pretty-format "^22.1.0" -jest-util@^22.1.4: - version "22.1.4" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.1.4.tgz#ac8cbd43ee654102f1941f3f0e9d1d789a8b6a9b" +jest-util@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.2.0.tgz#afad693641447858bec7b37f32952516bf887262" dependencies: callsites "^2.0.0" chalk "^2.0.1" graceful-fs "^4.1.11" is-ci "^1.0.10" - jest-message-util "^22.1.0" - jest-validate "^22.1.2" + jest-message-util "^22.2.0" + jest-validate "^22.2.0" mkdirp "^0.5.1" -jest-validate@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.1.2.tgz#c3b06bcba7bd9a850919fe336b5f2a8c3a239404" +jest-validate@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.2.0.tgz#f7ce459105a8210825e5e57279f868ab080063fa" dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" leven "^2.1.0" pretty-format "^22.1.0" -jest-worker@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.1.0.tgz#0987832fe58fbdc205357f4c19b992446368cafb" +jest-worker@^22.2.0: + version "22.2.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.2.0.tgz#d88d6ee176d6409f206cbbf7b485250793264262" dependencies: merge-stream "^1.0.1" @@ -3503,7 +3503,7 @@ 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@^5.1.2: +node-notifier@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" dependencies: