From f1cdc1c565610e08471b3fe92d88ce7f69591f8f Mon Sep 17 00:00:00 2001 From: DudaGod Date: Sun, 19 Apr 2020 23:13:42 +0300 Subject: [PATCH 01/10] feat: add typescript and configure npm scripts --- .gitignore | 1 + package-lock.json | 61 +++++++++++++++++++++++++++++++++++++++----- package.json | 13 +++++++--- tsconfig.common.json | 21 +++++++++++++++ tsconfig.json | 6 +++++ 5 files changed, 91 insertions(+), 11 deletions(-) create mode 100644 tsconfig.common.json create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index 3c3629e..dd87e2d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +build diff --git a/package-lock.json b/package-lock.json index 13945c8..f6204df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,9 +29,9 @@ "dev": true }, "@types/node": { - "version": "10.12.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.6.tgz", - "integrity": "sha512-+ZWB5Ec1iki99xQFzBlivlKxSZQ+fuUKBott8StBOnLN4dWbRHlgdg1XknpW6g0tweniN5DcOqA64CJyOUPSAw==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.0.tgz", + "integrity": "sha512-WE4IOAC6r/yBZss1oQGM5zs2D7RuKR6Q+w+X2SouPofnWn+LbCqClRyhO3ZE7Ix8nmFgo/oVuuE01cJT2XB13A==", "dev": true }, "JSONStream": { @@ -793,6 +793,31 @@ "pify": "^2.0.0", "pinkie-promise": "^2.0.0", "rimraf": "^2.2.8" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "detect-indent": { @@ -2608,12 +2633,28 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "run-async": { @@ -3080,6 +3121,12 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "dev": true + }, "uglify-js": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.4.tgz", diff --git a/package.json b/package.json index 6349763..6e775cf 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "looks-same", "version": "7.2.3", "description": "Pure node.js library for comparing PNG-images, taking into account human color perception.", - "main": "index.js", + "main": "build/index.js", "types": "index.d.ts", "directories": { "test": "test" @@ -18,7 +18,7 @@ "pngjs": "^3.3.3" }, "devDependencies": { - "@types/node": "^10.12.3", + "@types/node": "^13.13.0", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "eslint": "^5.3.0", @@ -27,15 +27,20 @@ "matcha": "^0.7.0", "mocha": "^5.2.0", "proxyquire": "^1.7.10", + "rimraf": "^3.0.2", "sinon": "^6.1.5", "sinon-chai": "^3.3.0", "standard-version": "^7.0.0", - "temp": "^0.8.3" + "temp": "^0.8.3", + "typescript": "^3.8.3" }, "scripts": { + "build": "tsc", + "clean": "rimraf build/ *.tsbuildinfo", + "prepare": "npm run clean && npm run build", + "test": "npm run build && npm run test-unit && npm run lint", "test-unit": "mocha", "lint": "eslint .", - "test": "npm run test-unit && npm run lint", "bench": "matcha benchmark/*", "release": "standard-version" }, diff --git a/tsconfig.common.json b/tsconfig.common.json new file mode 100644 index 0000000..b2fca4f --- /dev/null +++ b/tsconfig.common.json @@ -0,0 +1,21 @@ +{ + "include": ["src", "test", "benchmark"], + "compilerOptions": { + "target": "es2017", + "module": "commonjs", + "allowJs": true, + "declaration": false, + "declarationMap": false, + "sourceMap": true, + "strict": true, + "noImplicitAny": false, + "strictNullChecks": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "types": ["node"], + "esModuleInterop": true, + "noEmitOnError": true + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..71530fa --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.common", + "compilerOptions": { + "outDir": "build" + } +} From 5bdb6d4c58ac5fdad0cf7afd078b4fe6fbdb4f62 Mon Sep 17 00:00:00 2001 From: DudaGod Date: Sun, 19 Apr 2020 23:16:05 +0300 Subject: [PATCH 02/10] chore: remove unused benchmark --- benchmark/.eslintrc.js | 7 --- benchmark/diff.js | 50 --------------------- package-lock.json | 98 ------------------------------------------ package.json | 3 -- 4 files changed, 158 deletions(-) delete mode 100644 benchmark/.eslintrc.js delete mode 100644 benchmark/diff.js diff --git a/benchmark/.eslintrc.js b/benchmark/.eslintrc.js deleted file mode 100644 index 82e2b61..0000000 --- a/benchmark/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - globals: { - suite: false, - set: false, - bench: false - } -}; diff --git a/benchmark/diff.js b/benchmark/diff.js deleted file mode 100644 index 6c2706e..0000000 --- a/benchmark/diff.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; -var path = require('path'), - temp = require('temp'), - - gm = require('gm'), - looksSame = require('..'); - -function imagePath(image) { - return path.resolve(__dirname, '..', 'test', 'data', 'src', image); -} - -function benchmarkDiff(title, refImage, currImage) { - suite(title, function() { - var path1 = temp.path({suffix: '.png'}), - path2 = temp.path({suffix: '.png'}); - - set('iterations', 1000); - bench('looksSame', function(next) { - looksSame.createDiff({ - reference: refImage, - current: currImage, - diff: path1, - highlightColor: '#ff00ff' - }, next); - }); - - bench('gm', function(next) { - gm.compare( - refImage, - currImage, - { - file: path2, - highlightStyle: 'assign', - highlightColor: '"#ff00ff"' - }, - next - ); - }); - }); -} - -benchmarkDiff('small diff', - imagePath('ref.png'), - imagePath('different.png') -); - -benchmarkDiff('large diff', - imagePath('large-ref.png'), - imagePath('large-different.png') -); diff --git a/package-lock.json b/package-lock.json index f6204df..fc721c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -116,18 +116,6 @@ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true }, - "array-parallel": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/array-parallel/-/array-parallel-0.1.3.tgz", - "integrity": "sha1-j3hTCJJu1apHjEfmTRszS2wMlH0=", - "dev": true - }, - "array-series": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/array-series/-/array-series-0.1.5.tgz", - "integrity": "sha1-3103v8XC7wdV4qpPkv6ufUtaly8=", - "dev": true - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -911,24 +899,6 @@ } } }, - "drip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/drip/-/drip-1.1.0.tgz", - "integrity": "sha1-zO+x5obYb8EVtwyewSb4+HG9/X4=", - "dev": true, - "requires": { - "tea-concat": "0.1.0" - } - }, - "electron": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-0.4.1.tgz", - "integrity": "sha1-p4oFGniC9OVC1uIH2KGnMHazAUQ=", - "dev": true, - "requires": { - "drip": "1.1.x" - } - }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -1567,30 +1537,6 @@ "pinkie-promise": "^2.0.0" } }, - "gm": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/gm/-/gm-1.23.1.tgz", - "integrity": "sha1-Lt7rlYCE0PjqeYjl2ZWxx9/BR3c=", - "dev": true, - "requires": { - "array-parallel": "~0.1.3", - "array-series": "~0.1.5", - "cross-spawn": "^4.0.0", - "debug": "^3.1.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - } - } - }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -2016,32 +1962,12 @@ "signal-exit": "^3.0.0" } }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", "dev": true }, - "matcha": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/matcha/-/matcha-0.7.0.tgz", - "integrity": "sha1-E/gFQJs3vlcDLIRYZDvxUjumjdo=", - "dev": true, - "requires": { - "electron": "0.4.x", - "v8-argv": "0.1.x" - } - }, "meow": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", @@ -2484,12 +2410,6 @@ "resolve": "~1.1.7" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -3023,12 +2943,6 @@ "string-width": "^2.1.1" } }, - "tea-concat": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tea-concat/-/tea-concat-0.1.0.tgz", - "integrity": "sha1-6i6QdAD914pjNM4CD6PGlQLZnoQ=", - "dev": true - }, "temp": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", @@ -3166,12 +3080,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "v8-argv": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/v8-argv/-/v8-argv-0.1.0.tgz", - "integrity": "sha1-rfd3pS29w9qciclGXlntXzy22ak=", - "dev": true - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -3293,12 +3201,6 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, "yargs": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", diff --git a/package.json b/package.json index 6e775cf..f64710b 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,6 @@ "chai-as-promised": "^7.1.1", "eslint": "^5.3.0", "eslint-config-gemini-testing": "^2.8.0", - "gm": "^1.23.1", - "matcha": "^0.7.0", "mocha": "^5.2.0", "proxyquire": "^1.7.10", "rimraf": "^3.0.2", @@ -41,7 +39,6 @@ "test": "npm run build && npm run test-unit && npm run lint", "test-unit": "mocha", "lint": "eslint .", - "bench": "matcha benchmark/*", "release": "standard-version" }, "engines": { From 40c836f859e72911c6ee68eeb007ec62b08ae962 Mon Sep 17 00:00:00 2001 From: DudaGod Date: Sun, 19 Apr 2020 23:27:36 +0300 Subject: [PATCH 03/10] chore: move source code to src folder --- .npmignore | 3 - index.d.ts | 227 ----------------- package.json | 7 +- src/index.d.ts | 237 ++++++++++++++++++ index.js => src/index.js | 0 {lib => src/lib}/antialiasing-comparator.js | 0 {lib => src/lib}/constants.js | 0 {lib => src/lib}/diff-area.js | 0 .../lib}/diff-clusters/clusters-joiner.js | 0 {lib => src/lib}/diff-clusters/index.js | 0 .../lib}/ignore-caret-comparator/index.js | 0 .../states/caret-detected.js | 0 .../ignore-caret-comparator/states/init.js | 0 .../ignore-caret-comparator/states/state.js | 0 {lib => src/lib}/png/bounded-png.js | 0 {lib => src/lib}/png/index.js | 0 {lib => src/lib}/png/original-png.js | 0 {lib => src/lib}/png/png.js | 0 {lib => src/lib}/same-colors.js | 0 {lib => src/lib}/utils.js | 0 {lib => src/lib}/validators.js | 0 tsconfig.common.json | 2 +- 22 files changed, 243 insertions(+), 233 deletions(-) delete mode 100644 .npmignore delete mode 100644 index.d.ts create mode 100644 src/index.d.ts rename index.js => src/index.js (100%) rename {lib => src/lib}/antialiasing-comparator.js (100%) rename {lib => src/lib}/constants.js (100%) rename {lib => src/lib}/diff-area.js (100%) rename {lib => src/lib}/diff-clusters/clusters-joiner.js (100%) rename {lib => src/lib}/diff-clusters/index.js (100%) rename {lib => src/lib}/ignore-caret-comparator/index.js (100%) rename {lib => src/lib}/ignore-caret-comparator/states/caret-detected.js (100%) rename {lib => src/lib}/ignore-caret-comparator/states/init.js (100%) rename {lib => src/lib}/ignore-caret-comparator/states/state.js (100%) rename {lib => src/lib}/png/bounded-png.js (100%) rename {lib => src/lib}/png/index.js (100%) rename {lib => src/lib}/png/original-png.js (100%) rename {lib => src/lib}/png/png.js (100%) rename {lib => src/lib}/same-colors.js (100%) rename {lib => src/lib}/utils.js (100%) rename {lib => src/lib}/validators.js (100%) diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 9b4266e..0000000 --- a/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -**/.* -test/ -coverage/ diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 25710cd..0000000 --- a/index.d.ts +++ /dev/null @@ -1,227 +0,0 @@ -// Type definitions for looks-same 5.0 -// Project: https://github.com/gemini-testing/looks-same/releases -// Definitions by: xcatliu - -/// - -/** - * coordinate bounds - */ -interface CoordBounds { - /** - * X-coordinate of upper left corner - */ - left: number; - /** - * Y-coordinate of upper left corner - */ - top: number; - /** - * X-coordinate of bottom right corner - */ - right: number; - /** - * Y-coordinate of bottom right corner - */ - bottom: number; -} - -/** - * bounded image - */ -interface BoundedImage { - /** - * image path or buffer - */ - source: string | Buffer; - /** - * bounding coordinates - */ - boundingBox: CoordBounds; -} - -/** - * The result obtained from the function. -*/ -interface LooksSameResult { - /** - * true if images are equal, false - otherwise - */ - equal?: boolean; - /** - * diff bounds for not equal images - */ - diffBounds?: CoordBounds; - /** - * diff clusters for not equal images - */ - diffClusters?: CoordBounds[]; -} - -type LooksSameCallback = (error: Error | null, result: LooksSameResult) => void; - -/** - * The options passed to looksSame function - */ -interface LooksSameOptions { - /** - * By default, it will detect only noticeable differences. If you wish to detect any difference, use strict options. - */ - strict?: boolean; - /** - * You can also adjust the ΔE value that will be treated as error in non-strict mode. - */ - tolerance?: number; - /** - * Some devices can have different proportion between physical and logical screen resolutions also known as pixel ratio. - * Default value for this proportion is 1. - * This param also affects the comparison result, so it can be set manually with pixelRatio option. - */ - pixelRatio?: number; - /** - * Text caret in text input elements it is a pain for visual regression tasks, because it is always blinks. - * These diffs will be ignored by default. You can use `ignoreCaret` option with `false` value to disable ignoring such diffs. - * In that way text caret will be marked as diffs. - */ - ignoreCaret?: boolean; - /** - * Some images has difference while comparing because of antialiasing. - * These diffs will be ignored by default. You can use ignoreAntialiasing option with false value to disable ignoring such diffs. - * In that way antialiased pixels will be marked as diffs. - */ - ignoreAntialiasing?: boolean; - /** - * Sometimes the antialiasing algorithm can work incorrectly due to some features of the browser rendering engine. - * Use the option antialiasingTolerance to make the algorithm less strict. - * With this option you can specify the minimum difference in brightness (zero by default) - * between the darkest/lightest pixel (which is adjacent to the antialiasing pixel) and theirs adjacent pixels. - * - * We recommend that you don't increase this value above 10. If you need to increase more than 10 then this is definitely not antialiasing. - */ - antialiasingTolerance?: number; - /** - * Responsible for diff area which will be returned when comparing images. - * Diff bounds will contain the whole diff if stopOnFirstFail is false and only first diff pixel - otherwise. - */ - stopOnFirstFail?: boolean; - /** - * Responsible for diff bounds clustering - */ - shouldCluster?: boolean; - /** - * Radius for every diff cluster - */ - clustersSize?: number; -} - -/** - * The options passed to looksSame.createDiff function without diff - */ -interface CreateDiffAsBufferOptions { - /** - * The baseline image - */ - reference: string | Buffer | BoundedImage; - /** - * The current image - */ - current: string | Buffer | BoundedImage; - /** - * Color to highlight the differences - * e.g. '#ff00ff' - */ - highlightColor: string; - /** - * strict comparsion - */ - strict?: boolean; - /** - * ΔE value that will be treated as error in non-strict mode - */ - tolerance?: number; - /** - * makes the search algorithm of the antialiasing less strict - */ - antialiasingTolerance?: number; - /** - * Ability to ignore antialiasing - */ - ignoreAntialiasing?: boolean; - /** - * Ability to ignore text caret - */ - ignoreCaret?: boolean; -} - -/** - * The options passed to looksSame.createDiff function - */ -interface CreateDiffOptions extends CreateDiffAsBufferOptions { - /** - * The diff image path to store - */ - diff: string; -} - -/** - * Pass to looksSame.colors function - */ -interface Color { - /** - * Red - */ - R: number; - /** - * Green - */ - G: number; - /** - * Blue - */ - B: number; -} - -/** - * Compare two images with options - * @param image1 The first image - * @param image2 The second image - * @param options The options passed to looksSame function - * @param callback Call when finish compare - */ -declare function looksSame( - image1: string | Buffer | BoundedImage, - image2: string | Buffer | BoundedImage, - options: LooksSameOptions | {}, - callback: LooksSameCallback -): void; -/** - * Compare two images - * @param image1 The first image - * @param image2 The second image - * @param callback Call when finish compare - */ -declare function looksSame( - image1: string | Buffer | BoundedImage, - image2: string | Buffer | BoundedImage, - callback: LooksSameCallback -): void; - -// https://stackoverflow.com/questions/44058101/typescript-declare-third-party-modules -declare module looksSame { - export function createDiff(options: CreateDiffOptions, callback: (error: Error | null) => any): void; - export function createDiff(options: CreateDiffAsBufferOptions, callback: (error: Error | null, buffer: Buffer) => any): void; - - /** - * Compare two colors - * @param color1 The first color - * @param color2 The second color - * @param options The options passed to looksSame.colors function - */ - export function colors(color1: Color, color2: Color, options: { tolerance: number }): void; -} - -/** - * Node.js library for comparing PNG-images, taking into account human color perception. - * It is created specially for the needs of visual regression testing for gemini utility, but can be used for other purposes. - */ -export = looksSame; diff --git a/package.json b/package.json index f64710b..dfb1f95 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,11 @@ "name": "looks-same", "version": "7.2.3", "description": "Pure node.js library for comparing PNG-images, taking into account human color perception.", - "main": "build/index.js", - "types": "index.d.ts", + "main": "build/src/index.js", + "types": "build/src/index.d.ts", + "files": [ + "build/src" + ], "directories": { "test": "test" }, diff --git a/src/index.d.ts b/src/index.d.ts new file mode 100644 index 0000000..388bf3d --- /dev/null +++ b/src/index.d.ts @@ -0,0 +1,237 @@ +// Type definitions for looks-same 5.0 +// Project: https://github.com/gemini-testing/looks-same/releases +// Definitions by: xcatliu + +/// + +/** + * coordinate bounds + */ +interface CoordBounds { + /** + * X-coordinate of upper left corner + */ + left: number; + /** + * Y-coordinate of upper left corner + */ + top: number; + /** + * X-coordinate of bottom right corner + */ + right: number; + /** + * Y-coordinate of bottom right corner + */ + bottom: number; +} + +/** + * bounded image + */ +interface BoundedImage { + /** + * image path or buffer + */ + source: string | Buffer; + /** + * bounding coordinates + */ + boundingBox: CoordBounds; +} + +/** + * The result obtained from the function. + */ +interface LooksSameResult { + /** + * true if images are equal, false - otherwise + */ + equal?: boolean; + /** + * diff bounds for not equal images + */ + diffBounds?: CoordBounds; + /** + * diff clusters for not equal images + */ + diffClusters?: CoordBounds[]; +} + +type LooksSameCallback = (error: Error | null, result: LooksSameResult) => void; + +/** + * The options passed to looksSame function + */ +interface LooksSameOptions { + /** + * By default, it will detect only noticeable differences. If you wish to detect any difference, use strict options. + */ + strict?: boolean; + /** + * You can also adjust the ΔE value that will be treated as error in non-strict mode. + */ + tolerance?: number; + /** + * Some devices can have different proportion between physical and logical screen resolutions also known as pixel ratio. + * Default value for this proportion is 1. + * This param also affects the comparison result, so it can be set manually with pixelRatio option. + */ + pixelRatio?: number; + /** + * Text caret in text input elements it is a pain for visual regression tasks, because it is always blinks. + * These diffs will be ignored by default. You can use `ignoreCaret` option with `false` value to disable ignoring such diffs. + * In that way text caret will be marked as diffs. + */ + ignoreCaret?: boolean; + /** + * Some images has difference while comparing because of antialiasing. + * These diffs will be ignored by default. You can use ignoreAntialiasing option with false value to disable ignoring such diffs. + * In that way antialiased pixels will be marked as diffs. + */ + ignoreAntialiasing?: boolean; + /** + * Sometimes the antialiasing algorithm can work incorrectly due to some features of the browser rendering engine. + * Use the option antialiasingTolerance to make the algorithm less strict. + * With this option you can specify the minimum difference in brightness (zero by default) + * between the darkest/lightest pixel (which is adjacent to the antialiasing pixel) and theirs adjacent pixels. + * + * We recommend that you don't increase this value above 10. If you need to increase more than 10 then this is definitely not antialiasing. + */ + antialiasingTolerance?: number; + /** + * Responsible for diff area which will be returned when comparing images. + * Diff bounds will contain the whole diff if stopOnFirstFail is false and only first diff pixel - otherwise. + */ + stopOnFirstFail?: boolean; + /** + * Responsible for diff bounds clustering + */ + shouldCluster?: boolean; + /** + * Radius for every diff cluster + */ + clustersSize?: number; +} + +/** + * The options passed to looksSame.createDiff function without diff + */ +interface CreateDiffAsBufferOptions { + /** + * The baseline image + */ + reference: string | Buffer | BoundedImage; + /** + * The current image + */ + current: string | Buffer | BoundedImage; + /** + * Color to highlight the differences + * e.g. '#ff00ff' + */ + highlightColor: string; + /** + * strict comparsion + */ + strict?: boolean; + /** + * ΔE value that will be treated as error in non-strict mode + */ + tolerance?: number; + /** + * makes the search algorithm of the antialiasing less strict + */ + antialiasingTolerance?: number; + /** + * Ability to ignore antialiasing + */ + ignoreAntialiasing?: boolean; + /** + * Ability to ignore text caret + */ + ignoreCaret?: boolean; +} + +/** + * The options passed to looksSame.createDiff function + */ +interface CreateDiffOptions extends CreateDiffAsBufferOptions { + /** + * The diff image path to store + */ + diff: string; +} + +/** + * Pass to looksSame.colors function + */ +interface Color { + /** + * Red + */ + R: number; + /** + * Green + */ + G: number; + /** + * Blue + */ + B: number; +} + +/** + * Compare two images with options + * @param image1 The first image + * @param image2 The second image + * @param options The options passed to looksSame function + * @param callback Call when finish compare + */ +declare function looksSame( + image1: string | Buffer | BoundedImage, + image2: string | Buffer | BoundedImage, + options: LooksSameOptions | {}, + callback: LooksSameCallback +): void; +/** + * Compare two images + * @param image1 The first image + * @param image2 The second image + * @param callback Call when finish compare + */ +declare function looksSame( + image1: string | Buffer | BoundedImage, + image2: string | Buffer | BoundedImage, + callback: LooksSameCallback +): void; + +// https://stackoverflow.com/questions/44058101/typescript-declare-third-party-modules +declare module looksSame { + export function createDiff( + options: CreateDiffOptions, + callback: (error: Error | null) => any + ): void; + export function createDiff( + options: CreateDiffAsBufferOptions, + callback: (error: Error | null, buffer: Buffer) => any + ): void; + + /** + * Compare two colors + * @param color1 The first color + * @param color2 The second color + * @param options The options passed to looksSame.colors function + */ + export function colors( + color1: Color, + color2: Color, + options: { tolerance: number } + ): void; +} + +/** + * Node.js library for comparing PNG-images, taking into account human color perception. + * It is created specially for the needs of visual regression testing for gemini utility, but can be used for other purposes. + */ +export = looksSame; diff --git a/index.js b/src/index.js similarity index 100% rename from index.js rename to src/index.js diff --git a/lib/antialiasing-comparator.js b/src/lib/antialiasing-comparator.js similarity index 100% rename from lib/antialiasing-comparator.js rename to src/lib/antialiasing-comparator.js diff --git a/lib/constants.js b/src/lib/constants.js similarity index 100% rename from lib/constants.js rename to src/lib/constants.js diff --git a/lib/diff-area.js b/src/lib/diff-area.js similarity index 100% rename from lib/diff-area.js rename to src/lib/diff-area.js diff --git a/lib/diff-clusters/clusters-joiner.js b/src/lib/diff-clusters/clusters-joiner.js similarity index 100% rename from lib/diff-clusters/clusters-joiner.js rename to src/lib/diff-clusters/clusters-joiner.js diff --git a/lib/diff-clusters/index.js b/src/lib/diff-clusters/index.js similarity index 100% rename from lib/diff-clusters/index.js rename to src/lib/diff-clusters/index.js diff --git a/lib/ignore-caret-comparator/index.js b/src/lib/ignore-caret-comparator/index.js similarity index 100% rename from lib/ignore-caret-comparator/index.js rename to src/lib/ignore-caret-comparator/index.js diff --git a/lib/ignore-caret-comparator/states/caret-detected.js b/src/lib/ignore-caret-comparator/states/caret-detected.js similarity index 100% rename from lib/ignore-caret-comparator/states/caret-detected.js rename to src/lib/ignore-caret-comparator/states/caret-detected.js diff --git a/lib/ignore-caret-comparator/states/init.js b/src/lib/ignore-caret-comparator/states/init.js similarity index 100% rename from lib/ignore-caret-comparator/states/init.js rename to src/lib/ignore-caret-comparator/states/init.js diff --git a/lib/ignore-caret-comparator/states/state.js b/src/lib/ignore-caret-comparator/states/state.js similarity index 100% rename from lib/ignore-caret-comparator/states/state.js rename to src/lib/ignore-caret-comparator/states/state.js diff --git a/lib/png/bounded-png.js b/src/lib/png/bounded-png.js similarity index 100% rename from lib/png/bounded-png.js rename to src/lib/png/bounded-png.js diff --git a/lib/png/index.js b/src/lib/png/index.js similarity index 100% rename from lib/png/index.js rename to src/lib/png/index.js diff --git a/lib/png/original-png.js b/src/lib/png/original-png.js similarity index 100% rename from lib/png/original-png.js rename to src/lib/png/original-png.js diff --git a/lib/png/png.js b/src/lib/png/png.js similarity index 100% rename from lib/png/png.js rename to src/lib/png/png.js diff --git a/lib/same-colors.js b/src/lib/same-colors.js similarity index 100% rename from lib/same-colors.js rename to src/lib/same-colors.js diff --git a/lib/utils.js b/src/lib/utils.js similarity index 100% rename from lib/utils.js rename to src/lib/utils.js diff --git a/lib/validators.js b/src/lib/validators.js similarity index 100% rename from lib/validators.js rename to src/lib/validators.js diff --git a/tsconfig.common.json b/tsconfig.common.json index b2fca4f..32dd319 100644 --- a/tsconfig.common.json +++ b/tsconfig.common.json @@ -1,5 +1,5 @@ { - "include": ["src", "test", "benchmark"], + "include": ["src", "test"], "compilerOptions": { "target": "es2017", "module": "commonjs", From 8b07bddfe32a2c0b3c6dd3640f4362329fb5bc49 Mon Sep 17 00:00:00 2001 From: DudaGod Date: Sun, 3 May 2020 01:38:04 +0300 Subject: [PATCH 04/10] chore: configure mocha --- bin/copy-additional-files-to-build.sh | 4 ++++ package-lock.json | 6 ++++++ package.json | 5 +++-- src/{index.js => index.ts} | 0 test/diff-area.js | 2 +- test/diff-clusters/clusters-joiner.js | 2 +- test/diff-clusters/index.js | 6 +++--- test/ignore-caret-comparator.js | 2 +- test/mocha.opts | 3 --- test/png/index.js | 2 +- test/setup.js | 3 +++ test/test.js | 6 +++--- test/utils.js | 4 ++-- test/validators.js | 2 +- tsconfig.common.json | 2 +- 15 files changed, 30 insertions(+), 19 deletions(-) create mode 100755 bin/copy-additional-files-to-build.sh rename src/{index.js => index.ts} (100%) delete mode 100644 test/mocha.opts diff --git a/bin/copy-additional-files-to-build.sh b/bin/copy-additional-files-to-build.sh new file mode 100755 index 0000000..3a6ce3c --- /dev/null +++ b/bin/copy-additional-files-to-build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +cp -R ./test/data ./build/test/data +cp ./src/index.d.ts ./build/src/index.d.ts diff --git a/package-lock.json b/package-lock.json index fc721c6..f489526 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,6 +95,12 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", diff --git a/package.json b/package.json index dfb1f95..16c6d57 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ }, "devDependencies": { "@types/node": "^13.13.0", + "app-module-path": "^2.2.0", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "eslint": "^5.3.0", @@ -36,11 +37,11 @@ "typescript": "^3.8.3" }, "scripts": { - "build": "tsc", + "build": "tsc && ./bin/copy-additional-files-to-build.sh", "clean": "rimraf build/ *.tsbuildinfo", "prepare": "npm run clean && npm run build", "test": "npm run build && npm run test-unit && npm run lint", - "test-unit": "mocha", + "test-unit": "mocha build/test --recursive --require ./build/test/setup --require ./build/test/assert-ext", "lint": "eslint .", "release": "standard-version" }, diff --git a/src/index.js b/src/index.ts similarity index 100% rename from src/index.js rename to src/index.ts diff --git a/test/diff-area.js b/test/diff-area.js index d986c68..415f2ae 100644 --- a/test/diff-area.js +++ b/test/diff-area.js @@ -1,7 +1,7 @@ 'use strict'; const expect = require('chai').expect; -const DiffArea = require('../lib/diff-area'); +const DiffArea = require('src/lib/diff-area'); describe('DiffArea', () => { it('should init diff area with default params', () => { diff --git a/test/diff-clusters/clusters-joiner.js b/test/diff-clusters/clusters-joiner.js index b387275..866a1c3 100644 --- a/test/diff-clusters/clusters-joiner.js +++ b/test/diff-clusters/clusters-joiner.js @@ -1,6 +1,6 @@ 'use strict'; -const clustersJoiner = require('../../lib/diff-clusters/clusters-joiner'); +const clustersJoiner = require('src/lib/diff-clusters/clusters-joiner'); describe('DiffClusters', () => { it('should join clusters', () => { diff --git a/test/diff-clusters/index.js b/test/diff-clusters/index.js index f1e38f2..de6dcc1 100644 --- a/test/diff-clusters/index.js +++ b/test/diff-clusters/index.js @@ -1,8 +1,8 @@ 'use strict'; -const DiffArea = require('../../lib/diff-area'); -const DiffClusters = require('../../lib/diff-clusters'); -const clustersJoiner = require('../../lib/diff-clusters/clusters-joiner'); +const DiffArea = require('src/lib/diff-area'); +const DiffClusters = require('src/lib/diff-clusters'); +const clustersJoiner = require('src/lib/diff-clusters/clusters-joiner'); describe('DiffClusters', () => { const sandbox = sinon.createSandbox(); diff --git a/test/ignore-caret-comparator.js b/test/ignore-caret-comparator.js index b11b03a..47c3329 100644 --- a/test/ignore-caret-comparator.js +++ b/test/ignore-caret-comparator.js @@ -58,7 +58,7 @@ describe('IgnoreCaretComparator', () => { .returns(true); areColorsSame['@global'] = true; - IgnoreCaretComparator = proxyquire('../lib/ignore-caret-comparator', { + IgnoreCaretComparator = proxyquire('src/lib/ignore-caret-comparator', { '../../same-colors': areColorsSame }); }); diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index 122b1c0..0000000 --- a/test/mocha.opts +++ /dev/null @@ -1,3 +0,0 @@ ---require ./test/setup ---require ./test/assert-ext ---recursive diff --git a/test/png/index.js b/test/png/index.js index a58cc0b..4e25128 100644 --- a/test/png/index.js +++ b/test/png/index.js @@ -3,7 +3,7 @@ const sinon = require('sinon'); const fs = require('fs-extra'); const {PNG} = require('pngjs'); -const {fromFile} = require('../../lib/png/index'); +const {fromFile} = require('src/lib/png/index'); const stubBuffer = Buffer.from([123]); diff --git a/test/setup.js b/test/setup.js index f476588..4e5abf4 100644 --- a/test/setup.js +++ b/test/setup.js @@ -1,5 +1,6 @@ 'use strict'; +const path = require('path'); const chai = require('chai'); global.sinon = require('sinon'); @@ -8,3 +9,5 @@ global.assert = chai.assert; chai.use(require('sinon-chai')); chai.use(require('chai-as-promised')); sinon.assert.expose(chai.assert, {prefix: ''}); + +require('app-module-path').addPath(path.resolve(__dirname, '..')); diff --git a/test/test.js b/test/test.js index 43a97c4..5930122 100644 --- a/test/test.js +++ b/test/test.js @@ -5,10 +5,10 @@ const fs = require('fs'); const temp = require('temp'); const expect = require('chai').expect; -const looksSame = require('..'); -const utils = require('../lib/utils'); +const looksSame = require('src/index'); +const utils = require('src/lib/utils'); const {readPair, formatImages, getDiffPixelsCoords} = utils; -const areColorsSame = require('../lib/same-colors'); +const areColorsSame = require('src/lib/same-colors'); const imagePath = (name) => path.join(__dirname, 'data', name); diff --git a/test/utils.js b/test/utils.js index 310e3b6..aa60f80 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,7 +1,7 @@ 'use strict'; -const {formatImages} = require('../lib/utils'); -const validators = require('../lib/validators'); +const {formatImages} = require('src/lib/utils'); +const validators = require('src/lib/validators'); describe('lib/utils', () => { const sandbox = sinon.createSandbox(); diff --git a/test/validators.js b/test/validators.js index b99c100..fca595f 100644 --- a/test/validators.js +++ b/test/validators.js @@ -1,7 +1,7 @@ 'use strict'; const _ = require('lodash'); -const {validateImages} = require('../lib/validators'); +const {validateImages} = require('src/lib/validators'); describe('lib/validators', () => { describe('validateImages', () => { diff --git a/tsconfig.common.json b/tsconfig.common.json index 32dd319..7f39994 100644 --- a/tsconfig.common.json +++ b/tsconfig.common.json @@ -4,7 +4,7 @@ "target": "es2017", "module": "commonjs", "allowJs": true, - "declaration": false, + "declaration": true, "declarationMap": false, "sourceMap": true, "strict": true, From d4a5ceef6fecf35bfad62d2cd4257a77a509d9cf Mon Sep 17 00:00:00 2001 From: DudaGod Date: Mon, 4 May 2020 20:27:00 +0300 Subject: [PATCH 05/10] chore: use typescript in source files, first implementation --- src/index.ts | 46 +++++++++---------- ...mparator.js => antialiasing-comparator.ts} | 13 ++++-- src/lib/constants.js | 8 ---- src/lib/constants.ts | 5 ++ src/lib/{diff-area.js => diff-area.ts} | 7 +-- ...{clusters-joiner.js => clusters-joiner.ts} | 11 ++--- src/lib/diff-clusters/{index.js => index.ts} | 17 +++---- .../{index.js => index.ts} | 20 +++++--- .../{caret-detected.js => caret-detected.ts} | 8 ++-- .../states/{init.js => init.ts} | 14 +++--- .../states/{state.js => state.ts} | 18 +++----- .../png/{bounded-png.js => bounded-png.ts} | 14 +++--- src/lib/png/{index.js => index.ts} | 21 ++++----- src/lib/png/original-png.js | 17 ------- src/lib/png/original-png.ts | 15 ++++++ src/lib/png/{png.js => png.ts} | 34 ++++++-------- src/lib/{same-colors.js => same-colors.ts} | 4 +- src/lib/{utils.js => utils.ts} | 18 ++++---- src/lib/{validators.js => validators.ts} | 8 ++-- 19 files changed, 139 insertions(+), 159 deletions(-) rename src/lib/{antialiasing-comparator.js => antialiasing-comparator.ts} (94%) delete mode 100644 src/lib/constants.js create mode 100644 src/lib/constants.ts rename src/lib/{diff-area.js => diff-area.ts} (85%) rename src/lib/diff-clusters/{clusters-joiner.js => clusters-joiner.ts} (76%) rename src/lib/diff-clusters/{index.js => index.ts} (67%) rename src/lib/ignore-caret-comparator/{index.js => index.ts} (71%) rename src/lib/ignore-caret-comparator/states/{caret-detected.js => caret-detected.ts} (71%) rename src/lib/ignore-caret-comparator/states/{init.js => init.ts} (89%) rename src/lib/ignore-caret-comparator/states/{state.js => state.ts} (70%) rename src/lib/png/{bounded-png.js => bounded-png.ts} (72%) rename src/lib/png/{index.js => index.ts} (60%) delete mode 100644 src/lib/png/original-png.js create mode 100644 src/lib/png/original-png.ts rename src/lib/png/{png.js => png.ts} (70%) rename src/lib/{same-colors.js => same-colors.ts} (75%) rename src/lib/{utils.js => utils.ts} (84%) rename src/lib/{validators.js => validators.ts} (84%) diff --git a/src/index.ts b/src/index.ts index 639048a..2c16a75 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,15 +1,12 @@ -'use strict'; - -const _ = require('lodash'); -const parseColor = require('parse-color'); -const colorDiff = require('color-diff'); -const png = require('./lib/png'); -const areColorsSame = require('./lib/same-colors'); -const AntialiasingComparator = require('./lib/antialiasing-comparator'); -const IgnoreCaretComparator = require('./lib/ignore-caret-comparator'); -const utils = require('./lib/utils'); -const {getDiffPixelsCoords} = utils; -const {JND} = require('./lib/constants'); +import _ from 'lodash'; +import parseColor from 'parse-color'; +import colorDiff from 'color-diff'; +import * as png from './lib/png'; +import areColorsSame from './lib/same-colors'; +import AntialiasingComparator from './lib/antialiasing-comparator'; +import IgnoreCaretComparator from './lib/ignore-caret-comparator'; +import {readPair, getDiffPixelsCoords, formatImages} from './lib/utils'; +import {JND} from './lib/constants'; const makeAntialiasingComparator = (comparator, png1, png2, opts) => { const antialiasingComparator = new AntialiasingComparator(comparator, png1, png2, opts); @@ -137,17 +134,16 @@ const getMaxDiffBounds = (first, second) => { }; }; -module.exports = exports = function looksSame(image1, image2, opts, callback) { +function looksSame(image1, image2, opts, callback?) { if (!callback) { callback = opts; opts = {}; } opts = prepareOpts(opts); - [image1, image2] = utils.formatImages(image1, image2); + [image1, image2] = formatImages(image1, image2); - utils - .readPair(image1, image2) + readPair(image1, image2) .then(({first, second}) => { const refImg = {size: {width: first.width, height: first.height}}; const metaInfo = {refImg}; @@ -171,17 +167,16 @@ module.exports = exports = function looksSame(image1, image2, opts, callback) { }); }; -exports.getDiffArea = function(image1, image2, opts, callback) { +looksSame.getDiffArea = function(image1, image2, opts, callback?) { if (!callback) { callback = opts; opts = {}; } opts = prepareOpts(opts); - [image1, image2] = utils.formatImages(image1, image2); + [image1, image2] = formatImages(image1, image2); - utils - .readPair(image1, image2) + readPair(image1, image2) .then(({first, second}) => { if (first.width !== second.width || first.height !== second.height) { return process.nextTick(() => callback(null, getMaxDiffBounds(first, second))); @@ -202,13 +197,12 @@ exports.getDiffArea = function(image1, image2, opts, callback) { }); }; -exports.createDiff = function saveDiff(opts, callback) { +looksSame.createDiff = function saveDiff(opts, callback) { opts = prepareOpts(opts); - const [image1, image2] = utils.formatImages(opts.reference, opts.current); + const [image1, image2] = formatImages(opts.reference, opts.current); - utils - .readPair(image1, image2) + readPair(image1, image2) .then(({first, second}) => { const diffOptions = { highlightColor: parseColorString(opts.highlightColor), @@ -228,7 +222,7 @@ exports.createDiff = function saveDiff(opts, callback) { }); }; -exports.colors = (color1, color2, opts) => { +looksSame.colors = (color1, color2, opts?) => { opts = opts || {}; if (opts.tolerance === undefined) { @@ -239,3 +233,5 @@ exports.colors = (color1, color2, opts) => { return comparator({color1, color2}); }; + +export default looksSame; diff --git a/src/lib/antialiasing-comparator.js b/src/lib/antialiasing-comparator.ts similarity index 94% rename from src/lib/antialiasing-comparator.js rename to src/lib/antialiasing-comparator.ts index 3b9f9c7..011fad3 100644 --- a/src/lib/antialiasing-comparator.js +++ b/src/lib/antialiasing-comparator.ts @@ -1,5 +1,3 @@ -'use strict'; - /* * Anti-aliased pixel detector * @see http://www.eejournal.ktu.lt/index.php/elt/article/view/10058/5000 @@ -7,7 +5,12 @@ const DEFAULT_BRIGHTNESS_TOLERANCE = 0; -module.exports = class AntialiasingComparator { +export default class AntialiasingComparator { + private _baseComparator: any; + private _img1: any; + private _img2: any; + private _brightnessTolerance: any; + constructor(baseComparator, png1, png2, {antialiasingTolerance = 0}) { this._baseComparator = baseComparator; this._img1 = png1; @@ -24,7 +27,7 @@ module.exports = class AntialiasingComparator { || this._isAntialiased(this._img1, data.x, data.y, data, this._img2); } - _isAntialiased(img1, x1, y1, data, img2) { + _isAntialiased(img1, x1, y1, data, img2?) { const color1 = img1.getPixel(x1, y1); const width = data.width; const height = data.height; @@ -103,7 +106,7 @@ module.exports = class AntialiasingComparator { _brightnessDelta(color1, color2) { return rgb2y(color1.R, color1.G, color1.B) - rgb2y(color2.R, color2.G, color2.B); } -}; +} // gamma-corrected luminance of a color (YIQ NTSC transmission color space) // see https://www.academia.edu/8200524/DIGITAL_IMAGE_PROCESSING_Digital_Image_Processing_PIKS_Inside_Third_Edition diff --git a/src/lib/constants.js b/src/lib/constants.js deleted file mode 100644 index 8d64159..0000000 --- a/src/lib/constants.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -module.exports = { - JND: 2.3, // Just noticeable difference if ciede2000 >= JND then colors difference is noticeable by human eye - REQUIRED_IMAGE_FIELDS: ['source', 'boundingBox'], - REQUIRED_BOUNDING_BOX_FIELDS: ['left', 'top', 'right', 'bottom'], - CLUSTERS_SIZE: 10 -}; diff --git a/src/lib/constants.ts b/src/lib/constants.ts new file mode 100644 index 0000000..12e4e29 --- /dev/null +++ b/src/lib/constants.ts @@ -0,0 +1,5 @@ +// Just noticeable difference if ciede2000 >= JND then colors difference is noticeable by human eye +export const JND = 2.3; +export const REQUIRED_IMAGE_FIELDS = ['source', 'boundingBox']; +export const REQUIRED_BOUNDING_BOX_FIELDS = ['left', 'top', 'right', 'bottom']; +export const CLUSTERS_SIZE = 10; diff --git a/src/lib/diff-area.js b/src/lib/diff-area.ts similarity index 85% rename from src/lib/diff-area.js rename to src/lib/diff-area.ts index 3d5d6c8..9d86247 100644 --- a/src/lib/diff-area.js +++ b/src/lib/diff-area.ts @@ -1,6 +1,7 @@ -'use strict'; +export = class DiffArea { + private _diffArea: { left: number; top: number; right: number; bottom: number; }; + private _updated: boolean; -module.exports = class DiffArea { static create() { return new DiffArea(); } @@ -37,4 +38,4 @@ module.exports = class DiffArea { get area() { return this._diffArea; } -}; +} diff --git a/src/lib/diff-clusters/clusters-joiner.js b/src/lib/diff-clusters/clusters-joiner.ts similarity index 76% rename from src/lib/diff-clusters/clusters-joiner.js rename to src/lib/diff-clusters/clusters-joiner.ts index e9f752d..906bfd3 100644 --- a/src/lib/diff-clusters/clusters-joiner.js +++ b/src/lib/diff-clusters/clusters-joiner.ts @@ -1,7 +1,5 @@ -'use strict'; - -const DiffArea = require('../diff-area'); -const jsgraphs = require('js-graph-algorithms'); +import DiffArea from '../diff-area'; +import jsgraphs from 'js-graph-algorithms'; const hasOverlap = (cluster1, cluster2) => { if (cluster1.left > cluster2.right || cluster2.left > cluster1.right) { @@ -29,10 +27,11 @@ const getConnectedComponents = (clusters) => { return new jsgraphs.ConnectedComponents(graph); }; -exports.join = (clusters) => { +export const join = (clusters) => { const connectedComponents = getConnectedComponents(clusters); + const connectedComponentsIds = Array(clusters.length).fill(0).map((_, i) => connectedComponents.componentId(i)); - return connectedComponents.id.reduce((acc, clusterId, i) => { + return connectedComponentsIds.reduce((acc, clusterId, i) => { const {left, top, right, bottom} = clusters[i].area; if (!acc[clusterId]) { acc[clusterId] = DiffArea.create(); diff --git a/src/lib/diff-clusters/index.js b/src/lib/diff-clusters/index.ts similarity index 67% rename from src/lib/diff-clusters/index.js rename to src/lib/diff-clusters/index.ts index c46c0b3..475d6d4 100644 --- a/src/lib/diff-clusters/index.js +++ b/src/lib/diff-clusters/index.ts @@ -1,20 +1,21 @@ -'use strict'; +import DiffArea from '../diff-area'; +import {CLUSTERS_SIZE} from '../constants'; +import * as clustersJoiner from './clusters-joiner'; -const DiffArea = require('../diff-area'); -const {CLUSTERS_SIZE} = require('../constants'); -const clustersJoiner = require('./clusters-joiner'); +export default class DiffClusters { + private _clustersSize: any; + private _clusters: any[]; -module.exports = class DiffClusters { - constructor(clustersSize) { + constructor(clustersSize?: number) { this._clustersSize = clustersSize || CLUSTERS_SIZE; this._clusters = []; } - update(x, y) { + update(x, y): this { if (!this._clusters.length) { this._clusters.push(DiffArea.create().update(x, y)); - return; + return this; } this._joinToClusters(x, y); diff --git a/src/lib/ignore-caret-comparator/index.js b/src/lib/ignore-caret-comparator/index.ts similarity index 71% rename from src/lib/ignore-caret-comparator/index.js rename to src/lib/ignore-caret-comparator/index.ts index 3db834f..80bc96a 100644 --- a/src/lib/ignore-caret-comparator/index.js +++ b/src/lib/ignore-caret-comparator/index.ts @@ -1,13 +1,19 @@ -'use strict'; - -const _ = require('lodash'); +import _ from 'lodash'; +import InitState from './states/init'; +import CaretDetectedState from './states/caret-detected'; const STATES = { - InitState: require('./states/init'), - CaretDetectedState: require('./states/caret-detected') + InitState, + CaretDetectedState }; -module.exports = class IgnoreCaretComparator { +export default class IgnoreCaretComparator { + private pixelRatio: number; + private caretTopLeft: any; + private caretBottomRight: any; + private _baseComparator: any; + private _state: any; + constructor(baseComparator, pixelRatio) { this.pixelRatio = pixelRatio ? Math.floor(pixelRatio) : 1; this.caretTopLeft = null; @@ -37,4 +43,4 @@ module.exports = class IgnoreCaretComparator { switchState(stateName) { this._state = new STATES[stateName](this); } -}; +} diff --git a/src/lib/ignore-caret-comparator/states/caret-detected.js b/src/lib/ignore-caret-comparator/states/caret-detected.ts similarity index 71% rename from src/lib/ignore-caret-comparator/states/caret-detected.js rename to src/lib/ignore-caret-comparator/states/caret-detected.ts index 609852a..ae66252 100644 --- a/src/lib/ignore-caret-comparator/states/caret-detected.js +++ b/src/lib/ignore-caret-comparator/states/caret-detected.ts @@ -1,8 +1,6 @@ -'use strict'; +import State from './state'; -const State = require('./state'); - -module.exports = class CaretDetectedState extends State { +export default class CaretDetectedState extends State { validate(point) { return this._isInsideCaret(point); } @@ -11,4 +9,4 @@ module.exports = class CaretDetectedState extends State { return point.x >= this.caretTopLeft.x && point.x <= this.caretBottomRight.x && point.y >= this.caretTopLeft.y && point.y <= this.caretBottomRight.y; } -}; +} diff --git a/src/lib/ignore-caret-comparator/states/init.js b/src/lib/ignore-caret-comparator/states/init.ts similarity index 89% rename from src/lib/ignore-caret-comparator/states/init.js rename to src/lib/ignore-caret-comparator/states/init.ts index 2f4805e..4facb9d 100644 --- a/src/lib/ignore-caret-comparator/states/init.js +++ b/src/lib/ignore-caret-comparator/states/init.ts @@ -1,11 +1,9 @@ -'use strict'; +import _ from 'lodash'; +import State from './state'; +import areColorsSame from '../../same-colors'; -const _ = require('lodash'); -const State = require('./state'); -const areColorsSame = require('../../same-colors'); - -module.exports = class InitState extends State { - validate(firstCaretPoint, imgs) { +export default class InitState extends State { + validate(firstCaretPoint, imgs): boolean { const lastCaretPoint = this._getLastCaretPoint(firstCaretPoint, imgs); if (!this._looksLikeCaret(firstCaretPoint, lastCaretPoint)) { @@ -65,4 +63,4 @@ module.exports = class InitState extends State { _caretWidth(firstCaretPoint, lastCaretPoint) { return (lastCaretPoint.x - firstCaretPoint.x) + 1; } -}; +} diff --git a/src/lib/ignore-caret-comparator/states/state.js b/src/lib/ignore-caret-comparator/states/state.ts similarity index 70% rename from src/lib/ignore-caret-comparator/states/state.js rename to src/lib/ignore-caret-comparator/states/state.ts index 4fce714..386cec1 100644 --- a/src/lib/ignore-caret-comparator/states/state.js +++ b/src/lib/ignore-caret-comparator/states/state.ts @@ -1,13 +1,7 @@ -'use strict'; - -module.exports = class State { - constructor(comparator) { - this._ctx = comparator; - } - - validate() { - throw new Error('Not implemented'); - } +export default abstract class State { + constructor( + private _ctx: any + ) {} switchState(state) { this._ctx.switchState(state); @@ -32,4 +26,6 @@ module.exports = class State { set caretBottomRight(point) { this._ctx.caretBottomRight = point; } -}; + + abstract validate(point: any, imgs?: any): boolean; +} diff --git a/src/lib/png/bounded-png.js b/src/lib/png/bounded-png.ts similarity index 72% rename from src/lib/png/bounded-png.js rename to src/lib/png/bounded-png.ts index 9b49e85..7716ea0 100644 --- a/src/lib/png/bounded-png.js +++ b/src/lib/png/bounded-png.ts @@ -1,8 +1,8 @@ -'use strict'; +import PNGImage from './png'; -const PNGImage = require('./png'); +export default class BoundedPNGImage extends PNGImage { + private _boundingBox: any; -module.exports = class BoundedPNGImage extends PNGImage { constructor(png, boundingBox) { super(png); @@ -21,15 +21,15 @@ module.exports = class BoundedPNGImage extends PNGImage { super.setPixel(actX, actY, color); } - getActualCoord(x, y) { + getActualCoord(x: number, y: number): {x: number, y: number} { return {x: x + this._boundingBox.left, y: y + this._boundingBox.top}; } - get width() { + get width(): number { return this._boundingBox.right - this._boundingBox.left + 1; } - get height() { + get height(): number { return this._boundingBox.bottom - this._boundingBox.top + 1; } -}; +} diff --git a/src/lib/png/index.js b/src/lib/png/index.ts similarity index 60% rename from src/lib/png/index.js rename to src/lib/png/index.ts index cadc848..5089314 100644 --- a/src/lib/png/index.js +++ b/src/lib/png/index.ts @@ -1,10 +1,8 @@ -'use strict'; - -const fs = require('fs-extra'); -const NestedError = require('nested-error-stacks'); -const {PNG} = require('pngjs'); -const OriginalPNG = require('./original-png'); -const BoundedPNG = require('./bounded-png'); +import fs from 'fs-extra'; +import NestedError from 'nested-error-stacks'; +import {PNG} from 'pngjs'; +import OriginalPNG from './original-png'; +import BoundedPNG from './bounded-png'; function parseBuffer(buffer) { return new Promise((resolve, reject) => { @@ -18,13 +16,14 @@ function parseBuffer(buffer) { }); }); } -exports.create = (png, {boundingBox} = {}) => { + +export const create = (png, {boundingBox = undefined} = {}) => { return boundingBox ? BoundedPNG.create(png, boundingBox) : OriginalPNG.create(png); }; -exports.fromFile = async (filePath, opts = {}) => { +export const fromFile = async (filePath, opts = {}) => { try { const buffer = await fs.readFile(filePath); return await exports.fromBuffer(buffer, opts); @@ -33,9 +32,9 @@ exports.fromFile = async (filePath, opts = {}) => { } }; -exports.fromBuffer = async (buffer, opts = {}) => { +export const fromBuffer = async (buffer, opts = {}) => { const png = await parseBuffer(buffer); return exports.create(png, opts); }; -exports.empty = (width, height) => exports.create(new PNG({width, height})); +export const empty = (width, height) => exports.create(new PNG({width, height})); diff --git a/src/lib/png/original-png.js b/src/lib/png/original-png.js deleted file mode 100644 index 47c8408..0000000 --- a/src/lib/png/original-png.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -const PNGImage = require('./png'); - -module.exports = class OriginalPNGImage extends PNGImage { - getActualCoord(x, y) { - return {x, y}; - } - - get width() { - return this._png.width; - } - - get height() { - return this._png.height; - } -}; diff --git a/src/lib/png/original-png.ts b/src/lib/png/original-png.ts new file mode 100644 index 0000000..34c37a6 --- /dev/null +++ b/src/lib/png/original-png.ts @@ -0,0 +1,15 @@ +import PNGImage from './png'; + +export default class OriginalPNGImage extends PNGImage { + getActualCoord(x: number, y: number): {x: number, y: number} { + return {x, y}; + } + + get width(): number { + return this._png.width; + } + + get height(): number { + return this._png.height; + } +} diff --git a/src/lib/png/png.js b/src/lib/png/png.ts similarity index 70% rename from src/lib/png/png.js rename to src/lib/png/png.ts index b6f1fe7..657285c 100644 --- a/src/lib/png/png.js +++ b/src/lib/png/png.ts @@ -1,16 +1,16 @@ -'use strict'; +import fs from 'fs'; +import concat from 'concat-stream'; -const fs = require('fs'); -const concat = require('concat-stream'); +type Constructor = new (...args: Array) => T; -module.exports = class PNGImage { - static create(...args) { +export default abstract class PNGImage { + public static create(this: Constructor, ...args): T { return new this(...args); } - constructor(png) { - this._png = png; - } + constructor( + protected _png: any + ) {} getPixel(x, y) { const idx = this._getIdx(x, y); @@ -29,18 +29,6 @@ module.exports = class PNGImage { this._png.data[idx + 3] = 255; } - getActualCoord() { - throw new Error('Not implemented'); - } - - get width() { - throw new Error('Not implemented'); - } - - get height() { - throw new Error('Not implemented'); - } - _getIdx(x, y) { return (this._png.width * y + x) * 4; } @@ -61,4 +49,8 @@ module.exports = class PNGImage { callback(null, data); } } -}; + + abstract getActualCoord(x: number, y: number): {x: number, y: number}; + abstract get width(): number; + abstract get height(): number; +} diff --git a/src/lib/same-colors.js b/src/lib/same-colors.ts similarity index 75% rename from src/lib/same-colors.js rename to src/lib/same-colors.ts index 6ab970e..207b325 100644 --- a/src/lib/same-colors.js +++ b/src/lib/same-colors.ts @@ -1,6 +1,4 @@ -'use strict'; - -module.exports = (data) => { +export = (data) => { const c1 = data.color1; const c2 = data.color2; diff --git a/src/lib/utils.js b/src/lib/utils.ts similarity index 84% rename from src/lib/utils.js rename to src/lib/utils.ts index 8a20679..7158a42 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.ts @@ -1,17 +1,17 @@ 'use strict'; -const _ = require('lodash'); -const png = require('./png'); -const DiffArea = require('./diff-area'); -const DiffClusters = require('./diff-clusters'); -const validators = require('./validators'); +import _ from 'lodash'; +import * as png from './png'; +import DiffArea from './diff-area'; +import DiffClusters from './diff-clusters'; +import {validateImages} from './validators'; function read({source, ...opts}) { const readFunc = Buffer.isBuffer(source) ? png.fromBuffer : png.fromFile; return readFunc(source, opts); } -exports.readPair = async (first, second) => { +export const readPair = async (first, second) => { const [firstPng, secondPng] = await Promise.all([first, second].map(read)); return {first: firstPng, second: secondPng}; @@ -21,7 +21,7 @@ const getDiffClusters = (diffClusters, diffArea, {shouldCluster}) => { return shouldCluster ? diffClusters.clusters : [diffArea.area]; }; -exports.getDiffPixelsCoords = (png1, png2, predicate, opts, callback) => { +export const getDiffPixelsCoords = (png1, png2, predicate, opts, callback?) => { if (!callback) { callback = opts; opts = {}; @@ -74,8 +74,8 @@ exports.getDiffPixelsCoords = (png1, png2, predicate, opts, callback) => { processRow(0); }; -exports.formatImages = (img1, img2) => { - validators.validateImages(img1, img2); +export const formatImages = (img1, img2) => { + validateImages(img1, img2); return [img1, img2].map((i) => { return _.isObject(i) && !Buffer.isBuffer(i) ? i : {source: i, boundingBox: null}; diff --git a/src/lib/validators.js b/src/lib/validators.ts similarity index 84% rename from src/lib/validators.js rename to src/lib/validators.ts index cb6602d..40ca81f 100644 --- a/src/lib/validators.js +++ b/src/lib/validators.ts @@ -1,7 +1,5 @@ -'use strict'; - -const _ = require('lodash'); -const {REQUIRED_IMAGE_FIELDS, REQUIRED_BOUNDING_BOX_FIELDS} = require('./constants'); +import _ from 'lodash'; +import {REQUIRED_IMAGE_FIELDS, REQUIRED_BOUNDING_BOX_FIELDS} from './constants'; const validateRequiredFields = (value, fields) => { [].concat(fields).forEach((field) => { @@ -21,7 +19,7 @@ const validateBoundingBoxCoords = ({boundingBox}) => { } }; -exports.validateImages = (img1, img2) => { +export const validateImages = (img1, img2) => { [img1, img2].forEach((i) => { if (Buffer.isBuffer(i) || !_.isObject(i)) { return; From 6f59acfcbc9f1c7f77a5134ad4881f820aa65f8f Mon Sep 17 00:00:00 2001 From: DudaGod Date: Mon, 4 May 2020 23:25:17 +0300 Subject: [PATCH 06/10] chore: use typescript in testing files, first implementation --- package-lock.json | 49 +++++++- package.json | 8 +- test/assert-ext.js | 4 - test/assert-ext.ts | 13 ++ test/{diff-area.js => diff-area.ts} | 6 +- ...{clusters-joiner.js => clusters-joiner.ts} | 4 +- test/diff-clusters/index.js | 52 -------- test/diff-clusters/index.ts | 37 ++++++ ...mparator.js => ignore-caret-comparator.ts} | 13 +- test/png/{index.js => index.ts} | 9 +- test/setup.js | 13 -- test/setup.ts | 20 +++ test/{test.js => test.ts} | 115 ++++++++---------- test/{utils.js => utils.ts} | 6 +- test/{validators.js => validators.ts} | 6 +- 15 files changed, 186 insertions(+), 169 deletions(-) delete mode 100644 test/assert-ext.js create mode 100644 test/assert-ext.ts rename test/{diff-area.js => diff-area.ts} (93%) rename test/diff-clusters/{clusters-joiner.js => clusters-joiner.ts} (86%) delete mode 100644 test/diff-clusters/index.js create mode 100644 test/diff-clusters/index.ts rename test/{ignore-caret-comparator.js => ignore-caret-comparator.ts} (95%) rename test/png/{index.js => index.ts} (86%) delete mode 100644 test/setup.js create mode 100644 test/setup.ts rename test/{test.js => test.ts} (91%) rename test/{utils.js => utils.ts} (93%) rename test/{validators.js => validators.ts} (96%) diff --git a/package-lock.json b/package-lock.json index f489526..4e33eac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,12 +28,55 @@ "integrity": "sha512-D7VxhADdZbDJ0HjUTMnSQ5xIGb4H2yWpg8k9Sf1T08zfFiQYlaxM8LZydpR4FQ2E6LZJX8IlabNZ5io4vdChwg==", "dev": true }, + "@types/chai": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", + "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", + "dev": true + }, + "@types/mocha": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "dev": true + }, "@types/node": { "version": "13.13.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.0.tgz", "integrity": "sha512-WE4IOAC6r/yBZss1oQGM5zs2D7RuKR6Q+w+X2SouPofnWn+LbCqClRyhO3ZE7Ix8nmFgo/oVuuE01cJT2XB13A==", "dev": true }, + "@types/proxyquire": { + "version": "1.3.28", + "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.28.tgz", + "integrity": "sha512-SQaNzWQ2YZSr7FqAyPPiA3FYpux2Lqh3HWMZQk47x3xbMCqgC/w0dY3dw9rGqlweDDkrySQBcaScXWeR+Yb11Q==", + "dev": true + }, + "@types/sinon": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.0.tgz", + "integrity": "sha512-v2TkYHkts4VXshMkcmot/H+ERZ2SevKa10saGaJPGCJ8vh3lKrC4u663zYEeRZxep+VbG6YRDtQ6gVqw9dYzPA==", + "dev": true, + "requires": { + "@types/sinonjs__fake-timers": "*" + } + }, + "@types/sinon-chai": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.4.tgz", + "integrity": "sha512-xq5KOWNg70PRC7dnR2VOxgYQ6paumW+4pTZP+6uTSdhpYsAUEeeT5bw6rRHHQrZ4KyR+M5ojOR+lje6TGSpUxA==", + "dev": true, + "requires": { + "@types/chai": "*", + "@types/sinon": "*" + } + }, + "@types/sinonjs__fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz", + "integrity": "sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA==", + "dev": true + }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -95,12 +138,6 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "app-module-path": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", - "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", - "dev": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", diff --git a/package.json b/package.json index 16c6d57..2cd8373 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,12 @@ "pngjs": "^3.3.3" }, "devDependencies": { + "@types/chai": "^4.2.11", + "@types/mocha": "^7.0.2", "@types/node": "^13.13.0", - "app-module-path": "^2.2.0", + "@types/proxyquire": "^1.3.28", + "@types/sinon": "^9.0.0", + "@types/sinon-chai": "^3.2.4", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "eslint": "^5.3.0", @@ -41,7 +45,7 @@ "clean": "rimraf build/ *.tsbuildinfo", "prepare": "npm run clean && npm run build", "test": "npm run build && npm run test-unit && npm run lint", - "test-unit": "mocha build/test --recursive --require ./build/test/setup --require ./build/test/assert-ext", + "test-unit": "mocha build/test --recursive --require ./build/test/setup", "lint": "eslint .", "release": "standard-version" }, diff --git a/test/assert-ext.js b/test/assert-ext.js deleted file mode 100644 index 942f14d..0000000 --- a/test/assert-ext.js +++ /dev/null @@ -1,4 +0,0 @@ -global.assert.calledOnceWith = function() { - assert.calledOnce(arguments[0]); - assert.calledWith.apply(null, arguments); -}; diff --git a/test/assert-ext.ts b/test/assert-ext.ts new file mode 100644 index 0000000..a4e02bc --- /dev/null +++ b/test/assert-ext.ts @@ -0,0 +1,13 @@ +export default function(chai) { + const assert = chai.assert; + + assert.calledOnceWith = function() { + assert.calledOnce(arguments[0]); + assert.calledWith(...arguments); + }; + + assert.calledOnceWithMatch = function() { + assert.calledOnce(arguments[0]); + assert.calledWithMatch(...arguments); + }; +}; diff --git a/test/diff-area.js b/test/diff-area.ts similarity index 93% rename from test/diff-area.js rename to test/diff-area.ts index 415f2ae..d784dd1 100644 --- a/test/diff-area.js +++ b/test/diff-area.ts @@ -1,7 +1,5 @@ -'use strict'; - -const expect = require('chai').expect; -const DiffArea = require('src/lib/diff-area'); +import {expect} from 'chai'; +import DiffArea from '../src/lib/diff-area'; describe('DiffArea', () => { it('should init diff area with default params', () => { diff --git a/test/diff-clusters/clusters-joiner.js b/test/diff-clusters/clusters-joiner.ts similarity index 86% rename from test/diff-clusters/clusters-joiner.js rename to test/diff-clusters/clusters-joiner.ts index 866a1c3..aefbaf8 100644 --- a/test/diff-clusters/clusters-joiner.js +++ b/test/diff-clusters/clusters-joiner.ts @@ -1,6 +1,4 @@ -'use strict'; - -const clustersJoiner = require('src/lib/diff-clusters/clusters-joiner'); +import * as clustersJoiner from '../../src/lib/diff-clusters/clusters-joiner'; describe('DiffClusters', () => { it('should join clusters', () => { diff --git a/test/diff-clusters/index.js b/test/diff-clusters/index.js deleted file mode 100644 index de6dcc1..0000000 --- a/test/diff-clusters/index.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -const DiffArea = require('src/lib/diff-area'); -const DiffClusters = require('src/lib/diff-clusters'); -const clustersJoiner = require('src/lib/diff-clusters/clusters-joiner'); - -describe('DiffClusters', () => { - const sandbox = sinon.createSandbox(); - - beforeEach(() => { - sandbox.stub(clustersJoiner, 'join'); - sandbox.stub(DiffArea.prototype, 'isPointInArea'); - }); - - afterEach(() => sandbox.restore()); - - it('should define points to different clusters', () => { - DiffArea.prototype.isPointInArea.returns(false); - clustersJoiner.join = (clusters) => clusters; - const diffClusters = new DiffClusters(); - - diffClusters.update(1, 1); - diffClusters.update(5, 5); - - assert.deepEqual(diffClusters.clusters, [ - {left: 1, top: 1, right: 1, bottom: 1}, - {left: 5, top: 5, right: 5, bottom: 5} - ]); - }); - - it('should define points to the same clusters', () => { - DiffArea.prototype.isPointInArea.returns(true); - clustersJoiner.join = (clusters) => clusters; - const diffClusters = new DiffClusters(); - - diffClusters.update(1, 1); - diffClusters.update(5, 5); - - assert.deepEqual(diffClusters.clusters, [{left: 1, top: 1, right: 5, bottom: 5}]); - }); - - it('should return joined clusters', () => { - DiffArea.prototype.isPointInArea.returns(false); - clustersJoiner.join.returns([{area: {left: 1, top: 1, right: 5, bottom: 5}}]); - const diffClusters = new DiffClusters(); - - diffClusters.update(1, 1); - diffClusters.update(5, 5); - - assert.deepEqual(diffClusters.clusters, [{left: 1, top: 1, right: 5, bottom: 5}]); - }); -}); diff --git a/test/diff-clusters/index.ts b/test/diff-clusters/index.ts new file mode 100644 index 0000000..1890c91 --- /dev/null +++ b/test/diff-clusters/index.ts @@ -0,0 +1,37 @@ +import DiffArea from '../../src/lib/diff-area'; +import DiffClusters from '../../src/lib/diff-clusters'; +import * as clustersJoiner from '../../src/lib/diff-clusters/clusters-joiner'; + +describe('DiffClusters', () => { + const sandbox = sinon.createSandbox(); + + beforeEach(() => { + sandbox.stub(clustersJoiner, 'join').returnsArg(0); + sandbox.stub(DiffArea.prototype, 'isPointInArea'); + }); + + afterEach(() => sandbox.restore()); + + it('should define points to different clusters', () => { + (DiffArea.prototype.isPointInArea as any).returns(false); + const diffClusters = new DiffClusters(); + + diffClusters.update(1, 1); + diffClusters.update(5, 5); + + assert.deepEqual(diffClusters.clusters, [ + {left: 1, top: 1, right: 1, bottom: 1}, + {left: 5, top: 5, right: 5, bottom: 5} + ]); + }); + + it('should define points to the same clusters', () => { + (DiffArea.prototype.isPointInArea as any).returns(true); + const diffClusters = new DiffClusters(); + + diffClusters.update(1, 1); + diffClusters.update(5, 5); + + assert.deepEqual(diffClusters.clusters, [{left: 1, top: 1, right: 5, bottom: 5}]); + }); +}); diff --git a/test/ignore-caret-comparator.js b/test/ignore-caret-comparator.ts similarity index 95% rename from test/ignore-caret-comparator.js rename to test/ignore-caret-comparator.ts index 47c3329..9130f30 100644 --- a/test/ignore-caret-comparator.js +++ b/test/ignore-caret-comparator.ts @@ -1,9 +1,6 @@ -'use strict'; - -const _ = require('lodash'); -const expect = require('chai').expect; -const sinon = require('sinon'); -const proxyquire = require('proxyquire'); +import _ from 'lodash'; +import proxyquire from 'proxyquire'; +import {expect} from 'chai'; describe('IgnoreCaretComparator', () => { const sandbox = sinon.sandbox.create(); @@ -58,9 +55,9 @@ describe('IgnoreCaretComparator', () => { .returns(true); areColorsSame['@global'] = true; - IgnoreCaretComparator = proxyquire('src/lib/ignore-caret-comparator', { + IgnoreCaretComparator = proxyquire('../src/lib/ignore-caret-comparator', { '../../same-colors': areColorsSame - }); + }).default; }); afterEach(() => sandbox.restore()); diff --git a/test/png/index.js b/test/png/index.ts similarity index 86% rename from test/png/index.js rename to test/png/index.ts index 4e25128..7887e70 100644 --- a/test/png/index.js +++ b/test/png/index.ts @@ -1,9 +1,6 @@ -'use strict'; - -const sinon = require('sinon'); -const fs = require('fs-extra'); -const {PNG} = require('pngjs'); -const {fromFile} = require('src/lib/png/index'); +import fs from 'fs-extra'; +import {PNG} from 'pngjs'; +import {fromFile} from '../../src/lib/png/index'; const stubBuffer = Buffer.from([123]); diff --git a/test/setup.js b/test/setup.js deleted file mode 100644 index 4e5abf4..0000000 --- a/test/setup.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -const path = require('path'); -const chai = require('chai'); - -global.sinon = require('sinon'); -global.assert = chai.assert; - -chai.use(require('sinon-chai')); -chai.use(require('chai-as-promised')); -sinon.assert.expose(chai.assert, {prefix: ''}); - -require('app-module-path').addPath(path.resolve(__dirname, '..')); diff --git a/test/setup.ts b/test/setup.ts new file mode 100644 index 0000000..be8cd2e --- /dev/null +++ b/test/setup.ts @@ -0,0 +1,20 @@ +import chaiModule from 'chai'; +import sinonModule from "sinon"; +import sinonChai from 'sinon-chai'; +import chaiAsPromised from 'chai-as-promised'; +import assertExt from './assert-ext'; +import mocha from 'mocha'; + +declare global { + const sinon: typeof sinonModule; + const assert: Chai.Assert & sinonModule.SinonAssert & { [key: string]: any }; +} + +(global as any).sinon = sinonModule; +(global as any).assert = chaiModule.assert; + +chaiModule.use(sinonChai); +chaiModule.use(chaiAsPromised); +chaiModule.use(assertExt); + +sinonModule.assert.expose(chaiModule.assert, {prefix: ''}); diff --git a/test/test.js b/test/test.ts similarity index 91% rename from test/test.js rename to test/test.ts index 5930122..eb5e886 100644 --- a/test/test.js +++ b/test/test.ts @@ -1,14 +1,12 @@ -'use strict'; - -const path = require('path'); -const fs = require('fs'); -const temp = require('temp'); -const expect = require('chai').expect; - -const looksSame = require('src/index'); -const utils = require('src/lib/utils'); +import path from 'path'; +import fs from 'fs'; +import temp from 'temp'; +import {expect} from 'chai'; + +import looksSame from '../src/index'; +import areColorsSame from '../src/lib/same-colors'; +import * as utils from '../src/lib/utils'; const {readPair, formatImages, getDiffPixelsCoords} = utils; -const areColorsSame = require('src/lib/same-colors'); const imagePath = (name) => path.join(__dirname, 'data', name); @@ -378,14 +376,15 @@ describe('looksSame', () => { describe('createDiff', () => { const sandbox = sinon.createSandbox(); + let tempName; beforeEach(() => { - this.tempName = temp.path({suffix: '.png'}); + tempName = temp.path({suffix: '.png'}); }); afterEach(() => { - if (fs.existsSync(this.tempName)) { - fs.unlinkSync(this.tempName); + if (fs.existsSync(tempName)) { + fs.unlinkSync(tempName); } sandbox.restore(); @@ -396,7 +395,7 @@ describe('createDiff', () => { looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('different.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#ff00ff', tolerance: 9000, strict: true @@ -410,7 +409,7 @@ describe('createDiff', () => { looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('same.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#ff00ff' }, () => { assert.calledOnceWith(utils.formatImages, srcPath('ref.png'), srcPath('same.png')); @@ -426,7 +425,7 @@ describe('createDiff', () => { looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('same.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#ff00ff' }, () => { assert.calledOnceWith(utils.readPair, formattedImg1, formattedImg2); @@ -435,14 +434,13 @@ describe('createDiff', () => { }); it('should copy a reference image if there is no difference', (done) => { - const _this = this; looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('same.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#ff00ff' }, () => { - looksSame(srcPath('ref.png'), _this.tempName, {strict: true}, (error, {equal}) => { + looksSame(srcPath('ref.png'), tempName, {strict: true}, (error, {equal}) => { expect(equal).to.equal(true); done(); }); @@ -450,28 +448,26 @@ describe('createDiff', () => { }); it('should create an image file with diff between two images', (done) => { - const _this = this; looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('different.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#ff00ff' }, () => { - expect(fs.existsSync(_this.tempName)).to.equal(true); + expect(fs.existsSync(tempName)).to.equal(true); done(); }); }); it('should ignore the differences lower then tolerance', (done) => { - const _this = this; looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('different.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#ff00ff', tolerance: 50 }, () => { - looksSame(srcPath('ref.png'), _this.tempName, {strict: true}, (error, {equal}) => { + looksSame(srcPath('ref.png'), tempName, {strict: true}, (error, {equal}) => { expect(equal).to.equal(true); done(); }); @@ -479,14 +475,13 @@ describe('createDiff', () => { }); it('should create a proper diff', (done) => { - const _this = this; looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('different.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#ff00ff' }, () => { - looksSame(imagePath('diffs/small-magenta.png'), _this.tempName, (error, {equal}) => { + looksSame(imagePath('diffs/small-magenta.png'), tempName, (error, {equal}) => { expect(equal).to.equal(true); done(); }); @@ -494,14 +489,13 @@ describe('createDiff', () => { }); it('should allow to change highlight color', (done) => { - const _this = this; looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('different.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#00FF00' }, () => { - looksSame(imagePath('diffs/small-green.png'), _this.tempName, (error, {equal}) => { + looksSame(imagePath('diffs/small-green.png'), tempName, (error, {equal}) => { expect(equal).to.equal(true); done(); }); @@ -509,13 +503,12 @@ describe('createDiff', () => { }); it('should provide a default highlight color', (done) => { - const _this = this; looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('different.png'), - diff: this.tempName + diff: tempName }, () => { - looksSame(imagePath('diffs/small-magenta.png'), _this.tempName, (error, {equal}) => { + looksSame(imagePath('diffs/small-magenta.png'), tempName, (error, {equal}) => { expect(equal).to.equal(true); done(); }); @@ -523,14 +516,13 @@ describe('createDiff', () => { }); it('should allow to build diff for taller images', (done) => { - const _this = this; looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('tall-different.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#FF00FF' }, () => { - looksSame(imagePath('diffs/taller-magenta.png'), _this.tempName, (error, {equal}) => { + looksSame(imagePath('diffs/taller-magenta.png'), tempName, (error, {equal}) => { expect(equal).to.equal(true); done(); }); @@ -538,14 +530,13 @@ describe('createDiff', () => { }); it('should allow to build diff for wider images', (done) => { - const _this = this; looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('wide-different.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#FF00FF' }, () => { - looksSame(imagePath('diffs/wider-magenta.png'), _this.tempName, (error, {equal}) => { + looksSame(imagePath('diffs/wider-magenta.png'), tempName, (error, {equal}) => { expect(equal).to.equal(true); done(); }); @@ -553,14 +544,13 @@ describe('createDiff', () => { }); it('should use non-strict comparator by default', (done) => { - const _this = this; looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('different-unnoticable.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#FF00FF' }, () => { - looksSame(srcPath('ref.png'), _this.tempName, (error, {equal}) => { + looksSame(srcPath('ref.png'), tempName, (error, {equal}) => { expect(equal).to.equal(true); done(); }); @@ -568,15 +558,14 @@ describe('createDiff', () => { }); it('should use strict comparator if strict option is true', (done) => { - const _this = this; looksSame.createDiff({ reference: srcPath('ref.png'), current: srcPath('different-unnoticable.png'), - diff: this.tempName, + diff: tempName, strict: true, highlightColor: '#FF00FF' }, () => { - looksSame(imagePath('diffs/strict.png'), _this.tempName, (error, {equal}) => { + looksSame(imagePath('diffs/strict.png'), tempName, (error, {equal}) => { expect(equal).to.equal(true); done(); }); @@ -612,15 +601,15 @@ describe('createDiff', () => { looksSame.createDiff({ reference: {source: srcPath('bounding-box-ref-1.png'), boundingBox: {left: 1, top: 1, right: 4, bottom: 4}}, current: {source: srcPath('bounding-box-ref-2.png'), boundingBox: {left: 5, top: 5, right: 8, bottom: 8}}, - diff: this.tempName, + diff: tempName, highlightColor: '#FF00FF' }, () => { looksSame( {source: srcPath('bounding-box-diff-1.png'), boundingBox: {left: 1, top: 1, right: 4, bottom: 4}}, - this.tempName, + tempName, (error, {equal}) => { assert.isNull(error); - assert.isTrue(equal, true); + assert.isTrue(equal); done(); } ); @@ -634,11 +623,11 @@ describe('createDiff', () => { looksSame.createDiff({ reference: srcPath('antialiasing-ref.png'), current: srcPath('antialiasing-actual.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#FF00FF' }, () => { looksSame( - srcPath('antialiasing-ref.png'), this.tempName, {ignoreAntialiasing: false}, + srcPath('antialiasing-ref.png'), tempName, {ignoreAntialiasing: false}, (error, {equal}) => { expect(error).to.equal(null); expect(equal).to.equal(true); @@ -652,12 +641,12 @@ describe('createDiff', () => { looksSame.createDiff({ reference: srcPath('antialiasing-ref.png'), current: srcPath('antialiasing-actual.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#FF00FF', ignoreAntialiasing: false }, () => { looksSame( - srcPath('antialiasing-ref.png'), this.tempName, {ignoreAntialiasing: false}, + srcPath('antialiasing-ref.png'), tempName, {ignoreAntialiasing: false}, (error, {equal}) => { expect(error).to.equal(null); expect(equal).to.equal(false); @@ -672,11 +661,11 @@ describe('createDiff', () => { looksSame.createDiff({ reference: srcPath('no-caret.png'), current: srcPath('1px-diff.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#FF00FF' }, () => { looksSame( - srcPath('antialiasing-ref.png'), this.tempName, + srcPath('antialiasing-ref.png'), tempName, (error, {equal}) => { expect(error).to.equal(null); expect(equal).to.equal(false); @@ -693,11 +682,11 @@ describe('createDiff', () => { looksSame.createDiff({ reference: srcPath('no-caret.png'), current: srcPath('caret.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#FF00FF' }, () => { looksSame( - srcPath('no-caret.png'), this.tempName, {ignoreCaret: false}, + srcPath('no-caret.png'), tempName, {ignoreCaret: false}, (error, {equal}) => { expect(error).to.equal(null); expect(equal).to.equal(true); @@ -711,12 +700,12 @@ describe('createDiff', () => { looksSame.createDiff({ reference: srcPath('no-caret.png'), current: srcPath('caret.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#FF00FF', ignoreCaret: false }, () => { looksSame( - srcPath('no-caret.png'), this.tempName, {ignoreCaret: false}, + srcPath('no-caret.png'), tempName, {ignoreCaret: false}, (error, {equal}) => { expect(error).to.equal(null); expect(equal).to.equal(false); @@ -731,11 +720,11 @@ describe('createDiff', () => { looksSame.createDiff({ reference: srcPath('no-caret.png'), current: srcPath('1px-diff.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#FF00FF' }, () => { looksSame( - srcPath('no-caret.png'), this.tempName, + srcPath('no-caret.png'), tempName, (error, {equal}) => { expect(error).to.equal(null); expect(equal).to.equal(false); @@ -750,13 +739,13 @@ describe('createDiff', () => { looksSame.createDiff({ reference: srcPath('caret+antialiasing.png'), current: srcPath('no-caret+antialiasing.png'), - diff: this.tempName, + diff: tempName, highlightColor: '#FF00FF', ignoreAntialiasing: true, ignoreCaret: true }, () => { looksSame( - srcPath('caret+antialiasing.png'), this.tempName, {ignoreAntialiasing: false}, + srcPath('caret+antialiasing.png'), tempName, {ignoreAntialiasing: false}, (error, {equal}) => { expect(error).to.equal(null); expect(equal).to.equal(true); diff --git a/test/utils.js b/test/utils.ts similarity index 93% rename from test/utils.js rename to test/utils.ts index aa60f80..cc1b43d 100644 --- a/test/utils.js +++ b/test/utils.ts @@ -1,7 +1,5 @@ -'use strict'; - -const {formatImages} = require('src/lib/utils'); -const validators = require('src/lib/validators'); +import {formatImages} from '../src/lib/utils'; +import * as validators from '../src/lib/validators'; describe('lib/utils', () => { const sandbox = sinon.createSandbox(); diff --git a/test/validators.js b/test/validators.ts similarity index 96% rename from test/validators.js rename to test/validators.ts index fca595f..a7645f4 100644 --- a/test/validators.js +++ b/test/validators.ts @@ -1,7 +1,5 @@ -'use strict'; - -const _ = require('lodash'); -const {validateImages} = require('src/lib/validators'); +import _ from 'lodash'; +import {validateImages} from '../src/lib/validators'; describe('lib/validators', () => { describe('validateImages', () => { From c618fba15bdcde8444b706cb7108d1ac55245178 Mon Sep 17 00:00:00 2001 From: DudaGod Date: Thu, 7 May 2020 01:21:11 +0300 Subject: [PATCH 07/10] chore: add eslint with TS support & fix problems --- .eslintignore | 1 + .eslintrc.js | 29 +- bin/copy-additional-files-to-build.sh | 2 +- package-lock.json | 1186 +++++++++++++------------ package.json | 6 +- src/index.ts | 2 +- src/lib/diff-area.ts | 2 +- src/lib/diff-clusters/index.ts | 2 +- src/lib/png/bounded-png.ts | 2 +- src/lib/png/original-png.ts | 2 +- src/lib/png/png.ts | 4 +- test/assert-ext.ts | 2 +- test/setup.ts | 3 +- test/validators.ts | 2 +- 14 files changed, 659 insertions(+), 586 deletions(-) diff --git a/.eslintignore b/.eslintignore index 1b8113a..6076960 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,3 @@ **/.* node_modules +build diff --git a/.eslintrc.js b/.eslintrc.js index ed3166b..7e1769b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,4 +1,29 @@ module.exports = { - extends: 'gemini-testing', - root: true + root: true, + parser: '@typescript-eslint/parser', + plugins: [ + '@typescript-eslint', + ], + extends: [ + 'gemini-testing', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + ], + rules: { + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-member-accessibility": "off", + "@typescript-eslint/no-explicit-any": "off", + "prefer-rest-params": "off", + "@typescript-eslint/no-use-before-define": [ + "error", + { + functions: false, + classes: false, + variables: true, + typedefs: false, + }, + ], + "@typescript-eslint/no-parameter-properties": "off", + "no-prototype-builtins": "off" + } }; diff --git a/bin/copy-additional-files-to-build.sh b/bin/copy-additional-files-to-build.sh index 3a6ce3c..3d74605 100755 --- a/bin/copy-additional-files-to-build.sh +++ b/bin/copy-additional-files-to-build.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash cp -R ./test/data ./build/test/data -cp ./src/index.d.ts ./build/src/index.d.ts +# cp ./src/index.d.ts ./build/src/index.d.ts diff --git a/package-lock.json b/package-lock.json index 4e33eac..fda31c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,32 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, "@sinonjs/commons": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.0.2.tgz", @@ -34,6 +60,24 @@ "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", "dev": true }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, "@types/mocha": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", @@ -77,6 +121,64 @@ "integrity": "sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", + "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "1.13.0", + "eslint-utils": "^1.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", + "tsutils": "^3.7.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", + "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-scope": "^4.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", + "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "1.13.0", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", + "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + } + }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -88,55 +190,71 @@ } }, "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "acorn-jsx": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", - "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", - "dev": true, - "requires": { - "acorn": "^5.0.3" - } + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true }, "ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.1" + "uri-js": "^4.2.2" } }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + } + } }, "argparse": { "version": "1.0.10", @@ -159,21 +277,6 @@ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -186,40 +289,11 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true }, "balanced-match": { "version": "1.0.0", @@ -248,19 +322,10 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { @@ -304,49 +369,20 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, "check-error": { @@ -355,25 +391,19 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, "cliui": { @@ -426,9 +456,9 @@ "integrity": "sha1-mDrn+TZnnpTjZd/kShaqFTva6I4=" }, "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "commander": { @@ -801,56 +831,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "detect-indent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", @@ -870,9 +850,9 @@ "dev": true }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -957,30 +937,6 @@ "is-arrayish": "^0.2.1" } }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -988,50 +944,77 @@ "dev": true }, "eslint": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.3.0.tgz", - "integrity": "sha512-N/tCqlMKkyNvAvLu+zI9AqDasnSLt00K+Hu8kdsERliC9jYEc8ck12XtjvOXrBKu8fK6RrBcN9bat6Xk++9jAg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { - "ajv": "^6.5.0", - "babel-code-frame": "^6.26.0", + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", "esquery": "^1.0.1", "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", + "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.2", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^5.2.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.11.0", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.5", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", + "optionator": "^0.8.3", "progress": "^2.0.0", - "regexpp": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.5.0", - "string.prototype.matchall": "^2.0.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^4.0.3", - "text-table": "^0.2.0" + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "eslint-config-gemini-testing": { @@ -1041,9 +1024,9 @@ "dev": true }, "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1051,25 +1034,29 @@ } }, "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", - "dev": true + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, "espree": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", - "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, "requires": { - "acorn": "^5.6.0", - "acorn-jsx": "^4.1.1" + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" } }, "esprima": { @@ -1079,12 +1066,20 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } } }, "esrecurse": { @@ -1097,38 +1092,38 @@ } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { @@ -1138,22 +1133,21 @@ "dev": true }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "^2.0.1" } }, "fill-keys": { @@ -1218,21 +1212,45 @@ } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "dev": true, "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "fs-access": { @@ -1267,12 +1285,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -1560,24 +1572,22 @@ "path-is-absolute": "^1.0.0" } }, - "globals": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", - "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", - "dev": true + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "type-fest": "^0.8.1" } }, "graceful-fs": { @@ -1603,36 +1613,12 @@ "uglify-js": "^3.1.4" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -1646,9 +1632,9 @@ "dev": true }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -1660,6 +1646,16 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -1694,24 +1690,91 @@ "dev": true }, "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "is-arrayish": { @@ -1720,16 +1783,10 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-finite": { @@ -1747,6 +1804,15 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -1759,63 +1825,12 @@ "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", "dev": true }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, "is-text-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", @@ -1848,15 +1863,15 @@ "integrity": "sha1-+W7Ie/GU9cCjE2X6Dh0Ht7li2JE=" }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -1989,6 +2004,12 @@ "lodash._reinterpolate": "^3.0.0" } }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "dev": true + }, "lolex": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.1.tgz", @@ -2043,9 +2064,9 @@ "dev": true }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { @@ -2131,9 +2152,9 @@ "dev": true }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "natural-compare": { @@ -2154,9 +2175,9 @@ "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==" }, "nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "nise": { @@ -2213,12 +2234,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2229,12 +2244,12 @@ } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, "optimist": { @@ -2256,17 +2271,17 @@ } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" } }, "os-tmpdir": { @@ -2299,6 +2314,15 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-color": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", @@ -2335,12 +2359,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -2414,12 +2432,6 @@ "pinkie": "^2.0.0" } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, "pngjs": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.3.tgz", @@ -2437,9 +2449,9 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "proxyquire": { @@ -2527,19 +2539,10 @@ "strip-indent": "^2.0.0" } }, - "regexp.prototype.flags": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", - "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2" - } - }, "regexpp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.0.tgz", - "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, "repeating": { @@ -2563,16 +2566,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -2580,18 +2573,18 @@ "dev": true }, "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, @@ -2621,21 +2614,18 @@ } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true }, "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "dev": true, "requires": { - "symbol-observable": "1.0.1" + "tslib": "^1.9.0" } }, "safe-buffer": { @@ -2723,11 +2713,13 @@ "dev": true }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" } }, @@ -2889,26 +2881,37 @@ } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string.prototype.matchall": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz", - "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "regexp.prototype.flags": "^1.2.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, "string_decoder": { @@ -2926,18 +2929,18 @@ "dev": true }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true } } @@ -2955,35 +2958,49 @@ "dev": true }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", "dev": true }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } }, "table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } } }, "temp": { @@ -3058,6 +3075,21 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, + "tslib": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -3073,6 +3105,12 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -3123,6 +3161,12 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -3148,10 +3192,10 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wrap-ansi": { @@ -3224,9 +3268,9 @@ "dev": true }, "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, "requires": { "mkdirp": "^0.5.1" diff --git a/package.json b/package.json index 2cd8373..ebf1bd4 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,11 @@ "@types/proxyquire": "^1.3.28", "@types/sinon": "^9.0.0", "@types/sinon-chai": "^3.2.4", + "@typescript-eslint/eslint-plugin": "^1.13.0", + "@typescript-eslint/parser": "^1.13.0", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", - "eslint": "^5.3.0", + "eslint": "^6.8.0", "eslint-config-gemini-testing": "^2.8.0", "mocha": "^5.2.0", "proxyquire": "^1.7.10", @@ -46,7 +48,7 @@ "prepare": "npm run clean && npm run build", "test": "npm run build && npm run test-unit && npm run lint", "test-unit": "mocha build/test --recursive --require ./build/test/setup", - "lint": "eslint .", + "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "release": "standard-version" }, "engines": { diff --git a/src/index.ts b/src/index.ts index 2c16a75..1375af7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -165,7 +165,7 @@ function looksSame(image1, image2, opts, callback?) { .catch(error => { callback(error); }); -}; +} looksSame.getDiffArea = function(image1, image2, opts, callback?) { if (!callback) { diff --git a/src/lib/diff-area.ts b/src/lib/diff-area.ts index 9d86247..bc3fad1 100644 --- a/src/lib/diff-area.ts +++ b/src/lib/diff-area.ts @@ -1,5 +1,5 @@ export = class DiffArea { - private _diffArea: { left: number; top: number; right: number; bottom: number; }; + private _diffArea: { left: number; top: number; right: number; bottom: number }; private _updated: boolean; static create() { diff --git a/src/lib/diff-clusters/index.ts b/src/lib/diff-clusters/index.ts index 475d6d4..46a6e4b 100644 --- a/src/lib/diff-clusters/index.ts +++ b/src/lib/diff-clusters/index.ts @@ -38,4 +38,4 @@ export default class DiffClusters { get clusters() { return clustersJoiner.join(this._clusters).map(c => c.area); } -}; +} diff --git a/src/lib/png/bounded-png.ts b/src/lib/png/bounded-png.ts index 7716ea0..d1fed2b 100644 --- a/src/lib/png/bounded-png.ts +++ b/src/lib/png/bounded-png.ts @@ -21,7 +21,7 @@ export default class BoundedPNGImage extends PNGImage { super.setPixel(actX, actY, color); } - getActualCoord(x: number, y: number): {x: number, y: number} { + getActualCoord(x: number, y: number): {x: number; y: number} { return {x: x + this._boundingBox.left, y: y + this._boundingBox.top}; } diff --git a/src/lib/png/original-png.ts b/src/lib/png/original-png.ts index 34c37a6..f92e727 100644 --- a/src/lib/png/original-png.ts +++ b/src/lib/png/original-png.ts @@ -1,7 +1,7 @@ import PNGImage from './png'; export default class OriginalPNGImage extends PNGImage { - getActualCoord(x: number, y: number): {x: number, y: number} { + getActualCoord(x: number, y: number): {x: number; y: number} { return {x, y}; } diff --git a/src/lib/png/png.ts b/src/lib/png/png.ts index 657285c..72cc6eb 100644 --- a/src/lib/png/png.ts +++ b/src/lib/png/png.ts @@ -1,7 +1,7 @@ import fs from 'fs'; import concat from 'concat-stream'; -type Constructor = new (...args: Array) => T; +type Constructor = new (...args: any[]) => T; export default abstract class PNGImage { public static create(this: Constructor, ...args): T { @@ -50,7 +50,7 @@ export default abstract class PNGImage { } } - abstract getActualCoord(x: number, y: number): {x: number, y: number}; + abstract getActualCoord(x: number, y: number): {x: number; y: number}; abstract get width(): number; abstract get height(): number; } diff --git a/test/assert-ext.ts b/test/assert-ext.ts index a4e02bc..ee292dc 100644 --- a/test/assert-ext.ts +++ b/test/assert-ext.ts @@ -10,4 +10,4 @@ export default function(chai) { assert.calledOnce(arguments[0]); assert.calledWithMatch(...arguments); }; -}; +} diff --git a/test/setup.ts b/test/setup.ts index be8cd2e..9a0048f 100644 --- a/test/setup.ts +++ b/test/setup.ts @@ -1,8 +1,9 @@ import chaiModule from 'chai'; -import sinonModule from "sinon"; +import sinonModule from 'sinon'; import sinonChai from 'sinon-chai'; import chaiAsPromised from 'chai-as-promised'; import assertExt from './assert-ext'; +// eslint-disable-next-line @typescript-eslint/no-unused-vars import mocha from 'mocha'; declare global { diff --git a/test/validators.ts b/test/validators.ts index a7645f4..093925a 100644 --- a/test/validators.ts +++ b/test/validators.ts @@ -18,7 +18,7 @@ describe('lib/validators', () => { assert.throws(() => { return validateImages( {source: 'image-path'}, - {source: 'image-path'}, + {source: 'image-path'} ); }, TypeError, 'Field "boundingBox" does not exist'); }); From b457f517a616cd50260d5a3008d596c5fbdd1c54 Mon Sep 17 00:00:00 2001 From: DudaGod Date: Sun, 10 May 2020 13:46:40 +0300 Subject: [PATCH 08/10] fix: errors --- .prettierignore | 1 + .prettierrc.json | 10 + bin/copy-additional-files-to-build.sh | 4 - package-lock.json | 607 +++++++++++++++++- package.json | 14 +- src/lib/diff-area.ts | 2 +- .../ignore-caret-comparator/states/state.ts | 8 +- test/setup.ts | 3 +- tsconfig.common.json | 21 - tsconfig.json | 19 +- 10 files changed, 645 insertions(+), 44 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc.json delete mode 100755 bin/copy-additional-files-to-build.sh delete mode 100644 tsconfig.common.json diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +build diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..ad8404d --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,10 @@ +{ + "printWidth": 120, + "useTabs": false, + "tabWidth": 4, + "semi": true, + "singleQuote": false, + "trailingComma": "all", + "bracketSpacing": true, + "arrowParens": "avoid" +} diff --git a/bin/copy-additional-files-to-build.sh b/bin/copy-additional-files-to-build.sh deleted file mode 100755 index 3d74605..0000000 --- a/bin/copy-additional-files-to-build.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash - -cp -R ./test/data ./build/test/data -# cp ./src/index.d.ts ./build/src/index.d.ts diff --git a/package-lock.json b/package-lock.json index fda31c2..e564b83 100644 --- a/package-lock.json +++ b/package-lock.json @@ -85,9 +85,9 @@ "dev": true }, "@types/node": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.0.tgz", - "integrity": "sha512-WE4IOAC6r/yBZss1oQGM5zs2D7RuKR6Q+w+X2SouPofnWn+LbCqClRyhO3ZE7Ix8nmFgo/oVuuE01cJT2XB13A==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.10.tgz", + "integrity": "sha512-Duk5LjhRghZEzSYnjpJDxuWSUrswq1TeJGxqU/vbWx9v7PiwdwgxYBMGtkAx/E2pnWrDgrxOVdbr948VnKuIuQ==", "dev": true }, "@types/proxyquire": { @@ -230,6 +230,15 @@ } } }, + "ansi-green": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", + "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -256,6 +265,12 @@ } } }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -265,6 +280,12 @@ "sprintf-js": "~1.0.2" } }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -295,12 +316,30 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async-array-reduce": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz", + "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -445,6 +484,18 @@ } } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, "color-convert": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", @@ -741,6 +792,54 @@ } } }, + "copy": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/copy/-/copy-0.3.2.tgz", + "integrity": "sha512-drDFuUZctIuvSuvL9dOF/v5GxrwB1Q8eMIRlYONC0lSMEq+L2xabXP3jme8cQFdDO8cgP8JsuYhQg7JtTwezmg==", + "dev": true, + "requires": { + "async-each": "^1.0.0", + "bluebird": "^3.4.1", + "extend-shallow": "^2.0.1", + "file-contents": "^0.3.1", + "glob-parent": "^2.0.0", + "graceful-fs": "^4.1.4", + "has-glob": "^0.1.1", + "is-absolute": "^0.2.5", + "lazy-cache": "^2.0.1", + "log-ok": "^0.1.1", + "matched": "^0.4.1", + "mkdirp": "^0.5.1", + "resolve-dir": "^0.1.0", + "to-file": "^0.2.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -831,6 +930,15 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, "detect-indent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", @@ -1103,6 +1211,24 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -1141,6 +1267,38 @@ "escape-string-regexp": "^1.0.5" } }, + "file-contents": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.3.2.tgz", + "integrity": "sha1-oJOf7RuM2hWAJm/Gt1OiMvtG3lM=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "file-stat": "^0.2.3", + "fs-exists-sync": "^0.1.0", + "graceful-fs": "^4.1.4", + "is-buffer": "^1.1.3", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "strip-bom-buffer": "^0.1.1", + "strip-bom-string": "^0.1.2", + "through2": "^2.0.1", + "vinyl": "^1.1.1" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, "file-entry-cache": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", @@ -1150,6 +1308,30 @@ "flat-cache": "^2.0.1" } }, + "file-stat": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.2.3.tgz", + "integrity": "sha1-Rpp+kn1pMAeWJM2zgQlAVFbLBqk=", + "dev": true, + "requires": { + "fs-exists-sync": "^0.1.0", + "graceful-fs": "^4.1.4", + "lazy-cache": "^2.0.1", + "through2": "^2.0.1" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, "fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", @@ -1262,6 +1444,12 @@ "null-check": "^1.0.0" } }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -1581,6 +1769,28 @@ "is-glob": "^4.0.1" } }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -1619,12 +1829,47 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-0.1.1.tgz", + "integrity": "sha1-omHEwqbGZ+DHe3AKfyl8Oe86pYk=", + "dev": true, + "requires": { + "is-glob": "^2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", @@ -1777,12 +2022,85 @@ } } }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true, + "requires": { + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1831,6 +2149,15 @@ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true, + "requires": { + "is-unc-path": "^0.1.1" + } + }, "is-text-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", @@ -1840,12 +2167,33 @@ "text-extensions": "^2.0.0" } }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.0" + } + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -1857,6 +2205,15 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, "js-graph-algorithms": { "version": "1.0.18", "resolved": "https://registry.npmjs.org/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz", @@ -1922,6 +2279,21 @@ "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", "dev": true }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -2010,6 +2382,16 @@ "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", "dev": true }, + "log-ok": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", + "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", + "dev": true, + "requires": { + "ansi-green": "^0.1.1", + "success-symbol": "^0.1.0" + } + }, "lolex": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.1.tgz", @@ -2032,6 +2414,23 @@ "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", "dev": true }, + "matched": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz", + "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "async-array-reduce": "^0.2.0", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "glob": "^7.0.5", + "has-glob": "^0.1.1", + "is-valid-glob": "^0.3.0", + "lazy-cache": "^2.0.1", + "resolve-dir": "^0.1.0" + } + }, "meow": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", @@ -2284,6 +2683,12 @@ "word-wrap": "~1.2.3" } }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -2347,6 +2752,12 @@ "json-parse-better-errors": "^1.0.1" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -2443,6 +2854,12 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prettier": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.1.tgz", + "integrity": "sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg==", + "dev": true + }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -2554,6 +2971,12 @@ "is-finite": "^1.0.0" } }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2572,6 +2995,16 @@ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2657,6 +3090,15 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -2951,6 +3393,22 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-bom-buffer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-bom-buffer/-/strip-bom-buffer-0.1.1.tgz", + "integrity": "sha1-yj3cSRnBP5/d8wsd/xAKmDUki00=", + "dev": true, + "requires": { + "is-buffer": "^1.1.0", + "is-utf8": "^0.2.0" + } + }, + "strip-bom-string": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-0.1.2.tgz", + "integrity": "sha1-nG5yCjE7qYNliVGEBcz7iKX0G5w=", + "dev": true + }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", @@ -2963,6 +3421,12 @@ "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", "dev": true }, + "success-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", + "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -3063,6 +3527,120 @@ "os-tmpdir": "~1.0.2" } }, + "to-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/to-file/-/to-file-0.2.0.tgz", + "integrity": "sha1-I2xsCIBl5XDe+9Fc9LTlZb5G6pM=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "file-contents": "^0.2.4", + "glob-parent": "^2.0.0", + "is-valid-glob": "^0.3.0", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "vinyl": "^1.1.1" + }, + "dependencies": { + "file-contents": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.2.4.tgz", + "integrity": "sha1-BQb3uO/2KvpFrkXaTfnp1H30U8s=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.0", + "file-stat": "^0.1.0", + "graceful-fs": "^4.1.2", + "is-buffer": "^1.1.0", + "is-utf8": "^0.2.0", + "lazy-cache": "^0.2.3", + "through2": "^2.0.0" + }, + "dependencies": { + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true + } + } + }, + "file-stat": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.1.3.tgz", + "integrity": "sha1-0PGWHX0QcykoEgpuaVVHHCpbVBE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "lazy-cache": "^0.2.3", + "through2": "^2.0.0" + }, + "dependencies": { + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true + } + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", @@ -3117,9 +3695,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz", + "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==", "dev": true }, "uglify-js": { @@ -3142,6 +3720,12 @@ } } }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -3177,6 +3761,17 @@ "spdx-expression-parse": "^3.0.0" } }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/package.json b/package.json index ebf1bd4..e117d16 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,6 @@ "version": "7.2.3", "description": "Pure node.js library for comparing PNG-images, taking into account human color perception.", "main": "build/src/index.js", - "types": "build/src/index.d.ts", "files": [ "build/src" ], @@ -23,7 +22,7 @@ "devDependencies": { "@types/chai": "^4.2.11", "@types/mocha": "^7.0.2", - "@types/node": "^13.13.0", + "@types/node": "^8.5.10", "@types/proxyquire": "^1.3.28", "@types/sinon": "^9.0.0", "@types/sinon-chai": "^3.2.4", @@ -31,24 +30,29 @@ "@typescript-eslint/parser": "^1.13.0", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", + "copy": "^0.3.2", "eslint": "^6.8.0", "eslint-config-gemini-testing": "^2.8.0", "mocha": "^5.2.0", + "prettier": "^1.17.1", "proxyquire": "^1.7.10", "rimraf": "^3.0.2", "sinon": "^6.1.5", "sinon-chai": "^3.3.0", "standard-version": "^7.0.0", "temp": "^0.8.3", - "typescript": "^3.8.3" + "typescript": "^3.5.1" }, "scripts": { - "build": "tsc && ./bin/copy-additional-files-to-build.sh", + "build": "tsc && copy ./test/data/**/*.png ./src/index.d.ts ./build", "clean": "rimraf build/ *.tsbuildinfo", "prepare": "npm run clean && npm run build", "test": "npm run build && npm run test-unit && npm run lint", "test-unit": "mocha build/test --recursive --require ./build/test/setup", - "lint": "eslint . --ext .js,.jsx,.ts,.tsx", + "lint": "npm run eslint && npm run style", + "reformat": "eslint src test --ext .ts --fix && prettier --write '**/*.ts' '**/*.json'", + "style": "prettier --check '**/*.ts' '**/*.json'", + "eslint": "eslint src test --ext .ts", "release": "standard-version" }, "engines": { diff --git a/src/lib/diff-area.ts b/src/lib/diff-area.ts index bc3fad1..105f662 100644 --- a/src/lib/diff-area.ts +++ b/src/lib/diff-area.ts @@ -1,4 +1,4 @@ -export = class DiffArea { +export default class DiffArea { private _diffArea: { left: number; top: number; right: number; bottom: number }; private _updated: boolean; diff --git a/src/lib/ignore-caret-comparator/states/state.ts b/src/lib/ignore-caret-comparator/states/state.ts index 386cec1..ee0483d 100644 --- a/src/lib/ignore-caret-comparator/states/state.ts +++ b/src/lib/ignore-caret-comparator/states/state.ts @@ -1,7 +1,9 @@ export default abstract class State { - constructor( - private _ctx: any - ) {} + private _ctx: any; + + constructor(comporator) { + this._ctx = comporator; + } switchState(state) { this._ctx.switchState(state); diff --git a/test/setup.ts b/test/setup.ts index 9a0048f..4b9c4ef 100644 --- a/test/setup.ts +++ b/test/setup.ts @@ -3,8 +3,7 @@ import sinonModule from 'sinon'; import sinonChai from 'sinon-chai'; import chaiAsPromised from 'chai-as-promised'; import assertExt from './assert-ext'; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import mocha from 'mocha'; +import 'mocha'; declare global { const sinon: typeof sinonModule; diff --git a/tsconfig.common.json b/tsconfig.common.json deleted file mode 100644 index 7f39994..0000000 --- a/tsconfig.common.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "include": ["src", "test"], - "compilerOptions": { - "target": "es2017", - "module": "commonjs", - "allowJs": true, - "declaration": true, - "declarationMap": false, - "sourceMap": true, - "strict": true, - "noImplicitAny": false, - "strictNullChecks": false, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "types": ["node"], - "esModuleInterop": true, - "noEmitOnError": true - } -} diff --git a/tsconfig.json b/tsconfig.json index 71530fa..50a49d1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,21 @@ { - "extends": "./tsconfig.common", + "include": ["src", "test"], "compilerOptions": { - "outDir": "build" + "outDir": "build", + "target": "es2017", + "module": "commonjs", + "declaration": true, + "declarationMap": false, + "sourceMap": true, + "strict": true, + "noImplicitAny": false, + "strictNullChecks": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "types": ["node"], + "esModuleInterop": true, + "noEmitOnError": true } } From 908786a7c97c1a6b6d88ac70c90547bb51478d3b Mon Sep 17 00:00:00 2001 From: DudaGod Date: Sun, 10 May 2020 14:00:33 +0300 Subject: [PATCH 09/10] chore: add eslint rules to correctly work with prettier --- .eslintrc.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index 7e1769b..0c74236 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -24,6 +24,9 @@ module.exports = { }, ], "@typescript-eslint/no-parameter-properties": "off", - "no-prototype-builtins": "off" + "no-prototype-builtins": "off", + "object-curly-spacing": ["error", "always"], + quotes: ["error", "double", {avoidEscape: true}], + "comma-dangle": ["error", "always-multiline"], } }; From 984c1df9be80a7ad89ccb76e1ddab46a8dee1e65 Mon Sep 17 00:00:00 2001 From: DudaGod Date: Sun, 10 May 2020 14:00:46 +0300 Subject: [PATCH 10/10] chore: reformat code using prettier --- package-lock.json | 7804 ++++++++--------- package.json | 150 +- src/index.d.ts | 313 +- src/index.ts | 115 +- src/lib/antialiasing-comparator.ts | 14 +- src/lib/constants.ts | 4 +- src/lib/diff-area.ts | 10 +- src/lib/diff-clusters/clusters-joiner.ts | 18 +- src/lib/diff-clusters/index.ts | 8 +- src/lib/ignore-caret-comparator/index.ts | 12 +- .../states/caret-detected.ts | 10 +- .../ignore-caret-comparator/states/init.ts | 26 +- src/lib/png/bounded-png.ts | 10 +- src/lib/png/index.ts | 20 +- src/lib/png/original-png.ts | 6 +- src/lib/png/png.ts | 18 +- src/lib/same-colors.ts | 6 +- src/lib/utils.ts | 44 +- src/lib/validators.ts | 10 +- test/diff-area.ts | 26 +- test/diff-clusters/clusters-joiner.ts | 16 +- test/diff-clusters/index.ts | 22 +- test/ignore-caret-comparator.ts | 156 +- test/png/index.ts | 28 +- test/setup.ts | 14 +- test/test.ts | 1225 +-- test/utils.ts | 36 +- test/validators.ts | 93 +- 28 files changed, 5150 insertions(+), 5064 deletions(-) diff --git a/package-lock.json b/package-lock.json index e564b83..f0ae2c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3994 +1,3994 @@ { - "name": "looks-same", - "version": "7.2.3", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", - "dev": true - }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@sinonjs/commons": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.0.2.tgz", - "integrity": "sha512-WR3dlgqJP4QNrLC4iXN/5/2WaLQQ0VijOOkmflqFGVJ6wLEpbSjo7c0ZeGIdtY8Crk7xBBp87sM6+Mkerz7alw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/formatio": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", - "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", - "dev": true, - "requires": { - "samsam": "1.3.0" - } - }, - "@sinonjs/samsam": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.0.0.tgz", - "integrity": "sha512-D7VxhADdZbDJ0HjUTMnSQ5xIGb4H2yWpg8k9Sf1T08zfFiQYlaxM8LZydpR4FQ2E6LZJX8IlabNZ5io4vdChwg==", - "dev": true - }, - "@types/chai": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", - "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", - "dev": true - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", - "dev": true - }, - "@types/mocha": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", - "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", - "dev": true - }, - "@types/node": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.10.tgz", - "integrity": "sha512-Duk5LjhRghZEzSYnjpJDxuWSUrswq1TeJGxqU/vbWx9v7PiwdwgxYBMGtkAx/E2pnWrDgrxOVdbr948VnKuIuQ==", - "dev": true - }, - "@types/proxyquire": { - "version": "1.3.28", - "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.28.tgz", - "integrity": "sha512-SQaNzWQ2YZSr7FqAyPPiA3FYpux2Lqh3HWMZQk47x3xbMCqgC/w0dY3dw9rGqlweDDkrySQBcaScXWeR+Yb11Q==", - "dev": true - }, - "@types/sinon": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.0.tgz", - "integrity": "sha512-v2TkYHkts4VXshMkcmot/H+ERZ2SevKa10saGaJPGCJ8vh3lKrC4u663zYEeRZxep+VbG6YRDtQ6gVqw9dYzPA==", - "dev": true, - "requires": { - "@types/sinonjs__fake-timers": "*" - } - }, - "@types/sinon-chai": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.4.tgz", - "integrity": "sha512-xq5KOWNg70PRC7dnR2VOxgYQ6paumW+4pTZP+6uTSdhpYsAUEeeT5bw6rRHHQrZ4KyR+M5ojOR+lje6TGSpUxA==", - "dev": true, - "requires": { - "@types/chai": "*", - "@types/sinon": "*" - } - }, - "@types/sinonjs__fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz", - "integrity": "sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", - "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "1.13.0", - "eslint-utils": "^1.3.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^2.0.1", - "tsutils": "^3.7.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", - "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-scope": "^4.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", - "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", - "dev": true, - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "1.13.0", - "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", - "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", - "dev": true, - "requires": { - "lodash.unescape": "4.0.1", - "semver": "5.5.0" - } - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true - }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true - }, - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "ansi-green": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", - "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - } - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async-array-reduce": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz", - "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=", - "dev": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", - "dev": true, - "requires": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", - "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" - } - }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "requires": { - "check-error": "^1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { + "name": "looks-same", + "version": "7.2.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@sinonjs/commons": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.0.2.tgz", + "integrity": "sha512-WR3dlgqJP4QNrLC4iXN/5/2WaLQQ0VijOOkmflqFGVJ6wLEpbSjo7c0ZeGIdtY8Crk7xBBp87sM6+Mkerz7alw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, + "@sinonjs/samsam": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.0.0.tgz", + "integrity": "sha512-D7VxhADdZbDJ0HjUTMnSQ5xIGb4H2yWpg8k9Sf1T08zfFiQYlaxM8LZydpR4FQ2E6LZJX8IlabNZ5io4vdChwg==", + "dev": true + }, + "@types/chai": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", + "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, + "@types/mocha": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "dev": true + }, + "@types/node": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.10.tgz", + "integrity": "sha512-Duk5LjhRghZEzSYnjpJDxuWSUrswq1TeJGxqU/vbWx9v7PiwdwgxYBMGtkAx/E2pnWrDgrxOVdbr948VnKuIuQ==", + "dev": true + }, + "@types/proxyquire": { + "version": "1.3.28", + "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.28.tgz", + "integrity": "sha512-SQaNzWQ2YZSr7FqAyPPiA3FYpux2Lqh3HWMZQk47x3xbMCqgC/w0dY3dw9rGqlweDDkrySQBcaScXWeR+Yb11Q==", + "dev": true + }, + "@types/sinon": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.0.tgz", + "integrity": "sha512-v2TkYHkts4VXshMkcmot/H+ERZ2SevKa10saGaJPGCJ8vh3lKrC4u663zYEeRZxep+VbG6YRDtQ6gVqw9dYzPA==", + "dev": true, + "requires": { + "@types/sinonjs__fake-timers": "*" + } + }, + "@types/sinon-chai": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.4.tgz", + "integrity": "sha512-xq5KOWNg70PRC7dnR2VOxgYQ6paumW+4pTZP+6uTSdhpYsAUEeeT5bw6rRHHQrZ4KyR+M5ojOR+lje6TGSpUxA==", + "dev": true, + "requires": { + "@types/chai": "*", + "@types/sinon": "*" + } + }, + "@types/sinonjs__fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz", + "integrity": "sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", + "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "1.13.0", + "eslint-utils": "^1.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", + "tsutils": "^3.7.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", + "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-scope": "^4.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", + "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "1.13.0", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", + "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + } + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-green": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", + "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + } + } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" - }, - "color-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/color-diff/-/color-diff-1.1.0.tgz", - "integrity": "sha1-mDrn+TZnnpTjZd/kShaqFTva6I4=" - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "compare-func": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", - "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^3.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "conventional-changelog": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.9.tgz", - "integrity": "sha512-JbNVm1iGZ3aXxcFZjqKNDNfdgchQjSltWc8rvSniMrkHLsub9Wn20/JLdJNTBM74dt1IA2M+v/mzServ6N37YA==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.3", - "conventional-changelog-atom": "^2.0.1", - "conventional-changelog-codemirror": "^2.0.1", - "conventional-changelog-conventionalcommits": "^4.0.0", - "conventional-changelog-core": "^3.2.3", - "conventional-changelog-ember": "^2.0.2", - "conventional-changelog-eslint": "^3.0.2", - "conventional-changelog-express": "^2.0.1", - "conventional-changelog-jquery": "^3.0.4", - "conventional-changelog-jshint": "^2.0.1", - "conventional-changelog-preset-loader": "^2.1.1" - } - }, - "conventional-changelog-angular": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.5.tgz", - "integrity": "sha512-RrkdWnL/TVyWV1ayWmSsrWorsTDqjL/VwG5ZSEneBQrd65ONcfeA1cW7FLtNweQyMiKOyriCMTKRSlk18DjTrw==", - "dev": true, - "requires": { - "compare-func": "^1.3.1", - "q": "^1.5.1" - } - }, - "conventional-changelog-atom": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz", - "integrity": "sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-codemirror": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz", - "integrity": "sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-config-spec": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.0.0.tgz", - "integrity": "sha512-zQmcBP/pR8tN5MSv+nXG9hOmy+Z6rgEquBerpoEbOKTFPLoxBy/adeUUpshrMpqdZ/ycqbT2AgdTtiIu/9IHGg==", - "dev": true - }, - "conventional-changelog-conventionalcommits": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.1.tgz", - "integrity": "sha512-vC02KucnkNNap+foDKFm7BVUSDAXktXrUJqGszUuYnt6T0J2azsbYz/w9TDc3VsrW2v6JOtiQWVcgZnporHr4Q==", - "dev": true, - "requires": { - "compare-func": "^1.3.1", - "lodash": "^4.2.1", - "q": "^1.5.1" - } - }, - "conventional-changelog-core": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz", - "integrity": "sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==", - "dev": true, - "requires": { - "conventional-changelog-writer": "^4.0.6", - "conventional-commits-parser": "^3.0.3", - "dateformat": "^3.0.0", - "get-pkg-repo": "^1.0.0", - "git-raw-commits": "2.0.0", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^2.0.3", - "lodash": "^4.2.1", - "normalize-package-data": "^2.3.5", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^3.0.0" - }, - "dependencies": { - "git-semver-tags": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.3.tgz", - "integrity": "sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==", - "dev": true, - "requires": { - "meow": "^4.0.0", - "semver": "^6.0.0" - } + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async-array-reduce": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz", + "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" + }, + "color-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/color-diff/-/color-diff-1.1.0.tgz", + "integrity": "sha1-mDrn+TZnnpTjZd/kShaqFTva6I4=" + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "conventional-changelog-ember": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz", - "integrity": "sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-eslint": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz", - "integrity": "sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-express": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz", - "integrity": "sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-jquery": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz", - "integrity": "sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-jshint": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz", - "integrity": "sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw==", - "dev": true, - "requires": { - "compare-func": "^1.3.1", - "q": "^1.5.1" - } - }, - "conventional-changelog-preset-loader": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.2.0.tgz", - "integrity": "sha512-zXB+5vF7D5Y3Cb/rJfSyCCvFphCVmF8mFqOdncX3BmjZwAtGAPfYrBcT225udilCKvBbHgyzgxqz2GWDB5xShQ==", - "dev": true - }, - "conventional-changelog-writer": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.9.tgz", - "integrity": "sha512-2Y3QfiAM37WvDMjkVNaRtZgxVzWKj73HE61YQ/95T53yle+CRwTVSl6Gbv/lWVKXeZcM5af9n9TDVf0k7Xh+cw==", - "dev": true, - "requires": { - "compare-func": "^1.3.1", - "conventional-commits-filter": "^2.0.2", - "dateformat": "^3.0.0", - "handlebars": "^4.4.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.2.1", - "meow": "^4.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "conventional-commits-filter": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz", - "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.5.tgz", - "integrity": "sha512-qVz9+5JwdJzsbt7JbJ6P7NOXBGt8CyLFJYSjKAuPSgO+5UGfcsbk9EMR+lI8Unlvx6qwIc2YDJlrGIfay2ehNA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^2.0.0", - "lodash": "^4.2.1", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^3.0.0", - "trim-off-newlines": "^1.0.0" - } - }, - "conventional-recommended-bump": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.0.tgz", - "integrity": "sha512-iIHkDOuWCC49J/E4WXvXBCCrO2NoGqwjfhm2iUOHPPEik8TVHxczt/hFaWY+4MXeZ/nC53BNfjmlr8+EXOrlvA==", - "dev": true, - "requires": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.2.0", - "conventional-commits-filter": "^2.0.2", - "conventional-commits-parser": "^3.0.3", - "git-raw-commits": "2.0.0", - "git-semver-tags": "^3.0.0", - "meow": "^4.0.0", - "q": "^1.5.1" - }, - "dependencies": { "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "copy": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/copy/-/copy-0.3.2.tgz", - "integrity": "sha512-drDFuUZctIuvSuvL9dOF/v5GxrwB1Q8eMIRlYONC0lSMEq+L2xabXP3jme8cQFdDO8cgP8JsuYhQg7JtTwezmg==", - "dev": true, - "requires": { - "async-each": "^1.0.0", - "bluebird": "^3.4.1", - "extend-shallow": "^2.0.1", - "file-contents": "^0.3.1", - "glob-parent": "^2.0.0", - "graceful-fs": "^4.1.4", - "has-glob": "^0.1.1", - "is-absolute": "^0.2.5", - "lazy-cache": "^2.0.1", - "log-ok": "^0.1.1", - "matched": "^0.4.1", - "mkdirp": "^0.5.1", - "resolve-dir": "^0.1.0", - "to-file": "^0.2.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } + "conventional-changelog": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.9.tgz", + "integrity": "sha512-JbNVm1iGZ3aXxcFZjqKNDNfdgchQjSltWc8rvSniMrkHLsub9Wn20/JLdJNTBM74dt1IA2M+v/mzServ6N37YA==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.3", + "conventional-changelog-atom": "^2.0.1", + "conventional-changelog-codemirror": "^2.0.1", + "conventional-changelog-conventionalcommits": "^4.0.0", + "conventional-changelog-core": "^3.2.3", + "conventional-changelog-ember": "^2.0.2", + "conventional-changelog-eslint": "^3.0.2", + "conventional-changelog-express": "^2.0.1", + "conventional-changelog-jquery": "^3.0.4", + "conventional-changelog-jshint": "^2.0.1", + "conventional-changelog-preset-loader": "^2.1.1" + } }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "conventional-changelog-angular": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.5.tgz", + "integrity": "sha512-RrkdWnL/TVyWV1ayWmSsrWorsTDqjL/VwG5ZSEneBQrd65ONcfeA1cW7FLtNweQyMiKOyriCMTKRSlk18DjTrw==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", - "dev": true - }, - "detect-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.0.0.tgz", - "integrity": "sha512-JAP22dVPAqvhdRFFxK1G5GViIokyUn0UWXRNW0ztK96fsqi9cuM8w8ESbSk+T2w5OVorcMcL6m7yUg1RrX+2CA==", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotgitignore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", - "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "minimatch": "^3.0.4" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } + "conventional-changelog-atom": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz", + "integrity": "sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg==", + "dev": true, + "requires": { + "q": "^1.5.1" + } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } + "conventional-changelog-codemirror": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz", + "integrity": "sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q==", + "dev": true, + "requires": { + "q": "^1.5.1" + } }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } + "conventional-changelog-config-spec": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.0.0.tgz", + "integrity": "sha512-zQmcBP/pR8tN5MSv+nXG9hOmy+Z6rgEquBerpoEbOKTFPLoxBy/adeUUpshrMpqdZ/ycqbT2AgdTtiIu/9IHGg==", + "dev": true + }, + "conventional-changelog-conventionalcommits": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.1.tgz", + "integrity": "sha512-vC02KucnkNNap+foDKFm7BVUSDAXktXrUJqGszUuYnt6T0J2azsbYz/w9TDc3VsrW2v6JOtiQWVcgZnporHr4Q==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "lodash": "^4.2.1", + "q": "^1.5.1" + } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } + "conventional-changelog-core": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz", + "integrity": "sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==", + "dev": true, + "requires": { + "conventional-changelog-writer": "^4.0.6", + "conventional-commits-parser": "^3.0.3", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "2.0.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^2.0.3", + "lodash": "^4.2.1", + "normalize-package-data": "^2.3.5", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^3.0.0" + }, + "dependencies": { + "git-semver-tags": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.3.tgz", + "integrity": "sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==", + "dev": true, + "requires": { + "meow": "^4.0.0", + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "conventional-changelog-ember": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz", + "integrity": "sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz", + "integrity": "sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-express": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz", + "integrity": "sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz", + "integrity": "sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz", + "integrity": "sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.2.0.tgz", + "integrity": "sha512-zXB+5vF7D5Y3Cb/rJfSyCCvFphCVmF8mFqOdncX3BmjZwAtGAPfYrBcT225udilCKvBbHgyzgxqz2GWDB5xShQ==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.9.tgz", + "integrity": "sha512-2Y3QfiAM37WvDMjkVNaRtZgxVzWKj73HE61YQ/95T53yle+CRwTVSl6Gbv/lWVKXeZcM5af9n9TDVf0k7Xh+cw==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^2.0.2", + "dateformat": "^3.0.0", + "handlebars": "^4.4.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz", + "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.5.tgz", + "integrity": "sha512-qVz9+5JwdJzsbt7JbJ6P7NOXBGt8CyLFJYSjKAuPSgO+5UGfcsbk9EMR+lI8Unlvx6qwIc2YDJlrGIfay2ehNA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^2.0.0", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^3.0.0", + "trim-off-newlines": "^1.0.0" + } + }, + "conventional-recommended-bump": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.0.tgz", + "integrity": "sha512-iIHkDOuWCC49J/E4WXvXBCCrO2NoGqwjfhm2iUOHPPEik8TVHxczt/hFaWY+4MXeZ/nC53BNfjmlr8+EXOrlvA==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.2.0", + "conventional-commits-filter": "^2.0.2", + "conventional-commits-parser": "^3.0.3", + "git-raw-commits": "2.0.0", + "git-semver-tags": "^3.0.0", + "meow": "^4.0.0", + "q": "^1.5.1" + }, + "dependencies": { + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "copy": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/copy/-/copy-0.3.2.tgz", + "integrity": "sha512-drDFuUZctIuvSuvL9dOF/v5GxrwB1Q8eMIRlYONC0lSMEq+L2xabXP3jme8cQFdDO8cgP8JsuYhQg7JtTwezmg==", + "dev": true, + "requires": { + "async-each": "^1.0.0", + "bluebird": "^3.4.1", + "extend-shallow": "^2.0.1", + "file-contents": "^0.3.1", + "glob-parent": "^2.0.0", + "graceful-fs": "^4.1.4", + "has-glob": "^0.1.1", + "is-absolute": "^0.2.5", + "lazy-cache": "^2.0.1", + "log-ok": "^0.1.1", + "matched": "^0.4.1", + "mkdirp": "^0.5.1", + "resolve-dir": "^0.1.0", + "to-file": "^0.2.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "dev": true + }, + "detect-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.0.0.tgz", + "integrity": "sha512-JAP22dVPAqvhdRFFxK1G5GViIokyUn0UWXRNW0ztK96fsqi9cuM8w8ESbSk+T2w5OVorcMcL6m7yUg1RrX+2CA==", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotgitignore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", + "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "minimatch": "^3.0.4" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-config-gemini-testing": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-gemini-testing/-/eslint-config-gemini-testing-2.8.0.tgz", + "integrity": "sha512-zp9yStBk+Yplm0QpeyvgLPZA12wzDsWpvzi/YiN+GLSrt9ilq0NbNvFOp5KEFvnJNh57s8SioeIbv+jJX2BBQA==", + "dev": true + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-config-gemini-testing": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-gemini-testing/-/eslint-config-gemini-testing-2.8.0.tgz", - "integrity": "sha512-zp9yStBk+Yplm0QpeyvgLPZA12wzDsWpvzi/YiN+GLSrt9ilq0NbNvFOp5KEFvnJNh57s8SioeIbv+jJX2BBQA==", - "dev": true - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-contents": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.3.2.tgz", - "integrity": "sha1-oJOf7RuM2hWAJm/Gt1OiMvtG3lM=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "file-stat": "^0.2.3", - "fs-exists-sync": "^0.1.0", - "graceful-fs": "^4.1.4", - "is-buffer": "^1.1.3", - "isobject": "^2.1.0", - "lazy-cache": "^2.0.1", - "strip-bom-buffer": "^0.1.1", - "strip-bom-string": "^0.1.2", - "through2": "^2.0.1", - "vinyl": "^1.1.1" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "file-stat": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.2.3.tgz", - "integrity": "sha1-Rpp+kn1pMAeWJM2zgQlAVFbLBqk=", - "dev": true, - "requires": { - "fs-exists-sync": "^0.1.0", - "graceful-fs": "^4.1.4", - "lazy-cache": "^2.0.1", - "through2": "^2.0.1" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "fill-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", - "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", - "dev": true, - "requires": { - "is-object": "~1.0.1", - "merge-descriptors": "~1.0.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "dependencies": { - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-contents": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.3.2.tgz", + "integrity": "sha1-oJOf7RuM2hWAJm/Gt1OiMvtG3lM=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "file-stat": "^0.2.3", + "fs-exists-sync": "^0.1.0", + "graceful-fs": "^4.1.4", + "is-buffer": "^1.1.3", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "strip-bom-buffer": "^0.1.1", + "strip-bom-string": "^0.1.2", + "through2": "^2.0.1", + "vinyl": "^1.1.1" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-stat": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.2.3.tgz", + "integrity": "sha1-Rpp+kn1pMAeWJM2zgQlAVFbLBqk=", + "dev": true, + "requires": { + "fs-exists-sync": "^0.1.0", + "graceful-fs": "^4.1.4", + "lazy-cache": "^2.0.1", + "through2": "^2.0.1" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "fill-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", + "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", + "dev": true, + "requires": { + "is-object": "~1.0.1", + "merge-descriptors": "~1.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "dependencies": { + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "git-raw-commits": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", + "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", + "dev": true, + "requires": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } + }, + "git-semver-tags": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.0.tgz", + "integrity": "sha512-T4C/gJ9k2Bnxz+PubtcyiMtUUKrC+Nh9Q4zaECcnmVMwJgPhrNyP/Rf+YpdRqsJbCV/+kYrCH24Xg+IeAmbOPg==", + "dev": true, + "requires": { + "meow": "^4.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "^1.3.2" + } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "^1.0.0" - } - }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "meow": "^3.3.0", - "normalize-package-data": "^2.3.0", - "parse-github-repo-url": "^1.3.0", - "through2": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "handlebars": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.5.tgz", + "integrity": "sha512-0Ce31oWVB7YidkaTq33ZxEbN+UDxMMgThvCe8ptgQViymL5DPis9uLdTA13MiRPhgvqyxIegugrP97iK3JeBHg==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-0.1.1.tgz", + "integrity": "sha1-omHEwqbGZ+DHe3AKfyl8Oe86pYk=", + "dev": true, + "requires": { + "is-glob": "^2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true, + "requires": { + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true, + "requires": { + "is-unc-path": "^0.1.1" + } + }, + "is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "requires": { + "text-extensions": "^2.0.0" + } + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "js-graph-algorithms": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz", + "integrity": "sha1-+W7Ie/GU9cCjE2X6Dh0Ht7li2JE=" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "just-extend": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", + "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } }, "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "dev": true + }, + "log-ok": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", + "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", + "dev": true, + "requires": { + "ansi-green": "^0.1.1", + "success-symbol": "^0.1.0" + } + }, + "lolex": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.1.tgz", + "integrity": "sha512-Oo2Si3RMKV3+lV5MsSWplDQFoTClz/24S0MMHYcgGWWmFXr6TMlqcqk/l1GtH+d5wLBwNRiqGnwDRMirtFalJw==", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } }, "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "matched": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz", + "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "async-array-reduce": "^0.2.0", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "glob": "^7.0.5", + "has-glob": "^0.1.1", + "is-valid-glob": "^0.3.0", + "lazy-cache": "^2.0.1", + "resolve-dir": "^0.1.0" + } }, "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "module-not-found-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", + "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "nise": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.2.tgz", + "integrity": "sha512-BxH/DxoQYYdhKgVAfqVy4pzXRZELHOIewzoesxpjYvpU+7YOalQhGNPf7wAx8pLrTNPrHRDlLOkAl8UI0ZpXjw==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^2.0.0", + "just-extend": "^1.1.27", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", + "requires": { + "color-convert": "~0.5.0" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pngjs": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.3.tgz", + "integrity": "sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.1.tgz", + "integrity": "sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "proxyquire": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.7.10.tgz", + "integrity": "sha1-db4HcKgRiPTQi9Ad/DC3ZzZaog0=", + "dev": true, + "requires": { + "fill-keys": "^1.0.2", + "module-not-found-error": "^1.0.0", + "resolve": "~1.1.7" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } }, "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } }, "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", - "dev": true, - "requires": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", - "dev": true, - "requires": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - } - }, - "git-semver-tags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-3.0.0.tgz", - "integrity": "sha512-T4C/gJ9k2Bnxz+PubtcyiMtUUKrC+Nh9Q4zaECcnmVMwJgPhrNyP/Rf+YpdRqsJbCV/+kYrCH24Xg+IeAmbOPg==", - "dev": true, - "requires": { - "meow": "^4.0.0", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "dev": true, - "requires": { - "ini": "^1.3.2" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "dev": true, - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "handlebars": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.5.tgz", - "integrity": "sha512-0Ce31oWVB7YidkaTq33ZxEbN+UDxMMgThvCe8ptgQViymL5DPis9uLdTA13MiRPhgvqyxIegugrP97iK3JeBHg==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-0.1.1.tgz", - "integrity": "sha1-omHEwqbGZ+DHe3AKfyl8Oe86pYk=", - "dev": true, - "requires": { - "is-glob": "^2.0.1" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "dev": true, - "requires": { - "is-relative": "^0.2.1", - "is-windows": "^0.2.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "dev": true, - "requires": { - "is-unc-path": "^0.1.1" - } - }, - "is-text-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", - "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", - "dev": true, - "requires": { - "text-extensions": "^2.0.0" - } - }, - "is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.0" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "js-graph-algorithms": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz", - "integrity": "sha1-+W7Ie/GU9cCjE2X6Dh0Ht7li2JE=" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "just-extend": { - "version": "1.1.27", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", - "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "dev": true, - "requires": { - "set-getter": "^0.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", - "dev": true - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.unescape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", - "dev": true - }, - "log-ok": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", - "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", - "dev": true, - "requires": { - "ansi-green": "^0.1.1", - "success-symbol": "^0.1.0" - } - }, - "lolex": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.1.tgz", - "integrity": "sha512-Oo2Si3RMKV3+lV5MsSWplDQFoTClz/24S0MMHYcgGWWmFXr6TMlqcqk/l1GtH+d5wLBwNRiqGnwDRMirtFalJw==", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "matched": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz", - "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "async-array-reduce": "^0.2.0", - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "glob": "^7.0.5", - "has-glob": "^0.1.1", - "is-valid-glob": "^0.3.0", - "lazy-cache": "^2.0.1", - "resolve-dir": "^0.1.0" - } - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "module-not-found-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", - "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "nise": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.2.tgz", - "integrity": "sha512-BxH/DxoQYYdhKgVAfqVy4pzXRZELHOIewzoesxpjYvpU+7YOalQhGNPf7wAx8pLrTNPrHRDlLOkAl8UI0ZpXjw==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^2.0.0", - "just-extend": "^1.1.27", - "lolex": "^2.3.2", - "path-to-regexp": "^1.7.0", - "text-encoding": "^0.6.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-color": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", - "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", - "requires": { - "color-convert": "~0.5.0" - } - }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pngjs": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.3.tgz", - "integrity": "sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q==" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prettier": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.1.tgz", - "integrity": "sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "proxyquire": { - "version": "1.7.10", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.7.10.tgz", - "integrity": "sha1-db4HcKgRiPTQi9Ad/DC3ZzZaog0=", - "dev": true, - "requires": { - "fill-keys": "^1.0.2", - "module-not-found-error": "^1.0.0", - "resolve": "~1.1.7" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "dev": true, - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", - "dev": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-getter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "dev": true, - "requires": { - "to-object-path": "^0.3.0" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "sinon": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-6.1.5.tgz", - "integrity": "sha512-TcbRoWs1SdY6NOqfj0c9OEQquBoZH+qEf8799m1jjcbfWrrpyCQ3B/BpX7+NKa7Vn33Jl+Z50H4Oys3bzygK2Q==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.0.1", - "@sinonjs/formatio": "^2.0.0", - "@sinonjs/samsam": "^2.0.0", - "diff": "^3.5.0", - "lodash.get": "^4.4.2", - "lolex": "^2.7.1", - "nise": "^1.4.2", - "supports-color": "^5.4.0", - "type-detect": "^4.0.8" - }, - "dependencies": { - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "sinon-chai": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.3.0.tgz", - "integrity": "sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "requires": { - "through2": "^2.0.2" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "standard-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-7.0.0.tgz", - "integrity": "sha512-pbFXM9vutnxTkSGkqSWQeYCMYqWmFBaLUNdEc/sJDQnMgwB0Csw3CZeeDhi62VoVS3P8mQiYbvXGZWyOBWxUbw==", - "dev": true, - "requires": { - "chalk": "2.4.2", - "conventional-changelog": "3.1.9", - "conventional-changelog-config-spec": "2.0.0", - "conventional-recommended-bump": "6.0.0", - "detect-indent": "6.0.0", - "detect-newline": "3.0.0", - "dotgitignore": "2.1.0", - "figures": "3.0.0", - "find-up": "4.1.0", - "fs-access": "1.0.1", - "git-semver-tags": "3.0.0", - "semver": "6.3.0", - "stringify-package": "1.0.0", - "yargs": "13.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sinon": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-6.1.5.tgz", + "integrity": "sha512-TcbRoWs1SdY6NOqfj0c9OEQquBoZH+qEf8799m1jjcbfWrrpyCQ3B/BpX7+NKa7Vn33Jl+Z50H4Oys3bzygK2Q==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.0.1", + "@sinonjs/formatio": "^2.0.0", + "@sinonjs/samsam": "^2.0.0", + "diff": "^3.5.0", + "lodash.get": "^4.4.2", + "lolex": "^2.7.1", + "nise": "^1.4.2", + "supports-color": "^5.4.0", + "type-detect": "^4.0.8" + }, + "dependencies": { + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "sinon-chai": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.3.0.tgz", + "integrity": "sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } }, - "figures": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", - "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "^2.0.2" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-package": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.0.tgz", - "integrity": "sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-bom-buffer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-bom-buffer/-/strip-bom-buffer-0.1.1.tgz", - "integrity": "sha1-yj3cSRnBP5/d8wsd/xAKmDUki00=", - "dev": true, - "requires": { - "is-buffer": "^1.1.0", - "is-utf8": "^0.2.0" - } - }, - "strip-bom-string": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-0.1.2.tgz", - "integrity": "sha1-nG5yCjE7qYNliVGEBcz7iKX0G5w=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", - "dev": true - }, - "success-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", - "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "standard-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-7.0.0.tgz", + "integrity": "sha512-pbFXM9vutnxTkSGkqSWQeYCMYqWmFBaLUNdEc/sJDQnMgwB0Csw3CZeeDhi62VoVS3P8mQiYbvXGZWyOBWxUbw==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "conventional-changelog": "3.1.9", + "conventional-changelog-config-spec": "2.0.0", + "conventional-recommended-bump": "6.0.0", + "detect-indent": "6.0.0", + "detect-newline": "3.0.0", + "dotgitignore": "2.1.0", + "figures": "3.0.0", + "find-up": "4.1.0", + "fs-access": "1.0.1", + "git-semver-tags": "3.0.0", + "semver": "6.3.0", + "stringify-package": "1.0.0", + "yargs": "13.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "figures": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", + "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } - } - }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "dev": true, - "requires": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, - "text-encoding": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", - "dev": true - }, - "text-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.0.0.tgz", - "integrity": "sha512-F91ZqLgvi1E0PdvmxMgp+gcf6q8fMH7mhdwWfzXnl1k+GbpQDmi8l7DzLC5JTASKbwpY3TfxajAUzAXcv2NmsQ==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/to-file/-/to-file-0.2.0.tgz", - "integrity": "sha1-I2xsCIBl5XDe+9Fc9LTlZb5G6pM=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "file-contents": "^0.2.4", - "glob-parent": "^2.0.0", - "is-valid-glob": "^0.3.0", - "isobject": "^2.1.0", - "lazy-cache": "^2.0.1", - "vinyl": "^1.1.1" - }, - "dependencies": { - "file-contents": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.2.4.tgz", - "integrity": "sha1-BQb3uO/2KvpFrkXaTfnp1H30U8s=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.0", - "file-stat": "^0.1.0", - "graceful-fs": "^4.1.2", - "is-buffer": "^1.1.0", - "is-utf8": "^0.2.0", - "lazy-cache": "^0.2.3", - "through2": "^2.0.0" - }, - "dependencies": { - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", - "dev": true - } - } + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } }, - "file-stat": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.1.3.tgz", - "integrity": "sha1-0PGWHX0QcykoEgpuaVVHHCpbVBE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "lazy-cache": "^0.2.3", - "through2": "^2.0.0" - }, - "dependencies": { - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", - "dev": true - } - } + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } + "stringify-package": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.0.tgz", + "integrity": "sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g==", + "dev": true }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-bom-buffer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-bom-buffer/-/strip-bom-buffer-0.1.1.tgz", + "integrity": "sha1-yj3cSRnBP5/d8wsd/xAKmDUki00=", + "dev": true, + "requires": { + "is-buffer": "^1.1.0", + "is-utf8": "^0.2.0" + } + }, + "strip-bom-string": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-0.1.2.tgz", + "integrity": "sha1-nG5yCjE7qYNliVGEBcz7iKX0G5w=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "dev": true + }, + "success-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", + "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + } + } + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, + "text-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.0.0.tgz", + "integrity": "sha512-F91ZqLgvi1E0PdvmxMgp+gcf6q8fMH7mhdwWfzXnl1k+GbpQDmi8l7DzLC5JTASKbwpY3TfxajAUzAXcv2NmsQ==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", - "dev": true - }, - "tslib": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", - "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==", - "dev": true - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typescript": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz", - "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==", - "dev": true - }, - "uglify-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.4.tgz", - "integrity": "sha512-9Yc2i881pF4BPGhjteCXQNaXx1DCwm3dtOyBaG2hitHjLWOczw/ki8vD1bqyT3u6K0Ms/FpCShkmfg+FtlOfYA==", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - } - } - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } + "to-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/to-file/-/to-file-0.2.0.tgz", + "integrity": "sha1-I2xsCIBl5XDe+9Fc9LTlZb5G6pM=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "file-contents": "^0.2.4", + "glob-parent": "^2.0.0", + "is-valid-glob": "^0.3.0", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "vinyl": "^1.1.1" + }, + "dependencies": { + "file-contents": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.2.4.tgz", + "integrity": "sha1-BQb3uO/2KvpFrkXaTfnp1H30U8s=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.0", + "file-stat": "^0.1.0", + "graceful-fs": "^4.1.2", + "is-buffer": "^1.1.0", + "is-utf8": "^0.2.0", + "lazy-cache": "^0.2.3", + "through2": "^2.0.0" + }, + "dependencies": { + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true + } + } + }, + "file-stat": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.1.3.tgz", + "integrity": "sha1-0PGWHX0QcykoEgpuaVVHHCpbVBE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "lazy-cache": "^0.2.3", + "through2": "^2.0.0" + }, + "dependencies": { + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true + } + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "tslib": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz", + "integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==", + "dev": true + }, + "uglify-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.4.tgz", + "integrity": "sha512-9Yc2i881pF4BPGhjteCXQNaXx1DCwm3dtOyBaG2hitHjLWOczw/ki8vD1bqyT3u6K0Ms/FpCShkmfg+FtlOfYA==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + } + } }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } } - } } - } } diff --git a/package.json b/package.json index e117d16..5f291ae 100644 --- a/package.json +++ b/package.json @@ -1,77 +1,77 @@ { - "name": "looks-same", - "version": "7.2.3", - "description": "Pure node.js library for comparing PNG-images, taking into account human color perception.", - "main": "build/src/index.js", - "files": [ - "build/src" - ], - "directories": { - "test": "test" - }, - "dependencies": { - "color-diff": "^1.1.0", - "concat-stream": "^1.6.2", - "fs-extra": "^8.1.0", - "js-graph-algorithms": "1.0.18", - "lodash": "^4.17.3", - "nested-error-stacks": "^2.1.0", - "parse-color": "^1.0.0", - "pngjs": "^3.3.3" - }, - "devDependencies": { - "@types/chai": "^4.2.11", - "@types/mocha": "^7.0.2", - "@types/node": "^8.5.10", - "@types/proxyquire": "^1.3.28", - "@types/sinon": "^9.0.0", - "@types/sinon-chai": "^3.2.4", - "@typescript-eslint/eslint-plugin": "^1.13.0", - "@typescript-eslint/parser": "^1.13.0", - "chai": "^4.1.2", - "chai-as-promised": "^7.1.1", - "copy": "^0.3.2", - "eslint": "^6.8.0", - "eslint-config-gemini-testing": "^2.8.0", - "mocha": "^5.2.0", - "prettier": "^1.17.1", - "proxyquire": "^1.7.10", - "rimraf": "^3.0.2", - "sinon": "^6.1.5", - "sinon-chai": "^3.3.0", - "standard-version": "^7.0.0", - "temp": "^0.8.3", - "typescript": "^3.5.1" - }, - "scripts": { - "build": "tsc && copy ./test/data/**/*.png ./src/index.d.ts ./build", - "clean": "rimraf build/ *.tsbuildinfo", - "prepare": "npm run clean && npm run build", - "test": "npm run build && npm run test-unit && npm run lint", - "test-unit": "mocha build/test --recursive --require ./build/test/setup", - "lint": "npm run eslint && npm run style", - "reformat": "eslint src test --ext .ts --fix && prettier --write '**/*.ts' '**/*.json'", - "style": "prettier --check '**/*.ts' '**/*.json'", - "eslint": "eslint src test --ext .ts", - "release": "standard-version" - }, - "engines": { - "node": ">= 8.0.0" - }, - "author": "Sergey Tatarintsev (https://github.com/SevInf)", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/gemini-testing/looks-same.git" - }, - "keywords": [ - "png", - "compare", - "ciede2000", - "diff" - ], - "bugs": { - "url": "https://github.com/gemini-testing/looks-same/issues" - }, - "homepage": "https://github.com/gemini-testing/looks-same" + "name": "looks-same", + "version": "7.2.2", + "description": "Pure node.js library for comparing PNG-images, taking into account human color perception.", + "main": "build/src/index.js", + "files": [ + "build/src" + ], + "directories": { + "test": "test" + }, + "dependencies": { + "color-diff": "^1.1.0", + "concat-stream": "^1.6.2", + "fs-extra": "^8.1.0", + "js-graph-algorithms": "1.0.18", + "lodash": "^4.17.3", + "nested-error-stacks": "^2.1.0", + "parse-color": "^1.0.0", + "pngjs": "^3.3.3" + }, + "devDependencies": { + "@types/chai": "^4.2.11", + "@types/mocha": "^7.0.2", + "@types/node": "^8.5.10", + "@types/proxyquire": "^1.3.28", + "@types/sinon": "^9.0.0", + "@types/sinon-chai": "^3.2.4", + "@typescript-eslint/eslint-plugin": "^1.13.0", + "@typescript-eslint/parser": "^1.13.0", + "chai": "^4.1.2", + "chai-as-promised": "^7.1.1", + "copy": "^0.3.2", + "eslint": "^6.8.0", + "eslint-config-gemini-testing": "^2.8.0", + "mocha": "^5.2.0", + "prettier": "^1.17.1", + "proxyquire": "^1.7.10", + "rimraf": "^3.0.2", + "sinon": "^6.1.5", + "sinon-chai": "^3.3.0", + "standard-version": "^7.0.0", + "temp": "^0.8.3", + "typescript": "^3.5.1" + }, + "scripts": { + "build": "tsc && copy ./test/data/**/*.png ./src/index.d.ts ./build", + "clean": "rimraf build/ *.tsbuildinfo", + "prepare": "npm run clean && npm run build", + "test": "npm run build && npm run test-unit && npm run lint", + "test-unit": "mocha build/test --recursive --require ./build/test/setup", + "lint": "npm run eslint && npm run style", + "reformat": "eslint src test --ext .ts --fix && prettier --write '**/*.ts' '**/*.json'", + "style": "prettier --check '**/*.ts' '**/*.json'", + "eslint": "eslint src test --ext .ts", + "release": "standard-version" + }, + "engines": { + "node": ">= 8.0.0" + }, + "author": "Sergey Tatarintsev (https://github.com/SevInf)", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/gemini-testing/looks-same.git" + }, + "keywords": [ + "png", + "compare", + "ciede2000", + "diff" + ], + "bugs": { + "url": "https://github.com/gemini-testing/looks-same/issues" + }, + "homepage": "https://github.com/gemini-testing/looks-same" } diff --git a/src/index.d.ts b/src/index.d.ts index 388bf3d..87d1a4d 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -8,54 +8,54 @@ * coordinate bounds */ interface CoordBounds { - /** - * X-coordinate of upper left corner - */ - left: number; - /** - * Y-coordinate of upper left corner - */ - top: number; - /** - * X-coordinate of bottom right corner - */ - right: number; - /** - * Y-coordinate of bottom right corner - */ - bottom: number; + /** + * X-coordinate of upper left corner + */ + left: number; + /** + * Y-coordinate of upper left corner + */ + top: number; + /** + * X-coordinate of bottom right corner + */ + right: number; + /** + * Y-coordinate of bottom right corner + */ + bottom: number; } /** * bounded image */ interface BoundedImage { - /** - * image path or buffer - */ - source: string | Buffer; - /** - * bounding coordinates - */ - boundingBox: CoordBounds; + /** + * image path or buffer + */ + source: string | Buffer; + /** + * bounding coordinates + */ + boundingBox: CoordBounds; } /** * The result obtained from the function. */ interface LooksSameResult { - /** - * true if images are equal, false - otherwise - */ - equal?: boolean; - /** - * diff bounds for not equal images - */ - diffBounds?: CoordBounds; - /** - * diff clusters for not equal images - */ - diffClusters?: CoordBounds[]; + /** + * true if images are equal, false - otherwise + */ + equal?: boolean; + /** + * diff bounds for not equal images + */ + diffBounds?: CoordBounds; + /** + * diff clusters for not equal images + */ + diffClusters?: CoordBounds[]; } type LooksSameCallback = (error: Error | null, result: LooksSameResult) => void; @@ -64,121 +64,121 @@ type LooksSameCallback = (error: Error | null, result: LooksSameResult) => void; * The options passed to looksSame function */ interface LooksSameOptions { - /** - * By default, it will detect only noticeable differences. If you wish to detect any difference, use strict options. - */ - strict?: boolean; - /** - * You can also adjust the ΔE value that will be treated as error in non-strict mode. - */ - tolerance?: number; - /** - * Some devices can have different proportion between physical and logical screen resolutions also known as pixel ratio. - * Default value for this proportion is 1. - * This param also affects the comparison result, so it can be set manually with pixelRatio option. - */ - pixelRatio?: number; - /** - * Text caret in text input elements it is a pain for visual regression tasks, because it is always blinks. - * These diffs will be ignored by default. You can use `ignoreCaret` option with `false` value to disable ignoring such diffs. - * In that way text caret will be marked as diffs. - */ - ignoreCaret?: boolean; - /** - * Some images has difference while comparing because of antialiasing. - * These diffs will be ignored by default. You can use ignoreAntialiasing option with false value to disable ignoring such diffs. - * In that way antialiased pixels will be marked as diffs. - */ - ignoreAntialiasing?: boolean; - /** - * Sometimes the antialiasing algorithm can work incorrectly due to some features of the browser rendering engine. - * Use the option antialiasingTolerance to make the algorithm less strict. - * With this option you can specify the minimum difference in brightness (zero by default) - * between the darkest/lightest pixel (which is adjacent to the antialiasing pixel) and theirs adjacent pixels. - * - * We recommend that you don't increase this value above 10. If you need to increase more than 10 then this is definitely not antialiasing. - */ - antialiasingTolerance?: number; - /** - * Responsible for diff area which will be returned when comparing images. - * Diff bounds will contain the whole diff if stopOnFirstFail is false and only first diff pixel - otherwise. - */ - stopOnFirstFail?: boolean; - /** - * Responsible for diff bounds clustering - */ - shouldCluster?: boolean; - /** - * Radius for every diff cluster - */ - clustersSize?: number; + /** + * By default, it will detect only noticeable differences. If you wish to detect any difference, use strict options. + */ + strict?: boolean; + /** + * You can also adjust the ΔE value that will be treated as error in non-strict mode. + */ + tolerance?: number; + /** + * Some devices can have different proportion between physical and logical screen resolutions also known as pixel ratio. + * Default value for this proportion is 1. + * This param also affects the comparison result, so it can be set manually with pixelRatio option. + */ + pixelRatio?: number; + /** + * Text caret in text input elements it is a pain for visual regression tasks, because it is always blinks. + * These diffs will be ignored by default. You can use `ignoreCaret` option with `false` value to disable ignoring such diffs. + * In that way text caret will be marked as diffs. + */ + ignoreCaret?: boolean; + /** + * Some images has difference while comparing because of antialiasing. + * These diffs will be ignored by default. You can use ignoreAntialiasing option with false value to disable ignoring such diffs. + * In that way antialiased pixels will be marked as diffs. + */ + ignoreAntialiasing?: boolean; + /** + * Sometimes the antialiasing algorithm can work incorrectly due to some features of the browser rendering engine. + * Use the option antialiasingTolerance to make the algorithm less strict. + * With this option you can specify the minimum difference in brightness (zero by default) + * between the darkest/lightest pixel (which is adjacent to the antialiasing pixel) and theirs adjacent pixels. + * + * We recommend that you don't increase this value above 10. If you need to increase more than 10 then this is definitely not antialiasing. + */ + antialiasingTolerance?: number; + /** + * Responsible for diff area which will be returned when comparing images. + * Diff bounds will contain the whole diff if stopOnFirstFail is false and only first diff pixel - otherwise. + */ + stopOnFirstFail?: boolean; + /** + * Responsible for diff bounds clustering + */ + shouldCluster?: boolean; + /** + * Radius for every diff cluster + */ + clustersSize?: number; } /** * The options passed to looksSame.createDiff function without diff */ interface CreateDiffAsBufferOptions { - /** - * The baseline image - */ - reference: string | Buffer | BoundedImage; - /** - * The current image - */ - current: string | Buffer | BoundedImage; - /** - * Color to highlight the differences - * e.g. '#ff00ff' - */ - highlightColor: string; - /** - * strict comparsion - */ - strict?: boolean; - /** - * ΔE value that will be treated as error in non-strict mode - */ - tolerance?: number; - /** - * makes the search algorithm of the antialiasing less strict - */ - antialiasingTolerance?: number; - /** - * Ability to ignore antialiasing - */ - ignoreAntialiasing?: boolean; - /** - * Ability to ignore text caret - */ - ignoreCaret?: boolean; + /** + * The baseline image + */ + reference: string | Buffer | BoundedImage; + /** + * The current image + */ + current: string | Buffer | BoundedImage; + /** + * Color to highlight the differences + * e.g. '#ff00ff' + */ + highlightColor: string; + /** + * strict comparsion + */ + strict?: boolean; + /** + * ΔE value that will be treated as error in non-strict mode + */ + tolerance?: number; + /** + * makes the search algorithm of the antialiasing less strict + */ + antialiasingTolerance?: number; + /** + * Ability to ignore antialiasing + */ + ignoreAntialiasing?: boolean; + /** + * Ability to ignore text caret + */ + ignoreCaret?: boolean; } /** * The options passed to looksSame.createDiff function */ interface CreateDiffOptions extends CreateDiffAsBufferOptions { - /** - * The diff image path to store - */ - diff: string; + /** + * The diff image path to store + */ + diff: string; } /** * Pass to looksSame.colors function */ interface Color { - /** - * Red - */ - R: number; - /** - * Green - */ - G: number; - /** - * Blue - */ - B: number; + /** + * Red + */ + R: number; + /** + * Green + */ + G: number; + /** + * Blue + */ + B: number; } /** @@ -189,10 +189,10 @@ interface Color { * @param callback Call when finish compare */ declare function looksSame( - image1: string | Buffer | BoundedImage, - image2: string | Buffer | BoundedImage, - options: LooksSameOptions | {}, - callback: LooksSameCallback + image1: string | Buffer | BoundedImage, + image2: string | Buffer | BoundedImage, + options: LooksSameOptions | {}, + callback: LooksSameCallback, ): void; /** * Compare two images @@ -201,33 +201,26 @@ declare function looksSame( * @param callback Call when finish compare */ declare function looksSame( - image1: string | Buffer | BoundedImage, - image2: string | Buffer | BoundedImage, - callback: LooksSameCallback + image1: string | Buffer | BoundedImage, + image2: string | Buffer | BoundedImage, + callback: LooksSameCallback, ): void; // https://stackoverflow.com/questions/44058101/typescript-declare-third-party-modules -declare module looksSame { - export function createDiff( - options: CreateDiffOptions, - callback: (error: Error | null) => any - ): void; - export function createDiff( - options: CreateDiffAsBufferOptions, - callback: (error: Error | null, buffer: Buffer) => any - ): void; +declare namespace looksSame { + export function createDiff(options: CreateDiffOptions, callback: (error: Error | null) => any): void; + export function createDiff( + options: CreateDiffAsBufferOptions, + callback: (error: Error | null, buffer: Buffer) => any, + ): void; - /** - * Compare two colors - * @param color1 The first color - * @param color2 The second color - * @param options The options passed to looksSame.colors function - */ - export function colors( - color1: Color, - color2: Color, - options: { tolerance: number } - ): void; + /** + * Compare two colors + * @param color1 The first color + * @param color2 The second color + * @param options The options passed to looksSame.colors function + */ + export function colors(color1: Color, color2: Color, options: { tolerance: number }): void; } /** diff --git a/src/index.ts b/src/index.ts index 1375af7..025c769 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,21 +1,21 @@ -import _ from 'lodash'; -import parseColor from 'parse-color'; -import colorDiff from 'color-diff'; -import * as png from './lib/png'; -import areColorsSame from './lib/same-colors'; -import AntialiasingComparator from './lib/antialiasing-comparator'; -import IgnoreCaretComparator from './lib/ignore-caret-comparator'; -import {readPair, getDiffPixelsCoords, formatImages} from './lib/utils'; -import {JND} from './lib/constants'; +import _ from "lodash"; +import parseColor from "parse-color"; +import colorDiff from "color-diff"; +import * as png from "./lib/png"; +import areColorsSame from "./lib/same-colors"; +import AntialiasingComparator from "./lib/antialiasing-comparator"; +import IgnoreCaretComparator from "./lib/ignore-caret-comparator"; +import { readPair, getDiffPixelsCoords, formatImages } from "./lib/utils"; +import { JND } from "./lib/constants"; const makeAntialiasingComparator = (comparator, png1, png2, opts) => { const antialiasingComparator = new AntialiasingComparator(comparator, png1, png2, opts); - return (data) => antialiasingComparator.compare(data); + return data => antialiasingComparator.compare(data); }; const makeNoCaretColorComparator = (comparator, pixelRatio) => { const caretComparator = new IgnoreCaretComparator(comparator, pixelRatio); - return (data) => caretComparator.compare(data); + return data => caretComparator.compare(data); }; function makeCIEDE2000Comparator(tolerance) { @@ -46,7 +46,7 @@ const createComparator = (png1, png2, opts) => { }; const iterateRect = (width, height, callback, endCallback) => { - const processRow = (y) => { + const processRow = y => { setImmediate(() => { for (let x = 0; x < width; x++) { callback(x, y); @@ -73,35 +73,40 @@ const buildDiffImage = (png1, png2, options, callback) => { const highlightColor = options.highlightColor; const result = png.empty(width, height); - iterateRect(width, height, (x, y) => { - if (x >= minWidth || y >= minHeight) { - result.setPixel(x, y, highlightColor); - return; - } + iterateRect( + width, + height, + (x, y) => { + if (x >= minWidth || y >= minHeight) { + result.setPixel(x, y, highlightColor); + return; + } - const color1 = png1.getPixel(x, y); - const color2 = png2.getPixel(x, y); + const color1 = png1.getPixel(x, y); + const color2 = png2.getPixel(x, y); - if (!options.comparator({color1, color2, png1, png2, x, y, width, height})) { - result.setPixel(x, y, highlightColor); - } else { - result.setPixel(x, y, color1); - } - }, () => callback(result)); + if (!options.comparator({ color1, color2, png1, png2, x, y, width, height })) { + result.setPixel(x, y, highlightColor); + } else { + result.setPixel(x, y, color1); + } + }, + () => callback(result), + ); }; -const parseColorString = (str) => { - const parsed = parseColor(str || '#ff00ff'); +const parseColorString = str => { + const parsed = parseColor(str || "#ff00ff"); return { R: parsed.rgb[0], G: parsed.rgb[1], - B: parsed.rgb[2] + B: parsed.rgb[2], }; }; -const getToleranceFromOpts = (opts) => { - if (!_.hasIn(opts, 'tolerance')) { +const getToleranceFromOpts = opts => { + if (!_.hasIn(opts, "tolerance")) { return JND; } @@ -112,25 +117,25 @@ const getToleranceFromOpts = (opts) => { return opts.tolerance; }; -const prepareOpts = (opts) => { +const prepareOpts = opts => { opts = opts || {}; opts.tolerance = getToleranceFromOpts(opts); return _.defaults(opts, { ignoreCaret: true, ignoreAntialiasing: true, - antialiasingTolerance: 0 + antialiasingTolerance: 0, }); }; const getMaxDiffBounds = (first, second) => { - const {x: left, y: top} = first.getActualCoord(0, 0); + const { x: left, y: top } = first.getActualCoord(0, 0); return { left, top, right: left + Math.max(first.width, second.width) - 1, - bottom: top + Math.max(first.height, second.height) - 1 + bottom: top + Math.max(first.height, second.height) - 1, }; }; @@ -144,23 +149,31 @@ function looksSame(image1, image2, opts, callback?) { [image1, image2] = formatImages(image1, image2); readPair(image1, image2) - .then(({first, second}) => { - const refImg = {size: {width: first.width, height: first.height}}; - const metaInfo = {refImg}; + .then(({ first, second }) => { + const refImg = { size: { width: first.width, height: first.height } }; + const metaInfo = { refImg }; if (first.width !== second.width || first.height !== second.height) { const diffBounds = getMaxDiffBounds(first, second); - return process.nextTick(() => callback(null, {equal: false, metaInfo, diffBounds, diffClusters: [diffBounds]})); + return process.nextTick(() => + callback(null, { equal: false, metaInfo, diffBounds, diffClusters: [diffBounds] }), + ); } const comparator = createComparator(first, second, opts); - const {stopOnFirstFail, shouldCluster, clustersSize} = opts; - - getDiffPixelsCoords(first, second, comparator, {stopOnFirstFail, shouldCluster, clustersSize}, ({diffArea, diffClusters}) => { - const diffBounds = diffArea.area; - - callback(null, {equal: diffArea.isEmpty(), metaInfo, diffBounds, diffClusters}); - }); + const { stopOnFirstFail, shouldCluster, clustersSize } = opts; + + getDiffPixelsCoords( + first, + second, + comparator, + { stopOnFirstFail, shouldCluster, clustersSize }, + ({ diffArea, diffClusters }) => { + const diffBounds = diffArea.area; + + callback(null, { equal: diffArea.isEmpty(), metaInfo, diffBounds, diffClusters }); + }, + ); }) .catch(error => { callback(error); @@ -177,14 +190,14 @@ looksSame.getDiffArea = function(image1, image2, opts, callback?) { [image1, image2] = formatImages(image1, image2); readPair(image1, image2) - .then(({first, second}) => { + .then(({ first, second }) => { if (first.width !== second.width || first.height !== second.height) { return process.nextTick(() => callback(null, getMaxDiffBounds(first, second))); } const comparator = createComparator(first, second, opts); - getDiffPixelsCoords(first, second, comparator, opts, ({diffArea}) => { + getDiffPixelsCoords(first, second, comparator, opts, ({ diffArea }) => { if (diffArea.isEmpty()) { return callback(null, null); } @@ -203,13 +216,13 @@ looksSame.createDiff = function saveDiff(opts, callback) { const [image1, image2] = formatImages(opts.reference, opts.current); readPair(image1, image2) - .then(({first, second}) => { + .then(({ first, second }) => { const diffOptions = { highlightColor: parseColorString(opts.highlightColor), - comparator: createComparator(first, second, opts) + comparator: createComparator(first, second, opts), }; - buildDiffImage(first, second, diffOptions, (result) => { + buildDiffImage(first, second, diffOptions, result => { if (opts.diff === undefined) { result.createBuffer(callback); } else { @@ -231,7 +244,7 @@ looksSame.colors = (color1, color2, opts?) => { const comparator = makeCIEDE2000Comparator(opts.tolerance); - return comparator({color1, color2}); + return comparator({ color1, color2 }); }; export default looksSame; diff --git a/src/lib/antialiasing-comparator.ts b/src/lib/antialiasing-comparator.ts index 011fad3..dd5355c 100644 --- a/src/lib/antialiasing-comparator.ts +++ b/src/lib/antialiasing-comparator.ts @@ -11,7 +11,7 @@ export default class AntialiasingComparator { private _img2: any; private _brightnessTolerance: any; - constructor(baseComparator, png1, png2, {antialiasingTolerance = 0}) { + constructor(baseComparator, png1, png2, { antialiasingTolerance = 0 }) { this._baseComparator = baseComparator; this._img1 = png1; this._img2 = png2; @@ -23,8 +23,10 @@ export default class AntialiasingComparator { } _checkIsAntialiased(data) { - return this._isAntialiased(this._img2, data.x, data.y, data, this._img1) - || this._isAntialiased(this._img1, data.x, data.y, data, this._img2); + return ( + this._isAntialiased(this._img2, data.x, data.y, data, this._img1) || + this._isAntialiased(this._img1, data.x, data.y, data, this._img2) + ); } _isAntialiased(img1, x1, y1, data, img2?) { @@ -99,8 +101,10 @@ export default class AntialiasingComparator { // if either the darkest or the brightest pixel has more than 2 equal siblings in both images // (definitely not anti-aliased), this pixel is anti-aliased - return (!this._isAntialiased(img1, minX, minY, data) && !this._isAntialiased(img2, minX, minY, data)) || - (!this._isAntialiased(img1, maxX, maxY, data) && !this._isAntialiased(img2, maxX, maxY, data)); + return ( + (!this._isAntialiased(img1, minX, minY, data) && !this._isAntialiased(img2, minX, minY, data)) || + (!this._isAntialiased(img1, maxX, maxY, data) && !this._isAntialiased(img2, maxX, maxY, data)) + ); } _brightnessDelta(color1, color2) { diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 12e4e29..5c2a832 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -1,5 +1,5 @@ // Just noticeable difference if ciede2000 >= JND then colors difference is noticeable by human eye export const JND = 2.3; -export const REQUIRED_IMAGE_FIELDS = ['source', 'boundingBox']; -export const REQUIRED_BOUNDING_BOX_FIELDS = ['left', 'top', 'right', 'bottom']; +export const REQUIRED_IMAGE_FIELDS = ["source", "boundingBox"]; +export const REQUIRED_BOUNDING_BOX_FIELDS = ["left", "top", "right", "bottom"]; export const CLUSTERS_SIZE = 10; diff --git a/src/lib/diff-area.ts b/src/lib/diff-area.ts index 105f662..a6e199d 100644 --- a/src/lib/diff-area.ts +++ b/src/lib/diff-area.ts @@ -7,18 +7,18 @@ export default class DiffArea { } constructor() { - this._diffArea = {left: Infinity, top: Infinity, right: -Infinity, bottom: -Infinity}; + this._diffArea = { left: Infinity, top: Infinity, right: -Infinity, bottom: -Infinity }; this._updated = false; } update(x, y) { - const {left, top, right, bottom} = this._diffArea; + const { left, top, right, bottom } = this._diffArea; this._diffArea = { left: Math.min(left, x), top: Math.min(top, y), right: Math.max(right, x), - bottom: Math.max(bottom, y) + bottom: Math.max(bottom, y), }; this._updated = true; @@ -26,9 +26,9 @@ export default class DiffArea { } isPointInArea(x, y, radius) { - const {left, top, right, bottom} = this._diffArea; + const { left, top, right, bottom } = this._diffArea; - return x >= (left - radius) && x <= (right + radius) && y >= (top - radius) && y <= (bottom + radius); + return x >= left - radius && x <= right + radius && y >= top - radius && y <= bottom + radius; } isEmpty() { diff --git a/src/lib/diff-clusters/clusters-joiner.ts b/src/lib/diff-clusters/clusters-joiner.ts index 906bfd3..fcc88bc 100644 --- a/src/lib/diff-clusters/clusters-joiner.ts +++ b/src/lib/diff-clusters/clusters-joiner.ts @@ -1,5 +1,5 @@ -import DiffArea from '../diff-area'; -import jsgraphs from 'js-graph-algorithms'; +import DiffArea from "../diff-area"; +import jsgraphs from "js-graph-algorithms"; const hasOverlap = (cluster1, cluster2) => { if (cluster1.left > cluster2.right || cluster2.left > cluster1.right) { @@ -13,7 +13,7 @@ const hasOverlap = (cluster1, cluster2) => { return true; }; -const getConnectedComponents = (clusters) => { +const getConnectedComponents = clusters => { const graph = new jsgraphs.Graph(clusters.length); clusters.forEach((c1, i) => { @@ -27,19 +27,19 @@ const getConnectedComponents = (clusters) => { return new jsgraphs.ConnectedComponents(graph); }; -export const join = (clusters) => { +export const join = clusters => { const connectedComponents = getConnectedComponents(clusters); - const connectedComponentsIds = Array(clusters.length).fill(0).map((_, i) => connectedComponents.componentId(i)); + const connectedComponentsIds = Array(clusters.length) + .fill(0) + .map((_, i) => connectedComponents.componentId(i)); return connectedComponentsIds.reduce((acc, clusterId, i) => { - const {left, top, right, bottom} = clusters[i].area; + const { left, top, right, bottom } = clusters[i].area; if (!acc[clusterId]) { acc[clusterId] = DiffArea.create(); } - acc[clusterId] - .update(left, top) - .update(right, bottom); + acc[clusterId].update(left, top).update(right, bottom); return acc; }, []); diff --git a/src/lib/diff-clusters/index.ts b/src/lib/diff-clusters/index.ts index 46a6e4b..6bcfcb6 100644 --- a/src/lib/diff-clusters/index.ts +++ b/src/lib/diff-clusters/index.ts @@ -1,6 +1,6 @@ -import DiffArea from '../diff-area'; -import {CLUSTERS_SIZE} from '../constants'; -import * as clustersJoiner from './clusters-joiner'; +import DiffArea from "../diff-area"; +import { CLUSTERS_SIZE } from "../constants"; +import * as clustersJoiner from "./clusters-joiner"; export default class DiffClusters { private _clustersSize: any; @@ -24,7 +24,7 @@ export default class DiffClusters { } _joinToClusters(x, y) { - const pointCluster = this._clusters.find((c) => c.isPointInArea(x, y, this._clustersSize)); + const pointCluster = this._clusters.find(c => c.isPointInArea(x, y, this._clustersSize)); if (!pointCluster) { this._clusters.push(DiffArea.create().update(x, y)); diff --git a/src/lib/ignore-caret-comparator/index.ts b/src/lib/ignore-caret-comparator/index.ts index 80bc96a..c3d1152 100644 --- a/src/lib/ignore-caret-comparator/index.ts +++ b/src/lib/ignore-caret-comparator/index.ts @@ -1,10 +1,10 @@ -import _ from 'lodash'; -import InitState from './states/init'; -import CaretDetectedState from './states/caret-detected'; +import _ from "lodash"; +import InitState from "./states/init"; +import CaretDetectedState from "./states/caret-detected"; const STATES = { InitState, - CaretDetectedState + CaretDetectedState, }; export default class IgnoreCaretComparator { @@ -20,7 +20,7 @@ export default class IgnoreCaretComparator { this.caretBottomRight = null; this._baseComparator = baseComparator; - this.switchState('InitState'); + this.switchState("InitState"); } /** @@ -37,7 +37,7 @@ export default class IgnoreCaretComparator { } _checkIsCaret(data) { - return this._state.validate(_.pick(data, ['x', 'y']), _.pick(data, ['png1', 'png2'])); + return this._state.validate(_.pick(data, ["x", "y"]), _.pick(data, ["png1", "png2"])); } switchState(stateName) { diff --git a/src/lib/ignore-caret-comparator/states/caret-detected.ts b/src/lib/ignore-caret-comparator/states/caret-detected.ts index ae66252..8724eb9 100644 --- a/src/lib/ignore-caret-comparator/states/caret-detected.ts +++ b/src/lib/ignore-caret-comparator/states/caret-detected.ts @@ -1,4 +1,4 @@ -import State from './state'; +import State from "./state"; export default class CaretDetectedState extends State { validate(point) { @@ -6,7 +6,11 @@ export default class CaretDetectedState extends State { } _isInsideCaret(point) { - return point.x >= this.caretTopLeft.x && point.x <= this.caretBottomRight.x - && point.y >= this.caretTopLeft.y && point.y <= this.caretBottomRight.y; + return ( + point.x >= this.caretTopLeft.x && + point.x <= this.caretBottomRight.x && + point.y >= this.caretTopLeft.y && + point.y <= this.caretBottomRight.y + ); } } diff --git a/src/lib/ignore-caret-comparator/states/init.ts b/src/lib/ignore-caret-comparator/states/init.ts index 4facb9d..c8ff6bd 100644 --- a/src/lib/ignore-caret-comparator/states/init.ts +++ b/src/lib/ignore-caret-comparator/states/init.ts @@ -1,6 +1,6 @@ -import _ from 'lodash'; -import State from './state'; -import areColorsSame from '../../same-colors'; +import _ from "lodash"; +import State from "./state"; +import areColorsSame from "../../same-colors"; export default class InitState extends State { validate(firstCaretPoint, imgs): boolean { @@ -13,7 +13,7 @@ export default class InitState extends State { this.caretTopLeft = firstCaretPoint; this.caretBottomRight = lastCaretPoint; - this.switchState('CaretDetectedState'); + this.switchState("CaretDetectedState"); return true; } @@ -33,34 +33,36 @@ export default class InitState extends State { } _isPointOutsideImages(point, imgs) { - return _.some(imgs, (png) => point.x >= png.width || point.y >= png.height); + return _.some(imgs, png => point.x >= png.width || point.y >= png.height); } _areColorsSame(point, imgs) { const color1 = imgs.png1.getPixel(point.x, point.y); const color2 = imgs.png2.getPixel(point.x, point.y); - return areColorsSame({color1, color2}); + return areColorsSame({ color1, color2 }); } _getNextCaretPoint(firstCaretPoint, currPoint) { const nextX = currPoint.x + 1; return nextX < firstCaretPoint.x + this.pixelRatio - ? {x: nextX, y: currPoint.y} - : {x: firstCaretPoint.x, y: currPoint.y + 1}; + ? { x: nextX, y: currPoint.y } + : { x: firstCaretPoint.x, y: currPoint.y + 1 }; } _looksLikeCaret(firstCaretPoint, lastCaretPoint) { - return this._caretHeight(firstCaretPoint, lastCaretPoint) > 1 - && this._caretWidth(firstCaretPoint, lastCaretPoint) === this.pixelRatio; + return ( + this._caretHeight(firstCaretPoint, lastCaretPoint) > 1 && + this._caretWidth(firstCaretPoint, lastCaretPoint) === this.pixelRatio + ); } _caretHeight(firstCaretPoint, lastCaretPoint) { - return (lastCaretPoint.y - firstCaretPoint.y) + 1; + return lastCaretPoint.y - firstCaretPoint.y + 1; } _caretWidth(firstCaretPoint, lastCaretPoint) { - return (lastCaretPoint.x - firstCaretPoint.x) + 1; + return lastCaretPoint.x - firstCaretPoint.x + 1; } } diff --git a/src/lib/png/bounded-png.ts b/src/lib/png/bounded-png.ts index d1fed2b..4e26b52 100644 --- a/src/lib/png/bounded-png.ts +++ b/src/lib/png/bounded-png.ts @@ -1,4 +1,4 @@ -import PNGImage from './png'; +import PNGImage from "./png"; export default class BoundedPNGImage extends PNGImage { private _boundingBox: any; @@ -10,19 +10,19 @@ export default class BoundedPNGImage extends PNGImage { } getPixel(x, y) { - const {x: actX, y: actY} = this.getActualCoord(x, y); + const { x: actX, y: actY } = this.getActualCoord(x, y); return super.getPixel(actX, actY); } setPixel(x, y, color) { - const {x: actX, y: actY} = this.getActualCoord(x, y); + const { x: actX, y: actY } = this.getActualCoord(x, y); super.setPixel(actX, actY, color); } - getActualCoord(x: number, y: number): {x: number; y: number} { - return {x: x + this._boundingBox.left, y: y + this._boundingBox.top}; + getActualCoord(x: number, y: number): { x: number; y: number } { + return { x: x + this._boundingBox.left, y: y + this._boundingBox.top }; } get width(): number { diff --git a/src/lib/png/index.ts b/src/lib/png/index.ts index 5089314..8b28fdd 100644 --- a/src/lib/png/index.ts +++ b/src/lib/png/index.ts @@ -1,13 +1,13 @@ -import fs from 'fs-extra'; -import NestedError from 'nested-error-stacks'; -import {PNG} from 'pngjs'; -import OriginalPNG from './original-png'; -import BoundedPNG from './bounded-png'; +import fs from "fs-extra"; +import NestedError from "nested-error-stacks"; +import { PNG } from "pngjs"; +import OriginalPNG from "./original-png"; +import BoundedPNG from "./bounded-png"; function parseBuffer(buffer) { return new Promise((resolve, reject) => { const png = new PNG(); - png.parse(buffer, (err) => { + png.parse(buffer, err => { if (err) { reject(err); } else { @@ -17,10 +17,8 @@ function parseBuffer(buffer) { }); } -export const create = (png, {boundingBox = undefined} = {}) => { - return boundingBox - ? BoundedPNG.create(png, boundingBox) - : OriginalPNG.create(png); +export const create = (png, { boundingBox = undefined } = {}) => { + return boundingBox ? BoundedPNG.create(png, boundingBox) : OriginalPNG.create(png); }; export const fromFile = async (filePath, opts = {}) => { @@ -37,4 +35,4 @@ export const fromBuffer = async (buffer, opts = {}) => { return exports.create(png, opts); }; -export const empty = (width, height) => exports.create(new PNG({width, height})); +export const empty = (width, height) => exports.create(new PNG({ width, height })); diff --git a/src/lib/png/original-png.ts b/src/lib/png/original-png.ts index f92e727..7cae3d7 100644 --- a/src/lib/png/original-png.ts +++ b/src/lib/png/original-png.ts @@ -1,8 +1,8 @@ -import PNGImage from './png'; +import PNGImage from "./png"; export default class OriginalPNGImage extends PNGImage { - getActualCoord(x: number, y: number): {x: number; y: number} { - return {x, y}; + getActualCoord(x: number, y: number): { x: number; y: number } { + return { x, y }; } get width(): number { diff --git a/src/lib/png/png.ts b/src/lib/png/png.ts index 72cc6eb..71c01fb 100644 --- a/src/lib/png/png.ts +++ b/src/lib/png/png.ts @@ -1,5 +1,5 @@ -import fs from 'fs'; -import concat from 'concat-stream'; +import fs from "fs"; +import concat from "concat-stream"; type Constructor = new (...args: any[]) => T; @@ -8,16 +8,14 @@ export default abstract class PNGImage { return new this(...args); } - constructor( - protected _png: any - ) {} + constructor(protected _png: any) {} getPixel(x, y) { const idx = this._getIdx(x, y); return { R: this._png.data[idx], G: this._png.data[idx + 1], - B: this._png.data[idx + 2] + B: this._png.data[idx + 2], }; } @@ -37,20 +35,20 @@ export default abstract class PNGImage { const writeStream = fs.createWriteStream(path); this._png.pack().pipe(writeStream); - writeStream.on('error', (error) => callback(error)); - writeStream.on('finish', () => callback(null)); + writeStream.on("error", error => callback(error)); + writeStream.on("finish", () => callback(null)); } createBuffer(callback) { this._png.pack().pipe(concat(gotDiff)); - this._png.on('error', (error) => callback(error, null)); + this._png.on("error", error => callback(error, null)); function gotDiff(data) { callback(null, data); } } - abstract getActualCoord(x: number, y: number): {x: number; y: number}; + abstract getActualCoord(x: number, y: number): { x: number; y: number }; abstract get width(): number; abstract get height(): number; } diff --git a/src/lib/same-colors.ts b/src/lib/same-colors.ts index 207b325..30cdeb1 100644 --- a/src/lib/same-colors.ts +++ b/src/lib/same-colors.ts @@ -1,8 +1,6 @@ -export = (data) => { +export = data => { const c1 = data.color1; const c2 = data.color2; - return c1.R === c2.R - && c1.G === c2.G - && c1.B === c2.B; + return c1.R === c2.R && c1.G === c2.G && c1.B === c2.B; }; diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 7158a42..e020f74 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,12 +1,12 @@ -'use strict'; +"use strict"; -import _ from 'lodash'; -import * as png from './png'; -import DiffArea from './diff-area'; -import DiffClusters from './diff-clusters'; -import {validateImages} from './validators'; +import _ from "lodash"; +import * as png from "./png"; +import DiffArea from "./diff-area"; +import DiffClusters from "./diff-clusters"; +import { validateImages } from "./validators"; -function read({source, ...opts}) { +function read({ source, ...opts }) { const readFunc = Buffer.isBuffer(source) ? png.fromBuffer : png.fromFile; return readFunc(source, opts); } @@ -14,10 +14,10 @@ function read({source, ...opts}) { export const readPair = async (first, second) => { const [firstPng, secondPng] = await Promise.all([first, second].map(read)); - return {first: firstPng, second: secondPng}; + return { first: firstPng, second: secondPng }; }; -const getDiffClusters = (diffClusters, diffArea, {shouldCluster}) => { +const getDiffClusters = (diffClusters, diffArea, { shouldCluster }) => { return shouldCluster ? diffClusters.clusters : [diffArea.area]; }; @@ -27,7 +27,7 @@ export const getDiffPixelsCoords = (png1, png2, predicate, opts, callback?) => { opts = {}; } - const stopOnFirstFail = opts.hasOwnProperty('stopOnFirstFail') ? opts.stopOnFirstFail : false; + const stopOnFirstFail = opts.hasOwnProperty("stopOnFirstFail") ? opts.stopOnFirstFail : false; const width = Math.min(png1.width, png2.width); const height = Math.min(png1.height, png2.height); @@ -35,28 +35,32 @@ export const getDiffPixelsCoords = (png1, png2, predicate, opts, callback?) => { const diffArea = new DiffArea(); const diffClusters = new DiffClusters(opts.clustersSize); - const processRow = (y) => { + const processRow = y => { setImmediate(() => { for (let x = 0; x < width; x++) { const color1 = png1.getPixel(x, y); const color2 = png2.getPixel(x, y); const result = predicate({ - color1, color2, - png1, png2, - x, y, - width, height + color1, + color2, + png1, + png2, + x, + y, + width, + height, }); if (!result) { - const {x: actX, y: actY} = png1.getActualCoord(x, y); + const { x: actX, y: actY } = png1.getActualCoord(x, y); diffArea.update(actX, actY); if (opts.shouldCluster) { diffClusters.update(actX, actY); } if (stopOnFirstFail) { - return callback({diffArea, diffClusters: getDiffClusters(diffClusters, diffArea, opts)}); + return callback({ diffArea, diffClusters: getDiffClusters(diffClusters, diffArea, opts) }); } } } @@ -66,7 +70,7 @@ export const getDiffPixelsCoords = (png1, png2, predicate, opts, callback?) => { if (y < height) { processRow(y); } else { - callback({diffArea, diffClusters: getDiffClusters(diffClusters, diffArea, opts)}); + callback({ diffArea, diffClusters: getDiffClusters(diffClusters, diffArea, opts) }); } }); }; @@ -77,7 +81,7 @@ export const getDiffPixelsCoords = (png1, png2, predicate, opts, callback?) => { export const formatImages = (img1, img2) => { validateImages(img1, img2); - return [img1, img2].map((i) => { - return _.isObject(i) && !Buffer.isBuffer(i) ? i : {source: i, boundingBox: null}; + return [img1, img2].map(i => { + return _.isObject(i) && !Buffer.isBuffer(i) ? i : { source: i, boundingBox: null }; }); }; diff --git a/src/lib/validators.ts b/src/lib/validators.ts index 40ca81f..158009a 100644 --- a/src/lib/validators.ts +++ b/src/lib/validators.ts @@ -1,15 +1,15 @@ -import _ from 'lodash'; -import {REQUIRED_IMAGE_FIELDS, REQUIRED_BOUNDING_BOX_FIELDS} from './constants'; +import _ from "lodash"; +import { REQUIRED_IMAGE_FIELDS, REQUIRED_BOUNDING_BOX_FIELDS } from "./constants"; const validateRequiredFields = (value, fields) => { - [].concat(fields).forEach((field) => { + [].concat(fields).forEach(field => { if (!_.hasIn(value, field)) { throw new TypeError(`Field "${field}" does not exist in ${JSON.stringify(value)}`); } }); }; -const validateBoundingBoxCoords = ({boundingBox}) => { +const validateBoundingBoxCoords = ({ boundingBox }) => { if (boundingBox.left > boundingBox.right) { throw new TypeError('"left" coordinate in "boundingBox" field cannot be greater than "right"'); } @@ -20,7 +20,7 @@ const validateBoundingBoxCoords = ({boundingBox}) => { }; export const validateImages = (img1, img2) => { - [img1, img2].forEach((i) => { + [img1, img2].forEach(i => { if (Buffer.isBuffer(i) || !_.isObject(i)) { return; } diff --git a/test/diff-area.ts b/test/diff-area.ts index d784dd1..463dcc2 100644 --- a/test/diff-area.ts +++ b/test/diff-area.ts @@ -1,22 +1,22 @@ -import {expect} from 'chai'; -import DiffArea from '../src/lib/diff-area'; +import { expect } from "chai"; +import DiffArea from "../src/lib/diff-area"; -describe('DiffArea', () => { - it('should init diff area with default params', () => { +describe("DiffArea", () => { + it("should init diff area with default params", () => { const diffArea = new DiffArea(); - expect(diffArea.area).to.deep.equal({left: Infinity, top: Infinity, right: -Infinity, bottom: -Infinity}); + expect(diffArea.area).to.deep.equal({ left: Infinity, top: Infinity, right: -Infinity, bottom: -Infinity }); }); - it('should update diff area', () => { + it("should update diff area", () => { const diffArea = new DiffArea(); diffArea.update(99, 99); - expect(diffArea.area).to.deep.equal({left: 99, top: 99, right: 99, bottom: 99}); + expect(diffArea.area).to.deep.equal({ left: 99, top: 99, right: 99, bottom: 99 }); }); - describe('isEmpty', () => { + describe("isEmpty", () => { it('should return "true" if area is empty', () => { const diffArea = new DiffArea(); @@ -32,13 +32,11 @@ describe('DiffArea', () => { }); }); - describe('isPointInArea', () => { + describe("isPointInArea", () => { it('should return "true" if point inside of area', () => { const diffArea = new DiffArea(); - diffArea - .update(1, 1) - .update(5, 5); + diffArea.update(1, 1).update(5, 5); assert.isTrue(diffArea.isPointInArea(10, 10, 10)); }); @@ -46,9 +44,7 @@ describe('DiffArea', () => { it('should return "false" if point is outside of area', () => { const diffArea = new DiffArea(); - diffArea - .update(1, 1) - .update(5, 5); + diffArea.update(1, 1).update(5, 5); expect(diffArea.isPointInArea(20, 20, 10)).to.equal(false); }); diff --git a/test/diff-clusters/clusters-joiner.ts b/test/diff-clusters/clusters-joiner.ts index aefbaf8..5a357c0 100644 --- a/test/diff-clusters/clusters-joiner.ts +++ b/test/diff-clusters/clusters-joiner.ts @@ -1,17 +1,17 @@ -import * as clustersJoiner from '../../src/lib/diff-clusters/clusters-joiner'; +import * as clustersJoiner from "../../src/lib/diff-clusters/clusters-joiner"; -describe('DiffClusters', () => { - it('should join clusters', () => { +describe("DiffClusters", () => { + it("should join clusters", () => { const clusters = [ - {area: {left: 1, top: 1, right: 5, bottom: 5}}, - {area: {left: 2, top: 2, right: 6, bottom: 6}}, - {area: {left: 10, top: 10, right: 11, bottom: 11}} + { area: { left: 1, top: 1, right: 5, bottom: 5 } }, + { area: { left: 2, top: 2, right: 6, bottom: 6 } }, + { area: { left: 10, top: 10, right: 11, bottom: 11 } }, ]; const joinedClusters = clustersJoiner.join(clusters).map(c => c.area); assert.deepEqual(joinedClusters, [ - {left: 1, top: 1, right: 6, bottom: 6}, - {left: 10, top: 10, right: 11, bottom: 11} + { left: 1, top: 1, right: 6, bottom: 6 }, + { left: 10, top: 10, right: 11, bottom: 11 }, ]); }); }); diff --git a/test/diff-clusters/index.ts b/test/diff-clusters/index.ts index 1890c91..d284161 100644 --- a/test/diff-clusters/index.ts +++ b/test/diff-clusters/index.ts @@ -1,18 +1,18 @@ -import DiffArea from '../../src/lib/diff-area'; -import DiffClusters from '../../src/lib/diff-clusters'; -import * as clustersJoiner from '../../src/lib/diff-clusters/clusters-joiner'; +import DiffArea from "../../src/lib/diff-area"; +import DiffClusters from "../../src/lib/diff-clusters"; +import * as clustersJoiner from "../../src/lib/diff-clusters/clusters-joiner"; -describe('DiffClusters', () => { +describe("DiffClusters", () => { const sandbox = sinon.createSandbox(); beforeEach(() => { - sandbox.stub(clustersJoiner, 'join').returnsArg(0); - sandbox.stub(DiffArea.prototype, 'isPointInArea'); + sandbox.stub(clustersJoiner, "join").returnsArg(0); + sandbox.stub(DiffArea.prototype, "isPointInArea"); }); afterEach(() => sandbox.restore()); - it('should define points to different clusters', () => { + it("should define points to different clusters", () => { (DiffArea.prototype.isPointInArea as any).returns(false); const diffClusters = new DiffClusters(); @@ -20,18 +20,18 @@ describe('DiffClusters', () => { diffClusters.update(5, 5); assert.deepEqual(diffClusters.clusters, [ - {left: 1, top: 1, right: 1, bottom: 1}, - {left: 5, top: 5, right: 5, bottom: 5} + { left: 1, top: 1, right: 1, bottom: 1 }, + { left: 5, top: 5, right: 5, bottom: 5 }, ]); }); - it('should define points to the same clusters', () => { + it("should define points to the same clusters", () => { (DiffArea.prototype.isPointInArea as any).returns(true); const diffClusters = new DiffClusters(); diffClusters.update(1, 1); diffClusters.update(5, 5); - assert.deepEqual(diffClusters.clusters, [{left: 1, top: 1, right: 5, bottom: 5}]); + assert.deepEqual(diffClusters.clusters, [{ left: 1, top: 1, right: 5, bottom: 5 }]); }); }); diff --git a/test/ignore-caret-comparator.ts b/test/ignore-caret-comparator.ts index 9130f30..8a21df5 100644 --- a/test/ignore-caret-comparator.ts +++ b/test/ignore-caret-comparator.ts @@ -1,26 +1,26 @@ -import _ from 'lodash'; -import proxyquire from 'proxyquire'; -import {expect} from 'chai'; +import _ from "lodash"; +import proxyquire from "proxyquire"; +import { expect } from "chai"; -describe('IgnoreCaretComparator', () => { +describe("IgnoreCaretComparator", () => { const sandbox = sinon.sandbox.create(); let IgnoreCaretComparator; let areColorsSame; const compareImages = (pixels, comparator) => { - const emptyPixels = _.map(pixels, (pixelRow) => Array(pixelRow.length).fill(0)); + const emptyPixels = _.map(pixels, pixelRow => Array(pixelRow.length).fill(0)); const width = pixels[0].length; const height = pixels.length; - const png1 = {data: pixels, getPixel: (x, y) => pixels[y][x], width, height}; - const png2 = {data: emptyPixels, getPixel: (x, y) => emptyPixels[y][x], width, height}; + const png1 = { data: pixels, getPixel: (x, y) => pixels[y][x], width, height }; + const png2 = { data: emptyPixels, getPixel: (x, y) => emptyPixels[y][x], width, height }; let res = true; for (let y = 0; y < pixels.length; ++y) { for (let x = 0; x < pixels[y].length; ++x) { - res = comparator({color1: png1.data[y][x], color2: png2.data[y][x], x, y, png1, png2}); + res = comparator({ color1: png1.data[y][x], color2: png2.data[y][x], x, y, png1, png2 }); if (!res) { break; } @@ -34,7 +34,7 @@ describe('IgnoreCaretComparator', () => { }; const execComparator = (params, pixels) => { - const colorComparator = (data) => data.color1 === data.color2; + const colorComparator = data => data.color1 === data.color2; const ignoreCaretComparator = new IgnoreCaretComparator(colorComparator, params.pixelRatio); return compareImages(pixels, ignoreCaretComparator.compare.bind(ignoreCaretComparator)); }; @@ -50,141 +50,73 @@ describe('IgnoreCaretComparator', () => { beforeEach(() => { areColorsSame = sandbox.stub().returns(true); areColorsSame - .withArgs({color1: 1, color2: 0}).returns(false) - .withArgs({color1: 0, color2: 1}).returns(false) + .withArgs({ color1: 1, color2: 0 }) + .returns(false) + .withArgs({ color1: 0, color2: 1 }) + .returns(false) .returns(true); - areColorsSame['@global'] = true; + areColorsSame["@global"] = true; - IgnoreCaretComparator = proxyquire('../src/lib/ignore-caret-comparator', { - '../../same-colors': areColorsSame + IgnoreCaretComparator = proxyquire("../src/lib/ignore-caret-comparator", { + "../../same-colors": areColorsSame, }).default; }); afterEach(() => sandbox.restore()); - it('should accept equal images', () => { - expectAccepted({pixelRatio: 1}, [ - [0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0] - ]); + it("should accept equal images", () => { + expectAccepted({ pixelRatio: 1 }, [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]); }); - it('should decline images with 1px diff', () => { - expectDeclined({pixelRatio: 1}, [ - [0, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 0] - ]); + it("should decline images with 1px diff", () => { + expectDeclined({ pixelRatio: 1 }, [[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]); }); - it('should accept images with caret which width is equal to given pixelRatio', () => { - expectAccepted({pixelRatio: 1}, [ - [0, 0, 0, 0], - [0, 1, 0, 0], - [0, 1, 0, 0], - [0, 0, 0, 0] - ]); + it("should accept images with caret which width is equal to given pixelRatio", () => { + expectAccepted({ pixelRatio: 1 }, [[0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]); }); - it('should decline images with caret which width is greater than given pixelRatio', () => { - expectDeclined({pixelRatio: 1}, [ - [0, 0, 0, 0], - [0, 1, 1, 0], - [0, 1, 1, 0], - [0, 0, 0, 0] - ]); + it("should decline images with caret which width is greater than given pixelRatio", () => { + expectDeclined({ pixelRatio: 1 }, [[0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0]]); }); - it('should decline images with caret which width is greater than given fractional pixelRatio', () => { - expectDeclined({pixelRatio: 1.5}, [ - [0, 0, 0, 0], - [0, 1, 1, 0], - [0, 1, 1, 0], - [0, 0, 0, 0] - ]); + it("should decline images with caret which width is greater than given fractional pixelRatio", () => { + expectDeclined({ pixelRatio: 1.5 }, [[0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0]]); }); - it('should decline images with caret which width is less than given pixelRatio', () => { - expectDeclined({pixelRatio: 2}, [ - [0, 0, 0, 0], - [0, 1, 0, 0], - [0, 1, 0, 0], - [0, 0, 0, 0] - ]); + it("should decline images with caret which width is less than given pixelRatio", () => { + expectDeclined({ pixelRatio: 2 }, [[0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]); }); - it('should decline images with 1px height diff', () => { - expectDeclined({pixelRatio: 2}, [ - [0, 0, 0, 0], - [0, 1, 1, 0], - [0, 0, 0, 0], - [0, 0, 0, 0] - ]); + it("should decline images with 1px height diff", () => { + expectDeclined({ pixelRatio: 2 }, [[0, 0, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]]); }); - it('should decline images which variable caret width (pixelRatio is 2)', () => { - expectDeclined({pixelRatio: 2}, [ - [0, 0, 0, 0], - [0, 1, 1, 0], - [0, 1, 0, 0], - [0, 0, 0, 0] - ]); + it("should decline images which variable caret width (pixelRatio is 2)", () => { + expectDeclined({ pixelRatio: 2 }, [[0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 0, 0], [0, 0, 0, 0]]); }); - it('should decline images which variable caret width (pixelRatio is 1)', () => { - expectDeclined({pixelRatio: 1}, [ - [0, 0, 0, 0], - [0, 1, 0, 0], - [0, 1, 1, 0], - [0, 0, 0, 0] - ]); + it("should decline images which variable caret width (pixelRatio is 1)", () => { + expectDeclined({ pixelRatio: 1 }, [[0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0]]); }); - it('should decline images with multiple carets (more than 1 vertical lines)', () => { - expectDeclined({pixelRatio: 1}, [ - [0, 0, 0, 0], - [0, 1, 0, 1], - [0, 1, 0, 1], - [0, 0, 0, 0] - ]); + it("should decline images with multiple carets (more than 1 vertical lines)", () => { + expectDeclined({ pixelRatio: 1 }, [[0, 0, 0, 0], [0, 1, 0, 1], [0, 1, 0, 1], [0, 0, 0, 0]]); }); - it('should decline images with more difference, than caret', () => { - expectDeclined({pixelRatio: 1}, [ - [0, 0, 0, 0], - [0, 1, 0, 1], - [0, 1, 0, 0], - [0, 0, 0, 0] - ]); + it("should decline images with more difference, than caret", () => { + expectDeclined({ pixelRatio: 1 }, [[0, 0, 0, 0], [0, 1, 0, 1], [0, 1, 0, 0], [0, 0, 0, 0]]); }); - it('should decline images with broken carets (hole inside caret)', () => { - expectDeclined({pixelRatio: 1}, [ - [0, 1, 0, 0], - [0, 0, 0, 0], - [0, 1, 0, 0], - [0, 1, 0, 0] - ]); + it("should decline images with broken carets (hole inside caret)", () => { + expectDeclined({ pixelRatio: 1 }, [[0, 1, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0]]); }); - it('should accept images with caret in the bottom right corner', () => { - expectAccepted({pixelRatio: 1}, [ - [0, 0, 0, 0], - [0, 0, 0, 0], - [0, 0, 0, 1], - [0, 0, 0, 1] - ]); + it("should accept images with caret in the bottom right corner", () => { + expectAccepted({ pixelRatio: 1 }, [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]]); }); - it('should decline images with difference on the right border (pixelRatio is 2)', () => { - expectDeclined({pixelRatio: 2}, [ - [0, 0, 0, 0], - [0, 0, 0, 1], - [0, 0, 0, 1], - [0, 0, 0, 0] - ]); + it("should decline images with difference on the right border (pixelRatio is 2)", () => { + expectDeclined({ pixelRatio: 2 }, [[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0]]); }); }); diff --git a/test/png/index.ts b/test/png/index.ts index 7887e70..661fdc2 100644 --- a/test/png/index.ts +++ b/test/png/index.ts @@ -1,39 +1,39 @@ -import fs from 'fs-extra'; -import {PNG} from 'pngjs'; -import {fromFile} from '../../src/lib/png/index'; +import fs from "fs-extra"; +import { PNG } from "pngjs"; +import { fromFile } from "../../src/lib/png/index"; const stubBuffer = Buffer.from([123]); -describe('lib/png/index.js', () => { +describe("lib/png/index.js", () => { const sandbox = sinon.sandbox.create(); let parseError; beforeEach(() => { parseError = null; - sandbox.stub(fs, 'readFile').resolves(stubBuffer); - sandbox.stub(PNG.prototype, 'parse').callsFake((buffer, cb) => { + sandbox.stub(fs, "readFile").resolves(stubBuffer); + sandbox.stub(PNG.prototype, "parse").callsFake((buffer, cb) => { cb(parseError); }); }); afterEach(() => sandbox.restore()); - describe('fromFile', () => { - it('should parse and return PNG', async () => { - const png = await fromFile('/filePath'); + describe("fromFile", () => { + it("should parse and return PNG", async () => { + const png = await fromFile("/filePath"); assert.instanceOf(png._png, PNG); assert.calledOnceWith(PNG.prototype.parse, stubBuffer); }); - it('should throw error with file path and original error message at stack', async () => { - parseError = new Error('test error'); + it("should throw error with file path and original error message at stack", async () => { + parseError = new Error("test error"); - const error = await assert.isRejected(fromFile('/filePath')); + const error = await assert.isRejected(fromFile("/filePath")); - assert.match(error.message, 'Can\'t load png file /filePath'); - assert.match(error.stack, 'Error: test error'); + assert.match(error.message, "Can't load png file /filePath"); + assert.match(error.stack, "Error: test error"); }); }); }); diff --git a/test/setup.ts b/test/setup.ts index 4b9c4ef..77ca299 100644 --- a/test/setup.ts +++ b/test/setup.ts @@ -1,9 +1,9 @@ -import chaiModule from 'chai'; -import sinonModule from 'sinon'; -import sinonChai from 'sinon-chai'; -import chaiAsPromised from 'chai-as-promised'; -import assertExt from './assert-ext'; -import 'mocha'; +import chaiModule from "chai"; +import sinonModule from "sinon"; +import sinonChai from "sinon-chai"; +import chaiAsPromised from "chai-as-promised"; +import assertExt from "./assert-ext"; +import "mocha"; declare global { const sinon: typeof sinonModule; @@ -17,4 +17,4 @@ chaiModule.use(sinonChai); chaiModule.use(chaiAsPromised); chaiModule.use(assertExt); -sinonModule.assert.expose(chaiModule.assert, {prefix: ''}); +sinonModule.assert.expose(chaiModule.assert, { prefix: "" }); diff --git a/test/test.ts b/test/test.ts index eb5e886..7f51827 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,174 +1,180 @@ -import path from 'path'; -import fs from 'fs'; -import temp from 'temp'; -import {expect} from 'chai'; +import path from "path"; +import fs from "fs"; +import temp from "temp"; +import { expect } from "chai"; -import looksSame from '../src/index'; -import areColorsSame from '../src/lib/same-colors'; -import * as utils from '../src/lib/utils'; -const {readPair, formatImages, getDiffPixelsCoords} = utils; +import looksSame from "../src/index"; +import areColorsSame from "../src/lib/same-colors"; +import * as utils from "../src/lib/utils"; +const { readPair, formatImages, getDiffPixelsCoords } = utils; -const imagePath = (name) => path.join(__dirname, 'data', name); +const imagePath = name => path.join(__dirname, "data", name); -const srcPath = (name) => path.join(imagePath(path.join('src', name))); +const srcPath = name => path.join(imagePath(path.join("src", name))); -const readImage = (name) => fs.readFileSync(srcPath(name)); +const readImage = name => fs.readFileSync(srcPath(name)); -const forFilesAndBuffers = (callback) => { - describe('with files as arguments', () => { +const forFilesAndBuffers = callback => { + describe("with files as arguments", () => { callback(srcPath); }); - describe('with buffers as arguments', () => { + describe("with buffers as arguments", () => { callback(readImage); }); }; -describe('looksSame', () => { +describe("looksSame", () => { const sandbox = sinon.createSandbox(); afterEach(() => { sandbox.restore(); }); - it('should throw if both tolerance and strict options set', () => { + it("should throw if both tolerance and strict options set", () => { expect(() => { - looksSame(srcPath('ref.png'), srcPath('same.png'), { - strict: true, - tolerance: 9000 - }, () => {}); + looksSame( + srcPath("ref.png"), + srcPath("same.png"), + { + strict: true, + tolerance: 9000, + }, + () => {}, + ); }).to.throw(TypeError); }); - it('should work when opts is undefined', () => { + it("should work when opts is undefined", () => { expect(() => { - looksSame(srcPath('ref.png'), srcPath('same.png'), undefined, () => {}); + looksSame(srcPath("ref.png"), srcPath("same.png"), undefined, () => {}); }).not.to.throw(TypeError); }); - it('should format images', (done) => { - sandbox.spy(utils, 'formatImages'); + it("should format images", done => { + sandbox.spy(utils, "formatImages"); - looksSame(srcPath('ref.png'), srcPath('same.png'), () => { - assert.calledOnceWith(utils.formatImages, srcPath('ref.png'), srcPath('same.png')); + looksSame(srcPath("ref.png"), srcPath("same.png"), () => { + assert.calledOnceWith(utils.formatImages, srcPath("ref.png"), srcPath("same.png")); done(); }); }); - it('should read formatted images', (done) => { - const [formattedImg1, formattedImg2] = [{source: srcPath('ref.png')}, {source: srcPath('same.png')}]; - sandbox.stub(utils, 'formatImages').returns([formattedImg1, formattedImg2]); - sandbox.spy(utils, 'readPair'); + it("should read formatted images", done => { + const [formattedImg1, formattedImg2] = [{ source: srcPath("ref.png") }, { source: srcPath("same.png") }]; + sandbox.stub(utils, "formatImages").returns([formattedImg1, formattedImg2]); + sandbox.spy(utils, "readPair"); - looksSame(srcPath('ref.png'), srcPath('same.png'), () => { + looksSame(srcPath("ref.png"), srcPath("same.png"), () => { assert.calledOnceWith(utils.readPair, formattedImg1, formattedImg2); done(); }); }); - forFilesAndBuffers((getImage) => { - it('should return true for similar images', (done) => { - looksSame(getImage('ref.png'), getImage('same.png'), (error, {equal}) => { + forFilesAndBuffers(getImage => { + it("should return true for similar images", done => { + looksSame(getImage("ref.png"), getImage("same.png"), (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(true); done(); }); }); - it('should return false for different images', (done) => { - looksSame(getImage('ref.png'), getImage('different.png'), (error, {equal}) => { + it("should return false for different images", done => { + looksSame(getImage("ref.png"), getImage("different.png"), (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(false); done(); }); }); - it('should return reference image for different images', (done) => { - looksSame(getImage('ref.png'), getImage('different.png'), (error, {metaInfo: {refImg}}) => { - expect(refImg).to.deep.equal({size: {width: 50, height: 50}}); + it("should return reference image for different images", done => { + looksSame(getImage("ref.png"), getImage("different.png"), (error, { metaInfo: { refImg } }) => { + expect(refImg).to.deep.equal({ size: { width: 50, height: 50 } }); done(); }); }); - it('should return reference image for equal images', (done) => { - looksSame(getImage('ref.png'), getImage('ref.png'), (error, {metaInfo: {refImg}}) => { - expect(refImg).to.deep.equal({size: {width: 50, height: 50}}); + it("should return reference image for equal images", done => { + looksSame(getImage("ref.png"), getImage("ref.png"), (error, { metaInfo: { refImg } }) => { + expect(refImg).to.deep.equal({ size: { width: 50, height: 50 } }); done(); }); }); - it('should return diff bounds for different images', (done) => { - looksSame(getImage('ref.png'), getImage('different.png'), (error, {diffBounds}) => { - expect(diffBounds).to.deep.equal({left: 0, top: 10, right: 49, bottom: 39}); + it("should return diff bounds for different images", done => { + looksSame(getImage("ref.png"), getImage("different.png"), (error, { diffBounds }) => { + expect(diffBounds).to.deep.equal({ left: 0, top: 10, right: 49, bottom: 39 }); done(); }); }); - it('should return true for different images when tolerance is higher than difference', (done) => { - looksSame(getImage('ref.png'), getImage('different.png'), {tolerance: 50}, (error, {equal}) => { + it("should return true for different images when tolerance is higher than difference", done => { + looksSame(getImage("ref.png"), getImage("different.png"), { tolerance: 50 }, (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(true); done(); }); }); - it('should return true for different images when difference is not seen by human eye', (done) => { - looksSame(getImage('ref.png'), getImage('different-unnoticable.png'), (error, {equal}) => { + it("should return true for different images when difference is not seen by human eye", done => { + looksSame(getImage("ref.png"), getImage("different-unnoticable.png"), (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(true); done(); }); }); - it('should return false if difference is not seen by human eye and strict mode is enabled', (done) => { - looksSame(getImage('ref.png'), getImage('different-unnoticable.png'), {strict: true}, (error, {equal}) => { - expect(error).to.equal(null); - expect(equal).to.equal(false); - done(); - }); + it("should return false if difference is not seen by human eye and strict mode is enabled", done => { + looksSame( + getImage("ref.png"), + getImage("different-unnoticable.png"), + { strict: true }, + (error, { equal }) => { + expect(error).to.equal(null); + expect(equal).to.equal(false); + done(); + }, + ); }); - it('should work when images width does not match', (done) => { - looksSame(getImage('ref.png'), getImage('wide.png'), (error, {equal}) => { + it("should work when images width does not match", done => { + looksSame(getImage("ref.png"), getImage("wide.png"), (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(false); done(); }); }); - it('should work when images height does not match', (done) => { - looksSame(getImage('ref.png'), getImage('tall.png'), (error, {equal}) => { + it("should work when images height does not match", done => { + looksSame(getImage("ref.png"), getImage("tall.png"), (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(false); done(); }); }); - it('should return diff bound equal to a bigger image if images have different sizes', (done) => { - looksSame(srcPath('ref.png'), srcPath('large-different.png'), (error, {equal, diffBounds}) => { + it("should return diff bound equal to a bigger image if images have different sizes", done => { + looksSame(srcPath("ref.png"), srcPath("large-different.png"), (error, { equal, diffBounds }) => { expect(error).to.equal(null); expect(equal).to.equal(false); - expect(diffBounds).to.deep.equal({left: 0, top: 0, right: 499, bottom: 499}); + expect(diffBounds).to.deep.equal({ left: 0, top: 0, right: 499, bottom: 499 }); done(); }); }); - it('should return single diff cluster equal to a bigger image if images have different sizes', (done) => { - looksSame(srcPath('ref.png'), srcPath('large-different.png'), (error, {equal, diffClusters}) => { + it("should return single diff cluster equal to a bigger image if images have different sizes", done => { + looksSame(srcPath("ref.png"), srcPath("large-different.png"), (error, { equal, diffClusters }) => { expect(error).to.equal(null); expect(equal).to.equal(false); - expect(diffClusters).to.deep.equal([{left: 0, top: 0, right: 499, bottom: 499}]); + expect(diffClusters).to.deep.equal([{ left: 0, top: 0, right: 499, bottom: 499 }]); done(); }); }); - [ - 'red', - 'blue', - 'green' - ].forEach((channel) => { - it(`should report image as different if the difference is only in ${channel} channel`, (done) => { - looksSame(getImage('ref.png'), getImage(`${channel}.png`), (error, {equal}) => { + ["red", "blue", "green"].forEach(channel => { + it(`should report image as different if the difference is only in ${channel} channel`, done => { + looksSame(getImage("ref.png"), getImage(`${channel}.png`), (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(false); done(); @@ -176,8 +182,8 @@ describe('looksSame', () => { }); }); - it('should return false for images which differ from each other only by 1 pixel', (done) => { - looksSame(getImage('no-caret.png'), getImage('1px-diff.png'), (error, {equal}) => { + it("should return false for images which differ from each other only by 1 pixel", done => { + looksSame(getImage("no-caret.png"), getImage("1px-diff.png"), (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(false); done(); @@ -185,122 +191,172 @@ describe('looksSame', () => { }); }); - describe('with comparing by areas', () => { - forFilesAndBuffers((getImage) => { - describe('if passed areas have different sizes', () => { - it('should return "false"', (done) => { + describe("with comparing by areas", () => { + forFilesAndBuffers(getImage => { + describe("if passed areas have different sizes", () => { + it('should return "false"', done => { looksSame( - {source: getImage('bounding-box-diff-1.png'), boundingBox: {left: 1, top: 1, right: 2, bottom: 1}}, - {source: getImage('bounding-box-diff-1.png'), boundingBox: {left: 5, top: 5, right: 5, bottom: 6}}, - (error, {equal}) => { + { + source: getImage("bounding-box-diff-1.png"), + boundingBox: { left: 1, top: 1, right: 2, bottom: 1 }, + }, + { + source: getImage("bounding-box-diff-1.png"), + boundingBox: { left: 5, top: 5, right: 5, bottom: 6 }, + }, + (error, { equal }) => { assert.isNull(error); assert.isFalse(equal); done(); - } + }, ); }); - it('should return diff bound for first image equal to a bigger area', (done) => { + it("should return diff bound for first image equal to a bigger area", done => { looksSame( - {source: getImage('bounding-box-diff-1.png'), boundingBox: {left: 1, top: 1, right: 2, bottom: 1}}, - {source: getImage('bounding-box-diff-1.png'), boundingBox: {left: 5, top: 5, right: 5, bottom: 6}}, - (error, {diffBounds}) => { + { + source: getImage("bounding-box-diff-1.png"), + boundingBox: { left: 1, top: 1, right: 2, bottom: 1 }, + }, + { + source: getImage("bounding-box-diff-1.png"), + boundingBox: { left: 5, top: 5, right: 5, bottom: 6 }, + }, + (error, { diffBounds }) => { assert.isNull(error); - assert.deepEqual(diffBounds, {left: 1, top: 1, right: 2, bottom: 2}); + assert.deepEqual(diffBounds, { left: 1, top: 1, right: 2, bottom: 2 }); done(); - } + }, ); }); }); - describe('if passed areas have the same sizes but located in various places', () => { - it('should return true if images are equal', (done) => { + describe("if passed areas have the same sizes but located in various places", () => { + it("should return true if images are equal", done => { looksSame( - {source: getImage('bounding-box-diff-1.png'), boundingBox: {left: 1, top: 1, right: 4, bottom: 4}}, - {source: getImage('bounding-box-diff-2.png'), boundingBox: {left: 5, top: 5, right: 8, bottom: 8}}, - (error, {equal}) => { + { + source: getImage("bounding-box-diff-1.png"), + boundingBox: { left: 1, top: 1, right: 4, bottom: 4 }, + }, + { + source: getImage("bounding-box-diff-2.png"), + boundingBox: { left: 5, top: 5, right: 8, bottom: 8 }, + }, + (error, { equal }) => { assert.isNull(error); assert.isTrue(equal); done(); - } + }, ); }); - it('should return false if images are different', (done) => { + it("should return false if images are different", done => { looksSame( - {source: getImage('bounding-box-ref-1.png'), boundingBox: {left: 1, top: 1, right: 4, bottom: 4}}, - {source: getImage('bounding-box-ref-2.png'), boundingBox: {left: 5, top: 5, right: 8, bottom: 8}}, - (error, {equal}) => { + { + source: getImage("bounding-box-ref-1.png"), + boundingBox: { left: 1, top: 1, right: 4, bottom: 4 }, + }, + { + source: getImage("bounding-box-ref-2.png"), + boundingBox: { left: 5, top: 5, right: 8, bottom: 8 }, + }, + (error, { equal }) => { assert.isNull(error); assert.isFalse(equal); done(); - } + }, ); }); - it('should return diff bound for first image if images are different', (done) => { + it("should return diff bound for first image if images are different", done => { looksSame( - {source: getImage('bounding-box-diff-1.png'), boundingBox: {left: 1, top: 1, right: 2, bottom: 1}}, - {source: getImage('bounding-box-diff-1.png'), boundingBox: {left: 5, top: 5, right: 5, bottom: 6}}, - (error, {diffBounds}) => { + { + source: getImage("bounding-box-diff-1.png"), + boundingBox: { left: 1, top: 1, right: 2, bottom: 1 }, + }, + { + source: getImage("bounding-box-diff-1.png"), + boundingBox: { left: 5, top: 5, right: 5, bottom: 6 }, + }, + (error, { diffBounds }) => { assert.isNull(error); - assert.deepEqual(diffBounds, {left: 1, top: 1, right: 2, bottom: 2}); + assert.deepEqual(diffBounds, { left: 1, top: 1, right: 2, bottom: 2 }); done(); - } + }, ); }); }); }); }); - describe('with ignoreCaret', () => { - forFilesAndBuffers((getImage) => { - it('should ignore caret by default', (done) => { - looksSame(getImage('no-caret.png'), getImage('caret.png'), (error, {equal}) => { + describe("with ignoreCaret", () => { + forFilesAndBuffers(getImage => { + it("should ignore caret by default", done => { + looksSame(getImage("no-caret.png"), getImage("caret.png"), (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(true); done(); }); }); - it('if disabled, should return false for images with caret', (done) => { - looksSame(getImage('no-caret.png'), getImage('caret.png'), {ignoreCaret: false}, (error, {equal}) => { - expect(error).to.equal(null); - expect(equal).to.equal(false); - done(); - }); + it("if disabled, should return false for images with caret", done => { + looksSame( + getImage("no-caret.png"), + getImage("caret.png"), + { ignoreCaret: false }, + (error, { equal }) => { + expect(error).to.equal(null); + expect(equal).to.equal(false); + done(); + }, + ); }); - it('if enabled, should return true for images with caret', (done) => { - looksSame(getImage('no-caret.png'), getImage('caret.png'), {ignoreCaret: true}, (error, {equal}) => { - expect(error).to.equal(null); - expect(equal).to.equal(true); - done(); - }); + it("if enabled, should return true for images with caret", done => { + looksSame( + getImage("no-caret.png"), + getImage("caret.png"), + { ignoreCaret: true }, + (error, { equal }) => { + expect(error).to.equal(null); + expect(equal).to.equal(true); + done(); + }, + ); }); - it('if enabled, should return true for images with caret intersecting with a letter', (done) => { - looksSame(getImage('no-caret+text.png'), getImage('caret+text.png'), {ignoreCaret: true}, (error, {equal}) => { - expect(error).to.equal(null); - expect(equal).to.equal(true); - done(); - }); + it("if enabled, should return true for images with caret intersecting with a letter", done => { + looksSame( + getImage("no-caret+text.png"), + getImage("caret+text.png"), + { ignoreCaret: true }, + (error, { equal }) => { + expect(error).to.equal(null); + expect(equal).to.equal(true); + done(); + }, + ); }); - it('if enabled, should return true for images with caret and antialiased pixels', (done) => { + it("if enabled, should return true for images with caret and antialiased pixels", done => { const opts = { ignoreCaret: true, - ignoreAntialiasing: true + ignoreAntialiasing: true, }; - looksSame(getImage('caret+antialiasing.png'), getImage('no-caret+antialiasing.png'), opts, (error, {equal}) => { - expect(error).to.equal(null); - expect(equal).to.equal(true); - done(); - }); + looksSame( + getImage("caret+antialiasing.png"), + getImage("no-caret+antialiasing.png"), + opts, + (error, { equal }) => { + expect(error).to.equal(null); + expect(equal).to.equal(true); + done(); + }, + ); }); - it('if enabled, should return false for images with 1px diff', (done) => { - looksSame(getImage('no-caret.png'), getImage('1px-diff.png'), (error, {equal}) => { + it("if enabled, should return false for images with 1px diff", done => { + looksSame(getImage("no-caret.png"), getImage("1px-diff.png"), (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(false); done(); @@ -309,64 +365,79 @@ describe('looksSame', () => { }); }); - describe('with antialiasing', () => { - forFilesAndBuffers((getImage) => { - it('should check images for antialiasing by default', (done) => { - looksSame(getImage('antialiasing-ref.png'), getImage('antialiasing-actual.png'), (error, {equal}) => { + describe("with antialiasing", () => { + forFilesAndBuffers(getImage => { + it("should check images for antialiasing by default", done => { + looksSame(getImage("antialiasing-ref.png"), getImage("antialiasing-actual.png"), (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(true); done(); }); }); - it('if disabled, should return false for images with antialiasing', (done) => { - looksSame(getImage('antialiasing-ref.png'), getImage('antialiasing-actual.png'), {ignoreAntialiasing: false}, (error, {equal}) => { - expect(error).to.equal(null); - expect(equal).to.equal(false); - done(); - }); + it("if disabled, should return false for images with antialiasing", done => { + looksSame( + getImage("antialiasing-ref.png"), + getImage("antialiasing-actual.png"), + { ignoreAntialiasing: false }, + (error, { equal }) => { + expect(error).to.equal(null); + expect(equal).to.equal(false); + done(); + }, + ); }); - it('if enabled, should return true for images with antialiasing', (done) => { - looksSame(getImage('antialiasing-ref.png'), getImage('antialiasing-actual.png'), {ignoreAntialiasing: true}, (error, {equal}) => { - expect(error).to.equal(null); - expect(equal).to.equal(true); - done(); - }); + it("if enabled, should return true for images with antialiasing", done => { + looksSame( + getImage("antialiasing-ref.png"), + getImage("antialiasing-actual.png"), + { ignoreAntialiasing: true }, + (error, { equal }) => { + expect(error).to.equal(null); + expect(equal).to.equal(true); + done(); + }, + ); }); - it('should return false for images which differ even with ignore antialiasing option', (done) => { - looksSame(getImage('no-caret.png'), getImage('1px-diff.png'), {ignoreAntialiasing: true}, (error, {equal}) => { - expect(error).to.equal(null); - expect(equal).to.equal(false); - done(); - }); + it("should return false for images which differ even with ignore antialiasing option", done => { + looksSame( + getImage("no-caret.png"), + getImage("1px-diff.png"), + { ignoreAntialiasing: true }, + (error, { equal }) => { + expect(error).to.equal(null); + expect(equal).to.equal(false); + done(); + }, + ); }); - [1, 2].forEach((ind) => { - it('should return false for images with default "antialiasingTolerance"', (done) => { + [1, 2].forEach(ind => { + it('should return false for images with default "antialiasingTolerance"', done => { looksSame( getImage(`antialiasing-tolerance-ref-${ind}.png`), getImage(`antialiasing-tolerance-actual-${ind}.png`), - {ignoreAntialiasing: true, ignoreCaret: false}, - (error, {equal}) => { + { ignoreAntialiasing: true, ignoreCaret: false }, + (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(false); done(); - } + }, ); }); - it('should return true for images with passed "antialiasingTolerance"', (done) => { + it('should return true for images with passed "antialiasingTolerance"', done => { looksSame( getImage(`antialiasing-tolerance-ref-${ind}.png`), getImage(`antialiasing-tolerance-actual-${ind}.png`), - {antialiasingTolerance: 4}, - (error, {equal}) => { + { antialiasingTolerance: 4 }, + (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(true); done(); - } + }, ); }); }); @@ -374,12 +445,12 @@ describe('looksSame', () => { }); }); -describe('createDiff', () => { +describe("createDiff", () => { const sandbox = sinon.createSandbox(); let tempName; beforeEach(() => { - tempName = temp.path({suffix: '.png'}); + tempName = temp.path({ suffix: ".png" }); }); afterEach(() => { @@ -390,508 +461,558 @@ describe('createDiff', () => { sandbox.restore(); }); - it('should throw if both tolerance and strict options set', () => { + it("should throw if both tolerance and strict options set", () => { expect(() => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('different.png'), - diff: tempName, - highlightColor: '#ff00ff', - tolerance: 9000, - strict: true - }, () => {}); + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("different.png"), + diff: tempName, + highlightColor: "#ff00ff", + tolerance: 9000, + strict: true, + }, + () => {}, + ); }).to.throw(TypeError); }); - it('should format images', (done) => { - sandbox.spy(utils, 'formatImages'); - - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('same.png'), - diff: tempName, - highlightColor: '#ff00ff' - }, () => { - assert.calledOnceWith(utils.formatImages, srcPath('ref.png'), srcPath('same.png')); - done(); - }); - }); - - it('should read formatted images', (done) => { - const [formattedImg1, formattedImg2] = [{source: srcPath('ref.png')}, {source: srcPath('same.png')}]; - sandbox.stub(utils, 'formatImages').returns([formattedImg1, formattedImg2]); - sandbox.spy(utils, 'readPair'); + it("should format images", done => { + sandbox.spy(utils, "formatImages"); - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('same.png'), - diff: tempName, - highlightColor: '#ff00ff' - }, () => { - assert.calledOnceWith(utils.readPair, formattedImg1, formattedImg2); - done(); - }); - }); - - it('should copy a reference image if there is no difference', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('same.png'), - diff: tempName, - highlightColor: '#ff00ff' - }, () => { - looksSame(srcPath('ref.png'), tempName, {strict: true}, (error, {equal}) => { - expect(equal).to.equal(true); + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("same.png"), + diff: tempName, + highlightColor: "#ff00ff", + }, + () => { + assert.calledOnceWith(utils.formatImages, srcPath("ref.png"), srcPath("same.png")); done(); - }); - }); - }); - - it('should create an image file with diff between two images', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('different.png'), - diff: tempName, - highlightColor: '#ff00ff' - }, () => { - expect(fs.existsSync(tempName)).to.equal(true); - done(); - }); + }, + ); }); - it('should ignore the differences lower then tolerance', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('different.png'), - diff: tempName, - highlightColor: '#ff00ff', - tolerance: 50 - }, () => { - looksSame(srcPath('ref.png'), tempName, {strict: true}, (error, {equal}) => { - expect(equal).to.equal(true); - done(); - }); - }); - }); + it("should read formatted images", done => { + const [formattedImg1, formattedImg2] = [{ source: srcPath("ref.png") }, { source: srcPath("same.png") }]; + sandbox.stub(utils, "formatImages").returns([formattedImg1, formattedImg2]); + sandbox.spy(utils, "readPair"); - it('should create a proper diff', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('different.png'), - diff: tempName, - highlightColor: '#ff00ff' - }, () => { - looksSame(imagePath('diffs/small-magenta.png'), tempName, (error, {equal}) => { - expect(equal).to.equal(true); + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("same.png"), + diff: tempName, + highlightColor: "#ff00ff", + }, + () => { + assert.calledOnceWith(utils.readPair, formattedImg1, formattedImg2); done(); - }); - }); + }, + ); }); - it('should allow to change highlight color', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('different.png'), - diff: tempName, - highlightColor: '#00FF00' - }, () => { - looksSame(imagePath('diffs/small-green.png'), tempName, (error, {equal}) => { - expect(equal).to.equal(true); - done(); - }); - }); + it("should copy a reference image if there is no difference", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("same.png"), + diff: tempName, + highlightColor: "#ff00ff", + }, + () => { + looksSame(srcPath("ref.png"), tempName, { strict: true }, (error, { equal }) => { + expect(equal).to.equal(true); + done(); + }); + }, + ); }); - it('should provide a default highlight color', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('different.png'), - diff: tempName - }, () => { - looksSame(imagePath('diffs/small-magenta.png'), tempName, (error, {equal}) => { - expect(equal).to.equal(true); + it("should create an image file with diff between two images", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("different.png"), + diff: tempName, + highlightColor: "#ff00ff", + }, + () => { + expect(fs.existsSync(tempName)).to.equal(true); done(); - }); - }); + }, + ); }); - it('should allow to build diff for taller images', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('tall-different.png'), - diff: tempName, - highlightColor: '#FF00FF' - }, () => { - looksSame(imagePath('diffs/taller-magenta.png'), tempName, (error, {equal}) => { - expect(equal).to.equal(true); - done(); - }); - }); + it("should ignore the differences lower then tolerance", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("different.png"), + diff: tempName, + highlightColor: "#ff00ff", + tolerance: 50, + }, + () => { + looksSame(srcPath("ref.png"), tempName, { strict: true }, (error, { equal }) => { + expect(equal).to.equal(true); + done(); + }); + }, + ); }); - it('should allow to build diff for wider images', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('wide-different.png'), - diff: tempName, - highlightColor: '#FF00FF' - }, () => { - looksSame(imagePath('diffs/wider-magenta.png'), tempName, (error, {equal}) => { - expect(equal).to.equal(true); - done(); - }); - }); + it("should create a proper diff", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("different.png"), + diff: tempName, + highlightColor: "#ff00ff", + }, + () => { + looksSame(imagePath("diffs/small-magenta.png"), tempName, (error, { equal }) => { + expect(equal).to.equal(true); + done(); + }); + }, + ); }); - it('should use non-strict comparator by default', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('different-unnoticable.png'), - diff: tempName, - highlightColor: '#FF00FF' - }, () => { - looksSame(srcPath('ref.png'), tempName, (error, {equal}) => { - expect(equal).to.equal(true); - done(); - }); - }); + it("should allow to change highlight color", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("different.png"), + diff: tempName, + highlightColor: "#00FF00", + }, + () => { + looksSame(imagePath("diffs/small-green.png"), tempName, (error, { equal }) => { + expect(equal).to.equal(true); + done(); + }); + }, + ); }); - it('should use strict comparator if strict option is true', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('different-unnoticable.png'), - diff: tempName, - strict: true, - highlightColor: '#FF00FF' - }, () => { - looksSame(imagePath('diffs/strict.png'), tempName, (error, {equal}) => { - expect(equal).to.equal(true); - done(); - }); - }); + it("should provide a default highlight color", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("different.png"), + diff: tempName, + }, + () => { + looksSame(imagePath("diffs/small-magenta.png"), tempName, (error, { equal }) => { + expect(equal).to.equal(true); + done(); + }); + }, + ); }); - it('should return a buffer if no diff path option is specified', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('different.png'), - highlightColor: '#ff00ff' - }, (error, buffer) => { - expect(buffer).to.be.an.instanceof(Buffer); - done(); - }); + it("should allow to build diff for taller images", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("tall-different.png"), + diff: tempName, + highlightColor: "#FF00FF", + }, + () => { + looksSame(imagePath("diffs/taller-magenta.png"), tempName, (error, { equal }) => { + expect(equal).to.equal(true); + done(); + }); + }, + ); }); - it('should return a buffer equal to the diff on disk', (done) => { - looksSame.createDiff({ - reference: srcPath('ref.png'), - current: srcPath('different.png'), - highlightColor: '#ff00ff' - }, (error, buffer) => { - looksSame(imagePath('diffs/small-magenta.png'), buffer, (error, {equal}) => { - expect(equal).to.be.equal(true); - done(); - }); - }); + it("should allow to build diff for wider images", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("wide-different.png"), + diff: tempName, + highlightColor: "#FF00FF", + }, + () => { + looksSame(imagePath("diffs/wider-magenta.png"), tempName, (error, { equal }) => { + expect(equal).to.equal(true); + done(); + }); + }, + ); }); - describe('with comparing by areas', () => { - it('should create diff image equal to reference', (done) => { - looksSame.createDiff({ - reference: {source: srcPath('bounding-box-ref-1.png'), boundingBox: {left: 1, top: 1, right: 4, bottom: 4}}, - current: {source: srcPath('bounding-box-ref-2.png'), boundingBox: {left: 5, top: 5, right: 8, bottom: 8}}, + it("should use non-strict comparator by default", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("different-unnoticable.png"), diff: tempName, - highlightColor: '#FF00FF' - }, () => { - looksSame( - {source: srcPath('bounding-box-diff-1.png'), boundingBox: {left: 1, top: 1, right: 4, bottom: 4}}, - tempName, - (error, {equal}) => { - assert.isNull(error); - assert.isTrue(equal); - done(); - } - ); - }); - }); + highlightColor: "#FF00FF", + }, + () => { + looksSame(srcPath("ref.png"), tempName, (error, { equal }) => { + expect(equal).to.equal(true); + done(); + }); + }, + ); }); - describe('with antialiasing', () => { - describe('if there is only diff in antialiased pixels', () => { - it('should create diff image equal to reference if ignore antialiasing is not set', (done) => { - looksSame.createDiff({ - reference: srcPath('antialiasing-ref.png'), - current: srcPath('antialiasing-actual.png'), + it("should use strict comparator if strict option is true", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("different-unnoticable.png"), + diff: tempName, + strict: true, + highlightColor: "#FF00FF", + }, + () => { + looksSame(imagePath("diffs/strict.png"), tempName, (error, { equal }) => { + expect(equal).to.equal(true); + done(); + }); + }, + ); + }); + + it("should return a buffer if no diff path option is specified", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("different.png"), + highlightColor: "#ff00ff", + }, + (error, buffer) => { + expect(buffer).to.be.an.instanceof(Buffer); + done(); + }, + ); + }); + + it("should return a buffer equal to the diff on disk", done => { + looksSame.createDiff( + { + reference: srcPath("ref.png"), + current: srcPath("different.png"), + highlightColor: "#ff00ff", + }, + (error, buffer) => { + looksSame(imagePath("diffs/small-magenta.png"), buffer, (error, { equal }) => { + expect(equal).to.be.equal(true); + done(); + }); + }, + ); + }); + + describe("with comparing by areas", () => { + it("should create diff image equal to reference", done => { + looksSame.createDiff( + { + reference: { + source: srcPath("bounding-box-ref-1.png"), + boundingBox: { left: 1, top: 1, right: 4, bottom: 4 }, + }, + current: { + source: srcPath("bounding-box-ref-2.png"), + boundingBox: { left: 5, top: 5, right: 8, bottom: 8 }, + }, diff: tempName, - highlightColor: '#FF00FF' - }, () => { + highlightColor: "#FF00FF", + }, + () => { looksSame( - srcPath('antialiasing-ref.png'), tempName, {ignoreAntialiasing: false}, - (error, {equal}) => { - expect(error).to.equal(null); - expect(equal).to.equal(true); + { + source: srcPath("bounding-box-diff-1.png"), + boundingBox: { left: 1, top: 1, right: 4, bottom: 4 }, + }, + tempName, + (error, { equal }) => { + assert.isNull(error); + assert.isTrue(equal); done(); - } + }, ); - }); + }, + ); + }); + }); + + describe("with antialiasing", () => { + describe("if there is only diff in antialiased pixels", () => { + it("should create diff image equal to reference if ignore antialiasing is not set", done => { + looksSame.createDiff( + { + reference: srcPath("antialiasing-ref.png"), + current: srcPath("antialiasing-actual.png"), + diff: tempName, + highlightColor: "#FF00FF", + }, + () => { + looksSame( + srcPath("antialiasing-ref.png"), + tempName, + { ignoreAntialiasing: false }, + (error, { equal }) => { + expect(error).to.equal(null); + expect(equal).to.equal(true); + done(); + }, + ); + }, + ); }); - it('should create diff image not equal to reference if ignore antialiasing is disabled', (done) => { - looksSame.createDiff({ - reference: srcPath('antialiasing-ref.png'), - current: srcPath('antialiasing-actual.png'), - diff: tempName, - highlightColor: '#FF00FF', - ignoreAntialiasing: false - }, () => { - looksSame( - srcPath('antialiasing-ref.png'), tempName, {ignoreAntialiasing: false}, - (error, {equal}) => { - expect(error).to.equal(null); - expect(equal).to.equal(false); - done(); - } - ); - }); + it("should create diff image not equal to reference if ignore antialiasing is disabled", done => { + looksSame.createDiff( + { + reference: srcPath("antialiasing-ref.png"), + current: srcPath("antialiasing-actual.png"), + diff: tempName, + highlightColor: "#FF00FF", + ignoreAntialiasing: false, + }, + () => { + looksSame( + srcPath("antialiasing-ref.png"), + tempName, + { ignoreAntialiasing: false }, + (error, { equal }) => { + expect(error).to.equal(null); + expect(equal).to.equal(false); + done(); + }, + ); + }, + ); }); }); - it('should create diff image not equal to reference if there is diff not in antialised pixels', (done) => { - looksSame.createDiff({ - reference: srcPath('no-caret.png'), - current: srcPath('1px-diff.png'), - diff: tempName, - highlightColor: '#FF00FF' - }, () => { - looksSame( - srcPath('antialiasing-ref.png'), tempName, - (error, {equal}) => { + it("should create diff image not equal to reference if there is diff not in antialised pixels", done => { + looksSame.createDiff( + { + reference: srcPath("no-caret.png"), + current: srcPath("1px-diff.png"), + diff: tempName, + highlightColor: "#FF00FF", + }, + () => { + looksSame(srcPath("antialiasing-ref.png"), tempName, (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(false); done(); - } - ); - }); + }); + }, + ); }); }); - describe('with ignoreCaret', () => { - describe('if there is only diff in caret', () => { - it('should create diff image equal to reference if ignore caret is not set', (done) => { - looksSame.createDiff({ - reference: srcPath('no-caret.png'), - current: srcPath('caret.png'), - diff: tempName, - highlightColor: '#FF00FF' - }, () => { - looksSame( - srcPath('no-caret.png'), tempName, {ignoreCaret: false}, - (error, {equal}) => { + describe("with ignoreCaret", () => { + describe("if there is only diff in caret", () => { + it("should create diff image equal to reference if ignore caret is not set", done => { + looksSame.createDiff( + { + reference: srcPath("no-caret.png"), + current: srcPath("caret.png"), + diff: tempName, + highlightColor: "#FF00FF", + }, + () => { + looksSame(srcPath("no-caret.png"), tempName, { ignoreCaret: false }, (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(true); done(); - } - ); - }); + }); + }, + ); }); - it('should create diff image not equal to reference if ignore caret is disabled', (done) => { - looksSame.createDiff({ - reference: srcPath('no-caret.png'), - current: srcPath('caret.png'), - diff: tempName, - highlightColor: '#FF00FF', - ignoreCaret: false - }, () => { - looksSame( - srcPath('no-caret.png'), tempName, {ignoreCaret: false}, - (error, {equal}) => { + it("should create diff image not equal to reference if ignore caret is disabled", done => { + looksSame.createDiff( + { + reference: srcPath("no-caret.png"), + current: srcPath("caret.png"), + diff: tempName, + highlightColor: "#FF00FF", + ignoreCaret: false, + }, + () => { + looksSame(srcPath("no-caret.png"), tempName, { ignoreCaret: false }, (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(false); done(); - } - ); - }); + }); + }, + ); }); }); - it('should create diff image not equal to reference if there is diff not in caret', (done) => { - looksSame.createDiff({ - reference: srcPath('no-caret.png'), - current: srcPath('1px-diff.png'), - diff: tempName, - highlightColor: '#FF00FF' - }, () => { - looksSame( - srcPath('no-caret.png'), tempName, - (error, {equal}) => { + it("should create diff image not equal to reference if there is diff not in caret", done => { + looksSame.createDiff( + { + reference: srcPath("no-caret.png"), + current: srcPath("1px-diff.png"), + diff: tempName, + highlightColor: "#FF00FF", + }, + () => { + looksSame(srcPath("no-caret.png"), tempName, (error, { equal }) => { expect(error).to.equal(null); expect(equal).to.equal(false); done(); - } - ); - }); + }); + }, + ); }); }); - it('should create diff image equal to reference if there are diff in antialised pixels and caret', (done) => { - looksSame.createDiff({ - reference: srcPath('caret+antialiasing.png'), - current: srcPath('no-caret+antialiasing.png'), - diff: tempName, - highlightColor: '#FF00FF', - ignoreAntialiasing: true, - ignoreCaret: true - }, () => { - looksSame( - srcPath('caret+antialiasing.png'), tempName, {ignoreAntialiasing: false}, - (error, {equal}) => { - expect(error).to.equal(null); - expect(equal).to.equal(true); - done(); - } - ); - }); + it("should create diff image equal to reference if there are diff in antialised pixels and caret", done => { + looksSame.createDiff( + { + reference: srcPath("caret+antialiasing.png"), + current: srcPath("no-caret+antialiasing.png"), + diff: tempName, + highlightColor: "#FF00FF", + ignoreAntialiasing: true, + ignoreCaret: true, + }, + () => { + looksSame( + srcPath("caret+antialiasing.png"), + tempName, + { ignoreAntialiasing: false }, + (error, { equal }) => { + expect(error).to.equal(null); + expect(equal).to.equal(true); + done(); + }, + ); + }, + ); }); }); -describe('colors', () => { - it('should return true for same colors', () => { - expect( - looksSame.colors( - {R: 255, G: 0, B: 0}, - {R: 255, G: 0, B: 0} - ) - ).to.be.equal(true); - }); - - it('should return false for different colors', () => { - expect( - looksSame.colors( - {R: 255, G: 0, B: 0}, - {R: 0, G: 0, B: 255} - ) - ).to.be.equal(false); - }); - - it('should return true for similar colors', () => { - expect( - looksSame.colors( - {R: 255, G: 0, B: 0}, - {R: 254, G: 1, B: 1} - ) - ).to.be.equal(true); - }); - - it('should return false for similar colors if tolerance is low enough', () => { - expect( - looksSame.colors( - {R: 255, G: 0, B: 0}, - {R: 254, G: 1, B: 1}, - {tolerance: 0.0} - ) - ).to.be.equal(false); - }); - - it('should return true for different colors if tolerance is high enough', () => { - expect( - looksSame.colors( - {R: 255, G: 0, B: 0}, - {R: 0, G: 0, B: 255}, - {tolerance: 55.0} - ) - ).to.be.equal(true); +describe("colors", () => { + it("should return true for same colors", () => { + expect(looksSame.colors({ R: 255, G: 0, B: 0 }, { R: 255, G: 0, B: 0 })).to.be.equal(true); + }); + + it("should return false for different colors", () => { + expect(looksSame.colors({ R: 255, G: 0, B: 0 }, { R: 0, G: 0, B: 255 })).to.be.equal(false); + }); + + it("should return true for similar colors", () => { + expect(looksSame.colors({ R: 255, G: 0, B: 0 }, { R: 254, G: 1, B: 1 })).to.be.equal(true); + }); + + it("should return false for similar colors if tolerance is low enough", () => { + expect(looksSame.colors({ R: 255, G: 0, B: 0 }, { R: 254, G: 1, B: 1 }, { tolerance: 0.0 })).to.be.equal(false); + }); + + it("should return true for different colors if tolerance is high enough", () => { + expect(looksSame.colors({ R: 255, G: 0, B: 0 }, { R: 0, G: 0, B: 255 }, { tolerance: 55.0 })).to.be.equal(true); }); }); -describe('getDiffArea', () => { +describe("getDiffArea", () => { const sandbox = sinon.createSandbox(); afterEach(() => sandbox.restore()); - it('should format images', (done) => { - sandbox.spy(utils, 'formatImages'); + it("should format images", done => { + sandbox.spy(utils, "formatImages"); - looksSame.getDiffArea(srcPath('ref.png'), srcPath('same.png'), () => { - assert.calledOnceWith(utils.formatImages, srcPath('ref.png'), srcPath('same.png')); + looksSame.getDiffArea(srcPath("ref.png"), srcPath("same.png"), () => { + assert.calledOnceWith(utils.formatImages, srcPath("ref.png"), srcPath("same.png")); done(); }); }); - it('should read formatted images', (done) => { - const [formattedImg1, formattedImg2] = [{source: srcPath('ref.png')}, {source: srcPath('same.png')}]; - sandbox.stub(utils, 'formatImages').returns([formattedImg1, formattedImg2]); - sandbox.spy(utils, 'readPair'); + it("should read formatted images", done => { + const [formattedImg1, formattedImg2] = [{ source: srcPath("ref.png") }, { source: srcPath("same.png") }]; + sandbox.stub(utils, "formatImages").returns([formattedImg1, formattedImg2]); + sandbox.spy(utils, "readPair"); - looksSame.getDiffArea(srcPath('ref.png'), srcPath('same.png'), () => { + looksSame.getDiffArea(srcPath("ref.png"), srcPath("same.png"), () => { assert.calledOnceWith(utils.readPair, formattedImg1, formattedImg2); done(); }); }); - it('should return null for similar images', (done) => { - looksSame.getDiffArea(srcPath('ref.png'), srcPath('same.png'), (error, result) => { + it("should return null for similar images", done => { + looksSame.getDiffArea(srcPath("ref.png"), srcPath("same.png"), (error, result) => { expect(error).to.equal(null); expect(result).to.equal(null); done(); }); }); - it('should return null for different images when tolerance is higher than difference', (done) => { - looksSame.getDiffArea(srcPath('ref.png'), srcPath('different.png'), {tolerance: 50}, (error, result) => { + it("should return null for different images when tolerance is higher than difference", done => { + looksSame.getDiffArea(srcPath("ref.png"), srcPath("different.png"), { tolerance: 50 }, (error, result) => { expect(error).to.equal(null); expect(result).to.equal(null); done(); }); }); - it('should return correct diff area for different images', (done) => { - looksSame.getDiffArea(srcPath('ref.png'), srcPath('different.png'), {stopOnFirstFail: false}, (error, result) => { - expect(error).to.equal(null); - expect(result.right).to.equal(49); - expect(result.bottom).to.equal(39); - expect(result.top).to.equal(10); - expect(result.left).to.equal(0); - done(); - }); + it("should return correct diff area for different images", done => { + looksSame.getDiffArea( + srcPath("ref.png"), + srcPath("different.png"), + { stopOnFirstFail: false }, + (error, result) => { + expect(error).to.equal(null); + expect(result.right).to.equal(49); + expect(result.bottom).to.equal(39); + expect(result.top).to.equal(10); + expect(result.left).to.equal(0); + done(); + }, + ); }); - it('should return sizes of a bigger image if images have different sizes', (done) => { - looksSame.getDiffArea(srcPath('ref.png'), srcPath('large-different.png'), (error, result) => { + it("should return sizes of a bigger image if images have different sizes", done => { + looksSame.getDiffArea(srcPath("ref.png"), srcPath("large-different.png"), (error, result) => { expect(error).to.equal(null); - expect(result).to.deep.equal({left: 0, top: 0, right: 499, bottom: 499}); + expect(result).to.deep.equal({ left: 0, top: 0, right: 499, bottom: 499 }); done(); }); }); - it('should return correct diff bounds for images that differ from each other exactly by 1 pixel', (done) => { - looksSame.getDiffArea(srcPath('no-caret.png'), srcPath('1px-diff.png'), (error, result) => { + it("should return correct diff bounds for images that differ from each other exactly by 1 pixel", done => { + looksSame.getDiffArea(srcPath("no-caret.png"), srcPath("1px-diff.png"), (error, result) => { expect(error).to.equal(null); - expect(result).to.deep.equal({left: 12, top: 6, right: 12, bottom: 6}); + expect(result).to.deep.equal({ left: 12, top: 6, right: 12, bottom: 6 }); done(); }); }); }); -describe('getDiffPixelsCoords', () => { - it('should return all diff area by default', (done) => { - const [img1, img2] = formatImages(srcPath('ref.png'), srcPath('different.png')); +describe("getDiffPixelsCoords", () => { + it("should return all diff area by default", done => { + const [img1, img2] = formatImages(srcPath("ref.png"), srcPath("different.png")); readPair(img1, img2).then(pair => { - getDiffPixelsCoords(pair.first, pair.second, areColorsSame, ({diffArea}) => { - expect(diffArea.area).to.deep.equal({left: 0, top: 0, right: 49, bottom: 39}); + getDiffPixelsCoords(pair.first, pair.second, areColorsSame, ({ diffArea }) => { + expect(diffArea.area).to.deep.equal({ left: 0, top: 0, right: 49, bottom: 39 }); done(); }); }); }); - it('should return first non-matching pixel if asked for', (done) => { - const [img1, img2] = formatImages(srcPath('ref.png'), srcPath('different.png')); + it("should return first non-matching pixel if asked for", done => { + const [img1, img2] = formatImages(srcPath("ref.png"), srcPath("different.png")); readPair(img1, img2).then(pair => { - getDiffPixelsCoords(pair.first, pair.second, areColorsSame, {stopOnFirstFail: true}, ({diffArea}) => { - expect(diffArea.area).to.deep.equal({left: 49, top: 0, right: 49, bottom: 0}); + getDiffPixelsCoords(pair.first, pair.second, areColorsSame, { stopOnFirstFail: true }, ({ diffArea }) => { + expect(diffArea.area).to.deep.equal({ left: 49, top: 0, right: 49, bottom: 0 }); done(); }); }); diff --git a/test/utils.ts b/test/utils.ts index cc1b43d..33b99d5 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -1,44 +1,44 @@ -import {formatImages} from '../src/lib/utils'; -import * as validators from '../src/lib/validators'; +import { formatImages } from "../src/lib/utils"; +import * as validators from "../src/lib/validators"; -describe('lib/utils', () => { +describe("lib/utils", () => { const sandbox = sinon.createSandbox(); beforeEach(() => { - sandbox.stub(validators, 'validateImages'); + sandbox.stub(validators, "validateImages"); }); afterEach(() => sandbox.restore()); - describe('formatImages', () => { - it('should validate images', () => { - formatImages('img1', 'img2'); + describe("formatImages", () => { + it("should validate images", () => { + formatImages("img1", "img2"); - assert.calledOnceWith(validators.validateImages, 'img1', 'img2'); + assert.calledOnceWith(validators.validateImages, "img1", "img2"); }); - it('should not format images passed as object', () => { - const [img1, img2] = [{source: 'img-path-1'}, {source: 'img-path-1'}]; + it("should not format images passed as object", () => { + const [img1, img2] = [{ source: "img-path-1" }, { source: "img-path-1" }]; const [formattedImg1, formattedImg2] = formatImages(img1, img2); assert.deepEqual(formattedImg1, img1); assert.deepEqual(formattedImg2, img2); }); - it('should format images passed as buffers', () => { - const [img1, img2] = [Buffer.from('img-1'), Buffer.from('img-2')]; + it("should format images passed as buffers", () => { + const [img1, img2] = [Buffer.from("img-1"), Buffer.from("img-2")]; const [formattedImg1, formattedImg2] = formatImages(img1, img2); - assert.deepEqual(formattedImg1, {source: img1, boundingBox: null}); - assert.deepEqual(formattedImg2, {source: img2, boundingBox: null}); + assert.deepEqual(formattedImg1, { source: img1, boundingBox: null }); + assert.deepEqual(formattedImg2, { source: img2, boundingBox: null }); }); - it('should format images passed as strings', () => { - const [img1, img2] = ['img-path-1', 'img-path-2']; + it("should format images passed as strings", () => { + const [img1, img2] = ["img-path-1", "img-path-2"]; const [formattedImg1, formattedImg2] = formatImages(img1, img2); - assert.deepEqual(formattedImg1, {source: img1, boundingBox: null}); - assert.deepEqual(formattedImg2, {source: img2, boundingBox: null}); + assert.deepEqual(formattedImg1, { source: img1, boundingBox: null }); + assert.deepEqual(formattedImg2, { source: img2, boundingBox: null }); }); }); }); diff --git a/test/validators.ts b/test/validators.ts index 093925a..63e90ce 100644 --- a/test/validators.ts +++ b/test/validators.ts @@ -1,55 +1,78 @@ -import _ from 'lodash'; -import {validateImages} from '../src/lib/validators'; +import _ from "lodash"; +import { validateImages } from "../src/lib/validators"; -describe('lib/validators', () => { - describe('validateImages', () => { - it('should not throws if called with buffers', () => { - assert.doesNotThrow(() => validateImages(Buffer.from('one'), Buffer.from('two'))); +describe("lib/validators", () => { + describe("validateImages", () => { + it("should not throws if called with buffers", () => { + assert.doesNotThrow(() => validateImages(Buffer.from("one"), Buffer.from("two"))); }); - describe('should throws if', () => { + describe("should throws if", () => { it('required field "source" does not exist', () => { - assert.throws(() => { - return validateImages({}, {}); - }, TypeError, 'Field "source" does not exist'); + assert.throws( + () => { + return validateImages({}, {}); + }, + TypeError, + 'Field "source" does not exist', + ); }); it('required field "boundingBox" does not exist', () => { - assert.throws(() => { - return validateImages( - {source: 'image-path'}, - {source: 'image-path'} - ); - }, TypeError, 'Field "boundingBox" does not exist'); + assert.throws( + () => { + return validateImages({ source: "image-path" }, { source: "image-path" }); + }, + TypeError, + 'Field "boundingBox" does not exist', + ); }); - ['left', 'top', 'right', 'bottom'].forEach((field) => { + ["left", "top", "right", "bottom"].forEach(field => { it(`required field "${field}" does not exist in "boundingBox"`, () => { - assert.throws(() => { - return validateImages( - {source: 'image-path', boundingBox: _.omit({left: 0, top: 0, right: 0, bottom: 0}, field)}, - {source: 'image-path', boundingBox: _.omit({left: 0, top: 0, right: 0, bottom: 0}, field)} - ); - }, TypeError, `Field "${field}" does not exist`); + assert.throws( + () => { + return validateImages( + { + source: "image-path", + boundingBox: _.omit({ left: 0, top: 0, right: 0, bottom: 0 }, field), + }, + { + source: "image-path", + boundingBox: _.omit({ left: 0, top: 0, right: 0, bottom: 0 }, field), + }, + ); + }, + TypeError, + `Field "${field}" does not exist`, + ); }); }); it('"left" coordinate in "boundingBox" field greater than "right"', () => { - assert.throws(() => { - return validateImages( - {source: 'image-path', boundingBox: {left: 1, top: 0, right: 0, bottom: 0}}, - {source: 'image-path', boundingBox: {left: 1, top: 0, right: 0, bottom: 0}} - ); - }, TypeError, '"left" coordinate in "boundingBox" field cannot be greater than "right"'); + assert.throws( + () => { + return validateImages( + { source: "image-path", boundingBox: { left: 1, top: 0, right: 0, bottom: 0 } }, + { source: "image-path", boundingBox: { left: 1, top: 0, right: 0, bottom: 0 } }, + ); + }, + TypeError, + '"left" coordinate in "boundingBox" field cannot be greater than "right"', + ); }); it('"top" coordinate in "boundingBox" field greater than "bottom"', () => { - assert.throws(() => { - return validateImages( - {source: 'image-path', boundingBox: {left: 0, top: 1, right: 0, bottom: 0}}, - {source: 'image-path', boundingBox: {left: 0, top: 1, right: 0, bottom: 0}} - ); - }, TypeError, '"top" coordinate in "boundingBox" field cannot be greater than "bottom"'); + assert.throws( + () => { + return validateImages( + { source: "image-path", boundingBox: { left: 0, top: 1, right: 0, bottom: 0 } }, + { source: "image-path", boundingBox: { left: 0, top: 1, right: 0, bottom: 0 } }, + ); + }, + TypeError, + '"top" coordinate in "boundingBox" field cannot be greater than "bottom"', + ); }); }); });