From 32ffe114b1ac219933a8b0a7bcb4bb73f7320986 Mon Sep 17 00:00:00 2001 From: Homa Wong Date: Wed, 13 Mar 2019 14:39:50 -0700 Subject: [PATCH] feat: respect length on array. (#69) feat: respect length on array. feat: add `startsWith()` for existing behavior BREAKING CHANGE: array will now fail when the length does not match. Removed `AtLeaseOnce`. It is the same as `has()` feat: support `anything` BREAKING CHANGE: undefined will check against undefined. Use `anything` for the previous `undefined` support feat: Add formatDiffs chore: only run tests on node@11 because of bigint tests. --- .circleci/config.yml | 51 +- .travis.yml | 11 +- README.md | 36 +- package.json | 22 +- src/And.spec.ts | 16 - src/And.ts | 26 - src/ArrayEntryExpectation.ts | 5 - src/AtLeastOnce.spec.ts | 29 - src/AtLeastOnce.ts | 24 - src/Or.spec.ts | 18 - src/Or.ts | 25 - src/anything.ts | 1 + src/createSatisfier.spec.ts | 583 ++++++++++------- src/createSatisfier.ts | 246 +++---- src/every.spec.ts | 12 +- src/every.ts | 9 +- src/formatDiffs.spec.ts | 17 + src/formatDiffs.ts | 10 + src/has.spec.ts | 11 +- src/has.ts | 2 +- src/index.ts | 5 +- src/interfaces.ts | 9 +- src/isInInterval.spec.ts | 14 +- src/none.spec.ts | 7 +- src/some.spec.ts | 2 +- src/startsWith.spec.ts | 39 ++ src/startsWith.ts | 29 +- src/testUtil.ts | 19 - tsconfig.esnext.json | 5 +- yarn.lock | 1172 ++++++++++++++++++++++------------ 30 files changed, 1403 insertions(+), 1052 deletions(-) delete mode 100644 src/And.spec.ts delete mode 100644 src/And.ts delete mode 100644 src/ArrayEntryExpectation.ts delete mode 100644 src/AtLeastOnce.spec.ts delete mode 100644 src/AtLeastOnce.ts delete mode 100644 src/Or.spec.ts delete mode 100644 src/Or.ts create mode 100644 src/anything.ts create mode 100644 src/formatDiffs.spec.ts create mode 100644 src/formatDiffs.ts create mode 100644 src/startsWith.spec.ts delete mode 100644 src/testUtil.ts diff --git a/.circleci/config.yml b/.circleci/config.yml index e6d2f89..e0c10b6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,35 +4,35 @@ workflows: all: jobs: - node-latest - - node10: - requires: - - node-latest - - node9: - requires: - - node-latest - - node8: - requires: - - node-latest - - node6: - requires: - - node-latest + # - node10: + # requires: + # - node-latest + # - node9: + # requires: + # - node-latest + # - node8: + # requires: + # - node-latest + # - node6: + # requires: + # - node-latest - release: filters: branches: only: master requires: - node-latest - - node10 - - node9 - - node8 - - node6 + # - node10 + # - node9 + # - node8 + # - node6 jobs: local: docker: - image: circleci/node:11 steps: - checkout - - run: npm run verify + - run: yarn verify node-latest: docker: - image: circleci/node:11 @@ -45,8 +45,7 @@ jobs: name: Install Dependencies command: | if [ ! -d node_modules ]; then - npm ci - npm i --no-save jest-junit + yarn install fi - save_cache: name: Save node modules cache @@ -57,8 +56,8 @@ jobs: root: '.' paths: - node_modules - - run: npm run verify - - run: npx codecov + - run: yarn verify + - run: yarn codecov - store_test_results: path: .reports/junit node10: @@ -68,7 +67,7 @@ jobs: - checkout - attach_workspace: at: '.' - - run: npm run verify + - run: yarn verify - store_test_results: path: .reports/junit node9: @@ -78,7 +77,7 @@ jobs: - checkout - attach_workspace: at: '.' - - run: npm run verify + - run: yarn verify - store_test_results: path: .reports/junit node8: @@ -88,7 +87,7 @@ jobs: - checkout - attach_workspace: at: '.' - - run: npm run verify + - run: yarn verify - store_test_results: path: .reports/junit node6: @@ -98,7 +97,7 @@ jobs: - checkout - attach_workspace: at: '.' - - run: npm run verify + - run: yarn verify - store_test_results: path: .reports/junit release: @@ -108,5 +107,5 @@ jobs: - checkout - attach_workspace: at: '.' - - run: npm run clean && npm run build + - run: yarn clean && yarn build - run: npx semantic-release diff --git a/.travis.yml b/.travis.yml index 784c76e..95e8c4a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,16 +6,15 @@ notifications: email: false node_js: - '11' - - '10' - - '9' - - '8' - - '6' + # - '10' + # - '9' + # - '8' + # - '6' branches: only: - master - /^greenkeeper.*$/ script: - - npm i --no-save jest-junit - - npm run verify + - yarn verify - ./scripts/run-on-node-version.sh 11 "npm install -g codacy-coverage && cat ./coverage/lcov.info | codacy-coverage" - ./scripts/run-on-node-version.sh 11 "npm install -g coveralls && cat ./coverage/lcov.info | coveralls" diff --git a/README.md b/README.md index acd9f89..3475b92 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,13 @@ [![Visual Studio Code][vscode-image]][vscode-url] [![Wallaby.js][wallaby-image]][wallaby-url] -Manage and generate artifacts to test data across boundaries. +A purposely loose comparison tool. + +## Version 5 breaking changes + +- exact check on array +- no spread on array, use `has()/some()` or `every()` +- `undefined` now checks against `undefined` instead of a placeholder for anything. Use `anything` for the previous behavior. ## createSatisfier(expectation) @@ -65,20 +71,16 @@ createSatisfier({ a: /boo/ }).exec({ a: 'foo' }) createSatisfier({ a: a => a === 1 }).exec({ a: 2 }) ``` -## Meaning of undefined +## `anything` -If `undefined` is used in expectation, it will match anything. +If `anything` is used in expectation, it will match anything. ```ts -createSatisfier(underfined).test({}) -createSatisfier({ a: undefined }).test({}) -createSatisfier([undefined, 1]).test(['x', 1]) -``` +import { anything } from 'satisfier' -If you want to test for `undefined` explicitly, use predicate function. - -```ts -createSatisfier(x => x === undefined).test(undefined) +createSatisfier(anything).test({}) +createSatisfier({ a: anything }).test({}) +createSatisfier([anything, 1]).test(['x', 1]) ``` ## test against array @@ -90,18 +92,14 @@ There are several ways to test against array: When you use an array expectation to test against array, each entry in the expectation will be used to test against the corresponding entry in the array. -If the subject array is longer than the expectation array, -the extra entries are not tested. - -You can also skip over entries by putting in `undefined`. +You can also skip over entries by putting in `anything`. ```ts import { createSatisfier } from 'satisfier' // all true -createSatisfier([1]).test([1, 2, 3]) -createSatisfier([undefined, 1]).test(['...anything...', 1]) -createSatisfier([e => e === undefined, 1]).test([undefined, 1]) +createSatisfier([anything, 1]).test(['...anything...', 1]) +createSatisfier([e => e === anything, 1]).test([anything, 1]) ``` ### using predicate expectation @@ -160,7 +158,7 @@ results[0].expected.tersify() tersify(results[0]) ``` -Examples of predicate: `And`, `AtLeastOnce`, `every`, `has`, `isInInterval`, `isInRange`, `isTypeOf`, `none`, `Or`, `some` +Examples of predicate: `every`, `has`, `isInInterval`, `isInRange`, `isTypeOf`, `none`, `some`, `startsWith` ## Contribute diff --git a/package.json b/package.json index 987c7d6..26df8d0 100644 --- a/package.json +++ b/package.json @@ -21,19 +21,23 @@ "typings": "lib/index.d.ts", "scripts": { "build": "tsc -p tsconfig.es5.json && tsc -p tsconfig.esnext.json", - "clean": "rimraf lib", - "dc": "npm run dependency-check", + "clean": "rimraf lib libm", + "dc": "yarn dependency-check", "dependency-check": "dependency-check . --unused --no-dev && dependency-check . --missing --no-dev", "lint": "tslint -p tsconfig.json", "test": "jest --reporters=default", - "verify": "npm run lint && npm run build && npm run dependency-check && jest --coverage", - "watch": "jest --watch" - }, - "devDependencies": { - "@unional/devpkg-node": "^1.2.4", - "assertron": "^6.1.0" + "verify": "yarn lint && yarn build && yarn dependency-check && jest --coverage --reporters=default", + "watch": "jest --watch", + "watch:type": "tsc --watch" }, "dependencies": { - "tersify": "^1.2.6" + "tersify": "^2.0.2" + }, + "devDependencies": { + "@unional/devpkg-node": "^1.2.5", + "assertron": "^6.1.0", + "codecov": "^3.2.0", + "jest-junit": "^6.3.0", + "type-plus": "^1.15.1" } } diff --git a/src/And.spec.ts b/src/And.spec.ts deleted file mode 100644 index 678d683..0000000 --- a/src/And.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import t from 'assert' - -import { createSatisfier } from '.' -import { And } from './And' -import { assertExec } from './testUtil' - -test('fail when not passing any expectations', () => { - const s = createSatisfier([new And({ a: 1 }, { b: 2 })]) - const actual = s.exec([{ a: 1 }])! - assertExec(actual[0], ['[0]', 'b'], 2, undefined) -}) - -test('pass when passing all expectations', () => { - const s = createSatisfier([new And({ a: 1 }, { b: 2 })]) - t.strictEqual(s.exec([{ a: 1, b: 2 }]), undefined) -}) diff --git a/src/And.ts b/src/And.ts deleted file mode 100644 index 5daad47..0000000 --- a/src/And.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { createSatisfier } from './createSatisfier' -import { ArrayEntryExpectation } from './ArrayEntryExpectation'; -import { Satisfier, SatisfierExec } from './interfaces'; - -/** - * Check if an array has entries satisfy the expectations in order. - */ -export class And extends ArrayEntryExpectation { - satisfiers: Satisfier[] - constructor(...expectations: any[]) { - super() - this.satisfiers = expectations.map(createSatisfier) - } - exec(actual: any, path: string[]) { - let diff: SatisfierExec[] | undefined - this.satisfiers.some(s => { - diff = s.exec(actual) - if (diff) { - diff.forEach(d => d.path = [...path, ...d.path]) - } - - return !!diff - }) - return diff - } -} diff --git a/src/ArrayEntryExpectation.ts b/src/ArrayEntryExpectation.ts deleted file mode 100644 index e955a6a..0000000 --- a/src/ArrayEntryExpectation.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { SatisfierExec } from './interfaces' - -export abstract class ArrayEntryExpectation { - abstract exec(actual: any, path: string[]): SatisfierExec[] | undefined -} diff --git a/src/AtLeastOnce.spec.ts b/src/AtLeastOnce.spec.ts deleted file mode 100644 index 2c264d6..0000000 --- a/src/AtLeastOnce.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import t from 'assert' -import a from 'assertron' - -import { AtLeastOnce, createSatisfier } from '.' - -test('fail when subject is not an array', () => { - a.false(createSatisfier([new AtLeastOnce(1)]).test(1)) - a.false(createSatisfier([new AtLeastOnce(1)]).test(true)) - a.false(createSatisfier([new AtLeastOnce(1)]).test('a')) - a.false(createSatisfier([new AtLeastOnce(1)]).test({ a: 1 })) -}) - -test('fail when subject does not contain at least one element satisfying the expectation', () => { - a.false(createSatisfier([new AtLeastOnce(1)]).test([])) - a.false(createSatisfier([new AtLeastOnce(1)]).test([0, 2, 'a', true, { a: 1 }])) -}) - -test('pass when subject contains at least one element satisfying the expectation', () => { - t(createSatisfier([new AtLeastOnce(1)]).test([1])) -}) - -test('match one follow with one miss', () => { - const actual = createSatisfier([new AtLeastOnce(1), 3]).exec([1, 2, 3]) - t.strictEqual(actual, undefined) -}) - -test('match one follow with two misses', () => { - t(createSatisfier([new AtLeastOnce(1), 4]).test([1, 2, 3, 4])) -}) diff --git a/src/AtLeastOnce.ts b/src/AtLeastOnce.ts deleted file mode 100644 index 8853a8d..0000000 --- a/src/AtLeastOnce.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ArrayEntryExpectation } from './ArrayEntryExpectation' -import { createSatisfier } from './createSatisfier' -import { SatisfierExec, Satisfier } from './interfaces' - -export class AtLeastOnce extends ArrayEntryExpectation { - private pass = false - private satisfier: Satisfier - constructor(expectation: any) { - super() - this.satisfier = createSatisfier(expectation) - } - - exec(actual: any): SatisfierExec[] { - if (this.pass) return [] - - const result = this.satisfier.exec(actual) - if (!result) { - this.pass = true - return [] - } - - return result - } -} diff --git a/src/Or.spec.ts b/src/Or.spec.ts deleted file mode 100644 index 03a6de1..0000000 --- a/src/Or.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import t from 'assert' - -import { createSatisfier } from '.' -import { Or } from './Or' -import { assertExec } from './testUtil' - -test('fail when not passing all expectations', () => { - const s = createSatisfier([new Or({ a: 1 }, { b: 2 })]) - const actual = s.exec([{ c: 1 }])! - assertExec(actual[0], ['[0]', 'a'], 1, undefined) - assertExec(actual[1], ['[0]', 'b'], 2, undefined) -}) - -test('pass when passing any expectations', () => { - const s = createSatisfier([new Or({ a: 1 }, { b: 2 })]) - t.strictEqual(s.exec([{ a: 1 }]), undefined) - t.strictEqual(s.exec([{ b: 2 }]), undefined) -}) diff --git a/src/Or.ts b/src/Or.ts deleted file mode 100644 index 92bb56f..0000000 --- a/src/Or.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { createSatisfier } from './createSatisfier' -import { ArrayEntryExpectation } from './ArrayEntryExpectation'; -import { Satisfier, SatisfierExec } from './interfaces'; - -/** - * Check if an array has entries satisfy the expectations in order. - */ -export class Or extends ArrayEntryExpectation { - satisfiers: Satisfier[] - constructor(...expectations: any[]) { - super() - this.satisfiers = expectations.map(createSatisfier) - } - exec(actual: any, path: string[]) { - let diff: SatisfierExec[] = [] - for (let i = 0; i < this.satisfiers.length; i++) { - const s = this.satisfiers[i] - const eachDiff = s.exec(actual) - if (!eachDiff) return undefined - eachDiff.forEach(d => d.path = [...path, ...d.path]) - diff.push(...eachDiff) - } - return diff - } -} diff --git a/src/anything.ts b/src/anything.ts new file mode 100644 index 0000000..a321226 --- /dev/null +++ b/src/anything.ts @@ -0,0 +1 @@ +export const anything = Symbol('anything') diff --git a/src/createSatisfier.spec.ts b/src/createSatisfier.spec.ts index 6acedd2..3faaaf0 100644 --- a/src/createSatisfier.spec.ts +++ b/src/createSatisfier.spec.ts @@ -1,312 +1,407 @@ -import t from 'assert'; -import a from 'assertron'; -import { createSatisfier } from './index'; -import { assertExec, assertRegExp } from './testUtil'; - -test('support generics', () => { - const s = createSatisfier<{ a: number }>({ a: 1 }) - t(s.test({ a: 1 })) - a.false(s.test({ a: 2 })) -}) - -test('Expecter can be specify partial of the data structure', () => { - createSatisfier<{ a: number, b: string }>({ a: 1 }) - createSatisfier<{ a: number, b: string }>([{ a: 1 }]) - createSatisfier<{ a: { c: number, d: string }, b: string }>({ a: {} }) - createSatisfier<{ a: { c: number, d: string }, b: string }>([{ a: {} }, { b: /a/ }, { a: { c: 1 } }]) +import { tryAssign, typeAssert } from 'type-plus'; +import { anything, createSatisfier } from '.'; + +const testSymbol = Symbol() +const testArrow = () => true +const testFn = function () { return true } +describe('anything', () => { + test('matches against anything', () => { + const s = createSatisfier(anything) + expect(s.exec(undefined)).toBeUndefined() + expect(s.exec(null)).toBeUndefined() + expect(s.exec(false)).toBeUndefined() + expect(s.exec(1)).toBeUndefined() + expect(s.exec(1n)).toBeUndefined() + expect(s.exec('a')).toBeUndefined() + expect(s.exec(Symbol())).toBeUndefined() + expect(s.exec({})).toBeUndefined() + expect(s.exec([])).toBeUndefined() + expect(s.exec(testFn)).toBeUndefined() + expect(s.exec(testArrow)).toBeUndefined() + }) }) -test('nested {} checks for non undefined', () => { - const s = createSatisfier<{ a: { c: number, d: string }, b: string }>({ a: {} }) - const actual = s.exec({} as any)! - t.strictEqual(actual.length, 1) - assertExec(actual[0], ['a'], {}, undefined) +describe('undefined', () => { + test('matches only undefined', () => { + const s = createSatisfier(undefined) + expect(s.exec(undefined)).toBeUndefined() + + expect(s.exec(null)).toEqual([{ path: [], expected: undefined, actual: null }]) + expect(s.exec(true)).toEqual([{ path: [], expected: undefined, actual: true }]) + expect(s.exec(1)).toEqual([{ path: [], expected: undefined, actual: 1 }]) + expect(s.exec(1n)).toEqual([{ path: [], expected: undefined, actual: 1n }]) + expect(s.exec('a')).toEqual([{ path: [], expected: undefined, actual: 'a' }]) + expect(s.exec(testSymbol)).toEqual([{ path: [], expected: undefined, actual: testSymbol }]) + expect(s.exec(/foo/)).toEqual([{ path: [], expected: undefined, actual: /foo/ }]) + expect(s.exec({})).toEqual([{ path: [], expected: undefined, actual: {} }]) + expect(s.exec([])).toEqual([{ path: [], expected: undefined, actual: [] }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected: undefined, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected: undefined, actual: testArrow }]) + }) }) -test('actual should be a complete struct', () => { - const s = createSatisfier<{ a: number, b: string }>({ a: 1, b: 'b' }) - - // missing `b` - // t.true(s.test({ a: 1 })) - t(s.test({ a: 1, b: 'b' })) +describe('null', () => { + test('matches only null', () => { + const s = createSatisfier(null) + + expect(s.exec(undefined)).toEqual([{ path: [], expected: null, actual: undefined }]) + expect(s.exec(null)).toBeUndefined() + expect(s.exec(true)).toEqual([{ path: [], expected: null, actual: true }]) + expect(s.exec(1)).toEqual([{ path: [], expected: null, actual: 1 }]) + expect(s.exec(1n)).toEqual([{ path: [], expected: null, actual: 1n }]) + expect(s.exec('a')).toEqual([{ path: [], expected: null, actual: 'a' }]) + expect(s.exec(testSymbol)).toEqual([{ path: [], expected: null, actual: testSymbol }]) + expect(s.exec(/foo/)).toEqual([{ path: [], expected: null, actual: /foo/ }]) + expect(s.exec({})).toEqual([{ path: [], expected: null, actual: {} }]) + expect(s.exec([])).toEqual([{ path: [], expected: null, actual: [] }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected: null, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected: null, actual: testArrow }]) + }) }) -test('expect array and test against non-array', () => { - const s = createSatisfier([1]) - a.false(s.test(null)) - a.false(s.test(1)) - a.false(s.test('a')) - a.false(s.test(true)) - a.false(s.test(undefined as any)) +describe('boolean', () => { + test.each([true, false])('%p matches only itself', (expected: boolean) => { + const s = createSatisfier(expected) + + expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }]) + expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }]) + expect(s.exec(expected)).toBeUndefined() + expect(s.exec(!expected)).toEqual([{ path: [], expected, actual: !expected }]) + expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }]) + expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }]) + expect(s.exec('a')).toEqual([{ path: [], expected, actual: 'a' }]) + expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }]) + expect(s.exec(/foo/)).toEqual([{ path: [], expected, actual: /foo/ }]) + expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }]) + expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }]) + }) }) -test('array with number', () => { - t(createSatisfier([1, 2]).test([1, 2])) +describe('number', () => { + test.each([-1, 0, 1])('%d matches exact number', (expected: number) => { + const s = createSatisfier(expected) + + expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }]) + expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }]) + expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }]) + expect(s.exec(expected)).toBeUndefined() + expect(s.exec(expected - 1)).toEqual([{ path: [], expected, actual: expected - 1 }]) + expect(s.exec(expected + 1)).toEqual([{ path: [], expected, actual: expected + 1 }]) + expect(s.exec(String(expected))).toEqual([{ path: [], expected, actual: String(expected) }]) + expect(s.exec(expected)).toBeUndefined() + expect(s.exec(String(expected))).toEqual([{ path: [], expected, actual: String(expected) }]) + expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }]) + expect(s.exec(/foo/)).toEqual([{ path: [], expected, actual: /foo/ }]) + expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }]) + expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }]) + }) + + test('NaN matches only NaN', () => { + const s = createSatisfier(NaN) + + expect(s.exec(undefined)).toEqual([{ path: [], expected: NaN, actual: undefined }]) + expect(s.exec(null)).toEqual([{ path: [], expected: NaN, actual: null }]) + expect(s.exec(true)).toEqual([{ path: [], expected: NaN, actual: true }]) + expect(s.exec(NaN)).toBeUndefined() + expect(s.exec(1)).toEqual([{ path: [], expected: NaN, actual: 1 }]) + expect(s.exec(0)).toEqual([{ path: [], expected: NaN, actual: 0 }]) + expect(s.exec(-1)).toEqual([{ path: [], expected: NaN, actual: -1 }]) + expect(s.exec(String(NaN))).toEqual([{ path: [], expected: NaN, actual: String(NaN) }]) + expect(s.exec(testSymbol)).toEqual([{ path: [], expected: NaN, actual: testSymbol }]) + expect(s.exec(/foo/)).toEqual([{ path: [], expected: NaN, actual: /foo/ }]) + expect(s.exec({})).toEqual([{ path: [], expected: NaN, actual: {} }]) + expect(s.exec([])).toEqual([{ path: [], expected: NaN, actual: [] }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected: NaN, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected: NaN, actual: testArrow }]) + }) + + test('Infinity only matches Infinity', () => { + const s = createSatisfier(Infinity) + + expect(s.exec(undefined)).toEqual([{ path: [], expected: Infinity, actual: undefined }]) + expect(s.exec(null)).toEqual([{ path: [], expected: Infinity, actual: null }]) + expect(s.exec(true)).toEqual([{ path: [], expected: Infinity, actual: true }]) + expect(s.exec(Infinity)).toBeUndefined() + expect(s.exec(1)).toEqual([{ path: [], expected: Infinity, actual: 1 }]) + expect(s.exec(0)).toEqual([{ path: [], expected: Infinity, actual: 0 }]) + expect(s.exec(-1)).toEqual([{ path: [], expected: Infinity, actual: -1 }]) + expect(s.exec(String(Infinity))).toEqual([{ path: [], expected: Infinity, actual: String(Infinity) }]) + expect(s.exec(testSymbol)).toEqual([{ path: [], expected: Infinity, actual: testSymbol }]) + expect(s.exec(/foo/)).toEqual([{ path: [], expected: Infinity, actual: /foo/ }]) + expect(s.exec({})).toEqual([{ path: [], expected: Infinity, actual: {} }]) + expect(s.exec([])).toEqual([{ path: [], expected: Infinity, actual: [] }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected: Infinity, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected: Infinity, actual: testArrow }]) + }) }) -test('array with null', () => { - t(createSatisfier([null]).test([null])) - a.false(createSatisfier([null]).test([1])) +describe('bigint', () => { + test.each([-1n, 0n, 1n])('%d matches exact bigint', expected => { + const s = createSatisfier(expected) + + expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }]) + expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }]) + expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }]) + expect(s.exec(expected)).toBeUndefined() + expect(s.exec(expected - 1n)).toEqual([{ path: [], expected, actual: expected - 1n }]) + expect(s.exec(expected + 1n)).toEqual([{ path: [], expected, actual: expected + 1n }]) + expect(s.exec(0)).toEqual([{ path: [], expected, actual: 0 }]) + expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }]) + expect(s.exec(-1)).toEqual([{ path: [], expected, actual: -1 }]) + expect(s.exec(String(expected))).toEqual([{ path: [], expected, actual: String(expected) }]) + expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }]) + expect(s.exec(/foo/)).toEqual([{ path: [], expected, actual: /foo/ }]) + expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }]) + expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }]) + }) }) -test('NaN satisfies NaN', () => { - t(createSatisfier(NaN).test(NaN)) +describe('string', () => { + test('matches only the same string', () => { + const expected = 'foo' + const s = createSatisfier(expected) + + expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }]) + expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }]) + expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }]) + expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }]) + expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }]) + expect(s.exec(expected)).toBeUndefined() + expect(s.exec('boo')).toEqual([{ path: [], expected, actual: 'boo' }]) + expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }]) + expect(s.exec(/foo/)).toEqual([{ path: [], expected, actual: /foo/ }]) + expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }]) + expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }]) + }) }) -test('NaN not satisfies others', () => { - a.false(createSatisfier(NaN).test(`a`)) - a.false(createSatisfier(NaN).test(true)) - a.false(createSatisfier(NaN).test(1)) - a.false(createSatisfier(NaN).test([])) - a.false(createSatisfier(NaN).test({})) +describe('symbol', () => { + test('matches only the same symbol', () => { + const expected = Symbol() + const s = createSatisfier(expected) + + expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }]) + expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }]) + expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }]) + expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }]) + expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }]) + expect(s.exec('boo')).toEqual([{ path: [], expected, actual: 'boo' }]) + expect(s.exec(expected)).toBeUndefined() + expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }]) + expect(s.exec(/foo/)).toEqual([{ path: [], expected, actual: /foo/ }]) + expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }]) + expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }]) + }) }) -test('array with NaN', () => { - t(createSatisfier([NaN]).test([NaN])) - a.false(createSatisfier([NaN]).test([1])) +describe('regex', () => { + test('matches itself and strings that matches it', () => { + const expected = /foo/ + const s = createSatisfier(expected) + + expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }]) + expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }]) + expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }]) + expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }]) + expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }]) + expect(s.exec('boo')).toEqual([{ path: [], expected, actual: 'boo' }]) + expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }]) + expect(s.exec(/foo/)).toBeUndefined() + expect(s.exec('foo')).toBeUndefined() + expect(s.exec(/boo/)).toEqual([{ path: [], expected, actual: /boo/ }]) + expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }]) + expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }]) + }) + + test('will not match non string and regex', () => { + expect(createSatisfier(/1/).exec(1)).toEqual([{ path: [], expected: /1/, actual: 1 }]) + expect(createSatisfier(/true/).exec(true)).toEqual([{ path: [], expected: /true/, actual: true }]) + expect(createSatisfier(/undefined/).exec(undefined)).toEqual([{ path: [], expected: /undefined/, actual: undefined }]) + expect(createSatisfier(/null/).exec(null)).toEqual([{ path: [], expected: /null/, actual: null }]) + expect(createSatisfier(/{}/).exec({})).toEqual([{ path: [], expected: /{}/, actual: {} }]) + expect(createSatisfier(/foo/).exec(['foo'])).toEqual([{ path: [], expected: /foo/, actual: ['foo'] }]) + }) + + test('missing property gets undefined', () => { + expect(createSatisfier({ f: /1/ }).exec({})).toEqual([{ path: ['f'], expected: /1/, actual: undefined }]) + }) }) -describe('exec', () => { - test('undefined should match anything', () => { - t.strictEqual(createSatisfier(undefined).exec(undefined), undefined) - t.strictEqual(createSatisfier(undefined).exec({}), undefined) - t.strictEqual(createSatisfier({ a: undefined }).exec({}), undefined) - t.strictEqual(createSatisfier([undefined]).exec([]), undefined) - }) +describe('object', () => { + test('does not match non-object', () => { + const expected = {} + const s = createSatisfier(expected) - test('primitive types without specifing generic will work without issue.', () => { - t.strictEqual(createSatisfier(1).exec(1), undefined) - t.strictEqual(createSatisfier(true).exec(true), undefined) - t.strictEqual(createSatisfier('a').exec('a'), undefined) + expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }]) + expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }]) + expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }]) + expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }]) + expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }]) + expect(s.exec('boo')).toEqual([{ path: [], expected, actual: 'boo' }]) + expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }]) + expect(s.exec(/boo/)).toEqual([{ path: [], expected, actual: /boo/ }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }]) }) - test('can use generic to specify the data structure', () => { - t.strictEqual(createSatisfier(1).exec(1), undefined) - t.strictEqual(createSatisfier<{ a: number }>({ a: /1/ }).exec({ a: 1 }), undefined) - }) + test('empty object matches object with any properties', () => { + const expected = {} + const s = createSatisfier(expected) - test('empty object expectation passes all objects', () => { - t.strictEqual(createSatisfier({}).exec({}), undefined) - t.strictEqual(createSatisfier({}).exec({ a: 1 }), undefined) - t.strictEqual(createSatisfier({}).exec({ a: { b: 'a' } }), undefined) - t.strictEqual(createSatisfier({}).exec({ a: true }), undefined) - t.strictEqual(createSatisfier({}).exec({ a: [1] }), undefined) + expect(s.exec({})).toBeUndefined() + expect(s.exec({ a: 1 })).toBeUndefined() }) - test('empty object expectation fails primitive', () => { - assertExec(createSatisfier({}).exec(1)![0], [], {}, 1) - assertExec(createSatisfier({}).exec(true)![0], [], {}, true) - assertExec(createSatisfier({}).exec('a')![0], [], {}, 'a') + test('diff mismatched properties with proper path', () => { + expect(createSatisfier({ a: 1 }).exec({ a: 2 })).toEqual([{ actual: 2, expected: 1, path: ['a'] }]) + expect(createSatisfier({ a: undefined }).exec({ a: 2 })).toEqual([{ actual: 2, expected: undefined, path: ['a'] }]) + expect(createSatisfier({ a: { b: 1 } }).exec({ a: 2 })).toEqual([{ actual: 2, expected: { b: 1 }, path: ['a'] }]) + expect(createSatisfier({ a: { b: 1 } }).exec({ a: { b: 3 } })).toEqual([{ actual: 3, expected: 1, path: ['a', 'b'] }]) }) - test('mismatch value gets path, expected, and actual', () => { - const actual = createSatisfier({ a: 1 }).exec({ a: 2 })! - t.strictEqual(actual.length, 1) - assertExec(actual[0], ['a'], 1, 2) + test('missing property is detected', () => { + expect(createSatisfier({ a: {} }).exec({})).toEqual([{ actual: undefined, expected: {}, path: ['a'] }]) }) - test('missing property get actual as undefined', () => { - const actual = createSatisfier({ a: 1 }).exec({})! - t.strictEqual(actual.length, 1) - assertExec(actual[0], ['a'], 1, undefined) + test('will not match array', () => { + expect(createSatisfier({ a: 1 }).exec([{ a: 1 }, { b: 1, a: 1 }])).toEqual([{ 'actual': [{ 'a': 1 }, { 'a': 1, 'b': 1 }], 'expected': { 'a': 1 }, 'path': [] }]) }) - test('missing property get deeper level', () => { - const actual = createSatisfier({ a: { b: 1 } }).exec({ a: {} })! - t.strictEqual(actual.length, 1) - assertExec(actual[0], ['a', 'b'], 1, undefined) - }) - test('passing regex gets undefined', () => { - t.strictEqual(createSatisfier({ foo: /foo/ }).exec({ foo: 'foo' }), undefined) + test('drill down and compare each property', () => { + expect(createSatisfier({ a: { b: { c: /foo/ } } }).exec({ a: { b: { c: 'boo' } } })) + .toEqual([{ actual: 'boo', expected: /foo/, path: ['a', 'b', 'c'] }]) }) - test('failed regex will be in expected property', () => { - const actual = createSatisfier({ foo: /foo/ }).exec({ foo: 'boo' })! - assertRegExp(actual, ['foo'], /foo/, 'boo') + test('check against property in parent class', () => { + class Foo { + foo = 'foo' + } + class Boo extends Foo { + boo = 'boo' + } + const boo = new Boo() + expect(createSatisfier({ foo: 'foo' }).exec(boo)).toBeUndefined() }) - test('regex on missing property gets actual as undefined', () => { - const actual = createSatisfier({ foo: /foo/ }).exec({})! - assertRegExp(actual, ['foo'], /foo/, undefined) + test('check exactly on property array', () => { + const s = createSatisfier({ a: [1, true, 'a'] }) + expect(s.exec({ a: [1, true, 'a'] })).toBeUndefined() + expect(s.exec({ a: [1, true, 'b'] })).toEqual([{ actual: 'b', expected: 'a', path: ['a', 2] }]) }) - test('regex on non-string will fail as normal', () => { - let actual = createSatisfier({ foo: /foo/ }).exec({ foo: 1 })! - assertRegExp(actual, ['foo'], /foo/, 1) + test('property predicate receives the whole array in that property', () => { + const predicate = (e: any) => e && e.every((x: any) => x.login) + const s = createSatisfier({ + data: predicate + }); - actual = createSatisfier({ foo: /foo/ }).exec({ foo: true })! - assertRegExp(actual, ['foo'], /foo/, true) + expect(s.exec({ data: [{ login: 'a' }] })).toBeUndefined() + expect(s.exec({ data: [{ login: 'a' }, { login: 'b' }] })).toBeUndefined() + expect(s.exec({ data: [{ login: 'a' }, {}] })).toEqual([{ actual: [{ login: 'a' }, {}], expected: predicate, path: ['data'] }]) + }) +}) - actual = createSatisfier({ foo: /foo/ }).exec({ foo: [1, true, 'a'] })! - assertRegExp(actual, ['foo'], /foo/, [1, true, 'a']) +describe('array', () => { + test('does not match non-array', () => { + const expected: any[] = [] + const s = createSatisfier(expected) - actual = createSatisfier({ foo: /foo/ }).exec({ foo: { a: 1 } })! - assertRegExp(actual, ['foo'], /foo/, { a: 1 }) + expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }]) + expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }]) + expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }]) + expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }]) + expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }]) + expect(s.exec('boo')).toEqual([{ path: [], expected, actual: 'boo' }]) + expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }]) + expect(s.exec(/boo/)).toEqual([{ path: [], expected, actual: /boo/ }]) + expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }]) + expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }]) + expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }]) }) - test('predicate receives actual value', () => { - t.strictEqual(createSatisfier({ a: (a: any) => a === 1 }).exec({ a: 1 }), undefined) + test('empty array matches only empty array', () => { + const expected: any[] = [] + const s = createSatisfier(expected) + expect(s.exec([])).toBeUndefined() + expect(s.exec([1])).toEqual([{ path: [0], expected: undefined, actual: 1 }]) }) - test('passing predicate gets undefined', () => { - t.strictEqual(createSatisfier({ a: () => true }).exec({}), undefined) - t.strictEqual(createSatisfier({ a: () => true }).exec({ a: 1 }), undefined) + test('not match different length', () => { + expect(createSatisfier([1]).exec([1, 2])).toEqual([{ path: [1], expected: undefined, actual: 2 }]) }) - test('failing predicate', () => { - const actual = createSatisfier({ a: /*istanbul ignore next*/function () { return false } }).exec({ a: 1 })! - t.strictEqual(actual.length, 1) - assertExec(actual[0], ['a'], /*istanbul ignore next*/function () { return false; }, 1) + test('match each entry', () => { + expect(createSatisfier([{ a: 1 }, { b: 2 }]).exec([{ a: 2 }, {}])).toEqual([ + { path: [0, 'a'], expected: 1, actual: 2 }, + { path: [1, 'b'], expected: 2, actual: undefined } + ]) }) +}) - test('against each element in array', () => { - t.strictEqual(createSatisfier({ a: 1 }).exec([{ a: 1 }, { b: 1, a: 1 }]), undefined) - }) +describe('predicate function', () => { + test('consider match when predicate returns true', () => { + const s = createSatisfier(v => v === 1) - test('against each element in array in deep level', () => { - const actual = createSatisfier({ a: { b: { c: /foo/ } } }).exec([{ a: {} }, { a: { b: {} } }, { a: { b: { c: 'boo' } } }])! - t.strictEqual(actual.length, 3) - assertExec(actual[0], ['[0]', 'a', 'b'], { c: /foo/ }, undefined) - assertExec(actual[1], ['[1]', 'a', 'b', 'c'], /foo/, undefined) - assertExec(actual[2], ['[2]', 'a', 'b', 'c'], /foo/, 'boo') + expect(s.exec(1)).toBeUndefined() }) - test('when apply against array, will have indices in the path', () => { - const actual = createSatisfier({ a: 1 }).exec([{ a: 1 }, {}])! - t.strictEqual(actual.length, 1) - assertExec(actual[0], ['[1]', 'a'], 1, undefined) - }) + test('consider not match when predicate returns false', () => { + const s = createSatisfier(v => v === 1) - test('when expectation is an array, apply to each entry in the actual array', () => { - t.strictEqual(createSatisfier([{ a: 1 }, { b: 2 }]).exec([{ a: 1 }, { b: 2 }, { c: 3 }]), undefined) - const actual = createSatisfier([{ a: 1 }, { b: 2 }]).exec([{ a: true }, { b: 'b' }, { c: 3 }])! - t.strictEqual(actual.length, 2) - assertExec(actual[0], ['[0]', 'a'], 1, true) - assertExec(actual[1], ['[1]', 'b'], 2, 'b') + expect(s.exec(2)).toEqual([{ path: [], expected: s.expected, actual: 2 }]) }) - test.skip('when expectation is an array and actual is not, the behavior is not defined yet', () => { - const actual = createSatisfier([{ a: 1 }, { b: 2 }]).exec({ a: 1 })! - t.strictEqual(actual.length, 1) + test('returns diff result from predicate', () => { + expect(createSatisfier(v => ([{ path: [], expected: 1, actual: 2 }])).exec(9)) + .toEqual([{ path: [], expected: 1, actual: 2 }]) }) - test('deep object checking', () => { - const actual = createSatisfier({ a: { b: 1 } }).exec({ a: { b: 2 } })! - t.strictEqual(actual.length, 1) - assertExec(actual[0], ['a', 'b'], 1, 2) + test('receives path in the second parameter', () => { + expect(createSatisfier({ a: (v, path) => ([{ path, expected: 1, actual: 2 }]) }).exec({ a: 3 })) + .toEqual([{ path: ['a'], expected: 1, actual: 2 }]) }) - test('can check parent property', () => { - class Foo { - foo = 'foo' - } - class Boo extends Foo { - boo = 'boo' - } - const boo = new Boo() - t.strictEqual(createSatisfier({ foo: 'foo' }).exec(boo), undefined) - }) + test('apply property predicate', () => { + const s = createSatisfier({ data: v => v === 1 }); - test('actual of type any should not have type checking error', () => { - let actual: any = { a: 1 } - t.strictEqual(createSatisfier({ a: 1 }).exec(actual), undefined) + expect(s.exec({ data: 1 })).toBeUndefined() + expect(s.exec({ data: 2 })).toEqual([{ path: ['data'], expected: s.expected.data, actual: 2 }]) + expect(s.exec({ foo: 'b' })).toEqual([{ path: ['data'], expected: s.expected.data, actual: undefined }]) }) +}) - test('expect array in hash', () => { - t.strictEqual(createSatisfier({ a: [1, true, 'a'] }).exec({ a: [1, true, 'a'] }), undefined) - }) +test('use generic to lock in the type of the input', () => { + const s = createSatisfier<{ a: number }>(undefined) + let y: Parameters = {} as any - test('failing array in hash', () => { - const actual = createSatisfier({ a: [1, true, 'a'] }).exec({ a: [1, true, 'b'] })! - t.strictEqual(actual.length, 1) - assertExec(actual[0], ['a', '[2]'], 'a', 'b') - }) + typeAssert.isNever(tryAssign(undefined, y[0])) +}) - test('apply property predicate to array', () => { - const satisfier = createSatisfier({ - data: (e: any) => e && e.every((x: any) => x.login) - }); +describe('test()', () => { + test('return true if exec() returns undefined', () => { + const s = createSatisfier(anything) + s.exec = () => undefined - t.strictEqual(satisfier.exec({ data: [{ login: 'a' }] }), undefined) - t.notStrictEqual(satisfier.exec([{ data: [{ foo: 'a' }] }]), undefined) - t.notStrictEqual(satisfier.exec([{ foo: 'b' }]), undefined) + expect(s.test(undefined)).toBe(true) }) -}) -describe('test', () => { - test('empty expecter passes everything but not null or undefined', () => { - t(createSatisfier({}).test({})) - t(createSatisfier({}).test({ a: 1 })) - t(createSatisfier({}).test({ a: true })) - t(createSatisfier({}).test({ a: 'a' })) - t(createSatisfier({}).test({ a: [1, true, 'a'] })) - t(createSatisfier({}).test({ a: { b: 'a' } })) - t(createSatisfier({}).test([{}, { a: 1 }])) - a.false(createSatisfier({}).test(null)) - a.false(createSatisfier({}).test(undefined as any)) - }) - - test('expect null to pass only null', () => { - t(createSatisfier(null).test(null)) - a.false(createSatisfier(null).test(undefined as any)) - a.false(createSatisfier(null).test(0)) - a.false(createSatisfier(null).test(false)) - a.false(createSatisfier(null).test('')) - }) - - test('mismatch value fails', () => { - a.false(createSatisfier({ a: 1 }).test({ a: 2 })) - a.false(createSatisfier({ a: true }).test({ a: false })) - a.false(createSatisfier({ a: 'a' }).test({ a: 'b' })) - a.false(createSatisfier({ a: /foo/ }).test({ a: 'b' })) - a.false(createSatisfier({ a: () => false }).test({ a: 'b' })) - a.false(createSatisfier([{ a: 1 }, { b: 2 }]).test([{ a: true }, { b: 'b' }, { c: 3 }])) - a.false(createSatisfier({ a: [1, true, 'a'] }).test({ a: [1, true, 'b'] })) - a.false(createSatisfier({ a: { b: 1 } }).test({ a: { b: 2 } })) - }) - - test('undefined expectation are ignored', () => { - const s = createSatisfier([undefined, 1]) - t(s.test([undefined, 1])) - t(s.test([null, 1])) - t(s.test([1, 1])) - t(s.test(['a', 1])) - t(s.test([true, 1])) - t(s.test([{ a: 1 }, 1])) - t(s.test([[1, 2], 1])) - }) - - test('undefined expectation are ignored', () => { - const s = createSatisfier({ a: [undefined, 1] }) - t(s.test({ a: [undefined, 1] })) - t(s.test({ a: [null, 1] })) - t(s.test({ a: [1, 1] })) - t(s.test({ a: ['a', 1] })) - t(s.test({ a: [true, 1] })) - t(s.test({ a: [{ a: 1 }, 1] })) - t(s.test({ a: [[1, 2], 1] })) - }) - - test('predicate receives array', () => { - t(createSatisfier((e: any) => { - return e[0] === 'a' && e[1] === 'b' - }).test(['a', 'b'])) - }) - - test('primitive predicate will check against element in array', () => { - t(createSatisfier(1).test([1, 1])) - a.false(createSatisfier(1).test([1, 2])) - t(createSatisfier(false).test([false, false])) - a.false(createSatisfier(false).test([false, true])) - t(createSatisfier('a').test(['a', 'a'])) - a.false(createSatisfier('a').test(['a', 'b'])) - }) - - - test('object predicate will check against element in array', () => { - t(createSatisfier({ a: 1 }).test([{ a: 1 }, { a: 1 }])) - t(createSatisfier({ a: (e: any) => typeof e === 'string' }) - .test([{ a: 'a' }, { a: 'b' }])) + test('returns false if exec() returns diffs', () => { + const s = createSatisfier(anything) + s.exec = () => [] + + expect(s.test(undefined)).toBe(false) }) }) diff --git a/src/createSatisfier.ts b/src/createSatisfier.ts index 43cb736..7deba79 100644 --- a/src/createSatisfier.ts +++ b/src/createSatisfier.ts @@ -1,146 +1,164 @@ -import { SatisfierExec, Satisfier } from './interfaces' -import { ArrayEntryExpectation } from './ArrayEntryExpectation' -import { Or } from './Or' +import { anything } from './anything'; +import { Diff, Predicate, Satisfier } from './interfaces'; -/** - * creates a satisfier - * @param expectation All properties can be a value which will be compared to the same property in `actual`, RegExp, or a predicate function that will be used to check against the property. - */ -export function createSatisfier(expectation: any): Satisfier { - function test(actual: T) { - return exec(actual) === undefined - } - /** - * Check if `actual` satisfies the expected criteria. - */ - function exec(actual: T) { - if (Array.isArray(actual)) { - const diff: SatisfierExec[] = [] - if (Array.isArray(expectation)) { - const arrayEntryExps: ArrayEntryExpectation[] = [] - const exp = expectation.map(e => { - if (arrayEntryExps.length >= 1) { - return new Or(...arrayEntryExps, e) - } +// Workaround for https://github.com/Microsoft/TypeScript/issues/6230 +export interface ExpectationObject { [key: string]: Expectation } - if (e instanceof ArrayEntryExpectation) { - arrayEntryExps.push(e) - } - return e - }) - let a = 0 - exp.forEach((e: any) => { - if (e === undefined) { - a = a + 1 - return - } - diff.push(...detectDiff(actual[a], e, [`[${a}]`], a)) - a = a + 1 - }) - // if (actual.length > exp.length) { - // for (let i = exp.length; i < actual.length; i++) { - // diff.push({ path: [`[${i}]`], expected: undefined, actual: actual[i] }) - // } - // } - } - else if (typeof expectation === 'function') { - diff.push(...detectDiff(actual, expectation)) - } - else if (actual.length === 0) { - diff.push({ path: [], expected: expectation, actual }) - } - else { - actual.forEach((a, i) => { - diff.push(...detectDiff(a, expectation, [`[${i}]`], i)) - }) - } - return diff.length === 0 ? undefined : diff - } - const diff = detectDiff(actual, expectation) - return diff.length === 0 ? undefined : diff - } +export interface ExpectionArray extends Array { } + +export type Expectation = symbol | undefined | null | boolean | number | bigint | + string | RegExp | ExpectionArray | ExpectationObject | Predicate + +export function createSatisfier(expected: Expectation): Satisfier { return { - test, - exec + expected, + test(actual: T) { + return this.exec(actual) === undefined + }, + exec(actual: T) { + const d = diff(expected, actual) + return d.length ? d : undefined + } } } -function detectDiff(actual: any, expected: any, path: string[] = [], index?: number) { - const diff: SatisfierExec[] = [] +const nodiff: Diff[] = [] +function diff(expected: any, actual: any, path: Diff['path'] = [], index?: number): Diff[] { + if (expected === anything) { + return nodiff + } + + if (expected === undefined || expected === null) { + return actual === expected ? nodiff : [{ + path, + expected, + actual + }] + } + + // tslint:disable-next-line: strict-type-predicates valid-typeof + if (typeof expected === 'bigint') { + return actual === expected ? nodiff : [{ + path, + expected, + actual + }] + } + const expectedType = typeof expected - if (expectedType === 'function') { - if (!(expected as Function)(actual, index)) { - diff.push({ + + if (expectedType === 'number') { + if (isNaN(expected)) { + return typeof actual === 'number' && isNaN(actual) ? nodiff : [{ path, expected, actual - }) + }] } - } - else if (expected === undefined) { - return diff - } - else if (expected === null) { - if (expected !== actual) - diff.push({ + else { + return actual === expected ? nodiff : [{ path, expected, actual - }) - } - else if (expectedType === 'number' && typeof actual === 'number') { - if (isNaN(expected) && isNaN(actual)) return diff - if (expected !== actual) - diff.push({ path, expected, actual }) - } - else if (expectedType === 'boolean' || expectedType === 'number' || expectedType === 'string' || actual === undefined) { - if (expected !== actual) - diff.push({ path, expected, actual }) + }] + } } - else if (expected instanceof ArrayEntryExpectation) { - const d = expected.exec(actual, path) - if (d) diff.push(...d) + + if (expectedType === 'boolean' || expectedType === 'string' || expectedType === 'symbol') { + return actual === expected ? nodiff : [{ + path, + expected, + actual + }] } - else if (expected instanceof RegExp) { - if (!expected.test(actual)) { - diff.push({ + + if (expected instanceof RegExp) { + if (actual instanceof RegExp) { + return expected.test(String(actual)) ? nodiff : [{ path, expected, actual - }) + }] + } + else { + return (typeof actual === 'string') && expected.test(actual) ? + nodiff : + [{ + path, + expected, + actual + }] } } - else if (Array.isArray(expected)) { + + if (Array.isArray(expected)) { if (!Array.isArray(actual)) { - diff.push({ + return [{ path, expected, actual - }) + }] } else { - expected.forEach((e: any, i) => { - if (e === undefined) - return - const actualValue = actual[i] - diff.push(...detectDiff(actualValue, e, path.concat([`[${i}]`]), i)) - }) + const max = Math.max(expected.length, actual.length) + const diffs: Diff[] = [] + for (let i = 0; i < max; i++) { + const e = expected[i] + const a = actual[i] + diffs.push(...diff(e, a, path.concat([i]))) + } + + return diffs } } + + if (expectedType === 'function') { + const r = (expected as Predicate)(actual, path) + if (r === true) return nodiff + return r ? r : [{ + path, + expected, + actual + }] + } + + // expected is an object + if (actual === undefined || actual === null) { + return [{ + path, + expected, + actual + }] + } + const actualType = typeof actual + if (actualType === 'boolean' || + actualType === 'string' || + actualType === 'number' || + actualType === 'bigint' || + actualType === 'symbol' || + actualType === 'function' || + actual instanceof RegExp) { + return [{ + path, + expected, + actual + }] + } + else if (Array.isArray(actual)) { + return [{ + path, + expected, + actual + }] + // return actual.reduce((p, v, i) => { + // p.push(...diff(expected, v, path.concat([i]))) + // return p + // }, [] as Diff[]) + } else { - // expected is object. If actual is not, then it is diff. - const actualType = typeof actual - if (actualType === 'boolean' || actualType === 'string' || actualType === 'number' || actual === undefined || actual === null) - diff.push({ - path, - expected, - actual - }) - else { - Object.keys(expected).forEach(k => { - diff.push(...detectDiff(actual[k], expected[k], path.concat([k]))) - }) - } + return Object.keys(expected).reduce((p, key: string) => { + p.push(...diff(expected[key], actual[key], path.concat([key]))) + return p + }, [] as Diff[]) } - return diff } diff --git a/src/every.spec.ts b/src/every.spec.ts index 805b095..21430c1 100644 --- a/src/every.spec.ts +++ b/src/every.spec.ts @@ -1,7 +1,7 @@ import t from 'assert' import a from 'assertron' -import { createSatisfier, every } from './index' +import { createSatisfier, every } from '.' test('non array returns false', () => { a.false(createSatisfier(every({ a: 1 })).test(true)) @@ -25,6 +25,16 @@ test('array with all match returns true', () => { a.false(createSatisfier(every({ a: 1 })).test([{ b: 1 }, { a: 1 }, { a: 1 }, 'x'])) }) +test('against each element in array in deep level', () => { + const actual = createSatisfier(every({ a: { b: { c: /foo/ } } })).exec([{ a: {} }, { a: { b: {} } }, { a: { b: { c: 'boo' } } }]) + expect(actual) + .toEqual([ + { actual: undefined, expected: { c: /foo/ }, path: [0, 'a', 'b'] }, + { actual: undefined, expected: /foo/, path: [1, 'a', 'b', 'c'] }, + { actual: 'boo', expected: /foo/, path: [2, 'a', 'b', 'c'] } + ]) +}) + test('tersify()', () => { t.strictEqual(every({ a: 1 }).tersify(), 'every({ a: 1 })') }) diff --git a/src/every.ts b/src/every.ts index c27493a..171600d 100644 --- a/src/every.ts +++ b/src/every.ts @@ -13,5 +13,12 @@ import { createSatisfier } from './createSatisfier' */ export function every(expectation: any) { const s = createSatisfier(expectation) - return tersible((e: any) => e && Array.isArray(e) && e.every(v => s.test(v)), () => `every(${tersify(expectation)})`) + return tersible((e: any) => e && Array.isArray(e) && e.reduce((p, v, i) => { + const d = s.exec(v) + if (d) p.push(...d.map(d => { + d.path.unshift(i) + return d + })) + return p + }, []), () => `every(${tersify(expectation)})`) } diff --git a/src/formatDiffs.spec.ts b/src/formatDiffs.spec.ts new file mode 100644 index 0000000..0cc301c --- /dev/null +++ b/src/formatDiffs.spec.ts @@ -0,0 +1,17 @@ +import { createSatisfier, every, formatDiffs, has } from '.'; + +test('index is wrapped with []', () => { + const diffs = createSatisfier(every({ a: { b: { c: /foo/ } } })).exec([{ a: {} }, { a: { b: {} } }, { a: { b: { c: 'boo' } } }]) + const actual = formatDiffs(diffs) + expect(actual).toEqual( +`expect '[0].a.b' to satisfy { c: /foo/ }, but received undefined +expect '[1].a.b.c' to satisfy /foo/, but received undefined +expect '[2].a.b.c' to satisfy /foo/, but received 'boo'` + ) +}) + +test('uses tersify function when available', () => { + const diffs = createSatisfier(has(1)).exec([2, 3]) + const actual = formatDiffs(diffs) + expect(actual).toEqual(`expect subject to satisfy has(1), but received [2, 3]`) +}) diff --git a/src/formatDiffs.ts b/src/formatDiffs.ts new file mode 100644 index 0000000..9c0762d --- /dev/null +++ b/src/formatDiffs.ts @@ -0,0 +1,10 @@ +import { tersify } from 'tersify'; +import { Diff } from './interfaces'; + +export function formatDiffs(diffs: Diff[] | undefined) { + if (!diffs) return '' + return diffs.map(d => { + const path = d.path.length === 0 ? 'subject' : `'${d.path.map(p => typeof p === 'number' ? `[${p}]` : p).join('.')}'` + return `expect ${path} to satisfy ${tersify(d.expected)}, but received ${tersify(d.actual)}` + }).join('\n') +} diff --git a/src/has.spec.ts b/src/has.spec.ts index 4573abc..7804696 100644 --- a/src/has.spec.ts +++ b/src/has.spec.ts @@ -1,7 +1,6 @@ -import t from 'assert' -import a from 'assertron' - -import { createSatisfier, has } from './index' +import t from 'assert'; +import a from 'assertron'; +import { createSatisfier, has } from '.'; test('non array returns false', () => { a.false(createSatisfier(has(1)).test(undefined)) @@ -49,6 +48,10 @@ test('pass when there are unmatched entry between matched one', () => { t(createSatisfier(has(1, 3)).test([1, 2, 3])) }) +test('fails when not all entries are matched', () => { + t(!createSatisfier(has(1, 4)).test([1, 2, 3])) +}) + test('tersify()', () => { t.strictEqual(has({ a: 1 }, { b: 2 }).tersify(), 'has({ a: 1 }, { b: 2 })') }) diff --git a/src/has.ts b/src/has.ts index 9ec76d7..ea8eda6 100644 --- a/src/has.ts +++ b/src/has.ts @@ -14,7 +14,7 @@ export function has(...expectations: any[]) { return tersible((arr: any) => { if (!Array.isArray(arr)) return false let index = 0 - return expectations.some(e => { + return expectations.every(e => { const s = createSatisfier(e) let actual = arr[index] while (index < arr.length && !s.test(actual)) { diff --git a/src/index.ts b/src/index.ts index 95b6f94..9c80167 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ -export * from './ArrayEntryExpectation'; -export * from './AtLeastOnce'; +export * from './anything'; export * from './createSatisfier'; export * from './every'; +export * from './formatDiffs'; export * from './has'; export * from './interfaces'; export * from './isInInterval'; @@ -9,3 +9,4 @@ export * from './isInRange'; export * from './isTypeOf'; export * from './none'; export * from './some'; +export * from './startsWith'; diff --git a/src/interfaces.ts b/src/interfaces.ts index 0a5563b..5671cda 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -1,16 +1,17 @@ import { Tersible } from 'tersify' -export type Predicate = (value: any) => boolean +export type Predicate = (value: any, path: (string | number)[]) => boolean | Diff[] export type TersiblePredicate = Tersible export interface Satisfier { + expected: any, test: (actual: T) => boolean; - exec: (actual: T) => SatisfierExec[] | undefined; + exec: (actual: T) => Diff[] | undefined; } -export interface SatisfierExec { - path: string[], +export interface Diff { + path: (string | number)[], expected: any, actual: any } diff --git a/src/isInInterval.spec.ts b/src/isInInterval.spec.ts index 5abe684..7c75e30 100644 --- a/src/isInInterval.spec.ts +++ b/src/isInInterval.spec.ts @@ -1,14 +1,6 @@ -import t from 'assert' -import a from 'assertron' - -import { - createSatisfier, - isInClosedInterval, - isInLeftClosedInterval, - isInOpenInterval, - isInRightClosedInterval -} from './index' - +import t from 'assert'; +import a from 'assertron'; +import { createSatisfier, isInClosedInterval, isInLeftClosedInterval, isInOpenInterval, isInRightClosedInterval } from '.'; test('open interval', () => { a.false(createSatisfier(isInOpenInterval(1, 3)).test(1)) diff --git a/src/none.spec.ts b/src/none.spec.ts index 469afa8..7c0eee6 100644 --- a/src/none.spec.ts +++ b/src/none.spec.ts @@ -1,7 +1,6 @@ -import t from 'assert' -import a from 'assertron' - -import { createSatisfier, none } from './index' +import t from 'assert'; +import a from 'assertron'; +import { createSatisfier, none } from '.'; test('non array returns false', () => { a.false(createSatisfier(none({ a: 1 })).test(true)) diff --git a/src/some.spec.ts b/src/some.spec.ts index 08d2761..8ce31c9 100644 --- a/src/some.spec.ts +++ b/src/some.spec.ts @@ -1,7 +1,7 @@ import t from 'assert' import a from 'assertron' -import { createSatisfier, some } from './index' +import { createSatisfier, some } from '.' test('non array returns false', () => { a.false(createSatisfier(some({ a: 1 })).test(true)) diff --git a/src/startsWith.spec.ts b/src/startsWith.spec.ts new file mode 100644 index 0000000..cd7b365 --- /dev/null +++ b/src/startsWith.spec.ts @@ -0,0 +1,39 @@ +import { createSatisfier } from 'satisfier'; +import { startsWith } from '.'; + +test('non array returns false', () => { + expect(createSatisfier(startsWith([{ a: 1 }])).test(undefined)).toBe(false) + expect(createSatisfier(startsWith([{ a: 1 }])).test(null)).toBe(false) + expect(createSatisfier(startsWith([{ a: 1 }])).test(1)).toBe(false) + expect(createSatisfier(startsWith([{ a: 1 }])).test(true)).toBe(false) + expect(createSatisfier(startsWith([{ a: 1 }])).test('a')).toBe(false) + expect(createSatisfier(startsWith([{ a: 1 }])).test({ a: 1 })).toBe(false) +}) + +test('empty array will pass any array', () => { + expect(createSatisfier(startsWith([])).test([])).toBe(true) + expect(createSatisfier(startsWith([])).test([1])).toBe(true) +}) + +test('test against shorter array returns false', () => { + expect(createSatisfier(startsWith([{ a: 1 }])).test([])).toBe(false) + expect(createSatisfier(startsWith([{ a: 1 }, { b: 1 }])).test([{ a: 1 }])).toBe(false) +}) + +test('test against longer array returns true', () => { + expect(createSatisfier(startsWith([{ a: 1 }])).test([{ a: 1 }, { b: 1 }])).toBe(true) +}) + +test('each entry are checked', () => { + expect(createSatisfier(startsWith([{ a: 1 }])).test([{ a: 1, b: 1 }])).toBe(true) +}) + +test('array property inside entry is tested with exact logic', () => { + const satisfier = createSatisfier(startsWith([{ a: [1, 2] }])) + expect(satisfier.test([{ a: [1, 2] }, 2])).toBe(true) + expect(satisfier.test([{ a: [1, 2, 3] }, 2])).toBe(false) +}) + +test('tersify()', () => { + expect(startsWith([{ a: 1 }, { b: 2 }]).tersify()).toBe('startsWith([{ a: 1 }, { b: 2 }])') +}) diff --git a/src/startsWith.ts b/src/startsWith.ts index 451b91f..dd1a044 100644 --- a/src/startsWith.ts +++ b/src/startsWith.ts @@ -1,26 +1,17 @@ -import { - tersible, - tersify, - // @ts-ignore - Tersify -} from 'tersify' +import { tersible, tersify } from 'tersify'; +import { createSatisfier } from './createSatisfier'; -import { createSatisfier } from './createSatisfier' /** * Check if an array has the first n entries satisfying the specifiec expectations. */ -export function startsWith(...expectations: any[]) { - return tersible((arr: any) => { - if (!Array.isArray(arr)) return false - let index = 0 - return expectations.some(e => { - const s = createSatisfier(e) - let actual = arr[index] - while (index < arr.length && !s.test(actual)) { - actual = arr[++index] - } - return index !== arr.length +export function startsWith(expectations: any[]) { + return tersible((value: any) => { + if (!Array.isArray(value)) return false + if (expectations.length === 0) return true + return expectations.every((e, i) => { + const a = value[i] + return createSatisfier(e).test(a) }) - }, () => `startsWith(${expectations.map(e => tersify(e)).join(', ')})`) + }, () => `startsWith([${expectations.map(e => tersify(e)).join(', ')}])`) } diff --git a/src/testUtil.ts b/src/testUtil.ts deleted file mode 100644 index 7e03ff3..0000000 --- a/src/testUtil.ts +++ /dev/null @@ -1,19 +0,0 @@ -import t from 'assert' - -import { tersify } from 'tersify' - -export function assertRegExp(actual: any, path: string[], regex: any, actualValue: any) { - t.strictEqual(actual.length, 1) - t.deepStrictEqual(actual[0].path, path) - t.strictEqual(actual[0].expected.source, regex.source) - t.deepStrictEqual(actual[0].actual, actualValue) -} - -export function assertExec(entry: any, path: string[], expected: any, actual: any) { - t.deepStrictEqual(entry.path, path) - if (typeof entry.expected === 'function') - t.strictEqual(tersify(entry.expected), tersify(expected)) - else - t.deepStrictEqual(entry.expected, expected) - t.deepStrictEqual(entry.actual, actual) -} diff --git a/tsconfig.esnext.json b/tsconfig.esnext.json index 064c508..df00a13 100755 --- a/tsconfig.esnext.json +++ b/tsconfig.esnext.json @@ -3,6 +3,9 @@ "compilerOptions": { "module": "esnext", "outDir": "libm", - "target": "esnext" + "target": "esnext", + "lib": [ + "esnext" + ] } } diff --git a/yarn.lock b/yarn.lock index 968d42f..3792282 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,17 +10,17 @@ "@babel/highlight" "^7.0.0" "@babel/core@^7.1.0": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.3.tgz#d090d157b7c5060d05a05acaebc048bd2b037947" - integrity sha512-w445QGI2qd0E0GlSnq6huRZWPMmQGCp5gd5ZWS4hagn0EiwzxD5QMFkpchyusAyVC1n27OKXzQ0/88aVU9n4xQ== + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b" + integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.3.3" + "@babel/generator" "^7.3.4" "@babel/helpers" "^7.2.0" - "@babel/parser" "^7.3.3" + "@babel/parser" "^7.3.4" "@babel/template" "^7.2.2" - "@babel/traverse" "^7.2.2" - "@babel/types" "^7.3.3" + "@babel/traverse" "^7.3.4" + "@babel/types" "^7.3.4" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" @@ -29,12 +29,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.0.0", "@babel/generator@^7.2.2", "@babel/generator@^7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.3.tgz#185962ade59a52e00ca2bdfcfd1d58e528d4e39e" - integrity sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A== +"@babel/generator@^7.0.0", "@babel/generator@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" + integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg== dependencies: - "@babel/types" "^7.3.3" + "@babel/types" "^7.3.4" jsesc "^2.5.1" lodash "^4.17.11" source-map "^0.5.0" @@ -86,10 +86,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.2.3", "@babel/parser@^7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.3.tgz#092d450db02bdb6ccb1ca8ffd47d8774a91aef87" - integrity sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" + integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== "@babel/plugin-syntax-object-rest-spread@^7.0.0": version "7.2.0" @@ -107,30 +107,175 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" - integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" + integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.2.2" + "@babel/generator" "^7.3.4" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.2.3" - "@babel/types" "^7.2.2" + "@babel/parser" "^7.3.4" + "@babel/types" "^7.3.4" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.10" + lodash "^4.17.11" -"@babel/types@^7.0.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.3.tgz#6c44d1cdac2a7625b624216657d5bc6c107ab436" - integrity sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ== +"@babel/types@^7.0.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" + integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== dependencies: esutils "^2.0.2" lodash "^4.17.11" to-fast-properties "^2.0.0" +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@jest/console@^24.3.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.3.0.tgz#7bd920d250988ba0bf1352c4493a48e1cb97671e" + integrity sha512-NaCty/OOei6rSDcbPdMiCbYCI0KGFGPgGO6B09lwWt5QTxnkuhKYET9El5u5z1GAcSxkQmSMtM63e24YabCWqA== + dependencies: + "@jest/source-map" "^24.3.0" + "@types/node" "*" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.5.0.tgz#2cefc6a69e9ebcae1da8f7c75f8a257152ba1ec0" + integrity sha512-RDZArRzAs51YS7dXG1pbXbWGxK53rvUu8mCDYsgqqqQ6uSOaTjcVyBl2Jce0exT2rSLk38ca7az7t2f3b0/oYQ== + dependencies: + "@jest/console" "^24.3.0" + "@jest/reporters" "^24.5.0" + "@jest/test-result" "^24.5.0" + "@jest/transform" "^24.5.0" + "@jest/types" "^24.5.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.5.0" + jest-config "^24.5.0" + jest-haste-map "^24.5.0" + jest-message-util "^24.5.0" + jest-regex-util "^24.3.0" + jest-resolve-dependencies "^24.5.0" + jest-runner "^24.5.0" + jest-runtime "^24.5.0" + jest-snapshot "^24.5.0" + jest-util "^24.5.0" + jest-validate "^24.5.0" + jest-watcher "^24.5.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + pirates "^4.0.1" + realpath-native "^1.1.0" + rimraf "^2.5.4" + strip-ansi "^5.0.0" + +"@jest/environment@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.5.0.tgz#a2557f7808767abea3f9e4cc43a172122a63aca8" + integrity sha512-tzUHR9SHjMXwM8QmfHb/EJNbF0fjbH4ieefJBvtwO8YErLTrecc1ROj0uo2VnIT6SlpEGZnvdCK6VgKYBo8LsA== + dependencies: + "@jest/fake-timers" "^24.5.0" + "@jest/transform" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/node" "*" + jest-mock "^24.5.0" + +"@jest/fake-timers@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.5.0.tgz#4a29678b91fd0876144a58f8d46e6c62de0266f0" + integrity sha512-i59KVt3QBz9d+4Qr4QxsKgsIg+NjfuCjSOWj3RQhjF5JNy+eVJDhANQ4WzulzNCHd72srMAykwtRn5NYDGVraw== + dependencies: + "@jest/types" "^24.5.0" + "@types/node" "*" + jest-message-util "^24.5.0" + jest-mock "^24.5.0" + +"@jest/reporters@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.5.0.tgz#9363a210d0daa74696886d9cb294eb8b3ad9b4d9" + integrity sha512-vfpceiaKtGgnuC3ss5czWOihKOUSyjJA4M4udm6nH8xgqsuQYcyDCi4nMMcBKsHXWgz9/V5G7iisnZGfOh1w6Q== + dependencies: + "@jest/environment" "^24.5.0" + "@jest/test-result" "^24.5.0" + "@jest/transform" "^24.5.0" + "@jest/types" "^24.5.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-api "^2.1.1" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-source-maps "^3.0.1" + jest-haste-map "^24.5.0" + jest-resolve "^24.5.0" + jest-runtime "^24.5.0" + jest-util "^24.5.0" + jest-worker "^24.4.0" + node-notifier "^5.2.1" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" + integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.5.0.tgz#ab66fb7741a04af3363443084e72ea84861a53f2" + integrity sha512-u66j2vBfa8Bli1+o3rCaVnVYa9O8CAFZeqiqLVhnarXtreSXG33YQ6vNYBogT7+nYiFNOohTU21BKiHlgmxD5A== + dependencies: + "@jest/console" "^24.3.0" + "@jest/types" "^24.5.0" + "@types/istanbul-lib-coverage" "^1.1.0" + +"@jest/transform@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.5.0.tgz#6709fc26db918e6af63a985f2cc3c464b4cf99d9" + integrity sha512-XSsDz1gdR/QMmB8UCKlweAReQsZrD/DK7FuDlNo/pE8EcKMrfi2kqLRk8h8Gy/PDzgqJj64jNEzOce9pR8oj1w== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.5.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.5.0" + jest-regex-util "^24.3.0" + jest-util "^24.5.0" + micromatch "^3.1.10" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.5.0.tgz#feee214a4d0167b0ca447284e95a57aa10b3ee95" + integrity sha512-kN7RFzNMf2R8UDadPOl6ReyI+MT8xfqRuAnuVL+i4gwjv/zubdDK+EDeLHYwq1j0CSSR2W/MmgaRlMZJzXdmVA== + dependencies: + "@types/istanbul-lib-coverage" "^1.1.0" + "@types/yargs" "^12.0.9" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -144,47 +289,95 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@types/babel__core@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.0.tgz#710f2487dda4dcfd010ca6abb2b4dc7394365c51" + integrity sha512-wJTeJRt7BToFx3USrCDs2BhEi4ijBInTQjOIukj6a/5tEkwpFMVZ+1ppgmE+Q/FQyc5P/VWUbx7I9NELrKruHA== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" + integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2" + integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/istanbul-lib-coverage@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz#2cc2ca41051498382b43157c8227fea60363f94a" + integrity sha512-ohkhb9LehJy+PA40rDtGAji61NCgdtKLAlFoYp4cnuuQEswwdK3vz9SOIkkyc3wrk8dzjphQApNs56yyXLStaQ== + "@types/jest-diff@*": version "20.0.1" resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== -"@types/jest@^24.0.5": - version "24.0.5" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.5.tgz#a4f9e255f460ce24896cfec89aacf1151a2131ee" - integrity sha512-Xj6xJ0bzP7a78ZSEY6P0Q4ZIb/YbdPiFsEUOTki6wZOE3lpANJoyjQpCe3DgUvUZGw56IMqTjFEmMaqzbteLmw== +"@types/jest@^24.0.9": + version "24.0.11" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.11.tgz#1f099bea332c228ea6505a88159bfa86a5858340" + integrity sha512-2kLuPC5FDnWIDvaJBzsGTBQaBbnDweznicvK7UGYzlIJP4RJR2a4A/ByLUXEyEgag6jz8eHdlWExGDtH3EYUXQ== dependencies: "@types/jest-diff" "*" -"@types/node@^10.12.26": - version "10.12.26" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.26.tgz#2dec19f1f7981c95cb54bab8f618ecb5dc983d0e" - integrity sha512-nMRqS+mL1TOnIJrL6LKJcNZPB8V3eTfRo9FQA2b5gDvrHurC8XbSA86KNe0dShlEL7ReWJv/OU9NL7Z0dnqWTg== +"@types/node@*", "@types/node@^11.9.5": + version "11.11.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.3.tgz#7c6b0f8eaf16ae530795de2ad1b85d34bf2f5c58" + integrity sha512-wp6IOGu1lxsfnrD+5mX6qwSwWuqsdkKKxTN4aQc4wByHAKZJf9/D4KXPQ1POUjEbnCP5LMggB0OEFNY9OTsMqg== -"@unional/devpkg-node@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@unional/devpkg-node/-/devpkg-node-1.2.4.tgz#30b8be541e355d1457c36763ab645ac37d31a922" - integrity sha512-e1K530iRVMVc8jH0Usvg9SLFodtNmb4Z4uPEp6cHmFRIhaRv3RyzaBKdIwF9xEElqLVDOg76gQ/x1L9ip9BwrA== +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": + version "12.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.9.tgz#693e76a52f61a2f1e7fb48c0eef167b95ea4ffd0" + integrity sha512-sCZy4SxP9rN2w30Hlmg5dtdRwgYQfYRiLo9usw8X9cxlf+H4FqM1xX7+sNH7NNKVdbXMJWqva7iyy+fxh/V7fA== + +"@unional/devpkg-node@^1.2.5": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@unional/devpkg-node/-/devpkg-node-1.2.5.tgz#2a292b2cf1cb27162adf9eaabfc1ccf45f28426d" + integrity sha512-YXTrBX+uR8CFU5Gl++kxcudiP902L2Wwu7cjlzG066YDILtx+zgV4/gVIplk1uMIVpc0kobbiNLezoUcP7sw1w== dependencies: - "@types/jest" "^24.0.5" - "@types/node" "^10.12.26" + "@types/jest" "^24.0.9" + "@types/node" "^11.9.5" dependency-check "^3.3.0" - eslint "^5.14.0" + eslint "^5.14.1" eslint-plugin-harmony "^1.0.4" is-ci "^2.0.0" jest "^24.1.0" jest-audio-reporter "^2.2.1" jest-progress-tracker "^2.0.1" jest-validate "^24.0.0" - jest-watch-repeat "^1.0.0" + jest-watch-repeat "^1.0.1" jest-watch-suspend "^1.1.1" jest-watch-toggle-config "^1.0.2" power-assert "^1.6.1" rimraf "^2.6.3" - ts-jest "^23.10.5" - tslint "^5.12.1" + ts-jest "^24.0.0" + tslint "^5.13.0" tslint-config-unional "^0.10.0" - typescript "^3.3.3" + typescript "^3.3.3333" abab@^2.0.0: version "2.0.0" @@ -196,6 +389,11 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +acorn-bigint@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/acorn-bigint/-/acorn-bigint-0.3.1.tgz#edb40a414dcaf5a09c2933db6bed79454b3ff46a" + integrity sha512-WT9LheDC4/d/sD/jgC6L5UMq4U9X3KNMy0JrXp/MdJL83ZqcuPQuMkj50beOX0dMub8IoZUYycfN7bIVZuU5zg== + acorn-dynamic-import@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" @@ -239,15 +437,22 @@ acorn@^5.0.0, acorn@^5.5.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7: - version "6.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.0.tgz#b0a3be31752c97a0f7013c5f4903b71a05db6818" - integrity sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw== +acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7, acorn@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + +agent-base@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== + dependencies: + es6-promisify "^5.0.0" ajv@^6.5.5, ajv@^6.9.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.1.tgz#a4d3683d74abc5670e75f0b16520f70a20ea8dc1" - integrity sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA== + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -269,10 +474,10 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" - integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== ansi-styles@^2.2.1: version "2.2.1" @@ -321,6 +526,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argv@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" + integrity sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas= + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -453,37 +663,42 @@ babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-jest@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.1.0.tgz#441e23ef75ded3bd547e300ac3194cef87b55190" - integrity sha512-MLcagnVrO9ybQGLEfZUqnOzv36iQzU7Bj4elm39vCukumLVSfoX+tRy3/jW7lUKc7XdpRmB/jech6L/UCsSZjw== +babel-jest@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.5.0.tgz#0ea042789810c2bec9065f7c8ab4dc18e1d28559" + integrity sha512-0fKCXyRwxFTJL0UXDJiT2xYxO9Lu2vBd9n+cC+eDjESzcVG3s2DRGAxbzJX21fceB1WYoBjAh8pQ83dKcl003g== dependencies: + "@jest/transform" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/babel__core" "^7.1.0" babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.1.0" + babel-preset-jest "^24.3.0" chalk "^2.4.2" slash "^2.0.0" babel-plugin-istanbul@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.0.tgz#6892f529eff65a3e2d33d87dc5888ffa2ecd4a30" - integrity sha512-CLoXPRSUWiR8yao8bShqZUIC6qLfZVVY3X1wj+QPNXu0wfmrRRfarh1LYy+dYMVI+bDj0ghy3tuqFFRFZmL1Nw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz#7981590f1956d75d67630ba46f0c22493588c893" + integrity sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ== dependencies: find-up "^3.0.0" istanbul-lib-instrument "^3.0.0" test-exclude "^5.0.0" -babel-plugin-jest-hoist@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.1.0.tgz#dfecc491fb15e2668abbd690a697a8fd1411a7f8" - integrity sha512-gljYrZz8w1b6fJzKcsfKsipSru2DU2DmQ39aB6nV3xQ0DDv3zpIzKGortA5gknrhNnPN8DweaEgrnZdmbGmhnw== +babel-plugin-jest-hoist@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.3.0.tgz#f2e82952946f6e40bb0a75d266a3790d854c8b5b" + integrity sha512-nWh4N1mVH55Tzhx2isvUN5ebM5CDUvIpXPZYMRazQughie/EqGnbR+czzoQlhUmJG9pPJmYDRhvocotb2THl1w== + dependencies: + "@types/babel__traverse" "^7.0.6" -babel-preset-jest@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.1.0.tgz#83bc564fdcd4903641af65ec63f2f5de6b04132e" - integrity sha512-FfNLDxFWsNX9lUmtwY7NheGlANnagvxq8LZdl5PKnVG3umP+S/g0XbVBfwtA4Ai3Ri/IMkWabBz3Tyk9wdspcw== +babel-preset-jest@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.3.0.tgz#db88497e18869f15b24d9c0e547d8e0ab950796d" + integrity sha512-VGTV2QYBa/Kn3WCOKdfS31j9qomaXSgJqi65B6o05/1GsJyj9LVhSljM9ro4S+IBGj/ENhNBuH9bpqzztKAQSw== dependencies: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.1.0" + babel-plugin-jest-hoist "^24.3.0" balanced-match@^1.0.0: version "1.0.0" @@ -618,9 +833,9 @@ camelcase@^4.1.0: integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= camelcase@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" - integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + version "5.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" + integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ== capture-exit@^1.2.0: version "1.2.0" @@ -660,9 +875,9 @@ chardet@^0.7.0: integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== chokidar@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.1.tgz#adc39ad55a2adf26548bd2afa048f611091f9184" - integrity sha512-gfw3p2oQV2wEt+8VuMlNsPjCxDxvvgnm/kz+uATu805mWVF8IJN7uz9DN7iBz+RMJISmiVbCOBFs9qBGMjtPfQ== + version "2.1.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058" + integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg== dependencies: anymatch "^2.0.0" async-each "^1.0.1" @@ -729,6 +944,17 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +codecov@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.2.0.tgz#4465ee19884528092d8c313e1f9e4bdc7d3065cd" + integrity sha512-3NJvNARXxilqnqVfgzDHyVrF4oeVgaYW1c1O6Oi5mn93exE7HTSSFNiYdwojWW6IwrCZABJ8crpNbKoo9aUHQw== + dependencies: + argv "^0.0.2" + ignore-walk "^3.0.1" + js-yaml "^3.12.0" + teeny-request "^3.7.0" + urlgrey "^0.4.4" + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -825,9 +1051,9 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== cssstyle@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" - integrity sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog== + version "1.2.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.1.tgz#3aceb2759eaf514ac1a21628d723d6043a819495" + integrity sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A== dependencies: cssom "0.3.x" @@ -854,6 +1080,13 @@ debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -970,10 +1203,10 @@ diff-match-patch@^1.0.0: resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.4.tgz#6ac4b55237463761c4daf0dc603eb869124744b1" integrity sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg== -diff-sequences@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.0.0.tgz#cdf8e27ed20d8b8d3caccb4e0c0d8fe31a173013" - integrity sha512-46OkIuVGBBnrC0soO/4LHu5LHGHx0uhP65OVz8XOrAJpqiCB2aVIuESvjI1F9oqebuvY8lekS1pt6TN7vt7qsw== +diff-sequences@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" + integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== diff@^3.2.0: version "3.5.0" @@ -1079,15 +1312,27 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^4.0.3: + version "4.2.6" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" + integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.9.1: - version "1.11.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" - integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -1101,10 +1346,10 @@ eslint-plugin-harmony@^1.0.4: resolved "https://registry.yarnpkg.com/eslint-plugin-harmony/-/eslint-plugin-harmony-1.0.4.tgz#de124047e4837572d96a90380ade19f4c4fe4f4b" integrity sha512-fc6oOzLyPRm02U/evWxqFOvowh/g568llbC22p9h5Eq5U//kNjk5GyyoK0VZ8tGkrMAsqkdGnHae/r1nKXqxuQ== -eslint-scope@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" - integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== +eslint-scope@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.2.tgz#5f10cd6cabb1965bf479fa65745673439e21cb0e" + integrity sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -1119,10 +1364,10 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@^5.14.0: - version "5.14.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.14.0.tgz#380739df2489dd846baea008638b036c1e987974" - integrity sha512-jrOhiYyENRrRnWlMYANlGZTqb89r2FuRT+615AabBoajhNjeh9ywDNlh2LU9vTqf0WYN+L3xdXuIi7xuj/tK9w== +eslint@^5.14.1: + version "5.15.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.15.1.tgz#8266b089fd5391e0009a047050795b1d73664524" + integrity sha512-NTcm6vQ+PTgN3UBsALw5BMhgO6i5EpIjQF/Xb5tIh3sk9QhrFafujUOczGz4J24JBlzWclSB9Vmx8d+9Z6bFCg== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.9.1" @@ -1130,7 +1375,7 @@ eslint@^5.14.0: cross-spawn "^6.0.5" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^4.0.0" + eslint-scope "^4.0.2" eslint-utils "^1.3.1" eslint-visitor-keys "^1.0.0" espree "^5.0.1" @@ -1216,12 +1461,10 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= -exec-sh@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" - integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== - dependencies: - merge "^1.2.0" +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== execa@^1.0.0: version "1.0.0" @@ -1254,16 +1497,17 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.1.0.tgz#88e73301c4c785cde5f16da130ab407bdaf8c0f2" - integrity sha512-lVcAPhaYkQcIyMS+F8RVwzbm1jro20IG8OkvxQ6f1JfqhVZyyudCwYogQ7wnktlf14iF3ii7ArIUO/mqvrW9Gw== +expect@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.5.0.tgz#492fb0df8378d8474cc84b827776b069f46294ed" + integrity sha512-p2Gmc0CLxOgkyA93ySWmHFYHUPFIHG6XZ06l7WArWAsrqYVaVEkOU5NtT5i68KUyGKbkQgDCkiT65bWmdoL6Bw== dependencies: + "@jest/types" "^24.5.0" ansi-styles "^3.2.0" - jest-get-type "^24.0.0" - jest-matcher-utils "^24.0.0" - jest-message-util "^24.0.0" - jest-regex-util "^24.0.0" + jest-get-type "^24.3.0" + jest-matcher-utils "^24.5.0" + jest-message-util "^24.5.0" + jest-regex-util "^24.3.0" extend-shallow@^2.0.1: version "2.0.1" @@ -1448,7 +1692,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.3, fsevents@^1.2.7: +fsevents@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== @@ -1667,6 +1911,14 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1998,7 +2250,7 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-api@^2.0.8: +istanbul-api@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.1.tgz#194b773f6d9cbc99a9258446848b0f988951c4d0" integrity sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw== @@ -2077,192 +2329,201 @@ jest-audio-reporter@^2.2.1: play-sound "^1.1.3" rc "^1.2.8" -jest-changed-files@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.0.0.tgz#c02c09a8cc9ca93f513166bc773741bd39898ff7" - integrity sha512-nnuU510R9U+UX0WNb5XFEcsrMqriSiRLeO9KWDFgPrpToaQm60prfQYpxsXigdClpvNot5bekDY440x9dNGnsQ== +jest-changed-files@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.5.0.tgz#4075269ee115d87194fd5822e642af22133cf705" + integrity sha512-Ikl29dosYnTsH9pYa1Tv9POkILBhN/TLZ37xbzgNsZ1D2+2n+8oEZS2yP1BrHn/T4Rs4Ggwwbp/x8CKOS5YJOg== dependencies: + "@jest/types" "^24.5.0" execa "^1.0.0" throat "^4.0.0" -jest-cli@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.1.0.tgz#f7cc98995f36e7210cce3cbb12974cbf60940843" - integrity sha512-U/iyWPwOI0T1CIxVLtk/2uviOTJ/OiSWJSe8qt6X1VkbbgP+nrtLJlmT9lPBe4lK78VNFJtrJ7pttcNv/s7yCw== +jest-cli@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.5.0.tgz#598139d3446d1942fb7dc93944b9ba766d756d4b" + integrity sha512-P+Jp0SLO4KWN0cGlNtC7JV0dW1eSFR7eRpoOucP2UM0sqlzp/bVHeo71Omonvigrj9AvCKy7NtQANtqJ7FXz8g== dependencies: - ansi-escapes "^3.0.0" + "@jest/core" "^24.5.0" + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" chalk "^2.0.1" exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.1.15" import-local "^2.0.0" is-ci "^2.0.0" - istanbul-api "^2.0.8" - istanbul-lib-coverage "^2.0.2" - istanbul-lib-instrument "^3.0.1" - istanbul-lib-source-maps "^3.0.1" - jest-changed-files "^24.0.0" - jest-config "^24.1.0" - jest-environment-jsdom "^24.0.0" - jest-get-type "^24.0.0" - jest-haste-map "^24.0.0" - jest-message-util "^24.0.0" - jest-regex-util "^24.0.0" - jest-resolve-dependencies "^24.1.0" - jest-runner "^24.1.0" - jest-runtime "^24.1.0" - jest-snapshot "^24.1.0" - jest-util "^24.0.0" - jest-validate "^24.0.0" - jest-watcher "^24.0.0" - jest-worker "^24.0.0" - micromatch "^3.1.10" - node-notifier "^5.2.1" - p-each-series "^1.0.0" - pirates "^4.0.0" + jest-config "^24.5.0" + jest-util "^24.5.0" + jest-validate "^24.5.0" prompts "^2.0.1" - realpath-native "^1.0.0" - rimraf "^2.5.4" - slash "^2.0.0" - string-length "^2.0.0" - strip-ansi "^5.0.0" - which "^1.2.12" + realpath-native "^1.1.0" yargs "^12.0.2" -jest-config@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.1.0.tgz#6ea6881cfdd299bc86cc144ee36d937c97c3850c" - integrity sha512-FbbRzRqtFC6eGjG5VwsbW4E5dW3zqJKLWYiZWhB0/4E5fgsMw8GODLbGSrY5t17kKOtCWb/Z7nsIThRoDpuVyg== +jest-config@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.5.0.tgz#404d1bc6bb81aed6bd1890d07e2dca9fbba2e121" + integrity sha512-t2UTh0Z2uZhGBNVseF8wA2DS2SuBiLOL6qpLq18+OZGfFUxTM7BzUVKyHFN/vuN+s/aslY1COW95j1Rw81huOQ== dependencies: "@babel/core" "^7.1.0" - babel-jest "^24.1.0" + "@jest/types" "^24.5.0" + babel-jest "^24.5.0" chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^24.0.0" - jest-environment-node "^24.0.0" - jest-get-type "^24.0.0" - jest-jasmine2 "^24.1.0" - jest-regex-util "^24.0.0" - jest-resolve "^24.1.0" - jest-util "^24.0.0" - jest-validate "^24.0.0" + jest-environment-jsdom "^24.5.0" + jest-environment-node "^24.5.0" + jest-get-type "^24.3.0" + jest-jasmine2 "^24.5.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.5.0" + jest-util "^24.5.0" + jest-validate "^24.5.0" micromatch "^3.1.10" - pretty-format "^24.0.0" - realpath-native "^1.0.2" + pretty-format "^24.5.0" + realpath-native "^1.1.0" -jest-diff@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.0.0.tgz#a3e5f573dbac482f7d9513ac9cfa21644d3d6b34" - integrity sha512-XY5wMpRaTsuMoU+1/B2zQSKQ9RdE9gsLkGydx3nvApeyPijLA8GtEvIcPwISRCer+VDf9W1mStTYYq6fPt8ryA== +jest-diff@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.5.0.tgz#a2d8627964bb06a91893c0fbcb28ab228c257652" + integrity sha512-mCILZd9r7zqL9Uh6yNoXjwGQx0/J43OD2vvWVKwOEOLZliQOsojXwqboubAQ+Tszrb6DHGmNU7m4whGeB9YOqw== dependencies: chalk "^2.0.1" - diff-sequences "^24.0.0" - jest-get-type "^24.0.0" - pretty-format "^24.0.0" + diff-sequences "^24.3.0" + jest-get-type "^24.3.0" + pretty-format "^24.5.0" -jest-docblock@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.0.0.tgz#54d77a188743e37f62181a91a01eb9222289f94e" - integrity sha512-KfAKZ4SN7CFOZpWg4i7g7MSlY0M+mq7K0aMqENaG2vHuhC9fc3vkpU/iNN9sOus7v3h3Y48uEjqz3+Gdn2iptA== +jest-docblock@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" + integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== dependencies: detect-newline "^2.1.0" -jest-each@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.0.0.tgz#10987a06b21c7ffbfb7706c89d24c52ed864be55" - integrity sha512-gFcbY4Cu55yxExXMkjrnLXov3bWO3dbPAW7HXb31h/DNWdNc/6X8MtxGff8nh3/MjkF9DpVqnj0KsPKuPK0cpA== +jest-each@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.5.0.tgz#da14d017a1b7d0f01fb458d338314cafe7f72318" + integrity sha512-6gy3Kh37PwIT5sNvNY2VchtIFOOBh8UCYnBlxXMb5sr5wpJUDPTUATX2Axq1Vfk+HWTMpsYPeVYp4TXx5uqUBw== dependencies: + "@jest/types" "^24.5.0" chalk "^2.0.1" - jest-get-type "^24.0.0" - jest-util "^24.0.0" - pretty-format "^24.0.0" - -jest-environment-jsdom@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.0.0.tgz#5affa0654d6e44cd798003daa1a8701dbd6e4d11" - integrity sha512-1YNp7xtxajTRaxbylDc2pWvFnfDTH5BJJGyVzyGAKNt/lEULohwEV9zFqTgG4bXRcq7xzdd+sGFws+LxThXXOw== - dependencies: - jest-mock "^24.0.0" - jest-util "^24.0.0" + jest-get-type "^24.3.0" + jest-util "^24.5.0" + pretty-format "^24.5.0" + +jest-environment-jsdom@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.5.0.tgz#1c3143063e1374100f8c2723a8b6aad23b6db7eb" + integrity sha512-62Ih5HbdAWcsqBx2ktUnor/mABBo1U111AvZWcLKeWN/n/gc5ZvDBKe4Og44fQdHKiXClrNGC6G0mBo6wrPeGQ== + dependencies: + "@jest/environment" "^24.5.0" + "@jest/fake-timers" "^24.5.0" + "@jest/types" "^24.5.0" + jest-mock "^24.5.0" + jest-util "^24.5.0" jsdom "^11.5.1" -jest-environment-node@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.0.0.tgz#330948980656ed8773ce2e04eb597ed91e3c7190" - integrity sha512-62fOFcaEdU0VLaq8JL90TqwI7hLn0cOKOl8vY2n477vRkCJRojiRRtJVRzzCcgFvs6gqU97DNqX5R0BrBP6Rxg== +jest-environment-node@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.5.0.tgz#763eebdf529f75b60aa600c6cf8cb09873caa6ab" + integrity sha512-du6FuyWr/GbKLsmAbzNF9mpr2Iu2zWSaq/BNHzX+vgOcts9f2ayXBweS7RAhr+6bLp6qRpMB6utAMF5Ygktxnw== dependencies: - jest-mock "^24.0.0" - jest-util "^24.0.0" + "@jest/environment" "^24.5.0" + "@jest/fake-timers" "^24.5.0" + "@jest/types" "^24.5.0" + jest-mock "^24.5.0" + jest-util "^24.5.0" -jest-get-type@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.0.0.tgz#36e72930b78e33da59a4f63d44d332188278940b" - integrity sha512-z6/Eyf6s9ZDGz7eOvl+fzpuJmN9i0KyTt1no37/dHu8galssxz5ZEgnc1KaV8R31q1khxyhB4ui/X5ZjjPk77w== +jest-get-type@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.3.0.tgz#582cfd1a4f91b5cdad1d43d2932f816d543c65da" + integrity sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow== -jest-haste-map@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.0.0.tgz#e9ef51b2c9257384b4d6beb83bd48c65b37b5e6e" - integrity sha512-CcViJyUo41IQqttLxXVdI41YErkzBKbE6cS6dRAploCeutePYfUimWd3C9rQEWhX0YBOQzvNsC0O9nYxK2nnxQ== +jest-haste-map@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.5.0.tgz#3f17d0c548b99c0c96ed2893f9c0ccecb2eb9066" + integrity sha512-mb4Yrcjw9vBgSvobDwH8QUovxApdimGcOkp+V1ucGGw4Uvr3VzZQBJhNm1UY3dXYm4XXyTW2G7IBEZ9pM2ggRQ== dependencies: + "@jest/types" "^24.5.0" fb-watchman "^2.0.0" graceful-fs "^4.1.15" invariant "^2.2.4" - jest-serializer "^24.0.0" - jest-util "^24.0.0" - jest-worker "^24.0.0" + jest-serializer "^24.4.0" + jest-util "^24.5.0" + jest-worker "^24.4.0" micromatch "^3.1.10" - sane "^3.0.0" + sane "^4.0.3" -jest-jasmine2@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.1.0.tgz#8377324b967037c440f0a549ee0bbd9912055db6" - integrity sha512-H+o76SdSNyCh9fM5K8upK45YTo/DiFx5w2YAzblQebSQmukDcoVBVeXynyr7DDnxh+0NTHYRCLwJVf3tC518wg== +jest-jasmine2@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.5.0.tgz#e6af4d7f73dc527d007cca5a5b177c0bcc29d111" + integrity sha512-sfVrxVcx1rNUbBeyIyhkqZ4q+seNKyAG6iM0S2TYBdQsXjoFDdqWFfsUxb6uXSsbimbXX/NMkJIwUZ1uT9+/Aw== dependencies: "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.5.0" + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" chalk "^2.0.1" co "^4.6.0" - expect "^24.1.0" + expect "^24.5.0" is-generator-fn "^2.0.0" - jest-each "^24.0.0" - jest-matcher-utils "^24.0.0" - jest-message-util "^24.0.0" - jest-snapshot "^24.1.0" - jest-util "^24.0.0" - pretty-format "^24.0.0" + jest-each "^24.5.0" + jest-matcher-utils "^24.5.0" + jest-message-util "^24.5.0" + jest-runtime "^24.5.0" + jest-snapshot "^24.5.0" + jest-util "^24.5.0" + pretty-format "^24.5.0" throat "^4.0.0" -jest-leak-detector@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.0.0.tgz#78280119fd05ee98317daee62cddb3aa537a31c6" - integrity sha512-ZYHJYFeibxfsDSKowjDP332pStuiFT2xfc5R67Rjm/l+HFJWJgNIOCOlQGeXLCtyUn3A23+VVDdiCcnB6dTTrg== +jest-junit@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-6.3.0.tgz#99e64ebc54eddcb21238f0cc49f5820c89a8c785" + integrity sha512-3PH9UkpaomX6CUzqjlnk0m4yBCW/eroxV6v61OM6LkCQFO848P3YUhfIzu8ypZSBKB3vvCbB4WaLTKT0BrIf8A== dependencies: - pretty-format "^24.0.0" + jest-validate "^24.0.0" + mkdirp "^0.5.1" + strip-ansi "^4.0.0" + xml "^1.0.1" -jest-matcher-utils@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.0.0.tgz#fc9c41cfc49b2c3ec14e576f53d519c37729d579" - integrity sha512-LQTDmO+aWRz1Tf9HJg+HlPHhDh1E1c65kVwRFo5mwCVp5aQDzlkz4+vCvXhOKFjitV2f0kMdHxnODrXVoi+rlA== +jest-leak-detector@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.5.0.tgz#21ae2b3b0da252c1171cd494f75696d65fb6fa89" + integrity sha512-LZKBjGovFRx3cRBkqmIg+BZnxbrLqhQl09IziMk3oeh1OV81Hg30RUIx885mq8qBv1PA0comB9bjKcuyNO1bCQ== + dependencies: + pretty-format "^24.5.0" + +jest-matcher-utils@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.5.0.tgz#5995549dcf09fa94406e89526e877b094dad8770" + integrity sha512-QM1nmLROjLj8GMGzg5VBra3I9hLpjMPtF1YqzQS3rvWn2ltGZLrGAO1KQ9zUCVi5aCvrkbS5Ndm2evIP9yZg1Q== dependencies: chalk "^2.0.1" - jest-diff "^24.0.0" - jest-get-type "^24.0.0" - pretty-format "^24.0.0" + jest-diff "^24.5.0" + jest-get-type "^24.3.0" + pretty-format "^24.5.0" -jest-message-util@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.0.0.tgz#a07a141433b2c992dbaec68d4cbfe470ba289619" - integrity sha512-J9ROJIwz/IeC+eV1XSwnRK4oAwPuhmxEyYx1+K5UI+pIYwFZDSrfZaiWTdq0d2xYFw4Xiu+0KQWsdsQpgJMf3Q== +jest-message-util@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.5.0.tgz#181420a65a7ef2e8b5c2f8e14882c453c6d41d07" + integrity sha512-6ZYgdOojowCGiV0D8WdgctZEAe+EcFU+KrVds+0ZjvpZurUW2/oKJGltJ6FWY2joZwYXN5VL36GPV6pNVRqRnQ== dependencies: "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/stack-utils" "^1.0.1" chalk "^2.0.1" micromatch "^3.1.10" slash "^2.0.0" stack-utils "^1.0.1" -jest-mock@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.0.0.tgz#9a4b53e01d66a0e780f7d857462d063e024c617d" - integrity sha512-sQp0Hu5fcf5NZEh1U9eIW2qD0BwJZjb63Yqd98PQJFvf/zzUTBoUAwv/Dc/HFeNHIw1f3hl/48vNn+j3STaI7A== +jest-mock@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.5.0.tgz#976912c99a93f2a1c67497a9414aa4d9da4c7b76" + integrity sha512-ZnAtkWrKf48eERgAOiUxVoFavVBziO2pAi2MfZ1+bGXVkDfxWLxU0//oJBkgwbsv6OAmuLBz4XFFqvCFMqnGUw== + dependencies: + "@jest/types" "^24.5.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== jest-progress-tracker@^2.0.1: version "2.0.1" @@ -2271,131 +2532,148 @@ jest-progress-tracker@^2.0.1: dependencies: test-progress-tracker "^2.0.2" -jest-regex-util@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.0.0.tgz#4feee8ec4a358f5bee0a654e94eb26163cb9089a" - integrity sha512-Jv/uOTCuC+PY7WpJl2mpoI+WbY2ut73qwwO9ByJJNwOCwr1qWhEW2Lyi2S9ZewUdJqeVpEBisdEVZSI+Zxo58Q== +jest-regex-util@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" + integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== -jest-resolve-dependencies@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.1.0.tgz#78f738a2ec59ff4d00751d9da56f176e3f589f6c" - integrity sha512-2VwPsjd3kRPu7qe2cpytAgowCObk5AKeizfXuuiwgm1a9sijJDZe8Kh1sFj6FKvSaNEfCPlBVkZEJa2482m/Uw== +jest-resolve-dependencies@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.5.0.tgz#1a0dae9cdd41349ca4a84148b3e78da2ba33fd4b" + integrity sha512-dRVM1D+gWrFfrq2vlL5P9P/i8kB4BOYqYf3S7xczZ+A6PC3SgXYSErX/ScW/469pWMboM1uAhgLF+39nXlirCQ== dependencies: - jest-regex-util "^24.0.0" - jest-snapshot "^24.1.0" + "@jest/types" "^24.5.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.5.0" -jest-resolve@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.1.0.tgz#42ff0169b0ea47bfdbd0c52a0067ca7d022c7688" - integrity sha512-TPiAIVp3TG6zAxH28u/6eogbwrvZjBMWroSLBDkwkHKrqxB/RIdwkWDye4uqPlZIXWIaHtifY3L0/eO5Z0f2wg== +jest-resolve@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.5.0.tgz#8c16ba08f60a1616c3b1cd7afb24574f50a24d04" + integrity sha512-ZIfGqLX1Rg8xJpQqNjdoO8MuxHV1q/i2OO1hLXjgCWFWs5bsedS8UrOdgjUqqNae6DXA+pCyRmdcB7lQEEbXew== dependencies: + "@jest/types" "^24.5.0" browser-resolve "^1.11.3" chalk "^2.0.1" - realpath-native "^1.0.0" - -jest-runner@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.1.0.tgz#3686a2bb89ce62800da23d7fdc3da2c32792943b" - integrity sha512-CDGOkT3AIFl16BLL/OdbtYgYvbAprwJ+ExKuLZmGSCSldwsuU2dEGauqkpvd9nphVdAnJUcP12e/EIlnTX0QXg== - dependencies: + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.5.0.tgz#9be26ece4fd4ab3dfb528b887523144b7c5ffca8" + integrity sha512-oqsiS9TkIZV5dVkD+GmbNfWBRPIvxqmlTQ+AQUJUQ07n+4xTSDc40r+aKBynHw9/tLzafC00DIbJjB2cOZdvMA== + dependencies: + "@jest/console" "^24.3.0" + "@jest/environment" "^24.5.0" + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" chalk "^2.4.2" exit "^0.1.2" graceful-fs "^4.1.15" - jest-config "^24.1.0" - jest-docblock "^24.0.0" - jest-haste-map "^24.0.0" - jest-jasmine2 "^24.1.0" - jest-leak-detector "^24.0.0" - jest-message-util "^24.0.0" - jest-runtime "^24.1.0" - jest-util "^24.0.0" - jest-worker "^24.0.0" + jest-config "^24.5.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.5.0" + jest-jasmine2 "^24.5.0" + jest-leak-detector "^24.5.0" + jest-message-util "^24.5.0" + jest-resolve "^24.5.0" + jest-runtime "^24.5.0" + jest-util "^24.5.0" + jest-worker "^24.4.0" source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.1.0.tgz#7c157a2e776609e8cf552f956a5a19ec9c985214" - integrity sha512-59/BY6OCuTXxGeDhEMU7+N33dpMQyXq7MLK07cNSIY/QYt2QZgJ7Tjx+rykBI0skAoigFl0A5tmT8UdwX92YuQ== - dependencies: - "@babel/core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" +jest-runtime@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.5.0.tgz#3a76e0bfef4db3896d5116e9e518be47ba771aa2" + integrity sha512-GTFHzfLdwpaeoDPilNpBrorlPoNZuZrwKKzKJs09vWwHo+9TOsIIuszK8cWOuKC7ss07aN1922Ge8fsGdsqCuw== + dependencies: + "@jest/console" "^24.3.0" + "@jest/environment" "^24.5.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/yargs" "^12.0.2" chalk "^2.0.1" - convert-source-map "^1.4.0" exit "^0.1.2" - fast-json-stable-stringify "^2.0.0" glob "^7.1.3" graceful-fs "^4.1.15" - jest-config "^24.1.0" - jest-haste-map "^24.0.0" - jest-message-util "^24.0.0" - jest-regex-util "^24.0.0" - jest-resolve "^24.1.0" - jest-snapshot "^24.1.0" - jest-util "^24.0.0" - jest-validate "^24.0.0" - micromatch "^3.1.10" - realpath-native "^1.0.0" + jest-config "^24.5.0" + jest-haste-map "^24.5.0" + jest-message-util "^24.5.0" + jest-mock "^24.5.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.5.0" + jest-snapshot "^24.5.0" + jest-util "^24.5.0" + jest-validate "^24.5.0" + realpath-native "^1.1.0" slash "^2.0.0" strip-bom "^3.0.0" - write-file-atomic "2.4.1" yargs "^12.0.2" -jest-serializer@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0.tgz#522c44a332cdd194d8c0531eb06a1ee5afb4256b" - integrity sha512-9FKxQyrFgHtx3ozU+1a8v938ILBE7S8Ko3uiAVjT8Yfi2o91j/fj81jacCQZ/Ihjiff/VsUCXVgQ+iF1XdImOw== +jest-serializer@^24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" + integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== -jest-snapshot@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.1.0.tgz#85e22f810357aa5994ab61f236617dc2205f2f5b" - integrity sha512-th6TDfFqEmXvuViacU1ikD7xFb7lQsPn2rJl7OEmnfIVpnrx3QNY2t3PE88meeg0u/mQ0nkyvmC05PBqO4USFA== +jest-snapshot@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.5.0.tgz#e5d224468a759fd19e36f01217aac912f500f779" + integrity sha512-eBEeJb5ROk0NcpodmSKnCVgMOo+Qsu5z9EDl3tGffwPzK1yV37mjGWF2YeIz1NkntgTzP+fUL4s09a0+0dpVWA== dependencies: "@babel/types" "^7.0.0" + "@jest/types" "^24.5.0" chalk "^2.0.1" - jest-diff "^24.0.0" - jest-matcher-utils "^24.0.0" - jest-message-util "^24.0.0" - jest-resolve "^24.1.0" + expect "^24.5.0" + jest-diff "^24.5.0" + jest-matcher-utils "^24.5.0" + jest-message-util "^24.5.0" + jest-resolve "^24.5.0" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^24.0.0" + pretty-format "^24.5.0" semver "^5.5.0" -jest-util@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.0.0.tgz#fd38fcafd6dedbd0af2944d7a227c0d91b68f7d6" - integrity sha512-QxsALc4wguYS7cfjdQSOr5HTkmjzkHgmZvIDkcmPfl1ib8PNV8QUWLwbKefCudWS0PRKioV+VbQ0oCUPC691fQ== - dependencies: +jest-util@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.5.0.tgz#9d9cb06d9dcccc8e7cc76df91b1635025d7baa84" + integrity sha512-Xy8JsD0jvBz85K7VsTIQDuY44s+hYJyppAhcsHsOsGisVtdhar6fajf2UOf2mEVEgh15ZSdA0zkCuheN8cbr1Q== + dependencies: + "@jest/console" "^24.3.0" + "@jest/fake-timers" "^24.5.0" + "@jest/source-map" "^24.3.0" + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/node" "*" callsites "^3.0.0" chalk "^2.0.1" graceful-fs "^4.1.15" is-ci "^2.0.0" - jest-message-util "^24.0.0" mkdirp "^0.5.1" slash "^2.0.0" source-map "^0.6.0" -jest-validate@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.0.0.tgz#aa8571a46983a6538328fef20406b4a496b6c020" - integrity sha512-vMrKrTOP4BBFIeOWsjpsDgVXATxCspC9S1gqvbJ3Tnn/b9ACsJmteYeVx9830UMV28Cob1RX55x96Qq3Tfad4g== +jest-validate@^24.0.0, jest-validate@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.5.0.tgz#62fd93d81214c070bb2d7a55f329a79d8057c7de" + integrity sha512-gg0dYszxjgK2o11unSIJhkOFZqNRQbWOAB2/LOUdsd2LfD9oXiMeuee8XsT0iRy5EvSccBgB4h/9HRbIo3MHgQ== dependencies: + "@jest/types" "^24.5.0" camelcase "^5.0.0" chalk "^2.0.1" - jest-get-type "^24.0.0" + jest-get-type "^24.3.0" leven "^2.1.0" - pretty-format "^24.0.0" + pretty-format "^24.5.0" -jest-watch-repeat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/jest-watch-repeat/-/jest-watch-repeat-1.0.0.tgz#e6c5ba103d7aedfe3253167bbbe621a495014e7f" - integrity sha512-THLC6dmbgrROOJqmnPq7grNvdS6inG0LHc7lmnGLRiOljO0tU89wAsIbhozcNitmZYaAon+L2BVOeUnvRbb5Aw== +jest-watch-repeat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/jest-watch-repeat/-/jest-watch-repeat-1.0.1.tgz#59fe93dd0f3d280faf1dfd3bf66d8a501e7da254" + integrity sha512-pYbYmYcrrfzcVXiQ0Q3QvPQ2bWTjZnwz1AqpredvZIkM+7IzmeuBa3dAbikT3s6anVkTqt0Kjg34jgoX73O04A== dependencies: ansi-escapes "^3.1.0" chalk "^2.4.1" jest-watcher "^23.4.0" - unpartial "^0.4.1" + unpartial "^0.5.0" jest-watch-suspend@^1.1.1: version "1.1.1" @@ -2421,31 +2699,36 @@ jest-watcher@^23.4.0: chalk "^2.0.1" string-length "^2.0.0" -jest-watcher@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.0.0.tgz#20d44244d10b0b7312410aefd256c1c1eef68890" - integrity sha512-GxkW2QrZ4YxmW1GUWER05McjVDunBlKMFfExu+VsGmXJmpej1saTEKvONdx5RJBlVdpPI5x6E3+EDQSIGgl53g== +jest-watcher@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.5.0.tgz#da7bd9cb5967e274889b42078c8f501ae1c47761" + integrity sha512-/hCpgR6bg0nKvD3nv4KasdTxuhwfViVMHUATJlnGCD0r1QrmIssimPbmc5KfAQblAVxkD8xrzuij9vfPUk1/rA== dependencies: + "@jest/test-result" "^24.5.0" + "@jest/types" "^24.5.0" + "@types/node" "*" + "@types/yargs" "^12.0.9" ansi-escapes "^3.0.0" chalk "^2.0.1" - jest-util "^24.0.0" + jest-util "^24.5.0" string-length "^2.0.0" -jest-worker@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0.tgz#3d3483b077bf04f412f47654a27bba7e947f8b6d" - integrity sha512-s64/OThpfQvoCeHG963MiEZOAAxu8kHsaL/rCMF7lpdzo7vgF0CtPml9hfguOMgykgH/eOm4jFP4ibfHLruytg== +jest-worker@^24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.4.0.tgz#fbc452b0120bb5c2a70cdc88fa132b48eeb11dd0" + integrity sha512-BH9X/klG9vxwoO99ZBUbZFfV8qO0XNZ5SIiCyYK2zOuJBl6YJVAeNIQjcoOVNu4HGEHeYEKsUWws8kSlSbZ9YQ== dependencies: + "@types/node" "*" merge-stream "^1.0.1" supports-color "^6.1.0" jest@^24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.1.0.tgz#b1e1135caefcf2397950ecf7f90e395fde866fd2" - integrity sha512-+q91L65kypqklvlRFfXfdzUKyngQLOcwGhXQaLmVHv+d09LkNXuBuGxlofTFW42XMzu3giIcChchTsCNUjQ78A== + version "24.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.5.0.tgz#38f11ae2c2baa2f86c2bc4d8a91d2b51612cd19a" + integrity sha512-lxL+Fq5/RH7inxxmfS2aZLCf8MsS+YCUBfeiNO6BWz/MmjhDGaIEA/2bzEf9q4Q0X+mtFHiinHFvQ0u+RvW/qQ== dependencies: import-local "^2.0.0" - jest-cli "^24.1.0" + jest-cli "^24.5.0" "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -2458,9 +2741,9 @@ js-tokens@^3.0.2: integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@^3.12.0, js-yaml@^3.7.0: - version "3.12.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" - integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA== + version "3.12.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" + integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -2621,7 +2904,7 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash.merge@^4.6.0: +lodash.merge@^4.6.0, lodash.merge@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== @@ -2631,7 +2914,7 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@^4.17.10, lodash@^4.17.11: +lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -2682,12 +2965,12 @@ map-visit@^1.0.0: object-visit "^1.0.0" mem@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.1.0.tgz#aeb9be2d21f47e78af29e4ac5978e8afa2ca5b8a" - integrity sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg== + version "4.2.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.2.0.tgz#5ee057680ed9cb8dad8a78d820f9a8897a102025" + integrity sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA== dependencies: map-age-cleaner "^0.1.1" - mimic-fn "^1.0.0" + mimic-fn "^2.0.0" p-is-promise "^2.0.0" merge-stream@^1.0.1: @@ -2702,11 +2985,6 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -2743,6 +3021,11 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde" + integrity sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA== + minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -2851,6 +3134,11 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-fetch@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -2924,9 +3212,9 @@ npm-bundled@^1.0.1: integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== npm-packlist@^1.1.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.3.0.tgz#7f01e8e44408341379ca98cfd756e7b29bd2626c" - integrity sha512-qPBc6CnxEzpOcc4bjoIBJbYdy0D/LFFPUdxvfwor4/w3vxeE0h6TiOVurCEPpQ6trjN77u/ShyfeJGsbAfB3dA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -2954,9 +3242,9 @@ number-is-nan@^1.0.0: integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nwsapi@^2.0.7: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.0.tgz#781065940aed90d9bb01ca5d0ce0fcf81c32712f" - integrity sha512-ZG3bLAvdHmhIjaQ/Db1qvBxsGvFMLIRpQszyqbg31VJ53UP++uZX1/gf3Ut96pdwN9AuDwlMqIYLm0UPCdUeHg== + version "2.1.1" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.1.tgz#08d6d75e69fd791bdea31507ffafe8c843b67e9c" + integrity sha512-T5GaA1J/d34AC8mkrFD2O0DR17kwJ702ZOtJOsS8RpbsQZVOC2/xYFb1i/cw+xdM54JIlMuojjDOYct8GIWtwg== oauth-sign@~0.9.0: version "0.9.0" @@ -3088,9 +3376,9 @@ p-is-promise@^2.0.0: integrity sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg== p-limit@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" - integrity sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g== + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== dependencies: p-try "^2.0.0" @@ -3188,10 +3476,10 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pirates@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.0.tgz#850b18781b4ac6ec58a43c9ed9ec5fe6796addbd" - integrity sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA== +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== dependencies: node-modules-regexp "^1.0.0" @@ -3323,13 +3611,15 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -pretty-format@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.0.0.tgz#cb6599fd73ac088e37ed682f61291e4678f48591" - integrity sha512-LszZaKG665djUcqg5ZQq+XzezHLKrxsA86ZABTozp+oNhkdqa+tG2dX4qa6ERl5c/sRDrAa3lHmwnvKoP+OG/g== +pretty-format@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.5.0.tgz#cc69a0281a62cd7242633fc135d6930cd889822d" + integrity sha512-/3RuSghukCf8Riu5Ncve0iI+BzVkbRU5EeUoArKARZobREycuH5O4waxvaNIloEXdb0qwgmEAed5vTpX1HNROQ== dependencies: + "@jest/types" "^24.5.0" ansi-regex "^4.0.0" ansi-styles "^3.2.0" + react-is "^16.8.4" process-nextick-args@~2.0.0: version "2.0.0" @@ -3342,9 +3632,9 @@ progress@^2.0.0: integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== prompts@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.2.tgz#094119b0b0a553ec652908b583205b9867630154" - integrity sha512-Pc/c53d2WZHJWZr78/BhZ5eHsdQtltbyBjHoA4T0cs/4yKJqCcoOHrq2SNKwtspVE0C+ebqAR5u0/mXwrHaADQ== + version "2.0.3" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.3.tgz#c5ccb324010b2e8f74752aadceeb57134c1d2522" + integrity sha512-H8oWEoRZpybm6NV4to9/1limhttEo13xK62pNvn2JzY0MA03p7s0OjtmhXyon3uJmxiJJVSuUwEJFFssI3eBiQ== dependencies: kleur "^3.0.2" sisteransi "^1.0.0" @@ -3387,6 +3677,11 @@ rc@^1.2.7, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-is@^16.8.4: + version "16.8.4" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.4.tgz#90f336a68c3a29a096a3d648ab80e87ec61482a2" + integrity sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA== + read-package-json@^2.0.10: version "2.0.13" resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" @@ -3438,7 +3733,7 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -realpath-native@^1.0.0, realpath-native@^1.0.2: +realpath-native@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== @@ -3615,22 +3910,20 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" - integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== +sane@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.0.3.tgz#e878c3f19e25cc57fbb734602f48f8a97818b181" + integrity sha512-hSLkC+cPHiBQs7LSyXkotC3UUtyn8C4FMn50TNaacRyvBlI+3ebcxMpqckmTdtXVtel87YS7GXN3UIOj7NiGVQ== dependencies: + "@cnakazawa/watch" "^1.0.3" anymatch "^2.0.0" capture-exit "^1.2.0" - exec-sh "^0.2.0" + exec-sh "^0.3.2" execa "^1.0.0" fb-watchman "^2.0.0" micromatch "^3.1.4" minimist "^1.1.1" walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" satisfier@^4.5.1: version "4.5.1" @@ -3762,9 +4055,9 @@ source-map-resolve@^0.5.0: urix "^0.1.0" source-map-support@^0.5.6: - version "0.5.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" - integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== + version "0.5.11" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2" + integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -3881,13 +4174,13 @@ string-width@^1.0.1: strip-ansi "^4.0.0" string-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.0.0.tgz#5a1690a57cc78211fffd9bf24bbe24d090604eb1" - integrity sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew== + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: emoji-regex "^7.0.1" is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.0.0" + strip-ansi "^5.1.0" string_decoder@~1.1.1: version "1.1.1" @@ -3919,12 +4212,12 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" - integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== +strip-ansi@^5.0.0, strip-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.1.0.tgz#55aaa54e33b4c0649a7338a43437b1887d153ec4" + integrity sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg== dependencies: - ansi-regex "^4.0.0" + ansi-regex "^4.1.0" strip-bom@^3.0.0: version "3.0.0" @@ -3988,6 +4281,15 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" +teeny-request@^3.7.0: + version "3.11.3" + resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-3.11.3.tgz#335c629f7645e5d6599362df2f3230c4cbc23a55" + integrity sha512-CKncqSF7sH6p4rzCgkb/z/Pcos5efl0DmolzvlqRQUNcpRIruOhY9+T1FsIlyEbfWd7MsFpodROOwHYh2BaXzw== + dependencies: + https-proxy-agent "^2.2.1" + node-fetch "^2.2.0" + uuid "^3.3.2" + tersify@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/tersify/-/tersify-1.2.6.tgz#05788b03504b78198a329119cbb14d02fd248f80" @@ -3995,6 +4297,15 @@ tersify@^1.2.6: dependencies: unpartial "^0.4.1" +tersify@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tersify/-/tersify-2.0.2.tgz#2f644deffc3ca040443881325f2fb84306f16b8a" + integrity sha512-XKEDtyDG4JhHsWuV1PUed6XZ1R/0jrN95fPv+fvh3cB9kQJCS3ApcrGgbZ55lC5Vxh4+tVWmydyJ4X8af46/kQ== + dependencies: + acorn "^6.1.1" + acorn-bigint "^0.3.1" + unpartial "^0.5.0" + test-exclude@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.1.0.tgz#6ba6b25179d2d38724824661323b73e03c0c1de1" @@ -4106,10 +4417,10 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -ts-jest@^23.10.5: - version "23.10.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.10.5.tgz#cdb550df4466a30489bf70ba867615799f388dd5" - integrity sha512-MRCs9qnGoyKgFc8adDEntAOP64fWK1vZKnOYU1o2HxaqjdJvGqmkLCPCnVq1/If4zkUmEjKPnCiUisTrlX2p2A== +ts-jest@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.0.0.tgz#3f26bf2ec1fa584863a5a9c29bd8717d549efbf6" + integrity sha512-o8BO3TkMREpAATaFTrXkovMsCpBl2z4NDBoLJuWZcJJj1ijI49UnvDMfVpj+iogn/Jl8Pbhuei5nc/Ti+frEHw== dependencies: bs-logger "0.x" buffer-from "1.x" @@ -4156,10 +4467,10 @@ tslint-eslint-rules@^5.3.1, tslint-eslint-rules@^5.4.0: tslib "1.9.0" tsutils "^3.0.0" -tslint@^5.12.1: - version "5.12.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.12.1.tgz#8cec9d454cf8a1de9b0a26d7bdbad6de362e52c1" - integrity sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw== +tslint@^5.13.0: + version "5.14.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.14.0.tgz#be62637135ac244fc9b37ed6ea5252c9eba1616e" + integrity sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ== dependencies: babel-code-frame "^6.22.0" builtin-modules "^1.1.1" @@ -4169,12 +4480,13 @@ tslint@^5.12.1: glob "^7.1.1" js-yaml "^3.7.0" minimatch "^3.0.4" + mkdirp "^0.5.1" resolve "^1.3.2" semver "^5.3.0" tslib "^1.8.0" - tsutils "^2.27.2" + tsutils "^2.29.0" -tsutils@^2.27.2: +tsutils@^2.29.0: version "2.29.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== @@ -4182,9 +4494,9 @@ tsutils@^2.27.2: tslib "^1.8.1" tsutils@^3.0.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.8.0.tgz#7a3dbadc88e465596440622b65c04edc8e187ae5" - integrity sha512-XQdPhgcoTbCD8baXC38PQ0vpTZ8T3YrE+vR66YIj/xvDt1//8iAhafpIT/4DmvzzC1QFapEImERu48Pa01dIUA== + version "3.9.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.9.1.tgz#2a40dc742943c71eca6d5c1994fcf999956be387" + integrity sha512-hrxVtLtPqQr//p8/msPT1X1UYXUjizqSit5d9AQ5k38TcV38NyecL5xODNxa73cLe/5sdiJ+w1FqzDhRBA/anA== dependencies: tslib "^1.8.1" @@ -4212,10 +4524,15 @@ type-name@^2.0.1: resolved "https://registry.yarnpkg.com/type-name/-/type-name-2.0.2.tgz#efe7d4123d8ac52afff7f40c7e4dec5266008fb4" integrity sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q= -typescript@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3.tgz#f1657fc7daa27e1a8930758ace9ae8da31403221" - integrity sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A== +type-plus@^1.15.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/type-plus/-/type-plus-1.15.1.tgz#d8f785931b2a15d7a5fcde960af3f003a357e77c" + integrity sha512-8hqd44R5HmvOPwJvRjkA8ySTdbzKvrXWxkmMswtIGykXjKlz1pVG+VshVlVpm4tPUdteb0hgGbt8cq+Rbn/juw== + +typescript@^3.3.3333: + version "3.3.3333" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3333.tgz#171b2c5af66c59e9431199117a3bcadc66fdcfd6" + integrity sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw== uglify-js@^3.1.4: version "3.4.9" @@ -4256,6 +4573,13 @@ unpartial@^0.4.1: dependencies: lodash.merge "^4.6.0" +unpartial@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/unpartial/-/unpartial-0.5.0.tgz#cac838d3046ee4ea06fe24d4f5d4b9244d2145e8" + integrity sha512-tJ/eRbNpm00VlQdMi344Q9tM30BACC203HFRT8yksdx+MIXTVS5m9JpAJUOhFWqOU2c/iZzOS3CcEmdc2zh/1Q== + dependencies: + lodash.merge "^4.6.1" + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -4265,9 +4589,9 @@ unset-value@^1.0.0: isobject "^3.0.0" upath@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== uri-js@^4.2.2: version "4.2.2" @@ -4281,6 +4605,11 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +urlgrey@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f" + integrity sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8= + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -4335,14 +4664,6 @@ walker@~1.0.5: dependencies: makeerror "1.0.x" -watch@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= - dependencies: - exec-sh "^0.2.0" - minimist "^1.2.0" - webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -4383,7 +4704,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.12, which@^1.2.9, which@^1.3.0: +which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -4448,6 +4769,11 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= + xtend@^4.0.0, xtend@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"