From 87e7419e13089f24377fa64165fc2972c4dd49ce Mon Sep 17 00:00:00 2001 From: Rob Muchall Date: Fri, 3 Apr 2020 15:22:28 +0100 Subject: [PATCH 01/30] Jest migration Replaced mocha, chai, sinon and nyc with jest Refactored tests to use jest Removed gulp and associated dependencies Replaced gulp with npm scripts (copyfiles, json, rimraf) Updated all dependencies --- .editorconfig | 12 - codecov.yml | 1 - gulpfile.js | 1 - gulpfile.ts | 299 - jest.config.js | 24 + package-lock.json | 7395 +++++++---------- package.json | 52 +- test/functional/basic-functionality.spec.ts | 731 +- .../circular-reference-problem.spec.ts | 30 +- test/functional/custom-transform.spec.ts | 282 +- test/functional/es6-data-types.spec.ts | 98 +- test/functional/ignore-decorators.spec.ts | 7 +- .../implicit-type-declarations.spec.ts | 70 +- test/functional/inheritence.spec.ts | 16 +- test/functional/prototype-inheritance.spec.ts | 28 - .../serialization-deserialization.spec.ts | 52 +- test/functional/specify-maps.spec.ts | 582 +- test/functional/transformation-option.spec.ts | 47 +- test/functional/transformer-method.spec.ts | 48 +- tsconfig.json | 81 +- tslint.json | 54 - 21 files changed, 4125 insertions(+), 5785 deletions(-) delete mode 100644 .editorconfig delete mode 100644 codecov.yml delete mode 100644 gulpfile.js delete mode 100644 gulpfile.ts create mode 100644 jest.config.js delete mode 100644 test/functional/prototype-inheritance.spec.ts delete mode 100644 tslint.json diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index c2cb2a0a0..000000000 --- a/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -# Editor configuration, see http://editorconfig.org -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 4 -insert_final_newline = true -trim_trailing_whitespace = true - -[*.json] -indent_size = 2 diff --git a/codecov.yml b/codecov.yml deleted file mode 100644 index db2472009..000000000 --- a/codecov.yml +++ /dev/null @@ -1 +0,0 @@ -comment: off diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 52c9c44f6..000000000 --- a/gulpfile.js +++ /dev/null @@ -1 +0,0 @@ -eval(require("typescript").transpile(require("fs").readFileSync("./gulpfile.ts").toString())); \ No newline at end of file diff --git a/gulpfile.ts b/gulpfile.ts deleted file mode 100644 index c676bfeff..000000000 --- a/gulpfile.ts +++ /dev/null @@ -1,299 +0,0 @@ -import "es6-shim"; -import {Gulpclass, Task, SequenceTask, MergedTask} from "gulpclass"; - -const gulp = require("gulp"); -const del = require("del"); -const shell = require("gulp-shell"); -const replace = require("gulp-replace"); -const mocha = require("gulp-mocha"); -const chai = require("chai"); -const tslint = require("gulp-tslint"); -const stylish = require("tslint-stylish"); -const ts = require("gulp-typescript"); -const sourcemaps = require("gulp-sourcemaps"); -const istanbul = require("gulp-istanbul"); -const remapIstanbul = require("remap-istanbul/lib/gulpRemapIstanbul"); -const rename = require("gulp-rename"); -const file = require("gulp-file"); -const uglify = require("gulp-uglify"); - -@Gulpclass() -export class Gulpfile { - - // ------------------------------------------------------------------------- - // General tasks - // ------------------------------------------------------------------------- - - /** - * Cleans build folder. - */ - @Task() - clean(cb: Function) { - return del(["./build/**"], cb); - } - - /** - * Runs typescript files compilation. - */ - @Task() - compile() { - return gulp.src("*.js", { read: false }) - .pipe(shell(["tsc"])); - } - - // ------------------------------------------------------------------------- - // Bundling task - // ------------------------------------------------------------------------- - - /** - * Compiles and compiles bundles. - */ - @MergedTask() - compileBundles() { - const amdTsProject = ts.createProject("tsconfig.json", { - module: "amd", - outFile: "class-transformer.amd.js", - typescript: require("typescript") - }); - const systemTsProject = ts.createProject("tsconfig.json", { - module: "system", - outFile: "class-transformer.system.js", - typescript: require("typescript") - }); - const amdPureTsProject = ts.createProject("tsconfig.json", { - module: "amd", - outFile: "class-transformer.pure.amd.js", - noEmitHelpers: true, - noImplicitUseStrict: true, - typescript: require("typescript") - }); - const systemPureTsProject = ts.createProject("tsconfig.json", { - module: "system", - outFile: "class-transformer.pure.system.js", - noEmitHelpers: true, - noImplicitUseStrict: true, - typescript: require("typescript") - }); - - return [ - gulp.src("build/bundle/**/*.ts") - .pipe(amdTsProject()).js - .pipe(gulp.dest("build/package")), - - gulp.src("build/bundle/**/*.ts") - .pipe(systemTsProject()).js - .pipe(gulp.dest("build/package")), - - gulp.src("build/bundle/**/*.ts") - .pipe(amdPureTsProject()).js - .pipe(gulp.dest("build/package")), - - gulp.src("build/bundle/**/*.ts") - .pipe(systemPureTsProject()).js - .pipe(gulp.dest("build/package")) - ]; - } - - /** - * Copies all source files into destination folder in a correct structure to build bundles. - */ - @Task() - bundleCopySources() { - return gulp.src(["./src/**/*.ts"]) - .pipe(gulp.dest("./build/bundle/class-transformer")); - } - - /** - * Creates special main file for bundle build. - */ - @Task() - bundleCopyMainFile() { - return gulp.src("./package.json", { read: false }) - .pipe(file("class-transformer.ts", `export * from "./class-transformer/index";`)) - .pipe(gulp.dest("./build/bundle")); - } - - /** - * Uglifys bundles. - */ - @MergedTask() - uglify() { - return [ - gulp.src(`./build/package/class-transformer.pure.amd.js`) - .pipe(uglify()) - .pipe(rename(`class-transformer.pure.amd.min.js`)) - .pipe(gulp.dest("./build/package")), - - gulp.src(`./build/package/class-transformer.pure.system.js`) - .pipe(uglify()) - .pipe(rename(`class-transformer.pure.system.min.js`)) - .pipe(gulp.dest("./build/package")), - - gulp.src(`./build/package/class-transformer.amd.js`) - .pipe(uglify()) - .pipe(rename(`class-transformer.amd.min.js`)) - .pipe(gulp.dest("./build/package")), - - gulp.src(`./build/package/class-transformer.system.js`) - .pipe(uglify()) - .pipe(rename(`class-transformer.system.min.js`)) - .pipe(gulp.dest("./build/package")), - ]; - } - - // ------------------------------------------------------------------------- - // Packaging and Publishing tasks - // ------------------------------------------------------------------------- - - /** - * Publishes a package to npm from ./build/package directory. - */ - @Task() - npmPublish() { - return gulp.src("*.js", { read: false }) - .pipe(shell([ - "cd ./build/package && npm publish" - ])); - } - - /** - * Copies all sources to the package directory. - */ - @MergedTask() - packageCompile() { - const tsProject = ts.createProject("tsconfig.json"); - const tsResult = gulp.src(["./src/**/*.ts", "./typings/**/*.ts"]) - .pipe(sourcemaps.init()) - .pipe(tsProject()); - - return [ - tsResult.dts.pipe(gulp.dest("./build/package")), - tsResult.js - .pipe(sourcemaps.write(".", { sourceRoot: "", includeContent: true })) - .pipe(gulp.dest("./build/package")) - ]; - } - - /** - * Moves all compiled files to the final package directory. - */ - @Task() - packageMoveCompiledFiles() { - return gulp.src("./build/package/src/**/*") - .pipe(gulp.dest("./build/package")); - } - - /** - * Moves all compiled files to the final package directory. - */ - @Task() - packageClearCompileDirectory(cb: Function) { - return del([ - "./build/package/src/**" - ], cb); - } - - /** - * Change the "private" state of the packaged package.json file to public. - */ - @Task() - packagePreparePackageFile() { - return gulp.src("./package.json") - .pipe(replace("\"private\": true,", "\"private\": false,")) - .pipe(gulp.dest("./build/package")); - } - - /** - * This task will replace all typescript code blocks in the README (since npm does not support typescript syntax - * highlighting) and copy this README file into the package folder. - */ - @Task() - packageReadmeFile() { - return gulp.src("./README.md") - .pipe(replace(/```typescript([\s\S]*?)```/g, "```javascript$1```")) - .pipe(gulp.dest("./build/package")); - } - - /** - * Creates a package that can be published to npm. - */ - @SequenceTask() - package() { - return [ - "clean", - ["bundleCopySources", "bundleCopyMainFile"], - ["compile", "compileBundles"], - ["uglify"], - "packageCompile", - "packageMoveCompiledFiles", - "packageClearCompileDirectory", - ["packagePreparePackageFile", "packageReadmeFile"] - ]; - } - - /** - * Creates a package and publishes it to npm. - */ - @SequenceTask() - publish() { - return ["package", "npmPublish"]; - } - - // ------------------------------------------------------------------------- - // Run tests tasks - // ------------------------------------------------------------------------- - - /** - * Runs ts linting to validate source code. - */ - @Task() - tslint() { - return gulp.src(["./src/**/*.ts", "./test/**/*.ts", "./sample/**/*.ts"]) - .pipe(tslint()) - .pipe(tslint.report(stylish, { - emitError: true, - sort: true, - bell: true - })); - } - - /** - * Runs before test coverage, required step to perform a test coverage. - */ - @Task() - coveragePre() { - return gulp.src(["./build/es5/src/**/*.js"]) - .pipe(istanbul()) - .pipe(istanbul.hookRequire()); - } - - /** - * Runs post coverage operations. - */ - @Task("coveragePost", ["coveragePre"]) - coveragePost() { - chai.should(); - chai.use(require("sinon-chai")); - chai.use(require("chai-as-promised")); - - return gulp.src(["./build/es5/test/functional/**/*.js"]) - .pipe(mocha()) - .pipe(istanbul.writeReports()); - } - - @Task() - coverageRemap() { - return gulp.src("./coverage/coverage-final.json") - .pipe(remapIstanbul()) - .pipe(gulp.dest("./coverage")); - } - - /** - * Compiles the code and runs tests. - */ - @SequenceTask() - tests() { - return ["compile", "coveragePost", "coverageRemap", "tslint"]; - } - -} \ No newline at end of file diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 000000000..54ad0dbdd --- /dev/null +++ b/jest.config.js @@ -0,0 +1,24 @@ +module.exports = { + modulePaths: ["/node_modules"], + transform: { + "^.+\\.tsx?$": "ts-jest" + }, + testRegex: "(/__test__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", + testEnvironment: "node", + moduleFileExtensions: [ + "ts", + "tsx", + "js", + "jsx", + "json", + "node" + ], + modulePathIgnorePatterns: [ + "/build/" + ], + coverageReporters: [ + // "html", + // "lcov", + "text-summary" + ] +}; diff --git a/package-lock.json b/package-lock.json index 218a9108b..8e6e063dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,169 +4,735 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "@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/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", "dev": true, "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, - "@types/chai": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-3.5.2.tgz", - "integrity": "sha1-wRzSgX06QBt7oPWkIPNcVhObHB4=", - "dev": true + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } }, - "@types/es6-shim": { - "version": "0.31.37", - "resolved": "https://registry.npmjs.org/@types/es6-shim/-/es6-shim-0.31.37.tgz", - "integrity": "sha512-D9BRx0HXsIpa9Ldh/NcHYgL/PtfchL4CC0MtbGliWsTYDuzm9vl6/QeTigNxIhbSBai7QIuv+etQ9BtlFN7Uqw==", - "dev": true + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } }, - "@types/fancy-log": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@types/fancy-log/-/fancy-log-1.3.0.tgz", - "integrity": "sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw==", - "dev": true + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } }, - "@types/mocha": { - "version": "2.2.48", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", - "dev": true + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } }, - "@types/moment": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@types/moment/-/moment-2.13.0.tgz", - "integrity": "sha1-YE69GJvDvDShVIaJQE5hoqSqyJY=", + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", "dev": true, "requires": { - "moment": "*" + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" } }, - "@types/node": { - "version": "0.0.2", - "resolved": "http://registry.npmjs.org/@types/node/-/node-0.0.2.tgz", - "integrity": "sha1-DaSTSQL79oqXoPUyBKNa0iJJF7w=", - "dev": true + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } }, - "@types/sinon": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-2.3.7.tgz", - "integrity": "sha512-w+LjztaZbgZWgt/y/VMP5BUAWLtSyoIJhXyW279hehLPyubDoBNwvhcj3WaSptcekuKYeTCVxrq60rdLc6ImJA==", + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } }, - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", "dev": true }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + } + }, + "@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": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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": { - "is-buffer": "^1.1.5" + "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 + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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" } } } }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "optional": true + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { - "string-width": "^2.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { - "ansi-wrap": "^0.1.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", "dev": true, "requires": { - "ansi-wrap": "0.1.0" + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" } }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, "requires": { - "ansi-wrap": "0.1.0" + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, "requires": { - "ansi-wrap": "0.1.0" + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" } }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jest/console": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.2.6.tgz", + "integrity": "sha512-bGp+0PicZVCEhb+ifnW9wpKWONNdkhtJsRE7ap729hiAfTvCN6VhGx0s/l/V/skA2pnyqq+N/7xl9ZWfykDpsg==", + "dev": true, + "requires": { + "@jest/source-map": "^25.2.6", + "chalk": "^3.0.0", + "jest-util": "^25.2.6", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.2.7.tgz", + "integrity": "sha512-Nd6ELJyR+j0zlwhzkfzY70m04hAur0VnMwJXVe4VmmD/SaQ6DEyal++ERQ1sgyKIKKEqRuui6k/R0wHLez4P+g==", + "dev": true, + "requires": { + "@jest/console": "^25.2.6", + "@jest/reporters": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-changed-files": "^25.2.6", + "jest-config": "^25.2.7", + "jest-haste-map": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-resolve-dependencies": "^25.2.7", + "jest-runner": "^25.2.7", + "jest-runtime": "^25.2.7", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", + "jest-watcher": "^25.2.7", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "realpath-native": "^2.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.2.6.tgz", + "integrity": "sha512-17WIw+wCb9drRNFw1hi8CHah38dXVdOk7ga9exThhGtXlZ9mK8xH4DjSB9uGDGXIWYSHmrxoyS6KJ7ywGr7bzg==", + "dev": true, + "requires": { + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6" + } + }, + "@jest/fake-timers": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.2.6.tgz", + "integrity": "sha512-A6qtDIA2zg/hVgUJJYzQSHFBIp25vHdSxW/s4XmTJAYxER6eL0NQdQhe4+232uUSviKitubHGXXirt5M7blPiA==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", + "lolex": "^5.0.0" + } + }, + "@jest/reporters": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.2.6.tgz", + "integrity": "sha512-DRMyjaxcd6ZKctiXNcuVObnPwB1eUs7xrUVu0J2V0p5/aZJei5UM9GL3s/bmN4hRV8Mt3zXh+/9X2o0Q4ClZIA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "jest-haste-map": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", + "node-notifier": "^6.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^3.1.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.0.1" + } + }, + "@jest/source-map": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", + "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.3", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.2.6.tgz", + "integrity": "sha512-gmGgcF4qz/pkBzyfJuVHo2DA24kIgVQ5Pf/VpW4QbyMLSegi8z+9foSZABfIt5se6k0fFj/3p/vrQXdaOgit0w==", + "dev": true, + "requires": { + "@jest/console": "^25.2.6", + "@jest/types": "^25.2.6", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.2.7.tgz", + "integrity": "sha512-s2uYGOXONDSTJQcZJ9A3Zkg3hwe53RlX1HjUNqjUy3HIqwgwCKJbnAKYsORPbhxXi3ARMKA7JNBi9arsTxXoYw==", + "dev": true, + "requires": { + "@jest/test-result": "^25.2.6", + "jest-haste-map": "^25.2.6", + "jest-runner": "^25.2.7", + "jest-runtime": "^25.2.7" + } + }, + "@jest/transform": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.2.6.tgz", + "integrity": "sha512-rZnjCjZf9avPOf9q/w9RUZ9Uc29JmB53uIXNJmNz04QbDMD5cR/VjfikiMKajBsXe2vnFl5sJ4RTt+9HPicauQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^25.2.6", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.3", + "jest-haste-map": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-util": "^25.2.6", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.6.tgz", + "integrity": "sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "@sinonjs/commons": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@types/babel__core": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", + "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", + "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@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 }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", "dev": true }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "25.1.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.5.tgz", + "integrity": "sha512-FBmb9YZHoEOH56Xo/PIYtfuyTL0IzJLM3Hy0Sqc82nn5eqqXgefKcl/eMgChM8eSGVfoDee8cdlj7K74T8a6Yg==", + "dev": true, + "requires": { + "jest-diff": "25.1.0", + "pretty-format": "25.1.0" + } + }, + "@types/node": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", + "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", "dev": true }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "@types/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "dev": true + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "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" + } + }, + "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": "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" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "argparse": { @@ -196,43 +762,10 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-differ": { + "array-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "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-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "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=", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, "array-unique": { @@ -241,16 +774,19 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "assign-symbols": { @@ -259,10 +795,16 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "async": { - "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "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 + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "atob": { @@ -271,23 +813,72 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "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=", + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "babel-jest": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.2.6.tgz", + "integrity": "sha512-MDJOAlwtIeIQiGshyX0d2PxTbV73xZMpNji40ivVTPQOm59OdRR9nYCkffqI7ugtsK4JR98HgNKbDbuVf4k5QQ==", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.2.6", + "chalk": "^3.0.0", + "slash": "^3.0.0" } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz", + "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-jest": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.2.6.tgz", + "integrity": "sha512-Xh2eEAwaLY9+SyMt/xmGZDnXTW/7pSaBPG0EMo7EuhvosFKVWYB6CqwYD31DaEQuoTL090oDZ0FEqygffGRaSQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-bigint": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^25.2.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", @@ -343,74 +934,13 @@ } } }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "binaryextensions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz", - "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.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" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.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 - }, - "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" - } - } + "tweetnacl": "^0.14.3" } }, "brace-expansion": { @@ -424,44 +954,59 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" }, "dependencies": { - "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" - } + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true } } }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } }, - "builtin-modules": { + "buffer-from": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "cache-base": { @@ -481,84 +1026,47 @@ "unset-value": "^1.0.0" } }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "http://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" - } - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" + "rsvp": "^4.8.4" } }, - "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" - } + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "class-utils": { @@ -584,41 +1092,27 @@ } } }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "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=", + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, "collection-visit": { @@ -632,43 +1126,33 @@ } }, "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==", + "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.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "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 }, - "colors": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", - "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", - "dev": true - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "optional": true + "requires": { + "delayed-stream": "~1.0.0" + } }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "concat-map": { @@ -677,32 +1161,10 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -714,111 +1176,269 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "copyfiles": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.2.0.tgz", + "integrity": "sha512-iJbHJI+8OKqsq+4JF0rqgRkZzo++jqO6Wf4FUU1JM41cJF6JcY5968XyF4tm3Kkm7ZOMrqlljdm8N9oyY5raGw==", + "dev": true, + "requires": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^0.5.1", + "noms": "0.0.0", + "through2": "^2.0.1", + "yargs": "^13.2.4" + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.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=", "dev": true }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" }, "dependencies": { - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "isexe": "^2.0.0" } } } }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "cssstyle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", + "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", "dev": true, "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "cssom": "~0.3.6" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true } } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "array-find-index": "^1.0.1" + "assert-plus": "^1.0.0" } }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, "requires": { - "ms": "2.0.0" + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" } }, - "debug-fabulous": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.0.4.tgz", - "integrity": "sha1-+gccXYdIRoVCSAdCHKSxawsaB2M=", + "dayjs": { + "version": "1.8.23", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.23.tgz", + "integrity": "sha512-NmYHMFONftoZbeOhVz6jfiXI4zSiPN6NoVWJgC0aZQfYVwzy/ZpESPHuCcI0B8BUMpSJQ08zenHDbofOLKq8hQ==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "debug": "2.X", - "lazy-debug-legacy": "0.0.X", - "object-assign": "4.1.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - } + "ms": "^2.1.1" } }, "decamelize": { @@ -833,35 +1453,17 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "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-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "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 }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true }, "define-property": { "version": "2.0.2", @@ -904,157 +1506,64 @@ } } }, - "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" - } - }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true - }, - "detect-file": { + "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { - "is-obj": "^1.0.0" + "webidl-conversions": "^4.0.2" } }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { - "readable-stream": "~1.1.9" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "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 }, - "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", - "dev": true, - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - } - } - } - }, - "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==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "once": "^1.4.0" } }, - "es6-shim": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.3.tgz", - "integrity": "sha1-m/tzY/7//4emzbbNk+QF7DxLbyY=", - "dev": true - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1062,56 +1571,50 @@ "dev": true }, "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", "dev": true, "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", + "esprima": "^4.0.1", + "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } + "source-map": "~0.6.1" } }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "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 }, "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "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 + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", @@ -1119,6 +1622,12 @@ "strip-eof": "^1.0.0" } }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -1134,6 +1643,15 @@ "to-regex": "^3.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -1151,73 +1669,27 @@ "requires": { "is-extendable": "^0.1.0" } - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "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" - } - }, - "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" - } } } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "expect": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.2.7.tgz", + "integrity": "sha512-yA+U2Ph0MkMsJ9N8q5hs9WgWI6oJYfecdXta6LkP/alY/jZZL1MHlJ2wbLh60Ucqf3G+51ytbqV3mlGfmxkpNw==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "@jest/types": "^25.2.6", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-regex-util": "^25.2.6" } }, "extend": { @@ -1275,1371 +1747,231 @@ "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" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" - } - }, - "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 - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "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" - } - } - } - }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "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" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "flagged-respawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", - "dev": true, - "requires": { - "samsam": "~1.1" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "dev": true, - "requires": { - "globule": "~0.1.0" - } - }, - "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-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.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" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "dev": true, - "requires": { - "glob": "^4.3.1", - "glob2base": "^0.0.12", - "minimatch": "^2.0.1", - "ordered-read-streams": "^0.1.0", - "through2": "^0.6.1", - "unique-stream": "^1.0.0" - }, - "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "^0.5.1" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "^0.1.1" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "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" - } - }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "~3.1.21", - "lodash": "~1.0.1", - "minimatch": "~0.2.11" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "glogg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", - "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "got": { - "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "^1.1.0" - } - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "gulp": { - "version": "3.9.1", - "resolved": "http://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", - "dev": true, - "requires": { - "archy": "^1.0.0", - "chalk": "^1.0.0", - "deprecated": "^0.0.1", - "gulp-util": "^3.0.0", - "interpret": "^1.0.0", - "liftoff": "^2.1.0", - "minimist": "^1.1.0", - "orchestrator": "^0.3.0", - "pretty-hrtime": "^1.0.0", - "semver": "^4.1.0", - "tildify": "^1.0.0", - "v8flags": "^2.0.2", - "vinyl-fs": "^0.3.0" - } - }, - "gulp-file": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/gulp-file/-/gulp-file-0.3.0.tgz", - "integrity": "sha1-6MTXY/Em+zMy/EFuPR70btZ9jQ0=", - "dev": true, - "requires": { - "gulp-util": "^2.2.14", - "through2": "^0.4.1" - }, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "chalk": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true, - "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "gulp-util": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", - "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", - "dev": true, - "requires": { - "chalk": "^0.5.0", - "dateformat": "^1.0.7-1.2.3", - "lodash._reinterpolate": "^2.4.1", - "lodash.template": "^2.4.1", - "minimist": "^0.2.0", - "multipipe": "^0.1.0", - "through2": "^0.5.0", - "vinyl": "^0.2.1" - }, - "dependencies": { - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~3.0.0" - } - } - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.0" - } - }, - "lodash._reinterpolate": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", - "dev": true - }, - "lodash.escape": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", - "dev": true, - "requires": { - "lodash._escapehtmlchar": "~2.4.1", - "lodash._reunescapedhtml": "~2.4.1", - "lodash.keys": "~2.4.1" - } - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - }, - "lodash.template": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", - "dev": true, - "requires": { - "lodash._escapestringchar": "~2.4.1", - "lodash._reinterpolate": "~2.4.1", - "lodash.defaults": "~2.4.1", - "lodash.escape": "~2.4.1", - "lodash.keys": "~2.4.1", - "lodash.templatesettings": "~2.4.1", - "lodash.values": "~2.4.1" - } - }, - "lodash.templatesettings": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", - "dev": true, - "requires": { - "lodash._reinterpolate": "~2.4.1", - "lodash.escape": "~2.4.1" - } - }, - "minimist": { - "version": "0.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", - "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.1" - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - }, - "dependencies": { - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "vinyl": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", - "dev": true, - "requires": { - "clone-stats": "~0.0.1" - } - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - } - } - }, - "gulp-istanbul": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gulp-istanbul/-/gulp-istanbul-1.1.3.tgz", - "integrity": "sha512-uMLSdqPDnBAV/B9rNyOgVMgrVC1tPbe+5GH6P13UOyxbRDT/w4sKYHWftPMA8j9om+NFvfeRlqpDXL2fixFWNA==", - "dev": true, - "requires": { - "istanbul": "^0.4.0", - "istanbul-threshold-checker": "^0.2.1", - "lodash": "^4.0.0", - "plugin-error": "^0.1.2", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.1" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "gulp-mocha": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-3.0.1.tgz", - "integrity": "sha1-qwyiw5QDcYF03drXUOY6Yb4X4EE=", - "dev": true, - "requires": { - "gulp-util": "^3.0.0", - "mocha": "^3.0.0", - "plur": "^2.1.0", - "req-cwd": "^1.0.1", - "temp": "^0.8.3", - "through": "^2.3.4" - } - }, - "gulp-rename": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", - "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", - "dev": true - }, - "gulp-replace": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.5.4.tgz", - "integrity": "sha1-aaZ5FLvRPFYr/xT1BKQDeWqg2qk=", - "dev": true, - "requires": { - "istextorbinary": "1.0.2", - "readable-stream": "^2.0.1", - "replacestream": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "gulp-shell": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.5.2.tgz", - "integrity": "sha1-pJWcoGUa0ce7/nCy0K27tOGuqY0=", - "dev": true, - "requires": { - "async": "^1.5.0", - "gulp-util": "^3.0.7", - "lodash": "^4.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "gulp-sourcemaps": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz", - "integrity": "sha1-tDfR89mAzyboEYSCNxjOFa5ll7Y=", - "dev": true, - "requires": { - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "4.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "0.0.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom": "2.X", - "through2": "2.X", - "vinyl": "1.X" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "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 - }, - "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" - } - }, - "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" - } - } - } - }, - "gulp-tslint": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-8.1.3.tgz", - "integrity": "sha512-KEP350N5B9Jg6o6jnyCyKVBPemJePYpMsGfIQq0G0ErvY7tw4Lrfb/y3L4WRf7ek0OsaE8nnj86w+lcLXW8ovw==", - "dev": true, - "requires": { - "@types/fancy-log": "1.3.0", - "chalk": "2.3.1", - "fancy-log": "1.3.2", - "map-stream": "~0.0.7", - "plugin-error": "1.0.1", - "through": "~2.3.8" - }, - "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.3.1", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.2.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 - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - }, - "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" - } - } - } - }, - "gulp-typescript": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-3.2.4.tgz", - "integrity": "sha512-bZosNvbUGzFA4bjjWoUPyjU5vfgJSzlYKkU0Jutbsrj+td8yvtqxethhqfzB9MwyamaUODIuidj5gIytZ523Bw==", - "dev": true, - "requires": { - "gulp-util": "~3.0.7", - "source-map": "~0.5.3", - "through2": "~2.0.1", - "vinyl-fs": "~2.4.3" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "dev": true, - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.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" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "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" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "is-extendable": "^0.1.0" } }, - "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" + "kind-of": "^6.0.0" } }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "kind-of": "^6.0.0" } }, - "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", - "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", - "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } }, - "gulp-uglify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-2.1.2.tgz", - "integrity": "sha1-bbhbHQ7mPRgFhZK2WGSdZcLsRUE=", - "dev": true, - "requires": { - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash": "^4.13.1", - "make-error-cause": "^1.1.1", - "through2": "^2.0.0", - "uglify-js": "~2.8.10", - "uglify-save-license": "^0.4.1", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - } + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "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 + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" } }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" } }, - "gulpclass": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/gulpclass/-/gulpclass-0.1.2.tgz", - "integrity": "sha1-0m9cOdw5nhHEWpCHh8hkkLwx6FA=", + "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" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "gulp": "^3.9.0", - "merge2": "^0.3.6", - "run-sequence": "^1.1.5" + "map-cache": "^0.2.2" } }, - "gulplog": { + "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "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-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "glogg": "^1.0.0" + "pump": "^3.0.0" } }, - "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "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 - } + "assert-plus": "^1.0.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "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" } }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "sparkles": "^1.0.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.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 + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2661,6 +1993,26 @@ "kind-of": "^4.0.0" }, "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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" + } + } + } + }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -2672,32 +2024,56 @@ } } }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "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" + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } }, "imurmurhash": { "version": "0.1.4", @@ -2705,15 +2081,6 @@ "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" - } - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2725,39 +2092,17 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -2778,34 +2123,19 @@ } } }, - "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-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { - "ci-info": "^1.5.0" + "ci-info": "^2.0.0" } }, "is-data-descriptor": { @@ -2829,140 +2159,47 @@ } }, "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" - }, - "dependencies": { - "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 - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.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": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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": { - "kind-of": "^3.0.2" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "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" - } + "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 } } }, - "is-obj": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "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-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "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 }, - "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-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true }, - "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-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-plain-object": { "version": "2.0.4", @@ -2973,64 +2210,16 @@ "isobject": "^3.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-unc-path": { + "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "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=", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "is-windows": { @@ -3039,10 +2228,17 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "dev": true, + "optional": true + }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { @@ -3057,614 +2253,867 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, - "istanbul-threshold-checker": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/istanbul-threshold-checker/-/istanbul-threshold-checker-0.2.1.tgz", - "integrity": "sha1-xdyU6PLMXNP/0zVFL4S1U8QkgzE=", + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", "dev": true, "requires": { - "istanbul": "~0.4.5", - "lodash": "~4.17.2" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" } }, - "istextorbinary": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz", - "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=", + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "binaryextensions": "~1.0.0", - "textextensions": "~1.0.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" } }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "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==", + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "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 - } + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" } }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-Vm9xwCiQ8t2cNNnckyeAV0UdxKpcQUz4nMxsBvIu8n2kmPSiyb5uaF/8LpmKr+yqL/MdOXaX2Nmdo4Qyxium9Q==", "dev": true, "requires": { - "jsonify": "~0.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "jest": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.2.7.tgz", + "integrity": "sha512-XV1n/CE2McCikl4tfpCY950RytHYvxdo/wvtgmn/qwA8z1s16fuvgFL/KoPrrmkqJTaPMUlLVE58pwiaTX5TdA==", "dev": true, "requires": { - "package-json": "^4.0.0" + "@jest/core": "^25.2.7", + "import-local": "^3.0.2", + "jest-cli": "^25.2.7" + }, + "dependencies": { + "jest-cli": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.2.7.tgz", + "integrity": "sha512-OOAZwY4Jkd3r5WhVM5L3JeLNFaylvHUczMLxQDVLrrVyb1Cy+DNJ6MVsb5TLh6iBklB42m5TOP+IbOgKGGOtMw==", + "dev": true, + "requires": { + "@jest/core": "^25.2.7", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", + "prompts": "^2.0.1", + "realpath-native": "^2.0.0", + "yargs": "^15.3.1" + } + } } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lazy-debug-legacy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz", - "integrity": "sha1-U3cWwHduTPeePtG2IfdljCkRsbE=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "jest-changed-files": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.2.6.tgz", + "integrity": "sha512-F7l2m5n55jFnJj4ItB9XbAlgO+6umgvz/mdK76BfTd2NGkvGf9x96hUXP/15a1K0k14QtVOoutwpRKl360msvg==", "dev": true, "requires": { - "readable-stream": "^2.0.5" + "@jest/types": "^25.2.6", + "execa": "^3.2.0", + "throat": "^5.0.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "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" + "path-key": "^3.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==", + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "shebang-regex": "^3.0.0" } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true } } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "jest-config": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.2.7.tgz", + "integrity": "sha512-rIdPPXR6XUxi+7xO4CbmXXkE6YWprvlKc4kg1SrkCL2YV5m/8MkHstq9gBZJ19Qoa3iz/GP+0sTG/PcIwkFojg==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^25.2.7", + "@jest/types": "^25.2.6", + "babel-jest": "^25.2.6", + "chalk": "^3.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "jest-environment-jsdom": "^25.2.6", + "jest-environment-node": "^25.2.6", + "jest-get-type": "^25.2.6", + "jest-jasmine2": "^25.2.7", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", + "micromatch": "^4.0.2", + "pretty-format": "^25.2.6", + "realpath-native": "^2.0.0" + }, + "dependencies": { + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } } }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "jest-diff": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", + "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", "dev": true, "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" + "chalk": "^3.0.0", + "diff-sequences": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "jest-docblock": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.2.6.tgz", + "integrity": "sha512-VAYrljEq0upq0oERfIaaNf28gC6p9gORndhHstCYF8NWGNQJnzoaU//S475IxfWMk4UjjVmS9rJKLe5Jjjbixw==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.2.6.tgz", + "integrity": "sha512-OgQ01VINaRD6idWJOhCYwUc5EcgHBiFlJuw+ON2VgYr7HLtMFyCcuo+3mmBvuLUH4QudREZN7cDCZviknzsaJQ==", "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" + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "jest-util": "^25.2.6", + "pretty-format": "^25.2.6" }, "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" } } } }, - "lodash": { - "version": "1.0.2", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true + "jest-environment-jsdom": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.2.6.tgz", + "integrity": "sha512-/o7MZIhGmLGIEG5j7r5B5Az0umWLCHU+F5crwfbm0BzC4ybHTJZOQTFQWhohBg+kbTCNOuftMcqHlVkVduJCQQ==", + "dev": true, + "requires": { + "@jest/environment": "^25.2.6", + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", + "jsdom": "^15.2.1" + } + }, + "jest-environment-node": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.2.6.tgz", + "integrity": "sha512-D1Ihj14fxZiMHGeTtU/LunhzSI+UeBvlr/rcXMTNyRMUMSz2PEhuqGbB78brBY6Dk3FhJDk7Ta+8reVaGjLWhA==", + "dev": true, + "requires": { + "@jest/environment": "^25.2.6", + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", + "semver": "^6.3.0" + } + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "jest-haste-map": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.2.6.tgz", + "integrity": "sha512-nom0+fnY8jwzelSDQnrqaKAcDZczYQvMEwcBjeL3PQ4MlcsqeB7dmrsAniUw/9eLkngT5DE6FhnenypilQFsgA==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.3", + "jest-serializer": "^25.2.6", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7", + "which": "^2.0.2" + } + }, + "jest-jasmine2": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.2.7.tgz", + "integrity": "sha512-HeQxEbonp8fUvik9jF0lkU9ab1u5TQdIb7YSU9Fj7SxWtqHNDGyCpF6ZZ3r/5yuertxi+R95Ba9eA91GMQ38eA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^25.2.6", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "co": "^4.6.0", + "expect": "^25.2.7", + "is-generator-fn": "^2.0.0", + "jest-each": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-runtime": "^25.2.7", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "pretty-format": "^25.2.6", + "throat": "^5.0.0" + }, + "dependencies": { + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } + } }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "jest-leak-detector": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.2.6.tgz", + "integrity": "sha512-n+aJUM+j/x1kIaPVxzerMqhAUuqTU1PL5kup46rXh+l9SP8H6LqECT/qD1GrnylE1L463/0StSPkH4fUpkuEjA==", "dev": true, "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" + }, + "dependencies": { + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } } }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._escapehtmlchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", - "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "jest-matcher-utils": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.2.7.tgz", + "integrity": "sha512-jNYmKQPRyPO3ny0KY1I4f0XW4XnpJ3Nx5ovT4ik0TYDOYzuXJW40axqOyS61l/voWbVT9y9nZ1THL1DlpaBVpA==", "dev": true, "requires": { - "lodash._htmlescapes": "~2.4.1" + "chalk": "^3.0.0", + "jest-diff": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" + }, + "dependencies": { + "jest-diff": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.6.tgz", + "integrity": "sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" + } + }, + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } } }, - "lodash._escapestringchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", - "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._htmlescapes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._isnative": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", - "dev": true - }, - "lodash._objecttypes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true + "jest-message-util": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.2.6.tgz", + "integrity": "sha512-Hgg5HbOssSqOuj+xU1mi7m3Ti2nwSQJQf/kxEkrz2r2rp2ZLO1pMeKkz2WiDUWgSR+APstqz0uMFcE5yc0qdcg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.2.6", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + } }, - "lodash._reunescapedhtml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", - "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "jest-mock": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.2.6.tgz", + "integrity": "sha512-vc4nibavi2RGPdj/MyZy/azuDjZhpYZLvpfgq1fxkhbyTpKVdG7CgmRVKJ7zgLpY5kuMjTzDYA6QnRwhsCU+tA==", "dev": true, "requires": { - "lodash._htmlescapes": "~2.4.1", - "lodash.keys": "~2.4.1" + "@jest/types": "^25.2.6" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "jest-regex-util": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", + "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", + "dev": true + }, + "jest-resolve": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.2.6.tgz", + "integrity": "sha512-7O61GVdcAXkLz/vNGKdF+00A80/fKEAA47AEXVNcZwj75vEjPfZbXDaWFmAQCyXj4oo9y9dC9D+CLA11t8ieGw==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "jest-resolve-dependencies": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.7.tgz", + "integrity": "sha512-IrnMzCAh11Xd2gAOJL+ThEW6QO8DyqNdvNkQcaCticDrOAr9wtKT7yT6QBFFjqKFgjjvaVKDs59WdgUhgYnHnQ==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-snapshot": "^25.2.7" + } + }, + "jest-runner": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.2.7.tgz", + "integrity": "sha512-RFEr71nMrtNwcpoHzie5+fe1w3JQCGMyT2xzNwKe3f88+bK+frM2o1v24gEcPxQ2QqB3COMCe2+1EkElP+qqqQ==", + "dev": true, + "requires": { + "@jest/console": "^25.2.6", + "@jest/environment": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-config": "^25.2.7", + "jest-docblock": "^25.2.6", + "jest-haste-map": "^25.2.6", + "jest-jasmine2": "^25.2.7", + "jest-leak-detector": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-runtime": "^25.2.7", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + } + }, + "jest-runtime": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.2.7.tgz", + "integrity": "sha512-Gw3X8KxTTFylu2T/iDSNKRUQXQiPIYUY0b66GwVYa7W8wySkUljKhibQHSq0VhmCAN7vRBEQjlVQ+NFGNmQeBw==", + "dev": true, + "requires": { + "@jest/console": "^25.2.6", + "@jest/environment": "^25.2.6", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.3", + "jest-config": "^25.2.7", + "jest-haste-map": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + } + }, + "jest-serializer": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", + "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", + "dev": true + }, + "jest-snapshot": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.2.7.tgz", + "integrity": "sha512-Rm8k7xpGM4tzmYhB6IeRjsOMkXaU8/FOz5XlU6oYwhy53mq6txVNqIKqN1VSiexzpC80oWVxVDfUDt71M6XPOA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^25.2.6", + "@types/prettier": "^1.19.0", + "chalk": "^3.0.0", + "expect": "^25.2.7", + "jest-diff": "^25.2.6", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "make-dir": "^3.0.0", + "natural-compare": "^1.4.0", + "pretty-format": "^25.2.6", + "semver": "^6.3.0" }, "dependencies": { - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "jest-diff": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.6.tgz", + "integrity": "sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" + } + }, + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", "dev": true, "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" } } } }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash._shimkeys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1" - } - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "jest-util": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.2.6.tgz", + "integrity": "sha512-gpXy0H5ymuQ0x2qgl1zzHg7LYHZYUmDEq6F7lhHA8M0eIwDB2WteOcCnQsohl9c/vBKZ3JF2r4EseipCZz3s4Q==", "dev": true, "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._basecreate": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" + "@jest/types": "^25.2.6", + "chalk": "^3.0.0", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" } }, - "lodash.defaults": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "jest-validate": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.2.6.tgz", + "integrity": "sha512-a4GN7hYbqQ3Rt9iHsNLFqQz7HDV7KiRPCwPgo5nqtTIWNZw7gnT8KchG+Riwh+UTSn8REjFCodGp50KX/fRNgQ==", "dev": true, "requires": { - "lodash._objecttypes": "~2.4.1", - "lodash.keys": "~2.4.1" + "@jest/types": "^25.2.6", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "leven": "^3.1.0", + "pretty-format": "^25.2.6" }, "dependencies": { - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", "dev": true, "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" } } } }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "jest-watcher": { + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.2.7.tgz", + "integrity": "sha512-RdHuW+f49tahWtluTnUdZ2iPliebleROI2L/J5phYrUS6DPC9RB3SuUtqYyYhGZJsbvRSuLMIlY/cICJ+PIecw==", "dev": true, "requires": { - "lodash._root": "^3.0.0" + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "jest-util": "^25.2.6", + "string-length": "^3.1.0" } }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "jest-worker": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", + "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", "dev": true, "requires": { - "lodash._objecttypes": "~2.4.1" + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" } }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "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": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/json/-/json-9.0.6.tgz", + "integrity": "sha1-eXLCpaSKQmeNsnMMfCxO5uTiRYU=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "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-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 }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", "dev": true, "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" + "minimist": "^1.2.5" } }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, - "lodash.values": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", - "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "lodash.keys": "~2.4.1" - }, - "dependencies": { - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - } + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "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": { - "chalk": "^1.0.0" + "p-locate": "^4.1.0" } }, - "lolex": { - "version": "1.3.2", - "resolved": "http://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", "dev": true, "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "@sinonjs/commons": "^1.7.0" } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", "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 - } + "semver": "^6.0.0" } }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "make-error-cause": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", - "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", - "dev": true, - "requires": { - "make-error": "^1.2.0" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { - "kind-of": "^6.0.2" + "tmpl": "1.0.x" } }, "map-cache": { @@ -3673,18 +3122,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -3694,98 +3131,43 @@ "object-visit": "^1.0.0" } }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "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" - } - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "merge2": { - "version": "0.3.7", - "resolved": "http://registry.npmjs.org/merge2/-/merge2-0.3.7.tgz", - "integrity": "sha1-GOAKAGcQkN4RZQJfyGvT53wgf2M=", + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", "dev": true }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "mime-db": "1.43.0" } }, + "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", @@ -3796,15 +3178,15 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -3823,106 +3205,17 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "moment": { - "version": "2.14.1", - "resolved": "http://registry.npmjs.org/moment/-/moment-2.14.1.tgz", - "integrity": "sha1-s1snxH5X7S3ccAU9awe+zbKRdBw=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", "dev": true }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -3942,41 +3235,71 @@ "to-regex": "^3.0.1" } }, - "natives": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", - "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "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 + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "node-notifier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", "dev": true, + "optional": true, "requires": { - "abbrev": "1" + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", + "shellwords": "^0.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" } }, "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true }, "npm-run-path": { "version": "2.0.2", @@ -3987,16 +3310,16 @@ "path-key": "^2.0.0" } }, - "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=", + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "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=", + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-copy": { @@ -4030,12 +3353,6 @@ } } }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -4045,49 +3362,6 @@ "isobject": "^3.0.0" } }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -4106,71 +3380,33 @@ "wrappy": "1" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "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": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } + "mimic-fn": "^2.1.0" } }, "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" - } - }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", - "dev": true, - "requires": { - "end-of-stream": "~0.1.5", - "sequencify": "~0.0.7", - "stream-consume": "~0.1.0" - } - }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, - "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 + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } }, - "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=", + "p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", "dev": true }, "p-finally": { @@ -4179,79 +3415,34 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "dev": true, "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "p-try": "^2.0.0" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "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": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "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" - } - } + "p-limit": "^2.2.0" } }, - "parse-json": { + "p-try": { "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" - } + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, "pascalcase": { @@ -4260,20 +3451,11 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "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": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -4281,12 +3463,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", @@ -4299,127 +3475,41 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "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" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "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=", + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "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=", + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, "requires": { - "pinkie": "^2.0.0" + "node-modules-regexp": "^1.0.0" } }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } + "find-up": "^4.0.0" } }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "requires": { - "irregular-plurals": "^1.0.0" - } + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true }, "posix-character-classes": { "version": "0.1.1", @@ -4433,134 +3523,100 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true + "pretty-format": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", + "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", + "dev": true, + "requires": { + "@jest/types": "^25.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } }, "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==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", "dev": true, "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "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=", + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "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" - } + "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 + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true }, "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "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" - } + "realpath-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true }, "reflect-metadata": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", - "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", "dev": true }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -4571,124 +3627,6 @@ "safe-regex": "^1.1.0" } }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, - "remap-istanbul": { - "version": "0.7.0", - "resolved": "http://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.7.0.tgz", - "integrity": "sha1-w2Da2upkHbpzTLaljKvp69iKKFg=", - "dev": true, - "requires": { - "amdefine": "1.0.0", - "gulp-util": "3.0.7", - "istanbul": "0.4.5", - "source-map": ">=0.5.6", - "through2": "2.0.1" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^1.0.11", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "through2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", - "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", - "dev": true, - "requires": { - "readable-stream": "~2.0.0", - "xtend": "~4.0.0" - } - } - } - }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -4707,105 +3645,112 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "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 - }, - "replacestream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", - "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.3", - "object-assign": "^4.0.1", - "readable-stream": "^2.0.2" + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "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" - } - }, - "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==", + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "psl": "^1.1.28", + "punycode": "^2.1.1" } } } }, - "req-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-1.0.1.tgz", - "integrity": "sha1-DXOurpJm5penj3l2AZZ352rPD/8=", + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, "requires": { - "req-from": "^1.0.1" + "lodash": "^4.17.15" } }, - "req-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-1.0.1.tgz", - "integrity": "sha1-v4HaUUeUfTLRO5R9wSpYrUWHNQ4=", + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", "dev": true, "requires": { - "resolve-from": "^2.0.0" + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.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 + }, + "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.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "resolve-from": "^5.0.0" } }, "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-url": { @@ -4820,33 +3765,20 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, "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" } }, - "run-sequence": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.2.2.tgz", - "integrity": "sha1-UJWgvr6YczsBQL0I3YDsAw3azes=", - "dev": true, - "requires": { - "chalk": "*", - "gulp-util": "*" - } + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true }, "safe-buffer": { "version": "5.1.2", @@ -4863,45 +3795,178 @@ "ret": "~0.1.10" } }, - "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", - "dev": true - }, - "semver": { - "version": "4.3.6", - "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "requires": { - "semver": "^5.0.3" + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" }, "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "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" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "requires": { + "xmlchars": "^2.1.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "set-value": { + "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -4936,34 +4001,29 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "sinon": { - "version": "1.17.7", - "resolved": "http://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", - "dev": true, - "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": ">=0.10.3 <1" - } + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true }, - "sinon-chai": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", - "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "snapdragon": { @@ -4982,6 +4042,15 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -4999,6 +4068,18 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -5074,66 +4155,38 @@ } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", "urix": "^0.1.0" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", - "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==", + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "spdx-license-ids": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", - "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, "split-string": { @@ -5151,6 +4204,29 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -5172,45 +4248,50 @@ } } }, - "stream-consume": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", - "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", - "dev": true - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.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 }, "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" } } } }, + "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" + } + }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -5218,44 +4299,19 @@ "dev": true }, "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": "^2.0.0" + "ansi-regex": "^5.0.0" } }, "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "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" - } - } - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true }, "strip-eof": { "version": "1.0.0", @@ -5263,165 +4319,112 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, - "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" - } - }, - "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=", - "dev": true - }, - "supports-color": { + "strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "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": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } + "has-flag": "^4.0.0" } }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", "dev": true, "requires": { - "execa": "^0.7.0" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" } }, - "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 - }, - "textextensions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz", - "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" } }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { - "os-homedir": "^1.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, - "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "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": { - "extend-shallow": "^2.0.1" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "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" + } + }, + "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==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "safe-buffer": "~5.1.0" } } } }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -5455,130 +4458,78 @@ } }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } }, - "tslint": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-4.5.1.tgz", - "integrity": "sha1-BTVocb7yOkNJBnNABvwYgza6gks=", + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, "requires": { - "babel-code-frame": "^6.20.0", - "colors": "^1.1.2", - "diff": "^3.0.1", - "findup-sync": "~0.3.0", - "glob": "^7.1.1", - "optimist": "~0.6.0", - "resolve": "^1.1.7", - "tsutils": "^1.1.0", - "update-notifier": "^2.0.0" - }, - "dependencies": { - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "~5.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - } + "punycode": "^2.1.0" } }, - "tslint-stylish": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslint-stylish/-/tslint-stylish-2.1.0.tgz", - "integrity": "sha1-jNo8OMnKtU57It989CuO8RXc2V8=", + "ts-jest": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.3.0.tgz", + "integrity": "sha512-qH/uhaC+AFDU9JfAueSr0epIFJkGMvUPog4FxSEVAtPOur1Oni5WBJMiQIkfHvc7PviVRsnlVLLY2I6221CQew==", "dev": true, "requires": { - "chalk": "^1.1.1", - "lodash": "^3.10.1", - "log-symbols": "^1.0.2", - "text-table": "^0.2.0", - "tslint": "^2.5.0" - }, - "dependencies": { - "findup-sync": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.2.1.tgz", - "integrity": "sha1-4KkKRQB1xJRm7lE3MgV1FLgeh4w=", - "dev": true, - "requires": { - "glob": "~4.3.0" - } - }, - "glob": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz", - "integrity": "sha1-gPuwjKVA8jiszl0R0em8QedRc9M=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" - } - }, - "lodash": { - "version": "3.10.1", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "tslint": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-2.5.1.tgz", - "integrity": "sha1-veTJnpfNXRxvuzAz9kt9iX/UGpI=", - "dev": true, - "requires": { - "findup-sync": "~0.2.1", - "optimist": "~0.6.0", - "underscore.string": "~3.1.1" - } - } + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "resolve": "1.x", + "semver": "6.x", + "yargs-parser": "^18.1.1" } }, - "tsutils": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", - "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", + "ts-node": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.8.1.tgz", + "integrity": "sha512-10DE9ONho06QORKAaCBpPiFCdW+tZJuY/84tyypGtl6r+/C7Asq0dhqbRZURuUlLQtZxxDvT8eoj8cGW0ha6Bg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "3.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, "type-check": { @@ -5596,105 +4547,37 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "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 }, - "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "optional": true, "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "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, - "optional": true - } + "is-typedarray": "^1.0.0" } }, - "uglify-save-license": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", - "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", - "dev": true - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "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 - }, - "underscore.string": { - "version": "3.1.1", - "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-3.1.1.tgz", - "integrity": "sha1-DN1rytDARv12Y9MF2KeFtdoQ8zU=", + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "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" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", - "dev": true - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" + "set-value": "^2.0.1" } }, "unset-value": { @@ -5734,74 +4617,16 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true } } }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.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.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.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 - }, - "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" - } - } + "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" } }, "urix": { @@ -5810,173 +4635,147 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "util": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.0.tgz", - "integrity": "sha512-5n12uMzKCjvB2HPFHnbQSjaqAa98L5iIXmHrZCLavuZVe0qe/SJGbDGWlpaHk5lnBkWRDO+dRu1/PgmUYKPPTw==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-to-istanbul": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz", + "integrity": "sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng==", "dev": true, "requires": { - "user-home": "^1.1.1" + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } } }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "dev": true + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } }, - "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==", + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "browser-process-hrtime": "^1.0.0" } }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" } }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, "requires": { - "defaults": "^1.0.0", - "glob-stream": "^3.1.5", - "glob-watcher": "^0.0.6", - "graceful-fs": "^3.0.0", - "mkdirp": "^0.5.0", - "strip-bom": "^1.0.0", - "through2": "^0.6.1", - "vinyl": "^0.4.0" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } + "makeerror": "1.0.x" } }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, "requires": { - "source-map": "^0.5.1" + "iconv-lite": "0.4.24" } }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "string-width": "^2.1.1" + "isexe": "^2.0.0" } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "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 }, - "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": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -5984,61 +4783,81 @@ "dev": true }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "xdg-basedir": { + "ws": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "dev": true + }, + "xml-name-validator": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "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": "3.10.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - } + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true } } } diff --git a/package.json b/package.json index bb6057da0..f96fbf91c 100644 --- a/package.json +++ b/package.json @@ -26,40 +26,26 @@ ], "dependencies": {}, "devDependencies": { - "@types/moment": "^2.13.0", - "@types/chai": "^3.4.34", - "@types/es6-shim": "^0.31.32", - "@types/mocha": "^2.2.33", - "@types/node": "0.0.2", - "@types/sinon": "^2.2.2", - "chai": "^4.2.0", - "chai-as-promised": "^7.1.1", - "del": "^2.2.1", - "es6-shim": "^0.35.1", - "gulp": "^3.9.1", - "gulp-file": "^0.3.0", - "gulp-istanbul": "^1.0.0", - "gulp-mocha": "^3.0.1", - "gulp-rename": "^1.2.2", - "gulp-replace": "^0.5.4", - "gulp-shell": "^0.5.1", - "gulp-sourcemaps": "^1.6.0", - "gulp-tslint": "^8.1.3", - "gulp-typescript": "^3.1.3", - "gulp-uglify": "^2.0.0", - "gulpclass": "^0.1.1", - "mocha": "^3.2.0", - "moment": "2.14.1", - "reflect-metadata": "^0.1.3", - "remap-istanbul": "^0.7.0", - "sinon": "^1.17.4", - "sinon-chai": "^2.8.0", - "tslint": "^4.0.2", - "tslint-stylish": "^2.1.0-beta", - "typescript": "^2.0.10" + "@types/jest": "25.1.5", + "@types/node": "13.11.0", + "copyfiles": "2.2.0", + "dayjs": "1.8.23", + "jest": "25.2.7", + "json": "9.0.6", + "reflect-metadata": "0.1.13", + "rimraf": "3.0.2", + "ts-jest": "25.3.0", + "ts-node": "8.8.1", + "typescript": "3.8.3" }, "scripts": { - "test": "gulp tests", - "package": "gulp package" + "build": "rimraf build && echo Using TypeScript && tsc --version && tsc --pretty", + "clean": "rimraf build coverage", + "copy": "copyfiles -u 3 \"build/compiled/src/**/*\" build/package && copyfiles package.json README.md build/package", + "lint": "eslint --config ./.eslintrc.js --ext .ts ./src ./test", + "package": "npm run build && npm run copy && npm run public && rimraf build/compiled", + "pretest": "npm run lint", + "public": "json -I -f build/package/package.json -e 'this.private=false'", + "test": "jest --coverage" } } diff --git a/test/functional/basic-functionality.spec.ts b/test/functional/basic-functionality.spec.ts index bb2c6ae25..cec6d6054 100644 --- a/test/functional/basic-functionality.spec.ts +++ b/test/functional/basic-functionality.spec.ts @@ -1,23 +1,15 @@ import "reflect-metadata"; -import { - classToPlain, - classToPlainFromExist, - plainToClass, - plainToClassFromExist, - classToClass, classToClassFromExist -} from "../../src/index"; -import { defaultMetadataStorage } from "../../src/storage"; -import { Exclude, Expose, Type } from "../../src/decorators"; -import { expect } from "chai"; -import { testForBuffer } from "../../src/TransformOperationExecutor"; +import {classToClass, classToClassFromExist, classToPlain, classToPlainFromExist, plainToClass, plainToClassFromExist} from "../../src/index"; +import {defaultMetadataStorage} from "../../src/storage"; +import {Exclude, Expose, Type} from "../../src/decorators"; +import {testForBuffer} from "../../src/TransformOperationExecutor"; describe("basic functionality", () => { - it("should return true if Buffer is present in environment, else false", () => { - expect(testForBuffer()).to.be.true; + expect(testForBuffer()).toBeTruthy(); const bufferImp = global.Buffer; delete global.Buffer; - expect(testForBuffer()).to.be.false; + expect(testForBuffer()).toBeFalsy(); global.Buffer = bufferImp; }); @@ -46,36 +38,36 @@ describe("basic functionality", () => { fromExistUser.id = 1; const plainUser = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" }); - const existUser = { id: 1, age: 27 }; + const existUser = {id: 1, age: 27}; const plainUser2 = classToPlainFromExist(user, existUser); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({ + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -83,19 +75,19 @@ describe("basic functionality", () => { }); const classToClassUser = classToClass(user); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).toEqual(user); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -119,13 +111,13 @@ describe("basic functionality", () => { }; const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); - transformedUser.should.have.property("age"); - transformedUser.should.have.property("id").that.is.undefined; + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toHaveProperty("age"); + expect(transformedUser.id).toBeUndefined(); - const transformedUserWithoutExtra = plainToClass(User, fromPlainUser, { excludeExtraneousValues: true }); - transformedUserWithoutExtra.should.be.instanceOf(User); - transformedUserWithoutExtra.should.not.have.property("age"); + const transformedUserWithoutExtra = plainToClass(User, fromPlainUser, {excludeExtraneousValues: true}); + expect(transformedUserWithoutExtra).toBeInstanceOf(User); + expect(transformedUserWithoutExtra).not.toHaveProperty("age"); }); it("should exclude all objects marked with @Exclude() decorator", () => { @@ -154,53 +146,53 @@ describe("basic functionality", () => { fromExistUser.id = 1; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); - expect(plainUser.password).to.be.undefined; + expect(plainUser.password).toBeUndefined(); - const existUser = { id: 1, age: 27, password: "yayayaya" }; + const existUser = {id: 1, age: 27, password: "yayayaya"}; const plainUser2 = classToPlainFromExist(user, existUser); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed", lastName: "Khudoiberdiev", password: "yayayaya" }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({ + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" }); const classToClassUser = classToClass(user); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" @@ -233,41 +225,41 @@ describe("basic functionality", () => { fromExistUser.id = 1; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({}); - expect(plainUser.firstName).to.be.undefined; - expect(plainUser.lastName).to.be.undefined; - expect(plainUser.password).to.be.undefined; + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({}); + expect(plainUser.firstName).toBeUndefined(); + expect(plainUser.lastName).toBeUndefined(); + expect(plainUser.password).toBeUndefined(); - const existUser = { id: 1, age: 27 }; + const existUser = {id: 1, age: 27}; const plainUser2 = classToPlainFromExist(user, existUser); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27 }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({}); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({}); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1 }); const classToClassUser = classToClass(user); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({}); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({}); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1 }); }); @@ -277,7 +269,6 @@ describe("basic functionality", () => { @Exclude() class User { - id: number; @Expose() @@ -304,52 +295,52 @@ describe("basic functionality", () => { fromExistUser.id = 1; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); - expect(plainUser.password).to.be.undefined; + expect(plainUser.password).toBeUndefined(); - const existUser = { id: 1, age: 27 }; + const existUser = {id: 1, age: 27}; const plainUser2 = classToPlainFromExist(user, existUser); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed", lastName: "Khudoiberdiev" }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({ + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" }); const classToClassUser = classToClass(user); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" @@ -360,7 +351,6 @@ describe("basic functionality", () => { defaultMetadataStorage.clear(); class User { - id: number; @Expose() @@ -386,53 +376,53 @@ describe("basic functionality", () => { const fromExistUser = new User(); fromExistUser.id = 1; - const plainUser: any = classToPlain(user, { strategy: "excludeAll" }); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + const plainUser: any = classToPlain(user, {strategy: "excludeAll"}); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); - expect(plainUser.password).to.be.undefined; + expect(plainUser.password).toBeUndefined(); - const existUser = { id: 1, age: 27 }; - const plainUser2 = classToPlainFromExist(user, existUser, { strategy: "excludeAll" }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + const existUser = {id: 1, age: 27}; + const plainUser2 = classToPlainFromExist(user, existUser, {strategy: "excludeAll"}); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed", lastName: "Khudoiberdiev" }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); - const transformedUser = plainToClass(User, fromPlainUser, { strategy: "excludeAll" }); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({ + const transformedUser = plainToClass(User, fromPlainUser, {strategy: "excludeAll"}); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: "excludeAll" }); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, {strategy: "excludeAll"}); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" }); - const classToClassUser = classToClass(user, { strategy: "excludeAll" }); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({ + const classToClassUser = classToClass(user, {strategy: "excludeAll"}); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: "excludeAll" }); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, {strategy: "excludeAll"}); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" @@ -443,9 +433,7 @@ describe("basic functionality", () => { defaultMetadataStorage.clear(); class User { - id: number; - firstName: string; @Exclude() @@ -469,49 +457,49 @@ describe("basic functionality", () => { const fromExistUser = new User(); fromExistUser.id = 1; - const plainUser: any = classToPlain(user, { strategy: "exposeAll" }); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + const plainUser: any = classToPlain(user, {strategy: "exposeAll"}); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed" }); - expect(plainUser.lastName).to.be.undefined; - expect(plainUser.password).to.be.undefined; + expect(plainUser.lastName).toBeUndefined(); + expect(plainUser.password).toBeUndefined(); - const existUser = { id: 1, age: 27 }; - const plainUser2 = classToPlainFromExist(user, existUser, { strategy: "exposeAll" }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + const existUser = {id: 1, age: 27}; + const plainUser2 = classToPlainFromExist(user, existUser, {strategy: "exposeAll"}); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed" }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); - const transformedUser = plainToClass(User, fromPlainUser, { strategy: "exposeAll" }); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({ + const transformedUser = plainToClass(User, fromPlainUser, {strategy: "exposeAll"}); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "Umed" }); - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: "exposeAll" }); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, {strategy: "exposeAll"}); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed" }); - const classToClassUser = classToClass(user, { strategy: "exposeAll" }); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({ + const classToClassUser = classToClass(user, {strategy: "exposeAll"}); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ firstName: "Umed" }); - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: "exposeAll" }); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, {strategy: "exposeAll"}); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed" }); @@ -521,7 +509,6 @@ describe("basic functionality", () => { defaultMetadataStorage.clear(); class User { - id: number; @Type(type => String) @@ -595,9 +582,9 @@ describe("basic functionality", () => { const fromExistUser = new User(); fromExistUser.id = 1; - const plainUser: any = classToPlain(user, { strategy: "exposeAll" }); - plainUser.should.not.be.instanceOf(User); - plainUser.should.deep.eql({ + const plainUser: any = classToPlain(user, {strategy: "exposeAll"}); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "321", lastName: "123", password: 123, @@ -612,10 +599,10 @@ describe("basic functionality", () => { nullableBuffer: null }); - const existUser = { id: 1, age: 27 }; - const plainUser2 = classToPlainFromExist(user, existUser, { strategy: "exposeAll" }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.deep.eq({ + const existUser = {id: 1, age: 27}; + const plainUser2 = classToPlainFromExist(user, existUser, {strategy: "exposeAll"}); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "321", @@ -631,11 +618,11 @@ describe("basic functionality", () => { nullableDate: null, nullableBuffer: null }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); - const transformedUser = plainToClass(User, fromPlainUser, { strategy: "exposeAll" }); - transformedUser.should.be.instanceOf(User); - transformedUser.should.deep.eq({ + const transformedUser = plainToClass(User, fromPlainUser, {strategy: "exposeAll"}); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "321", lastName: "123", password: 123, @@ -650,9 +637,9 @@ describe("basic functionality", () => { nullableBuffer: null }); - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: "exposeAll" }); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.deep.eq({ + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, {strategy: "exposeAll"}); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "321", lastName: "123", @@ -668,10 +655,10 @@ describe("basic functionality", () => { nullableBuffer: null }); - const classToClassUser = classToClass(user, { strategy: "exposeAll" }); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.deep.eq({ + const classToClassUser = classToClass(user, {strategy: "exposeAll"}); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ firstName: "321", lastName: "123", password: 123, @@ -686,11 +673,11 @@ describe("basic functionality", () => { nullableBuffer: null }); - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: "exposeAll" }); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.deep.eq({ + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, {strategy: "exposeAll"}); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "321", lastName: "123", @@ -711,22 +698,17 @@ describe("basic functionality", () => { defaultMetadataStorage.clear(); class Photo { - id: number; - name: string; @Exclude() filename: string; uploadDate: Date; - } class User { - firstName: string; - lastName: string; @Exclude() @@ -747,10 +729,10 @@ describe("basic functionality", () => { user.password = "imnosuperman"; user.photo = photo; - const plainUser: any = classToPlain(user, { strategy: "exposeAll" }); - plainUser.should.not.be.instanceOf(User); - plainUser.photo.should.not.be.instanceOf(Photo); - plainUser.should.be.eql({ + const plainUser: any = classToPlain(user, {strategy: "exposeAll"}); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser.photo).not.toBeInstanceOf(Photo); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -759,16 +741,16 @@ describe("basic functionality", () => { uploadDate: photo.uploadDate } }); - expect(plainUser.password).to.be.undefined; - expect(plainUser.photo.filename).to.be.undefined; - expect(plainUser.photo.uploadDate).to.be.eql(photo.uploadDate); - expect(plainUser.photo.uploadDate).not.to.be.equal(photo.uploadDate); + expect(plainUser.password).toBeUndefined(); + expect(plainUser.photo.filename).toBeUndefined(); + expect(plainUser.photo.uploadDate).toEqual(photo.uploadDate); + expect(plainUser.photo.uploadDate).not.toBe(photo.uploadDate); - const existUser = { id: 1, age: 27, photo: { id: 2, description: "photo" } }; - const plainUser2: any = classToPlainFromExist(user, existUser, { strategy: "exposeAll" }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.photo.should.not.be.instanceOf(Photo); - plainUser2.should.be.eql({ + const existUser = {id: 1, age: 27, photo: {id: 2, description: "photo"}}; + const plainUser2: any = classToPlainFromExist(user, existUser, {strategy: "exposeAll"}); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2.photo).not.toBeInstanceOf(Photo); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed", @@ -780,25 +762,22 @@ describe("basic functionality", () => { description: "photo" } }); - plainUser2.should.be.equal(existUser); - expect(plainUser2.password).to.be.undefined; - expect(plainUser2.photo.filename).to.be.undefined; - expect(plainUser2.photo.uploadDate).to.be.eql(photo.uploadDate); - expect(plainUser2.photo.uploadDate).not.to.be.equal(photo.uploadDate); + expect(plainUser2).toEqual(existUser); + expect(plainUser2.password).toBeUndefined(); + expect(plainUser2.photo.filename).toBeUndefined(); + expect(plainUser2.photo.uploadDate).toEqual(photo.uploadDate); + expect(plainUser2.photo.uploadDate).not.toBe(photo.uploadDate); }); it("should transform nested objects too and make sure given type is used instead of automatically guessed one", () => { defaultMetadataStorage.clear(); class Photo { - id: number; - name: string; @Exclude() filename: string; - } class ExtendedPhoto implements Photo { @@ -811,11 +790,8 @@ describe("basic functionality", () => { } class User { - id: number; - firstName: string; - lastName: string; @Exclude() @@ -837,8 +813,8 @@ describe("basic functionality", () => { user.photo = photo; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -846,34 +822,27 @@ describe("basic functionality", () => { filename: "iam.jpg" } }); - expect(plainUser.password).to.be.undefined; - expect(plainUser.photo.name).to.be.undefined; + expect(plainUser.password).toBeUndefined(); + expect(plainUser.photo.name).toBeUndefined(); }); it("should convert given plain object to class instance object", () => { defaultMetadataStorage.clear(); class Photo { - id: number; - name: string; @Exclude() filename: string; metadata: string; - uploadDate: Date; - } class User { - id: number; - firstName: string; - lastName: string; @Exclude() @@ -912,9 +881,9 @@ describe("basic functionality", () => { fromExistUser.photo = fromExistPhoto; const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); - transformedUser.photo.should.be.instanceOf(Photo); - transformedUser.should.be.eql({ + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser.photo).toBeInstanceOf(Photo); + expect(transformedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -925,9 +894,9 @@ describe("basic functionality", () => { }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - fromExistTransformedUser.should.be.equal(fromExistUser); - fromExistTransformedUser.photo.should.be.equal(fromExistPhoto); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toEqual(fromExistUser); + expect(fromExistTransformedUser.photo).toEqual(fromExistPhoto); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -940,11 +909,11 @@ describe("basic functionality", () => { }); const classToClassUser = classToClass(user); - classToClassUser.should.be.instanceOf(User); - classToClassUser.photo.should.be.instanceOf(Photo); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.not.be.equal(user.photo); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser.photo).toBeInstanceOf(Photo); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).not.toEqual(user.photo); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -955,12 +924,12 @@ describe("basic functionality", () => { }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.photo.should.be.instanceOf(Photo); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.not.be.equal(user.photo); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).not.toEqual(user.photo); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -993,9 +962,7 @@ describe("basic functionality", () => { } class User { - id: number; - firstName: string; @Expose({ @@ -1021,7 +988,6 @@ describe("basic functionality", () => { }) @Type(type => Photo) photos: Photo[]; - } const user = new User(); @@ -1058,20 +1024,20 @@ describe("basic functionality", () => { fromExistUser.photo.metadata = "taken by Camera"; const plainUser1: any = classToPlain(user); - plainUser1.should.not.be.instanceOf(User); - plainUser1.should.be.eql({ + expect(plainUser1).not.toBeInstanceOf(User); + expect(plainUser1).toEqual({ firstName: "Umed", photo: { id: 1 } }); - expect(plainUser1.lastName).to.be.undefined; - expect(plainUser1.password).to.be.undefined; - expect(plainUser1.isActive).to.be.undefined; + expect(plainUser1.lastName).toBeUndefined(); + expect(plainUser1.password).toBeUndefined(); + expect(plainUser1.isActive).toBeUndefined(); - const plainUser2: any = classToPlain(user, { groups: ["user"] }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + const plainUser2: any = classToPlain(user, {groups: ["user"]}); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman", @@ -1080,12 +1046,12 @@ describe("basic functionality", () => { filename: "myphoto.jpg" } }); - expect(plainUser2.isActive).to.be.undefined; + expect(plainUser2.isActive).toBeUndefined(); - const transformedUser2 = plainToClass(User, fromPlainUser, { groups: ["user"] }); - transformedUser2.should.be.instanceOf(User); - transformedUser2.photo.should.be.instanceOf(Photo); - transformedUser2.should.be.eql({ + const transformedUser2 = plainToClass(User, fromPlainUser, {groups: ["user"]}); + expect(transformedUser2).toBeInstanceOf(User); + expect(transformedUser2.photo).toBeInstanceOf(Photo); + expect(transformedUser2).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman", @@ -1095,10 +1061,10 @@ describe("basic functionality", () => { } }); - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { groups: ["user"] }); - fromExistTransformedUser.should.be.equal(fromExistUser); - fromExistTransformedUser.photo.should.be.equal(fromExistUser.photo); - fromExistTransformedUser.should.be.eql({ + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, {groups: ["user"]}); + expect(fromExistTransformedUser).toEqual(fromExistUser); + expect(fromExistTransformedUser.photo).toEqual(fromExistUser.photo); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -1110,12 +1076,12 @@ describe("basic functionality", () => { } }); - const classToClassUser = classToClass(user, { groups: ["user"] }); - classToClassUser.should.be.instanceOf(User); - classToClassUser.photo.should.be.instanceOf(Photo); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.not.be.equal(user.photo); - classToClassUser.should.be.eql({ + const classToClassUser = classToClass(user, {groups: ["user"]}); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser.photo).toBeInstanceOf(Photo); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).not.toEqual(user.photo); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman", @@ -1125,13 +1091,13 @@ describe("basic functionality", () => { } }); - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { groups: ["user"] }); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.photo.should.be.instanceOf(Photo); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.not.be.equal(user.photo); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, {groups: ["user"]}); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).not.toEqual(user.photo); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -1143,9 +1109,9 @@ describe("basic functionality", () => { } }); - const plainUser3: any = classToPlain(user, { groups: ["guest"] }); - plainUser3.should.not.be.instanceOf(User); - plainUser3.should.be.eql({ + const plainUser3: any = classToPlain(user, {groups: ["guest"]}); + expect(plainUser3).not.toBeInstanceOf(User); + expect(plainUser3).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1153,13 +1119,13 @@ describe("basic functionality", () => { filename: "myphoto.jpg" } }); - expect(plainUser3.password).to.be.undefined; - expect(plainUser3.isActive).to.be.undefined; + expect(plainUser3.password).toBeUndefined(); + expect(plainUser3.isActive).toBeUndefined(); - const transformedUser3 = plainToClass(User, fromPlainUser, { groups: ["guest"] }); - transformedUser3.should.be.instanceOf(User); - transformedUser3.photo.should.be.instanceOf(Photo); - transformedUser3.should.be.eql({ + const transformedUser3 = plainToClass(User, fromPlainUser, {groups: ["guest"]}); + expect(transformedUser3).toBeInstanceOf(User); + expect(transformedUser3.photo).toBeInstanceOf(Photo); + expect(transformedUser3).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1168,9 +1134,9 @@ describe("basic functionality", () => { } }); - const plainUser4: any = classToPlain(user, { groups: ["admin"] }); - plainUser4.should.not.be.instanceOf(User); - plainUser4.should.be.eql({ + const plainUser4: any = classToPlain(user, {groups: ["admin"]}); + expect(plainUser4).not.toBeInstanceOf(User); + expect(plainUser4).toEqual({ firstName: "Umed", isActive: false, photo: { @@ -1182,14 +1148,14 @@ describe("basic functionality", () => { status: 1 }] }); - expect(plainUser4.lastName).to.be.undefined; - expect(plainUser4.password).to.be.undefined; + expect(plainUser4.lastName).toBeUndefined(); + expect(plainUser4.password).toBeUndefined(); - const transformedUser4 = plainToClass(User, fromPlainUser, { groups: ["admin"] }); - transformedUser4.should.be.instanceOf(User); - transformedUser4.photo.should.be.instanceOf(Photo); - transformedUser4.photos[0].should.be.instanceOf(Photo); - transformedUser4.should.be.eql({ + const transformedUser4 = plainToClass(User, fromPlainUser, {groups: ["admin"]}); + expect(transformedUser4).toBeInstanceOf(User); + expect(transformedUser4.photo).toBeInstanceOf(Photo); + expect(transformedUser4.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser4).toEqual({ firstName: "Umed", isActive: false, photo: { @@ -1202,9 +1168,9 @@ describe("basic functionality", () => { }] }); - const plainUser5: any = classToPlain(user, { groups: ["admin", "user"] }); - plainUser5.should.not.be.instanceOf(User); - plainUser5.should.be.eql({ + const plainUser5: any = classToPlain(user, {groups: ["admin", "user"]}); + expect(plainUser5).not.toBeInstanceOf(User); + expect(plainUser5).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman", @@ -1221,9 +1187,9 @@ describe("basic functionality", () => { }] }); - const transformedUser5 = plainToClass(User, fromPlainUser, { groups: ["admin", "user"] }); - transformedUser5.should.be.instanceOf(User); - transformedUser5.should.be.eql({ + const transformedUser5 = plainToClass(User, fromPlainUser, {groups: ["admin", "user"]}); + expect(transformedUser5).toBeInstanceOf(User); + expect(transformedUser5).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman", @@ -1260,7 +1226,6 @@ describe("basic functionality", () => { } class User { - @Expose({ since: 1, until: 2 @@ -1283,7 +1248,6 @@ describe("basic functionality", () => { }) @Type(type => Photo) photos: Photo[]; - } const user = new User(); @@ -1313,8 +1277,8 @@ describe("basic functionality", () => { }; const plainUser1: any = classToPlain(user); - plainUser1.should.not.be.instanceOf(User); - plainUser1.should.be.eql({ + expect(plainUser1).not.toBeInstanceOf(User); + expect(plainUser1).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1330,10 +1294,10 @@ describe("basic functionality", () => { }); const transformedUser1 = plainToClass(User, fromPlainUser); - transformedUser1.should.be.instanceOf(User); - transformedUser1.photo.should.be.instanceOf(Photo); - transformedUser1.photos[0].should.be.instanceOf(Photo); - transformedUser1.should.be.eql({ + expect(transformedUser1).toBeInstanceOf(User); + expect(transformedUser1.photo).toBeInstanceOf(Photo); + expect(transformedUser1.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser1).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1348,45 +1312,45 @@ describe("basic functionality", () => { }] }); - const plainUser2: any = classToPlain(user, { version: 0.3 }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + const plainUser2: any = classToPlain(user, {version: 0.3}); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ photo: { id: 1 } }); - const transformedUser2 = plainToClass(User, fromPlainUser, { version: 0.3 }); - transformedUser2.should.be.instanceOf(User); - transformedUser2.photo.should.be.instanceOf(Photo); - transformedUser2.should.be.eql({ + const transformedUser2 = plainToClass(User, fromPlainUser, {version: 0.3}); + expect(transformedUser2).toBeInstanceOf(User); + expect(transformedUser2.photo).toBeInstanceOf(Photo); + expect(transformedUser2).toEqual({ photo: { id: 1 } }); - const plainUser3: any = classToPlain(user, { version: 0.5 }); - plainUser3.should.not.be.instanceOf(User); - plainUser3.should.be.eql({ + const plainUser3: any = classToPlain(user, {version: 0.5}); + expect(plainUser3).not.toBeInstanceOf(User); + expect(plainUser3).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1 } }); - const transformedUser3 = plainToClass(User, fromPlainUser, { version: 0.5 }); - transformedUser3.should.be.instanceOf(User); - transformedUser3.photo.should.be.instanceOf(Photo); - transformedUser3.should.be.eql({ + const transformedUser3 = plainToClass(User, fromPlainUser, {version: 0.5}); + expect(transformedUser3).toBeInstanceOf(User); + expect(transformedUser3.photo).toBeInstanceOf(Photo); + expect(transformedUser3).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1 } }); - const plainUser4: any = classToPlain(user, { version: 1 }); - plainUser4.should.not.be.instanceOf(User); - plainUser4.should.be.eql({ + const plainUser4: any = classToPlain(user, {version: 1}); + expect(plainUser4).not.toBeInstanceOf(User); + expect(plainUser4).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1394,10 +1358,10 @@ describe("basic functionality", () => { } }); - const transformedUser4 = plainToClass(User, fromPlainUser, { version: 1 }); - transformedUser4.should.be.instanceOf(User); - transformedUser4.photo.should.be.instanceOf(Photo); - transformedUser4.should.be.eql({ + const transformedUser4 = plainToClass(User, fromPlainUser, {version: 1}); + expect(transformedUser4).toBeInstanceOf(User); + expect(transformedUser4.photo).toBeInstanceOf(Photo); + expect(transformedUser4).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1405,9 +1369,9 @@ describe("basic functionality", () => { } }); - const plainUser5: any = classToPlain(user, { version: 1.5 }); - plainUser5.should.not.be.instanceOf(User); - plainUser5.should.be.eql({ + const plainUser5: any = classToPlain(user, {version: 1.5}); + expect(plainUser5).not.toBeInstanceOf(User); + expect(plainUser5).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1416,10 +1380,10 @@ describe("basic functionality", () => { } }); - const transformedUser5 = plainToClass(User, fromPlainUser, { version: 1.5 }); - transformedUser5.should.be.instanceOf(User); - transformedUser5.photo.should.be.instanceOf(Photo); - transformedUser5.should.be.eql({ + const transformedUser5 = plainToClass(User, fromPlainUser, {version: 1.5}); + expect(transformedUser5).toBeInstanceOf(User); + expect(transformedUser5.photo).toBeInstanceOf(Photo); + expect(transformedUser5).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1428,9 +1392,9 @@ describe("basic functionality", () => { } }); - const plainUser6: any = classToPlain(user, { version: 2 }); - plainUser6.should.not.be.instanceOf(User); - plainUser6.should.be.eql({ + const plainUser6: any = classToPlain(user, {version: 2}); + expect(plainUser6).not.toBeInstanceOf(User); + expect(plainUser6).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1, @@ -1438,10 +1402,10 @@ describe("basic functionality", () => { } }); - const transformedUser6 = plainToClass(User, fromPlainUser, { version: 2 }); - transformedUser6.should.be.instanceOf(User); - transformedUser6.photo.should.be.instanceOf(Photo); - transformedUser6.should.be.eql({ + const transformedUser6 = plainToClass(User, fromPlainUser, {version: 2}); + expect(transformedUser6).toBeInstanceOf(User); + expect(transformedUser6.photo).toBeInstanceOf(Photo); + expect(transformedUser6).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1, @@ -1449,9 +1413,9 @@ describe("basic functionality", () => { } }); - const plainUser7: any = classToPlain(user, { version: 3 }); - plainUser7.should.not.be.instanceOf(User); - plainUser7.should.be.eql({ + const plainUser7: any = classToPlain(user, {version: 3}); + expect(plainUser7).not.toBeInstanceOf(User); + expect(plainUser7).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1, @@ -1463,11 +1427,11 @@ describe("basic functionality", () => { }] }); - const transformedUser7 = plainToClass(User, fromPlainUser, { version: 3 }); - transformedUser7.should.be.instanceOf(User); - transformedUser7.photo.should.be.instanceOf(Photo); - transformedUser7.photos[0].should.be.instanceOf(Photo); - transformedUser7.should.be.eql({ + const transformedUser7 = plainToClass(User, fromPlainUser, {version: 3}); + expect(transformedUser7).toBeInstanceOf(User); + expect(transformedUser7.photo).toBeInstanceOf(Photo); + expect(transformedUser7.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser7).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1, @@ -1515,8 +1479,8 @@ describe("basic functionality", () => { }; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", name: "Umed Khudoiberdiev", @@ -1524,23 +1488,21 @@ describe("basic functionality", () => { }); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); + expect(transformedUser).toBeInstanceOf(User); const likeUser = new User(); likeUser.firstName = "Umed"; likeUser.lastName = "Khudoiberdiev"; - transformedUser.should.be.eql(likeUser); - + expect(transformedUser).toEqual(likeUser); }); it("should expose with alternative name if its given", () => { defaultMetadataStorage.clear(); class User { - - @Expose({ name: "myName" }) + @Expose({name: "myName"}) firstName: string; - @Expose({ name: "secondName" }) + @Expose({name: "secondName"}) lastName: string; @Exclude() @@ -1551,11 +1513,10 @@ describe("basic functionality", () => { return this.firstName + " " + this.lastName; } - @Expose({ name: "fullName" }) + @Expose({name: "fullName"}) getName(): string { return this.firstName + " " + this.lastName; } - } const user = new User(); @@ -1570,8 +1531,8 @@ describe("basic functionality", () => { }; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ myName: "Umed", secondName: "Khudoiberdiev", name: "Umed Khudoiberdiev", @@ -1579,12 +1540,11 @@ describe("basic functionality", () => { }); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); + expect(transformedUser).toBeInstanceOf(User); const likeUser = new User(); likeUser.firstName = "Umed"; likeUser.lastName = "Khudoiberdiev"; - transformedUser.should.be.eql(likeUser); - + expect(transformedUser).toEqual(likeUser); }); it("should exclude all prefixed properties if prefix is given", () => { @@ -1611,7 +1571,6 @@ describe("basic functionality", () => { get name(): string { return this._firstName + " " + this._lastName; } - } const user = new User(); @@ -1636,9 +1595,9 @@ describe("basic functionality", () => { } }; - const plainUser: any = classToPlain(user, { excludePrefixes: ["_", "$"] }); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + const plainUser: any = classToPlain(user, {excludePrefixes: ["_", "$"]}); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ name: "Umed Khudoiberdiev", photo: { id: 1, @@ -1646,20 +1605,18 @@ describe("basic functionality", () => { } }); - const transformedUser = plainToClass(User, fromPlainUser, { excludePrefixes: ["_", "$"] }); - transformedUser.should.be.instanceOf(User); + const transformedUser = plainToClass(User, fromPlainUser, {excludePrefixes: ["_", "$"]}); + expect(transformedUser).toBeInstanceOf(User); const likeUser = new User(); likeUser.photo = new Photo(); likeUser.photo.id = 1; likeUser.photo.status = 1; - transformedUser.should.be.eql(likeUser); - + expect(transformedUser).toEqual(likeUser); }); it("should transform array", () => { defaultMetadataStorage.clear(); - class User { id: number; firstName: string; @@ -1672,7 +1629,6 @@ describe("basic functionality", () => { get name(): string { return this.firstName + " " + this.lastName; } - } const user1 = new User(); @@ -1688,7 +1644,7 @@ describe("basic functionality", () => { const users = [user1, user2]; const plainUsers: any = classToPlain(users); - plainUsers.should.be.eql([{ + expect(plainUsers).toEqual([{ firstName: "Umed", lastName: "Khudoiberdiev", name: "Umed Khudoiberdiev" @@ -1708,9 +1664,9 @@ describe("basic functionality", () => { name: "Dima Zotov" }]; - const existUsers = [{ id: 1, age: 27 }, { id: 2, age: 30 }]; + const existUsers = [{id: 1, age: 27}, {id: 2, age: 30}]; const plainUser2 = classToPlainFromExist(users, existUsers); - plainUser2.should.be.eql([{ + expect(plainUser2).toEqual([{ id: 1, age: 27, firstName: "Umed", @@ -1726,8 +1682,8 @@ describe("basic functionality", () => { const transformedUser = plainToClass(User, fromPlainUsers); - transformedUser[0].should.be.instanceOf(User); - transformedUser[1].should.be.instanceOf(User); + expect(transformedUser[0]).toBeInstanceOf(User); + expect(transformedUser[1]).toBeInstanceOf(User); const likeUser1 = new User(); likeUser1.firstName = "Umed"; likeUser1.lastName = "Khudoiberdiev"; @@ -1735,13 +1691,13 @@ describe("basic functionality", () => { const likeUser2 = new User(); likeUser2.firstName = "Dima"; likeUser2.lastName = "Zotov"; - transformedUser.should.be.eql([likeUser1, likeUser2]); + expect(transformedUser).toEqual([likeUser1, likeUser2]); const classToClassUsers = classToClass(users); - classToClassUsers[0].should.be.instanceOf(User); - classToClassUsers[1].should.be.instanceOf(User); - classToClassUsers[0].should.not.be.equal(user1); - classToClassUsers[1].should.not.be.equal(user1); + expect(classToClassUsers[0]).toBeInstanceOf(User); + expect(classToClassUsers[1]).toBeInstanceOf(User); + expect(classToClassUsers[0]).not.toEqual(user1); + expect(classToClassUsers[1]).not.toEqual(user1); const classUserLike1 = new User(); classUserLike1.firstName = "Umed"; @@ -1751,7 +1707,7 @@ describe("basic functionality", () => { classUserLike2.firstName = "Dima"; classUserLike2.lastName = "Zotov"; - classToClassUsers.should.be.eql([classUserLike1, classUserLike2]); + expect(classToClassUsers).toEqual([classUserLike1, classUserLike2]); const fromExistUser1 = new User(); fromExistUser1.id = 1; @@ -1762,11 +1718,11 @@ describe("basic functionality", () => { const fromExistUsers = [fromExistUser1, fromExistUser2]; const classToClassFromExistUser = classToClassFromExist(users, fromExistUsers); - classToClassFromExistUser[0].should.be.instanceOf(User); - classToClassFromExistUser[1].should.be.instanceOf(User); - classToClassFromExistUser[0].should.not.be.equal(user1); - classToClassFromExistUser[1].should.not.be.equal(user1); - classToClassFromExistUser.should.be.eql(fromExistUsers); + expect(classToClassFromExistUser[0]).toBeInstanceOf(User); + expect(classToClassFromExistUser[1]).toBeInstanceOf(User); + expect(classToClassFromExistUser[0]).not.toEqual(user1); + expect(classToClassFromExistUser[1]).not.toEqual(user1); + expect(classToClassFromExistUser).toEqual(fromExistUsers); const fromExistUserLike1 = new User(); fromExistUserLike1.id = 1; @@ -1778,8 +1734,7 @@ describe("basic functionality", () => { fromExistUserLike2.firstName = "Dima"; fromExistUserLike2.lastName = "Zotov"; - classToClassFromExistUser.should.be.eql([fromExistUserLike1, fromExistUserLike2]); - + expect(classToClassFromExistUser).toEqual([fromExistUserLike1, fromExistUserLike2]); }); it("should transform objects with null prototype", () => { @@ -1791,8 +1746,7 @@ describe("basic functionality", () => { obj.a = "JS FTW"; const transformedClass = plainToClass(TestClass, obj); - - transformedClass.should.be.instanceOf(TestClass); + expect(transformedClass).toBeInstanceOf(TestClass); }); it("should default union types where the plain type is an array to an array result", () => { @@ -1809,19 +1763,18 @@ describe("basic functionality", () => { } const obj = Object.create(null); - obj.usersDefined = [{ name: "a-name" }]; + obj.usersDefined = [{name: "a-name"}]; obj.usersUndefined = undefined; const transformedClass = plainToClass(TestClass, obj as Object); - transformedClass.should.be.instanceOf(TestClass); + expect(transformedClass).toBeInstanceOf(TestClass); - transformedClass.usersDefined.should.be.instanceOf(Array); - transformedClass.usersDefined.length.should.equal(1); - transformedClass.usersDefined[0].should.be.instanceOf(User); - transformedClass.usersDefined[0].name.should.equal("a-name"); + expect(transformedClass.usersDefined).toBeInstanceOf(Array); + expect(transformedClass.usersDefined.length).toEqual(1); + expect(transformedClass.usersDefined[0]).toBeInstanceOf(User); + expect(transformedClass.usersDefined[0].name).toEqual("a-name"); - expect(transformedClass.usersUndefined).to.equal(undefined); + expect(transformedClass.usersUndefined).toBeUndefined(); }); - }); diff --git a/test/functional/circular-reference-problem.spec.ts b/test/functional/circular-reference-problem.spec.ts index f66306fc2..b589914fc 100644 --- a/test/functional/circular-reference-problem.spec.ts +++ b/test/functional/circular-reference-problem.spec.ts @@ -1,12 +1,9 @@ import "reflect-metadata"; -import {classToPlain, classToClass, plainToClass} from "../../src/index"; +import {classToClass, classToPlain, plainToClass} from "../../src/index"; import {defaultMetadataStorage} from "../../src/storage"; import {TransformOperationExecutor} from "../../src/TransformOperationExecutor"; -import {assert} from "chai"; -import * as sinon from "sinon"; describe("circular reference problem", () => { - it("should skip circular reference objects in classToPlain operation", () => { defaultMetadataStorage.clear(); @@ -19,7 +16,6 @@ describe("circular reference problem", () => { filename: string; user: User; users: User[]; - caption: Caption; } @@ -55,7 +51,7 @@ describe("circular reference problem", () => { photo2.caption = caption; const plainUser = classToPlain(user, { enableCircularCheck: true }); - plainUser.should.be.eql({ + expect(plainUser).toEqual({ firstName: "Umed Khudoiberdiev", caption: { text: "cool photo" }, photos: [{ @@ -70,7 +66,6 @@ describe("circular reference problem", () => { caption: { text: "cool photo" } }] }); - }); it("should not skip circular reference objects, but handle it correctly in classToClass operation", () => { @@ -107,10 +102,9 @@ describe("circular reference problem", () => { photo2.users = [user]; const classUser = classToClass(user, { enableCircularCheck: true }); - classUser.should.not.be.equal(user); - classUser.should.be.instanceOf(User); - classUser.should.be.eql(user); - + expect(classUser).not.toBe(user); + expect(classUser).toBeInstanceOf(User); + expect(classUser).toEqual(user); }); describe("enableCircularCheck option", () => { @@ -124,7 +118,7 @@ describe("circular reference problem", () => { firstName: string; photos: Photo[]; } - let isCircularSpy: sinon.SinonSpy; + let isCircularSpy: jest.SpyInstance; const photo1 = new Photo(); photo1.id = 1; photo1.filename = "me.jpg"; @@ -134,21 +128,21 @@ describe("circular reference problem", () => { user.photos = [photo1]; beforeEach(() => { - isCircularSpy = sinon.spy(TransformOperationExecutor.prototype, "isCircular" as any); + isCircularSpy = jest.spyOn(TransformOperationExecutor.prototype, "isCircular" as any); }); afterEach(() => { - isCircularSpy.restore(); + isCircularSpy.mockRestore(); }); it("enableCircularCheck option is undefined (default)", () => { - const result = plainToClass(User, user); - sinon.assert.notCalled(isCircularSpy); + plainToClass(User, user); + expect(isCircularSpy).not.toHaveBeenCalled(); }); it("enableCircularCheck option is true", () => { - const result = plainToClass(User, user, { enableCircularCheck: true }); - sinon.assert.called(isCircularSpy); + plainToClass(User, user, { enableCircularCheck: true }); + expect(isCircularSpy).toHaveBeenCalled(); }); }); }); diff --git a/test/functional/custom-transform.spec.ts b/test/functional/custom-transform.spec.ts index b3f2954a1..9e979a4f1 100644 --- a/test/functional/custom-transform.spec.ts +++ b/test/functional/custom-transform.spec.ts @@ -1,18 +1,15 @@ import "reflect-metadata"; -import { expect } from "chai"; -import { classToPlain, plainToClass, classToClass } from "../../src/index"; -import { defaultMetadataStorage } from "../../src/storage"; -import { Expose, Transform, Type } from "../../src/decorators"; -import * as moment from "moment"; -import { TransformationType } from "../../src/TransformOperationExecutor"; +import {classToClass, classToPlain, plainToClass} from "../../src/index"; +import {defaultMetadataStorage} from "../../src/storage"; +import {Expose, Transform, Type} from "../../src/decorators"; +import {TransformationType} from "../../src/TransformOperationExecutor"; +import dayjs from "dayjs"; describe("custom transformation decorator", () => { - it("@Expose decorator with \"name\" option should work with @Transform decorator", () => { defaultMetadataStorage.clear(); class User { - @Expose({ name: "user_name" }) @Transform(value => value.toUpperCase()) name: string; @@ -23,22 +20,19 @@ describe("custom transformation decorator", () => { }; const classedUser = plainToClass(User, plainUser); - classedUser.name.should.be.equal("JOHNY CAGE"); + expect(classedUser.name).toEqual("JOHNY CAGE"); }); it("@Transform decorator logic should be executed depend of toPlainOnly and toClassOnly set", () => { defaultMetadataStorage.clear(); class User { - id: number; - name: string; @Transform(value => value.toString(), { toPlainOnly: true }) - @Transform(value => moment(value), { toClassOnly: true }) + @Transform(value => dayjs(value), { toClassOnly: true }) date: Date; - } let plainUser = { @@ -53,38 +47,34 @@ describe("custom transformation decorator", () => { user.date = new Date(); const classedUser = plainToClass(User, plainUser); - classedUser.should.be.instanceOf(User); - classedUser.id.should.be.equal(1); - classedUser.name.should.be.equal("Johny Cage"); - moment.isMoment(classedUser.date).should.be.true; + expect(classedUser).toBeInstanceOf(User); + expect(classedUser.id).toEqual(1); + expect(classedUser.name).toEqual("Johny Cage"); + expect(dayjs.isDayjs(classedUser.date)).toBeTruthy(); const plainedUser = classToPlain(user); - plainedUser.should.not.be.instanceOf(User); - plainedUser.should.be.eql({ + expect(plainedUser).not.toBeInstanceOf(User); + expect(plainedUser).toEqual({ id: 1, name: "Johny Cage", date: user.date.toString() }); - }); it("versions and groups should work with @Transform decorator too", () => { defaultMetadataStorage.clear(); class User { - id: number; - name: string; @Type(() => Date) - @Transform(value => moment(value), { since: 1, until: 2 }) + @Transform(value => dayjs(value), { since: 1, until: 2 }) date: Date; @Type(() => Date) @Transform(value => value.toString(), { groups: ["user"] }) lastVisitDate: Date; - } let plainUser = { @@ -95,34 +85,34 @@ describe("custom transformation decorator", () => { }; const classedUser1 = plainToClass(User, plainUser); - classedUser1.should.be.instanceOf(User); - classedUser1.id.should.be.equal(1); - classedUser1.name.should.be.equal("Johny Cage"); - moment.isMoment(classedUser1.date).should.be.true; + expect(classedUser1).toBeInstanceOf(User); + expect(classedUser1.id).toEqual(1); + expect(classedUser1.name).toEqual("Johny Cage"); + expect(dayjs.isDayjs(classedUser1.date)).toBeTruthy(); const classedUser2 = plainToClass(User, plainUser, { version: 0.5 }); - classedUser2.should.be.instanceOf(User); - classedUser2.id.should.be.equal(1); - classedUser2.name.should.be.equal("Johny Cage"); - classedUser2.date.should.be.instanceof(Date); + expect(classedUser2).toBeInstanceOf(User); + expect(classedUser2.id).toEqual(1); + expect(classedUser2.name).toEqual("Johny Cage"); + expect(classedUser2.date).toBeInstanceOf(Date); const classedUser3 = plainToClass(User, plainUser, { version: 1 }); - classedUser3.should.be.instanceOf(User); - classedUser3.id.should.be.equal(1); - classedUser3.name.should.be.equal("Johny Cage"); - moment.isMoment(classedUser3.date).should.be.true; + expect(classedUser3).toBeInstanceOf(User); + expect(classedUser3.id).toEqual(1); + expect(classedUser3.name).toEqual("Johny Cage"); + expect(dayjs.isDayjs(classedUser3.date)).toBeTruthy(); const classedUser4 = plainToClass(User, plainUser, { version: 2 }); - classedUser4.should.be.instanceOf(User); - classedUser4.id.should.be.equal(1); - classedUser4.name.should.be.equal("Johny Cage"); - classedUser4.date.should.be.instanceof(Date); + expect(classedUser4).toBeInstanceOf(User); + expect(classedUser4.id).toEqual(1); + expect(classedUser4.name).toEqual("Johny Cage"); + expect(classedUser4.date).toBeInstanceOf(Date); const classedUser5 = plainToClass(User, plainUser, { groups: ["user"] }); - classedUser5.should.be.instanceOf(User); - classedUser5.id.should.be.equal(1); - classedUser5.name.should.be.equal("Johny Cage"); - classedUser5.lastVisitDate.should.be.equal(new Date(plainUser.lastVisitDate).toString()); + expect(classedUser5).toBeInstanceOf(User); + expect(classedUser5.id).toEqual(1); + expect(classedUser5.name).toEqual("Johny Cage"); + expect(classedUser5.lastVisitDate).toEqual(new Date(plainUser.lastVisitDate).toString()); }); it("@Transform decorator callback should be given correct arguments", () => { @@ -148,15 +138,15 @@ describe("custom transformation decorator", () => { }; plainToClass(User, plainUser); - objArg.should.be.equal(plainUser); - typeArg.should.be.equal(TransformationType.PLAIN_TO_CLASS); + expect(objArg).toEqual(plainUser); + expect(typeArg).toEqual(TransformationType.PLAIN_TO_CLASS); const user = new User(); user.name = "Johny Cage"; classToPlain(user); - objArg.should.be.equal(user); - typeArg.should.be.equal(TransformationType.CLASS_TO_PLAIN); + expect(objArg).toEqual(user); + expect(typeArg).toEqual(TransformationType.CLASS_TO_PLAIN); }); let model: any; @@ -209,7 +199,7 @@ describe("custom transformation decorator", () => { expect(model instanceof Person); expect(model.address instanceof Address); model.hobbies.forEach((hobby: Hobby) => expect(hobby instanceof Hobby && hobby.type === "sport")); - }).to.not.throw(); + }).not.toThrow(); }); it("should serialize json into model instance of class Person with different possibilities for type of one property (polymorphism)", () => { @@ -224,9 +214,13 @@ describe("custom transformation decorator", () => { public name: string; } - class Sports extends Hobby { } + class Sports extends Hobby { + // Empty + } - class Relaxing extends Hobby { } + class Relaxing extends Hobby { + // Empty + } class Programming extends Hobby { @Transform((value: string) => value.toUpperCase()) @@ -250,11 +244,11 @@ describe("custom transformation decorator", () => { const expectedHobby = { name: "typescript coding", specialAbility: "TESTING" }; const model: Person = plainToClass(Person, json); - expect(model).to.be.instanceof(Person); - expect(model.hobby).to.be.instanceof(Programming); - expect(model.hobby).to.have.not.property("__type"); - expect(model.hobby).to.have.property("specialAbility", "TESTING"); - }).to.not.throw(); + expect(model).toBeInstanceOf(Person); + expect(model.hobby).toBeInstanceOf(Programming); + expect(model.hobby).not.toHaveProperty("__type"); + expect(model.hobby).toHaveProperty("specialAbility", "TESTING"); + }).not.toThrow(); }); it("should serialize json into model instance of class Person with different types in array (polymorphism)", () => { @@ -272,9 +266,13 @@ describe("custom transformation decorator", () => { public name: string; } - class Sports extends Hobby { } + class Sports extends Hobby { + // Empty + } - class Relaxing extends Hobby { } + class Relaxing extends Hobby { + // Empty + } class Programming extends Hobby { @Transform((value: string) => value.toUpperCase()) @@ -297,14 +295,14 @@ describe("custom transformation decorator", () => { const model: Person = plainToClass(Person, json); - expect(model).to.be.instanceof(Person); - expect(model.hobbies[0]).to.be.instanceof(Programming); - expect(model.hobbies[1]).to.be.instanceof(Relaxing); - expect(model.hobbies[0]).to.have.not.property("__type"); - expect(model.hobbies[1]).to.have.not.property("__type"); - expect(model.hobbies[1]).to.have.property("name", "sun"); - expect(model.hobbies[0]).to.have.property("specialAbility", "TESTING"); - }).to.not.throw(); + expect(model).toBeInstanceOf(Person); + expect(model.hobbies[0]).toBeInstanceOf(Programming); + expect(model.hobbies[1]).toBeInstanceOf(Relaxing); + expect(model.hobbies[0]).not.toHaveProperty("__type"); + expect(model.hobbies[1]).not.toHaveProperty("__type"); + expect(model.hobbies[1]).toHaveProperty("name", "sun"); + expect(model.hobbies[0]).toHaveProperty("specialAbility", "TESTING"); + }).not.toThrow(); }); it("should serialize json into model instance of class Person with different possibilities for type of one property AND keeps discriminator property (polymorphism)", () => { @@ -319,9 +317,13 @@ describe("custom transformation decorator", () => { public name: string; } - class Sports extends Hobby { } + class Sports extends Hobby { + // Empty + } - class Relaxing extends Hobby { } + class Relaxing extends Hobby { + // Empty + } class Programming extends Hobby { @Transform((value: string) => value.toUpperCase()) @@ -344,11 +346,11 @@ describe("custom transformation decorator", () => { } const model: Person = plainToClass(Person, json); - expect(model).to.be.instanceof(Person); - expect(model.hobby).to.be.instanceof(Programming); - expect(model.hobby).to.have.property("__type"); - expect(model.hobby).to.have.property("specialAbility", "TESTING"); - }).to.not.throw(); + expect(model).toBeInstanceOf(Person); + expect(model.hobby).toBeInstanceOf(Programming); + expect(model.hobby).toHaveProperty("__type"); + expect(model.hobby).toHaveProperty("specialAbility", "TESTING"); + }).not.toThrow(); }); it("should serialize json into model instance of class Person with different types in array AND keeps discriminator property (polymorphism)", () => { @@ -366,9 +368,13 @@ describe("custom transformation decorator", () => { public name: string; } - class Sports extends Hobby { } + class Sports extends Hobby { + // Empty + } - class Relaxing extends Hobby { } + class Relaxing extends Hobby { + // Empty + } class Programming extends Hobby { @Transform((value: string) => value.toUpperCase()) @@ -390,16 +396,15 @@ describe("custom transformation decorator", () => { public hobbies: any[]; } - const model: Person = plainToClass(Person, json); - expect(model).to.be.instanceof(Person); - expect(model.hobbies[0]).to.be.instanceof(Programming); - expect(model.hobbies[1]).to.be.instanceof(Relaxing); - expect(model.hobbies[0]).to.have.property("__type"); - expect(model.hobbies[1]).to.have.property("__type"); - expect(model.hobbies[1]).to.have.property("name", "sun"); - expect(model.hobbies[0]).to.have.property("specialAbility", "TESTING"); - }).to.not.throw(); + expect(model).toBeInstanceOf(Person); + expect(model.hobbies[0]).toBeInstanceOf(Programming); + expect(model.hobbies[1]).toBeInstanceOf(Relaxing); + expect(model.hobbies[0]).toHaveProperty("__type"); + expect(model.hobbies[1]).toHaveProperty("__type"); + expect(model.hobbies[1]).toHaveProperty("name", "sun"); + expect(model.hobbies[0]).toHaveProperty("specialAbility", "TESTING"); + }).not.toThrow(); }); it("should deserialize class Person into json with different possibilities for type of one property (polymorphism)", () => { @@ -409,9 +414,13 @@ describe("custom transformation decorator", () => { public name: string; } - class Sports extends Hobby { } + class Sports extends Hobby { + // Empty + } - class Relaxing extends Hobby { } + class Relaxing extends Hobby { + // Empty + } class Programming extends Hobby { @Transform((value: string) => value.toUpperCase()) @@ -439,10 +448,9 @@ describe("custom transformation decorator", () => { model.name = "John Doe"; model.hobby = program; const json: any = classToPlain(model); - expect(json).to.be.not.instanceof(Person); - expect(json.hobby).to.have.property("__type", "program"); - - }).to.not.throw(); + expect(json).not.toBeInstanceOf(Person); + expect(json.hobby).toHaveProperty("__type", "program"); + }).not.toThrow(); }); it("should deserialize class Person into json with different types in array (polymorphism)", () => { @@ -452,9 +460,13 @@ describe("custom transformation decorator", () => { public name: string; } - class Sports extends Hobby { } + class Sports extends Hobby { + // Empty + } - class Relaxing extends Hobby { } + class Relaxing extends Hobby { + // Empty + } class Programming extends Hobby { @Transform((value: string) => value.toUpperCase()) @@ -487,11 +499,10 @@ describe("custom transformation decorator", () => { program ]; const json: any = classToPlain(model); - expect(json).to.be.not.instanceof(Person); - expect(json.hobbies[0]).to.have.property("__type", "sports"); - expect(json.hobbies[1]).to.have.property("__type", "program"); - - }).to.not.throw(); + expect(json).not.toBeInstanceOf(Person); + expect(json.hobbies[0]).toHaveProperty("__type", "sports"); + expect(json.hobbies[1]).toHaveProperty("__type", "program"); + }).not.toThrow(); }); it("should transform class Person into class OtherPerson with different possibilities for type of one property (polymorphism)", () => { @@ -501,9 +512,13 @@ describe("custom transformation decorator", () => { public name: string; } - class Sports extends Hobby { } + class Sports extends Hobby { + // Empty + } - class Relaxing extends Hobby { } + class Relaxing extends Hobby { + // Empty + } class Programming extends Hobby { @Transform((value: string) => value.toUpperCase()) @@ -531,10 +546,9 @@ describe("custom transformation decorator", () => { model.name = "John Doe"; model.hobby = program; const person: Person = classToClass(model); - expect(person).to.be.instanceof(Person); - expect(person.hobby).to.have.not.property("__type"); - - }).to.not.throw(); + expect(person).toBeInstanceOf(Person); + expect(person.hobby).not.toHaveProperty("__type"); + }).not.toThrow(); }); it("should transform class Person into class OtherPerson with different types in array (polymorphism)", () => { @@ -544,9 +558,13 @@ describe("custom transformation decorator", () => { public name: string; } - class Sports extends Hobby { } + class Sports extends Hobby { + // Empty + } - class Relaxing extends Hobby { } + class Relaxing extends Hobby { + // Empty + } class Programming extends Hobby { @Transform((value: string) => value.toUpperCase()) @@ -579,11 +597,10 @@ describe("custom transformation decorator", () => { program ]; const person: Person = classToClass(model); - expect(person).to.be.instanceof(Person); - expect(person.hobbies[0]).to.not.have.property("__type"); - expect(person.hobbies[1]).to.not.have.property("__type"); - - }).to.not.throw(); + expect(person).toBeInstanceOf(Person); + expect(person.hobbies[0]).not.toHaveProperty("__type"); + expect(person.hobbies[1]).not.toHaveProperty("__type"); + }).not.toThrow(); }); it("should serialize json into model instance of class Person with different possibilities for type of one property AND uses default as fallback (polymorphism)", () => { @@ -598,9 +615,13 @@ describe("custom transformation decorator", () => { public name: string; } - class Sports extends Hobby { } + class Sports extends Hobby { + // Empty + } - class Relaxing extends Hobby { } + class Relaxing extends Hobby { + // Empty + } class Programming extends Hobby { @Transform((value: string) => value.toUpperCase()) @@ -620,11 +641,11 @@ describe("custom transformation decorator", () => { } const model: Person = plainToClass(Person, json); - expect(model).to.be.instanceof(Person); - expect(model.hobby).to.be.instanceof(Hobby); - expect(model.hobby).to.not.have.property("__type"); - expect(model.hobby).to.have.property("specialAbility", "testing"); - }).to.not.throw(); + expect(model).toBeInstanceOf(Person); + expect(model.hobby).toBeInstanceOf(Hobby); + expect(model.hobby).not.toHaveProperty("__type"); + expect(model.hobby).toHaveProperty("specialAbility", "testing"); + }).not.toThrow(); }); it("should serialize json into model instance of class Person with different types in array AND uses default as fallback (polymorphism)", () => { @@ -642,9 +663,13 @@ describe("custom transformation decorator", () => { public name: string; } - class Sports extends Hobby { } + class Sports extends Hobby { + // Empty + } - class Relaxing extends Hobby { } + class Relaxing extends Hobby { + // Empty + } class Programming extends Hobby { @Transform((value: string) => value.toUpperCase()) @@ -665,20 +690,19 @@ describe("custom transformation decorator", () => { const model: Person = plainToClass(Person, json); - expect(model).to.be.instanceof(Person); - expect(model.hobbies[0]).to.be.instanceof(Hobby); - expect(model.hobbies[1]).to.be.instanceof(Hobby); - expect(model.hobbies[0]).to.not.have.property("__type"); - expect(model.hobbies[1]).to.not.have.property("__type"); - expect(model.hobbies[1]).to.have.property("name", "sun"); - expect(model.hobbies[0]).to.have.property("specialAbility", "testing"); - }).to.not.throw(); + expect(model).toBeInstanceOf(Person); + expect(model.hobbies[0]).toBeInstanceOf(Hobby); + expect(model.hobbies[1]).toBeInstanceOf(Hobby); + expect(model.hobbies[0]).not.toHaveProperty("__type"); + expect(model.hobbies[1]).not.toHaveProperty("__type"); + expect(model.hobbies[1]).toHaveProperty("name", "sun"); + expect(model.hobbies[0]).toHaveProperty("specialAbility", "testing"); + }).not.toThrow(); }); it("should serialize a model into json", () => { expect(() => { classToPlain(model); - }).to.not.throw(); + }).not.toThrow(); }); - }); diff --git a/test/functional/es6-data-types.spec.ts b/test/functional/es6-data-types.spec.ts index a4fee98fa..08f0c3f11 100644 --- a/test/functional/es6-data-types.spec.ts +++ b/test/functional/es6-data-types.spec.ts @@ -4,7 +4,6 @@ import {defaultMetadataStorage} from "../../src/storage"; import {Type} from "../../src/decorators"; describe("es6 data types", () => { - it("using Map", () => { defaultMetadataStorage.clear(); @@ -36,18 +35,18 @@ describe("es6 data types", () => { user.weapons = weapons; const classedUser = plainToClass(User, plainUser); - classedUser.should.be.instanceOf(User); - classedUser.id.should.be.equal(1); - classedUser.name.should.be.equal("Max Pain"); - classedUser.weapons.should.be.instanceOf(Map); - classedUser.weapons.size.should.be.equal(3); - classedUser.weapons.get("firstWeapon").should.be.equal("knife"); - classedUser.weapons.get("secondWeapon").should.be.equal("eagle"); - classedUser.weapons.get("thirdWeapon").should.be.equal("ak-47"); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser.id).toEqual(1); + expect(classedUser.name).toEqual("Max Pain"); + expect(classedUser.weapons).toBeInstanceOf(Map); + expect(classedUser.weapons.size).toEqual(3); + expect(classedUser.weapons.get("firstWeapon")).toEqual("knife"); + expect(classedUser.weapons.get("secondWeapon")).toEqual("eagle"); + expect(classedUser.weapons.get("thirdWeapon")).toEqual("ak-47"); const plainedUser = classToPlain(user); - plainedUser.should.not.be.instanceOf(User); - plainedUser.should.be.eql({ + expect(plainedUser).not.toBeInstanceOf(User); + expect(plainedUser).toEqual({ id: 1, name: "Max Pain", weapons: { @@ -90,18 +89,18 @@ describe("es6 data types", () => { user.weapons = weapons; const classedUser = plainToClass(User, plainUser); - classedUser.should.be.instanceOf(User); - classedUser.id.should.be.equal(1); - classedUser.name.should.be.equal("Max Pain"); - classedUser.weapons.should.be.instanceOf(Set); - classedUser.weapons.size.should.be.equal(3); - classedUser.weapons.has("knife").should.be.true; - classedUser.weapons.has("eagle").should.be.true; - classedUser.weapons.has("ak-47").should.be.true; + expect(classedUser).toBeInstanceOf(User); + expect(classedUser.id).toEqual(1); + expect(classedUser.name).toEqual("Max Pain"); + expect(classedUser.weapons).toBeInstanceOf(Set); + expect(classedUser.weapons.size).toEqual(3); + expect(classedUser.weapons.has("knife")).toBeTruthy(); + expect(classedUser.weapons.has("eagle")).toBeTruthy(); + expect(classedUser.weapons.has("ak-47")).toBeTruthy(); const plainedUser = classToPlain(user); - plainedUser.should.not.be.instanceOf(User); - plainedUser.should.be.eql({ + expect(plainedUser).not.toBeInstanceOf(User); + expect(plainedUser).toEqual({ id: 1, name: "Max Pain", weapons: [ @@ -159,30 +158,30 @@ describe("es6 data types", () => { user.weapons = weapons; const classedUser = plainToClass(User, plainUser); - classedUser.should.be.instanceOf(User); - classedUser.id.should.be.equal(1); - classedUser.name.should.be.equal("Max Pain"); - classedUser.weapons.should.be.instanceOf(Map); - classedUser.weapons.size.should.be.equal(3); - classedUser.weapons.get("firstWeapon").should.be.instanceof(Weapon); - classedUser.weapons.get("firstWeapon").should.be.eql({ + expect(classedUser).toBeInstanceOf(User); + expect(classedUser.id).toEqual(1); + expect(classedUser.name).toEqual("Max Pain"); + expect(classedUser.weapons).toBeInstanceOf(Map); + expect(classedUser.weapons.size).toEqual(3); + expect(classedUser.weapons.get("firstWeapon")).toBeInstanceOf(Weapon); + expect(classedUser.weapons.get("firstWeapon")).toEqual({ model: "knife", range: 1 }); - classedUser.weapons.get("secondWeapon").should.be.instanceof(Weapon); - classedUser.weapons.get("secondWeapon").should.be.eql({ + expect(classedUser.weapons.get("secondWeapon")).toBeInstanceOf(Weapon); + expect(classedUser.weapons.get("secondWeapon")).toEqual({ model: "eagle", range: 200 }); - classedUser.weapons.get("thirdWeapon").should.be.instanceof(Weapon); - classedUser.weapons.get("thirdWeapon").should.be.eql({ + expect(classedUser.weapons.get("thirdWeapon")).toBeInstanceOf(Weapon); + expect(classedUser.weapons.get("thirdWeapon")).toEqual({ model: "ak-47", range: 800 }); const plainedUser = classToPlain(user); - plainedUser.should.not.be.instanceOf(User); - plainedUser.should.be.eql({ + expect(plainedUser).not.toBeInstanceOf(User); + expect(plainedUser).toEqual({ id: 1, name: "Max Pain", weapons: { @@ -240,25 +239,25 @@ describe("es6 data types", () => { user.weapons = weapons; const classedUser = plainToClass(User, plainUser); - classedUser.should.be.instanceOf(User); - classedUser.id.should.be.equal(1); - classedUser.name.should.be.equal("Max Pain"); - classedUser.weapons.should.be.instanceOf(Set); - classedUser.weapons.size.should.be.equal(3); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser.id).toEqual(1); + expect(classedUser.name).toEqual("Max Pain"); + expect(classedUser.weapons).toBeInstanceOf(Set); + expect(classedUser.weapons.size).toEqual(3); const it = classedUser.weapons.values(); const first = it.next().value; const second = it.next().value; const third = it.next().value; - first.should.be.instanceof(Weapon); - first.should.be.eql({ model: "knife", range: 1 }); - second.should.be.instanceof(Weapon); - second.should.be.eql({ model: "eagle", range: 200 }); - third.should.be.instanceof(Weapon); - third.should.be.eql({ model: "ak-47", range: 800 }); + expect(first).toBeInstanceOf(Weapon); + expect(first).toEqual({ model: "knife", range: 1 }); + expect(second).toBeInstanceOf(Weapon); + expect(second).toEqual({ model: "eagle", range: 200 }); + expect(third).toBeInstanceOf(Weapon); + expect(third).toEqual({ model: "ak-47", range: 800 }); const plainedUser = classToPlain(user); - plainedUser.should.not.be.instanceOf(User); - plainedUser.should.be.eql({ + expect(plainedUser).not.toBeInstanceOf(User); + expect(plainedUser).toEqual({ id: 1, name: "Max Pain", weapons: [ @@ -267,8 +266,5 @@ describe("es6 data types", () => { { model: "ak-47", range: 800 }, ] }); - }); - - -}); \ No newline at end of file +}); diff --git a/test/functional/ignore-decorators.spec.ts b/test/functional/ignore-decorators.spec.ts index 706dc1508..ffbcb742c 100644 --- a/test/functional/ignore-decorators.spec.ts +++ b/test/functional/ignore-decorators.spec.ts @@ -4,12 +4,10 @@ import {defaultMetadataStorage} from "../../src/storage"; import {Exclude, Expose} from "../../src/decorators"; describe("ignoring specific decorators", () => { - it("when ignoreDecorators is set to true it should ignore all decorators", () => { defaultMetadataStorage.clear(); class User { - id: number; @Expose({ name: "lala" }) @@ -28,11 +26,10 @@ describe("ignoring specific decorators", () => { user.password = "imnosuperman"; const plainedUser = classToPlain(user, { ignoreDecorators: true }); - plainedUser.should.be.eql({ + expect(plainedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" }); }); - -}); \ No newline at end of file +}); diff --git a/test/functional/implicit-type-declarations.spec.ts b/test/functional/implicit-type-declarations.spec.ts index 09f8dce4d..e0ff39bab 100644 --- a/test/functional/implicit-type-declarations.spec.ts +++ b/test/functional/implicit-type-declarations.spec.ts @@ -1,45 +1,39 @@ import "reflect-metadata"; -import { - plainToClass, -} from "../../src/index"; +import {plainToClass,} from "../../src/index"; import {defaultMetadataStorage} from "../../src/storage"; import {Expose, Type} from "../../src/decorators"; -import {expect} from "chai"; describe("implicit type conversion", () => { it("should run only when enabled", () => { defaultMetadataStorage.clear(); class SimpleExample { + @Expose() + readonly implicitTypeNumber: number; - @Expose() - readonly implicitTypeNumber: number; - - @Expose() - readonly implicitTypeString: string; + @Expose() + readonly implicitTypeString: string; } const result1: SimpleExample = plainToClass(SimpleExample, { implicitTypeNumber: "100", implicitTypeString: 133123, - }, { enableImplicitConversion: true }); + }, {enableImplicitConversion: true}); const result2: SimpleExample = plainToClass(SimpleExample, { implicitTypeNumber: "100", implicitTypeString: 133123, - }, { enableImplicitConversion: false }); + }, {enableImplicitConversion: false}); - expect(result1).to.deep.equal({ implicitTypeNumber: 100, implicitTypeString: "133123" }); - expect(result2).to.deep.equal({ implicitTypeNumber: "100", implicitTypeString: 133123 }); + expect(result1).toEqual({implicitTypeNumber: 100, implicitTypeString: "133123"}); + expect(result2).toEqual({implicitTypeNumber: "100", implicitTypeString: 133123}); }); }); describe("implicit and explicity type declarations", () => { - defaultMetadataStorage.clear(); class Example { - @Expose() readonly implicitTypeViaOtherDecorator: Date; @@ -54,31 +48,28 @@ describe("implicit and explicity type declarations", () => { implicitTypeViaOtherDecorator: "2018-12-24T12:00:00Z", implicitTypeViaEmptyTypeDecorator: "100", explicitType: 100, - }, { enableImplicitConversion: true }); + }, {enableImplicitConversion: true}); it("should use implicitly defined design:type to convert value when no @Type decorator is used", () => { - expect(result.implicitTypeViaOtherDecorator).to.be.instanceOf(Date); - expect(result.implicitTypeViaOtherDecorator.getTime()).to.be.equal(new Date("2018-12-24T12:00:00Z").getTime()); + expect(result.implicitTypeViaOtherDecorator).toBeInstanceOf(Date); + expect(result.implicitTypeViaOtherDecorator.getTime()).toEqual(new Date("2018-12-24T12:00:00Z").getTime()); }); it("should use implicitly defined design:type to convert value when empty @Type() decorator is used", () => { - expect(result.implicitTypeViaEmptyTypeDecorator).that.is.a("number"); - expect(result.implicitTypeViaEmptyTypeDecorator).to.be.equal(100); + expect(typeof result.implicitTypeViaEmptyTypeDecorator).toBe("number"); + expect(result.implicitTypeViaEmptyTypeDecorator).toEqual(100); }); it("should use explicitly defined type when @Type(() => Construtable) decorator is used", () => { - expect(result.explicitType).that.is.a("string"); - expect(result.explicitType).to.be.equal("100"); + expect(typeof result.explicitType).toBe("string"); + expect(result.explicitType).toEqual("100"); }); - }); describe("plainToClass transforms built-in primitive types properly", () => { - defaultMetadataStorage.clear(); class Example { - @Type() date: Date; @@ -109,30 +100,29 @@ describe("plainToClass transforms built-in primitive types properly", () => { number2: 100, boolean: 1, boolean2: 0, - }, { enableImplicitConversion: true }); + }, {enableImplicitConversion: true}); it("should recognize and convert to Date", () => { - expect(result.date).to.be.instanceOf(Date); - expect(result.date.getTime()).to.be.equal(new Date("2018-12-24T12:00:00Z").getTime()); + expect(result.date).toBeInstanceOf(Date); + expect(result.date.getTime()).toEqual(new Date("2018-12-24T12:00:00Z").getTime()); }); it("should recognize and convert to string", () => { - expect(result.string).that.is.a("string"); - expect(result.string2).that.is.a("string"); - expect(result.string).to.be.equal("100"); - expect(result.string2).to.be.equal("100"); + expect(typeof result.string).toBe("string"); + expect(typeof result.string2).toBe("string"); + expect(result.string).toEqual("100"); + expect(result.string2).toEqual("100"); }); it("should recognize and convert to number", () => { - expect(result.number).that.is.a("number"); - expect(result.number2).that.is.a("number"); - expect(result.number).to.be.equal(100); - expect(result.number2).to.be.equal(100); + expect(typeof result.number).toBe("number"); + expect(typeof result.number2).toBe("number"); + expect(result.number).toEqual(100); + expect(result.number2).toEqual(100); }); it("should recognize and convert to boolean", () => { - expect(result.boolean).to.be.true; - expect(result.boolean2).to.be.false; + expect(result.boolean).toBeTruthy(); + expect(result.boolean2).toBeFalsy(); }); - -}); \ No newline at end of file +}); diff --git a/test/functional/inheritence.spec.ts b/test/functional/inheritence.spec.ts index 729cd1047..623365359 100644 --- a/test/functional/inheritence.spec.ts +++ b/test/functional/inheritence.spec.ts @@ -1,10 +1,8 @@ import "reflect-metadata"; -import {Transform, Type, plainToClass} from "../../src/index"; +import {plainToClass, Transform, Type} from "../../src/index"; import {defaultMetadataStorage} from "../../src/storage"; -import {Exclude, Expose} from "../../src/decorators"; describe("inheritence", () => { - it("decorators should work inside a base class", () => { defaultMetadataStorage.clear(); @@ -20,7 +18,7 @@ describe("inheritence", () => { id: number; email: string; } - + class Student extends User { @Transform(value => value.toUpperCase()) university: string; @@ -35,10 +33,10 @@ describe("inheritence", () => { }; const classedStudent = plainToClass(Student, plainStudent); - classedStudent.name.should.be.equal("JOHNY CAGE"); - classedStudent.university.should.be.equal("MIT"); - classedStudent.birthDate.getTime().should.be.equal(new Date(1967, 2, 1).getTime()); - classedStudent.id.should.be.equal(plainStudent.id); - classedStudent.email.should.be.equal(plainStudent.email); + expect(classedStudent.name).toEqual("JOHNY CAGE"); + expect(classedStudent.university).toEqual("MIT"); + expect(classedStudent.birthDate.getTime()).toEqual(new Date(1967, 2, 1).getTime()); + expect(classedStudent.id).toEqual(plainStudent.id); + expect(classedStudent.email).toEqual(plainStudent.email); }); }); diff --git a/test/functional/prototype-inheritance.spec.ts b/test/functional/prototype-inheritance.spec.ts deleted file mode 100644 index cb9f6bb48..000000000 --- a/test/functional/prototype-inheritance.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -// import { expect } from "chai"; - -// import { plainToClass } from "../../src"; - -// describe("Prototype inheritance", () => { - -// // https://github.com/typestack/class-transformer/issues/233 -// it("should set value if property has default value in prototype chain.", () => { -// class TestObject { -// normalProp: string = "Hello!"; -// prototypedProp: string; -// } - -// TestObject.prototype.prototypedProp = "I'm a BUG!"; - -// const payload = { -// normalProp: "Goodbye!", -// prototypedProp: "Goodbye!" -// }; - -// const result = plainToClass(TestObject, payload); - -// expect(result).to.eql({ -// normalProp: "Goodbye!", -// prototypedProp: "Goodbye!" -// }); -// }); -// }); \ No newline at end of file diff --git a/test/functional/serialization-deserialization.spec.ts b/test/functional/serialization-deserialization.spec.ts index f9da0361e..7b3710100 100644 --- a/test/functional/serialization-deserialization.spec.ts +++ b/test/functional/serialization-deserialization.spec.ts @@ -1,10 +1,9 @@ import "reflect-metadata"; -import {serialize, deserialize, deserializeArray} from "../../src/index"; +import {deserialize, deserializeArray, serialize} from "../../src/index"; import {defaultMetadataStorage} from "../../src/storage"; import {Exclude} from "../../src/decorators"; describe("serialization and deserialization objects", () => { - it("should perform serialization and deserialization properly", () => { defaultMetadataStorage.clear(); @@ -31,7 +30,6 @@ describe("serialization and deserialization objects", () => { user2.password = "imnosuperman"; const users = [user1, user2]; - const plainUser = { firstName: "Umed", lastName: "Khudoiberdiev", @@ -49,13 +47,13 @@ describe("serialization and deserialization objects", () => { }]; const plainedUser = serialize(user); - plainedUser.should.be.eql(JSON.stringify({ + expect(plainedUser).toEqual(JSON.stringify({ firstName: "Umed", lastName: "Khudoiberdiev" })); const plainedUsers = serialize(users); - plainedUsers.should.be.eql(JSON.stringify([{ + expect(plainedUsers).toEqual(JSON.stringify([{ firstName: "Dima", lastName: "Zotov", }, { @@ -64,15 +62,15 @@ describe("serialization and deserialization objects", () => { }])); const classedUser = deserialize(User, JSON.stringify(plainUser)); - classedUser.should.be.instanceOf(User); - classedUser.should.be.eql({ + expect(classedUser).toBeInstanceOf(User); + expect(classedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const classedUsers = deserializeArray(User, JSON.stringify(plainUsers)); - classedUsers[0].should.be.instanceOf(User); - classedUsers[1].should.be.instanceOf(User); + expect(classedUsers[0]).toBeInstanceOf(User); + expect(classedUsers[1]).toBeInstanceOf(User); const userLike1 = new User(); userLike1.firstName = "Dima"; @@ -82,7 +80,7 @@ describe("serialization and deserialization objects", () => { userLike2.firstName = "Bakhrom"; userLike2.lastName = "Baubekov"; - classedUsers.should.be.eql([userLike1, userLike2]); + expect(classedUsers).toEqual([userLike1, userLike2]); }); it("should successfully deserialize object with unknown nested properties ", () => { @@ -100,10 +98,9 @@ describe("serialization and deserialization objects", () => { }; const result = deserialize(TestObject, JSON.stringify(payload)); - - result.should.be.instanceof(TestObject); - result.prop.should.be.eql("Hi"); - // We should strip, but it's a breaking change + expect(result).toBeInstanceOf(TestObject); + expect(result.prop).toEqual("Hi"); + // TODO: We should strip, but it's a breaking change // (result).extra.should.be.undefined; }); @@ -123,30 +120,7 @@ describe("serialization and deserialization objects", () => { }; const result = deserialize(TestObject, JSON.stringify(payload)); - - result.getterOnlyProp.should.be.eql("I cannot write!"); - result.normalProp.should.be.eql("Goodbye!"); - + expect(result.getterOnlyProp).toEqual("I cannot write!"); + expect(result.normalProp).toEqual("Goodbye!"); }); - - // it("should overwrite default properties defined in prototype", () => { - // class TestObject { - // normalProp: string = "Hello!"; - // prototypedProp: string; - // } - - // TestObject.prototype.prototypedProp = "I'm a BUG!"; - - - // const payload = { - // normalProp: "Goodbye!", - // prototypedProp: "Goodbye!" - // }; - - // const result = deserialize(TestObject, JSON.stringify(payload)); - - // result.normalProp.should.be.eql("Goodbye!"); - // result.prototypedProp.should.be.eql("Goodbye!"); - // }); - }); diff --git a/test/functional/specify-maps.spec.ts b/test/functional/specify-maps.spec.ts index ba9d15a57..2eaf2dd4b 100644 --- a/test/functional/specify-maps.spec.ts +++ b/test/functional/specify-maps.spec.ts @@ -1,17 +1,9 @@ import "reflect-metadata"; -import { - classToPlain, - classToPlainFromExist, - plainToClass, - plainToClassFromExist, - classToClass, classToClassFromExist -} from "../../src/index"; +import {classToClass, classToClassFromExist, classToPlain, classToPlainFromExist, plainToClass, plainToClassFromExist} from "../../src/index"; import {defaultMetadataStorage} from "../../src/storage"; import {Exclude, Expose, Type} from "../../src/decorators"; -import {expect} from "chai"; describe("specifying target maps", () => { - it("should convert instance of the given object to plain javascript object and should expose all properties since its a default behaviour", () => { defaultMetadataStorage.clear(); @@ -37,8 +29,8 @@ describe("specifying target maps", () => { fromExistUser.id = 1; const plainUser = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" @@ -46,27 +38,27 @@ describe("specifying target maps", () => { const existUser = { id: 1, age: 27 }; const plainUser2 = classToPlainFromExist(user, existUser); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({ + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -74,19 +66,19 @@ describe("specifying target maps", () => { }); const classToClassUser = classToClass(user); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toBe(user); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -120,53 +112,53 @@ describe("specifying target maps", () => { fromExistUser.id = 1; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); - expect(plainUser.password).to.be.undefined; + expect(plainUser.password).toBeUndefined(); const existUser = { id: 1, age: 27, password: "yayayaya" }; const plainUser2 = classToPlainFromExist(user, existUser); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed", lastName: "Khudoiberdiev", password: "yayayaya" }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({ + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" }); const classToClassUser = classToClass(user); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" @@ -199,41 +191,41 @@ describe("specifying target maps", () => { fromExistUser.id = 1; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({}); - expect(plainUser.firstName).to.be.undefined; - expect(plainUser.lastName).to.be.undefined; - expect(plainUser.password).to.be.undefined; + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({}); + expect(plainUser.firstName).toBeUndefined(); + expect(plainUser.lastName).toBeUndefined(); + expect(plainUser.password).toBeUndefined(); const existUser = { id: 1, age: 27 }; const plainUser2 = classToPlainFromExist(user, existUser); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27 }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({}); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({}); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1 }); const classToClassUser = classToClass(user); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({}); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({}); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1 }); }); @@ -243,7 +235,6 @@ describe("specifying target maps", () => { @Exclude() class User { - id: number; @Expose() @@ -270,52 +261,52 @@ describe("specifying target maps", () => { fromExistUser.id = 1; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); - expect(plainUser.password).to.be.undefined; + expect(plainUser.password).toBeUndefined(); const existUser = { id: 1, age: 27 }; const plainUser2 = classToPlainFromExist(user, existUser); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed", lastName: "Khudoiberdiev" }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({ + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" }); const classToClassUser = classToClass(user); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" @@ -326,7 +317,6 @@ describe("specifying target maps", () => { defaultMetadataStorage.clear(); class User { - id: number; @Expose() @@ -353,52 +343,52 @@ describe("specifying target maps", () => { fromExistUser.id = 1; const plainUser: any = classToPlain(user, { strategy: "excludeAll" }); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); - expect(plainUser.password).to.be.undefined; + expect(plainUser.password).toBeUndefined(); const existUser = { id: 1, age: 27 }; const plainUser2 = classToPlainFromExist(user, existUser, { strategy: "excludeAll" }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed", lastName: "Khudoiberdiev" }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); const transformedUser = plainToClass(User, fromPlainUser, { strategy: "excludeAll" }); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({ + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: "excludeAll" }); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" }); const classToClassUser = classToClass(user, { strategy: "excludeAll" }); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: "excludeAll" }); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev" @@ -409,9 +399,7 @@ describe("specifying target maps", () => { defaultMetadataStorage.clear(); class User { - id: number; - firstName: string; @Exclude() @@ -436,48 +424,48 @@ describe("specifying target maps", () => { fromExistUser.id = 1; const plainUser: any = classToPlain(user, { strategy: "exposeAll" }); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed" }); - expect(plainUser.lastName).to.be.undefined; - expect(plainUser.password).to.be.undefined; + expect(plainUser.lastName).toBeUndefined(); + expect(plainUser.password).toBeUndefined(); const existUser = { id: 1, age: 27 }; const plainUser2 = classToPlainFromExist(user, existUser, { strategy: "exposeAll" }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed" }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); const transformedUser = plainToClass(User, fromPlainUser, { strategy: "exposeAll" }); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({ + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "Umed" }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: "exposeAll" }); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed" }); const classToClassUser = classToClass(user, { strategy: "exposeAll" }); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ firstName: "Umed" }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: "exposeAll" }); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed" }); @@ -487,7 +475,6 @@ describe("specifying target maps", () => { defaultMetadataStorage.clear(); class User { - id: number; @Type(type => String) @@ -531,8 +518,8 @@ describe("specifying target maps", () => { fromExistUser.id = 1; const plainUser: any = classToPlain(user, { strategy: "exposeAll" }); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "321", lastName: "123", password: 123, @@ -543,8 +530,8 @@ describe("specifying target maps", () => { const existUser = { id: 1, age: 27 }; const plainUser2 = classToPlainFromExist(user, existUser, { strategy: "exposeAll" }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "321", @@ -554,11 +541,11 @@ describe("specifying target maps", () => { registrationDate: new Date(date.toString()), lastVisitDate: date.toString(), }); - plainUser2.should.be.equal(existUser); + expect(plainUser2).toEqual(existUser); const transformedUser = plainToClass(User, fromPlainUser, { strategy: "exposeAll" }); - transformedUser.should.be.instanceOf(User); - transformedUser.should.be.eql({ + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ firstName: "321", lastName: "123", password: 123, @@ -568,8 +555,8 @@ describe("specifying target maps", () => { }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: "exposeAll" }); - fromExistTransformedUser.should.be.instanceOf(User); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "321", lastName: "123", @@ -580,9 +567,9 @@ describe("specifying target maps", () => { }); const classToClassUser = classToClass(user, { strategy: "exposeAll" }); - classToClassUser.should.be.instanceOf(User); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ firstName: "321", lastName: "123", password: 123, @@ -592,10 +579,10 @@ describe("specifying target maps", () => { }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: "exposeAll" }); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "321", lastName: "123", @@ -610,22 +597,17 @@ describe("specifying target maps", () => { defaultMetadataStorage.clear(); class Photo { - id: number; - name: string; @Exclude() filename: string; uploadDate: Date; - } class User { - firstName: string; - lastName: string; @Exclude() @@ -647,9 +629,9 @@ describe("specifying target maps", () => { user.photo = photo; const plainUser: any = classToPlain(user, { strategy: "exposeAll" }); - plainUser.should.not.be.instanceOf(User); - plainUser.photo.should.not.be.instanceOf(Photo); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser.photo).not.toBeInstanceOf(Photo); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -658,16 +640,16 @@ describe("specifying target maps", () => { uploadDate: photo.uploadDate } }); - expect(plainUser.password).to.be.undefined; - expect(plainUser.photo.filename).to.be.undefined; - expect(plainUser.photo.uploadDate).to.be.eql(photo.uploadDate); - expect(plainUser.photo.uploadDate).not.to.be.equal(photo.uploadDate); + expect(plainUser.password).toBeUndefined(); + expect(plainUser.photo.filename).toBeUndefined(); + expect(plainUser.photo.uploadDate).toEqual(photo.uploadDate); + expect(plainUser.photo.uploadDate).not.toBe(photo.uploadDate); const existUser = { id: 1, age: 27, photo: { id: 2, description: "photo" } }; const plainUser2: any = classToPlainFromExist(user, existUser, { strategy: "exposeAll" }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.photo.should.not.be.instanceOf(Photo); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2.photo).not.toBeInstanceOf(Photo); + expect(plainUser2).toEqual({ id: 1, age: 27, firstName: "Umed", @@ -679,25 +661,22 @@ describe("specifying target maps", () => { description: "photo" } }); - plainUser2.should.be.equal(existUser); - expect(plainUser2.password).to.be.undefined; - expect(plainUser2.photo.filename).to.be.undefined; - expect(plainUser2.photo.uploadDate).to.be.eql(photo.uploadDate); - expect(plainUser2.photo.uploadDate).not.to.be.equal(photo.uploadDate); + expect(plainUser2).toEqual(existUser); + expect(plainUser2.password).toBeUndefined(); + expect(plainUser2.photo.filename).toBeUndefined(); + expect(plainUser2.photo.uploadDate).toEqual(photo.uploadDate); + expect(plainUser2.photo.uploadDate).not.toBe(photo.uploadDate); }); it("should transform nested objects too and make sure given type is used instead of automatically guessed one", () => { defaultMetadataStorage.clear(); class Photo { - id: number; - name: string; @Exclude() filename: string; - } class ExtendedPhoto implements Photo { @@ -710,11 +689,8 @@ describe("specifying target maps", () => { } class User { - id: number; - firstName: string; - lastName: string; @Exclude() @@ -736,8 +712,8 @@ describe("specifying target maps", () => { user.photo = photo; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -745,34 +721,27 @@ describe("specifying target maps", () => { filename: "iam.jpg" } }); - expect(plainUser.password).to.be.undefined; - expect(plainUser.photo.name).to.be.undefined; + expect(plainUser.password).toBeUndefined(); + expect(plainUser.photo.name).toBeUndefined(); }); it("should convert given plain object to class instance object", () => { defaultMetadataStorage.clear(); class Photo { - id: number; - name: string; @Exclude() filename: string; metadata: string; - uploadDate: Date; - } class User { - id: number; - firstName: string; - lastName: string; @Exclude() @@ -811,9 +780,9 @@ describe("specifying target maps", () => { fromExistUser.photo = fromExistPhoto; const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); - transformedUser.photo.should.be.instanceOf(Photo); - transformedUser.should.be.eql({ + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser.photo).toBeInstanceOf(Photo); + expect(transformedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -824,9 +793,9 @@ describe("specifying target maps", () => { }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - fromExistTransformedUser.should.be.equal(fromExistUser); - fromExistTransformedUser.photo.should.be.equal(fromExistPhoto); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toEqual(fromExistUser); + expect(fromExistTransformedUser.photo).toEqual(fromExistPhoto); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -839,11 +808,11 @@ describe("specifying target maps", () => { }); const classToClassUser = classToClass(user); - classToClassUser.should.be.instanceOf(User); - classToClassUser.photo.should.be.instanceOf(Photo); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.not.be.equal(user.photo); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser.photo).toBeInstanceOf(Photo); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).not.toEqual(user.photo); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -854,12 +823,12 @@ describe("specifying target maps", () => { }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.photo.should.be.instanceOf(Photo); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.not.be.equal(user.photo); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).not.toEqual(user.photo); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -892,9 +861,7 @@ describe("specifying target maps", () => { } class User { - id: number; - firstName: string; @Expose({ @@ -920,7 +887,6 @@ describe("specifying target maps", () => { }) @Type(type => Photo) photos: Photo[]; - } const user = new User(); @@ -957,20 +923,20 @@ describe("specifying target maps", () => { fromExistUser.photo.metadata = "taken by Camera"; const plainUser1: any = classToPlain(user); - plainUser1.should.not.be.instanceOf(User); - plainUser1.should.be.eql({ + expect(plainUser1).not.toBeInstanceOf(User); + expect(plainUser1).toEqual({ firstName: "Umed", photo: { id: 1 } }); - expect(plainUser1.lastName).to.be.undefined; - expect(plainUser1.password).to.be.undefined; - expect(plainUser1.isActive).to.be.undefined; + expect(plainUser1.lastName).toBeUndefined(); + expect(plainUser1.password).toBeUndefined(); + expect(plainUser1.isActive).toBeUndefined(); const plainUser2: any = classToPlain(user, { groups: ["user"] }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman", @@ -979,12 +945,12 @@ describe("specifying target maps", () => { filename: "myphoto.jpg" } }); - expect(plainUser2.isActive).to.be.undefined; + expect(plainUser2.isActive).toBeUndefined(); const transformedUser2 = plainToClass(User, fromPlainUser, { groups: ["user"] }); - transformedUser2.should.be.instanceOf(User); - transformedUser2.photo.should.be.instanceOf(Photo); - transformedUser2.should.be.eql({ + expect(transformedUser2).toBeInstanceOf(User); + expect(transformedUser2.photo).toBeInstanceOf(Photo); + expect(transformedUser2).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman", @@ -995,9 +961,9 @@ describe("specifying target maps", () => { }); const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { groups: ["user"] }); - fromExistTransformedUser.should.be.equal(fromExistUser); - fromExistTransformedUser.photo.should.be.equal(fromExistUser.photo); - fromExistTransformedUser.should.be.eql({ + expect(fromExistTransformedUser).toEqual(fromExistUser); + expect(fromExistTransformedUser.photo).toEqual(fromExistUser.photo); + expect(fromExistTransformedUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -1010,11 +976,11 @@ describe("specifying target maps", () => { }); const classToClassUser = classToClass(user, { groups: ["user"] }); - classToClassUser.should.be.instanceOf(User); - classToClassUser.photo.should.be.instanceOf(Photo); - classToClassUser.should.not.be.equal(user); - classToClassUser.should.not.be.equal(user.photo); - classToClassUser.should.be.eql({ + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser.photo).toBeInstanceOf(Photo); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).not.toEqual(user.photo); + expect(classToClassUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman", @@ -1025,12 +991,12 @@ describe("specifying target maps", () => { }); const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { groups: ["user"] }); - classToClassFromExistUser.should.be.instanceOf(User); - classToClassFromExistUser.photo.should.be.instanceOf(Photo); - classToClassFromExistUser.should.not.be.equal(user); - classToClassFromExistUser.should.not.be.equal(user.photo); - classToClassFromExistUser.should.be.equal(fromExistUser); - classToClassFromExistUser.should.be.eql({ + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).not.toEqual(user.photo); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ id: 1, firstName: "Umed", lastName: "Khudoiberdiev", @@ -1043,8 +1009,8 @@ describe("specifying target maps", () => { }); const plainUser3: any = classToPlain(user, { groups: ["guest"] }); - plainUser3.should.not.be.instanceOf(User); - plainUser3.should.be.eql({ + expect(plainUser3).not.toBeInstanceOf(User); + expect(plainUser3).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1052,13 +1018,13 @@ describe("specifying target maps", () => { filename: "myphoto.jpg" } }); - expect(plainUser3.password).to.be.undefined; - expect(plainUser3.isActive).to.be.undefined; + expect(plainUser3.password).toBeUndefined(); + expect(plainUser3.isActive).toBeUndefined(); const transformedUser3 = plainToClass(User, fromPlainUser, { groups: ["guest"] }); - transformedUser3.should.be.instanceOf(User); - transformedUser3.photo.should.be.instanceOf(Photo); - transformedUser3.should.be.eql({ + expect(transformedUser3).toBeInstanceOf(User); + expect(transformedUser3.photo).toBeInstanceOf(Photo); + expect(transformedUser3).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1068,8 +1034,8 @@ describe("specifying target maps", () => { }); const plainUser4: any = classToPlain(user, { groups: ["admin"] }); - plainUser4.should.not.be.instanceOf(User); - plainUser4.should.be.eql({ + expect(plainUser4).not.toBeInstanceOf(User); + expect(plainUser4).toEqual({ firstName: "Umed", isActive: false, photo: { @@ -1081,14 +1047,14 @@ describe("specifying target maps", () => { status: 1 }] }); - expect(plainUser4.lastName).to.be.undefined; - expect(plainUser4.password).to.be.undefined; + expect(plainUser4.lastName).toBeUndefined(); + expect(plainUser4.password).toBeUndefined(); const transformedUser4 = plainToClass(User, fromPlainUser, { groups: ["admin"] }); - transformedUser4.should.be.instanceOf(User); - transformedUser4.photo.should.be.instanceOf(Photo); - transformedUser4.photos[0].should.be.instanceOf(Photo); - transformedUser4.should.be.eql({ + expect(transformedUser4).toBeInstanceOf(User); + expect(transformedUser4.photo).toBeInstanceOf(Photo); + expect(transformedUser4.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser4).toEqual({ firstName: "Umed", isActive: false, photo: { @@ -1102,8 +1068,8 @@ describe("specifying target maps", () => { }); const plainUser5: any = classToPlain(user, { groups: ["admin", "user"] }); - plainUser5.should.not.be.instanceOf(User); - plainUser5.should.be.eql({ + expect(plainUser5).not.toBeInstanceOf(User); + expect(plainUser5).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman", @@ -1121,8 +1087,8 @@ describe("specifying target maps", () => { }); const transformedUser5 = plainToClass(User, fromPlainUser, { groups: ["admin", "user"] }); - transformedUser5.should.be.instanceOf(User); - transformedUser5.should.be.eql({ + expect(transformedUser5).toBeInstanceOf(User); + expect(transformedUser5).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman", @@ -1159,7 +1125,6 @@ describe("specifying target maps", () => { } class User { - @Expose({ since: 1, until: 2 @@ -1182,7 +1147,6 @@ describe("specifying target maps", () => { }) @Type(type => Photo) photos: Photo[]; - } const user = new User(); @@ -1212,8 +1176,8 @@ describe("specifying target maps", () => { }; const plainUser1: any = classToPlain(user); - plainUser1.should.not.be.instanceOf(User); - plainUser1.should.be.eql({ + expect(plainUser1).not.toBeInstanceOf(User); + expect(plainUser1).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1229,10 +1193,10 @@ describe("specifying target maps", () => { }); const transformedUser1 = plainToClass(User, fromPlainUser); - transformedUser1.should.be.instanceOf(User); - transformedUser1.photo.should.be.instanceOf(Photo); - transformedUser1.photos[0].should.be.instanceOf(Photo); - transformedUser1.should.be.eql({ + expect(transformedUser1).toBeInstanceOf(User); + expect(transformedUser1.photo).toBeInstanceOf(Photo); + expect(transformedUser1.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser1).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1248,25 +1212,25 @@ describe("specifying target maps", () => { }); const plainUser2: any = classToPlain(user, { version: 0.3 }); - plainUser2.should.not.be.instanceOf(User); - plainUser2.should.be.eql({ + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ photo: { id: 1 } }); const transformedUser2 = plainToClass(User, fromPlainUser, { version: 0.3 }); - transformedUser2.should.be.instanceOf(User); - transformedUser2.photo.should.be.instanceOf(Photo); - transformedUser2.should.be.eql({ + expect(transformedUser2).toBeInstanceOf(User); + expect(transformedUser2.photo).toBeInstanceOf(Photo); + expect(transformedUser2).toEqual({ photo: { id: 1 } }); const plainUser3: any = classToPlain(user, { version: 0.5 }); - plainUser3.should.not.be.instanceOf(User); - plainUser3.should.be.eql({ + expect(plainUser3).not.toBeInstanceOf(User); + expect(plainUser3).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1 @@ -1274,9 +1238,9 @@ describe("specifying target maps", () => { }); const transformedUser3 = plainToClass(User, fromPlainUser, { version: 0.5 }); - transformedUser3.should.be.instanceOf(User); - transformedUser3.photo.should.be.instanceOf(Photo); - transformedUser3.should.be.eql({ + expect(transformedUser3).toBeInstanceOf(User); + expect(transformedUser3.photo).toBeInstanceOf(Photo); + expect(transformedUser3).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1 @@ -1284,8 +1248,8 @@ describe("specifying target maps", () => { }); const plainUser4: any = classToPlain(user, { version: 1 }); - plainUser4.should.not.be.instanceOf(User); - plainUser4.should.be.eql({ + expect(plainUser4).not.toBeInstanceOf(User); + expect(plainUser4).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1294,9 +1258,9 @@ describe("specifying target maps", () => { }); const transformedUser4 = plainToClass(User, fromPlainUser, { version: 1 }); - transformedUser4.should.be.instanceOf(User); - transformedUser4.photo.should.be.instanceOf(Photo); - transformedUser4.should.be.eql({ + expect(transformedUser4).toBeInstanceOf(User); + expect(transformedUser4.photo).toBeInstanceOf(Photo); + expect(transformedUser4).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1305,8 +1269,8 @@ describe("specifying target maps", () => { }); const plainUser5: any = classToPlain(user, { version: 1.5 }); - plainUser5.should.not.be.instanceOf(User); - plainUser5.should.be.eql({ + expect(plainUser5).not.toBeInstanceOf(User); + expect(plainUser5).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1316,9 +1280,9 @@ describe("specifying target maps", () => { }); const transformedUser5 = plainToClass(User, fromPlainUser, { version: 1.5 }); - transformedUser5.should.be.instanceOf(User); - transformedUser5.photo.should.be.instanceOf(Photo); - transformedUser5.should.be.eql({ + expect(transformedUser5).toBeInstanceOf(User); + expect(transformedUser5.photo).toBeInstanceOf(Photo); + expect(transformedUser5).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", photo: { @@ -1328,8 +1292,8 @@ describe("specifying target maps", () => { }); const plainUser6: any = classToPlain(user, { version: 2 }); - plainUser6.should.not.be.instanceOf(User); - plainUser6.should.be.eql({ + expect(plainUser6).not.toBeInstanceOf(User); + expect(plainUser6).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1, @@ -1338,9 +1302,9 @@ describe("specifying target maps", () => { }); const transformedUser6 = plainToClass(User, fromPlainUser, { version: 2 }); - transformedUser6.should.be.instanceOf(User); - transformedUser6.photo.should.be.instanceOf(Photo); - transformedUser6.should.be.eql({ + expect(transformedUser6).toBeInstanceOf(User); + expect(transformedUser6.photo).toBeInstanceOf(Photo); + expect(transformedUser6).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1, @@ -1349,8 +1313,8 @@ describe("specifying target maps", () => { }); const plainUser7: any = classToPlain(user, { version: 3 }); - plainUser7.should.not.be.instanceOf(User); - plainUser7.should.be.eql({ + expect(plainUser7).not.toBeInstanceOf(User); + expect(plainUser7).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1, @@ -1363,10 +1327,10 @@ describe("specifying target maps", () => { }); const transformedUser7 = plainToClass(User, fromPlainUser, { version: 3 }); - transformedUser7.should.be.instanceOf(User); - transformedUser7.photo.should.be.instanceOf(Photo); - transformedUser7.photos[0].should.be.instanceOf(Photo); - transformedUser7.should.be.eql({ + expect(transformedUser7).toBeInstanceOf(User); + expect(transformedUser7.photo).toBeInstanceOf(Photo); + expect(transformedUser7.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser7).toEqual({ lastName: "Khudoiberdiev", photo: { id: 1, @@ -1377,7 +1341,6 @@ describe("specifying target maps", () => { status: 1 }] }); - }); it("should expose method and accessors that have @Expose()", () => { @@ -1399,7 +1362,6 @@ describe("specifying target maps", () => { getName(): string { return this.firstName + " " + this.lastName; } - } const user = new User(); @@ -1414,8 +1376,8 @@ describe("specifying target maps", () => { }; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", name: "Umed Khudoiberdiev", @@ -1423,19 +1385,17 @@ describe("specifying target maps", () => { }); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); + expect(transformedUser).toBeInstanceOf(User); const likeUser = new User(); likeUser.firstName = "Umed"; likeUser.lastName = "Khudoiberdiev"; - transformedUser.should.be.eql(likeUser); - + expect(transformedUser).toEqual(likeUser); }); it("should expose with alternative name if its given", () => { defaultMetadataStorage.clear(); class User { - @Expose({ name: "myName" }) firstName: string; @@ -1454,7 +1414,6 @@ describe("specifying target maps", () => { getName(): string { return this.firstName + " " + this.lastName; } - } const user = new User(); @@ -1469,8 +1428,8 @@ describe("specifying target maps", () => { }; const plainUser: any = classToPlain(user); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ myName: "Umed", secondName: "Khudoiberdiev", name: "Umed Khudoiberdiev", @@ -1478,12 +1437,11 @@ describe("specifying target maps", () => { }); const transformedUser = plainToClass(User, fromPlainUser); - transformedUser.should.be.instanceOf(User); + expect(transformedUser).toBeInstanceOf(User); const likeUser = new User(); likeUser.firstName = "Umed"; likeUser.lastName = "Khudoiberdiev"; - transformedUser.should.be.eql(likeUser); - + expect(transformedUser).toEqual(likeUser); }); it("should exclude all prefixed properties if prefix is given", () => { @@ -1510,7 +1468,6 @@ describe("specifying target maps", () => { get name(): string { return this._firstName + " " + this._lastName; } - } const user = new User(); @@ -1536,8 +1493,8 @@ describe("specifying target maps", () => { }; const plainUser: any = classToPlain(user, { excludePrefixes: ["_", "$"] }); - plainUser.should.not.be.instanceOf(User); - plainUser.should.be.eql({ + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ name: "Umed Khudoiberdiev", photo: { id: 1, @@ -1546,19 +1503,17 @@ describe("specifying target maps", () => { }); const transformedUser = plainToClass(User, fromPlainUser, { excludePrefixes: ["_", "$"] }); - transformedUser.should.be.instanceOf(User); + expect(transformedUser).toBeInstanceOf(User); const likeUser = new User(); likeUser.photo = new Photo(); likeUser.photo.id = 1; likeUser.photo.status = 1; - transformedUser.should.be.eql(likeUser); - + expect(transformedUser).toEqual(likeUser); }); it("should be able to transform array too", () => { defaultMetadataStorage.clear(); - class User { id: number; firstName: string; @@ -1571,7 +1526,6 @@ describe("specifying target maps", () => { get name(): string { return this.firstName + " " + this.lastName; } - } const user1 = new User(); @@ -1587,7 +1541,7 @@ describe("specifying target maps", () => { const users = [user1, user2]; const plainUsers: any = classToPlain(users); - plainUsers.should.be.eql([{ + expect(plainUsers).toEqual([{ firstName: "Umed", lastName: "Khudoiberdiev", name: "Umed Khudoiberdiev" @@ -1609,7 +1563,7 @@ describe("specifying target maps", () => { const existUsers = [{ id: 1, age: 27 }, { id: 2, age: 30 }]; const plainUser2 = classToPlainFromExist(users, existUsers); - plainUser2.should.be.eql([{ + expect(plainUser2).toEqual([{ id: 1, age: 27, firstName: "Umed", @@ -1625,8 +1579,8 @@ describe("specifying target maps", () => { const transformedUser = plainToClass(User, fromPlainUsers); - transformedUser[0].should.be.instanceOf(User); - transformedUser[1].should.be.instanceOf(User); + expect(transformedUser[0]).toBeInstanceOf(User); + expect(transformedUser[1]).toBeInstanceOf(User); const likeUser1 = new User(); likeUser1.firstName = "Umed"; likeUser1.lastName = "Khudoiberdiev"; @@ -1634,13 +1588,13 @@ describe("specifying target maps", () => { const likeUser2 = new User(); likeUser2.firstName = "Dima"; likeUser2.lastName = "Zotov"; - transformedUser.should.be.eql([likeUser1, likeUser2]); + expect(transformedUser).toEqual([likeUser1, likeUser2]); const classToClassUsers = classToClass(users); - classToClassUsers[0].should.be.instanceOf(User); - classToClassUsers[1].should.be.instanceOf(User); - classToClassUsers[0].should.not.be.equal(user1); - classToClassUsers[1].should.not.be.equal(user1); + expect(classToClassUsers[0]).toBeInstanceOf(User); + expect(classToClassUsers[1]).toBeInstanceOf(User); + expect(classToClassUsers[0]).not.toEqual(user1); + expect(classToClassUsers[1]).not.toEqual(user1); const classUserLike1 = new User(); classUserLike1.firstName = "Umed"; @@ -1650,7 +1604,7 @@ describe("specifying target maps", () => { classUserLike2.firstName = "Dima"; classUserLike2.lastName = "Zotov"; - classToClassUsers.should.be.eql([classUserLike1, classUserLike2]); + expect(classToClassUsers).toEqual([classUserLike1, classUserLike2]); const fromExistUser1 = new User(); fromExistUser1.id = 1; @@ -1661,11 +1615,11 @@ describe("specifying target maps", () => { const fromExistUsers = [fromExistUser1, fromExistUser2]; const classToClassFromExistUser = classToClassFromExist(users, fromExistUsers); - classToClassFromExistUser[0].should.be.instanceOf(User); - classToClassFromExistUser[1].should.be.instanceOf(User); - classToClassFromExistUser[0].should.not.be.equal(user1); - classToClassFromExistUser[1].should.not.be.equal(user1); - classToClassFromExistUser.should.be.eql(fromExistUsers); + expect(classToClassFromExistUser[0]).toBeInstanceOf(User); + expect(classToClassFromExistUser[1]).toBeInstanceOf(User); + expect(classToClassFromExistUser[0]).not.toEqual(user1); + expect(classToClassFromExistUser[1]).not.toEqual(user1); + expect(classToClassFromExistUser).toEqual(fromExistUsers); const fromExistUserLike1 = new User(); fromExistUserLike1.id = 1; @@ -1677,8 +1631,6 @@ describe("specifying target maps", () => { fromExistUserLike2.firstName = "Dima"; fromExistUserLike2.lastName = "Zotov"; - classToClassFromExistUser.should.be.eql([fromExistUserLike1, fromExistUserLike2]); - + expect(classToClassFromExistUser).toEqual([fromExistUserLike1, fromExistUserLike2]); }); - -}); \ No newline at end of file +}); diff --git a/test/functional/transformation-option.spec.ts b/test/functional/transformation-option.spec.ts index f0d299bf5..ed70a1325 100644 --- a/test/functional/transformation-option.spec.ts +++ b/test/functional/transformation-option.spec.ts @@ -1,26 +1,15 @@ import "reflect-metadata"; -import { - classToPlain, - classToPlainFromExist, - plainToClass, - plainToClassFromExist, - classToClass, classToClassFromExist -} from "../../src/index"; +import {classToPlain, plainToClass} from "../../src/index"; import {defaultMetadataStorage} from "../../src/storage"; -import {Exclude, Expose, Type} from "../../src/decorators"; -import {expect} from "chai"; +import {Exclude, Expose} from "../../src/decorators"; describe("filtering by transformation option", () => { - it("@Exclude with toPlainOnly set to true then it should be excluded only during classToPlain and classToPlainFromExist operations", () => { defaultMetadataStorage.clear(); class User { - id: number; - firstName: string; - lastName: string; @Exclude({ toPlainOnly: true }) @@ -39,14 +28,14 @@ describe("filtering by transformation option", () => { }; const plainedUser = classToPlain(user); - plainedUser.should.be.eql({ + expect(plainedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const classedUser = plainToClass(User, plainUser); - classedUser.should.be.instanceOf(User); - classedUser.should.be.eql({ + expect(classedUser).toBeInstanceOf(User); + expect(classedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" @@ -57,11 +46,8 @@ describe("filtering by transformation option", () => { defaultMetadataStorage.clear(); class User { - id: number; - firstName: string; - lastName: string; @Exclude({ toClassOnly: true }) @@ -80,14 +66,14 @@ describe("filtering by transformation option", () => { }; const classedUser = plainToClass(User, plainUser); - classedUser.should.be.instanceOf(User); - classedUser.should.be.eql({ + expect(classedUser).toBeInstanceOf(User); + expect(classedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const plainedUser = classToPlain(user); - plainedUser.should.be.eql({ + expect(plainedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" @@ -99,7 +85,6 @@ describe("filtering by transformation option", () => { @Exclude() class User { - @Expose() firstName: string; @@ -122,14 +107,14 @@ describe("filtering by transformation option", () => { }; const plainedUser = classToPlain(user); - plainedUser.should.be.eql({ + expect(plainedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); const classedUser = plainToClass(User, plainUser); - classedUser.should.be.instanceOf(User); - classedUser.should.be.eql({ + expect(classedUser).toBeInstanceOf(User); + expect(classedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" @@ -141,7 +126,6 @@ describe("filtering by transformation option", () => { @Exclude() class User { - @Expose() firstName: string; @@ -164,18 +148,17 @@ describe("filtering by transformation option", () => { }; const plainedUser = classToPlain(user); - plainedUser.should.be.eql({ + expect(plainedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev", password: "imnosuperman" }); const classedUser = plainToClass(User, plainUser); - classedUser.should.be.instanceOf(User); - classedUser.should.be.eql({ + expect(classedUser).toBeInstanceOf(User); + expect(classedUser).toEqual({ firstName: "Umed", lastName: "Khudoiberdiev" }); }); - -}); \ No newline at end of file +}); diff --git a/test/functional/transformer-method.spec.ts b/test/functional/transformer-method.spec.ts index 7a462cb87..475b9e40e 100644 --- a/test/functional/transformer-method.spec.ts +++ b/test/functional/transformer-method.spec.ts @@ -1,16 +1,13 @@ import "reflect-metadata"; import {defaultMetadataStorage} from "../../src/storage"; -import { Exclude, Expose, TransformClassToPlain, TransformClassToClass, TransformPlainToClass } from "../../src/decorators"; -import {expect} from "chai"; +import {Exclude, Expose, TransformClassToClass, TransformClassToPlain, TransformPlainToClass} from "../../src/decorators"; describe("transformer methods decorator", () => { - it("should expose non configuration properties and return User instance class", () => { defaultMetadataStorage.clear(); @Exclude() class User { - id: number; @Expose() @@ -23,7 +20,6 @@ describe("transformer methods decorator", () => { } class UserController { - @TransformClassToClass() getUser() { const user = new User(); @@ -38,7 +34,7 @@ describe("transformer methods decorator", () => { const controller = new UserController(); const result = controller.getUser(); - expect(result.password).to.be.undefined; + expect(result.password).toBeUndefined(); const plainUser = { firstName: "Snir", @@ -46,8 +42,8 @@ describe("transformer methods decorator", () => { }; - expect(result).to.be.eql(plainUser); - expect(result).to.be.instanceof(User); + expect(result).toEqual(plainUser); + expect(result).toBeInstanceOf(User); }); it("should expose non configuration properties and return User instance class instead of plain object", () => { @@ -83,14 +79,14 @@ describe("transformer methods decorator", () => { const controller = new UserController(); const result = controller.getUser(); - expect(result.password).to.be.undefined; + expect(result.password).toBeUndefined(); const user = new User(); user.firstName = "Snir"; user.lastName = "Segal"; - expect(result).to.be.eql(user); - expect(result).to.be.instanceof(User); + expect(result).toEqual(user); + expect(result).toBeInstanceOf(User); }); it("should expose non configuration properties", () => { @@ -111,7 +107,7 @@ describe("transformer methods decorator", () => { } class UserController { - + @TransformClassToPlain() getUser() { const user = new User(); @@ -126,14 +122,14 @@ describe("transformer methods decorator", () => { const controller = new UserController(); const result = controller.getUser(); - expect(result.password).to.be.undefined; + expect(result.password).toBeUndefined(); const plainUser = { firstName: "Snir", lastName: "Segal" }; - expect(result).to.be.eql(plainUser); + expect(result).toEqual(plainUser); }); it("should expose non configuration properties and properties with specific groups", () => { @@ -157,7 +153,7 @@ describe("transformer methods decorator", () => { } class UserController { - + @TransformClassToPlain({ groups: ["user.permissions"] }) getUserWithRoles() { const user = new User(); @@ -174,7 +170,7 @@ describe("transformer methods decorator", () => { const controller = new UserController(); const result = controller.getUserWithRoles(); - expect(result.password).to.be.undefined; + expect(result.password).toBeUndefined(); const plainUser = { firstName: "Snir", @@ -182,7 +178,7 @@ describe("transformer methods decorator", () => { roles: ["USER", "MANAGER"] }; - expect(result).to.be.eql(plainUser); + expect(result).toEqual(plainUser); }); it("should expose non configuration properties with specific version", () => { @@ -221,7 +217,7 @@ describe("transformer methods decorator", () => { return user; } - + @TransformClassToPlain({ version: 2 }) getUserVersion2() { const user = new User(); @@ -239,8 +235,8 @@ describe("transformer methods decorator", () => { const controller = new UserController(); const resultV2 = controller.getUserVersion2(); - expect(resultV2.password).to.be.undefined; - expect(resultV2.roles).to.be.undefined; + expect(resultV2.password).toBeUndefined(); + expect(resultV2.roles).toBeUndefined(); const plainUserV2 = { firstName: "Snir", @@ -248,19 +244,19 @@ describe("transformer methods decorator", () => { websiteUrl: "http://www.github.com" }; - expect(resultV2).to.be.eql(plainUserV2); + expect(resultV2).toEqual(plainUserV2); const resultV1 = controller.getUserVersion1(); - expect(resultV1.password).to.be.undefined; - expect(resultV1.roles).to.be.undefined; - expect(resultV1.websiteUrl).to.be.undefined; + expect(resultV1.password).toBeUndefined(); + expect(resultV1.roles).toBeUndefined(); + expect(resultV1.websiteUrl).toBeUndefined(); const plainUserV1 = { firstName: "Snir", lastName: "Segal" }; - expect(resultV1).to.be.eql(plainUserV1); + expect(resultV1).toEqual(plainUserV1); }); -}); \ No newline at end of file +}); diff --git a/tsconfig.json b/tsconfig.json index b5c427c6c..8c873fff1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,67 @@ { - "version": "1.8.0", - "compilerOptions": { - "outDir": "build/es5", - "target": "es5", - "module": "commonjs", - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "sourceMap": true, - "noImplicitAny": true, - "declaration": true - }, - "exclude": [ - "build", - "node_modules" - ] + "include": ["./src", "./test"], + "compilerOptions": { + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./build/compiled", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + "strictNullChecks": false, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + "strictPropertyInitialization": false, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } } diff --git a/tslint.json b/tslint.json deleted file mode 100644 index a3626fe9a..000000000 --- a/tslint.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "rules": { - "class-name": true, - "comment-format": [ - true, - "check-space" - ], - "indent": [ - true, - "spaces" - ], - "no-duplicate-variable": true, - "no-eval": true, - "no-internal-module": true, - "no-trailing-whitespace": false, - "no-var-keyword": true, - "one-line": [ - true, - "check-open-brace", - "check-whitespace" - ], - "quotemark": [ - true, - "double" - ], - "semicolon": true, - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "variable-name": [ - true, - "ban-keywords" - ], - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ] - } -} \ No newline at end of file From 9e16b99a5ea63fec8165fdb97fb573b722f12c03 Mon Sep 17 00:00:00 2001 From: Rob Muchall Date: Fri, 3 Apr 2020 16:11:06 +0100 Subject: [PATCH 02/30] Added eslint --- .eslintrc.js | 32 + package-lock.json | 689 ++++++++++++++++++ package.json | 4 + src/ClassTransformer.ts | 24 +- src/TransformOperationExecutor.ts | 67 +- src/decorators.ts | 25 +- src/index.ts | 12 +- src/metadata/ExposeExcludeOptions.ts | 4 +- src/metadata/MetadataStorage.ts | 26 +- test/functional/basic-functionality.spec.ts | 2 +- .../circular-reference-problem.spec.ts | 4 +- test/functional/custom-transform.spec.ts | 11 +- test/functional/es6-data-types.spec.ts | 8 +- test/functional/inheritence.spec.ts | 2 +- test/functional/transformer-method.spec.ts | 12 +- 15 files changed, 823 insertions(+), 99 deletions(-) create mode 100644 .eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..c080459f8 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,32 @@ +module.exports = { + root: true, + env: { + node: true + }, + parser: "@typescript-eslint/parser", + parserOptions: { + project: ['./tsconfig.json'] + }, + plugins: [ + "@typescript-eslint" + ], + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking" + ], + ignorePatterns: ["**/*.js"], + rules: { + "no-case-declarations": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/member-delimiter-style": "off", + "@typescript-eslint/member-ordering": "error", + "@typescript-eslint/unbound-method": ["error", { + "ignoreStatic": true + }] + } +}; diff --git a/package-lock.json b/package-lock.json index 8e6e063dd..7534a2377 100644 --- a/package-lock.json +++ b/package-lock.json @@ -578,6 +578,12 @@ "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/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -613,6 +619,12 @@ "pretty-format": "25.1.0" } }, + "@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/node": { "version": "13.11.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", @@ -646,6 +658,57 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz", + "integrity": "sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.26.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz", + "integrity": "sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.26.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.26.0.tgz", + "integrity": "sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.26.0", + "@typescript-eslint/typescript-estree": "2.26.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz", + "integrity": "sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + } + }, "abab": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", @@ -676,6 +739,12 @@ } } }, + "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 + }, "acorn-walk": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", @@ -1063,6 +1132,12 @@ "supports-color": "^7.1.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -1092,6 +1167,21 @@ } } }, + "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.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -1530,6 +1620,15 @@ "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", "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" + } + }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -1583,12 +1682,234 @@ "source-map": "~0.6.1" } }, + "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": { + "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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "eslint-plugin-jest": { + "version": "23.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz", + "integrity": "sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^2.5.0" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", + "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", + "dev": true, + "requires": { + "estraverse": "^5.0.0" + }, + "dependencies": { + "estraverse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", + "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "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", @@ -1719,6 +2040,17 @@ } } }, + "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" + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -1817,6 +2149,24 @@ "bser": "2.1.1" } }, + "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-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" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1836,6 +2186,34 @@ "path-exists": "^4.0.0" } }, + "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": { + "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 + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1881,6 +2259,12 @@ "dev": true, "optional": 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 + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -1931,6 +2315,15 @@ "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" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -2065,6 +2458,30 @@ "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" + }, + "dependencies": { + "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 + } + } + }, "import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", @@ -2097,6 +2514,27 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "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" + } + }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -2183,6 +2621,12 @@ "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-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2195,6 +2639,15 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "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-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2210,6 +2663,12 @@ "isobject": "^3.0.1" } }, + "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-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3001,6 +3460,12 @@ "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", @@ -3216,6 +3681,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "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 + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -3403,6 +3874,12 @@ "word-wrap": "~1.2.3" } }, + "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-each-series": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", @@ -3439,6 +3916,15 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "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" + } + }, "parse5": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", @@ -3541,6 +4027,12 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "prompts": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", @@ -3627,6 +4119,12 @@ "safe-regex": "^1.1.0" } }, + "regexpp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", + "dev": true + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -3759,6 +4257,16 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "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" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -3780,6 +4288,24 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "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", @@ -4026,6 +4552,49 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "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" + }, + "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.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 + }, + "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 + } + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -4325,6 +4894,12 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -4350,6 +4925,58 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "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": { + "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 + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -4371,12 +4998,24 @@ "minimatch": "^3.0.4" } }, + "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 + }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "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", @@ -4413,6 +5052,15 @@ } } }, + "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" + } + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -4517,6 +5165,21 @@ "yn": "3.1.1" } }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "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" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -4653,6 +5316,12 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, + "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 + }, "v8-to-istanbul": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz", @@ -4782,6 +5451,26 @@ "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" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", diff --git a/package.json b/package.json index f96fbf91c..48188d4e9 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,12 @@ "devDependencies": { "@types/jest": "25.1.5", "@types/node": "13.11.0", + "@typescript-eslint/eslint-plugin": "2.26.0", + "@typescript-eslint/parser": "2.26.0", "copyfiles": "2.2.0", "dayjs": "1.8.23", + "eslint": "6.8.0", + "eslint-plugin-jest": "23.8.2", "jest": "25.2.7", "json": "9.0.6", "reflect-metadata": "0.1.13", diff --git a/src/ClassTransformer.ts b/src/ClassTransformer.ts index 71d2c8dc6..929a1996f 100644 --- a/src/ClassTransformer.ts +++ b/src/ClassTransformer.ts @@ -14,9 +14,9 @@ export class ClassTransformer { /** * Converts class (constructor) object to plain (literal) object. Also works with arrays. */ - classToPlain(object: T, options?: ClassTransformOptions): Object; - classToPlain(object: T[], options?: ClassTransformOptions): Object[]; - classToPlain(object: T|T[], options?: ClassTransformOptions): Object|Object[] { + classToPlain>(object: T, options?: ClassTransformOptions): Record; + classToPlain>(object: T[], options?: ClassTransformOptions): Record[]; + classToPlain>(object: T|T[], options?: ClassTransformOptions): Record|Record[] { const executor = new TransformOperationExecutor(TransformationType.CLASS_TO_PLAIN, options || {}); return executor.transform(undefined, object, undefined, undefined, undefined, undefined); } @@ -26,9 +26,9 @@ export class ClassTransformer { * Uses given plain object as source object (it means fills given plain object with data from class object). * Also works with arrays. */ - classToPlainFromExist(object: T, plainObject: P, options?: ClassTransformOptions): T; - classToPlainFromExist(object: T, plainObjects: P[], options?: ClassTransformOptions): T[]; - classToPlainFromExist(object: T, plainObject: P|P[], options?: ClassTransformOptions): T|T[] { + classToPlainFromExist, P>(object: T, plainObject: P, options?: ClassTransformOptions): T; + classToPlainFromExist, P>(object: T, plainObjects: P[], options?: ClassTransformOptions): T[]; + classToPlainFromExist, P>(object: T, plainObject: P|P[], options?: ClassTransformOptions): T|T[] { const executor = new TransformOperationExecutor(TransformationType.CLASS_TO_PLAIN, options || {}); return executor.transform(plainObject, object, undefined, undefined, undefined, undefined); } @@ -36,9 +36,9 @@ export class ClassTransformer { /** * Converts plain (literal) object to class (constructor) object. Also works with arrays. */ - plainToClass>(cls: ClassType, plain: V, options?: ClassTransformOptions): T[]; - plainToClass(cls: ClassType, plain: V, options?: ClassTransformOptions): T; - plainToClass(cls: ClassType, plain: V|V[], options?: ClassTransformOptions): T|T[] { + plainToClass, V extends Array>(cls: ClassType, plain: V, options?: ClassTransformOptions): T[]; + plainToClass, V>(cls: ClassType, plain: V, options?: ClassTransformOptions): T; + plainToClass, V>(cls: ClassType, plain: V|V[], options?: ClassTransformOptions): T|T[] { const executor = new TransformOperationExecutor(TransformationType.PLAIN_TO_CLASS, options || {}); return executor.transform(undefined, plain, cls, undefined, undefined, undefined); } @@ -48,9 +48,9 @@ export class ClassTransformer { * Uses given object as source object (it means fills given object with data from plain object). * Also works with arrays. */ - plainToClassFromExist>(clsObject: T, plain: V, options?: ClassTransformOptions): T; - plainToClassFromExist(clsObject: T, plain: V, options?: ClassTransformOptions): T[]; - plainToClassFromExist(clsObject: T, plain: V|V[], options?: ClassTransformOptions): T|T[] { + plainToClassFromExist, V extends Array>(clsObject: T, plain: V, options?: ClassTransformOptions): T; + plainToClassFromExist, V>(clsObject: T, plain: V, options?: ClassTransformOptions): T[]; + plainToClassFromExist, V>(clsObject: T, plain: V|V[], options?: ClassTransformOptions): T|T[] { const executor = new TransformOperationExecutor(TransformationType.PLAIN_TO_CLASS, options || {}); return executor.transform(clsObject, plain, undefined, undefined, undefined, undefined); } diff --git a/src/TransformOperationExecutor.ts b/src/TransformOperationExecutor.ts index 294057fa7..d76815e83 100644 --- a/src/TransformOperationExecutor.ts +++ b/src/TransformOperationExecutor.ts @@ -9,13 +9,30 @@ export enum TransformationType { CLASS_TO_CLASS } +export function testForBuffer(): boolean { + try { + Buffer.isBuffer({/* empty object */}); + return true; + } catch { + return false; + } +} + +function instantiateArrayType(arrayType: Function): Array | Set { + const array = new (arrayType as any)(); + if (!(array instanceof Set) && !("push" in array)) { + return []; + } + return array; +} + export class TransformOperationExecutor { // ------------------------------------------------------------------------- // Private Properties // ------------------------------------------------------------------------- - private recursionStack = new Set(); + private recursionStack = new Set>(); // ------------------------------------------------------------------------- // Constructor @@ -29,12 +46,12 @@ export class TransformOperationExecutor { // Public Methods // ------------------------------------------------------------------------- - transform(source: Object | Object[] | any, - value: Object | Object[] | any, + transform(source: Record | Record[] | any, + value: Record | Record[] | any, targetType: Function | TypeMetadata, arrayType: Function, isMap: boolean, - level: number = 0) { + level: number = 0): any { if (Array.isArray(value) || value instanceof Set) { const newValue = arrayType && this.transformationType === TransformationType.PLAIN_TO_CLASS ? instantiateArrayType(arrayType) : []; @@ -127,9 +144,9 @@ export class TransformOperationExecutor { } // traverse over keys - for (let key of keys) { - - let valueKey = key, newValueKey = key, propertyName = key; + for (const key of keys) { + const valueKey = key; + let newValueKey = key, propertyName = key; if (!this.options.ignoreDecorators && targetType) { if (this.transformationType === TransformationType.PLAIN_TO_CLASS) { const exposeMetadata = defaultMetadataStorage.findExposeMetadataByCustomName((targetType as Function), key); @@ -225,12 +242,13 @@ export class TransformOperationExecutor { if (newValue.constructor.prototype) { const descriptor = Object.getOwnPropertyDescriptor(newValue.constructor.prototype, newValueKey); if ((this.transformationType === TransformationType.PLAIN_TO_CLASS || this.transformationType === TransformationType.CLASS_TO_CLASS) + // eslint-disable-next-line @typescript-eslint/unbound-method && ((descriptor && !descriptor.set) || newValue[newValueKey] instanceof Function)) // || TransformationType === TransformationType.CLASS_TO_CLASS continue; } if (!this.options.enableCircularCheck || !this.isCircular(subValue)) { - let transformKey = this.transformationType === TransformationType.PLAIN_TO_CLASS ? newValueKey : key; + const transformKey = this.transformationType === TransformationType.PLAIN_TO_CLASS ? newValueKey : key; let finalValue; if (this.transformationType === TransformationType.CLASS_TO_PLAIN) { @@ -275,7 +293,7 @@ export class TransformOperationExecutor { } } - private applyCustomTransformations(value: any, target: Function, key: string, obj: any, transformationType: TransformationType) { + private applyCustomTransformations(value: any, target: Function, key: string, obj: any, transformationType: TransformationType): boolean { let metadatas = defaultMetadataStorage.findTransformMetadatas(target, key, this.transformationType); // apply versioning options @@ -310,18 +328,17 @@ export class TransformOperationExecutor { } // preventing circular references - private isCircular(object: Object) { + private isCircular(object: Record): boolean { return this.recursionStack.has(object); } - private getReflectedType(target: Function, propertyName: string) { + private getReflectedType(target: Function, propertyName: string): Function | undefined { if (!target) return undefined; const meta = defaultMetadataStorage.findTypeMetadata(target, propertyName); return meta ? meta.reflectedType : undefined; } - private getKeys(target: Function, object: Object): string[] { - + private getKeys(target: Function, object: Record): string[] { // determine exclusion strategy let strategy = defaultMetadataStorage.getStrategy(target); if (strategy === "none") @@ -361,7 +378,7 @@ export class TransformOperationExecutor { const excludedProperties = defaultMetadataStorage.getExcludedProperties(target, this.transformationType); if (excludedProperties.length > 0) { keys = keys.filter(key => { - return excludedProperties.indexOf(key) === -1; + return !excludedProperties.includes(key); }); } @@ -408,7 +425,7 @@ export class TransformOperationExecutor { return keys; } - private checkVersion(since: number, until: number) { + private checkVersion(since: number, until: number): boolean { let decision = true; if (decision && since) decision = this.options.version >= since; @@ -418,27 +435,11 @@ export class TransformOperationExecutor { return decision; } - private checkGroups(groups: string[]) { + private checkGroups(groups: string[]): boolean { if (!groups) return true; - return this.options.groups.some(optionGroup => groups.indexOf(optionGroup) !== -1); - } - -} - -function instantiateArrayType(arrayType: Function): Array | Set { - const array = new (arrayType as any)(); - if (!(array instanceof Set) && !("push" in array)) { - return []; + return this.options.groups.some(optionGroup => groups.includes(optionGroup)); } - return array; } -export function testForBuffer(): boolean { - try { - Buffer - return true; - } catch { } - return false; -} diff --git a/src/decorators.ts b/src/decorators.ts index 6762d76d7..62abbb528 100644 --- a/src/decorators.ts +++ b/src/decorators.ts @@ -2,7 +2,7 @@ import {ClassTransformer} from "./ClassTransformer"; import {defaultMetadataStorage} from "./storage"; import {TypeMetadata} from "./metadata/TypeMetadata"; import {ExposeMetadata} from "./metadata/ExposeMetadata"; -import {ExposeOptions, ExcludeOptions, TypeHelpOptions, TransformOptions, Discriminator, TypeOptions} from "./metadata/ExposeExcludeOptions"; +import {ExposeOptions, ExcludeOptions, TypeHelpOptions, TransformOptions, TypeOptions} from "./metadata/ExposeExcludeOptions"; import {ExcludeMetadata} from "./metadata/ExcludeMetadata"; import {TransformMetadata} from "./metadata/TransformMetadata"; import {ClassTransformOptions} from "./ClassTransformOptions"; @@ -12,7 +12,7 @@ import {TransformationType} from "./TransformOperationExecutor"; * Defines a custom logic for value transformation. */ export function Transform(transformFn: (value: any, obj: any, transformationType: TransformationType) => any, options?: TransformOptions) { - return function(target: any, key: string) { + return function(target: any, key: string): void { const metadata = new TransformMetadata(target.constructor, key, transformFn, options); defaultMetadataStorage.addTransformMetadata(metadata); }; @@ -23,7 +23,7 @@ export function Transform(transformFn: (value: any, obj: any, transformationType * The given TypeFunction can return a constructor. A discriminator can be given in the options. */ export function Type(typeFunction?: (type?: TypeHelpOptions) => Function, options?: TypeOptions) { - return function(target: any, key: string) { + return function(target: any, key: string): void { const type = (Reflect as any).getMetadata("design:type", target, key); const metadata = new TypeMetadata(target.constructor, key, type, typeFunction, options); defaultMetadataStorage.addTypeMetadata(metadata); @@ -36,7 +36,7 @@ export function Type(typeFunction?: (type?: TypeHelpOptions) => Function, option * you want to skip this property. */ export function Expose(options?: ExposeOptions) { - return function(object: Object|Function, propertyName?: string) { + return function(object: Record|Function, propertyName?: string): void { const metadata = new ExposeMetadata(object instanceof Function ? object : object.constructor, propertyName, options || {}); defaultMetadataStorage.addExposeMetadata(metadata); }; @@ -48,7 +48,7 @@ export function Expose(options?: ExposeOptions) { * you want to skip this property. */ export function Exclude(options?: ExcludeOptions) { - return function(object: Object|Function, propertyName?: string) { + return function(object: Record|Function, propertyName?: string): void { const metadata = new ExcludeMetadata(object instanceof Function ? object : object.constructor, propertyName, options || {}); defaultMetadataStorage.addExcludeMetadata(metadata); }; @@ -59,14 +59,13 @@ export function Exclude(options?: ExcludeOptions) { */ export function TransformClassToPlain(params?: ClassTransformOptions): Function { - return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor) { + return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor): void { const classTransformer: ClassTransformer = new ClassTransformer(); const originalMethod = descriptor.value; - descriptor.value = function(...args: any[]) { + descriptor.value = function(...args: any[]): Record { const result: any = originalMethod.apply(this, args); const isPromise = !!result && (typeof result === "object" || typeof result === "function") && typeof result.then === "function"; - return isPromise ? result.then((data: any) => classTransformer.classToPlain(data, params)) : classTransformer.classToPlain(result, params); }; }; @@ -77,14 +76,13 @@ export function TransformClassToPlain(params?: ClassTransformOptions): Function */ export function TransformClassToClass(params?: ClassTransformOptions): Function { - return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor) { + return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor): void { const classTransformer: ClassTransformer = new ClassTransformer(); const originalMethod = descriptor.value; - descriptor.value = function(...args: any[]) { + descriptor.value = function(...args: any[]): Record { const result: any = originalMethod.apply(this, args); const isPromise = !!result && (typeof result === "object" || typeof result === "function") && typeof result.then === "function"; - return isPromise ? result.then((data: any) => classTransformer.classToClass(data, params)) : classTransformer.classToClass(result, params); }; }; @@ -95,14 +93,13 @@ export function TransformClassToClass(params?: ClassTransformOptions): Function */ export function TransformPlainToClass(classType: any, params?: ClassTransformOptions): Function { - return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor) { + return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor): void { const classTransformer: ClassTransformer = new ClassTransformer(); const originalMethod = descriptor.value; - descriptor.value = function(...args: any[]) { + descriptor.value = function(...args: any[]): Record { const result: any = originalMethod.apply(this, args); const isPromise = !!result && (typeof result === "object" || typeof result === "function") && typeof result.then === "function"; - return isPromise ? result.then((data: any) => classTransformer.plainToClass(classType, data, params)) : classTransformer.plainToClass(classType, result, params); }; }; diff --git a/src/index.ts b/src/index.ts index 7aa00ff77..926b2bf9b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,9 +11,9 @@ const classTransformer = new ClassTransformer(); /** * Converts class (constructor) object to plain (literal) object. Also works with arrays. */ -export function classToPlain(object: T, options?: ClassTransformOptions): Object; -export function classToPlain(object: T[], options?: ClassTransformOptions): Object[]; -export function classToPlain(object: T|T[], options?: ClassTransformOptions): Object|Object[] { +export function classToPlain(object: T, options?: ClassTransformOptions): Record; +export function classToPlain(object: T[], options?: ClassTransformOptions): Record[]; +export function classToPlain(object: T|T[], options?: ClassTransformOptions): Record|Record[] { return classTransformer.classToPlain(object, options); } @@ -22,9 +22,9 @@ export function classToPlain(object: T|T[], options?: ClassTransformOptions): * Uses given plain object as source object (it means fills given plain object with data from class object). * Also works with arrays. */ -export function classToPlainFromExist(object: T, plainObject: Object, options?: ClassTransformOptions): Object; -export function classToPlainFromExist(object: T, plainObjects: Object[], options?: ClassTransformOptions): Object[]; -export function classToPlainFromExist(object: T, plainObject: Object|Object[], options?: ClassTransformOptions): Object|Object[] { +export function classToPlainFromExist(object: T, plainObject: Record, options?: ClassTransformOptions): Record; +export function classToPlainFromExist(object: T, plainObjects: Record[], options?: ClassTransformOptions): Record[]; +export function classToPlainFromExist(object: T, plainObject: Record|Record[], options?: ClassTransformOptions): Record|Record[] { return classTransformer.classToPlainFromExist(object, plainObject, options); } diff --git a/src/metadata/ExposeExcludeOptions.ts b/src/metadata/ExposeExcludeOptions.ts index acc05ba49..a44b7e520 100644 --- a/src/metadata/ExposeExcludeOptions.ts +++ b/src/metadata/ExposeExcludeOptions.ts @@ -17,7 +17,7 @@ export interface TypeOptions { export interface TypeHelpOptions { newObject: any; - object: Object; + object: Record; property: string; } @@ -43,4 +43,4 @@ export interface Discriminator { export interface JsonSubType { value: new (...args: any[]) => any; name: string; -} \ No newline at end of file +} diff --git a/src/metadata/MetadataStorage.ts b/src/metadata/MetadataStorage.ts index 044ef2718..d358ad6e5 100644 --- a/src/metadata/MetadataStorage.ts +++ b/src/metadata/MetadataStorage.ts @@ -23,14 +23,14 @@ export class MetadataStorage { // Adder Methods // ------------------------------------------------------------------------- - addTypeMetadata(metadata: TypeMetadata) { + addTypeMetadata(metadata: TypeMetadata): void { if (!this._typeMetadatas.has(metadata.target)) { this._typeMetadatas.set(metadata.target, new Map()); } this._typeMetadatas.get(metadata.target).set(metadata.propertyName, metadata); } - addTransformMetadata(metadata: TransformMetadata) { + addTransformMetadata(metadata: TransformMetadata): void { if (!this._transformMetadatas.has(metadata.target)) { this._transformMetadatas.set(metadata.target, new Map()); } @@ -40,14 +40,14 @@ export class MetadataStorage { this._transformMetadatas.get(metadata.target).get(metadata.propertyName).push(metadata); } - addExposeMetadata(metadata: ExposeMetadata) { + addExposeMetadata(metadata: ExposeMetadata): void { if (!this._exposeMetadatas.has(metadata.target)) { this._exposeMetadatas.set(metadata.target, new Map()); } this._exposeMetadatas.get(metadata.target).set(metadata.propertyName, metadata); } - addExcludeMetadata(metadata: ExcludeMetadata) { + addExcludeMetadata(metadata: ExcludeMetadata): void { if (!this._excludeMetadatas.has(metadata.target)) { this._excludeMetadatas.set(metadata.target, new Map()); } @@ -91,7 +91,7 @@ export class MetadataStorage { }); } - findTypeMetadata(target: Function, propertyName: string) { + findTypeMetadata(target: Function, propertyName: string): TypeMetadata { return this.findMetadata(this._typeMetadatas, target, propertyName); } @@ -152,7 +152,7 @@ export class MetadataStorage { .map(metadata => metadata.propertyName); } - clear() { + clear(): void { this._typeMetadatas.clear(); this._exposeMetadatas.clear(); this._excludeMetadatas.clear(); @@ -163,27 +163,27 @@ export class MetadataStorage { // Private Methods // ------------------------------------------------------------------------- - private getMetadata(metadatas: Map>, target: Function): T[] { + private getMetadata(metadatas: Map>, target: Function): T[] { const metadataFromTargetMap = metadatas.get(target); let metadataFromTarget: T[]; if (metadataFromTargetMap) { metadataFromTarget = Array.from(metadataFromTargetMap.values()).filter(meta => meta.propertyName !== undefined); } - let metadataFromAncestors: T[] = []; + const metadataFromAncestors: T[] = []; for (const ancestor of this.getAncestors(target)) { const ancestorMetadataMap = metadatas.get(ancestor); if (ancestorMetadataMap) { const metadataFromAncestor = Array.from(ancestorMetadataMap.values()).filter(meta => meta.propertyName !== undefined); metadataFromAncestors.push(...metadataFromAncestor); } - } + } return metadataFromAncestors.concat(metadataFromTarget || []); } private findMetadata(metadatas: Map>, target: Function, propertyName: string): T { const metadataFromTargetMap = metadatas.get(target); if (metadataFromTargetMap) { - const metadataFromTarget = metadataFromTargetMap.get(propertyName); + const metadataFromTarget = metadataFromTargetMap.get(propertyName); if (metadataFromTarget) { return metadataFromTarget; } @@ -204,9 +204,9 @@ export class MetadataStorage { const metadataFromTargetMap = metadatas.get(target); let metadataFromTarget: T[]; if (metadataFromTargetMap) { - metadataFromTarget = metadataFromTargetMap.get(propertyName); + metadataFromTarget = metadataFromTargetMap.get(propertyName); } - let metadataFromAncestorsTarget: T[] = []; + const metadataFromAncestorsTarget: T[] = []; for (const ancestor of this.getAncestors(target)) { const ancestorMetadataMap = metadatas.get(ancestor); if (ancestorMetadataMap) { @@ -221,7 +221,7 @@ export class MetadataStorage { private getAncestors(target: Function): Function[] { if (!target) return []; if (!this._ancestorsMap.has(target)) { - let ancestors: Function[] = []; + const ancestors: Function[] = []; for (let baseClass = Object.getPrototypeOf(target.prototype.constructor); typeof baseClass.prototype !== "undefined"; baseClass = Object.getPrototypeOf(baseClass.prototype.constructor)) { diff --git a/test/functional/basic-functionality.spec.ts b/test/functional/basic-functionality.spec.ts index cec6d6054..75b9293d2 100644 --- a/test/functional/basic-functionality.spec.ts +++ b/test/functional/basic-functionality.spec.ts @@ -1766,7 +1766,7 @@ describe("basic functionality", () => { obj.usersDefined = [{name: "a-name"}]; obj.usersUndefined = undefined; - const transformedClass = plainToClass(TestClass, obj as Object); + const transformedClass = plainToClass(TestClass, obj as Record); expect(transformedClass).toBeInstanceOf(TestClass); diff --git a/test/functional/circular-reference-problem.spec.ts b/test/functional/circular-reference-problem.spec.ts index b589914fc..8d66e065a 100644 --- a/test/functional/circular-reference-problem.spec.ts +++ b/test/functional/circular-reference-problem.spec.ts @@ -136,12 +136,12 @@ describe("circular reference problem", () => { }); it("enableCircularCheck option is undefined (default)", () => { - plainToClass(User, user); + plainToClass>(User, user); expect(isCircularSpy).not.toHaveBeenCalled(); }); it("enableCircularCheck option is true", () => { - plainToClass(User, user, { enableCircularCheck: true }); + plainToClass>(User, user, { enableCircularCheck: true }); expect(isCircularSpy).toHaveBeenCalled(); }); }); diff --git a/test/functional/custom-transform.spec.ts b/test/functional/custom-transform.spec.ts index 9e979a4f1..f20ee6f32 100644 --- a/test/functional/custom-transform.spec.ts +++ b/test/functional/custom-transform.spec.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/camelcase */ import "reflect-metadata"; import {classToClass, classToPlain, plainToClass} from "../../src/index"; import {defaultMetadataStorage} from "../../src/storage"; @@ -15,7 +16,7 @@ describe("custom transformation decorator", () => { name: string; } - let plainUser = { + const plainUser = { user_name: "Johny Cage" }; @@ -35,7 +36,7 @@ describe("custom transformation decorator", () => { date: Date; } - let plainUser = { + const plainUser = { id: 1, name: "Johny Cage", date: new Date().valueOf() @@ -77,7 +78,7 @@ describe("custom transformation decorator", () => { lastVisitDate: Date; } - let plainUser = { + const plainUser = { id: 1, name: "Johny Cage", date: new Date().valueOf(), @@ -121,7 +122,7 @@ describe("custom transformation decorator", () => { let objArg: any; let typeArg: TransformationType; - function transformCallback(value: any, obj: any, type: TransformationType) { + function transformCallback(value: any, obj: any, type: TransformationType): any { objArg = obj; typeArg = type; return value; @@ -133,7 +134,7 @@ describe("custom transformation decorator", () => { name: string; } - let plainUser = { + const plainUser = { name: "Johny Cage", }; diff --git a/test/functional/es6-data-types.spec.ts b/test/functional/es6-data-types.spec.ts index 08f0c3f11..96c867a7b 100644 --- a/test/functional/es6-data-types.spec.ts +++ b/test/functional/es6-data-types.spec.ts @@ -14,7 +14,7 @@ describe("es6 data types", () => { weapons: Map; } - let plainUser = { + const plainUser = { id: 1, name: "Max Pain", weapons: { @@ -68,7 +68,7 @@ describe("es6 data types", () => { weapons: Set; } - let plainUser = { + const plainUser = { id: 1, name: "Max Pain", weapons: [ @@ -128,7 +128,7 @@ describe("es6 data types", () => { weapons: Map; } - let plainUser = { + const plainUser = { id: 1, name: "Max Pain", weapons: { @@ -218,7 +218,7 @@ describe("es6 data types", () => { weapons: Set; } - let plainUser = { + const plainUser = { id: 1, name: "Max Pain", weapons: [ diff --git a/test/functional/inheritence.spec.ts b/test/functional/inheritence.spec.ts index 623365359..df3c4558c 100644 --- a/test/functional/inheritence.spec.ts +++ b/test/functional/inheritence.spec.ts @@ -24,7 +24,7 @@ describe("inheritence", () => { university: string; } - let plainStudent = { + const plainStudent = { name: "Johny Cage", university: "mit", birthDate: new Date(1967, 2, 1).toDateString(), diff --git a/test/functional/transformer-method.spec.ts b/test/functional/transformer-method.spec.ts index 475b9e40e..b5e0aff2a 100644 --- a/test/functional/transformer-method.spec.ts +++ b/test/functional/transformer-method.spec.ts @@ -21,7 +21,7 @@ describe("transformer methods decorator", () => { class UserController { @TransformClassToClass() - getUser() { + getUser(): User { const user = new User(); user.firstName = "Snir"; user.lastName = "Segal"; @@ -66,7 +66,7 @@ describe("transformer methods decorator", () => { class UserController { @TransformPlainToClass(User) - getUser() { + getUser(): User { const user: any = {}; user.firstName = "Snir"; user.lastName = "Segal"; @@ -109,7 +109,7 @@ describe("transformer methods decorator", () => { class UserController { @TransformClassToPlain() - getUser() { + getUser(): User { const user = new User(); user.firstName = "Snir"; user.lastName = "Segal"; @@ -155,7 +155,7 @@ describe("transformer methods decorator", () => { class UserController { @TransformClassToPlain({ groups: ["user.permissions"] }) - getUserWithRoles() { + getUserWithRoles(): User { const user = new User(); user.firstName = "Snir"; user.lastName = "Segal"; @@ -207,7 +207,7 @@ describe("transformer methods decorator", () => { class UserController { @TransformClassToPlain({ version: 1 }) - getUserVersion1() { + getUserVersion1(): User { const user = new User(); user.firstName = "Snir"; user.lastName = "Segal"; @@ -219,7 +219,7 @@ describe("transformer methods decorator", () => { } @TransformClassToPlain({ version: 2 }) - getUserVersion2() { + getUserVersion2(): User { const user = new User(); user.firstName = "Snir"; user.lastName = "Segal"; From 20eb3eff96388f940e95dc6c360d134bb48a0692 Mon Sep 17 00:00:00 2001 From: Andrew Shymanel <61041791+anshymanel@users.noreply.github.com> Date: Tue, 12 May 2020 13:24:13 +0300 Subject: [PATCH 03/30] table of contents added table of contents to navigate docs easily --- README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/README.md b/README.md index 5ff46afc7..dda3913ce 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,41 @@ This tool is super useful on both frontend and backend. Example how to use with angular 2 in [plunker](http://plnkr.co/edit/Mja1ZYAjVySWASMHVB9R). Source code is available [here](https://github.com/pleerock/class-transformer-demo). +- [What is class-transformer](#what-is-class-transformer) +- [Installation](#installation) + - [Node.js](#nodejs) + - [Browser](#browser) +- [Methods](#methods) + - [plainToClass](#plaintoclass) + - [plainToClassFromExist](#plaintoclassfromexist) + - [classToPlain](#classtoplain) + - [classToClass](#classtoclass) + - [serialize](#serialize) + - [deserialize and deserializeArray](#deserialize-and-deserializearray) +- [Enforcing type-safe instance](#enforcing-type-safe-instance) +- [Working with nested objects](#working-with-nested-objects) + - [Providing more than one type option](#providing-more-than-one-type-option) +- [Exposing getters and method return values](#exposing-getters-and-method-return-values) +- [Exposing properties with different names](#exposing-properties-with-different-names) +- [Skipping specific properties](#skipping-specific-properties) +- [Skipping depend of operation](#skipping-depend-of-operation) +- [Skipping all properties of the class](#skipping-all-properties-of-the-class) +- [Skipping private properties, or some prefixed properties](#skipping-private-properties-or-some-prefixed-properties) +- [Using groups to control excluded properties](#using-groups-to-control-excluded-properties) +- [Using versioning to control exposed and excluded properties](#using-versioning-to-control-exposed-and-excluded-properties) +- [Сonverting date strings into Date objects](#%d0%a1onverting-date-strings-into-date-objects) +- [Working with arrays](#working-with-arrays) +- [Additional data transformation](#additional-data-transformation) + - [Basic usage](#basic-usage) + - [Advanced usage](#advanced-usage) +- [Other decorators](#other-decorators) +- [Working with generics](#working-with-generics) +- [Implicit type conversion](#implicit-type-conversion) +- [How does it handle circular references?](#how-does-it-handle-circular-references) +- [Example with Angular2](#example-with-angular2) +- [Samples](#samples) +- [Release notes](#release-notes) + ## What is class-transformer In JavaScript there are two types of objects: From 38fc545128e438494c40996085de0a812d73a635 Mon Sep 17 00:00:00 2001 From: jotamorais Date: Mon, 29 Jun 2020 17:32:43 -0500 Subject: [PATCH 04/30] Enable CI for the project --- .github/workflows/nodejs.yml | 22 ++++++++++++++++++++++ .travis.yml | 2 ++ 2 files changed, 24 insertions(+) create mode 100644 .github/workflows/nodejs.yml diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml new file mode 100644 index 000000000..32b59e8e7 --- /dev/null +++ b/.github/workflows/nodejs.yml @@ -0,0 +1,22 @@ +name: Node.js CI + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [8.x, 10.x, 12.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: npm install + - run: npm test + env: + CI: true diff --git a/.travis.yml b/.travis.yml index 56706be20..7d96cd6b3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,8 @@ language: node_js node_js: - stable + - 12 + - 10 - 8 after_success: From fb8f6a0085c0d1efc80f9b584d2efa202c117472 Mon Sep 17 00:00:00 2001 From: jotamorais Date: Mon, 29 Jun 2020 17:34:18 -0500 Subject: [PATCH 05/30] Bump version Fix npm package vulnerabilities (pull latest dependencies) --- package-lock.json | 5699 ++++++++++++++++++++++----------------------- package.json | 34 +- 2 files changed, 2855 insertions(+), 2878 deletions(-) diff --git a/package-lock.json b/package-lock.json index 218a9108b..b84a60cb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,35 @@ { "name": "class-transformer", - "version": "0.2.3", + "version": "0.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.3", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, "@gulp-sourcemaps/map-sources": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", @@ -20,10 +46,22 @@ "integrity": "sha1-wRzSgX06QBt7oPWkIPNcVhObHB4=", "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/es6-shim": { - "version": "0.31.37", - "resolved": "https://registry.npmjs.org/@types/es6-shim/-/es6-shim-0.31.37.tgz", - "integrity": "sha512-D9BRx0HXsIpa9Ldh/NcHYgL/PtfchL4CC0MtbGliWsTYDuzm9vl6/QeTigNxIhbSBai7QIuv+etQ9BtlFN7Uqw==", + "version": "0.31.40", + "resolved": "https://registry.npmjs.org/@types/es6-shim/-/es6-shim-0.31.40.tgz", + "integrity": "sha512-biQI9Rm+vNEZM+0r/OUEfN87eBC8y45mUGuI3yOpMaTFpn6MIedJrKhle9lQPrVnuDtswqN65lxujS+kuMMWDQ==", + "dev": true + }, + "@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", "dev": true }, "@types/fancy-log": { @@ -32,6 +70,52 @@ "integrity": "sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw==", "dev": true }, + "@types/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "@types/gulp": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.6.tgz", + "integrity": "sha512-0E8/iV/7FKWyQWSmi7jnUvgXXgaw+pfAzEB06Xu+l0iXVJppLbpOye5z7E2klw5akXd+8kPtYuk65YBcZPM4ow==", + "dev": true, + "requires": { + "@types/undertaker": "*", + "@types/vinyl-fs": "*", + "chokidar": "^2.1.2" + } + }, + "@types/merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-3xFWjsGhm5GCVlRrcrrVr9oapPxpbG5M3G/4JGF+Gra++7DWoeDOQphCEhyMpbpbptD3w/4PesYIMby/yHrzkQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, "@types/mocha": { "version": "2.2.48", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", @@ -49,7 +133,7 @@ }, "@types/node": { "version": "0.0.2", - "resolved": "http://registry.npmjs.org/@types/node/-/node-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/@types/node/-/node-0.0.2.tgz", "integrity": "sha1-DaSTSQL79oqXoPUyBKNa0iJJF7w=", "dev": true }, @@ -59,6 +143,43 @@ "integrity": "sha512-w+LjztaZbgZWgt/y/VMP5BUAWLtSyoIJhXyW279hehLPyubDoBNwvhcj3WaSptcekuKYeTCVxrq60rdLc6ImJA==", "dev": true }, + "@types/undertaker": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.2.3.tgz", + "integrity": "sha512-OhvIYx6pUJBxYZf5fM/BVMNXZQMy095kplml+4cWrlNqM1t6XtSIQCuVySGmICZCnzi69Epdljyplm86BlTouQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/undertaker-registry": "*" + } + }, + "@types/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==", + "dev": true + }, + "@types/vinyl": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.4.tgz", + "integrity": "sha512-2o6a2ixaVI2EbwBPg1QYLGQoHK56p/8X/sGfKbFC8N6sY9lfjsMf/GprtkQkSya0D4uRiutRZ2BWj7k3JvLsAQ==", + "dev": true, + "requires": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "@types/vinyl-fs": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.11.tgz", + "integrity": "sha512-2OzQSfIr9CqqWMGqmcERE6Hnd2KY3eBVtFaulVo3sJghplUcaeMdL9ZjEiljcQQeHjheWY9RlNmumjIAvsBNaA==", + "dev": true, + "requires": { + "@types/glob-stream": "*", + "@types/node": "*", + "@types/vinyl": "*" + } + }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -100,18 +221,9 @@ "dev": true, "optional": true }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "requires": { - "string-width": "^2.0.0" - } - }, "ansi-colors": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { @@ -152,10 +264,13 @@ "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" + } }, "ansi-wrap": { "version": "0.1.0", @@ -163,6 +278,25 @@ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -184,42 +318,108 @@ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, "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-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, "array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "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=", + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", "dev": true }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", "dev": true }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "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 + } + } + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -241,6 +441,18 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "array.prototype.map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", + "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.4" + } + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -261,25 +473,67 @@ }, "async": { "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "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 + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "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=", + "available-typed-arrays": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", + "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "array-filter": "^1.0.0" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" } }, "balanced-match": { @@ -343,10 +597,10 @@ } } }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, "binaryextensions": { @@ -355,62 +609,14 @@ "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=", "dev": true }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "optional": true, "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.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" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.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 - }, - "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" - } - } + "file-uri-to-path": "1.0.0" } }, "brace-expansion": { @@ -453,9 +659,21 @@ } }, "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "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-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "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==", "dev": true }, "builtin-modules": { @@ -482,25 +700,9 @@ } }, "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": "http://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" - } - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, "center-align": { @@ -537,16 +739,31 @@ } }, "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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" + } + } } }, "check-error": { @@ -555,11 +772,33 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } }, "class-utils": { "version": "0.3.6", @@ -584,46 +823,66 @@ } } }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "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=", + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", "dev": true }, - "collection-visit": { + "clone-stats": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { @@ -652,23 +911,16 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, - "colors": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", - "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", - "dev": true - }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true, - "optional": true + "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 }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "concat-map": { @@ -677,32 +929,22 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -714,50 +956,44 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "dev": true, + "requires": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, "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=", "dev": true }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "dependencies": { - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "isexe": "^2.0.0" } } } }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, "css": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", @@ -778,19 +1014,20 @@ } } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { - "array-find-index": "^1.0.1" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", "dev": true }, "debug": { @@ -842,25 +1079,42 @@ "type-detect": "^4.0.0" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "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 }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "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 + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "clone": "^1.0.2" + "object-keys": "^1.0.12" } }, "define-property": { @@ -919,12 +1173,6 @@ "rimraf": "^2.2.8" } }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true - }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -938,123 +1186,166 @@ "dev": true }, "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "is-obj": "^1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", "dev": true, "requires": { - "readable-stream": "~1.1.9" + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "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 }, - "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "once": "^1.4.0" + } + }, + "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" + } + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" }, "dependencies": { - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } } } }, - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - } - } + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "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==", + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-shim": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.3.tgz", - "integrity": "sha1-m/tzY/7//4emzbbNk+QF7DxLbyY=", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.5.tgz", + "integrity": "sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg==", "dev": true }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1099,24 +1390,26 @@ "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 }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, "expand-brackets": { @@ -1154,63 +1447,6 @@ } } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "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" - } - }, - "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" - } - } - } - }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -1220,6 +1456,23 @@ "homedir-polyfill": "^1.0.1" } }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -1313,13 +1566,14 @@ } }, "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", "dev": true, "requires": { "ansi-gray": "^0.1.1", "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", "time-stamp": "^1.0.0" } }, @@ -1329,11 +1583,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true }, "fill-range": { "version": "4.0.0", @@ -1358,12 +1613,6 @@ } } }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -1375,21 +1624,21 @@ } }, "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "requires": { "detect-file": "^1.0.0", - "is-glob": "^3.1.0", + "is-glob": "^4.0.0", "micromatch": "^3.0.4", "resolve-dir": "^1.0.1" } }, "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", "dev": true, "requires": { "expand-tilde": "^2.0.2", @@ -1399,18 +1648,39 @@ "parse-filepath": "^1.0.1" } }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, "flagged-respawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", "dev": true }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + } + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1426,6 +1696,12 @@ "for-in": "^1.0.1" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, "formatio": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", @@ -1444,38 +1720,71 @@ "map-cache": "^0.2.2" } }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, + "optional": true, "requires": { - "globule": "~0.1.0" + "bindings": "^1.5.0", + "nan": "^2.12.1" } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "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-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } }, "get-value": { "version": "2.0.6", @@ -1484,9 +1793,9 @@ "dev": true }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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", @@ -1497,42 +1806,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.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" - } - } - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -1541,92 +1814,49 @@ "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "dev": true, - "requires": { - "glob": "^4.3.1", - "glob2base": "^0.0.12", - "minimatch": "^2.0.1", - "ordered-read-streams": "^0.1.0", - "through2": "^0.6.1", - "unique-stream": "^1.0.0" }, "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "is-extglob": "^2.1.0" } } } }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "^0.5.1" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", "dev": true, "requires": { - "find-index": "^0.1.1" + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "glob-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", "dev": true, "requires": { - "ini": "^1.3.4" + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" } }, "global-modules": { @@ -1667,266 +1897,92 @@ "pinkie-promise": "^2.0.0" } }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "~3.1.21", - "lodash": "~1.0.1", - "minimatch": "~0.2.11" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, "glogg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", - "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", "dev": true, "requires": { "sparkles": "^1.0.0" } }, - "got": { - "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } - }, "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "^1.1.0" - } - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "gulp": { - "version": "3.9.1", - "resolved": "http://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", - "dev": true, - "requires": { - "archy": "^1.0.0", - "chalk": "^1.0.0", - "deprecated": "^0.0.1", - "gulp-util": "^3.0.0", - "interpret": "^1.0.0", - "liftoff": "^2.1.0", - "minimist": "^1.1.0", - "orchestrator": "^0.3.0", - "pretty-hrtime": "^1.0.0", - "semver": "^4.1.0", - "tildify": "^1.0.0", - "v8flags": "^2.0.2", - "vinyl-fs": "^0.3.0" - } - }, - "gulp-file": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/gulp-file/-/gulp-file-0.3.0.tgz", - "integrity": "sha1-6MTXY/Em+zMy/EFuPR70btZ9jQ0=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", "dev": true, "requires": { - "gulp-util": "^2.2.14", - "through2": "^0.4.1" + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" }, "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "chalk": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true, - "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "gulp-util": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", - "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", - "dev": true, - "requires": { - "chalk": "^0.5.0", - "dateformat": "^1.0.7-1.2.3", - "lodash._reinterpolate": "^2.4.1", - "lodash.template": "^2.4.1", - "minimist": "^0.2.0", - "multipipe": "^0.1.0", - "through2": "^0.5.0", - "vinyl": "^0.2.1" - }, - "dependencies": { - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~3.0.0" - } - } - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", "dev": true, "requires": { - "ansi-regex": "^0.2.0" + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" } - }, - "lodash._reinterpolate": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", + } + } + }, + "gulp-file": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/gulp-file/-/gulp-file-0.4.0.tgz", + "integrity": "sha1-RRNWoqxQicbbkaBEQlKgVDZXAGs=", + "dev": true, + "requires": { + "through2": "^0.4.1", + "vinyl": "^2.1.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "lodash.escape": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", - "dev": true, - "requires": { - "lodash._escapehtmlchar": "~2.4.1", - "lodash._reunescapedhtml": "~2.4.1", - "lodash.keys": "~2.4.1" - } - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - }, - "lodash.template": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", - "dev": true, - "requires": { - "lodash._escapestringchar": "~2.4.1", - "lodash._reinterpolate": "~2.4.1", - "lodash.defaults": "~2.4.1", - "lodash.escape": "~2.4.1", - "lodash.keys": "~2.4.1", - "lodash.templatesettings": "~2.4.1", - "lodash.values": "~2.4.1" - } - }, - "lodash.templatesettings": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", - "dev": true, - "requires": { - "lodash._reinterpolate": "~2.4.1", - "lodash.escape": "~2.4.1" - } - }, - "minimist": { - "version": "0.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", - "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", "dev": true }, "readable-stream": { "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { @@ -1936,19 +1992,10 @@ "string_decoder": "~0.10.x" } }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.1" - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, "through2": { @@ -1959,33 +2006,16 @@ "requires": { "readable-stream": "~1.0.17", "xtend": "~2.1.1" - }, - "dependencies": { - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } } }, - "vinyl": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", "dev": true, "requires": { - "clone-stats": "~0.0.1" + "object-keys": "~0.4.0" } - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true } } }, @@ -2001,190 +2031,172 @@ "plugin-error": "^0.1.2", "through2": "^2.0.0", "vinyl-sourcemaps-apply": "^0.2.1" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "gulp-mocha": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-3.0.1.tgz", - "integrity": "sha1-qwyiw5QDcYF03drXUOY6Yb4X4EE=", - "dev": true, - "requires": { - "gulp-util": "^3.0.0", - "mocha": "^3.0.0", - "plur": "^2.1.0", - "req-cwd": "^1.0.1", - "temp": "^0.8.3", - "through": "^2.3.4" - } - }, - "gulp-rename": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", - "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", - "dev": true - }, - "gulp-replace": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.5.4.tgz", - "integrity": "sha1-aaZ5FLvRPFYr/xT1BKQDeWqg2qk=", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-7.0.2.tgz", + "integrity": "sha512-ZXBGN60TXYnFhttr19mfZBOtlHYGx9SvCSc+Kr/m2cMIGloUe176HBPwvPqlakPuQgeTGVRS47NmcdZUereKMQ==", "dev": true, "requires": { - "istextorbinary": "1.0.2", - "readable-stream": "^2.0.1", - "replacestream": "^4.0.0" + "dargs": "^7.0.0", + "execa": "^2.0.4", + "mocha": "^6.2.0", + "plugin-error": "^1.0.1", + "supports-color": "^7.0.0", + "through2": "^3.0.1" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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 + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "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": { - "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" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.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==", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "ms": "^2.1.1" } - } - } - }, - "gulp-shell": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.5.2.tgz", - "integrity": "sha1-pJWcoGUa0ce7/nCy0K27tOGuqY0=", - "dev": true, - "requires": { - "async": "^1.5.0", - "gulp-util": "^3.0.7", - "lodash": "^4.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "gulp-sourcemaps": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz", - "integrity": "sha1-tDfR89mAzyboEYSCNxjOFa5ll7Y=", - "dev": true, - "requires": { - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "4.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "0.0.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom": "2.X", - "through2": "2.X", - "vinyl": "1.X" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + }, + "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 }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "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": { - "is-utf8": "^0.2.0" + "locate-path": "^3.0.0" } }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "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 + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "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" } - } - } - }, - "gulp-tslint": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-8.1.3.tgz", - "integrity": "sha512-KEP350N5B9Jg6o6jnyCyKVBPemJePYpMsGfIQq0G0ErvY7tw4Lrfb/y3L4WRf7ek0OsaE8nnj86w+lcLXW8ovw==", - "dev": true, - "requires": { - "@types/fancy-log": "1.3.0", - "chalk": "2.3.1", - "fancy-log": "1.3.2", - "map-stream": "~0.0.7", - "plugin-error": "1.0.1", - "through": "~2.3.8" - }, - "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==", + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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 + }, + "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": { - "color-convert": "^1.9.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "chalk": { - "version": "2.3.1", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.2.0" + "minimist": "^1.2.5" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "mocha": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", + "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.4", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "plugin-error": { @@ -2197,262 +2209,272 @@ "arr-diff": "^4.0.0", "arr-union": "^3.1.0", "extend-shallow": "^3.0.2" + }, + "dependencies": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.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" - } - } - } - }, - "gulp-typescript": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-3.2.4.tgz", - "integrity": "sha512-bZosNvbUGzFA4bjjWoUPyjU5vfgJSzlYKkU0Jutbsrj+td8yvtqxethhqfzB9MwyamaUODIuidj5gIytZ523Bw==", - "dev": true, - "requires": { - "gulp-util": "~3.0.7", - "source-map": "~0.5.3", - "through2": "~2.0.1", - "vinyl-fs": "~2.4.3" - }, - "dependencies": { - "arr-diff": { + "require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "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": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "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": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ansi-regex": "^4.1.0" } }, - "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "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": { - "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", - "unique-stream": "^2.0.2" + "has-flag": "^4.0.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "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 - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } } } }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", "dev": true, "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" + "inherits": "^2.0.4", + "readable-stream": "2 || 3" } }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "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 }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "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": { - "is-extglob": "^1.0.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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 }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + } + } + }, + "gulp-rename": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", + "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", + "dev": true + }, + "gulp-replace": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.5.4.tgz", + "integrity": "sha1-aaZ5FLvRPFYr/xT1BKQDeWqg2qk=", + "dev": true, + "requires": { + "istextorbinary": "1.0.2", + "readable-stream": "^2.0.1", + "replacestream": "^4.0.0" + } + }, + "gulp-shell": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.8.0.tgz", + "integrity": "sha512-wHNCgmqbWkk1c6Gc2dOL5SprcoeujQdeepICwfQRo91DIylTE7a794VEE+leq3cE2YDoiS5ulvRfKVIEMazcTQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "fancy-log": "^1.3.3", + "lodash.template": "^4.5.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "tslib": "^1.10.0" + }, + "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": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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": { - "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" + "color-name": "~1.1.4" } }, - "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==", + "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 + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "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": { - "is-utf8": "^0.2.0" + "has-flag": "^4.0.0" } }, - "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", "dev": true, "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" + "inherits": "^2.0.4", + "readable-stream": "2 || 3" } + } + } + }, + "gulp-sourcemaps": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz", + "integrity": "sha1-tDfR89mAzyboEYSCNxjOFa5ll7Y=", + "dev": true, + "requires": { + "@gulp-sourcemaps/map-sources": "1.X", + "acorn": "4.X", + "convert-source-map": "1.X", + "css": "2.X", + "debug-fabulous": "0.0.X", + "detect-newline": "2.X", + "graceful-fs": "4.X", + "source-map": "~0.6.0", + "strip-bom": "2.X", + "through2": "2.X", + "vinyl": "1.X" + }, + "dependencies": { + "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 + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "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 }, "vinyl": { "version": "1.2.0", @@ -2464,30 +2486,94 @@ "clone-stats": "^0.0.1", "replace-ext": "0.0.1" } + } + } + }, + "gulp-tslint": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-8.1.4.tgz", + "integrity": "sha512-wBoZIEMJRz9urHwolsvQpngA9l931p6g/Liwz1b/KrsVP6jEBFZv/o0NS1TFCQZi/l8mXxz8+v3twhf4HOXxPQ==", + "dev": true, + "requires": { + "@types/fancy-log": "1.3.0", + "ansi-colors": "^1.0.1", + "fancy-log": "1.3.3", + "map-stream": "~0.0.7", + "plugin-error": "1.0.1", + "through": "~2.3.8" + }, + "dependencies": { + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + } + } + }, + "gulp-typescript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", + "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.5", + "plugin-error": "^1.0.1", + "source-map": "^0.7.3", + "through2": "^3.0.0", + "vinyl": "^2.1.0", + "vinyl-fs": "^3.0.3" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true }, - "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", - "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", - "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "dependencies": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + } + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" } } } @@ -2508,12 +2594,23 @@ "vinyl-sourcemaps-apply": "^0.2.0" }, "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -2524,52 +2621,38 @@ "uglify-to-browserify": "~1.0.0", "yargs": "~3.10.0" } - } - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } } } }, "gulpclass": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/gulpclass/-/gulpclass-0.1.2.tgz", - "integrity": "sha1-0m9cOdw5nhHEWpCHh8hkkLwx6FA=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/gulpclass/-/gulpclass-0.2.0.tgz", + "integrity": "sha512-S2p0SgnVLjBbIEw5tHbBV6Wm6abD+leA5xZG6ukf9M+j1I/8zIeKPby9GLWnI90671YRk+lXbvEUROKaZXo8NA==", "dev": true, "requires": { - "gulp": "^3.9.0", - "merge2": "^0.3.6", - "run-sequence": "^1.1.5" + "@types/gulp": "^4.0.5", + "@types/merge2": "^1.1.4", + "@types/node": "*", + "gulp": "^4.0.0", + "merge2": "^1.2.2" } }, "gulplog": { @@ -2582,32 +2665,18 @@ } }, "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "dev": true, "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", + "minimist": "^1.2.5", + "neo-async": "^2.6.0", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" }, "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2616,6 +2685,15 @@ } } }, + "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", @@ -2640,6 +2718,12 @@ "sparkles": "^1.0.0" } }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2673,47 +2757,26 @@ } }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "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.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "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" - } - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2725,9 +2788,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "ini": { @@ -2737,15 +2800,15 @@ "dev": true }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, - "irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, "is-absolute": { @@ -2778,35 +2841,38 @@ } } }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, "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-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, "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-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true }, "is-data-descriptor": { "version": "0.1.4", @@ -2828,6 +2894,12 @@ } } }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -2847,21 +2919,6 @@ } } }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -2874,44 +2931,40 @@ "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=", + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "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=", + "is-generator-function": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", + "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==", "dev": true }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "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.0" + "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true }, - "is-npm": { + "is-negated-glob": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, "is-number": { @@ -2934,12 +2987,6 @@ } } }, - "is-obj": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -2973,23 +3020,14 @@ "isobject": "^3.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } }, "is-relative": { "version": "1.0.0", @@ -3000,18 +3038,45 @@ "is-unc-path": "^1.0.0" } }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", "dev": true }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", "dev": true }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typed-array": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", + "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.0", + "es-abstract": "^1.17.4", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -3028,9 +3093,9 @@ "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=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", "dev": true }, "is-windows": { @@ -3040,9 +3105,9 @@ "dev": true }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { @@ -3097,15 +3162,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } } } }, @@ -3117,14 +3173,6 @@ "requires": { "istanbul": "~0.4.5", "lodash": "~4.17.2" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "istextorbinary": { @@ -3137,16 +3185,32 @@ "textextensions": "~1.0.0" } }, + "iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", + "dev": true + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, "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.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3161,40 +3225,32 @@ } } }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "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 }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", "dev": true, "requires": { - "package-json": "^4.0.0" + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" } }, "lazy-cache": { @@ -3216,385 +3272,126 @@ "dev": true, "requires": { "readable-stream": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.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" - } - }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "http://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" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "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" - } - } - } - }, - "lodash": { - "version": "1.0.2", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._escapehtmlchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", - "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", - "dev": true, - "requires": { - "lodash._htmlescapes": "~2.4.1" - } - }, - "lodash._escapestringchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", - "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._htmlescapes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._isnative": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", - "dev": true - }, - "lodash._objecttypes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "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._reunescapedhtml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", - "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", - "dev": true, - "requires": { - "lodash._htmlescapes": "~2.4.1", - "lodash.keys": "~2.4.1" - }, - "dependencies": { - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - } } }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash._shimkeys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "lodash._objecttypes": "~2.4.1" + "invert-kv": "^1.0.0" } }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "dev": true, "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._basecreate": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" + "flush-write-stream": "^1.0.2" } }, - "lodash.defaults": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "lodash._objecttypes": "~2.4.1", - "lodash.keys": "~2.4.1" - }, - "dependencies": { - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - } + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", "dev": true, "requires": { - "lodash._root": "^3.0.0" + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" } }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "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": { - "lodash._objecttypes": "~2.4.1" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "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": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "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 + } } }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "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.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "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._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" + "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "lodash.values": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", - "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "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.keys": "~2.4.1" - }, - "dependencies": { - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - } + "lodash._reinterpolate": "^3.0.0" } }, "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "chalk": "^1.0.0" + "chalk": "^2.0.1" } }, "lolex": { "version": "1.3.2", - "resolved": "http://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", "dev": true }, @@ -3604,49 +3401,10 @@ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", "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" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "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 - } - } - }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "make-error-cause": { @@ -3673,12 +3431,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, "map-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", @@ -3694,75 +3446,51 @@ "object-visit": "^1.0.0" } }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "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" - } - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", "dev": true, "requires": { - "readable-stream": "^2.0.1" + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "dev": true, "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" + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" } }, - "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==", + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "is-extglob": "^2.1.0" } } } }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { - "version": "0.3.7", - "resolved": "http://registry.npmjs.org/merge2/-/merge2-0.3.7.tgz", - "integrity": "sha1-GOAKAGcQkN4RZQJfyGvT53wgf2M=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, "micromatch": { @@ -3786,6 +3514,12 @@ "to-regex": "^3.0.2" } }, + "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", @@ -3796,15 +3530,15 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -3817,95 +3551,428 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz", + "integrity": "sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.3.1", + "debug": "3.2.6", + "diff": "4.0.2", + "escape-string-regexp": "1.0.5", + "find-up": "4.1.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "object.assign": "4.1.0", + "promise.allsettled": "1.0.2", + "serialize-javascript": "3.0.0", + "strip-json-comments": "3.0.1", + "supports-color": "7.1.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.0", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "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 + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + } + }, + "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" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "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 + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "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" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": 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 + }, + "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" + } + }, + "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 + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.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-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "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" + } + }, + "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" + } + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "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 + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "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" + } + }, + "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 + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + }, + "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 + }, + "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" } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + }, + "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" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true - } - } - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + }, + "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": { - "graceful-readlink": ">= 1.0.0" + "has-flag": "^4.0.0" } }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "ms": "2.0.0" + "is-number": "^7.0.0" } }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "isexe": "^2.0.0" } }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "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 + }, + "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" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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.2" + }, + "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-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" + } + }, + "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 + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "moment": { - "version": "2.14.1", - "resolved": "http://registry.npmjs.org/moment/-/moment-2.14.1.tgz", - "integrity": "sha1-s1snxH5X7S3ccAU9awe+zbKRdBw=", + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==", "dev": true }, "ms": { @@ -3914,14 +3981,18 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", "dev": true, - "requires": { - "duplexer2": "0.0.2" - } + "optional": true }, "nanomatch": { "version": "1.2.13", @@ -3942,12 +4013,28 @@ "to-regex": "^3.0.1" } }, - "natives": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", - "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -3958,13 +4045,13 @@ } }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "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", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } @@ -3978,13 +4065,22 @@ "remove-trailing-separator": "^1.0.1" } }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" } }, "number-is-nan": { @@ -4030,10 +4126,16 @@ } } }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object-visit": { @@ -4045,6 +4147,18 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -4057,6 +4171,16 @@ "isobject": "^3.0.0" } }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", @@ -4067,27 +4191,6 @@ "make-iterator": "^1.0.0" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -4097,6 +4200,16 @@ "isobject": "^3.0.1" } }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4106,6 +4219,15 @@ "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", @@ -4118,7 +4240,7 @@ "dependencies": { "minimist": { "version": "0.0.10", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true }, @@ -4131,74 +4253,67 @@ } }, "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" } }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "dev": true, "requires": { - "end-of-stream": "~0.1.5", - "sequencify": "~0.0.7", - "stream-consume": "~0.1.0" + "readable-stream": "^2.0.1" } }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, - "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 + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } }, "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", "dev": true }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } + "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 + }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -4210,35 +4325,6 @@ "path-root": "^0.1.1" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "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" - } - } - } - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -4248,6 +4334,12 @@ "error-ex": "^1.2.0" } }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", @@ -4288,9 +4380,9 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -4323,14 +4415,6 @@ "graceful-fs": "^4.1.2", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } } }, "pathval": { @@ -4339,6 +4423,12 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -4406,21 +4496,12 @@ }, "kind-of": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", "dev": true } } }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "requires": { - "irregular-plurals": "^1.0.0" - } - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -4433,65 +4514,50 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "pretty-hrtime": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "pseudomap": { + "promise.allsettled": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", + "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "dev": true, + "requires": { + "array.prototype.map": "^1.0.1", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "iterate-value": "^1.0.0" + } }, - "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, "read-pkg": { @@ -4516,15 +4582,29 @@ } }, "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "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" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" } }, "rechoir": { @@ -4536,31 +4616,12 @@ "resolve": "^1.1.6" } }, - "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" - } - }, "reflect-metadata": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", - "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", "dev": true }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -4571,124 +4632,70 @@ "safe-regex": "^1.1.0" } }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, "remap-istanbul": { - "version": "0.7.0", - "resolved": "http://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.7.0.tgz", - "integrity": "sha1-w2Da2upkHbpzTLaljKvp69iKKFg=", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.13.0.tgz", + "integrity": "sha512-rS5ZpVAx3fGtKZkiBe1esXg5mKYbgW9iz8kkADFt3p6lo3NsBBUX1q6SwdhwUtYCGnr7nK6gRlbYK3i8R0jbRA==", "dev": true, - "requires": { - "amdefine": "1.0.0", - "gulp-util": "3.0.7", - "istanbul": "0.4.5", - "source-map": ">=0.5.6", - "through2": "2.0.1" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", + "requires": { + "istanbul": "0.4.5", + "minimatch": "^3.0.4", + "plugin-error": "^1.0.1", + "source-map": "0.6.1", + "through2": "3.0.0" + }, + "dependencies": { + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^1.0.11", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "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 }, - "readable-stream": { - "version": "2.0.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, "through2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", - "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.0.tgz", + "integrity": "sha512-8B+sevlqP4OiCjonI1Zw03Sf8PuV1eRsYQgLad5eonILOdyeRsY27A/2Ze8IlvlMvq31OH+3fz/styI7Ya62yQ==", "dev": true, "requires": { - "readable-stream": "~2.0.0", - "xtend": "~4.0.0" + "readable-stream": "2 || 3", + "xtend": "~4.0.1" } } } }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -4707,21 +4714,23 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", "dev": true, "requires": { - "is-finite": "^1.0.0" + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.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 - }, "replacestream": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", @@ -4731,65 +4740,27 @@ "escape-string-regexp": "^1.0.3", "object-assign": "^4.0.1", "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, - "req-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-1.0.1.tgz", - "integrity": "sha1-DXOurpJm5penj3l2AZZ352rPD/8=", - "dev": true, - "requires": { - "req-from": "^1.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 }, - "req-from": { + "require-main-filename": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-1.0.1.tgz", - "integrity": "sha1-v4HaUUeUfTLRO5R9wSpYrUWHNQ4=", - "dev": true, - "requires": { - "resolve-from": "^2.0.0" - } + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "resolve-dir": { @@ -4802,11 +4773,14 @@ "global-modules": "^1.0.0" } }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } }, "resolve-url": { "version": "0.2.1", @@ -4830,22 +4804,12 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "run-sequence": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.2.2.tgz", - "integrity": "sha1-UJWgvr6YczsBQL0I3YDsAw3azes=", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "chalk": "*", - "gulp-util": "*" + "glob": "^7.1.3" } }, "safe-buffer": { @@ -4870,38 +4834,36 @@ "dev": true }, "semver": { - "version": "4.3.6", - "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", "dev": true, "requires": { - "semver": "^5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } + "sver-compat": "^1.5.0" } }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "serialize-javascript": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", + "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==", "dev": true }, - "set-value": { + "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -4922,35 +4884,29 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.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 - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "sinon": { "version": "1.17.7", - "resolved": "http://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", "dev": true, "requires": { @@ -5080,12 +5036,12 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -5105,9 +5061,9 @@ "dev": true }, "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -5115,15 +5071,15 @@ } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -5131,9 +5087,9 @@ } }, "spdx-license-ids": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", - "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", + "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-string": { @@ -5151,6 +5107,12 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -5172,54 +5134,61 @@ } } }, - "stream-consume": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", - "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", "dev": true }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -5227,51 +5196,20 @@ } }, "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "first-chunk-stream": "^1.0.0", "is-utf8": "^0.2.0" } }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "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-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, - "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" - } - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -5279,36 +5217,22 @@ "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 - }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } + "has-flag": "^1.0.0" } }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", "dev": true, "requires": { - "execa": "^0.7.0" + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "text-table": { @@ -5325,101 +5249,44 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "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.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, "requires": { "through2": "~2.0.0", "xtend": "~4.0.0" } }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - } - }, "time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", "dev": true }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", "dev": true, "requires": { - "extend-shallow": "^2.0.1" - }, - "dependencies": { - "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" - } - } + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" } }, "to-object-path": { @@ -5464,52 +5331,47 @@ "repeat-string": "^1.6.1" } }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, "tslint": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-4.5.1.tgz", - "integrity": "sha1-BTVocb7yOkNJBnNABvwYgza6gks=", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, "requires": { - "babel-code-frame": "^6.20.0", - "colors": "^1.1.2", - "diff": "^3.0.1", - "findup-sync": "~0.3.0", + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", "glob": "^7.1.1", - "optimist": "~0.6.0", - "resolve": "^1.1.7", - "tsutils": "^1.1.0", - "update-notifier": "^2.0.0" - }, - "dependencies": { - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "~5.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true } } }, @@ -5526,6 +5388,25 @@ "tslint": "^2.5.0" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "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" + } + }, "findup-sync": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.2.1.tgz", @@ -5549,10 +5430,19 @@ }, "lodash": { "version": "3.10.1", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", "dev": true }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, "minimatch": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", @@ -5562,6 +5452,12 @@ "brace-expansion": "^1.0.0" } }, + "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 + }, "tslint": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-2.5.1.tgz", @@ -5576,9 +5472,18 @@ } }, "tsutils": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", - "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, "type-check": { @@ -5596,6 +5501,12 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "typescript": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", @@ -5603,24 +5514,11 @@ "dev": true }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz", + "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==", "dev": true, - "optional": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "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, - "optional": true - } - } + "optional": true }, "uglify-save-license": { "version": "0.4.1", @@ -5643,58 +5541,53 @@ }, "underscore.string": { "version": "3.1.1", - "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.1.1.tgz", "integrity": "sha1-DN1rytDARv12Y9MF2KeFtdoQ8zU=", "dev": true }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true + }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "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" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", - "dev": true - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, "requires": { - "crypto-random-string": "^1.0.0" + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" } }, "unset-value": { @@ -5734,110 +5627,39 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true } } }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.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.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.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 - }, - "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" - } - } - } - }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, "util": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.0.tgz", - "integrity": "sha512-5n12uMzKCjvB2HPFHnbQSjaqAa98L5iIXmHrZCLavuZVe0qe/SJGbDGWlpaHk5lnBkWRDO+dRu1/PgmUYKPPTw==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", + "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" } }, "util-deprecate": { @@ -5847,20 +5669,14 @@ "dev": true }, "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "dev": true, "requires": { - "user-home": "^1.1.1" + "homedir-polyfill": "^1.0.1" } }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "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", @@ -5871,71 +5687,64 @@ "spdx-expression-parse": "^3.0.0" } }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } }, "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "dev": true, - "requires": { - "defaults": "^1.0.0", - "glob-stream": "^3.1.5", - "glob-watcher": "^0.0.6", - "graceful-fs": "^3.0.0", - "mkdirp": "^0.5.0", - "strip-bom": "^1.0.0", - "through2": "^0.6.1", - "vinyl": "^0.4.0" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" } }, "vinyl-sourcemaps-apply": { @@ -5956,13 +5765,33 @@ "isexe": "^2.0.0" } }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "which-typed-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", + "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", "dev": true, "requires": { - "string-width": "^2.1.1" + "available-typed-arrays": "^1.0.2", + "es-abstract": "^1.17.5", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" } }, "window-size": { @@ -5971,72 +5800,214 @@ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "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 + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "workerpool": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", + "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", "dev": true }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, "yargs": { - "version": "3.10.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", + "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + } + }, + "yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", "dev": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.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 + }, "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } } diff --git a/package.json b/package.json index bb6057da0..6d89d0726 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "class-transformer", - "version": "0.2.3", + "version": "0.3.0", "description": "Proper decorator-based transformation / serialization / deserialization of plain javascript objects to class constructors", "license": "MIT", "readmeFilename": "README.md", @@ -9,12 +9,18 @@ "name": "Umed Khudoiberdiev", "email": "pleerock.me@gmail.com" }, + "contributors": [ + { + "name": "jotamorais", + "url": "https://github.com/jotamorais" + } + ], "repository": { "type": "git", - "url": "https://github.com/pleerock/class-transformer.git" + "url": "https://github.com/typestack/class-transformer.git" }, "bugs": { - "url": "https://github.com/pleerock/class-transformer/issues" + "url": "https://github.com/typestack/class-transformer/issues" }, "tags": [ "serialization", @@ -26,35 +32,35 @@ ], "dependencies": {}, "devDependencies": { - "@types/moment": "^2.13.0", "@types/chai": "^3.4.34", "@types/es6-shim": "^0.31.32", "@types/mocha": "^2.2.33", + "@types/moment": "^2.13.0", "@types/node": "0.0.2", "@types/sinon": "^2.2.2", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", "del": "^2.2.1", "es6-shim": "^0.35.1", - "gulp": "^3.9.1", - "gulp-file": "^0.3.0", + "gulp": "^4.0.2", + "gulp-file": "^0.4.0", "gulp-istanbul": "^1.0.0", - "gulp-mocha": "^3.0.1", + "gulp-mocha": "^7.0.2", "gulp-rename": "^1.2.2", "gulp-replace": "^0.5.4", - "gulp-shell": "^0.5.1", + "gulp-shell": "^0.8.0", "gulp-sourcemaps": "^1.6.0", "gulp-tslint": "^8.1.3", - "gulp-typescript": "^3.1.3", + "gulp-typescript": "^5.0.1", "gulp-uglify": "^2.0.0", - "gulpclass": "^0.1.1", - "mocha": "^3.2.0", - "moment": "2.14.1", + "gulpclass": "^0.2.0", + "mocha": "^8.0.1", + "moment": "^2.27.0", "reflect-metadata": "^0.1.3", - "remap-istanbul": "^0.7.0", + "remap-istanbul": "^0.13.0", "sinon": "^1.17.4", "sinon-chai": "^2.8.0", - "tslint": "^4.0.2", + "tslint": "^5.20.1", "tslint-stylish": "^2.1.0-beta", "typescript": "^2.0.10" }, From 41a472dfb2912732c8b3267c6ba70f95fcbc009c Mon Sep 17 00:00:00 2001 From: jotamorais Date: Mon, 29 Jun 2020 18:00:19 -0500 Subject: [PATCH 06/30] Update devDependencies and contributors --- package-lock.json | 2958 +++++++++++++++++++++++---------------------- package.json | 7 +- 2 files changed, 1498 insertions(+), 1467 deletions(-) diff --git a/package-lock.json b/package-lock.json index 03cc2989a..aa65bcc30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,28 +5,28 @@ "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==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.3" } }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.3.tgz", + "integrity": "sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helpers": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/traverse": "^7.10.3", + "@babel/types": "^7.10.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -52,12 +52,12 @@ } }, "@babel/generator": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", - "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", "dev": true, "requires": { - "@babel/types": "^7.9.0", + "@babel/types": "^7.10.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -72,129 +72,128 @@ } }, "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz", + "integrity": "sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.3" } }, "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz", + "integrity": "sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.3" } }, "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.0", + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz", + "integrity": "sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.3" } }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==", "dev": true }, "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", "dev": true, "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.10.1" } }, "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", "dev": true }, "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", + "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", "dev": true, "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "dev": true, - "optional": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -252,11 +251,20 @@ } }, "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==", "dev": true }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", @@ -266,6 +274,60 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", + "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.1.tgz", + "integrity": "sha512-ypC4jwfIVF72og0dgvEcFRdOM2V9Qm1tu7RGmdZOlhsccyK0wisXmMObGuWEOd5jQ+K9wcIgSNftCpk2vkjUfQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz", + "integrity": "sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", + "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", @@ -275,41 +337,67 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } } }, "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -331,15 +419,58 @@ } }, "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", + "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" + }, + "dependencies": { + "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" + } + }, + "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-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" + } + }, + "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 + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "@istanbuljs/schema": { @@ -349,160 +480,185 @@ "dev": true }, "@jest/console": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.2.6.tgz", - "integrity": "sha512-bGp+0PicZVCEhb+ifnW9wpKWONNdkhtJsRE7ap729hiAfTvCN6VhGx0s/l/V/skA2pnyqq+N/7xl9ZWfykDpsg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", "dev": true, "requires": { - "@jest/source-map": "^25.2.6", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", - "jest-util": "^25.2.6", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", "slash": "^3.0.0" } }, "@jest/core": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.2.7.tgz", - "integrity": "sha512-Nd6ELJyR+j0zlwhzkfzY70m04hAur0VnMwJXVe4VmmD/SaQ6DEyal++ERQ1sgyKIKKEqRuui6k/R0wHLez4P+g==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.5.4.tgz", + "integrity": "sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==", "dev": true, "requires": { - "@jest/console": "^25.2.6", - "@jest/reporters": "^25.2.6", - "@jest/test-result": "^25.2.6", - "@jest/transform": "^25.2.6", - "@jest/types": "^25.2.6", + "@jest/console": "^25.5.0", + "@jest/reporters": "^25.5.1", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.2.6", - "jest-config": "^25.2.7", - "jest-haste-map": "^25.2.6", - "jest-message-util": "^25.2.6", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^25.5.0", + "jest-config": "^25.5.4", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.2.6", - "jest-resolve-dependencies": "^25.2.7", - "jest-runner": "^25.2.7", - "jest-runtime": "^25.2.7", - "jest-snapshot": "^25.2.7", - "jest-util": "^25.2.6", - "jest-validate": "^25.2.6", - "jest-watcher": "^25.2.7", + "jest-resolve": "^25.5.1", + "jest-resolve-dependencies": "^25.5.4", + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "jest-watcher": "^25.5.0", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "realpath-native": "^2.0.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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" + } + } } }, "@jest/environment": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.2.6.tgz", - "integrity": "sha512-17WIw+wCb9drRNFw1hi8CHah38dXVdOk7ga9exThhGtXlZ9mK8xH4DjSB9uGDGXIWYSHmrxoyS6KJ7ywGr7bzg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.5.0.tgz", + "integrity": "sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==", "dev": true, "requires": { - "@jest/fake-timers": "^25.2.6", - "@jest/types": "^25.2.6", - "jest-mock": "^25.2.6" + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0" } }, "@jest/fake-timers": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.2.6.tgz", - "integrity": "sha512-A6qtDIA2zg/hVgUJJYzQSHFBIp25vHdSxW/s4XmTJAYxER6eL0NQdQhe4+232uUSviKitubHGXXirt5M7blPiA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", + "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", "dev": true, "requires": { - "@jest/types": "^25.2.6", - "jest-message-util": "^25.2.6", - "jest-mock": "^25.2.6", - "jest-util": "^25.2.6", + "@jest/types": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "lolex": "^5.0.0" } }, + "@jest/globals": { + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-25.5.2.tgz", + "integrity": "sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==", + "dev": true, + "requires": { + "@jest/environment": "^25.5.0", + "@jest/types": "^25.5.0", + "expect": "^25.5.0" + } + }, "@jest/reporters": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.2.6.tgz", - "integrity": "sha512-DRMyjaxcd6ZKctiXNcuVObnPwB1eUs7xrUVu0J2V0p5/aZJei5UM9GL3s/bmN4hRV8Mt3zXh+/9X2o0Q4ClZIA==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.5.1.tgz", + "integrity": "sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.2.6", - "@jest/test-result": "^25.2.6", - "@jest/transform": "^25.2.6", - "@jest/types": "^25.2.6", + "@jest/console": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", + "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^4.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "jest-haste-map": "^25.2.6", - "jest-resolve": "^25.2.6", - "jest-util": "^25.2.6", - "jest-worker": "^25.2.6", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^25.5.1", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "node-notifier": "^6.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^3.1.0", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.0.1" + "v8-to-istanbul": "^4.1.3" } }, "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.5.0.tgz", + "integrity": "sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==", "dev": true, "requires": { "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", + "graceful-fs": "^4.2.4", "source-map": "^0.6.0" } }, "@jest/test-result": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.2.6.tgz", - "integrity": "sha512-gmGgcF4qz/pkBzyfJuVHo2DA24kIgVQ5Pf/VpW4QbyMLSegi8z+9foSZABfIt5se6k0fFj/3p/vrQXdaOgit0w==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", "dev": true, "requires": { - "@jest/console": "^25.2.6", - "@jest/types": "^25.2.6", + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.2.7.tgz", - "integrity": "sha512-s2uYGOXONDSTJQcZJ9A3Zkg3hwe53RlX1HjUNqjUy3HIqwgwCKJbnAKYsORPbhxXi3ARMKA7JNBi9arsTxXoYw==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz", + "integrity": "sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==", "dev": true, "requires": { - "@jest/test-result": "^25.2.6", - "jest-haste-map": "^25.2.6", - "jest-runner": "^25.2.7", - "jest-runtime": "^25.2.7" + "@jest/test-result": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4" } }, "@jest/transform": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.2.6.tgz", - "integrity": "sha512-rZnjCjZf9avPOf9q/w9RUZ9Uc29JmB53uIXNJmNz04QbDMD5cR/VjfikiMKajBsXe2vnFl5sJ4RTt+9HPicauQ==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", + "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "babel-plugin-istanbul": "^6.0.0", "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.2.6", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", "jest-regex-util": "^25.2.6", - "jest-util": "^25.2.6", + "jest-util": "^25.5.0", "micromatch": "^4.0.2", "pirates": "^4.0.1", "realpath-native": "^2.0.0", @@ -512,9 +668,9 @@ } }, "@jest/types": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.6.tgz", - "integrity": "sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -524,18 +680,18 @@ } }, "@sinonjs/commons": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", - "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", + "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@types/babel__core": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", - "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", + "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -565,9 +721,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", - "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.12.tgz", + "integrity": "sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -585,10 +741,19 @@ "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", "dev": true }, + "@types/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, "@types/istanbul-lib-report": { @@ -601,9 +766,9 @@ } }, "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*", @@ -621,9 +786,9 @@ } }, "@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==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", "dev": true }, "@types/node": { @@ -632,6 +797,12 @@ "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", "dev": true }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, "@types/prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", @@ -645,9 +816,9 @@ "dev": true }, "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -717,9 +888,9 @@ "dev": true }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", "dev": true }, "acorn-globals": { @@ -753,9 +924,9 @@ "dev": true }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "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", @@ -771,6 +942,14 @@ "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": { @@ -890,23 +1069,24 @@ "dev": true }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", "dev": true }, "babel-jest": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.2.6.tgz", - "integrity": "sha512-MDJOAlwtIeIQiGshyX0d2PxTbV73xZMpNji40ivVTPQOm59OdRR9nYCkffqI7ugtsK4JR98HgNKbDbuVf4k5QQ==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", + "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==", "dev": true, "requires": { - "@jest/transform": "^25.2.6", - "@jest/types": "^25.2.6", - "@types/babel__core": "^7.1.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", + "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.2.6", + "babel-preset-jest": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "slash": "^3.0.0" } }, @@ -924,23 +1104,43 @@ } }, "babel-plugin-jest-hoist": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz", - "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz", + "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==", "dev": true, "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", "@types/babel__traverse": "^7.0.6" } }, + "babel-preset-current-node-syntax": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", + "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, "babel-preset-jest": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.2.6.tgz", - "integrity": "sha512-Xh2eEAwaLY9+SyMt/xmGZDnXTW/7pSaBPG0EMo7EuhvosFKVWYB6CqwYD31DaEQuoTL090oDZ0FEqygffGRaSQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz", + "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==", "dev": true, "requires": { - "@babel/plugin-syntax-bigint": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^25.2.6" + "babel-plugin-jest-hoist": "^25.5.0", + "babel-preset-current-node-syntax": "^0.1.2" } }, "balanced-match": { @@ -1128,7 +1328,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "optional": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1179,20 +1378,20 @@ } }, "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": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "co": { @@ -1280,220 +1479,54 @@ "noms": "0.0.0", "through2": "^2.0.1", "yargs": "^13.2.4" + } + }, + "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=", + "dev": true + }, + "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" }, "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" - } - }, - "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" - } - }, - "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 - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "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" - } - }, - "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 - }, - "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" - } - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "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" - } - }, - "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 - }, - "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" - } - }, - "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" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "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.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.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=", - "dev": true - }, - "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" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "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" - } - } - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true } } @@ -1651,9 +1684,9 @@ } }, "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==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "end-of-stream": { @@ -1665,6 +1698,15 @@ "once": "^1.4.0" } }, + "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", @@ -1672,9 +1714,9 @@ "dev": true }, "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, "requires": { "esprima": "^4.0.1", @@ -1729,20 +1771,13 @@ "v8-compile-cache": "^2.0.3" }, "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": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "color-convert": "^1.9.0" } }, "chalk": { @@ -1780,45 +1815,18 @@ "eslint-visitor-keys": "^1.1.0" } }, - "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" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "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 }, - "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" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1827,12 +1835,6 @@ "requires": { "has-flag": "^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 } } }, @@ -1846,9 +1848,9 @@ } }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1856,18 +1858,18 @@ } }, "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, "espree": { @@ -1888,18 +1890,18 @@ "dev": true }, "esquery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", - "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==", + "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.0.0" + "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", - "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", "dev": true } } @@ -2003,16 +2005,16 @@ } }, "expect": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.2.7.tgz", - "integrity": "sha512-yA+U2Ph0MkMsJ9N8q5hs9WgWI6oJYfecdXta6LkP/alY/jZZL1MHlJ2wbLh60Ucqf3G+51ytbqV3mlGfmxkpNw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz", + "integrity": "sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "ansi-styles": "^4.0.0", "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.2.7", - "jest-message-util": "^25.2.6", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", "jest-regex-util": "^25.2.6" } }, @@ -2096,51 +2098,6 @@ "requires": { "kind-of": "^6.0.0" } - } - } - }, - "gulp-sourcemaps": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz", - "integrity": "sha1-tDfR89mAzyboEYSCNxjOFa5ll7Y=", - "dev": true, - "requires": { - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "4.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "0.0.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom": "2.X", - "through2": "2.X", - "vinyl": "1.X" - }, - "dependencies": { - "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 - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "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 }, "is-data-descriptor": { "version": "1.0.0", @@ -2150,56 +2107,6 @@ "requires": { "kind-of": "^6.0.0" } - } - } - }, - "gulp-tslint": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-8.1.4.tgz", - "integrity": "sha512-wBoZIEMJRz9urHwolsvQpngA9l931p6g/Liwz1b/KrsVP6jEBFZv/o0NS1TFCQZi/l8mXxz8+v3twhf4HOXxPQ==", - "dev": true, - "requires": { - "@types/fancy-log": "1.3.0", - "ansi-colors": "^1.0.1", - "fancy-log": "1.3.3", - "map-stream": "~0.0.7", - "plugin-error": "1.0.1", - "through": "~2.3.8" - }, - "dependencies": { - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - } - } - }, - "gulp-typescript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", - "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.5", - "plugin-error": "^1.0.1", - "source-map": "^0.7.3", - "through2": "^3.0.0", - "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.3" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true }, "is-descriptor": { "version": "1.0.2", @@ -2221,9 +2128,9 @@ "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==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-json-stable-stringify": { @@ -2275,13 +2182,12 @@ } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "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": "^5.0.0", - "path-exists": "^4.0.0" + "locate-path": "^3.0.0" } }, "flat-cache": { @@ -2351,9 +2257,9 @@ "dev": true }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, @@ -2375,6 +2281,12 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -2423,15 +2335,18 @@ } }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "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.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "growly": { @@ -2515,6 +2430,12 @@ } } }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", @@ -2570,14 +2491,6 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" - }, - "dependencies": { - "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 - } } }, "import-local": { @@ -2613,9 +2526,9 @@ "dev": true }, "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.2.0.tgz", + "integrity": "sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -2631,6 +2544,40 @@ "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" + }, + "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 + }, + "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" + } + }, + "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" + } + } } }, "ip-regex": { @@ -2659,6 +2606,12 @@ } } }, + "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", @@ -2694,12 +2647,6 @@ } } }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -2719,6 +2666,13 @@ } } }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true, + "optional": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -2732,9 +2686,9 @@ "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==", + "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-generator-fn": { @@ -2767,22 +2721,10 @@ "isobject": "^3.0.1" } }, - "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-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-typedarray": { @@ -2798,16 +2740,19 @@ "dev": true }, "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "optional": true + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "isexe": { @@ -2835,15 +2780,12 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" @@ -2872,9 +2814,9 @@ } }, "istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-Vm9xwCiQ8t2cNNnckyeAV0UdxKpcQUz4nMxsBvIu8n2kmPSiyb5uaF/8LpmKr+yqL/MdOXaX2Nmdo4Qyxium9Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -2892,44 +2834,162 @@ "jest-cli": "^25.2.7" }, "dependencies": { - "jest-cli": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.2.7.tgz", - "integrity": "sha512-OOAZwY4Jkd3r5WhVM5L3JeLNFaylvHUczMLxQDVLrrVyb1Cy+DNJ6MVsb5TLh6iBklB42m5TOP+IbOgKGGOtMw==", + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "@jest/core": "^25.2.7", - "@jest/test-result": "^25.2.6", - "@jest/types": "^25.2.6", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^25.2.7", - "jest-util": "^25.2.6", - "jest-validate": "^25.2.6", - "prompts": "^2.0.1", - "realpath-native": "^2.0.0", - "yargs": "^15.3.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "jest-cli": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.5.4.tgz", + "integrity": "sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==", + "dev": true, + "requires": { + "@jest/core": "^25.5.4", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^25.5.4", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "prompts": "^2.0.1", + "realpath-native": "^2.0.0", + "yargs": "^15.3.1" + } + }, + "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-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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "jest-changed-files": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.2.6.tgz", - "integrity": "sha512-F7l2m5n55jFnJj4ItB9XbAlgO+6umgvz/mdK76BfTd2NGkvGf9x96hUXP/15a1K0k14QtVOoutwpRKl360msvg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.5.0.tgz", + "integrity": "sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "execa": "^3.2.0", "throat": "^5.0.0" }, "dependencies": { "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -3005,42 +3065,52 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, "jest-config": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.2.7.tgz", - "integrity": "sha512-rIdPPXR6XUxi+7xO4CbmXXkE6YWprvlKc4kg1SrkCL2YV5m/8MkHstq9gBZJ19Qoa3iz/GP+0sTG/PcIwkFojg==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.4.tgz", + "integrity": "sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.2.7", - "@jest/types": "^25.2.6", - "babel-jest": "^25.2.6", + "@jest/test-sequencer": "^25.5.4", + "@jest/types": "^25.5.0", + "babel-jest": "^25.5.1", "chalk": "^3.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", - "jest-environment-jsdom": "^25.2.6", - "jest-environment-node": "^25.2.6", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^25.5.0", + "jest-environment-node": "^25.5.0", "jest-get-type": "^25.2.6", - "jest-jasmine2": "^25.2.7", + "jest-jasmine2": "^25.5.4", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.2.6", - "jest-util": "^25.2.6", - "jest-validate": "^25.2.6", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "micromatch": "^4.0.2", - "pretty-format": "^25.2.6", + "pretty-format": "^25.5.0", "realpath-native": "^2.0.0" }, "dependencies": { "pretty-format": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", - "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3061,34 +3131,34 @@ } }, "jest-docblock": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.2.6.tgz", - "integrity": "sha512-VAYrljEq0upq0oERfIaaNf28gC6p9gORndhHstCYF8NWGNQJnzoaU//S475IxfWMk4UjjVmS9rJKLe5Jjjbixw==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz", + "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.2.6.tgz", - "integrity": "sha512-OgQ01VINaRD6idWJOhCYwUc5EcgHBiFlJuw+ON2VgYr7HLtMFyCcuo+3mmBvuLUH4QudREZN7cDCZviknzsaJQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.5.0.tgz", + "integrity": "sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "jest-get-type": "^25.2.6", - "jest-util": "^25.2.6", - "pretty-format": "^25.2.6" + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0" }, "dependencies": { "pretty-format": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", - "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3097,30 +3167,30 @@ } }, "jest-environment-jsdom": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.2.6.tgz", - "integrity": "sha512-/o7MZIhGmLGIEG5j7r5B5Az0umWLCHU+F5crwfbm0BzC4ybHTJZOQTFQWhohBg+kbTCNOuftMcqHlVkVduJCQQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz", + "integrity": "sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==", "dev": true, "requires": { - "@jest/environment": "^25.2.6", - "@jest/fake-timers": "^25.2.6", - "@jest/types": "^25.2.6", - "jest-mock": "^25.2.6", - "jest-util": "^25.2.6", + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "jsdom": "^15.2.1" } }, "jest-environment-node": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.2.6.tgz", - "integrity": "sha512-D1Ihj14fxZiMHGeTtU/LunhzSI+UeBvlr/rcXMTNyRMUMSz2PEhuqGbB78brBY6Dk3FhJDk7Ta+8reVaGjLWhA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.5.0.tgz", + "integrity": "sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==", "dev": true, "requires": { - "@jest/environment": "^25.2.6", - "@jest/fake-timers": "^25.2.6", - "@jest/types": "^25.2.6", - "jest-mock": "^25.2.6", - "jest-util": "^25.2.6", + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "semver": "^6.3.0" } }, @@ -3131,57 +3201,69 @@ "dev": true }, "jest-haste-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.2.6.tgz", - "integrity": "sha512-nom0+fnY8jwzelSDQnrqaKAcDZczYQvMEwcBjeL3PQ4MlcsqeB7dmrsAniUw/9eLkngT5DE6FhnenypilQFsgA==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", + "@types/graceful-fs": "^4.1.2", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.2.6", - "jest-worker": "^25.2.6", + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7", "which": "^2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "jest-jasmine2": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.2.7.tgz", - "integrity": "sha512-HeQxEbonp8fUvik9jF0lkU9ab1u5TQdIb7YSU9Fj7SxWtqHNDGyCpF6ZZ3r/5yuertxi+R95Ba9eA91GMQ38eA==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz", + "integrity": "sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.2.6", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.2.6", - "@jest/types": "^25.2.6", + "@jest/environment": "^25.5.0", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "co": "^4.6.0", - "expect": "^25.2.7", + "expect": "^25.5.0", "is-generator-fn": "^2.0.0", - "jest-each": "^25.2.6", - "jest-matcher-utils": "^25.2.7", - "jest-message-util": "^25.2.6", - "jest-runtime": "^25.2.7", - "jest-snapshot": "^25.2.7", - "jest-util": "^25.2.6", - "pretty-format": "^25.2.6", + "jest-each": "^25.5.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-runtime": "^25.5.4", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0", "throat": "^5.0.0" }, "dependencies": { "pretty-format": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", - "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3190,22 +3272,22 @@ } }, "jest-leak-detector": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.2.6.tgz", - "integrity": "sha512-n+aJUM+j/x1kIaPVxzerMqhAUuqTU1PL5kup46rXh+l9SP8H6LqECT/qD1GrnylE1L463/0StSPkH4fUpkuEjA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz", + "integrity": "sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==", "dev": true, "requires": { "jest-get-type": "^25.2.6", - "pretty-format": "^25.2.6" + "pretty-format": "^25.5.0" }, "dependencies": { "pretty-format": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", - "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3214,36 +3296,36 @@ } }, "jest-matcher-utils": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.2.7.tgz", - "integrity": "sha512-jNYmKQPRyPO3ny0KY1I4f0XW4XnpJ3Nx5ovT4ik0TYDOYzuXJW40axqOyS61l/voWbVT9y9nZ1THL1DlpaBVpA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", "dev": true, "requires": { "chalk": "^3.0.0", - "jest-diff": "^25.2.6", + "jest-diff": "^25.5.0", "jest-get-type": "^25.2.6", - "pretty-format": "^25.2.6" + "pretty-format": "^25.5.0" }, "dependencies": { "jest-diff": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.6.tgz", - "integrity": "sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", "dev": true, "requires": { "chalk": "^3.0.0", "diff-sequences": "^25.2.6", "jest-get-type": "^25.2.6", - "pretty-format": "^25.2.6" + "pretty-format": "^25.5.0" } }, "pretty-format": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", - "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3252,33 +3334,34 @@ } }, "jest-message-util": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.2.6.tgz", - "integrity": "sha512-Hgg5HbOssSqOuj+xU1mi7m3Ti2nwSQJQf/kxEkrz2r2rp2ZLO1pMeKkz2WiDUWgSR+APstqz0uMFcE5yc0qdcg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" } }, "jest-mock": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.2.6.tgz", - "integrity": "sha512-vc4nibavi2RGPdj/MyZy/azuDjZhpYZLvpfgq1fxkhbyTpKVdG7CgmRVKJ7zgLpY5kuMjTzDYA6QnRwhsCU+tA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", "dev": true, "requires": { - "@jest/types": "^25.2.6" + "@jest/types": "^25.5.0" } }, "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "dev": true }, "jest-regex-util": { @@ -3288,137 +3371,264 @@ "dev": true }, "jest-resolve": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.2.6.tgz", - "integrity": "sha512-7O61GVdcAXkLz/vNGKdF+00A80/fKEAA47AEXVNcZwj75vEjPfZbXDaWFmAQCyXj4oo9y9dC9D+CLA11t8ieGw==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", + "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "browser-resolve": "^1.11.3", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.1", + "read-pkg-up": "^7.0.1", "realpath-native": "^2.0.0", - "resolve": "^1.15.1" + "resolve": "^1.17.0", + "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.7.tgz", - "integrity": "sha512-IrnMzCAh11Xd2gAOJL+ThEW6QO8DyqNdvNkQcaCticDrOAr9wtKT7yT6QBFFjqKFgjjvaVKDs59WdgUhgYnHnQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz", + "integrity": "sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-snapshot": "^25.2.7" + "jest-snapshot": "^25.5.1" } }, "jest-runner": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.2.7.tgz", - "integrity": "sha512-RFEr71nMrtNwcpoHzie5+fe1w3JQCGMyT2xzNwKe3f88+bK+frM2o1v24gEcPxQ2QqB3COMCe2+1EkElP+qqqQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.4.tgz", + "integrity": "sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==", "dev": true, "requires": { - "@jest/console": "^25.2.6", - "@jest/environment": "^25.2.6", - "@jest/test-result": "^25.2.6", - "@jest/types": "^25.2.6", + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.2.7", - "jest-docblock": "^25.2.6", - "jest-haste-map": "^25.2.6", - "jest-jasmine2": "^25.2.7", - "jest-leak-detector": "^25.2.6", - "jest-message-util": "^25.2.6", - "jest-resolve": "^25.2.6", - "jest-runtime": "^25.2.7", - "jest-util": "^25.2.6", - "jest-worker": "^25.2.6", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", + "jest-docblock": "^25.3.0", + "jest-haste-map": "^25.5.1", + "jest-jasmine2": "^25.5.4", + "jest-leak-detector": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", + "jest-runtime": "^25.5.4", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "source-map-support": "^0.5.6", "throat": "^5.0.0" } }, "jest-runtime": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.2.7.tgz", - "integrity": "sha512-Gw3X8KxTTFylu2T/iDSNKRUQXQiPIYUY0b66GwVYa7W8wySkUljKhibQHSq0VhmCAN7vRBEQjlVQ+NFGNmQeBw==", - "dev": true, - "requires": { - "@jest/console": "^25.2.6", - "@jest/environment": "^25.2.6", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.2.6", - "@jest/transform": "^25.2.6", - "@jest/types": "^25.2.6", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.4.tgz", + "integrity": "sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==", + "dev": true, + "requires": { + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/globals": "^25.5.2", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "@types/yargs": "^15.0.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.2.7", - "jest-haste-map": "^25.2.6", - "jest-message-util": "^25.2.6", - "jest-mock": "^25.2.6", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.2.6", - "jest-snapshot": "^25.2.7", - "jest-util": "^25.2.6", - "jest-validate": "^25.2.6", + "jest-resolve": "^25.5.1", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "realpath-native": "^2.0.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^15.3.1" + }, + "dependencies": { + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "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-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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", - "dev": true + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4" + } }, "jest-snapshot": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.2.7.tgz", - "integrity": "sha512-Rm8k7xpGM4tzmYhB6IeRjsOMkXaU8/FOz5XlU6oYwhy53mq6txVNqIKqN1VSiexzpC80oWVxVDfUDt71M6XPOA==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.5.1.tgz", + "integrity": "sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "@types/prettier": "^1.19.0", "chalk": "^3.0.0", - "expect": "^25.2.7", - "jest-diff": "^25.2.6", + "expect": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-diff": "^25.5.0", "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.2.7", - "jest-message-util": "^25.2.6", - "jest-resolve": "^25.2.6", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", "make-dir": "^3.0.0", "natural-compare": "^1.4.0", - "pretty-format": "^25.2.6", + "pretty-format": "^25.5.0", "semver": "^6.3.0" }, "dependencies": { "jest-diff": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.6.tgz", - "integrity": "sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", "dev": true, "requires": { "chalk": "^3.0.0", "diff-sequences": "^25.2.6", "jest-get-type": "^25.2.6", - "pretty-format": "^25.2.6" + "pretty-format": "^25.5.0" } }, "pretty-format": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", - "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3427,38 +3637,39 @@ } }, "jest-util": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.2.6.tgz", - "integrity": "sha512-gpXy0H5ymuQ0x2qgl1zzHg7LYHZYUmDEq6F7lhHA8M0eIwDB2WteOcCnQsohl9c/vBKZ3JF2r4EseipCZz3s4Q==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } }, "jest-validate": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.2.6.tgz", - "integrity": "sha512-a4GN7hYbqQ3Rt9iHsNLFqQz7HDV7KiRPCwPgo5nqtTIWNZw7gnT8KchG+Riwh+UTSn8REjFCodGp50KX/fRNgQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", + "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "camelcase": "^5.3.1", "chalk": "^3.0.0", "jest-get-type": "^25.2.6", "leven": "^3.1.0", - "pretty-format": "^25.2.6" + "pretty-format": "^25.5.0" }, "dependencies": { "pretty-format": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", - "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.2.6", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3467,23 +3678,23 @@ } }, "jest-watcher": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.2.7.tgz", - "integrity": "sha512-RdHuW+f49tahWtluTnUdZ2iPliebleROI2L/J5phYrUS6DPC9RB3SuUtqYyYhGZJsbvRSuLMIlY/cICJ+PIecw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.5.0.tgz", + "integrity": "sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==", "dev": true, "requires": { - "@jest/test-result": "^25.2.6", - "@jest/types": "^25.2.6", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", - "jest-util": "^25.2.6", + "jest-util": "^25.5.0", "string-length": "^3.1.0" } }, "jest-worker": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", - "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -3497,9 +3708,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3558,6 +3769,12 @@ "integrity": "sha1-eXLCpaSKQmeNsnMMfCxO5uTiRYU=", "dev": true }, + "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": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -3583,9 +3800,9 @@ "dev": true }, "json5": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", - "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -3631,13 +3848,20 @@ "type-check": "~0.3.2" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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": "^4.1.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -3668,9 +3892,9 @@ } }, "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -3723,18 +3947,18 @@ } }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "mimic-fn": { @@ -3788,287 +4012,6 @@ "minimist": "^1.2.5" } }, - "mocha": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz", - "integrity": "sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.3.1", - "debug": "3.2.6", - "diff": "4.0.2", - "escape-string-regexp": "1.0.5", - "find-up": "4.1.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "object.assign": "4.1.0", - "promise.allsettled": "1.0.2", - "serialize-javascript": "3.0.0", - "strip-json-comments": "3.0.1", - "supports-color": "7.1.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.0", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "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 - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - } - }, - "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" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "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 - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": 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 - }, - "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" - } - }, - "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 - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.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-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "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" - } - }, - "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" - } - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2" - } - }, - "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 - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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" - } - }, - "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 - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, - "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 - }, - "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" - } - } - } - }, - "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4136,18 +4079,6 @@ "semver": "^6.3.0", "shellwords": "^0.1.1", "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "noms": { @@ -4160,28 +4091,39 @@ "readable-stream": "~1.0.31" } }, + "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": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, "npm-run-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", - "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "^3.0.0" + "path-key": "^2.0.0" } }, "nwsapi": { @@ -4245,16 +4187,6 @@ "isobject": "^3.0.1" } }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4300,27 +4232,27 @@ "dev": true }, "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "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==", + "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.2.0" + "p-limit": "^2.0.0" } }, "p-try": { @@ -4338,6 +4270,18 @@ "callsites": "^3.0.0" } }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, "parse5": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", @@ -4351,9 +4295,9 @@ "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==", + "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": { @@ -4363,9 +4307,9 @@ "dev": true }, "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-parse": { @@ -4402,6 +4346,42 @@ "dev": true, "requires": { "find-up": "^4.0.0" + }, + "dependencies": { + "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" + } + }, + "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-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" + } + }, + "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 + } } }, "pn": { @@ -4490,6 +4470,73 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "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" + } + }, + "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-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" + } + }, + "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 + } + } + }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -4500,14 +4547,6 @@ "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } } }, "realpath-native": { @@ -4533,32 +4572,11 @@ } }, "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -4662,9 +4680,9 @@ "dev": true }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -4677,12 +4695,20 @@ "dev": true, "requires": { "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "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 }, "resolve-url": { @@ -4723,13 +4749,10 @@ "dev": true }, "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "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": "6.5.5", @@ -4947,12 +4970,12 @@ } }, "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "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": "^3.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -5020,12 +5043,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true - }, - "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 } } }, @@ -5177,9 +5194,9 @@ } }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -5192,6 +5209,38 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "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-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -5265,52 +5314,40 @@ "requires": { "astral-regex": "^1.0.0", "strip-ansi": "^5.2.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-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" - } - } } }, "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==", + "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": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "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==", + "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": "^5.0.0" + "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": { @@ -5332,9 +5369,9 @@ "dev": true }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "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": { @@ -5372,46 +5409,6 @@ "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.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 - }, - "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 - }, - "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 - }, - "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" - } - } } }, "terminal-link": { @@ -5463,6 +5460,12 @@ "xtend": "~4.0.1" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -5587,6 +5590,24 @@ "resolve": "1.x", "semver": "6.x", "yargs-parser": "^18.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "ts-node": { @@ -5603,9 +5624,9 @@ } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, "tsutils": { @@ -5648,9 +5669,9 @@ "dev": true }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "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-to-buffer": { @@ -5668,29 +5689,6 @@ "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -5740,6 +5738,12 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true } } }, @@ -5777,15 +5781,15 @@ "dev": true }, "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==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "v8-to-istanbul": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz", - "integrity": "sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", + "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -5801,6 +5805,16 @@ } } }, + "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" + } + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -5874,9 +5888,9 @@ } }, "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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" @@ -5895,14 +5909,40 @@ "dev": true }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "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": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.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.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 + } } }, "wrappy": { @@ -5918,17 +5958,6 @@ "dev": true, "requires": { "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } } }, "write-file-atomic": { @@ -5944,9 +5973,9 @@ } }, "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", "dev": true }, "xml-name-validator": { @@ -5974,28 +6003,27 @@ "dev": true }, "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", + "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": "^4.2.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/package.json b/package.json index 4bf6c4b8c..a46607e77 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,12 @@ }, "contributors": [ { - "name": "jotamorais", + "name": "Jonathas Morais", "url": "https://github.com/jotamorais" + }, + { + "name": "Rob Muchal", + "url": "https://github.com/rmuchall" } ], "repository": { @@ -30,7 +34,6 @@ "object-to-class", "typescript-serializer" ], - "dependencies": {}, "devDependencies": { "@types/jest": "25.1.5", "@types/node": "13.11.0", From 43e2b39047f61838268b3967470c54d18f60c107 Mon Sep 17 00:00:00 2001 From: jotamorais Date: Mon, 29 Jun 2020 18:05:19 -0500 Subject: [PATCH 07/30] Add CI step to build project after installing dependencies --- .github/workflows/nodejs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 32b59e8e7..07dd653a3 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -17,6 +17,7 @@ jobs: with: node-version: ${{ matrix.node-version }} - run: npm install + - run: npm run build - run: npm test env: CI: true From 8f04eb9db02de708f1a20f6f2d2bb309b2fed01e Mon Sep 17 00:00:00 2001 From: Kessiler Rodrigues Date: Sun, 19 Apr 2020 01:35:57 -0300 Subject: [PATCH 08/30] Fix prototype pollution vulnerabilities --- src/TransformOperationExecutor.ts | 4 ++++ test/functional/basic-functionality.spec.ts | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/TransformOperationExecutor.ts b/src/TransformOperationExecutor.ts index d76815e83..6dd31ab7e 100644 --- a/src/TransformOperationExecutor.ts +++ b/src/TransformOperationExecutor.ts @@ -145,6 +145,10 @@ export class TransformOperationExecutor { // traverse over keys for (const key of keys) { + if (key === '__proto__' || key === 'constructor') { + continue; + } + const valueKey = key; let newValueKey = key, propertyName = key; if (!this.options.ignoreDecorators && targetType) { diff --git a/test/functional/basic-functionality.spec.ts b/test/functional/basic-functionality.spec.ts index 75b9293d2..7f96086d9 100644 --- a/test/functional/basic-functionality.spec.ts +++ b/test/functional/basic-functionality.spec.ts @@ -1749,6 +1749,20 @@ describe("basic functionality", () => { expect(transformedClass).toBeInstanceOf(TestClass); }); + it('should not pollute the prototype with a `__proto__` property',() => { + const object = JSON.parse('{"__proto__": { "admin": true }}'); + const plainObject = {}; + classToPlainFromExist(object, plainObject); + expect((plainObject as any).admin).toEqual(undefined); + }); + + it('should not pollute the prototype with a `constructor.prototype` property', () => { + const object = JSON.parse('{"constructor": { "prototype": { "admin": true }}}'); + const plainObject = {}; + classToPlainFromExist(object, plainObject); + expect((plainObject as any).admin).toEqual(undefined); + }); + it("should default union types where the plain type is an array to an array result", () => { class User { name: string; From 5abcb96f959181bae8d2356d876a62e7bc59f29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorens=20Le=C3=B3n?= Date: Fri, 29 May 2020 15:17:10 +0200 Subject: [PATCH 09/30] fix: make transformers order deterministic When several trasnformers are applied to the same property the order is reversed every time plainToClass is called. This fix make the transfomers orders consistent across multiple `plainToClass()` calls. Fixes #231 --- src/metadata/MetadataStorage.ts | 2 +- test/functional/transformer-order.spec.ts | 28 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test/functional/transformer-order.spec.ts diff --git a/src/metadata/MetadataStorage.ts b/src/metadata/MetadataStorage.ts index d358ad6e5..9d148e80a 100644 --- a/src/metadata/MetadataStorage.ts +++ b/src/metadata/MetadataStorage.ts @@ -215,7 +215,7 @@ export class MetadataStorage { } } } - return (metadataFromAncestorsTarget).reverse().concat((metadataFromTarget || []).reverse()); + return (metadataFromAncestorsTarget).slice().reverse().concat((metadataFromTarget || []).slice().reverse()); } private getAncestors(target: Function): Function[] { diff --git a/test/functional/transformer-order.spec.ts b/test/functional/transformer-order.spec.ts new file mode 100644 index 000000000..1e79df00d --- /dev/null +++ b/test/functional/transformer-order.spec.ts @@ -0,0 +1,28 @@ +import "reflect-metadata"; +import { plainToClass } from "../../src/index"; +import { defaultMetadataStorage } from "../../src/storage"; +import { Expose, Transform } from "../../src/decorators"; + +describe("applying several transformations", () => { + beforeEach(() => defaultMetadataStorage.clear()); + afterEach(() => defaultMetadataStorage.clear()); + + it("should keep the order of the applied decorators after several plainToClass() calls", () => { + class User { + @Transform(() => "Jonathan") + @Transform(() => "John") + @Expose() + name: string; + } + + const firstUser = plainToClass(User, { name: "Joe" }); + expect(firstUser.name).toEqual("John"); + + // Prior to this pull request [#355](https://github.com/typestack/class-transformer/pull/355) + // the order of the transformations was reversed after every `plainToClass()` call + // So after consecutive calls `User#name` would be "John" - "Jonathan" - "John" - "Jonathan"... + // This test ensures the last transformation is always the last one to be applied + const secondUser = plainToClass(User, { name: "Joe" }); + expect(secondUser.name).toEqual("John"); + }); +}); From 1f037a901824d9bcca78483e36c4b660c5b9a6b0 Mon Sep 17 00:00:00 2001 From: NaZ Date: Sat, 14 Sep 2019 23:49:36 +0300 Subject: [PATCH 10/30] Fixed link to changelog.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dda3913ce..f4f0a6879 100644 --- a/README.md +++ b/README.md @@ -921,4 +921,4 @@ usages. ## Release notes -See information about breaking changes and release notes [here](https://github.com/pleerock/class-transformer/tree/master/doc/release-notes.md). +See information about breaking changes and release notes [here](https://github.com/typestack/class-transformer/blob/master/CHANGELOG.md). From 1b02c24a56307ca1a662d4c830e5975631e2c0db Mon Sep 17 00:00:00 2001 From: Yair Date: Fri, 22 Nov 2019 10:01:09 +0200 Subject: [PATCH 11/30] typo correction --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f4f0a6879..6b8a356d9 100644 --- a/README.md +++ b/README.md @@ -668,7 +668,7 @@ let user1 = classToPlain(user, { version: 0.5 }); // will contain id and name let user2 = classToPlain(user, { version: 0.7 }); // will contain id, name and email let user3 = classToPlain(user, { version: 1 }); // will contain id and name let user4 = classToPlain(user, { version: 2 }); // will contain id and name -let user5 = classToPlain(user, { version: 2.1 }); // will contain id, name nad password +let user5 = classToPlain(user, { version: 2.1 }); // will contain id, name and password ``` ## Сonverting date strings into Date objects From 915159b39fc63342d41853074f7af4b5bdd1f399 Mon Sep 17 00:00:00 2001 From: Saulo Date: Wed, 22 Jul 2020 22:37:26 -0300 Subject: [PATCH 12/30] docs: fix examples and table of contents --- README.md | 44 ++++++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 6b8a356d9..965f37bda 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,12 @@ Source code is available [here](https://github.com/pleerock/class-transformer-de - [Node.js](#nodejs) - [Browser](#browser) - [Methods](#methods) - - [plainToClass](#plaintoclass) - - [plainToClassFromExist](#plaintoclassfromexist) - - [classToPlain](#classtoplain) - - [classToClass](#classtoclass) - - [serialize](#serialize) - - [deserialize and deserializeArray](#deserialize-and-deserializearray) + - [plainToClass](#plaintoclass) + - [plainToClassFromExist](#plaintoclassfromexist) + - [classToPlain](#classtoplain) + - [classToClass](#classtoclass) + - [serialize](#serialize) + - [deserialize and deserializeArray](#deserialize-and-deserializearray) - [Enforcing type-safe instance](#enforcing-type-safe-instance) - [Working with nested objects](#working-with-nested-objects) - [Providing more than one type option](#providing-more-than-one-type-option) @@ -36,7 +36,7 @@ Source code is available [here](https://github.com/pleerock/class-transformer-de - [Skipping private properties, or some prefixed properties](#skipping-private-properties-or-some-prefixed-properties) - [Using groups to control excluded properties](#using-groups-to-control-excluded-properties) - [Using versioning to control exposed and excluded properties](#using-versioning-to-control-exposed-and-excluded-properties) -- [Сonverting date strings into Date objects](#%d0%a1onverting-date-strings-into-date-objects) +- [Сonverting date strings into Date objects](#сonverting-date-strings-into-date-objects) - [Working with arrays](#working-with-arrays) - [Additional data transformation](#additional-data-transformation) - [Basic usage](#basic-usage) @@ -211,7 +211,7 @@ Now you can use `users[0].getName()` and `users[0].isAdult()` methods. ## Methods -#### plainToClass +### plainToClass This method transforms a plain javascript object to instance of specific class. @@ -221,7 +221,7 @@ import {plainToClass} from "class-transformer"; let users = plainToClass(User, userJson); // to convert user plain object a single user. also supports arrays ``` -#### plainToClassFromExist +### plainToClassFromExist This method transforms a plain object into a instance using a already filled Object which is a instance from the target class. @@ -232,7 +232,7 @@ defaultUser.role = 'user'; let mixedUser = plainToClassFromExist(defaultUser, user); // mixed user should have the value role = user when no value is set otherwise. ``` -#### classToPlain +### classToPlain This method transforms your class object back to plain javascript object, that can be `JSON.stringify` later. @@ -241,7 +241,7 @@ import {classToPlain} from "class-transformer"; let photo = classToPlain(photo); ``` -#### classToClass +### classToClass This method transforms your class object into new instance of the class object. This maybe treated as deep clone of your objects. @@ -253,7 +253,7 @@ let photo = classToClass(photo); You can also use a `ignoreDecorators` option in transformation options to ignore all decorators you classes is using. -#### serialize +### serialize You can serialize your model right to the json using `serialize` method: @@ -264,7 +264,7 @@ let photo = serialize(photo); `serialize` works with both arrays and non-arrays. -#### deserialize and deserializeArray +### deserialize and deserializeArray You can deserialize your model to from a json using `deserialize` method: @@ -580,7 +580,7 @@ You can pass any number of prefixes and all properties that begin with these pre For example: ```typescript -import {Expose} from "class-transformer"; +import {Expose, classToPlain} from "class-transformer"; export class User { @@ -596,7 +596,7 @@ export class User { @Expose() get name() { - return this.firstName + " " + this.lastName; + return this._firstName + " " + this._lastName; } } @@ -604,7 +604,7 @@ export class User { const user = new User(); user.id = 1; user.setName("Johny", "Cage"); -user._password = 123; +user._password = "123"; const plainUser = classToPlain(user, { excludePrefixes: ["_"] }); // here plainUser will be equal to @@ -616,9 +616,8 @@ const plainUser = classToPlain(user, { excludePrefixes: ["_"] }); You can use groups to control what data will be exposed and what will not be: ```typescript -import {Exclude, Expose} from "class-transformer"; +import {Exclude, Expose, classToPlain} from "class-transformer"; -@Exclude() export class User { id: number; @@ -631,10 +630,7 @@ export class User { @Expose({ groups: ["user"] }) // this means that this data will be exposed only to users password: string; } -``` -```typescript -import {classToPlain} from "class-transformer"; let user1 = classToPlain(user, { groups: ["user"] }); // will contain id, name, email and password let user2 = classToPlain(user, { groups: ["admin"] }); // will contain id, name and email ``` @@ -645,9 +641,8 @@ If you are building an API that has different versions, class-transformer has ex You can control which properties of your model should be exposed or excluded in what version. Example: ```typescript -import {Exclude, Expose} from "class-transformer"; +import {Exclude, Expose, classToPlain} from "class-transformer"; -@Exclude() export class User { id: number; @@ -660,10 +655,7 @@ export class User { @Expose({ since: 2.1 }) // this means that this property will be exposed for version starting from 2.1 password: string; } -``` -```typescript -import {classToPlain} from "class-transformer"; let user1 = classToPlain(user, { version: 0.5 }); // will contain id and name let user2 = classToPlain(user, { version: 0.7 }); // will contain id, name and email let user3 = classToPlain(user, { version: 1 }); // will contain id and name From bb21d22b977ef0cf1cc21dce531211c086ccc558 Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 16:58:02 +0200 Subject: [PATCH 13/30] build: update gitignore --- .gitignore | 56 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 2153d05ee..c89d84f27 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,52 @@ -build/ -node_modules/ -coverage/ -npm-debug.log +# Log files +logs +*.log +*.tmp +*.tmp.* +log.txt +npm-debug.log* + +# Testing output +lib-cov/** +coverage/** + +# Environment files +.env + +# Dependency directories +node_modules + +# MacOS related files +*.DS_Store +.AppleDouble +.LSOverride +._* +UserInterfaceState.xcuserstate + +# Windows related files +Thumbs.db +Desktop.ini +$RECYCLE.BIN/ + +# IDE - Sublime +*.sublime-project +*.sublime-workspace + +# IDE - VSCode +.vscode/** +!.vscode/tasks.json +!.vscode/launch.json + +# IDE - IntelliJ .idea -.vscode + +# Compilation output folders +dist/ +build/ +tmp/ +out-tsc/ +temp + +# Files for playing around locally +playground.ts +playground.js \ No newline at end of file From 9f05b713a652189a246aeb5dbe44f6dd0e8fcba8 Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 17:15:56 +0200 Subject: [PATCH 14/30] build: update year in license --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index ae498f261..5507284be 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License -Copyright (c) 2015-2016 Umed Khudoiberdiev +Copyright (c) 2015-2020 Umed Khudoiberdiev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 894a5fca49a2800e8e342ebf45d4f0fdd4add121 Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 17:18:13 +0200 Subject: [PATCH 15/30] build: update TS and Jest config --- jest.config.js | 28 +++-------- package.json | 16 +++---- src/TransformOperationExecutor.ts | 2 + tsconfig.json | 79 ++++++------------------------- tsconfig.prod.json | 9 ++++ tsconfig.spec.json | 11 +++++ 6 files changed, 51 insertions(+), 94 deletions(-) create mode 100644 tsconfig.prod.json create mode 100644 tsconfig.spec.json diff --git a/jest.config.js b/jest.config.js index 54ad0dbdd..7e62d43ea 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,24 +1,10 @@ module.exports = { - modulePaths: ["/node_modules"], - transform: { - "^.+\\.tsx?$": "ts-jest" + preset: 'ts-jest', + testEnvironment: 'node', + collectCoverageFrom: ['src/**/*.ts', '!src/**/index.ts', '!src/**/*.interface.ts'], + globals: { + 'ts-jest': { + tsConfig: 'tsconfig.spec.json', }, - testRegex: "(/__test__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - testEnvironment: "node", - moduleFileExtensions: [ - "ts", - "tsx", - "js", - "jsx", - "json", - "node" - ], - modulePathIgnorePatterns: [ - "/build/" - ], - coverageReporters: [ - // "html", - // "lcov", - "text-summary" - ] + }, }; diff --git a/package.json b/package.json index a46607e77..43fb5d3de 100644 --- a/package.json +++ b/package.json @@ -52,13 +52,13 @@ "typescript": "3.8.3" }, "scripts": { - "build": "rimraf build && echo Using TypeScript && tsc --version && tsc --pretty", - "clean": "rimraf build coverage", - "copy": "copyfiles -u 3 \"build/compiled/src/**/*\" build/package && copyfiles package.json README.md build/package", - "lint": "eslint --config ./.eslintrc.js --ext .ts ./src ./test", - "package": "npm run build && npm run copy && npm run public && rimraf build/compiled", - "pretest": "npm run lint", - "public": "json -I -f build/package/package.json -e 'this.private=false'", - "test": "jest --coverage" + "build": "rimraf build && tsc --project tsconfig.prod.json", + "prettier:fix": "prettier --write \"**/*.{ts,md}\"", + "prettier:check": "prettier --check \"**/*.{ts,md}\"", + "lint:fix": "eslint --max-warnings 0 --fix --ext .ts src/", + "lint:check": "eslint --max-warnings 0 --ext .ts src/", + "test": "jest --coverage --verbose", + "test:watch": "jest --watch", + "test:ci": "jest --runInBand --coverage --verbose" } } diff --git a/src/TransformOperationExecutor.ts b/src/TransformOperationExecutor.ts index 6dd31ab7e..e3ee15aa7 100644 --- a/src/TransformOperationExecutor.ts +++ b/src/TransformOperationExecutor.ts @@ -223,6 +223,8 @@ export class TransformOperationExecutor { } else if(this.options.enableImplicitConversion && this.transformationType === TransformationType.PLAIN_TO_CLASS) { // if we have no registererd type via the @Type() decorator then we check if we have any // type declarations in reflect-metadata (type declaration is emited only if some decorator is added to the property.) + // TODO: Remove ts-ignore + // @ts-ignore: Unreachable code error const reflectedType = Reflect.getMetadata("design:type", (targetType as Function).prototype, propertyName); if (reflectedType) { diff --git a/tsconfig.json b/tsconfig.json index 8c873fff1..0edf824d7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,67 +1,16 @@ { - "include": ["./src", "./test"], "compilerOptions": { - /* Basic Options */ - // "incremental": true, /* Enable incremental compilation */ - "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ - // "lib": [], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./build/compiled", /* Redirect output structure to the directory. */ - // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - "strictNullChecks": false, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - "strictPropertyInitialization": false, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - - /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - - /* Advanced Options */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ - } -} + "module": "commonjs", + "target": "es2018", + "lib": ["es2018"], + "outDir": "build", + "rootDir": "./src", + "strict": true, + "sourceMap": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "forceConsistentCasingInFileNames": true + }, + "exclude": ["node_modules", "sample", "**/*.spec.ts", "testing/**"] +} \ No newline at end of file diff --git a/tsconfig.prod.json b/tsconfig.prod.json new file mode 100644 index 000000000..aeea210e6 --- /dev/null +++ b/tsconfig.prod.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "strict": false, + "sourceMap": true, + "removeComments": false, + "declaration": true, + }, +} \ No newline at end of file diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 000000000..9943a402b --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "strict": false, + "strictPropertyInitialization": false, + "sourceMap": false, + "removeComments": true, + "noImplicitAny": false, + }, + "exclude": ["node_modules"] +} \ No newline at end of file From 7e44f31f5f8d327d540491bbb5544de99f7e0c00 Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 17:19:53 +0200 Subject: [PATCH 16/30] build: add Prettier --- .prettierrc.yml | 8 ++++++++ package-lock.json | 6 ++++++ package.json | 1 + 3 files changed, 15 insertions(+) create mode 100644 .prettierrc.yml diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 000000000..8a87ac4a2 --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,8 @@ +printWidth: 120 +tabWidth: 2 +useTabs: false +semi: true +singleQuote: true +trailingComma: es5 +bracketSpacing: true +arrowParens: avoid \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index aa65bcc30..0191dcf7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4402,6 +4402,12 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true + }, "pretty-format": { "version": "25.1.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", diff --git a/package.json b/package.json index 43fb5d3de..927497e0c 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "eslint-plugin-jest": "23.8.2", "jest": "25.2.7", "json": "9.0.6", + "prettier": "^2.0.5", "reflect-metadata": "0.1.13", "rimraf": "3.0.2", "ts-jest": "25.3.0", From 4fe1ca3eaccd2640adc9d9625b83aaf40b8e73fc Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 17:20:51 +0200 Subject: [PATCH 17/30] build: configure Husky and lint-staged --- package-lock.json | 512 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 15 ++ 2 files changed, 527 insertions(+) diff --git a/package-lock.json b/package-lock.json index 0191dcf7f..2edfe10c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -803,6 +803,12 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "@types/prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", @@ -923,6 +929,16 @@ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", @@ -935,6 +951,12 @@ "uri-js": "^4.2.2" } }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", @@ -1368,6 +1390,12 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -1377,6 +1405,67 @@ "restore-cursor": "^3.1.0" } }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "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 + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^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" + } + }, + "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" + } + } + } + }, "cli-width": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", @@ -1440,6 +1529,18 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1487,6 +1588,19 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -1578,6 +1692,12 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -1698,6 +1818,15 @@ "once": "^1.4.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2190,6 +2319,15 @@ "locate-path": "^3.0.0" } }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -2281,6 +2419,12 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -2468,6 +2612,36 @@ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, + "husky": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", + "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2509,6 +2683,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2712,6 +2892,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "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-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2721,6 +2907,12 @@ "isobject": "^3.0.1" } }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3854,6 +4046,160 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, + "lint-staged": { + "version": "10.2.11", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.11.tgz", + "integrity": "sha512-LRRrSogzbixYaZItE2APaS4l2eJMjjf5MbclRZpLJtcQJShcvUzKXsNeZgsLIZ0H0+fg2tL4B59fU9wHIHtFIA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "cli-truncate": "2.1.0", + "commander": "^5.1.0", + "cosmiconfig": "^6.0.0", + "debug": "^4.1.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.5", + "execa": "^4.0.1", + "listr2": "^2.1.0", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "listr2": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.4.0.tgz", + "integrity": "sha512-Hj2ECZdAxDkuYFtIKE35PgdMSqMp0muIhJRG5EyV5pOWFEUmKUG+fhfFrvIUNGBQvvi7wQ41eKTxDBisfvDjFQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "figures": "^3.2.0", + "indent-string": "^4.0.0", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.0", + "through": "^2.3.8" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "rxjs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz", + "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -3882,6 +4228,101 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "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 + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^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" + } + }, + "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" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "lolex": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", @@ -4205,6 +4646,12 @@ "mimic-fn": "^2.1.0" } }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, "optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -4255,6 +4702,15 @@ "p-limit": "^2.0.0" } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -4318,6 +4774,12 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -4384,6 +4846,15 @@ } } }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", @@ -4946,6 +5417,18 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5312,6 +5795,12 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, "string-length": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", @@ -5339,6 +5828,17 @@ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -5908,6 +6408,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -6008,6 +6514,12 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", diff --git a/package.json b/package.json index 927497e0c..648e41501 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,19 @@ "object-to-class", "typescript-serializer" ], + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.md": [ + "npm run prettier:fix" + ], + "*.ts": [ + "npm run prettier:fix" + ] + }, "devDependencies": { "@types/jest": "25.1.5", "@types/node": "13.11.0", @@ -43,8 +56,10 @@ "dayjs": "1.8.23", "eslint": "6.8.0", "eslint-plugin-jest": "23.8.2", + "husky": "^4.2.5", "jest": "25.2.7", "json": "9.0.6", + "lint-staged": "^10.2.11", "prettier": "^2.0.5", "reflect-metadata": "0.1.13", "rimraf": "3.0.2", From b638900935d90e1d78e59094196483fcefd17b30 Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 17:22:21 +0200 Subject: [PATCH 18/30] build: remove Travis in favor of GH Actions --- .../continuous-deployment-workflow.yml | 24 + .../continuous-integration-workflow.yml | 35 + .github/workflows/nodejs.yml | 23 - .travis.yml | 9 - README.md | 1815 ++++++++--------- 5 files changed, 958 insertions(+), 948 deletions(-) create mode 100644 .github/workflows/continuous-deployment-workflow.yml create mode 100644 .github/workflows/continuous-integration-workflow.yml delete mode 100644 .github/workflows/nodejs.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/continuous-deployment-workflow.yml b/.github/workflows/continuous-deployment-workflow.yml new file mode 100644 index 000000000..d73269460 --- /dev/null +++ b/.github/workflows/continuous-deployment-workflow.yml @@ -0,0 +1,24 @@ +name: CD +on: + release: + types: [created] +jobs: + publish: + name: Publish to NPM + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + registry-url: https://registry.npmjs.org + - run: npm ci --ignore-scripts + - run: npm run prettier:check + - run: npm run lint:check + - run: npm run test:ci + - run: npm run build + - run: cp LICENSE build/LICENSE + - run: cp README.md build/README.md + - run: cp package.json build/package.json + - run: npm publish ./build + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml new file mode 100644 index 000000000..c091dceac --- /dev/null +++ b/.github/workflows/continuous-integration-workflow.yml @@ -0,0 +1,35 @@ +name: CI +on: push +jobs: + checks: + name: Linters + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + - run: npm ci --ignore-scripts + - run: npm run prettier:check + - run: npm run lint:check + tests: + name: Tests + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [8.x, 10.x, 12.x, 14.x] + steps: + - uses: actions/checkout@v1 + - name: Setting up Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + - run: npm ci --ignore-scripts + - run: npm run test:ci + - run: npm install codecov -g + - run: codecov -f ./coverage/clover.xml -t ${{ secrets.CODECOV_TOKEN }} + build: + name: Build + needs: [tests, checks] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + - run: npm ci --ignore-scripts + - run: npm run build \ No newline at end of file diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml deleted file mode 100644 index 07dd653a3..000000000 --- a/.github/workflows/nodejs.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Node.js CI - -on: [push] - -jobs: - build: - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [8.x, 10.x, 12.x] - - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm install - - run: npm run build - - run: npm test - env: - CI: true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 7d96cd6b3..000000000 --- a/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: node_js -node_js: - - stable - - 12 - - 10 - - 8 - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/README.md b/README.md index 965f37bda..2056f21c9 100644 --- a/README.md +++ b/README.md @@ -1,916 +1,899 @@ -# class-transformer - -[![Build Status](https://travis-ci.org/typestack/class-transformer.svg?branch=master)](https://travis-ci.org/typestack/class-transformer) -[![codecov](https://codecov.io/gh/typestack/class-transformer/branch/master/graph/badge.svg)](https://codecov.io/gh/typestack/class-transformer) -[![npm version](https://badge.fury.io/js/class-transformer.svg)](https://badge.fury.io/js/class-transformer) -[![Dependency Status](https://david-dm.org/typestack/class-transformer.svg)](https://david-dm.org/typestack/class-transformer) -[![Join the chat at https://gitter.im/typestack/class-transformer](https://badges.gitter.im/typestack/class-transformer.svg)](https://gitter.im/typestack/class-transformer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - -Its ES6 and Typescript era. Nowadays you are working with classes and constructor objects more then ever. -Class-transformer allows you to transform plain object to some instance of class and versa. -Also it allows to serialize / deserialize object based on criteria. -This tool is super useful on both frontend and backend. - -Example how to use with angular 2 in [plunker](http://plnkr.co/edit/Mja1ZYAjVySWASMHVB9R). -Source code is available [here](https://github.com/pleerock/class-transformer-demo). - -- [What is class-transformer](#what-is-class-transformer) -- [Installation](#installation) - - [Node.js](#nodejs) - - [Browser](#browser) -- [Methods](#methods) - - [plainToClass](#plaintoclass) - - [plainToClassFromExist](#plaintoclassfromexist) - - [classToPlain](#classtoplain) - - [classToClass](#classtoclass) - - [serialize](#serialize) - - [deserialize and deserializeArray](#deserialize-and-deserializearray) -- [Enforcing type-safe instance](#enforcing-type-safe-instance) -- [Working with nested objects](#working-with-nested-objects) - - [Providing more than one type option](#providing-more-than-one-type-option) -- [Exposing getters and method return values](#exposing-getters-and-method-return-values) -- [Exposing properties with different names](#exposing-properties-with-different-names) -- [Skipping specific properties](#skipping-specific-properties) -- [Skipping depend of operation](#skipping-depend-of-operation) -- [Skipping all properties of the class](#skipping-all-properties-of-the-class) -- [Skipping private properties, or some prefixed properties](#skipping-private-properties-or-some-prefixed-properties) -- [Using groups to control excluded properties](#using-groups-to-control-excluded-properties) -- [Using versioning to control exposed and excluded properties](#using-versioning-to-control-exposed-and-excluded-properties) -- [Сonverting date strings into Date objects](#сonverting-date-strings-into-date-objects) -- [Working with arrays](#working-with-arrays) -- [Additional data transformation](#additional-data-transformation) - - [Basic usage](#basic-usage) - - [Advanced usage](#advanced-usage) -- [Other decorators](#other-decorators) -- [Working with generics](#working-with-generics) -- [Implicit type conversion](#implicit-type-conversion) -- [How does it handle circular references?](#how-does-it-handle-circular-references) -- [Example with Angular2](#example-with-angular2) -- [Samples](#samples) -- [Release notes](#release-notes) - -## What is class-transformer - -In JavaScript there are two types of objects: - -* plain (literal) objects -* class (constructor) objects - -Plain objects are objects that are instances of `Object` class. -Sometimes they are called **literal** objects, when created via `{}` notation. -Class objects are instances of classes with own defined constructor, properties and methods. -Usually you define them via `class` notation. - -So, what is the problem? - -Sometimes you want to transform plain javascript object to the ES6 **classes** you have. -For example, if you are loading a json from your backend, some api or from a json file, -and after you `JSON.parse` it you have a plain javascript object, not instance of class you have. - -For example you have a list of users in your `users.json` that you are loading: - -```json -[{ - "id": 1, - "firstName": "Johny", - "lastName": "Cage", - "age": 27 -}, -{ - "id": 2, - "firstName": "Ismoil", - "lastName": "Somoni", - "age": 50 -}, -{ - "id": 3, - "firstName": "Luke", - "lastName": "Dacascos", - "age": 12 -}] -``` -And you have a `User` class: - -```typescript -export class User { - id: number; - firstName: string; - lastName: string; - age: number; - - getName() { - return this.firstName + " " + this.lastName; - } - - isAdult() { - return this.age > 36 && this.age < 60; - } -} -``` - -You are assuming that you are downloading users of type `User` from `users.json` file and may want to write -following code: - -```typescript -fetch("users.json").then((users: User[]) => { - // you can use users here, and type hinting also will be available to you, - // but users are not actually instances of User class - // this means that you can't use methods of User class -}); -``` - -In this code you can use `users[0].id`, you can also use `users[0].firstName` and `users[0].lastName`. -However you cannot use `users[0].getName()` or `users[0].isAdult()` because "users" actually is -array of plain javascript objects, not instances of User object. -You actually lied to compiler when you said that its `users: User[]`. - -So what to do? How to make a `users` array of instances of `User` objects instead of plain javascript objects? -Solution is to create new instances of User object and manually copy all properties to new objects. -But things may go wrong very fast once you have a more complex object hierarchy. - -Alternatives? Yes, you can use class-transformer. Purpose of this library is to help you to map you plain javascript -objects to the instances of classes you have. - -This library also great for models exposed in your APIs, -because it provides a great tooling to control what your models are exposing in your API. -Here is example how it will look like: - -```typescript -fetch("users.json").then((users: Object[]) => { - const realUsers = plainToClass(User, users); - // now each user in realUsers is instance of User class -}); -``` - -Now you can use `users[0].getName()` and `users[0].isAdult()` methods. - -## Installation - -### Node.js - -1. Install module: - - `npm install class-transformer --save` - -2. `reflect-metadata` shim is required, install it too: - - `npm install reflect-metadata --save` - - and make sure to import it in a global place, like app.ts: - - ```typescript - import "reflect-metadata"; - ``` - -3. ES6 features are used, if you are using old version of node.js you may need to install es6-shim: - - `npm install es6-shim --save` - - and import it in a global place like app.ts: - - ```typescript - import "es6-shim"; - ``` - -### Browser - -1. Install module: - - `npm install class-transformer --save` - -2. `reflect-metadata` shim is required, install it too: - - `npm install reflect-metadata --save` - - add ` - - - - ``` - - If you are using angular 2 you should already have this shim installed. - -3. If you are using system.js you may want to add this into `map` and `package` config: - - ```json - { - "map": { - "class-transformer": "node_modules/class-transformer" - }, - "packages": { - "class-transformer": { "main": "index.js", "defaultExtension": "js" } - } - } - ``` - -## Methods - -### plainToClass - -This method transforms a plain javascript object to instance of specific class. - -```typescript -import {plainToClass} from "class-transformer"; - -let users = plainToClass(User, userJson); // to convert user plain object a single user. also supports arrays -``` - -### plainToClassFromExist - -This method transforms a plain object into a instance using a already filled Object which is a instance from the target class. - -```typescript -const defaultUser = new User(); -defaultUser.role = 'user'; - -let mixedUser = plainToClassFromExist(defaultUser, user); // mixed user should have the value role = user when no value is set otherwise. -``` - -### classToPlain - -This method transforms your class object back to plain javascript object, that can be `JSON.stringify` later. - -```typescript -import {classToPlain} from "class-transformer"; -let photo = classToPlain(photo); -``` - -### classToClass - -This method transforms your class object into new instance of the class object. -This maybe treated as deep clone of your objects. - -```typescript -import {classToClass} from "class-transformer"; -let photo = classToClass(photo); -``` - -You can also use a `ignoreDecorators` option in transformation options to ignore all decorators you classes is using. - -### serialize - -You can serialize your model right to the json using `serialize` method: - -```typescript -import {serialize} from "class-transformer"; -let photo = serialize(photo); -``` - -`serialize` works with both arrays and non-arrays. - -### deserialize and deserializeArray - -You can deserialize your model to from a json using `deserialize` method: - -```typescript -import {deserialize} from "class-transformer"; -let photo = deserialize(Photo, photo); -``` - -To make deserialization to work with arrays use `deserializeArray` method: - -```typescript -import {deserializeArray} from "class-transformer"; -let photos = deserializeArray(Photo, photos); -``` - -## Enforcing type-safe instance - -The default behaviour of the `plainToClass` method is to set *all* properties from the plain object, -even those which are not specified in the class. - -```typescript -import {plainToClass} from "class-transformer"; - -class User { - id: number - firstName: string - lastName: string -} - -const fromPlainUser = { - unkownProp: 'hello there', - firstName: 'Umed', - lastName: 'Khudoiberdiev', -} - -console.log(plainToClass(User, fromPlainUser)) - -// User { -// unkownProp: 'hello there', -// firstName: 'Umed', -// lastName: 'Khudoiberdiev', -// } -``` - -If this behaviour does not suit your needs, you can use the `excludeExtraneousValues` option -in the `plainToClass` method while *exposing all your class properties* as a requirement. - -```typescript -import {Expose, plainToClass} from "class-transformer"; - -class User { - @Expose() id: number; - @Expose() firstName: string; - @Expose() lastName: string; -} - -const fromPlainUser = { - unkownProp: 'hello there', - firstName: 'Umed', - lastName: 'Khudoiberdiev', -} - -console.log(plainToClass(User, fromPlainUser, { excludeExtraneousValues: true })) - -// User { -// id: undefined, -// firstName: 'Umed', -// lastName: 'Khudoiberdiev' -// } -``` - -## Working with nested objects - -When you are trying to transform objects that have nested objects, -its required to known what type of object you are trying to transform. -Since Typescript does not have good reflection abilities yet, -we should implicitly specify what type of object each property contain. -This is done using `@Type` decorator. - -Lets say we have an album with photos. -And we are trying to convert album plain object to class object: - -```typescript -import {Type, plainToClass} from "class-transformer"; - -export class Album { - - id: number; - - name: string; - - @Type(() => Photo) - photos: Photo[]; -} - -export class Photo { - id: number; - filename: string; -} - -let album = plainToClass(Album, albumJson); -// now album is Album object with Photo objects inside -``` - -### Providing more than one type option - -In case the nested object can be of different types, you can provide an additional options object, -that specifies a discriminator. The discriminator option must define a `property` that holds the sub -type name for the object and the possible `subTypes`, the nested object can converted to. A sub type -has a `value`, that holds the constructor of the Type and the `name`, that can match with the `property` -of the discriminator. - -Lets say we have an album that has a top photo. But this photo can be of certain different types. -And we are trying to convert album plain object to class object. The plain object input has to define -the additional property `__type`. This property is removed during transformation by default: - -**JSON input**: -```json -{ - "id": 1, - "name": "foo", - "topPhoto": { - "id": 9, - "filename": "cool_wale.jpg", - "depth": 1245, - "__type": "underwater" - } -} -``` - -```typescript -import {Type, plainToClass} from "class-transformer"; - -export abstract class Photo { - id: number; - filename: string; -} - -export class Landscape extends Photo { - panorama: boolean; -} - -export class Portrait extends Photo { - person: Person; -} - -export class UnderWater extends Photo { - depth: number; -} - -export class Album { - - id: number; - name: string; - - @Type(() => Photo, { - discriminator: { - property: "__type", - subTypes: [ - { value: Landscape, name: "landscape" }, - { value: Portrait, name: "portrait" }, - { value: UnderWater, name: "underwater" } - ] - } - }) - topPhoto: Landscape | Portrait | UnderWater; - -} - -let album = plainToClass(Album, albumJson); -// now album is Album object with a UnderWater object without `__type` property. -``` - -Hint: The same applies for arrays with different sub types. Moreover you can specify `keepDiscriminatorProperty: true` -in the options to keep the discriminator property also inside your resulting class. - -## Exposing getters and method return values - -You can expose what your getter or method return by setting a `@Expose()` decorator to those getters or methods: - -```typescript -import {Expose} from "class-transformer"; - -export class User { - - id: number; - firstName: string; - lastName: string; - password: string; - - @Expose() - get name() { - return this.firstName + " " + this.lastName; - } - - @Expose() - getFullName() { - return this.firstName + " " + this.lastName; - } -} -``` - -## Exposing properties with different names - -If you want to expose some of properties with a different name, -you can do it by specifying a `name` option to `@Expose` decorator: - -```typescript -import {Expose} from "class-transformer"; - -export class User { - - @Expose({ name: "uid" }) - id: number; - - firstName: string; - - lastName: string; - - @Expose({ name: "secretKey" }) - password: string; - - @Expose({ name: "fullName" }) - getFullName() { - return this.firstName + " " + this.lastName; - } -} -``` - -## Skipping specific properties - -Sometimes you want to skip some properties during transformation. -This can be done using `@Exclude` decorator: - -```typescript -import {Exclude} from "class-transformer"; - -export class User { - - id: number; - - email: string; - - @Exclude() - password: string; -} -``` - -Now when you transform a User, `password` property will be skipped and not be included in the transformed result. - -## Skipping depend of operation - -You can control on what operation you will exclude a property. Use `toClassOnly` or `toPlainOnly` options: - -```typescript -import {Exclude} from "class-transformer"; - -export class User { - - id: number; - - email: string; - - @Exclude({ toPlainOnly: true }) - password: string; -} -``` - -Now `password` property will be excluded only during `classToPlain` operation. Oppositely, use `toClassOnly` option. - -## Skipping all properties of the class - -You can skip all properties of the class, and expose only those are needed explicitly: - -```typescript -import {Exclude, Expose} from "class-transformer"; - -@Exclude() -export class User { - - @Expose() - id: number; - - @Expose() - email: string; - - password: string; -} -``` - -Now `id` and `email` will be exposed, and password will be excluded during transformation. -Alternatively, you can set exclusion strategy during transformation: - -```typescript -import {classToPlain} from "class-transformer"; -let photo = classToPlain(photo, { strategy: "excludeAll" }); -``` - -In this case you don't need to `@Exclude()` a whole class. - -## Skipping private properties, or some prefixed properties - -If you name your private properties with a prefix, lets say with `_`, -then you can exclude such properties from transformation too: - -```typescript -import {classToPlain} from "class-transformer"; -let photo = classToPlain(photo, { excludePrefixes: ["_"] }); -``` - -This will skip all properties that start with `_` prefix. -You can pass any number of prefixes and all properties that begin with these prefixes will be ignored. -For example: - -```typescript -import {Expose, classToPlain} from "class-transformer"; - -export class User { - - id: number; - private _firstName: string; - private _lastName: string; - _password: string; - - setName(firstName: string, lastName: string) { - this._firstName = firstName; - this._lastName = lastName; - } - - @Expose() - get name() { - return this._firstName + " " + this._lastName; - } - -} - -const user = new User(); -user.id = 1; -user.setName("Johny", "Cage"); -user._password = "123"; - -const plainUser = classToPlain(user, { excludePrefixes: ["_"] }); -// here plainUser will be equal to -// { id: 1, name: "Johny Cage" } -``` - -## Using groups to control excluded properties - -You can use groups to control what data will be exposed and what will not be: - -```typescript -import {Exclude, Expose, classToPlain} from "class-transformer"; - -export class User { - - id: number; - - name: string; - - @Expose({ groups: ["user", "admin"] }) // this means that this data will be exposed only to users and admins - email: string; - - @Expose({ groups: ["user"] }) // this means that this data will be exposed only to users - password: string; -} - -let user1 = classToPlain(user, { groups: ["user"] }); // will contain id, name, email and password -let user2 = classToPlain(user, { groups: ["admin"] }); // will contain id, name and email -``` - -## Using versioning to control exposed and excluded properties - -If you are building an API that has different versions, class-transformer has extremely useful tools for that. -You can control which properties of your model should be exposed or excluded in what version. Example: - -```typescript -import {Exclude, Expose, classToPlain} from "class-transformer"; - -export class User { - - id: number; - - name: string; - - @Expose({ since: 0.7, until: 1 }) // this means that this property will be exposed for version starting from 0.7 until 1 - email: string; - - @Expose({ since: 2.1 }) // this means that this property will be exposed for version starting from 2.1 - password: string; -} - -let user1 = classToPlain(user, { version: 0.5 }); // will contain id and name -let user2 = classToPlain(user, { version: 0.7 }); // will contain id, name and email -let user3 = classToPlain(user, { version: 1 }); // will contain id and name -let user4 = classToPlain(user, { version: 2 }); // will contain id and name -let user5 = classToPlain(user, { version: 2.1 }); // will contain id, name and password -``` - -## Сonverting date strings into Date objects - -Sometimes you have a Date in your plain javascript object received in a string format. -And you want to create a real javascript Date object from it. -You can do it simply by passing a Date object to the `@Type` decorator: - -```typescript -import {Type} from "class-transformer"; - -export class User { - - id: number; - - email: string; - - password: string; - - @Type(() => Date) - registrationDate: Date; -} -``` - -Note, that dates will be converted to strings when you'll try to convert class object to plain object. - -Same technique can be used with `Number`, `String`, `Boolean` -primitive types when you want to convert your values into these types. - -## Working with arrays - -When you are using arrays you must provide a type of the object that array contains. -This type, you specify in a `@Type()` decorator: - -```typescript -import {Type} from "class-transformer"; - -export class Photo { - - id: number; - - name: string; - - @Type(() => Album) - albums: Album[]; -} -``` - -You can also use custom array types: - -```typescript -import {Type} from "class-transformer"; - -export class AlbumCollection extends Array { - // custom array functions ... -} - -export class Photo { - - id: number; - - name: string; - - @Type(() => Album) - albums: AlbumCollection; -} -``` - -Library will handle proper transformation automatically. - -ES6 collections `Set` and `Map` also require the `@Type` decorator: - -```typescript -export class Skill { - name: string; -} - -export class Weapon { - name: string; - range: number; -} - -export class Player { - name: string; - - @Type(() => Skill) - skills: Set; - - @Type(() => Weapon) - weapons: Map; -} -``` - -## Additional data transformation - -### Basic usage - -You can perform additional data transformation using `@Transform` decorator. -For example, you want to make your `Date` object to be a `moment` object when you are -transforming object from plain to class: - -```typescript -import {Transform} from "class-transformer"; -import * as moment from "moment"; -import {Moment} from "moment"; - -export class Photo { - - id: number; - - @Type(() => Date) - @Transform(value => moment(value), { toClassOnly: true }) - date: Moment; -} -``` - -Now when you call `plainToClass` and send a plain representation of the Photo object, -it will convert a date value in your photo object to moment date. -`@Transform` decorator also supports groups and versioning. - -### Advanced usage - -The `@Transform` decorator is given more arguments to let you configure how you want the transformation to be done. - -``` -@Transform((value, obj, type) => value) -``` - -| Argument | Description -|--------------------|---------------------------------------------------------------------------------| -| `value` | The property value before the transformation. -| `obj` | The transformation source object. -| `type` | The transformation type. - -## Other decorators -| Signature | Example | Description -|--------------------|------------------------------------------|---------------------------------------------| -| `@TransformClassToPlain` | `@TransformClassToPlain({ groups: ["user"] })` | Transform the method return with classToPlain and expose the properties on the class. -| `@TransformClassToClass` | `@TransformClassToClass({ groups: ["user"] })` | Transform the method return with classToClass and expose the properties on the class. -| `@TransformPlainToClass` | `@TransformPlainToClass(User, { groups: ["user"] })` | Transform the method return with plainToClass and expose the properties on the class. - -The above decorators accept one optional argument: -ClassTransformOptions - The transform options like groups, version, name - -An example: - -```typescript -@Exclude() -class User { - - id: number; - - @Expose() - firstName: string; - - @Expose() - lastName: string; - - @Expose({ groups: ['user.email'] }) - email: string; - - password: string; -} - -class UserController { - - @TransformClassToPlain({ groups: ['user.email'] }) - getUser() { - const user = new User(); - user.firstName = "Snir"; - user.lastName = "Segal"; - user.password = "imnosuperman"; - - return user; - } -} - -const controller = new UserController(); -const user = controller.getUser(); -``` - -the `user` variable will contain only firstName,lastName, email properties becuase they are -the exposed variables. email property is also exposed becuase we metioned the group "user.email". - -## Working with generics - -Generics are not supported because TypeScript does not have good reflection abilities yet. -Once TypeScript team provide us better runtime type reflection tools, generics will be implemented. -There are some tweaks however you can use, that maybe can solve your problem. -[Checkout this example.](https://github.com/pleerock/class-transformer/tree/master/sample/sample4-generics) - -## Implicit type conversion - -> **NOTE** If you use class-validator together with class-transformer you propably DON'T want to enable this function. - -Enables automatic conversion between built-in types based on type information provided by Typescript. Disabled by default. - -```ts -import { IsString } from 'class-validator' - -class MyPayload { - - @IsString() - prop: string -} - - -const result1 = plainToClass(MyPayload, { prop: 1234 }, { enableImplicitConversion: true }); -const result2 = plainToClass(MyPayload, { prop: 1234 }, { enableImplicitConversion: false }); - -/** - * result1 will be `{ prop: "1234" }` - notice how the prop value has been converted to string. - * result2 will be `{ prop: 1234 }` - default behaviour - */ -``` - -## How does it handle circular references? - -Circular references are ignored. -For example, if you are transforming class `User` that contains property `photos` with type of `Photo`, - and `Photo` contains link `user` to its parent `User`, then `user` will be ignored during transformation. -Circular references are not ignored only during `classToClass` operation. - -## Example with Angular2 - -Lets say you want to download users and want them automatically to be mapped to the instances of `User` class. - -```typescript -import {plainToClass} from "class-transformer"; - -this.http - .get("users.json") - .map(res => res.json()) - .map(res => plainToClass(User, res as Object[])) - .subscribe(users => { - // now "users" is type of User[] and each user has getName() and isAdult() methods available - console.log(users); - }); -``` - -You can also inject a class `ClassTransformer` as a service in `providers`, and use its methods. - -Example how to use with angular 2 in [plunker](http://plnkr.co/edit/Mja1ZYAjVySWASMHVB9R). -Source code is [here](https://github.com/pleerock/class-transformer-demo). - -## Samples - -Take a look on samples in [./sample](https://github.com/pleerock/class-transformer/tree/master/sample) for more examples of -usages. - -## Release notes - -See information about breaking changes and release notes [here](https://github.com/typestack/class-transformer/blob/master/CHANGELOG.md). +# class-transformer + +![Build Status](https://github.com/typestack/class-transformer/workflows/CI/badge.svg) +[![codecov](https://codecov.io/gh/typestack/class-transformer/branch/master/graph/badge.svg)](https://codecov.io/gh/typestack/class-transformer) +[![npm version](https://badge.fury.io/js/class-transformer.svg)](https://badge.fury.io/js/class-transformer) + +Its ES6 and Typescript era. Nowadays you are working with classes and constructor objects more then ever. +Class-transformer allows you to transform plain object to some instance of class and versa. +Also it allows to serialize / deserialize object based on criteria. +This tool is super useful on both frontend and backend. + +Example how to use with angular 2 in [plunker](http://plnkr.co/edit/Mja1ZYAjVySWASMHVB9R). +Source code is available [here](https://github.com/pleerock/class-transformer-demo). + +- [What is class-transformer](#what-is-class-transformer) +- [Installation](#installation) + - [Node.js](#nodejs) + - [Browser](#browser) +- [Methods](#methods) + - [plainToClass](#plaintoclass) + - [plainToClassFromExist](#plaintoclassfromexist) + - [classToPlain](#classtoplain) + - [classToClass](#classtoclass) + - [serialize](#serialize) + - [deserialize and deserializeArray](#deserialize-and-deserializearray) +- [Enforcing type-safe instance](#enforcing-type-safe-instance) +- [Working with nested objects](#working-with-nested-objects) + - [Providing more than one type option](#providing-more-than-one-type-option) +- [Exposing getters and method return values](#exposing-getters-and-method-return-values) +- [Exposing properties with different names](#exposing-properties-with-different-names) +- [Skipping specific properties](#skipping-specific-properties) +- [Skipping depend of operation](#skipping-depend-of-operation) +- [Skipping all properties of the class](#skipping-all-properties-of-the-class) +- [Skipping private properties, or some prefixed properties](#skipping-private-properties-or-some-prefixed-properties) +- [Using groups to control excluded properties](#using-groups-to-control-excluded-properties) +- [Using versioning to control exposed and excluded properties](#using-versioning-to-control-exposed-and-excluded-properties) +- [Сonverting date strings into Date objects](#сonverting-date-strings-into-date-objects) +- [Working with arrays](#working-with-arrays) +- [Additional data transformation](#additional-data-transformation) + - [Basic usage](#basic-usage) + - [Advanced usage](#advanced-usage) +- [Other decorators](#other-decorators) +- [Working with generics](#working-with-generics) +- [Implicit type conversion](#implicit-type-conversion) +- [How does it handle circular references?](#how-does-it-handle-circular-references) +- [Example with Angular2](#example-with-angular2) +- [Samples](#samples) +- [Release notes](#release-notes) + +## What is class-transformer + +In JavaScript there are two types of objects: + +- plain (literal) objects +- class (constructor) objects + +Plain objects are objects that are instances of `Object` class. +Sometimes they are called **literal** objects, when created via `{}` notation. +Class objects are instances of classes with own defined constructor, properties and methods. +Usually you define them via `class` notation. + +So, what is the problem? + +Sometimes you want to transform plain javascript object to the ES6 **classes** you have. +For example, if you are loading a json from your backend, some api or from a json file, +and after you `JSON.parse` it you have a plain javascript object, not instance of class you have. + +For example you have a list of users in your `users.json` that you are loading: + +```json +[ + { + "id": 1, + "firstName": "Johny", + "lastName": "Cage", + "age": 27 + }, + { + "id": 2, + "firstName": "Ismoil", + "lastName": "Somoni", + "age": 50 + }, + { + "id": 3, + "firstName": "Luke", + "lastName": "Dacascos", + "age": 12 + } +] +``` + +And you have a `User` class: + +```typescript +export class User { + id: number; + firstName: string; + lastName: string; + age: number; + + getName() { + return this.firstName + ' ' + this.lastName; + } + + isAdult() { + return this.age > 36 && this.age < 60; + } +} +``` + +You are assuming that you are downloading users of type `User` from `users.json` file and may want to write +following code: + +```typescript +fetch('users.json').then((users: User[]) => { + // you can use users here, and type hinting also will be available to you, + // but users are not actually instances of User class + // this means that you can't use methods of User class +}); +``` + +In this code you can use `users[0].id`, you can also use `users[0].firstName` and `users[0].lastName`. +However you cannot use `users[0].getName()` or `users[0].isAdult()` because "users" actually is +array of plain javascript objects, not instances of User object. +You actually lied to compiler when you said that its `users: User[]`. + +So what to do? How to make a `users` array of instances of `User` objects instead of plain javascript objects? +Solution is to create new instances of User object and manually copy all properties to new objects. +But things may go wrong very fast once you have a more complex object hierarchy. + +Alternatives? Yes, you can use class-transformer. Purpose of this library is to help you to map you plain javascript +objects to the instances of classes you have. + +This library also great for models exposed in your APIs, +because it provides a great tooling to control what your models are exposing in your API. +Here is example how it will look like: + +```typescript +fetch('users.json').then((users: Object[]) => { + const realUsers = plainToClass(User, users); + // now each user in realUsers is instance of User class +}); +``` + +Now you can use `users[0].getName()` and `users[0].isAdult()` methods. + +## Installation + +### Node.js + +1. Install module: + + `npm install class-transformer --save` + +2. `reflect-metadata` shim is required, install it too: + + `npm install reflect-metadata --save` + + and make sure to import it in a global place, like app.ts: + + ```typescript + import 'reflect-metadata'; + ``` + +3. ES6 features are used, if you are using old version of node.js you may need to install es6-shim: + + `npm install es6-shim --save` + + and import it in a global place like app.ts: + + ```typescript + import 'es6-shim'; + ``` + +### Browser + +1. Install module: + + `npm install class-transformer --save` + +2. `reflect-metadata` shim is required, install it too: + + `npm install reflect-metadata --save` + + add ` + + + + ``` + + If you are using angular 2 you should already have this shim installed. + +3. If you are using system.js you may want to add this into `map` and `package` config: + + ```json + { + "map": { + "class-transformer": "node_modules/class-transformer" + }, + "packages": { + "class-transformer": { "main": "index.js", "defaultExtension": "js" } + } + } + ``` + +## Methods + +### plainToClass + +This method transforms a plain javascript object to instance of specific class. + +```typescript +import { plainToClass } from 'class-transformer'; + +let users = plainToClass(User, userJson); // to convert user plain object a single user. also supports arrays +``` + +### plainToClassFromExist + +This method transforms a plain object into a instance using a already filled Object which is a instance from the target class. + +```typescript +const defaultUser = new User(); +defaultUser.role = 'user'; + +let mixedUser = plainToClassFromExist(defaultUser, user); // mixed user should have the value role = user when no value is set otherwise. +``` + +### classToPlain + +This method transforms your class object back to plain javascript object, that can be `JSON.stringify` later. + +```typescript +import { classToPlain } from 'class-transformer'; +let photo = classToPlain(photo); +``` + +### classToClass + +This method transforms your class object into new instance of the class object. +This maybe treated as deep clone of your objects. + +```typescript +import { classToClass } from 'class-transformer'; +let photo = classToClass(photo); +``` + +You can also use a `ignoreDecorators` option in transformation options to ignore all decorators you classes is using. + +### serialize + +You can serialize your model right to the json using `serialize` method: + +```typescript +import { serialize } from 'class-transformer'; +let photo = serialize(photo); +``` + +`serialize` works with both arrays and non-arrays. + +### deserialize and deserializeArray + +You can deserialize your model to from a json using `deserialize` method: + +```typescript +import { deserialize } from 'class-transformer'; +let photo = deserialize(Photo, photo); +``` + +To make deserialization to work with arrays use `deserializeArray` method: + +```typescript +import { deserializeArray } from 'class-transformer'; +let photos = deserializeArray(Photo, photos); +``` + +## Enforcing type-safe instance + +The default behaviour of the `plainToClass` method is to set _all_ properties from the plain object, +even those which are not specified in the class. + +```typescript +import { plainToClass } from 'class-transformer'; + +class User { + id: number; + firstName: string; + lastName: string; +} + +const fromPlainUser = { + unkownProp: 'hello there', + firstName: 'Umed', + lastName: 'Khudoiberdiev', +}; + +console.log(plainToClass(User, fromPlainUser)); + +// User { +// unkownProp: 'hello there', +// firstName: 'Umed', +// lastName: 'Khudoiberdiev', +// } +``` + +If this behaviour does not suit your needs, you can use the `excludeExtraneousValues` option +in the `plainToClass` method while _exposing all your class properties_ as a requirement. + +```typescript +import { Expose, plainToClass } from 'class-transformer'; + +class User { + @Expose() id: number; + @Expose() firstName: string; + @Expose() lastName: string; +} + +const fromPlainUser = { + unkownProp: 'hello there', + firstName: 'Umed', + lastName: 'Khudoiberdiev', +}; + +console.log(plainToClass(User, fromPlainUser, { excludeExtraneousValues: true })); + +// User { +// id: undefined, +// firstName: 'Umed', +// lastName: 'Khudoiberdiev' +// } +``` + +## Working with nested objects + +When you are trying to transform objects that have nested objects, +its required to known what type of object you are trying to transform. +Since Typescript does not have good reflection abilities yet, +we should implicitly specify what type of object each property contain. +This is done using `@Type` decorator. + +Lets say we have an album with photos. +And we are trying to convert album plain object to class object: + +```typescript +import { Type, plainToClass } from 'class-transformer'; + +export class Album { + id: number; + + name: string; + + @Type(() => Photo) + photos: Photo[]; +} + +export class Photo { + id: number; + filename: string; +} + +let album = plainToClass(Album, albumJson); +// now album is Album object with Photo objects inside +``` + +### Providing more than one type option + +In case the nested object can be of different types, you can provide an additional options object, +that specifies a discriminator. The discriminator option must define a `property` that holds the sub +type name for the object and the possible `subTypes`, the nested object can converted to. A sub type +has a `value`, that holds the constructor of the Type and the `name`, that can match with the `property` +of the discriminator. + +Lets say we have an album that has a top photo. But this photo can be of certain different types. +And we are trying to convert album plain object to class object. The plain object input has to define +the additional property `__type`. This property is removed during transformation by default: + +**JSON input**: + +```json +{ + "id": 1, + "name": "foo", + "topPhoto": { + "id": 9, + "filename": "cool_wale.jpg", + "depth": 1245, + "__type": "underwater" + } +} +``` + +```typescript +import { Type, plainToClass } from 'class-transformer'; + +export abstract class Photo { + id: number; + filename: string; +} + +export class Landscape extends Photo { + panorama: boolean; +} + +export class Portrait extends Photo { + person: Person; +} + +export class UnderWater extends Photo { + depth: number; +} + +export class Album { + id: number; + name: string; + + @Type(() => Photo, { + discriminator: { + property: '__type', + subTypes: [ + { value: Landscape, name: 'landscape' }, + { value: Portrait, name: 'portrait' }, + { value: UnderWater, name: 'underwater' }, + ], + }, + }) + topPhoto: Landscape | Portrait | UnderWater; +} + +let album = plainToClass(Album, albumJson); +// now album is Album object with a UnderWater object without `__type` property. +``` + +Hint: The same applies for arrays with different sub types. Moreover you can specify `keepDiscriminatorProperty: true` +in the options to keep the discriminator property also inside your resulting class. + +## Exposing getters and method return values + +You can expose what your getter or method return by setting a `@Expose()` decorator to those getters or methods: + +```typescript +import { Expose } from 'class-transformer'; + +export class User { + id: number; + firstName: string; + lastName: string; + password: string; + + @Expose() + get name() { + return this.firstName + ' ' + this.lastName; + } + + @Expose() + getFullName() { + return this.firstName + ' ' + this.lastName; + } +} +``` + +## Exposing properties with different names + +If you want to expose some of properties with a different name, +you can do it by specifying a `name` option to `@Expose` decorator: + +```typescript +import { Expose } from 'class-transformer'; + +export class User { + @Expose({ name: 'uid' }) + id: number; + + firstName: string; + + lastName: string; + + @Expose({ name: 'secretKey' }) + password: string; + + @Expose({ name: 'fullName' }) + getFullName() { + return this.firstName + ' ' + this.lastName; + } +} +``` + +## Skipping specific properties + +Sometimes you want to skip some properties during transformation. +This can be done using `@Exclude` decorator: + +```typescript +import { Exclude } from 'class-transformer'; + +export class User { + id: number; + + email: string; + + @Exclude() + password: string; +} +``` + +Now when you transform a User, `password` property will be skipped and not be included in the transformed result. + +## Skipping depend of operation + +You can control on what operation you will exclude a property. Use `toClassOnly` or `toPlainOnly` options: + +```typescript +import { Exclude } from 'class-transformer'; + +export class User { + id: number; + + email: string; + + @Exclude({ toPlainOnly: true }) + password: string; +} +``` + +Now `password` property will be excluded only during `classToPlain` operation. Oppositely, use `toClassOnly` option. + +## Skipping all properties of the class + +You can skip all properties of the class, and expose only those are needed explicitly: + +```typescript +import { Exclude, Expose } from 'class-transformer'; + +@Exclude() +export class User { + @Expose() + id: number; + + @Expose() + email: string; + + password: string; +} +``` + +Now `id` and `email` will be exposed, and password will be excluded during transformation. +Alternatively, you can set exclusion strategy during transformation: + +```typescript +import { classToPlain } from 'class-transformer'; +let photo = classToPlain(photo, { strategy: 'excludeAll' }); +``` + +In this case you don't need to `@Exclude()` a whole class. + +## Skipping private properties, or some prefixed properties + +If you name your private properties with a prefix, lets say with `_`, +then you can exclude such properties from transformation too: + +```typescript +import { classToPlain } from 'class-transformer'; +let photo = classToPlain(photo, { excludePrefixes: ['_'] }); +``` + +This will skip all properties that start with `_` prefix. +You can pass any number of prefixes and all properties that begin with these prefixes will be ignored. +For example: + +```typescript +import { Expose, classToPlain } from 'class-transformer'; + +export class User { + id: number; + private _firstName: string; + private _lastName: string; + _password: string; + + setName(firstName: string, lastName: string) { + this._firstName = firstName; + this._lastName = lastName; + } + + @Expose() + get name() { + return this._firstName + ' ' + this._lastName; + } +} + +const user = new User(); +user.id = 1; +user.setName('Johny', 'Cage'); +user._password = '123'; + +const plainUser = classToPlain(user, { excludePrefixes: ['_'] }); +// here plainUser will be equal to +// { id: 1, name: "Johny Cage" } +``` + +## Using groups to control excluded properties + +You can use groups to control what data will be exposed and what will not be: + +```typescript +import { Exclude, Expose, classToPlain } from 'class-transformer'; + +export class User { + id: number; + + name: string; + + @Expose({ groups: ['user', 'admin'] }) // this means that this data will be exposed only to users and admins + email: string; + + @Expose({ groups: ['user'] }) // this means that this data will be exposed only to users + password: string; +} + +let user1 = classToPlain(user, { groups: ['user'] }); // will contain id, name, email and password +let user2 = classToPlain(user, { groups: ['admin'] }); // will contain id, name and email +``` + +## Using versioning to control exposed and excluded properties + +If you are building an API that has different versions, class-transformer has extremely useful tools for that. +You can control which properties of your model should be exposed or excluded in what version. Example: + +```typescript +import { Exclude, Expose, classToPlain } from 'class-transformer'; + +export class User { + id: number; + + name: string; + + @Expose({ since: 0.7, until: 1 }) // this means that this property will be exposed for version starting from 0.7 until 1 + email: string; + + @Expose({ since: 2.1 }) // this means that this property will be exposed for version starting from 2.1 + password: string; +} + +let user1 = classToPlain(user, { version: 0.5 }); // will contain id and name +let user2 = classToPlain(user, { version: 0.7 }); // will contain id, name and email +let user3 = classToPlain(user, { version: 1 }); // will contain id and name +let user4 = classToPlain(user, { version: 2 }); // will contain id and name +let user5 = classToPlain(user, { version: 2.1 }); // will contain id, name and password +``` + +## Сonverting date strings into Date objects + +Sometimes you have a Date in your plain javascript object received in a string format. +And you want to create a real javascript Date object from it. +You can do it simply by passing a Date object to the `@Type` decorator: + +```typescript +import { Type } from 'class-transformer'; + +export class User { + id: number; + + email: string; + + password: string; + + @Type(() => Date) + registrationDate: Date; +} +``` + +Note, that dates will be converted to strings when you'll try to convert class object to plain object. + +Same technique can be used with `Number`, `String`, `Boolean` +primitive types when you want to convert your values into these types. + +## Working with arrays + +When you are using arrays you must provide a type of the object that array contains. +This type, you specify in a `@Type()` decorator: + +```typescript +import { Type } from 'class-transformer'; + +export class Photo { + id: number; + + name: string; + + @Type(() => Album) + albums: Album[]; +} +``` + +You can also use custom array types: + +```typescript +import { Type } from 'class-transformer'; + +export class AlbumCollection extends Array { + // custom array functions ... +} + +export class Photo { + id: number; + + name: string; + + @Type(() => Album) + albums: AlbumCollection; +} +``` + +Library will handle proper transformation automatically. + +ES6 collections `Set` and `Map` also require the `@Type` decorator: + +```typescript +export class Skill { + name: string; +} + +export class Weapon { + name: string; + range: number; +} + +export class Player { + name: string; + + @Type(() => Skill) + skills: Set; + + @Type(() => Weapon) + weapons: Map; +} +``` + +## Additional data transformation + +### Basic usage + +You can perform additional data transformation using `@Transform` decorator. +For example, you want to make your `Date` object to be a `moment` object when you are +transforming object from plain to class: + +```typescript +import { Transform } from 'class-transformer'; +import * as moment from 'moment'; +import { Moment } from 'moment'; + +export class Photo { + id: number; + + @Type(() => Date) + @Transform(value => moment(value), { toClassOnly: true }) + date: Moment; +} +``` + +Now when you call `plainToClass` and send a plain representation of the Photo object, +it will convert a date value in your photo object to moment date. +`@Transform` decorator also supports groups and versioning. + +### Advanced usage + +The `@Transform` decorator is given more arguments to let you configure how you want the transformation to be done. + +``` +@Transform((value, obj, type) => value) +``` + +| Argument | Description | +| -------- | --------------------------------------------- | +| `value` | The property value before the transformation. | +| `obj` | The transformation source object. | +| `type` | The transformation type. | + +## Other decorators + +| Signature | Example | Description | +| ------------------------ | ---------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `@TransformClassToPlain` | `@TransformClassToPlain({ groups: ["user"] })` | Transform the method return with classToPlain and expose the properties on the class. | +| `@TransformClassToClass` | `@TransformClassToClass({ groups: ["user"] })` | Transform the method return with classToClass and expose the properties on the class. | +| `@TransformPlainToClass` | `@TransformPlainToClass(User, { groups: ["user"] })` | Transform the method return with plainToClass and expose the properties on the class. | + +The above decorators accept one optional argument: +ClassTransformOptions - The transform options like groups, version, name + +An example: + +```typescript +@Exclude() +class User { + id: number; + + @Expose() + firstName: string; + + @Expose() + lastName: string; + + @Expose({ groups: ['user.email'] }) + email: string; + + password: string; +} + +class UserController { + @TransformClassToPlain({ groups: ['user.email'] }) + getUser() { + const user = new User(); + user.firstName = 'Snir'; + user.lastName = 'Segal'; + user.password = 'imnosuperman'; + + return user; + } +} + +const controller = new UserController(); +const user = controller.getUser(); +``` + +the `user` variable will contain only firstName,lastName, email properties becuase they are +the exposed variables. email property is also exposed becuase we metioned the group "user.email". + +## Working with generics + +Generics are not supported because TypeScript does not have good reflection abilities yet. +Once TypeScript team provide us better runtime type reflection tools, generics will be implemented. +There are some tweaks however you can use, that maybe can solve your problem. +[Checkout this example.](https://github.com/pleerock/class-transformer/tree/master/sample/sample4-generics) + +## Implicit type conversion + +> **NOTE** If you use class-validator together with class-transformer you propably DON'T want to enable this function. + +Enables automatic conversion between built-in types based on type information provided by Typescript. Disabled by default. + +```ts +import { IsString } from 'class-validator'; + +class MyPayload { + @IsString() + prop: string; +} + +const result1 = plainToClass(MyPayload, { prop: 1234 }, { enableImplicitConversion: true }); +const result2 = plainToClass(MyPayload, { prop: 1234 }, { enableImplicitConversion: false }); + +/** + * result1 will be `{ prop: "1234" }` - notice how the prop value has been converted to string. + * result2 will be `{ prop: 1234 }` - default behaviour + */ +``` + +## How does it handle circular references? + +Circular references are ignored. +For example, if you are transforming class `User` that contains property `photos` with type of `Photo`, +and `Photo` contains link `user` to its parent `User`, then `user` will be ignored during transformation. +Circular references are not ignored only during `classToClass` operation. + +## Example with Angular2 + +Lets say you want to download users and want them automatically to be mapped to the instances of `User` class. + +```typescript +import { plainToClass } from 'class-transformer'; + +this.http + .get('users.json') + .map(res => res.json()) + .map(res => plainToClass(User, res as Object[])) + .subscribe(users => { + // now "users" is type of User[] and each user has getName() and isAdult() methods available + console.log(users); + }); +``` + +You can also inject a class `ClassTransformer` as a service in `providers`, and use its methods. + +Example how to use with angular 2 in [plunker](http://plnkr.co/edit/Mja1ZYAjVySWASMHVB9R). +Source code is [here](https://github.com/pleerock/class-transformer-demo). + +## Samples + +Take a look on samples in [./sample](https://github.com/pleerock/class-transformer/tree/master/sample) for more examples of +usages. + +## Release notes + +See information about breaking changes and release notes [here](https://github.com/typestack/class-transformer/blob/master/CHANGELOG.md). From f324a5b69e8383fe8822fc89dd607f1f3adec5c1 Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 17:30:45 +0200 Subject: [PATCH 19/30] build: add codecov config --- codecov.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 000000000..744284bce --- /dev/null +++ b/codecov.yml @@ -0,0 +1,12 @@ + +coverage: + range: 70..100 + round: down + precision: 2 + status: + default: + threshold: 3 +comment: off +ignore: + - testing/**/*.ts + - src/**/*.interface.ts \ No newline at end of file From 987e14cf32b7260d49213ba85f8d79054d0617a8 Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 17:54:25 +0200 Subject: [PATCH 20/30] build: remove private true from package.json --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 648e41501..9bbacd22e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "description": "Proper decorator-based transformation / serialization / deserialization of plain javascript objects to class constructors", "license": "MIT", "readmeFilename": "README.md", - "private": true, "author": { "name": "Umed Khudoiberdiev", "email": "pleerock.me@gmail.com" From 422ad804889db0882ba7fa7e0a39644f43b8a225 Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 17:56:14 +0200 Subject: [PATCH 21/30] build: remove unused packages --- package-lock.json | 224 ---------------------------------------------- package.json | 22 +++-- 2 files changed, 10 insertions(+), 236 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2edfe10c4..e84e17d5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1472,17 +1472,6 @@ "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" - } - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -1568,20 +1557,6 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "copyfiles": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.2.0.tgz", - "integrity": "sha512-iJbHJI+8OKqsq+4JF0rqgRkZzo++jqO6Wf4FUU1JM41cJF6JcY5968XyF4tm3Kkm7ZOMrqlljdm8N9oyY5raGw==", - "dev": true, - "requires": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^0.5.1", - "noms": "0.0.0", - "through2": "^2.0.1", - "yargs": "^13.2.4" - } - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -2310,15 +2285,6 @@ "to-regex-range": "^5.0.1" } }, - "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" - } - }, "find-versions": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", @@ -2941,12 +2907,6 @@ "is-docker": "^2.0.0" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3955,12 +3915,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/json/-/json-9.0.6.tgz", - "integrity": "sha1-eXLCpaSKQmeNsnMMfCxO5uTiRYU=", - "dev": true - }, "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", @@ -4200,16 +4154,6 @@ } } }, - "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" - } - }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", @@ -4522,16 +4466,6 @@ "which": "^1.3.1" } }, - "noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -4693,15 +4627,6 @@ "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-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -4750,12 +4675,6 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "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", @@ -4891,12 +4810,6 @@ "react-is": "^16.12.0" } }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -5014,18 +4927,6 @@ } } }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, "realpath-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", @@ -5822,12 +5723,6 @@ "strip-ansi": "^5.1.0" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -5956,48 +5851,6 @@ "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" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -6274,12 +6127,6 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -6420,43 +6267,6 @@ "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-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 - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -6502,12 +6312,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "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", @@ -6520,34 +6324,6 @@ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", "dev": true }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "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.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 9bbacd22e..e89fad394 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,16 @@ "object-to-class", "typescript-serializer" ], + "scripts": { + "build": "rimraf build && tsc --project tsconfig.prod.json", + "prettier:fix": "prettier --write \"**/*.{ts,md}\"", + "prettier:check": "prettier --check \"**/*.{ts,md}\"", + "lint:fix": "eslint --max-warnings 0 --fix --ext .ts src/", + "lint:check": "eslint --max-warnings 0 --ext .ts src/", + "test": "jest --coverage --verbose", + "test:watch": "jest --watch", + "test:ci": "jest --runInBand --coverage --verbose" + }, "husky": { "hooks": { "pre-commit": "lint-staged" @@ -51,13 +61,11 @@ "@types/node": "13.11.0", "@typescript-eslint/eslint-plugin": "2.26.0", "@typescript-eslint/parser": "2.26.0", - "copyfiles": "2.2.0", "dayjs": "1.8.23", "eslint": "6.8.0", "eslint-plugin-jest": "23.8.2", "husky": "^4.2.5", "jest": "25.2.7", - "json": "9.0.6", "lint-staged": "^10.2.11", "prettier": "^2.0.5", "reflect-metadata": "0.1.13", @@ -65,15 +73,5 @@ "ts-jest": "25.3.0", "ts-node": "8.8.1", "typescript": "3.8.3" - }, - "scripts": { - "build": "rimraf build && tsc --project tsconfig.prod.json", - "prettier:fix": "prettier --write \"**/*.{ts,md}\"", - "prettier:check": "prettier --check \"**/*.{ts,md}\"", - "lint:fix": "eslint --max-warnings 0 --fix --ext .ts src/", - "lint:check": "eslint --max-warnings 0 --ext .ts src/", - "test": "jest --coverage --verbose", - "test:watch": "jest --watch", - "test:ci": "jest --runInBand --coverage --verbose" } } From d01355462f92b85e535ba0176489fe4471b4042b Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 18:00:23 +0200 Subject: [PATCH 22/30] build: updated dev dependencies to latest --- package-lock.json | 3473 ++++++++++++++++++++++++++++----------------- package.json | 20 +- 2 files changed, 2148 insertions(+), 1345 deletions(-) diff --git a/package-lock.json b/package-lock.json index e84e17d5e..10c5595b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,29 +14,96 @@ } }, "@babel/core": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.3.tgz", - "integrity": "sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/generator": "^7.10.3", - "@babel/helper-module-transforms": "^7.10.1", - "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.3", - "@babel/template": "^7.10.3", - "@babel/traverse": "^7.10.3", - "@babel/types": "^7.10.3", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", + "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.5", + "@babel/types": "^7.10.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.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" + } + }, + "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 + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -48,18 +115,26 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "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" + } } } }, "@babel/generator": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", - "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", "dev": true, "requires": { - "@babel/types": "^7.10.3", + "@babel/types": "^7.10.5", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" }, "dependencies": { @@ -72,102 +147,102 @@ } }, "@babel/helper-function-name": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", - "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.3", - "@babel/template": "^7.10.3", - "@babel/types": "^7.10.3" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", - "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz", - "integrity": "sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz", + "integrity": "sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==", "dev": true, "requires": { - "@babel/types": "^7.10.3" + "@babel/types": "^7.10.5" } }, "@babel/helper-module-imports": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz", - "integrity": "sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", "dev": true, "requires": { - "@babel/types": "^7.10.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-module-transforms": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", - "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz", + "integrity": "sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-replace-supers": "^7.10.1", - "@babel/helper-simple-access": "^7.10.1", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1", - "lodash": "^4.17.13" + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz", - "integrity": "sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "dev": true, "requires": { - "@babel/types": "^7.10.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-plugin-utils": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", - "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, "@babel/helper-replace-supers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", - "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-simple-access": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", - "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "dev": true, "requires": { - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.4" } }, "@babel/helper-validator-identifier": { @@ -177,14 +252,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", - "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", "dev": true, "requires": { - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/highlight": { @@ -251,9 +326,9 @@ } }, "@babel/parser": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", - "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -275,21 +350,21 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", - "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-import-meta": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.1.tgz", - "integrity": "sha512-ypC4jwfIVF72og0dgvEcFRdOM2V9Qm1tu7RGmdZOlhsccyK0wisXmMObGuWEOd5jQ+K9wcIgSNftCpk2vkjUfQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { @@ -302,12 +377,12 @@ } }, "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz", - "integrity": "sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { @@ -320,12 +395,12 @@ } }, "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", - "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { @@ -356,50 +431,212 @@ } }, "@babel/template": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", - "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.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" + } + }, + "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 + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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" + } + } } }, "@babel/traverse": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", - "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/generator": "^7.10.3", - "@babel/helper-function-name": "^7.10.3", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" }, "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.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" + } + }, + "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 + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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" + } } } }, "@babel/types": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", - "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.3", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + } } }, "@bcoe/v8-coverage": { @@ -431,40 +668,6 @@ "resolve-from": "^5.0.0" }, "dependencies": { - "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" - } - }, - "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-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" - } - }, - "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 - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -480,137 +683,269 @@ "dev": true }, "@jest/console": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", - "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.1.0.tgz", + "integrity": "sha512-+0lpTHMd/8pJp+Nd4lyip+/Iyf2dZJvcCqrlkeZQoQid+JlThA4M9vxHtheyrQ99jJTMQam+es4BcvZ5W5cC3A==", "dev": true, "requires": { - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", - "jest-message-util": "^25.5.0", - "jest-util": "^25.5.0", + "@jest/types": "^26.1.0", + "chalk": "^4.0.0", + "jest-message-util": "^26.1.0", + "jest-util": "^26.1.0", "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "@jest/core": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.5.4.tgz", - "integrity": "sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.1.0.tgz", + "integrity": "sha512-zyizYmDJOOVke4OO/De//aiv8b07OwZzL2cfsvWF3q9YssfpcKfcnZAwDY8f+A76xXSMMYe8i/f/LPocLlByfw==", "dev": true, "requires": { - "@jest/console": "^25.5.0", - "@jest/reporters": "^25.5.1", - "@jest/test-result": "^25.5.0", - "@jest/transform": "^25.5.1", - "@jest/types": "^25.5.0", + "@jest/console": "^26.1.0", + "@jest/reporters": "^26.1.0", + "@jest/test-result": "^26.1.0", + "@jest/transform": "^26.1.0", + "@jest/types": "^26.1.0", "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", + "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^25.5.0", - "jest-config": "^25.5.4", - "jest-haste-map": "^25.5.1", - "jest-message-util": "^25.5.0", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.5.1", - "jest-resolve-dependencies": "^25.5.4", - "jest-runner": "^25.5.4", - "jest-runtime": "^25.5.4", - "jest-snapshot": "^25.5.1", - "jest-util": "^25.5.0", - "jest-validate": "^25.5.0", - "jest-watcher": "^25.5.0", + "jest-changed-files": "^26.1.0", + "jest-config": "^26.1.0", + "jest-haste-map": "^26.1.0", + "jest-message-util": "^26.1.0", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.1.0", + "jest-resolve-dependencies": "^26.1.0", + "jest-runner": "^26.1.0", + "jest-runtime": "^26.1.0", + "jest-snapshot": "^26.1.0", + "jest-util": "^26.1.0", + "jest-validate": "^26.1.0", + "jest-watcher": "^26.1.0", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", - "realpath-native": "^2.0.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } } } }, "@jest/environment": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.5.0.tgz", - "integrity": "sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.1.0.tgz", + "integrity": "sha512-86+DNcGongbX7ai/KE/S3/NcUVZfrwvFzOOWX/W+OOTvTds7j07LtC+MgGydH5c8Ri3uIrvdmVgd1xFD5zt/xA==", "dev": true, "requires": { - "@jest/fake-timers": "^25.5.0", - "@jest/types": "^25.5.0", - "jest-mock": "^25.5.0" + "@jest/fake-timers": "^26.1.0", + "@jest/types": "^26.1.0", + "jest-mock": "^26.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "@jest/fake-timers": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", - "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.1.0.tgz", + "integrity": "sha512-Y5F3kBVWxhau3TJ825iuWy++BAuQzK/xEa+wD9vDH3RytW9f2DbMVodfUQC54rZDX3POqdxCgcKdgcOL0rYUpA==", "dev": true, "requires": { - "@jest/types": "^25.5.0", - "jest-message-util": "^25.5.0", - "jest-mock": "^25.5.0", - "jest-util": "^25.5.0", - "lolex": "^5.0.0" + "@jest/types": "^26.1.0", + "@sinonjs/fake-timers": "^6.0.1", + "jest-message-util": "^26.1.0", + "jest-mock": "^26.1.0", + "jest-util": "^26.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "@jest/globals": { - "version": "25.5.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-25.5.2.tgz", - "integrity": "sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.1.0.tgz", + "integrity": "sha512-MKiHPNaT+ZoG85oMaYUmGHEqu98y3WO2yeIDJrs2sJqHhYOy3Z6F7F/luzFomRQ8SQ1wEkmahFAz2291Iv8EAw==", "dev": true, "requires": { - "@jest/environment": "^25.5.0", - "@jest/types": "^25.5.0", - "expect": "^25.5.0" + "@jest/environment": "^26.1.0", + "@jest/types": "^26.1.0", + "expect": "^26.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "@jest/reporters": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.5.1.tgz", - "integrity": "sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.1.0.tgz", + "integrity": "sha512-SVAysur9FOIojJbF4wLP0TybmqwDkdnFxHSPzHMMIYyBtldCW9gG+Q5xWjpMFyErDiwlRuPyMSJSU64A67Pazg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.5.0", - "@jest/test-result": "^25.5.0", - "@jest/transform": "^25.5.1", - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", + "@jest/console": "^26.1.0", + "@jest/test-result": "^26.1.0", + "@jest/transform": "^26.1.0", + "@jest/types": "^26.1.0", + "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^4.0.3", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^25.5.1", - "jest-resolve": "^25.5.1", - "jest-util": "^25.5.0", - "jest-worker": "^25.5.0", - "node-notifier": "^6.0.0", + "jest-haste-map": "^26.1.0", + "jest-resolve": "^26.1.0", + "jest-util": "^26.1.0", + "jest-worker": "^26.1.0", + "node-notifier": "^7.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", - "string-length": "^3.1.0", + "string-length": "^4.0.1", "terminal-link": "^2.0.0", "v8-to-istanbul": "^4.1.3" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "@jest/source-map": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.5.0.tgz", - "integrity": "sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.1.0.tgz", + "integrity": "sha512-XYRPYx4eEVX15cMT9mstnO7hkHP3krNtKfxUYd8L7gbtia8JvZZ6bMzSwa6IQJENbudTwKMw5R1BePRD+bkEmA==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -619,52 +954,99 @@ } }, "@jest/test-result": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", - "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.1.0.tgz", + "integrity": "sha512-Xz44mhXph93EYMA8aYDz+75mFbarTV/d/x0yMdI3tfSRs/vh4CqSxgzVmCps1fPkHDCtn0tU8IH9iCKgGeGpfw==", "dev": true, "requires": { - "@jest/console": "^25.5.0", - "@jest/types": "^25.5.0", + "@jest/console": "^26.1.0", + "@jest/types": "^26.1.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "@jest/test-sequencer": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz", - "integrity": "sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.1.0.tgz", + "integrity": "sha512-Z/hcK+rTq56E6sBwMoQhSRDVjqrGtj1y14e2bIgcowARaIE1SgOanwx6gvY4Q9gTKMoZQXbXvptji+q5GYxa6Q==", "dev": true, "requires": { - "@jest/test-result": "^25.5.0", + "@jest/test-result": "^26.1.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^25.5.1", - "jest-runner": "^25.5.4", - "jest-runtime": "^25.5.4" + "jest-haste-map": "^26.1.0", + "jest-runner": "^26.1.0", + "jest-runtime": "^26.1.0" } }, "@jest/transform": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", - "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.1.0.tgz", + "integrity": "sha512-ICPm6sUXmZJieq45ix28k0s+d/z2E8CHDsq+WwtWI6kW8m7I8kPqarSEcUN86entHQ570ZBRci5OWaKL0wlAWw==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.5.0", + "@jest/types": "^26.1.0", "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", + "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^25.5.1", - "jest-regex-util": "^25.2.6", - "jest-util": "^25.5.0", + "jest-haste-map": "^26.1.0", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.1.0", "micromatch": "^4.0.2", "pirates": "^4.0.1", - "realpath-native": "^2.0.0", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "@jest/types": { @@ -680,14 +1062,23 @@ } }, "@sinonjs/commons": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", - "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", "dev": true, "requires": { "type-detect": "4.0.8" } }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "@types/babel__core": { "version": "7.1.9", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", @@ -721,9 +1112,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.12.tgz", - "integrity": "sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", + "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -776,13 +1167,13 @@ } }, "@types/jest": { - "version": "25.1.5", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.5.tgz", - "integrity": "sha512-FBmb9YZHoEOH56Xo/PIYtfuyTL0IzJLM3Hy0Sqc82nn5eqqXgefKcl/eMgChM8eSGVfoDee8cdlj7K74T8a6Yg==", + "version": "26.0.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.7.tgz", + "integrity": "sha512-+x0077/LoN6MjqBcVOe1y9dpryWnfDZ+Xfo3EqGeBcfPRJlQp3Lw62RvNlWxuGv7kOEwlHriAa54updi3Jvvwg==", "dev": true, "requires": { - "jest-diff": "25.1.0", - "pretty-format": "25.1.0" + "jest-diff": "^25.2.1", + "pretty-format": "^25.2.1" } }, "@types/json-schema": { @@ -792,9 +1183,9 @@ "dev": true }, "@types/node": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", - "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", + "version": "14.0.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", + "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", "dev": true }, "@types/normalize-package-data": { @@ -810,9 +1201,9 @@ "dev": true }, "@types/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.2.tgz", + "integrity": "sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA==", "dev": true }, "@types/stack-utils": { @@ -837,54 +1228,90 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz", - "integrity": "sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.7.1.tgz", + "integrity": "sha512-3DB9JDYkMrc8Au00rGFiJLK2Ja9CoMP6Ut0sHsXp3ZtSugjNxvSSHTnKLfo4o+QmjYBJqEznDqsG1zj4F2xnsg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.26.0", + "@typescript-eslint/experimental-utils": "3.7.1", + "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", + "semver": "^7.3.2", "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } } }, "@typescript-eslint/experimental-utils": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz", - "integrity": "sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.7.1.tgz", + "integrity": "sha512-TqE97pv7HrqWcGJbLbZt1v59tcqsSVpWTOf1AqrWK7n8nok2sGgVtYRuGXeNeLw3wXlLEbY1MKP3saB2HsO/Ng==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.26.0", + "@typescript-eslint/types": "3.7.1", + "@typescript-eslint/typescript-estree": "3.7.1", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.26.0.tgz", - "integrity": "sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.7.1.tgz", + "integrity": "sha512-W4QV/gXvfIsccN8225784LNOorcm7ch68Fi3V4Wg7gmkWSQRKevO4RrRqWo6N/Z/myK1QAiGgeaXN57m+R/8iQ==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.26.0", - "@typescript-eslint/typescript-estree": "2.26.0", + "@typescript-eslint/experimental-utils": "3.7.1", + "@typescript-eslint/types": "3.7.1", + "@typescript-eslint/typescript-estree": "3.7.1", "eslint-visitor-keys": "^1.1.0" } }, + "@typescript-eslint/types": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.7.1.tgz", + "integrity": "sha512-PZe8twm5Z4b61jt7GAQDor6KiMhgPgf4XmUb9zdrwTbgtC/Sj29gXP1dws9yEn4+aJeyXrjsD9XN7AWFhmnUfg==", + "dev": true + }, "@typescript-eslint/typescript-estree": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz", - "integrity": "sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.7.1.tgz", + "integrity": "sha512-m97vNZkI08dunYOr2lVZOHoyfpqRs0KDpd6qkGaIcLGhQ2WPtgHOd/eVbsJZ0VYCQvupKrObAGTOvk3tfpybYA==", "dev": true, "requires": { + "@typescript-eslint/types": "3.7.1", + "@typescript-eslint/visitor-keys": "3.7.1", "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", "glob": "^7.1.6", "is-glob": "^4.0.1", "lodash": "^4.17.15", - "semver": "^6.3.0", + "semver": "^7.3.2", "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.7.1.tgz", + "integrity": "sha512-xn22sQbEya+Utj2IqJHGLA3i1jDzR43RzWupxojbSWnj3nnPLavaQmWe5utw03CwYao3r00qzXfgJMGNkrzrAA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" } }, "abab": { @@ -900,21 +1327,13 @@ "dev": true }, "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, "acorn-jsx": { @@ -924,9 +1343,9 @@ "dev": true }, "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, "aggregate-error": { @@ -940,9 +1359,9 @@ } }, "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==", + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -1033,12 +1452,6 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -1097,19 +1510,43 @@ "dev": true }, "babel-jest": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", - "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.1.0.tgz", + "integrity": "sha512-Nkqgtfe7j6PxLO6TnCQQlkMm8wdTdnIF8xrdpooHCuD5hXRzVEPbPneTJKknH5Dsv3L8ip9unHDAp48YQ54Dkg==", "dev": true, "requires": { - "@jest/transform": "^25.5.1", - "@jest/types": "^25.5.0", + "@jest/transform": "^26.1.0", + "@jest/types": "^26.1.0", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.5.0", - "chalk": "^3.0.0", + "babel-preset-jest": "^26.1.0", + "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "babel-plugin-istanbul": { @@ -1126,13 +1563,14 @@ } }, "babel-plugin-jest-hoist": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz", - "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.1.0.tgz", + "integrity": "sha512-qhqLVkkSlqmC83bdMhM8WW4Z9tB+JkjqAqlbbohS9sJLT5Ha2vfzuKqg5yenXrAjOPG2YC0WiXdH3a9PvB+YYw==", "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", "@types/babel__traverse": "^7.0.6" } }, @@ -1156,12 +1594,12 @@ } }, "babel-preset-jest": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz", - "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.1.0.tgz", + "integrity": "sha512-na9qCqFksknlEj5iSdw1ehMVR06LCCTkZLGKeEtxDDdhg8xpUF09m29Kvh1pRbZ07h7AQ5ttLYUwpXL4tO6w7w==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^25.5.0", + "babel-plugin-jest-hoist": "^26.1.0", "babel-preset-current-node-syntax": "^0.1.2" } }, @@ -1260,23 +1698,6 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, "bs-logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", @@ -1355,10 +1776,10 @@ "supports-color": "^7.1.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, "ci-info": { @@ -1466,11 +1887,41 @@ } } }, - "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": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.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 + }, + "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" + } + } + } }, "co": { "version": "4.6.0", @@ -1577,24 +2028,14 @@ } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "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" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "cssom": { @@ -1630,14 +2071,14 @@ } }, "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" } }, "dayjs": { @@ -1661,6 +2102,12 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decimal.js": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "dev": true + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -1760,12 +2207,20 @@ } }, "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, "requires": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } } }, "ecc-jsbn": { @@ -1828,25 +2283,67 @@ "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" - } - }, - "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", + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "eslint": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.5.0.tgz", + "integrity": "sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.2.0", + "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", @@ -1855,102 +2352,86 @@ "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", + "levn": "^0.4.1", + "lodash": "^4.17.19", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "eslint-plugin-jest": { + "version": "23.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.19.0.tgz", + "integrity": "sha512-l5PLflALqnODl8Yy0H5hDs18aKJS1KTf66VZGXRpIhmbLbPLaTuMB2P+65fBpkdseSpnTVcIlBYvTvJSBi/itg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^2.5.0" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", "dev": true, "requires": { - "color-name": "1.1.3" + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.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 - }, - "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==", + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "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" - } } } }, - "eslint-plugin-jest": { - "version": "23.8.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz", - "integrity": "sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "^2.5.0" - } - }, "eslint-scope": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", @@ -1977,14 +2458,14 @@ "dev": true }, "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", + "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", "dev": true, "requires": { - "acorn": "^7.1.1", + "acorn": "^7.3.1", "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^1.3.0" } }, "esprima": { @@ -2050,6 +2531,57 @@ "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" + }, + "dependencies": { + "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" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "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 + }, + "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" + } + } } }, "exit": { @@ -2109,17 +2641,47 @@ } }, "expect": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz", - "integrity": "sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.1.0.tgz", + "integrity": "sha512-QbH4LZXDsno9AACrN9eM0zfnby9G+OsdNgZUohjg/P0mLy1O+/bzTAJGT6VSIjVCe8yKM6SzEl/ckEOFBT7Vnw==", "dev": true, "requires": { - "@jest/types": "^25.5.0", + "@jest/types": "^26.1.0", "ansi-styles": "^4.0.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.5.0", - "jest-message-util": "^25.5.0", - "jest-regex-util": "^25.2.6" + "jest-get-type": "^26.0.0", + "jest-matcher-utils": "^26.1.0", + "jest-message-util": "^26.1.0", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "dev": true + } } }, "extend": { @@ -2149,17 +2711,6 @@ } } }, - "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" - } - }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -2285,6 +2836,16 @@ "to-regex-range": "^5.0.1" } }, + "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" + } + }, "find-versions": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", @@ -2547,12 +3108,12 @@ "dev": true }, "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^1.0.5" } }, "html-escaper": { @@ -2671,61 +3232,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "inquirer": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.2.0.tgz", - "integrity": "sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ==", - "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": { - "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 - }, - "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" - } - }, - "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" - } - } - } - }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -2873,6 +3379,12 @@ "isobject": "^3.0.1" } }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -2907,6 +3419,12 @@ "is-docker": "^2.0.0" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2976,183 +3494,98 @@ } }, "jest": { - "version": "25.2.7", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.2.7.tgz", - "integrity": "sha512-XV1n/CE2McCikl4tfpCY950RytHYvxdo/wvtgmn/qwA8z1s16fuvgFL/KoPrrmkqJTaPMUlLVE58pwiaTX5TdA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.1.0.tgz", + "integrity": "sha512-LIti8jppw5BcQvmNJe4w2g1N/3V68HUfAv9zDVm7v+VAtQulGhH0LnmmiVkbNE4M4I43Bj2fXPiBGKt26k9tHw==", "dev": true, "requires": { - "@jest/core": "^25.2.7", + "@jest/core": "^26.1.0", "import-local": "^3.0.2", - "jest-cli": "^25.2.7" + "jest-cli": "^26.1.0" }, "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" } }, - "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 - }, - "find-up": { + "chalk": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "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 - }, "jest-cli": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.5.4.tgz", - "integrity": "sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.1.0.tgz", + "integrity": "sha512-Imumvjgi3rU7stq6SJ1JUEMaV5aAgJYXIs0jPqdUnF47N/Tk83EXfmtvNKQ+SnFVI6t6mDOvfM3aA9Sg6kQPSw==", "dev": true, "requires": { - "@jest/core": "^25.5.4", - "@jest/test-result": "^25.5.0", - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", + "@jest/core": "^26.1.0", + "@jest/test-result": "^26.1.0", + "@jest/types": "^26.1.0", + "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^25.5.4", - "jest-util": "^25.5.0", - "jest-validate": "^25.5.0", + "jest-config": "^26.1.0", + "jest-util": "^26.1.0", + "jest-validate": "^26.1.0", "prompts": "^2.0.1", - "realpath-native": "^2.0.0", "yargs": "^15.3.1" } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + } + } + }, + "jest-changed-files": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.1.0.tgz", + "integrity": "sha512-HS5MIJp3B8t0NRKGMCZkcDUZo36mVRvrDETl81aqljT1S9tqiHRSpyoOvWg9ZilzZG9TDisDNaN1IXm54fLRZw==", + "dev": true, + "requires": { + "@jest/types": "^26.1.0", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" } }, - "p-locate": { + "chalk": { "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" - } - }, - "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 - }, - "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" - } - }, - "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" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.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": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-changed-files": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.5.0.tgz", - "integrity": "sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==", - "dev": true, - "requires": { - "@jest/types": "^25.5.0", - "execa": "^3.2.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -3162,7 +3595,6 @@ "merge-stream": "^2.0.0", "npm-run-path": "^4.0.0", "onetime": "^5.1.0", - "p-finally": "^2.0.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } @@ -3190,79 +3622,70 @@ "requires": { "path-key": "^3.0.0" } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, "jest-config": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.4.tgz", - "integrity": "sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.1.0.tgz", + "integrity": "sha512-ONTGeoMbAwGCdq4WuKkMcdMoyfs5CLzHEkzFOlVvcDXufZSaIWh/OXMLa2fwKXiOaFcqEw8qFr4VOKJQfn4CVw==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.5.4", - "@jest/types": "^25.5.0", - "babel-jest": "^25.5.1", - "chalk": "^3.0.0", + "@jest/test-sequencer": "^26.1.0", + "@jest/types": "^26.1.0", + "babel-jest": "^26.1.0", + "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^25.5.0", - "jest-environment-node": "^25.5.0", - "jest-get-type": "^25.2.6", - "jest-jasmine2": "^25.5.4", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.5.1", - "jest-util": "^25.5.0", - "jest-validate": "^25.5.0", + "jest-environment-jsdom": "^26.1.0", + "jest-environment-node": "^26.1.0", + "jest-get-type": "^26.0.0", + "jest-jasmine2": "^26.1.0", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.1.0", + "jest-util": "^26.1.0", + "jest-validate": "^26.1.0", "micromatch": "^4.0.2", - "pretty-format": "^25.5.0", - "realpath-native": "^2.0.0" + "pretty-format": "^26.1.0" }, "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "dev": true + }, "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", + "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", "dev": true, "requires": { - "@jest/types": "^25.5.0", + "@jest/types": "^26.1.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3271,46 +3694,74 @@ } }, "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", "dev": true, "requires": { "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" } }, "jest-docblock": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz", - "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.5.0.tgz", - "integrity": "sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.1.0.tgz", + "integrity": "sha512-lYiSo4Igr81q6QRsVQq9LIkJW0hZcKxkIkHzNeTMPENYYDw/W/Raq28iJ0sLlNFYz2qxxeLnc5K2gQoFYlu2bA==", "dev": true, "requires": { - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", - "jest-get-type": "^25.2.6", - "jest-util": "^25.5.0", - "pretty-format": "^25.5.0" + "@jest/types": "^26.1.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.0.0", + "jest-util": "^26.1.0", + "pretty-format": "^26.1.0" }, "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "dev": true + }, "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", + "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", "dev": true, "requires": { - "@jest/types": "^25.5.0", + "@jest/types": "^26.1.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3319,31 +3770,78 @@ } }, "jest-environment-jsdom": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz", - "integrity": "sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.1.0.tgz", + "integrity": "sha512-dWfiJ+spunVAwzXbdVqPH1LbuJW/kDL+FyqgA5YzquisHqTi0g9hquKif9xKm7c1bKBj6wbmJuDkeMCnxZEpUw==", "dev": true, "requires": { - "@jest/environment": "^25.5.0", - "@jest/fake-timers": "^25.5.0", - "@jest/types": "^25.5.0", - "jest-mock": "^25.5.0", - "jest-util": "^25.5.0", - "jsdom": "^15.2.1" + "@jest/environment": "^26.1.0", + "@jest/fake-timers": "^26.1.0", + "@jest/types": "^26.1.0", + "jest-mock": "^26.1.0", + "jest-util": "^26.1.0", + "jsdom": "^16.2.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "jest-environment-node": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.5.0.tgz", - "integrity": "sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.1.0.tgz", + "integrity": "sha512-DNm5x1aQH0iRAe9UYAkZenuzuJ69VKzDCAYISFHQ5i9e+2Tbeu2ONGY7YStubCLH8a1wdKBgqScYw85+ySxqxg==", "dev": true, "requires": { - "@jest/environment": "^25.5.0", - "@jest/fake-timers": "^25.5.0", - "@jest/types": "^25.5.0", - "jest-mock": "^25.5.0", - "jest-util": "^25.5.0", - "semver": "^6.3.0" + "@jest/environment": "^26.1.0", + "@jest/fake-timers": "^26.1.0", + "@jest/types": "^26.1.0", + "jest-mock": "^26.1.0", + "jest-util": "^26.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "jest-get-type": { @@ -3353,69 +3851,104 @@ "dev": true }, "jest-haste-map": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", - "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.1.0.tgz", + "integrity": "sha512-WeBS54xCIz9twzkEdm6+vJBXgRBQfdbbXD0dk8lJh7gLihopABlJmIQFdWSDDtuDe4PRiObsjZSUjbJ1uhWEpA==", "dev": true, "requires": { - "@jest/types": "^25.5.0", + "@jest/types": "^26.1.0", "@types/graceful-fs": "^4.1.2", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", - "jest-serializer": "^25.5.0", - "jest-util": "^25.5.0", - "jest-worker": "^25.5.0", + "jest-serializer": "^26.1.0", + "jest-util": "^26.1.0", + "jest-worker": "^26.1.0", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7", "which": "^2.0.2" }, "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", "dev": true, "requires": { - "isexe": "^2.0.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } } } }, "jest-jasmine2": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz", - "integrity": "sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.1.0.tgz", + "integrity": "sha512-1IPtoDKOAG+MeBrKvvuxxGPJb35MTTRSDglNdWWCndCB3TIVzbLThRBkwH9P081vXLgiJHZY8Bz3yzFS803xqQ==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.5.0", - "@jest/source-map": "^25.5.0", - "@jest/test-result": "^25.5.0", - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", + "@jest/environment": "^26.1.0", + "@jest/source-map": "^26.1.0", + "@jest/test-result": "^26.1.0", + "@jest/types": "^26.1.0", + "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^25.5.0", + "expect": "^26.1.0", "is-generator-fn": "^2.0.0", - "jest-each": "^25.5.0", - "jest-matcher-utils": "^25.5.0", - "jest-message-util": "^25.5.0", - "jest-runtime": "^25.5.4", - "jest-snapshot": "^25.5.1", - "jest-util": "^25.5.0", - "pretty-format": "^25.5.0", + "jest-each": "^26.1.0", + "jest-matcher-utils": "^26.1.0", + "jest-message-util": "^26.1.0", + "jest-runtime": "^26.1.0", + "jest-snapshot": "^26.1.0", + "jest-util": "^26.1.0", + "pretty-format": "^26.1.0", "throat": "^5.0.0" }, "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", + "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", "dev": true, "requires": { - "@jest/types": "^25.5.0", + "@jest/types": "^26.1.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3424,22 +3957,50 @@ } }, "jest-leak-detector": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz", - "integrity": "sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.1.0.tgz", + "integrity": "sha512-dsMnKF+4BVOZwvQDlgn3MG+Ns4JuLv8jNvXH56bgqrrboyCbI1rQg6EI5rs+8IYagVcfVP2yZFKfWNZy0rK0Hw==", "dev": true, "requires": { - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" + "jest-get-type": "^26.0.0", + "pretty-format": "^26.1.0" }, "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "dev": true + }, "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", + "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", "dev": true, "requires": { - "@jest/types": "^25.5.0", + "@jest/types": "^26.1.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3448,66 +4009,148 @@ } }, "jest-matcher-utils": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", - "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.1.0.tgz", + "integrity": "sha512-PW9JtItbYvES/xLn5mYxjMd+Rk+/kIt88EfH3N7w9KeOrHWaHrdYPnVHndGbsFGRJ2d5gKtwggCvkqbFDoouQA==", "dev": true, "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.5.0", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" + "chalk": "^4.0.0", + "jest-diff": "^26.1.0", + "jest-get-type": "^26.0.0", + "pretty-format": "^26.1.0" }, "dependencies": { - "jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", "dev": true, "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" } }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "diff-sequences": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.0.0.tgz", + "integrity": "sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==", + "dev": true + }, + "jest-diff": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.1.0.tgz", + "integrity": "sha512-GZpIcom339y0OXznsEKjtkfKxNdg7bVbEofK8Q6MnevTIiR1jNhDWKhRX6X0SDXJlwn3dy59nZ1z55fLkAqPWg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.0.0", + "jest-get-type": "^26.0.0", + "pretty-format": "^26.1.0" + } + }, + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "dev": true + }, + "pretty-format": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", + "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", + "dev": true, + "requires": { + "@jest/types": "^26.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } } } }, "jest-message-util": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", - "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", + "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.5.0", + "@jest/types": "^26.1.0", "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", + "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", - "stack-utils": "^1.0.1" + "stack-utils": "^2.0.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "jest-mock": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", - "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.1.0.tgz", + "integrity": "sha512-1Rm8EIJ3ZFA8yCIie92UbxZWj9SuVmUGcyhLHyAhY6WI3NIct38nVcfOPWhJteqSn8V8e3xOMha9Ojfazfpovw==", "dev": true, "requires": { - "@jest/types": "^25.5.0" + "@jest/types": "^26.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "jest-pnp-resolver": { @@ -3517,311 +4160,385 @@ "dev": true }, "jest-regex-util": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", - "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", "dev": true }, "jest-resolve": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", - "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.1.0.tgz", + "integrity": "sha512-KsY1JV9FeVgEmwIISbZZN83RNGJ1CC+XUCikf/ZWJBX/tO4a4NvA21YixokhdR9UnmPKKAC4LafVixJBrwlmfg==", "dev": true, "requires": { - "@jest/types": "^25.5.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", + "@jest/types": "^26.1.0", + "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.1", + "jest-util": "^26.1.0", "read-pkg-up": "^7.0.1", - "realpath-native": "^2.0.0", "resolve": "^1.17.0", "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "jest-resolve-dependencies": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz", - "integrity": "sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.1.0.tgz", + "integrity": "sha512-fQVEPHHQ1JjHRDxzlLU/buuQ9om+hqW6Vo928aa4b4yvq4ZHBtRSDsLdKQLuCqn5CkTVpYZ7ARh2fbA8WkRE6g==", "dev": true, "requires": { - "@jest/types": "^25.5.0", - "jest-regex-util": "^25.2.6", - "jest-snapshot": "^25.5.1" + "@jest/types": "^26.1.0", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "jest-runner": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.4.tgz", - "integrity": "sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.1.0.tgz", + "integrity": "sha512-elvP7y0fVDREnfqit0zAxiXkDRSw6dgCkzPCf1XvIMnSDZ8yogmSKJf192dpOgnUVykmQXwYYJnCx641uLTgcw==", "dev": true, "requires": { - "@jest/console": "^25.5.0", - "@jest/environment": "^25.5.0", - "@jest/test-result": "^25.5.0", - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", + "@jest/console": "^26.1.0", + "@jest/environment": "^26.1.0", + "@jest/test-result": "^26.1.0", + "@jest/types": "^26.1.0", + "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^25.5.4", - "jest-docblock": "^25.3.0", - "jest-haste-map": "^25.5.1", - "jest-jasmine2": "^25.5.4", - "jest-leak-detector": "^25.5.0", - "jest-message-util": "^25.5.0", - "jest-resolve": "^25.5.1", - "jest-runtime": "^25.5.4", - "jest-util": "^25.5.0", - "jest-worker": "^25.5.0", + "jest-config": "^26.1.0", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.1.0", + "jest-jasmine2": "^26.1.0", + "jest-leak-detector": "^26.1.0", + "jest-message-util": "^26.1.0", + "jest-resolve": "^26.1.0", + "jest-runtime": "^26.1.0", + "jest-util": "^26.1.0", + "jest-worker": "^26.1.0", "source-map-support": "^0.5.6", "throat": "^5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "jest-runtime": { - "version": "25.5.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.4.tgz", - "integrity": "sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==", - "dev": true, - "requires": { - "@jest/console": "^25.5.0", - "@jest/environment": "^25.5.0", - "@jest/globals": "^25.5.2", - "@jest/source-map": "^25.5.0", - "@jest/test-result": "^25.5.0", - "@jest/transform": "^25.5.1", - "@jest/types": "^25.5.0", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.1.0.tgz", + "integrity": "sha512-1qiYN+EZLmG1QV2wdEBRf+Ci8i3VSfIYLF02U18PiUDrMbhfpN/EAMMkJtT02jgJUoaEOpHAIXG6zS3QRMzRmA==", + "dev": true, + "requires": { + "@jest/console": "^26.1.0", + "@jest/environment": "^26.1.0", + "@jest/fake-timers": "^26.1.0", + "@jest/globals": "^26.1.0", + "@jest/source-map": "^26.1.0", + "@jest/test-result": "^26.1.0", + "@jest/transform": "^26.1.0", + "@jest/types": "^26.1.0", "@types/yargs": "^15.0.0", - "chalk": "^3.0.0", + "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^25.5.4", - "jest-haste-map": "^25.5.1", - "jest-message-util": "^25.5.0", - "jest-mock": "^25.5.0", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.5.1", - "jest-snapshot": "^25.5.1", - "jest-util": "^25.5.0", - "jest-validate": "^25.5.0", - "realpath-native": "^2.0.0", + "jest-config": "^26.1.0", + "jest-haste-map": "^26.1.0", + "jest-message-util": "^26.1.0", + "jest-mock": "^26.1.0", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.1.0", + "jest-snapshot": "^26.1.0", + "jest-util": "^26.1.0", + "jest-validate": "^26.1.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^15.3.1" }, "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "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 - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" } }, - "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 - }, - "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-locate": { + "chalk": { "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" - } - }, - "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 - }, - "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" - } - }, - "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" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.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": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } } } }, "jest-serializer": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", - "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.1.0.tgz", + "integrity": "sha512-eqZOQG/0+MHmr25b2Z86g7+Kzd5dG9dhCiUoyUNJPgiqi38DqbDEOlHcNijyfZoj74soGBohKBZuJFS18YTJ5w==", "dev": true, "requires": { "graceful-fs": "^4.2.4" } }, "jest-snapshot": { - "version": "25.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.5.1.tgz", - "integrity": "sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.1.0.tgz", + "integrity": "sha512-YhSbU7eMTVQO/iRbNs8j0mKRxGp4plo7sJ3GzOQ0IYjvsBiwg0T1o0zGQAYepza7lYHuPTrG5J2yDd0CE2YxSw==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^25.5.0", - "@types/prettier": "^1.19.0", - "chalk": "^3.0.0", - "expect": "^25.5.0", + "@jest/types": "^26.1.0", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.1.0", "graceful-fs": "^4.2.4", - "jest-diff": "^25.5.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.5.0", - "jest-message-util": "^25.5.0", - "jest-resolve": "^25.5.1", - "make-dir": "^3.0.0", + "jest-diff": "^26.1.0", + "jest-get-type": "^26.0.0", + "jest-haste-map": "^26.1.0", + "jest-matcher-utils": "^26.1.0", + "jest-message-util": "^26.1.0", + "jest-resolve": "^26.1.0", "natural-compare": "^1.4.0", - "pretty-format": "^25.5.0", - "semver": "^6.3.0" + "pretty-format": "^26.1.0", + "semver": "^7.3.2" }, "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "diff-sequences": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.0.0.tgz", + "integrity": "sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==", + "dev": true + }, "jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.1.0.tgz", + "integrity": "sha512-GZpIcom339y0OXznsEKjtkfKxNdg7bVbEofK8Q6MnevTIiR1jNhDWKhRX6X0SDXJlwn3dy59nZ1z55fLkAqPWg==", "dev": true, "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" + "chalk": "^4.0.0", + "diff-sequences": "^26.0.0", + "jest-get-type": "^26.0.0", + "pretty-format": "^26.1.0" } }, + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "dev": true + }, "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", + "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", "dev": true, "requires": { - "@jest/types": "^25.5.0", + "@jest/types": "^26.1.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true } } }, "jest-util": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", - "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", + "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", "dev": true, "requires": { - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", + "@jest/types": "^26.1.0", + "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", - "make-dir": "^3.0.0" + "micromatch": "^4.0.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "jest-validate": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", - "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.1.0.tgz", + "integrity": "sha512-WPApOOnXsiwhZtmkDsxnpye+XLb/tUISP+H6cHjfUIXvlG+eKwP+isnivsxlHCPaO9Q5wvbhloIBkdF3qUn+Nw==", "dev": true, "requires": { - "@jest/types": "^25.5.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.2.6", + "@jest/types": "^26.1.0", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.0.0", "leven": "^3.1.0", - "pretty-format": "^25.5.0" + "pretty-format": "^26.1.0" }, "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", + "dev": true + }, "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", + "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", "dev": true, "requires": { - "@jest/types": "^25.5.0", + "@jest/types": "^26.1.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -3830,23 +4547,47 @@ } }, "jest-watcher": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.5.0.tgz", - "integrity": "sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.1.0.tgz", + "integrity": "sha512-ffEOhJl2EvAIki613oPsSG11usqnGUzIiK7MMX6hE4422aXOcVEG3ySCTDFLn1+LZNXGPE8tuJxhp8OBJ1pgzQ==", "dev": true, "requires": { - "@jest/test-result": "^25.5.0", - "@jest/types": "^25.5.0", + "@jest/test-result": "^26.1.0", + "@jest/types": "^26.1.0", "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-util": "^25.5.0", - "string-length": "^3.1.0" + "chalk": "^4.0.0", + "jest-util": "^26.1.0", + "string-length": "^4.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", - "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.1.0.tgz", + "integrity": "sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -3876,36 +4617,36 @@ "dev": true }, "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.3.0.tgz", + "integrity": "sha512-zggeX5UuEknpdZzv15+MS1dPYG0J/TftiiNunOeNxSl3qr8Z6cIlQpN0IdJa44z9aFxZRIVqRncvEhQ7X5DtZg==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", "xml-name-validator": "^3.0.0" } }, @@ -3985,13 +4726,13 @@ "dev": true }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "lines-and-columns": { @@ -4154,10 +4895,19 @@ } } }, + "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" + } + }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, "lodash.memoize": { @@ -4267,15 +5017,6 @@ } } }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -4403,12 +5144,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "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 - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -4453,17 +5188,27 @@ "dev": true }, "node-notifier": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", - "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-7.0.2.tgz", + "integrity": "sha512-ux+n4hPVETuTL8+daJXTOC6uKLgMsl1RYfFv7DKRzyvzBapqco0rZZ9g72ZN8VS6V+gvNYHYa/ofcCY8fkJWsA==", "dev": true, "optional": true, "requires": { "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^6.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", "shellwords": "^0.1.1", - "which": "^1.3.1" + "uuid": "^8.2.0", + "which": "^2.0.2" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "optional": true + } } }, "normalize-package-data": { @@ -4499,6 +5244,14 @@ "dev": true, "requires": { "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + } } }, "nwsapi": { @@ -4587,25 +5340,19 @@ "dev": true }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "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" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, - "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-each-series": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", @@ -4627,6 +5374,15 @@ "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-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -4664,9 +5420,9 @@ } }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true }, "pascalcase": { @@ -4675,6 +5431,12 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "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 + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -4682,9 +5444,9 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -4774,12 +5536,6 @@ "semver-compare": "^1.0.0" } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -4787,9 +5543,9 @@ "dev": true }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prettier": { @@ -4799,12 +5555,12 @@ "dev": true }, "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -4889,50 +5645,8 @@ "find-up": "^4.1.0", "read-pkg": "^5.2.0", "type-fest": "^0.8.1" - }, - "dependencies": { - "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" - } - }, - "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-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" - } - }, - "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 - } } }, - "realpath-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", - "dev": true - }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -5010,25 +5724,31 @@ "psl": "^1.1.28", "punycode": "^2.1.1" } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true } } }, "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "dev": true, "requires": { - "request-promise-core": "1.1.3", + "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, @@ -5126,21 +5846,6 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "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" - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -5304,12 +6009,12 @@ } }, "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, "requires": { - "xmlchars": "^2.1.1" + "xmlchars": "^2.2.0" } }, "semver": { @@ -5360,18 +6065,18 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.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=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shellwords": { @@ -5664,10 +6369,21 @@ } }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } }, "static-extend": { "version": "0.1.2", @@ -5703,13 +6419,13 @@ "dev": true }, "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", "dev": true, "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" } }, "string-width": { @@ -5721,6 +6437,23 @@ "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-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 + }, + "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" + } + } } }, "stringify-object": { @@ -5735,20 +6468,12 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "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": "^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 - } + "ansi-regex": "^5.0.0" } }, "strip-bom": { @@ -5770,9 +6495,9 @@ "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==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { @@ -5851,15 +6576,6 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "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" - } - }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -5925,30 +6641,30 @@ } }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "dev": true, "requires": { - "punycode": "^2.1.0" + "punycode": "^2.1.1" } }, "ts-jest": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.3.0.tgz", - "integrity": "sha512-qH/uhaC+AFDU9JfAueSr0epIFJkGMvUPog4FxSEVAtPOur1Oni5WBJMiQIkfHvc7PviVRsnlVLLY2I6221CQew==", + "version": "26.1.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.4.tgz", + "integrity": "sha512-Nd7diUX6NZWfWq6FYyvcIPR/c7GbEF75fH1R6coOp3fbNzbRJBZZAn0ueVS0r8r9ral1VcrpneAFAwB3TsVS1Q==", "dev": true, "requires": { "bs-logger": "0.x", "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", + "jest-util": "26.x", "json5": "2.x", "lodash.memoize": "4.x", "make-error": "1.x", "mkdirp": "1.x", - "resolve": "1.x", - "semver": "6.x", - "yargs-parser": "^18.1.1" + "semver": "7.x", + "yargs-parser": "18.x" }, "dependencies": { "mkdirp": { @@ -5957,28 +6673,24 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true } } }, "ts-node": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.8.1.tgz", - "integrity": "sha512-10DE9ONho06QORKAaCBpPiFCdW+tZJuY/84tyypGtl6r+/C7Asq0dhqbRZURuUlLQtZxxDvT8eoj8cGW0ha6Bg==", + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", + "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", "dev": true, "requires": { "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.6", + "source-map-support": "^0.5.17", "yn": "3.1.1" } }, @@ -6013,12 +6725,12 @@ "dev": true }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-detect": { @@ -6043,9 +6755,9 @@ } }, "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", "dev": true }, "union-value": { @@ -6097,12 +6809,6 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true } } }, @@ -6128,10 +6834,11 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", + "dev": true, + "optional": true }, "v8-compile-cache": { "version": "2.1.1", @@ -6189,13 +6896,11 @@ } }, "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", "xml-name-validator": "^3.0.0" } }, @@ -6209,9 +6914,9 @@ } }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true }, "whatwg-encoding": { @@ -6230,20 +6935,28 @@ "dev": true }, "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", + "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^2.0.2", + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -6267,6 +6980,42 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.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 + }, + "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" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -6295,9 +7044,9 @@ } }, "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", "dev": true }, "xml-name-validator": { @@ -6324,6 +7073,60 @@ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", "dev": true }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "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 + }, + "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" + } + } + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index e89fad394..a9de57220 100644 --- a/package.json +++ b/package.json @@ -57,21 +57,21 @@ ] }, "devDependencies": { - "@types/jest": "25.1.5", - "@types/node": "13.11.0", - "@typescript-eslint/eslint-plugin": "2.26.0", - "@typescript-eslint/parser": "2.26.0", + "@types/jest": "^26.0.7", + "@types/node": "^14.0.27", + "@typescript-eslint/eslint-plugin": "^3.7.1", + "@typescript-eslint/parser": "^3.7.1", "dayjs": "1.8.23", - "eslint": "6.8.0", - "eslint-plugin-jest": "23.8.2", + "eslint": "^7.5.0", + "eslint-plugin-jest": "^23.19.0", "husky": "^4.2.5", - "jest": "25.2.7", + "jest": "^26.1.0", "lint-staged": "^10.2.11", "prettier": "^2.0.5", "reflect-metadata": "0.1.13", "rimraf": "3.0.2", - "ts-jest": "25.3.0", - "ts-node": "8.8.1", - "typescript": "3.8.3" + "ts-jest": "^26.1.4", + "ts-node": "^8.10.2", + "typescript": "^3.9.7" } } From 4d587dc23177b1182eff6ff72fad29faa710dc4c Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 18:05:36 +0200 Subject: [PATCH 23/30] style: add newline to end of config files --- .github/workflows/continuous-deployment-workflow.yml | 2 +- .github/workflows/continuous-integration-workflow.yml | 2 +- .gitignore | 2 +- .prettierrc.yml | 2 +- codecov.yml | 2 +- tsconfig.json | 2 +- tsconfig.prod.json | 2 +- tsconfig.spec.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/continuous-deployment-workflow.yml b/.github/workflows/continuous-deployment-workflow.yml index d73269460..860f77c41 100644 --- a/.github/workflows/continuous-deployment-workflow.yml +++ b/.github/workflows/continuous-deployment-workflow.yml @@ -21,4 +21,4 @@ jobs: - run: cp package.json build/package.json - run: npm publish ./build env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} \ No newline at end of file + NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index c091dceac..8d4dcf586 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -32,4 +32,4 @@ jobs: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 - run: npm ci --ignore-scripts - - run: npm run build \ No newline at end of file + - run: npm run build diff --git a/.gitignore b/.gitignore index c89d84f27..905e73514 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,4 @@ temp # Files for playing around locally playground.ts -playground.js \ No newline at end of file +playground.js diff --git a/.prettierrc.yml b/.prettierrc.yml index 8a87ac4a2..57c1c99c9 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -5,4 +5,4 @@ semi: true singleQuote: true trailingComma: es5 bracketSpacing: true -arrowParens: avoid \ No newline at end of file +arrowParens: avoid diff --git a/codecov.yml b/codecov.yml index 744284bce..25ab1d50a 100644 --- a/codecov.yml +++ b/codecov.yml @@ -9,4 +9,4 @@ coverage: comment: off ignore: - testing/**/*.ts - - src/**/*.interface.ts \ No newline at end of file + - src/**/*.interface.ts diff --git a/tsconfig.json b/tsconfig.json index 0edf824d7..8e2dc9f10 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,4 +13,4 @@ "forceConsistentCasingInFileNames": true }, "exclude": ["node_modules", "sample", "**/*.spec.ts", "testing/**"] -} \ No newline at end of file +} diff --git a/tsconfig.prod.json b/tsconfig.prod.json index aeea210e6..3321fa044 100644 --- a/tsconfig.prod.json +++ b/tsconfig.prod.json @@ -6,4 +6,4 @@ "removeComments": false, "declaration": true, }, -} \ No newline at end of file +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json index 9943a402b..c0215c96a 100644 --- a/tsconfig.spec.json +++ b/tsconfig.spec.json @@ -8,4 +8,4 @@ "noImplicitAny": false, }, "exclude": ["node_modules"] -} \ No newline at end of file +} From 2a1529592986a34b9c4b95710e948a1930ced934 Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 18:12:54 +0200 Subject: [PATCH 24/30] style: remove empty firstline from Codecov config --- codecov.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index 25ab1d50a..5ddb8e5d5 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,4 +1,3 @@ - coverage: range: 70..100 round: down From a79772644d83fb63e0764c1bd522542f29dd7a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20Ol=C3=A1h?= Date: Wed, 29 Jul 2020 21:19:07 +0200 Subject: [PATCH 25/30] build: update eslint config (#377) --- .eslintrc.js | 32 -- .eslintrc.yml | 31 ++ package-lock.json | 15 + package.json | 1 + src/TransformOperationExecutor.ts | 859 ++++++++++++++++-------------- src/metadata/TypeMetadata.ts | 17 +- 6 files changed, 513 insertions(+), 442 deletions(-) delete mode 100644 .eslintrc.js create mode 100644 .eslintrc.yml diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index c080459f8..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,32 +0,0 @@ -module.exports = { - root: true, - env: { - node: true - }, - parser: "@typescript-eslint/parser", - parserOptions: { - project: ['./tsconfig.json'] - }, - plugins: [ - "@typescript-eslint" - ], - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking" - ], - ignorePatterns: ["**/*.js"], - rules: { - "no-case-declarations": "off", - "@typescript-eslint/no-inferrable-types": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/member-delimiter-style": "off", - "@typescript-eslint/member-ordering": "error", - "@typescript-eslint/unbound-method": ["error", { - "ignoreStatic": true - }] - } -}; diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 000000000..6544dbbf0 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,31 @@ +parser: '@typescript-eslint/parser' +plugins: + - '@typescript-eslint' +parserOptions: + ecmaVersion: 2018 + sourceType: module + project: + - ./tsconfig.json + - ./tsconfig.spec.json +extends: + - 'plugin:@typescript-eslint/recommended' + - 'plugin:@typescript-eslint/recommended-requiring-type-checking' + - 'plugin:jest/recommended' + - 'prettier' + - 'prettier/@typescript-eslint' +rules: + '@typescript-eslint/explicit-member-accessibility': off + '@typescript-eslint/no-angle-bracket-type-assertion': off + '@typescript-eslint/no-parameter-properties': off + '@typescript-eslint/explicit-function-return-type': off + '@typescript-eslint/member-delimiter-style': off + '@typescript-eslint/no-inferrable-types': off + '@typescript-eslint/no-explicit-any': off + '@typescript-eslint/member-ordering': 'error' + # TODO: Remove these and fixed issues once we merged all the current PRs. + '@typescript-eslint/ban-types': off + '@typescript-eslint/no-unsafe-return': off + '@typescript-eslint/no-unsafe-assignment': off + '@typescript-eslint/no-unsafe-call': off + '@typescript-eslint/no-unsafe-member-access': off + '@typescript-eslint/explicit-module-boundary-types': off \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 10c5595b0..2b822ff87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2388,6 +2388,15 @@ } } }, + "eslint-config-prettier": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, "eslint-plugin-jest": { "version": "23.19.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.19.0.tgz", @@ -2958,6 +2967,12 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", diff --git a/package.json b/package.json index a9de57220..b2ecd24ee 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,7 @@ "@typescript-eslint/parser": "^3.7.1", "dayjs": "1.8.23", "eslint": "^7.5.0", + "eslint-config-prettier": "^6.11.0", "eslint-plugin-jest": "^23.19.0", "husky": "^4.2.5", "jest": "^26.1.0", diff --git a/src/TransformOperationExecutor.ts b/src/TransformOperationExecutor.ts index e3ee15aa7..6b10ebfe7 100644 --- a/src/TransformOperationExecutor.ts +++ b/src/TransformOperationExecutor.ts @@ -1,451 +1,508 @@ -import { ClassTransformOptions } from "./ClassTransformOptions"; -import { defaultMetadataStorage } from "./storage"; -import { TypeHelpOptions, TypeOptions } from "./metadata/ExposeExcludeOptions"; -import { TypeMetadata } from "./metadata/TypeMetadata"; +import { ClassTransformOptions } from './ClassTransformOptions'; +import { defaultMetadataStorage } from './storage'; +import { TypeHelpOptions, TypeOptions } from './metadata/ExposeExcludeOptions'; +import { TypeMetadata } from './metadata/TypeMetadata'; export enum TransformationType { - PLAIN_TO_CLASS, - CLASS_TO_PLAIN, - CLASS_TO_CLASS + PLAIN_TO_CLASS, + CLASS_TO_PLAIN, + CLASS_TO_CLASS, } export function testForBuffer(): boolean { - try { - Buffer.isBuffer({/* empty object */}); - return true; - } catch { - return false; - } + try { + Buffer.isBuffer({ + /* empty object */ + }); + return true; + } catch { + return false; + } } function instantiateArrayType(arrayType: Function): Array | Set { - const array = new (arrayType as any)(); - if (!(array instanceof Set) && !("push" in array)) { - return []; - } - return array; + const array = new (arrayType as any)(); + if (!(array instanceof Set) && !('push' in array)) { + return []; + } + return array; } export class TransformOperationExecutor { - - // ------------------------------------------------------------------------- - // Private Properties - // ------------------------------------------------------------------------- - - private recursionStack = new Set>(); - - // ------------------------------------------------------------------------- - // Constructor - // ------------------------------------------------------------------------- - - constructor(private transformationType: TransformationType, - private options: ClassTransformOptions) { - } - - // ------------------------------------------------------------------------- - // Public Methods - // ------------------------------------------------------------------------- - - transform(source: Record | Record[] | any, - value: Record | Record[] | any, - targetType: Function | TypeMetadata, - arrayType: Function, - isMap: boolean, - level: number = 0): any { - - if (Array.isArray(value) || value instanceof Set) { - const newValue = arrayType && this.transformationType === TransformationType.PLAIN_TO_CLASS ? instantiateArrayType(arrayType) : []; - (value as any[]).forEach((subValue, index) => { - const subSource = source ? source[index] : undefined; - if (!this.options.enableCircularCheck || !this.isCircular(subValue)) { - let realTargetType; - if (typeof targetType !== "function" && targetType && targetType.options && targetType.options.discriminator && targetType.options.discriminator.property && targetType.options.discriminator.subTypes) { - if (this.transformationType === TransformationType.PLAIN_TO_CLASS) { - realTargetType = targetType.options.discriminator.subTypes.find((subType) => subType.name === subValue[(targetType as { options: TypeOptions }).options.discriminator.property]); - const options: TypeHelpOptions = { newObject: newValue, object: subValue, property: undefined }; - const newType = targetType.typeFunction(options); - realTargetType === undefined ? realTargetType = newType : realTargetType = realTargetType.value; - if (!targetType.options.keepDiscriminatorProperty) delete subValue[targetType.options.discriminator.property]; - } - if (this.transformationType === TransformationType.CLASS_TO_CLASS) { - realTargetType = subValue.constructor; - } - if (this.transformationType === TransformationType.CLASS_TO_PLAIN) { - subValue[targetType.options.discriminator.property] = targetType.options.discriminator.subTypes.find((subType) => subType.value === subValue.constructor).name; - } - } else { - realTargetType = targetType; - } - const value = this.transform(subSource, subValue, realTargetType, undefined, subValue instanceof Map, level + 1); - - if (newValue instanceof Set) { - newValue.add(value); - } else { - newValue.push(value); - } - } else if (this.transformationType === TransformationType.CLASS_TO_CLASS) { - if (newValue instanceof Set) { - newValue.add(subValue); - } else { - newValue.push(subValue); - } - } - }); - return newValue; - } else if (targetType === String && !isMap) { - if (value === null || value === undefined) - return value; - return String(value); - - } else if (targetType === Number && !isMap) { - if (value === null || value === undefined) - return value; - return Number(value); - - } else if (targetType === Boolean && !isMap) { - if (value === null || value === undefined) - return value; - return Boolean(value); - - } else if ((targetType === Date || value instanceof Date) && !isMap) { - if (value instanceof Date) { - return new Date(value.valueOf()); + // ------------------------------------------------------------------------- + // Private Properties + // ------------------------------------------------------------------------- + + private recursionStack = new Set>(); + + // ------------------------------------------------------------------------- + // Constructor + // ------------------------------------------------------------------------- + + constructor(private transformationType: TransformationType, private options: ClassTransformOptions) {} + + // ------------------------------------------------------------------------- + // Public Methods + // ------------------------------------------------------------------------- + + transform( + source: Record | Record[] | any, + value: Record | Record[] | any, + targetType: Function | TypeMetadata, + arrayType: Function, + isMap: boolean, + level: number = 0 + ): any { + if (Array.isArray(value) || value instanceof Set) { + const newValue = + arrayType && this.transformationType === TransformationType.PLAIN_TO_CLASS + ? instantiateArrayType(arrayType) + : []; + (value as any[]).forEach((subValue, index) => { + const subSource = source ? source[index] : undefined; + if (!this.options.enableCircularCheck || !this.isCircular(subValue)) { + let realTargetType; + if ( + typeof targetType !== 'function' && + targetType && + targetType.options && + targetType.options.discriminator && + targetType.options.discriminator.property && + targetType.options.discriminator.subTypes + ) { + if (this.transformationType === TransformationType.PLAIN_TO_CLASS) { + realTargetType = targetType.options.discriminator.subTypes.find( + subType => + subType.name === subValue[(targetType as { options: TypeOptions }).options.discriminator.property] + ); + const options: TypeHelpOptions = { newObject: newValue, object: subValue, property: undefined }; + const newType = targetType.typeFunction(options); + realTargetType === undefined ? (realTargetType = newType) : (realTargetType = realTargetType.value); + if (!targetType.options.keepDiscriminatorProperty) + delete subValue[targetType.options.discriminator.property]; } - if (value === null || value === undefined) - return value; - return new Date(value); - - } else if (testForBuffer() && (targetType === Buffer || value instanceof Buffer) && !isMap) { - if (value === null || value === undefined) - return value; - return Buffer.from(value); - - } else if (typeof value === "object" && value !== null) { + if (this.transformationType === TransformationType.CLASS_TO_CLASS) { + realTargetType = subValue.constructor; + } + if (this.transformationType === TransformationType.CLASS_TO_PLAIN) { + subValue[targetType.options.discriminator.property] = targetType.options.discriminator.subTypes.find( + subType => subType.value === subValue.constructor + ).name; + } + } else { + realTargetType = targetType; + } + const value = this.transform( + subSource, + subValue, + realTargetType, + undefined, + subValue instanceof Map, + level + 1 + ); + + if (newValue instanceof Set) { + newValue.add(value); + } else { + newValue.push(value); + } + } else if (this.transformationType === TransformationType.CLASS_TO_CLASS) { + if (newValue instanceof Set) { + newValue.add(subValue); + } else { + newValue.push(subValue); + } + } + }); + return newValue; + } else if (targetType === String && !isMap) { + if (value === null || value === undefined) return value; + return String(value); + } else if (targetType === Number && !isMap) { + if (value === null || value === undefined) return value; + return Number(value); + } else if (targetType === Boolean && !isMap) { + if (value === null || value === undefined) return value; + return Boolean(value); + } else if ((targetType === Date || value instanceof Date) && !isMap) { + if (value instanceof Date) { + return new Date(value.valueOf()); + } + if (value === null || value === undefined) return value; + return new Date(value); + } else if (testForBuffer() && (targetType === Buffer || value instanceof Buffer) && !isMap) { + if (value === null || value === undefined) return value; + return Buffer.from(value); + } else if (typeof value === 'object' && value !== null) { + // try to guess the type + if (!targetType && value.constructor !== Object /* && TransformationType === TransformationType.CLASS_TO_PLAIN*/) + targetType = value.constructor; + if (!targetType && source) targetType = source.constructor; + + if (this.options.enableCircularCheck) { + // add transformed type to prevent circular references + this.recursionStack.add(value); + } + + const keys = this.getKeys(targetType as Function, value); + let newValue: any = source ? source : {}; + if ( + !source && + (this.transformationType === TransformationType.PLAIN_TO_CLASS || + this.transformationType === TransformationType.CLASS_TO_CLASS) + ) { + if (isMap) { + newValue = new Map(); + } else if (targetType) { + newValue = new (targetType as any)(); + } else { + newValue = {}; + } + } - // try to guess the type - if (!targetType && value.constructor !== Object/* && TransformationType === TransformationType.CLASS_TO_PLAIN*/) targetType = value.constructor; - if (!targetType && source) targetType = source.constructor; + // traverse over keys + for (const key of keys) { + if (key === '__proto__' || key === 'constructor') { + continue; + } - if (this.options.enableCircularCheck) { - // add transformed type to prevent circular references - this.recursionStack.add(value); + const valueKey = key; + let newValueKey = key, + propertyName = key; + if (!this.options.ignoreDecorators && targetType) { + if (this.transformationType === TransformationType.PLAIN_TO_CLASS) { + const exposeMetadata = defaultMetadataStorage.findExposeMetadataByCustomName(targetType as Function, key); + if (exposeMetadata) { + propertyName = exposeMetadata.propertyName; + newValueKey = exposeMetadata.propertyName; } - - const keys = this.getKeys((targetType as Function), value); - let newValue: any = source ? source : {}; - if (!source && (this.transformationType === TransformationType.PLAIN_TO_CLASS || this.transformationType === TransformationType.CLASS_TO_CLASS)) { - if (isMap) { - newValue = new Map(); - } else if (targetType) { - newValue = new (targetType as any)(); - } else { - newValue = {}; - } + } else if ( + this.transformationType === TransformationType.CLASS_TO_PLAIN || + this.transformationType === TransformationType.CLASS_TO_CLASS + ) { + const exposeMetadata = defaultMetadataStorage.findExposeMetadata(targetType as Function, key); + if (exposeMetadata && exposeMetadata.options && exposeMetadata.options.name) { + newValueKey = exposeMetadata.options.name; } + } + } - // traverse over keys - for (const key of keys) { - if (key === '__proto__' || key === 'constructor') { - continue; - } + // get a subvalue + let subValue: any = undefined; + if (value instanceof Map) { + subValue = value.get(valueKey); + } else if (value[valueKey] instanceof Function) { + subValue = value[valueKey](); + } else { + subValue = value[valueKey]; + } - const valueKey = key; - let newValueKey = key, propertyName = key; - if (!this.options.ignoreDecorators && targetType) { - if (this.transformationType === TransformationType.PLAIN_TO_CLASS) { - const exposeMetadata = defaultMetadataStorage.findExposeMetadataByCustomName((targetType as Function), key); - if (exposeMetadata) { - propertyName = exposeMetadata.propertyName; - newValueKey = exposeMetadata.propertyName; - } - - } else if (this.transformationType === TransformationType.CLASS_TO_PLAIN || this.transformationType === TransformationType.CLASS_TO_CLASS) { - const exposeMetadata = defaultMetadataStorage.findExposeMetadata((targetType as Function), key); - if (exposeMetadata && exposeMetadata.options && exposeMetadata.options.name) { - newValueKey = exposeMetadata.options.name; - } + // determine a type + let type: any = undefined, + isSubValueMap = subValue instanceof Map; + if (targetType && isMap) { + type = targetType; + } else if (targetType) { + const metadata = defaultMetadataStorage.findTypeMetadata(targetType as Function, propertyName); + if (metadata) { + const options: TypeHelpOptions = { newObject: newValue, object: value, property: propertyName }; + const newType = metadata.typeFunction ? metadata.typeFunction(options) : metadata.reflectedType; + if ( + metadata.options && + metadata.options.discriminator && + metadata.options.discriminator.property && + metadata.options.discriminator.subTypes + ) { + if (!(value[valueKey] instanceof Array)) { + if (this.transformationType === TransformationType.PLAIN_TO_CLASS) { + type = metadata.options.discriminator.subTypes.find(subType => { + if (subValue && metadata.options.discriminator.property in subValue) { + return subType.name === subValue[metadata.options.discriminator.property]; } - } - - // get a subvalue - let subValue: any = undefined; - if (value instanceof Map) { - subValue = value.get(valueKey); - } else if (value[valueKey] instanceof Function) { - subValue = value[valueKey](); - } else { - subValue = value[valueKey]; - } - - // determine a type - let type: any = undefined, isSubValueMap = subValue instanceof Map; - if (targetType && isMap) { - type = targetType; - - } else if (targetType) { - - const metadata = defaultMetadataStorage.findTypeMetadata((targetType as Function), propertyName); - if (metadata) { - const options: TypeHelpOptions = { newObject: newValue, object: value, property: propertyName }; - const newType = metadata.typeFunction ? metadata.typeFunction(options) : metadata.reflectedType; - if (metadata.options && metadata.options.discriminator && metadata.options.discriminator.property && metadata.options.discriminator.subTypes) { - if (!(value[valueKey] instanceof Array)) { - if (this.transformationType === TransformationType.PLAIN_TO_CLASS) { - type = metadata.options.discriminator.subTypes.find((subType) => { - if (subValue && metadata.options.discriminator.property in subValue) { - return subType.name === subValue[metadata.options.discriminator.property] - } - }); - type === undefined ? type = newType : type = type.value; - if (!metadata.options.keepDiscriminatorProperty) { - if (subValue && metadata.options.discriminator.property in subValue) { - delete subValue[metadata.options.discriminator.property]; - } - } - } - if (this.transformationType === TransformationType.CLASS_TO_CLASS) { - type = subValue.constructor; - } - if (this.transformationType === TransformationType.CLASS_TO_PLAIN) { - subValue[metadata.options.discriminator.property] = metadata.options.discriminator.subTypes.find((subType) => subType.value === subValue.constructor).name; - } - } else { - type = metadata; - } - } else { - type = newType; - } - isSubValueMap = isSubValueMap || metadata.reflectedType === Map; - } else if (this.options.targetMaps) { // try to find a type in target maps - this.options.targetMaps - .filter(map => map.target === targetType && !!map.properties[propertyName]) - .forEach(map => type = map.properties[propertyName]); - } else if(this.options.enableImplicitConversion && this.transformationType === TransformationType.PLAIN_TO_CLASS) { - // if we have no registererd type via the @Type() decorator then we check if we have any - // type declarations in reflect-metadata (type declaration is emited only if some decorator is added to the property.) - // TODO: Remove ts-ignore - // @ts-ignore: Unreachable code error - const reflectedType = Reflect.getMetadata("design:type", (targetType as Function).prototype, propertyName); - - if (reflectedType) { - type = reflectedType; - } + }); + type === undefined ? (type = newType) : (type = type.value); + if (!metadata.options.keepDiscriminatorProperty) { + if (subValue && metadata.options.discriminator.property in subValue) { + delete subValue[metadata.options.discriminator.property]; } + } } - - // if value is an array try to get its custom array type - const arrayType = Array.isArray(value[valueKey]) ? this.getReflectedType((targetType as Function), propertyName) : undefined; - - // const subValueKey = TransformationType === TransformationType.PLAIN_TO_CLASS && newKeyName ? newKeyName : key; - const subSource = source ? source[valueKey] : undefined; - - // if its deserialization then type if required - // if we uncomment this types like string[] will not work - // if (this.transformationType === TransformationType.PLAIN_TO_CLASS && !type && subValue instanceof Object && !(subValue instanceof Date)) - // throw new Error(`Cannot determine type for ${(targetType as any).name }.${propertyName}, did you forget to specify a @Type?`); - - // if newValue is a source object that has method that match newKeyName then skip it - if (newValue.constructor.prototype) { - const descriptor = Object.getOwnPropertyDescriptor(newValue.constructor.prototype, newValueKey); - if ((this.transformationType === TransformationType.PLAIN_TO_CLASS || this.transformationType === TransformationType.CLASS_TO_CLASS) - // eslint-disable-next-line @typescript-eslint/unbound-method - && ((descriptor && !descriptor.set) || newValue[newValueKey] instanceof Function)) // || TransformationType === TransformationType.CLASS_TO_CLASS - continue; + if (this.transformationType === TransformationType.CLASS_TO_CLASS) { + type = subValue.constructor; } - - if (!this.options.enableCircularCheck || !this.isCircular(subValue)) { - const transformKey = this.transformationType === TransformationType.PLAIN_TO_CLASS ? newValueKey : key; - let finalValue; - - if (this.transformationType === TransformationType.CLASS_TO_PLAIN) { - // Get original value - finalValue = value[transformKey]; - // Apply custom transformation - finalValue = this.applyCustomTransformations(finalValue, (targetType as Function), transformKey, value, this.transformationType); - // If nothing change, it means no custom transformation was applied, so use the subValue. - finalValue = (value[transformKey] === finalValue) ? subValue : finalValue; - // Apply the default transformation - finalValue = this.transform(subSource, finalValue, type, arrayType, isSubValueMap, level + 1); - } else { - finalValue = this.transform(subSource, subValue, type, arrayType, isSubValueMap, level + 1); - finalValue = this.applyCustomTransformations(finalValue, (targetType as Function), transformKey, value, this.transformationType); - } - - if (newValue instanceof Map) { - newValue.set(newValueKey, finalValue); - } else { - newValue[newValueKey] = finalValue; - } - } else if (this.transformationType === TransformationType.CLASS_TO_CLASS) { - let finalValue = subValue; - finalValue = this.applyCustomTransformations(finalValue, (targetType as Function), key, value, this.transformationType); - if (newValue instanceof Map) { - newValue.set(newValueKey, finalValue); - } else { - newValue[newValueKey] = finalValue; - } + if (this.transformationType === TransformationType.CLASS_TO_PLAIN) { + subValue[metadata.options.discriminator.property] = metadata.options.discriminator.subTypes.find( + subType => subType.value === subValue.constructor + ).name; } - + } else { + type = metadata; + } + } else { + type = newType; } - - if (this.options.enableCircularCheck) { - this.recursionStack.delete(value); + isSubValueMap = isSubValueMap || metadata.reflectedType === Map; + } else if (this.options.targetMaps) { + // try to find a type in target maps + this.options.targetMaps + .filter(map => map.target === targetType && !!map.properties[propertyName]) + .forEach(map => (type = map.properties[propertyName])); + } else if ( + this.options.enableImplicitConversion && + this.transformationType === TransformationType.PLAIN_TO_CLASS + ) { + // if we have no registererd type via the @Type() decorator then we check if we have any + // type declarations in reflect-metadata (type declaration is emited only if some decorator is added to the property.) + const reflectedType = (Reflect as any).getMetadata( + 'design:type', + (targetType as Function).prototype, + propertyName + ); + + if (reflectedType) { + type = reflectedType; } - - return newValue; - - } else { - return value; + } } - } - private applyCustomTransformations(value: any, target: Function, key: string, obj: any, transformationType: TransformationType): boolean { - let metadatas = defaultMetadataStorage.findTransformMetadatas(target, key, this.transformationType); - - // apply versioning options - if (this.options.version !== undefined) { - metadatas = metadatas.filter(metadata => { - if (!metadata.options) - return true; - - return this.checkVersion(metadata.options.since, metadata.options.until); - }); + // if value is an array try to get its custom array type + const arrayType = Array.isArray(value[valueKey]) + ? this.getReflectedType(targetType as Function, propertyName) + : undefined; + + // const subValueKey = TransformationType === TransformationType.PLAIN_TO_CLASS && newKeyName ? newKeyName : key; + const subSource = source ? source[valueKey] : undefined; + + // if its deserialization then type if required + // if we uncomment this types like string[] will not work + // if (this.transformationType === TransformationType.PLAIN_TO_CLASS && !type && subValue instanceof Object && !(subValue instanceof Date)) + // throw new Error(`Cannot determine type for ${(targetType as any).name }.${propertyName}, did you forget to specify a @Type?`); + + // if newValue is a source object that has method that match newKeyName then skip it + if (newValue.constructor.prototype) { + const descriptor = Object.getOwnPropertyDescriptor(newValue.constructor.prototype, newValueKey); + if ( + (this.transformationType === TransformationType.PLAIN_TO_CLASS || + this.transformationType === TransformationType.CLASS_TO_CLASS) && + // eslint-disable-next-line @typescript-eslint/unbound-method + ((descriptor && !descriptor.set) || newValue[newValueKey] instanceof Function) + ) + // || TransformationType === TransformationType.CLASS_TO_CLASS + continue; } - // apply grouping options - if (this.options.groups && this.options.groups.length) { - metadatas = metadatas.filter(metadata => { - if (!metadata.options) - return true; - - return this.checkGroups(metadata.options.groups); - }); - } else { - metadatas = metadatas.filter(metadata => { - return !metadata.options || !metadata.options.groups || !metadata.options.groups.length; - }); + if (!this.options.enableCircularCheck || !this.isCircular(subValue)) { + const transformKey = this.transformationType === TransformationType.PLAIN_TO_CLASS ? newValueKey : key; + let finalValue; + + if (this.transformationType === TransformationType.CLASS_TO_PLAIN) { + // Get original value + finalValue = value[transformKey]; + // Apply custom transformation + finalValue = this.applyCustomTransformations( + finalValue, + targetType as Function, + transformKey, + value, + this.transformationType + ); + // If nothing change, it means no custom transformation was applied, so use the subValue. + finalValue = value[transformKey] === finalValue ? subValue : finalValue; + // Apply the default transformation + finalValue = this.transform(subSource, finalValue, type, arrayType, isSubValueMap, level + 1); + } else { + finalValue = this.transform(subSource, subValue, type, arrayType, isSubValueMap, level + 1); + finalValue = this.applyCustomTransformations( + finalValue, + targetType as Function, + transformKey, + value, + this.transformationType + ); + } + + if (newValue instanceof Map) { + newValue.set(newValueKey, finalValue); + } else { + newValue[newValueKey] = finalValue; + } + } else if (this.transformationType === TransformationType.CLASS_TO_CLASS) { + let finalValue = subValue; + finalValue = this.applyCustomTransformations( + finalValue, + targetType as Function, + key, + value, + this.transformationType + ); + if (newValue instanceof Map) { + newValue.set(newValueKey, finalValue); + } else { + newValue[newValueKey] = finalValue; + } } + } - metadatas.forEach(metadata => { - value = metadata.transformFn(value, obj, transformationType); - }); + if (this.options.enableCircularCheck) { + this.recursionStack.delete(value); + } - return value; + return newValue; + } else { + return value; } - - // preventing circular references - private isCircular(object: Record): boolean { - return this.recursionStack.has(object); + } + + private applyCustomTransformations( + value: any, + target: Function, + key: string, + obj: any, + transformationType: TransformationType + ): boolean { + let metadatas = defaultMetadataStorage.findTransformMetadatas(target, key, this.transformationType); + + // apply versioning options + if (this.options.version !== undefined) { + metadatas = metadatas.filter(metadata => { + if (!metadata.options) return true; + + return this.checkVersion(metadata.options.since, metadata.options.until); + }); } - private getReflectedType(target: Function, propertyName: string): Function | undefined { - if (!target) return undefined; - const meta = defaultMetadataStorage.findTypeMetadata(target, propertyName); - return meta ? meta.reflectedType : undefined; + // apply grouping options + if (this.options.groups && this.options.groups.length) { + metadatas = metadatas.filter(metadata => { + if (!metadata.options) return true; + + return this.checkGroups(metadata.options.groups); + }); + } else { + metadatas = metadatas.filter(metadata => { + return !metadata.options || !metadata.options.groups || !metadata.options.groups.length; + }); } - private getKeys(target: Function, object: Record): string[] { - // determine exclusion strategy - let strategy = defaultMetadataStorage.getStrategy(target); - if (strategy === "none") - strategy = this.options.strategy || "exposeAll"; // exposeAll is default strategy - - // get all keys that need to expose - let keys: any[] = []; - if (strategy === "exposeAll") { - if (object instanceof Map) { - keys = Array.from(object.keys()); - } else { - keys = Object.keys(object); - } - } - - if (!this.options.ignoreDecorators && target) { - - // add all exposed to list of keys - let exposedProperties = defaultMetadataStorage.getExposedProperties(target, this.transformationType); - if (this.transformationType === TransformationType.PLAIN_TO_CLASS) { - exposedProperties = exposedProperties.map(key => { - const exposeMetadata = defaultMetadataStorage.findExposeMetadata(target, key); - if (exposeMetadata && exposeMetadata.options && exposeMetadata.options.name) { - return exposeMetadata.options.name; - } - - return key; - }); - } - if (this.options.excludeExtraneousValues) { - keys = exposedProperties; - } else { - keys = keys.concat(exposedProperties); - } - - // exclude excluded properties - const excludedProperties = defaultMetadataStorage.getExcludedProperties(target, this.transformationType); - if (excludedProperties.length > 0) { - keys = keys.filter(key => { - return !excludedProperties.includes(key); - }); - } - - // apply versioning options - if (this.options.version !== undefined) { - keys = keys.filter(key => { - const exposeMetadata = defaultMetadataStorage.findExposeMetadata(target, key); - if (!exposeMetadata || !exposeMetadata.options) - return true; + metadatas.forEach(metadata => { + value = metadata.transformFn(value, obj, transformationType); + }); + + return value; + } + + // preventing circular references + private isCircular(object: Record): boolean { + return this.recursionStack.has(object); + } + + private getReflectedType(target: Function, propertyName: string): Function | undefined { + if (!target) return undefined; + const meta = defaultMetadataStorage.findTypeMetadata(target, propertyName); + return meta ? meta.reflectedType : undefined; + } + + private getKeys(target: Function, object: Record): string[] { + // determine exclusion strategy + let strategy = defaultMetadataStorage.getStrategy(target); + if (strategy === 'none') strategy = this.options.strategy || 'exposeAll'; // exposeAll is default strategy + + // get all keys that need to expose + let keys: any[] = []; + if (strategy === 'exposeAll') { + if (object instanceof Map) { + keys = Array.from(object.keys()); + } else { + keys = Object.keys(object); + } + } - return this.checkVersion(exposeMetadata.options.since, exposeMetadata.options.until); - }); - } + if (!this.options.ignoreDecorators && target) { + // add all exposed to list of keys + let exposedProperties = defaultMetadataStorage.getExposedProperties(target, this.transformationType); + if (this.transformationType === TransformationType.PLAIN_TO_CLASS) { + exposedProperties = exposedProperties.map(key => { + const exposeMetadata = defaultMetadataStorage.findExposeMetadata(target, key); + if (exposeMetadata && exposeMetadata.options && exposeMetadata.options.name) { + return exposeMetadata.options.name; + } + + return key; + }); + } + if (this.options.excludeExtraneousValues) { + keys = exposedProperties; + } else { + keys = keys.concat(exposedProperties); + } + + // exclude excluded properties + const excludedProperties = defaultMetadataStorage.getExcludedProperties(target, this.transformationType); + if (excludedProperties.length > 0) { + keys = keys.filter(key => { + return !excludedProperties.includes(key); + }); + } - // apply grouping options - if (this.options.groups && this.options.groups.length) { - keys = keys.filter(key => { - const exposeMetadata = defaultMetadataStorage.findExposeMetadata(target, key); - if (!exposeMetadata || !exposeMetadata.options) - return true; + // apply versioning options + if (this.options.version !== undefined) { + keys = keys.filter(key => { + const exposeMetadata = defaultMetadataStorage.findExposeMetadata(target, key); + if (!exposeMetadata || !exposeMetadata.options) return true; - return this.checkGroups(exposeMetadata.options.groups); - }); - } else { - keys = keys.filter(key => { - const exposeMetadata = defaultMetadataStorage.findExposeMetadata(target, key); - return !exposeMetadata || !exposeMetadata.options || !exposeMetadata.options.groups || !exposeMetadata.options.groups.length; - }); - } - } + return this.checkVersion(exposeMetadata.options.since, exposeMetadata.options.until); + }); + } - // exclude prefixed properties - if (this.options.excludePrefixes && this.options.excludePrefixes.length) { - keys = keys.filter(key => this.options.excludePrefixes.every(prefix => { - return key.substr(0, prefix.length) !== prefix; - })); - } + // apply grouping options + if (this.options.groups && this.options.groups.length) { + keys = keys.filter(key => { + const exposeMetadata = defaultMetadataStorage.findExposeMetadata(target, key); + if (!exposeMetadata || !exposeMetadata.options) return true; - // make sure we have unique keys - keys = keys.filter((key, index, self) => { - return self.indexOf(key) === index; + return this.checkGroups(exposeMetadata.options.groups); }); + } else { + keys = keys.filter(key => { + const exposeMetadata = defaultMetadataStorage.findExposeMetadata(target, key); + return ( + !exposeMetadata || + !exposeMetadata.options || + !exposeMetadata.options.groups || + !exposeMetadata.options.groups.length + ); + }); + } + } - return keys; + // exclude prefixed properties + if (this.options.excludePrefixes && this.options.excludePrefixes.length) { + keys = keys.filter(key => + this.options.excludePrefixes.every(prefix => { + return key.substr(0, prefix.length) !== prefix; + }) + ); } - private checkVersion(since: number, until: number): boolean { - let decision = true; - if (decision && since) - decision = this.options.version >= since; - if (decision && until) - decision = this.options.version < until; + // make sure we have unique keys + keys = keys.filter((key, index, self) => { + return self.indexOf(key) === index; + }); - return decision; - } + return keys; + } - private checkGroups(groups: string[]): boolean { - if (!groups) - return true; + private checkVersion(since: number, until: number): boolean { + let decision = true; + if (decision && since) decision = this.options.version >= since; + if (decision && until) decision = this.options.version < until; - return this.options.groups.some(optionGroup => groups.includes(optionGroup)); - } -} + return decision; + } + private checkGroups(groups: string[]): boolean { + if (!groups) return true; + + return this.options.groups.some(optionGroup => groups.includes(optionGroup)); + } +} diff --git a/src/metadata/TypeMetadata.ts b/src/metadata/TypeMetadata.ts index 415229938..5437bf38b 100644 --- a/src/metadata/TypeMetadata.ts +++ b/src/metadata/TypeMetadata.ts @@ -1,12 +1,11 @@ -import {TypeHelpOptions, Discriminator, TypeOptions} from "./ExposeExcludeOptions"; +import { TypeHelpOptions, TypeOptions } from './ExposeExcludeOptions'; export class TypeMetadata { - - constructor(public target: Function, - public propertyName: string, - public reflectedType: any, - public typeFunction: (options?: TypeHelpOptions) => Function, - public options: TypeOptions) { - } - + constructor( + public target: Function, + public propertyName: string, + public reflectedType: any, + public typeFunction: (options?: TypeHelpOptions) => Function, + public options: TypeOptions + ) {} } From f6413c9912f5b7db9174b674625d23933a6d46c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20Ol=C3=A1h?= Date: Wed, 29 Jul 2020 21:53:44 +0200 Subject: [PATCH 26/30] refactor: format code with prettier (#379) --- CHANGELOG.md | 63 +- sample/sample1-simple-usage/Album.ts | 18 +- sample/sample1-simple-usage/Photo.ts | 40 +- sample/sample1-simple-usage/User.ts | 22 +- sample/sample1-simple-usage/app.ts | 125 +- sample/sample2-iheritance/Album.ts | 20 +- sample/sample2-iheritance/Authorable.ts | 18 +- sample/sample2-iheritance/Photo.ts | 24 +- sample/sample2-iheritance/User.ts | 22 +- sample/sample2-iheritance/app.ts | 132 +- sample/sample3-custom-arrays/Album.ts | 9 +- sample/sample3-custom-arrays/AlbumArray.ts | 12 +- sample/sample3-custom-arrays/Photo.ts | 22 +- sample/sample3-custom-arrays/app.ts | 45 +- sample/sample4-generics/SimpleCollection.ts | 9 +- sample/sample4-generics/SuperCollection.ts | 30 +- sample/sample4-generics/User.ts | 40 +- sample/sample4-generics/app.ts | 44 +- sample/sample5-custom-transformer/User.ts | 20 +- sample/sample5-custom-transformer/app.ts | 16 +- src/ClassTransformOptions.ts | 111 +- src/ClassTransformer.ts | 209 +- src/decorators.ts | 131 +- src/index.ts | 69 +- src/metadata/ExcludeMetadata.ts | 11 +- src/metadata/ExposeExcludeOptions.ts | 51 +- src/metadata/ExposeMetadata.ts | 11 +- src/metadata/MetadataStorage.ts | 407 +- src/metadata/TransformMetadata.ts | 17 +- src/storage.ts | 2 +- test/functional/basic-functionality.spec.ts | 3603 +++++++++-------- .../circular-reference-problem.spec.ts | 287 +- test/functional/custom-transform.spec.ts | 1420 +++---- test/functional/es6-data-types.spec.ts | 513 ++- test/functional/ignore-decorators.spec.ts | 52 +- .../implicit-type-declarations.spec.ts | 252 +- test/functional/inheritence.spec.ts | 70 +- .../serialization-deserialization.spec.ts | 255 +- test/functional/specify-maps.spec.ts | 3307 +++++++-------- test/functional/transformation-option.spec.ts | 312 +- test/functional/transformer-method.spec.ts | 416 +- test/functional/transformer-order.spec.ts | 24 +- 42 files changed, 6204 insertions(+), 6057 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7ee958ee..179af61e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,5 @@ # Changelog and release notes - ### 0.2.3 [BREAKING CHANGE] #### Changed @@ -24,97 +23,97 @@ This version has introduced a breaking-change when this library is used with cla #### Added -- add option to strip unkown properties via using the `excludeExtraneousValues` option +- add option to strip unkown properties via using the `excludeExtraneousValues` option ### 0.2.0 [BREAKING CHANGE] #### Added -- add documentation for using `Set`s and `Map`s -- add opotion to pass a discriminator function to convert values into different types based on custom conditions -- added support for polymorphism based on a named type property +- add documentation for using `Set`s and `Map`s +- add opotion to pass a discriminator function to convert values into different types based on custom conditions +- added support for polymorphism based on a named type property #### Fixed -- fix bug when transforming `null` values as primitives +- fix bug when transforming `null` values as primitives ### 0.1.10 #### Fixed -- improve MetadataStorage perf by changing from Arrays to ES6 Maps by @sheiidan -- fixed getAncestor issue with unknown nested properties by @247GradLabs +- improve MetadataStorage perf by changing from Arrays to ES6 Maps by @sheiidan +- fixed getAncestor issue with unknown nested properties by @247GradLabs ### 0.1.9 #### Fixed -- objects with `null` prototype are converted properly now -- objects with unknown non primitive properties are converted properly now -- corrected a typo in the README.md -- fixed the deserialize example in the README.md +- objects with `null` prototype are converted properly now +- objects with unknown non primitive properties are converted properly now +- corrected a typo in the README.md +- fixed the deserialize example in the README.md ### 0.1.4 #### Added -- added `TransformClassToPlain` and `TransformClassToClass` decorators +- added `TransformClassToPlain` and `TransformClassToClass` decorators ### 0.1.0 #### Added -- renamed library from `constructor-utils` to `class-transformer` -- completely renamed most of names -- renamed all main methods: `plainToConstructor` now is `plainToClass` and `constructorToPlain` is `classToPlain`, etc. -- `plainToConstructorArray` method removed - now `plainToClass` handles it -- `@Skip()` decorator renamed to `@Exclude()` -- added `@Expose` decorator -- added lot of new options: groups, versioning, custom names, etc. -- methods and getters that should be exposed must be decorated with `@Expose` decorator -- added `excludedPrefix` to class transform options that allows exclude properties that start with one of the given prefix +- renamed library from `constructor-utils` to `class-transformer` +- completely renamed most of names +- renamed all main methods: `plainToConstructor` now is `plainToClass` and `constructorToPlain` is `classToPlain`, etc. +- `plainToConstructorArray` method removed - now `plainToClass` handles it +- `@Skip()` decorator renamed to `@Exclude()` +- added `@Expose` decorator +- added lot of new options: groups, versioning, custom names, etc. +- methods and getters that should be exposed must be decorated with `@Expose` decorator +- added `excludedPrefix` to class transform options that allows exclude properties that start with one of the given prefix ### 0.0.22 #### Fixed -- fixed array with primitive types being converted +- fixed array with primitive types being converted ### 0.0.18-0.0.21 #### Fixed -- fixed bugs when getters are not converted with es6 target +- fixed bugs when getters are not converted with es6 target ### 0.0.17 #### Fixed -- fixed issue #4 -- added type guessing during transformation from constructor to plain object -- added sample with generics +- fixed issue #4 +- added type guessing during transformation from constructor to plain object +- added sample with generics ### 0.0.16 #### Changed -- renamed `constructor-utils/constructor-utils` to `constructor-utils` package namespace +- renamed `constructor-utils/constructor-utils` to `constructor-utils` package namespace ### 0.0.15 #### Removed -- removed code mappings from package +- removed code mappings from package ### 0.0.14 #### Removed -- removed `import "reflect-metadata"` from source code. Now reflect metadata should be included like any other shims. +- removed `import "reflect-metadata"` from source code. Now reflect metadata should be included like any other shims. ### 0.0.13 #### Changed -- Library has changed its name from `serializer.ts` to `constructor-utils`. -- Added `constructor-utils` namespace. +- Library has changed its name from `serializer.ts` to `constructor-utils`. +- Added `constructor-utils` namespace. diff --git a/sample/sample1-simple-usage/Album.ts b/sample/sample1-simple-usage/Album.ts index 46f190f57..7de2e2376 100644 --- a/sample/sample1-simple-usage/Album.ts +++ b/sample/sample1-simple-usage/Album.ts @@ -1,14 +1,12 @@ -import {Type, Exclude} from "../../src/decorators"; -import {Photo} from "./Photo"; +import { Type, Exclude } from '../../src/decorators'; +import { Photo } from './Photo'; export class Album { + id: string; - id: string; + @Exclude() + name: string; - @Exclude() - name: string; - - @Type(() => Photo) - photos: Photo[]; - -} \ No newline at end of file + @Type(() => Photo) + photos: Photo[]; +} diff --git a/sample/sample1-simple-usage/Photo.ts b/sample/sample1-simple-usage/Photo.ts index 94167cd60..20ac359d7 100644 --- a/sample/sample1-simple-usage/Photo.ts +++ b/sample/sample1-simple-usage/Photo.ts @@ -1,30 +1,28 @@ -import {Type} from "../../src/decorators"; -import {Album} from "./Album"; -import {User} from "./User"; +import { Type } from '../../src/decorators'; +import { Album } from './Album'; +import { User } from './User'; export class Photo { + id: string; - id: string; + filename: string; - filename: string; + description: string; - description: string; + tags: string[]; - tags: string[]; + @Type(() => User) + author: User; - @Type(() => User) - author: User; + @Type(() => Album) + albums: Album[]; - @Type(() => Album) - albums: Album[]; - - get name() { - return this.id + "_" + this.filename; - } + get name() { + return this.id + '_' + this.filename; + } - getAlbums() { - console.log("this is not serialized/deserialized"); - return this.albums; - } - -} \ No newline at end of file + getAlbums() { + console.log('this is not serialized/deserialized'); + return this.albums; + } +} diff --git a/sample/sample1-simple-usage/User.ts b/sample/sample1-simple-usage/User.ts index 0c2dc9e5b..37c1e38be 100644 --- a/sample/sample1-simple-usage/User.ts +++ b/sample/sample1-simple-usage/User.ts @@ -1,15 +1,13 @@ -import {Type} from "../../src/decorators"; +import { Type } from '../../src/decorators'; export class User { + @Type(() => Number) + id: number; - @Type(() => Number) - id: number; - - firstName: string; - - lastName: string; - - @Type(() => Date) - registrationDate: Date; - -} \ No newline at end of file + firstName: string; + + lastName: string; + + @Type(() => Date) + registrationDate: Date; +} diff --git a/sample/sample1-simple-usage/app.ts b/sample/sample1-simple-usage/app.ts index 425cc9258..a1df30698 100644 --- a/sample/sample1-simple-usage/app.ts +++ b/sample/sample1-simple-usage/app.ts @@ -1,86 +1,91 @@ -import "es6-shim"; -import "reflect-metadata"; -import {plainToClass, classToPlain} from "../../src/index"; -import {Photo} from "./Photo"; +import 'es6-shim'; +import 'reflect-metadata'; +import { plainToClass, classToPlain } from '../../src/index'; +import { Photo } from './Photo'; // check deserialization let photoJson = { - id: "1", - filename: "myphoto.jpg", - description: "about my photo", - tags: [ - "me", - "iam" - ], - author: { - id: "2", - firstName: "Johny", - lastName: "Cage" - }, - albums: [{ - id: "1", - name: "My life" + id: '1', + filename: 'myphoto.jpg', + description: 'about my photo', + tags: ['me', 'iam'], + author: { + id: '2', + firstName: 'Johny', + lastName: 'Cage', + }, + albums: [ + { + id: '1', + name: 'My life', }, { - id: "2", - name: "My young years" - }] + id: '2', + name: 'My young years', + }, + ], }; let photo = plainToClass(Photo, photoJson); -console.log("deserialized object: " , photo); +console.log('deserialized object: ', photo); // now check serialization let newPhotoJson = classToPlain(photo); -console.log("serialized object: " , newPhotoJson); +console.log('serialized object: ', newPhotoJson); // try to deserialize an array -console.log("-------------------------------"); +console.log('-------------------------------'); -let photosJson = [{ - id: "1", - filename: "myphoto.jpg", - description: "about my photo", +let photosJson = [ + { + id: '1', + filename: 'myphoto.jpg', + description: 'about my photo', author: { - id: "2", - firstName: "Johny", - lastName: "Cage", - registrationDate: "1995-12-17T03:24:00" - }, - albums: [{ - id: "1", - name: "My life" + id: '2', + firstName: 'Johny', + lastName: 'Cage', + registrationDate: '1995-12-17T03:24:00', }, - { - id: "2", - name: "My young years" - }] -}, -{ - id: "2", - filename: "hisphoto.jpg", - description: "about his photo", + albums: [ + { + id: '1', + name: 'My life', + }, + { + id: '2', + name: 'My young years', + }, + ], + }, + { + id: '2', + filename: 'hisphoto.jpg', + description: 'about his photo', author: { - id: "2", - firstName: "Johny", - lastName: "Cage" - }, - albums: [{ - id: "1", - name: "My life" + id: '2', + firstName: 'Johny', + lastName: 'Cage', }, - { - id: "2", - name: "My young years" - }] -}]; + albums: [ + { + id: '1', + name: 'My life', + }, + { + id: '2', + name: 'My young years', + }, + ], + }, +]; let photos = plainToClass(Photo, photosJson); -console.log("deserialized array: " , photos); +console.log('deserialized array: ', photos); // now check array serialization let newPhotosJson = classToPlain(photos); -console.log("serialized array: " , newPhotosJson); \ No newline at end of file +console.log('serialized array: ', newPhotosJson); diff --git a/sample/sample2-iheritance/Album.ts b/sample/sample2-iheritance/Album.ts index f3b284bf8..a5db8c867 100644 --- a/sample/sample2-iheritance/Album.ts +++ b/sample/sample2-iheritance/Album.ts @@ -1,15 +1,13 @@ -import {Type, Exclude} from "../../src/decorators"; -import {Photo} from "./Photo"; -import {Authorable} from "./Authorable"; +import { Type, Exclude } from '../../src/decorators'; +import { Photo } from './Photo'; +import { Authorable } from './Authorable'; export class Album extends Authorable { + id: string; - id: string; + @Exclude() + name: string; - @Exclude() - name: string; - - @Type(() => Photo) - photos: Photo[]; - -} \ No newline at end of file + @Type(() => Photo) + photos: Photo[]; +} diff --git a/sample/sample2-iheritance/Authorable.ts b/sample/sample2-iheritance/Authorable.ts index e9028d8e3..0c04bc1e9 100644 --- a/sample/sample2-iheritance/Authorable.ts +++ b/sample/sample2-iheritance/Authorable.ts @@ -1,14 +1,12 @@ -import {Type, Exclude} from "../../src/decorators"; -import {User} from "./User"; +import { Type, Exclude } from '../../src/decorators'; +import { User } from './User'; export class Authorable { - - authorName: string; + authorName: string; - @Exclude() - authorEmail: string; - - @Type(() => User) - author: User; + @Exclude() + authorEmail: string; -} \ No newline at end of file + @Type(() => User) + author: User; +} diff --git a/sample/sample2-iheritance/Photo.ts b/sample/sample2-iheritance/Photo.ts index 493a37589..3baf2973a 100644 --- a/sample/sample2-iheritance/Photo.ts +++ b/sample/sample2-iheritance/Photo.ts @@ -1,19 +1,17 @@ -import {Type, Exclude} from "../../src/decorators"; -import {Album} from "./Album"; -import {Authorable} from "./Authorable"; +import { Type, Exclude } from '../../src/decorators'; +import { Album } from './Album'; +import { Authorable } from './Authorable'; export class Photo extends Authorable { + id: string; - id: string; + filename: string; - filename: string; + description: string; - description: string; + @Exclude() // this will ignore skipping inherited from Authorable class + authorEmail: string; - @Exclude() // this will ignore skipping inherited from Authorable class - authorEmail: string; - - @Type(() => Album) - albums: Album[]; - -} \ No newline at end of file + @Type(() => Album) + albums: Album[]; +} diff --git a/sample/sample2-iheritance/User.ts b/sample/sample2-iheritance/User.ts index 0c2dc9e5b..37c1e38be 100644 --- a/sample/sample2-iheritance/User.ts +++ b/sample/sample2-iheritance/User.ts @@ -1,15 +1,13 @@ -import {Type} from "../../src/decorators"; +import { Type } from '../../src/decorators'; export class User { + @Type(() => Number) + id: number; - @Type(() => Number) - id: number; - - firstName: string; - - lastName: string; - - @Type(() => Date) - registrationDate: Date; - -} \ No newline at end of file + firstName: string; + + lastName: string; + + @Type(() => Date) + registrationDate: Date; +} diff --git a/sample/sample2-iheritance/app.ts b/sample/sample2-iheritance/app.ts index d99d2931c..86cbdc454 100644 --- a/sample/sample2-iheritance/app.ts +++ b/sample/sample2-iheritance/app.ts @@ -1,86 +1,94 @@ -import "es6-shim"; -import "reflect-metadata"; -import {classToPlain, plainToClass} from "../../src/index"; -import {Photo} from "./Photo"; +import 'es6-shim'; +import 'reflect-metadata'; +import { classToPlain, plainToClass } from '../../src/index'; +import { Photo } from './Photo'; let photoJson = { - id: "1", - filename: "myphoto.jpg", - description: "about my photo", - authorName: "Johny.Cage", - authorEmail: "johny@cage.com", - author: { - id: "2", - firstName: "Johny", - lastName: "Cage" - }, - albums: [{ - id: "1", - authorName: "Johny.Cage", - authorEmail: "johny@cage.com", - name: "My life" + id: '1', + filename: 'myphoto.jpg', + description: 'about my photo', + authorName: 'Johny.Cage', + authorEmail: 'johny@cage.com', + author: { + id: '2', + firstName: 'Johny', + lastName: 'Cage', + }, + albums: [ + { + id: '1', + authorName: 'Johny.Cage', + authorEmail: 'johny@cage.com', + name: 'My life', }, { - id: "2", - authorName: "Johny.Cage", - authorEmail: "johny@cage.com", - name: "My young years" - }] + id: '2', + authorName: 'Johny.Cage', + authorEmail: 'johny@cage.com', + name: 'My young years', + }, + ], }; let photo = plainToClass(Photo, photoJson); -console.log("deserialized object: " , photo); +console.log('deserialized object: ', photo); // now check serialization let newPhotoJson = classToPlain(photo); -console.log("serialized object: " , newPhotoJson); +console.log('serialized object: ', newPhotoJson); // try to deserialize an array -console.log("-------------------------------"); +console.log('-------------------------------'); -let photosJson = [{ - id: "1", - filename: "myphoto.jpg", - description: "about my photo", +let photosJson = [ + { + id: '1', + filename: 'myphoto.jpg', + description: 'about my photo', author: { - id: "2", - firstName: "Johny", - lastName: "Cage", - registrationDate: "1995-12-17T03:24:00" + id: '2', + firstName: 'Johny', + lastName: 'Cage', + registrationDate: '1995-12-17T03:24:00', }, - albums: [{ - id: "1", - name: "My life" - }, - { - id: "2", - name: "My young years" - }] -}, -{ - id: "2", - filename: "hisphoto.jpg", - description: "about his photo", + albums: [ + { + id: '1', + name: 'My life', + }, + { + id: '2', + name: 'My young years', + }, + ], + }, + { + id: '2', + filename: 'hisphoto.jpg', + description: 'about his photo', author: { - id: "2", - firstName: "Johny", - lastName: "Cage" + id: '2', + firstName: 'Johny', + lastName: 'Cage', }, - albums: [{ - id: "1", - name: "My life" - }, - { - id: "2", - name: "My young years" - }] -}]; + albums: [ + { + id: '1', + name: 'My life', + }, + { + id: '2', + name: 'My young years', + }, + ], + }, +]; let photos = plainToClass(Photo, photosJson); -console.log("deserialized array: " , photos); +console.log('deserialized array: ', photos); // now check array serialization let newPhotosJson = classToPlain(photos); -console.log("serialized array: " , newPhotosJson); \ No newline at end of file +console.log('serialized array: ', newPhotosJson); diff --git a/sample/sample3-custom-arrays/Album.ts b/sample/sample3-custom-arrays/Album.ts index 2ed4bf67e..1df4f58fb 100644 --- a/sample/sample3-custom-arrays/Album.ts +++ b/sample/sample3-custom-arrays/Album.ts @@ -1,8 +1,5 @@ - export class Album { + id: string; - id: string; - - name: string; - -} \ No newline at end of file + name: string; +} diff --git a/sample/sample3-custom-arrays/AlbumArray.ts b/sample/sample3-custom-arrays/AlbumArray.ts index 76fff6533..79c7d297d 100644 --- a/sample/sample3-custom-arrays/AlbumArray.ts +++ b/sample/sample3-custom-arrays/AlbumArray.ts @@ -1,9 +1,7 @@ -import {Album} from "./Album"; +import { Album } from './Album'; export class AlbumArray extends Array { - - findByName(name: string) { - return this.find(album => album.name === name); - } - -} \ No newline at end of file + findByName(name: string) { + return this.find(album => album.name === name); + } +} diff --git a/sample/sample3-custom-arrays/Photo.ts b/sample/sample3-custom-arrays/Photo.ts index 27f4a8d0a..75a89efa5 100644 --- a/sample/sample3-custom-arrays/Photo.ts +++ b/sample/sample3-custom-arrays/Photo.ts @@ -1,18 +1,16 @@ -import {Album} from "./Album"; -import {AlbumArray} from "./AlbumArray"; -import {Type} from "../../src/decorators"; +import { Album } from './Album'; +import { AlbumArray } from './AlbumArray'; +import { Type } from '../../src/decorators'; export class Photo { + id: string; - id: string; + filename: string; - filename: string; + description: string; - description: string; + tags: string[]; - tags: string[]; - - @Type(() => Album) - albums: AlbumArray; - -} \ No newline at end of file + @Type(() => Album) + albums: AlbumArray; +} diff --git a/sample/sample3-custom-arrays/app.ts b/sample/sample3-custom-arrays/app.ts index 443d21ded..2b7f26e73 100644 --- a/sample/sample3-custom-arrays/app.ts +++ b/sample/sample3-custom-arrays/app.ts @@ -1,36 +1,35 @@ -import "es6-shim"; -import "reflect-metadata"; -import {classToPlain, plainToClass} from "../../src/index"; -import {Photo} from "./Photo"; +import 'es6-shim'; +import 'reflect-metadata'; +import { classToPlain, plainToClass } from '../../src/index'; +import { Photo } from './Photo'; // check deserialization let photoJson = { - id: "1", - filename: "myphoto.jpg", - description: "about my photo", - tags: [ - "me", - "iam" - ], - albums: [{ - id: "1", - name: "My life" + id: '1', + filename: 'myphoto.jpg', + description: 'about my photo', + tags: ['me', 'iam'], + albums: [ + { + id: '1', + name: 'My life', }, { - id: "2", - name: "My young years" - }] + id: '2', + name: 'My young years', + }, + ], }; let photo = plainToClass(Photo, photoJson); -console.log("deserialized object: " , photo); -console.log("-----------------------------"); -console.log("Trying to find album: ", photo.albums.findByName("My life")); -console.log("-----------------------------"); +console.log('deserialized object: ', photo); +console.log('-----------------------------'); +console.log('Trying to find album: ', photo.albums.findByName('My life')); +console.log('-----------------------------'); // now check serialization let newPhotoJson = classToPlain(photo); -console.log("serialized object: " , newPhotoJson); -console.log("-----------------------------"); +console.log('serialized object: ', newPhotoJson); +console.log('-----------------------------'); diff --git a/sample/sample4-generics/SimpleCollection.ts b/sample/sample4-generics/SimpleCollection.ts index 19fcd4ec7..dec60128b 100644 --- a/sample/sample4-generics/SimpleCollection.ts +++ b/sample/sample4-generics/SimpleCollection.ts @@ -1,7 +1,4 @@ - export class SimpleCollection { - - items: T[]; - count: number; - -} \ No newline at end of file + items: T[]; + count: number; +} diff --git a/sample/sample4-generics/SuperCollection.ts b/sample/sample4-generics/SuperCollection.ts index a31ff0338..8911b1954 100644 --- a/sample/sample4-generics/SuperCollection.ts +++ b/sample/sample4-generics/SuperCollection.ts @@ -1,19 +1,17 @@ -import {Type, Exclude} from "../../src/decorators"; +import { Type, Exclude } from '../../src/decorators'; export class SuperCollection { - - @Exclude() - private type: Function; + @Exclude() + private type: Function; - @Type(options => { - return (options.newObject as SuperCollection).type; - }) - items: T[]; - - count: number; - - constructor(type: Function) { - this.type = type; - } - -} \ No newline at end of file + @Type(options => { + return (options.newObject as SuperCollection).type; + }) + items: T[]; + + count: number; + + constructor(type: Function) { + this.type = type; + } +} diff --git a/sample/sample4-generics/User.ts b/sample/sample4-generics/User.ts index 3077a4a85..ae78fd2af 100644 --- a/sample/sample4-generics/User.ts +++ b/sample/sample4-generics/User.ts @@ -1,25 +1,23 @@ -import {Exclude} from "../../src/decorators"; +import { Exclude } from '../../src/decorators'; export class User { + id: number; - id: number; - - firstName: string; - - lastName: string; - - @Exclude() - password: string; - - constructor(id: number, firstName: string, lastName: string, password: string) { - this.id = id; - this.firstName = firstName; - this.lastName = lastName; - this.password = password; - } - - get name() { - return this.firstName + " " + this.lastName; - } + firstName: string; -} \ No newline at end of file + lastName: string; + + @Exclude() + password: string; + + constructor(id: number, firstName: string, lastName: string, password: string) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.password = password; + } + + get name() { + return this.firstName + ' ' + this.lastName; + } +} diff --git a/sample/sample4-generics/app.ts b/sample/sample4-generics/app.ts index ae4cc8cf2..db23949a3 100644 --- a/sample/sample4-generics/app.ts +++ b/sample/sample4-generics/app.ts @@ -1,15 +1,12 @@ -import "es6-shim"; -import "reflect-metadata"; -import {SimpleCollection} from "./SimpleCollection"; -import {User} from "./User"; -import {classToPlain, plainToClass, plainToClassFromExist} from "../../src/index"; -import {SuperCollection} from "./SuperCollection"; +import 'es6-shim'; +import 'reflect-metadata'; +import { SimpleCollection } from './SimpleCollection'; +import { User } from './User'; +import { classToPlain, plainToClass, plainToClassFromExist } from '../../src/index'; +import { SuperCollection } from './SuperCollection'; let collection = new SimpleCollection(); -collection.items = [ - new User(1, "Johny", "Cage", "*******"), - new User(2, "Dima", "Cage", "*******") -]; +collection.items = [new User(1, 'Johny', 'Cage', '*******'), new User(2, 'Dima', 'Cage', '*******')]; collection.count = 2; // using generics works only for classToPlain operations, since in runtime we can @@ -20,17 +17,20 @@ collection.count = 2; // alternatively you can use factory method let collectionJson = { - items: [{ - id: 1, - firstName: "Johny", - lastName: "Cage", - password: "*******", - }, { - id: 2, - firstName: "Dima", - lastName: "Cage", - password: "*******", - }] + items: [ + { + id: 1, + firstName: 'Johny', + lastName: 'Cage', + password: '*******', + }, + { + id: 2, + firstName: 'Dima', + lastName: 'Cage', + password: '*******', + }, + ], }; -console.log(plainToClassFromExist(new SuperCollection(User), collectionJson)); \ No newline at end of file +console.log(plainToClassFromExist(new SuperCollection(User), collectionJson)); diff --git a/sample/sample5-custom-transformer/User.ts b/sample/sample5-custom-transformer/User.ts index 35631d79e..b508eb012 100644 --- a/sample/sample5-custom-transformer/User.ts +++ b/sample/sample5-custom-transformer/User.ts @@ -1,15 +1,13 @@ -import {Type, Transform} from "../../src/decorators"; -import * as moment from "moment"; +import { Type, Transform } from '../../src/decorators'; +import * as moment from 'moment'; export class User { + id: number; - id: number; + name: string; - name: string; - - @Type(() => Date) - @Transform(value => value.toString(), { toPlainOnly: true }) - @Transform(value => moment(value), { toClassOnly: true }) - date: Date; - -} \ No newline at end of file + @Type(() => Date) + @Transform(value => value.toString(), { toPlainOnly: true }) + @Transform(value => moment(value), { toClassOnly: true }) + date: Date; +} diff --git a/sample/sample5-custom-transformer/app.ts b/sample/sample5-custom-transformer/app.ts index 710d71de6..2ca04ea17 100644 --- a/sample/sample5-custom-transformer/app.ts +++ b/sample/sample5-custom-transformer/app.ts @@ -1,19 +1,19 @@ -import "es6-shim"; -import "reflect-metadata"; -import {plainToClass, classToPlain} from "../../src/index"; -import {User} from "./User"; +import 'es6-shim'; +import 'reflect-metadata'; +import { plainToClass, classToPlain } from '../../src/index'; +import { User } from './User'; let userJson = { - id: 1, - name: "Johny Cage", - date: new Date().valueOf() + id: 1, + name: 'Johny Cage', + date: new Date().valueOf(), }; console.log(plainToClass(User, userJson)); const user = new User(); user.id = 1; -user.name = "Johny Cage"; +user.name = 'Johny Cage'; user.date = new Date(); console.log(classToPlain(user)); diff --git a/src/ClassTransformOptions.ts b/src/ClassTransformOptions.ts index 28dee8830..2758c6b61 100644 --- a/src/ClassTransformOptions.ts +++ b/src/ClassTransformOptions.ts @@ -3,75 +3,72 @@ * This is useful when you have external classes. */ export interface TargetMap { + /** + * Target which Types are being specified. + */ + target: Function; - /** - * Target which Types are being specified. - */ - target: Function; - - /** - * List of properties and their Types. - */ - properties: { [key: string]: Function }; + /** + * List of properties and their Types. + */ + properties: { [key: string]: Function }; } /** * Options to be passed during transformation. */ export interface ClassTransformOptions { + /** + * Exclusion strategy. By default exposeAll is used, which means that it will expose all properties are transformed + * by default. + */ + strategy?: 'excludeAll' | 'exposeAll'; - /** - * Exclusion strategy. By default exposeAll is used, which means that it will expose all properties are transformed - * by default. - */ - strategy?: "excludeAll"|"exposeAll"; - - /** - * Indicates if extraneous properties should be excluded from the value when converting a plain value to a class. - */ - excludeExtraneousValues?: boolean; + /** + * Indicates if extraneous properties should be excluded from the value when converting a plain value to a class. + */ + excludeExtraneousValues?: boolean; - /** - * Only properties with given groups gonna be transformed. - */ - groups?: string[]; + /** + * Only properties with given groups gonna be transformed. + */ + groups?: string[]; - /** - * Only properties with "since" > version < "until" gonna be transformed. - */ - version?: number; + /** + * Only properties with "since" > version < "until" gonna be transformed. + */ + version?: number; - /** - * Excludes properties with the given prefixes. For example, if you mark your private properties with "_" and "__" - * you can set this option's value to ["_", "__"] and all private properties will be skipped. - * This works only for "exposeAll" strategy. - */ - excludePrefixes?: string[]; + /** + * Excludes properties with the given prefixes. For example, if you mark your private properties with "_" and "__" + * you can set this option's value to ["_", "__"] and all private properties will be skipped. + * This works only for "exposeAll" strategy. + */ + excludePrefixes?: string[]; - /** - * If set to true then class transformer will ignore all @Expose and @Exclude decorators and what inside them. - * This option is useful if you want to kinda clone your object but do not apply decorators affects. - */ - ignoreDecorators?: boolean; + /** + * If set to true then class transformer will ignore all @Expose and @Exclude decorators and what inside them. + * This option is useful if you want to kinda clone your object but do not apply decorators affects. + */ + ignoreDecorators?: boolean; - /** - * Target maps allows to set a Types of the transforming object without using @Type decorator. - * This is useful when you are transforming external classes, or if you already have type metadata for - * objects and you don't want to set it up again. - */ - targetMaps?: TargetMap[]; + /** + * Target maps allows to set a Types of the transforming object without using @Type decorator. + * This is useful when you are transforming external classes, or if you already have type metadata for + * objects and you don't want to set it up again. + */ + targetMaps?: TargetMap[]; + /** + * If set to true then class transformer will perform a circular check. (circular check is turned off by default) + * This option is useful when you know for sure that your types might have a circular dependency. + */ + enableCircularCheck?: boolean; - /** - * If set to true then class transformer will perform a circular check. (circular check is turned off by default) - * This option is useful when you know for sure that your types might have a circular dependency. - */ - enableCircularCheck?: boolean; - - /** - * If set to true then class transformer will try to convert properties implicitly to their target type based on their typing information. - * - * DEFAULT: `false` - */ - enableImplicitConversion?: boolean; -} \ No newline at end of file + /** + * If set to true then class transformer will try to convert properties implicitly to their target type based on their typing information. + * + * DEFAULT: `false` + */ + enableImplicitConversion?: boolean; +} diff --git a/src/ClassTransformer.ts b/src/ClassTransformer.ts index 929a1996f..521173c17 100644 --- a/src/ClassTransformer.ts +++ b/src/ClassTransformer.ts @@ -1,105 +1,134 @@ -import {ClassTransformOptions} from "./ClassTransformOptions"; -import {TransformOperationExecutor, TransformationType} from "./TransformOperationExecutor"; +import { ClassTransformOptions } from './ClassTransformOptions'; +import { TransformOperationExecutor, TransformationType } from './TransformOperationExecutor'; export type ClassType = { - new (...args: any[]): T; + new (...args: any[]): T; }; export class ClassTransformer { + // ------------------------------------------------------------------------- + // Public Methods + // ------------------------------------------------------------------------- - // ------------------------------------------------------------------------- - // Public Methods - // ------------------------------------------------------------------------- + /** + * Converts class (constructor) object to plain (literal) object. Also works with arrays. + */ + classToPlain>(object: T, options?: ClassTransformOptions): Record; + classToPlain>(object: T[], options?: ClassTransformOptions): Record[]; + classToPlain>( + object: T | T[], + options?: ClassTransformOptions + ): Record | Record[] { + const executor = new TransformOperationExecutor(TransformationType.CLASS_TO_PLAIN, options || {}); + return executor.transform(undefined, object, undefined, undefined, undefined, undefined); + } - /** - * Converts class (constructor) object to plain (literal) object. Also works with arrays. - */ - classToPlain>(object: T, options?: ClassTransformOptions): Record; - classToPlain>(object: T[], options?: ClassTransformOptions): Record[]; - classToPlain>(object: T|T[], options?: ClassTransformOptions): Record|Record[] { - const executor = new TransformOperationExecutor(TransformationType.CLASS_TO_PLAIN, options || {}); - return executor.transform(undefined, object, undefined, undefined, undefined, undefined); - } + /** + * Converts class (constructor) object to plain (literal) object. + * Uses given plain object as source object (it means fills given plain object with data from class object). + * Also works with arrays. + */ + classToPlainFromExist, P>( + object: T, + plainObject: P, + options?: ClassTransformOptions + ): T; + classToPlainFromExist, P>( + object: T, + plainObjects: P[], + options?: ClassTransformOptions + ): T[]; + classToPlainFromExist, P>( + object: T, + plainObject: P | P[], + options?: ClassTransformOptions + ): T | T[] { + const executor = new TransformOperationExecutor(TransformationType.CLASS_TO_PLAIN, options || {}); + return executor.transform(plainObject, object, undefined, undefined, undefined, undefined); + } - /** - * Converts class (constructor) object to plain (literal) object. - * Uses given plain object as source object (it means fills given plain object with data from class object). - * Also works with arrays. - */ - classToPlainFromExist, P>(object: T, plainObject: P, options?: ClassTransformOptions): T; - classToPlainFromExist, P>(object: T, plainObjects: P[], options?: ClassTransformOptions): T[]; - classToPlainFromExist, P>(object: T, plainObject: P|P[], options?: ClassTransformOptions): T|T[] { - const executor = new TransformOperationExecutor(TransformationType.CLASS_TO_PLAIN, options || {}); - return executor.transform(plainObject, object, undefined, undefined, undefined, undefined); - } + /** + * Converts plain (literal) object to class (constructor) object. Also works with arrays. + */ + plainToClass, V extends Array>( + cls: ClassType, + plain: V, + options?: ClassTransformOptions + ): T[]; + plainToClass, V>(cls: ClassType, plain: V, options?: ClassTransformOptions): T; + plainToClass, V>( + cls: ClassType, + plain: V | V[], + options?: ClassTransformOptions + ): T | T[] { + const executor = new TransformOperationExecutor(TransformationType.PLAIN_TO_CLASS, options || {}); + return executor.transform(undefined, plain, cls, undefined, undefined, undefined); + } - /** - * Converts plain (literal) object to class (constructor) object. Also works with arrays. - */ - plainToClass, V extends Array>(cls: ClassType, plain: V, options?: ClassTransformOptions): T[]; - plainToClass, V>(cls: ClassType, plain: V, options?: ClassTransformOptions): T; - plainToClass, V>(cls: ClassType, plain: V|V[], options?: ClassTransformOptions): T|T[] { - const executor = new TransformOperationExecutor(TransformationType.PLAIN_TO_CLASS, options || {}); - return executor.transform(undefined, plain, cls, undefined, undefined, undefined); - } + /** + * Converts plain (literal) object to class (constructor) object. + * Uses given object as source object (it means fills given object with data from plain object). + * Also works with arrays. + */ + plainToClassFromExist, V extends Array>( + clsObject: T, + plain: V, + options?: ClassTransformOptions + ): T; + plainToClassFromExist, V>(clsObject: T, plain: V, options?: ClassTransformOptions): T[]; + plainToClassFromExist, V>( + clsObject: T, + plain: V | V[], + options?: ClassTransformOptions + ): T | T[] { + const executor = new TransformOperationExecutor(TransformationType.PLAIN_TO_CLASS, options || {}); + return executor.transform(clsObject, plain, undefined, undefined, undefined, undefined); + } - /** - * Converts plain (literal) object to class (constructor) object. - * Uses given object as source object (it means fills given object with data from plain object). - * Also works with arrays. - */ - plainToClassFromExist, V extends Array>(clsObject: T, plain: V, options?: ClassTransformOptions): T; - plainToClassFromExist, V>(clsObject: T, plain: V, options?: ClassTransformOptions): T[]; - plainToClassFromExist, V>(clsObject: T, plain: V|V[], options?: ClassTransformOptions): T|T[] { - const executor = new TransformOperationExecutor(TransformationType.PLAIN_TO_CLASS, options || {}); - return executor.transform(clsObject, plain, undefined, undefined, undefined, undefined); - } + /** + * Converts class (constructor) object to new class (constructor) object. Also works with arrays. + */ + classToClass(object: T, options?: ClassTransformOptions): T; + classToClass(object: T[], options?: ClassTransformOptions): T[]; + classToClass(object: T | T[], options?: ClassTransformOptions): T | T[] { + const executor = new TransformOperationExecutor(TransformationType.CLASS_TO_CLASS, options || {}); + return executor.transform(undefined, object, undefined, undefined, undefined, undefined); + } - /** - * Converts class (constructor) object to new class (constructor) object. Also works with arrays. - */ - classToClass(object: T, options?: ClassTransformOptions): T; - classToClass(object: T[], options?: ClassTransformOptions): T[]; - classToClass(object: T|T[], options?: ClassTransformOptions): T|T[] { - const executor = new TransformOperationExecutor(TransformationType.CLASS_TO_CLASS, options || {}); - return executor.transform(undefined, object, undefined, undefined, undefined, undefined); - } + /** + * Converts class (constructor) object to plain (literal) object. + * Uses given plain object as source object (it means fills given plain object with data from class object). + * Also works with arrays. + */ + classToClassFromExist(object: T, fromObject: T, options?: ClassTransformOptions): T; + classToClassFromExist(object: T, fromObjects: T[], options?: ClassTransformOptions): T[]; + classToClassFromExist(object: T, fromObject: T | T[], options?: ClassTransformOptions): T | T[] { + const executor = new TransformOperationExecutor(TransformationType.CLASS_TO_CLASS, options || {}); + return executor.transform(fromObject, object, undefined, undefined, undefined, undefined); + } - /** - * Converts class (constructor) object to plain (literal) object. - * Uses given plain object as source object (it means fills given plain object with data from class object). - * Also works with arrays. - */ - classToClassFromExist(object: T, fromObject: T, options?: ClassTransformOptions): T; - classToClassFromExist(object: T, fromObjects: T[], options?: ClassTransformOptions): T[]; - classToClassFromExist(object: T, fromObject: T|T[], options?: ClassTransformOptions): T|T[] { - const executor = new TransformOperationExecutor(TransformationType.CLASS_TO_CLASS, options || {}); - return executor.transform(fromObject, object, undefined, undefined, undefined, undefined); - } + /** + * Serializes given object to a JSON string. + */ + serialize(object: T, options?: ClassTransformOptions): string; + serialize(object: T[], options?: ClassTransformOptions): string; + serialize(object: T | T[], options?: ClassTransformOptions): string { + return JSON.stringify(this.classToPlain(object, options)); + } - /** - * Serializes given object to a JSON string. - */ - serialize(object: T, options?: ClassTransformOptions): string; - serialize(object: T[], options?: ClassTransformOptions): string; - serialize(object: T|T[], options?: ClassTransformOptions): string { - return JSON.stringify(this.classToPlain(object, options)); - } - - /** - * Deserializes given JSON string to a object of the given class. - */ - deserialize(cls: ClassType, json: string, options?: ClassTransformOptions): T { - const jsonObject: T = JSON.parse(json); - return this.plainToClass(cls, jsonObject, options); - } - - /** - * Deserializes given JSON string to an array of objects of the given class. - */ - deserializeArray(cls: ClassType, json: string, options?: ClassTransformOptions): T[] { - const jsonObject: any[] = JSON.parse(json); - return this.plainToClass(cls, jsonObject, options); - } + /** + * Deserializes given JSON string to a object of the given class. + */ + deserialize(cls: ClassType, json: string, options?: ClassTransformOptions): T { + const jsonObject: T = JSON.parse(json); + return this.plainToClass(cls, jsonObject, options); + } + /** + * Deserializes given JSON string to an array of objects of the given class. + */ + deserializeArray(cls: ClassType, json: string, options?: ClassTransformOptions): T[] { + const jsonObject: any[] = JSON.parse(json); + return this.plainToClass(cls, jsonObject, options); + } } diff --git a/src/decorators.ts b/src/decorators.ts index 62abbb528..a26de57a0 100644 --- a/src/decorators.ts +++ b/src/decorators.ts @@ -1,21 +1,30 @@ -import {ClassTransformer} from "./ClassTransformer"; -import {defaultMetadataStorage} from "./storage"; -import {TypeMetadata} from "./metadata/TypeMetadata"; -import {ExposeMetadata} from "./metadata/ExposeMetadata"; -import {ExposeOptions, ExcludeOptions, TypeHelpOptions, TransformOptions, TypeOptions} from "./metadata/ExposeExcludeOptions"; -import {ExcludeMetadata} from "./metadata/ExcludeMetadata"; -import {TransformMetadata} from "./metadata/TransformMetadata"; -import {ClassTransformOptions} from "./ClassTransformOptions"; -import {TransformationType} from "./TransformOperationExecutor"; +import { ClassTransformer } from './ClassTransformer'; +import { defaultMetadataStorage } from './storage'; +import { TypeMetadata } from './metadata/TypeMetadata'; +import { ExposeMetadata } from './metadata/ExposeMetadata'; +import { + ExposeOptions, + ExcludeOptions, + TypeHelpOptions, + TransformOptions, + TypeOptions, +} from './metadata/ExposeExcludeOptions'; +import { ExcludeMetadata } from './metadata/ExcludeMetadata'; +import { TransformMetadata } from './metadata/TransformMetadata'; +import { ClassTransformOptions } from './ClassTransformOptions'; +import { TransformationType } from './TransformOperationExecutor'; /** * Defines a custom logic for value transformation. */ -export function Transform(transformFn: (value: any, obj: any, transformationType: TransformationType) => any, options?: TransformOptions) { - return function(target: any, key: string): void { - const metadata = new TransformMetadata(target.constructor, key, transformFn, options); - defaultMetadataStorage.addTransformMetadata(metadata); - }; +export function Transform( + transformFn: (value: any, obj: any, transformationType: TransformationType) => any, + options?: TransformOptions +) { + return function (target: any, key: string): void { + const metadata = new TransformMetadata(target.constructor, key, transformFn, options); + defaultMetadataStorage.addTransformMetadata(metadata); + }; } /** @@ -23,11 +32,11 @@ export function Transform(transformFn: (value: any, obj: any, transformationType * The given TypeFunction can return a constructor. A discriminator can be given in the options. */ export function Type(typeFunction?: (type?: TypeHelpOptions) => Function, options?: TypeOptions) { - return function(target: any, key: string): void { - const type = (Reflect as any).getMetadata("design:type", target, key); - const metadata = new TypeMetadata(target.constructor, key, type, typeFunction, options); - defaultMetadataStorage.addTypeMetadata(metadata); - }; + return function (target: any, key: string): void { + const type = (Reflect as any).getMetadata('design:type', target, key); + const metadata = new TypeMetadata(target.constructor, key, type, typeFunction, options); + defaultMetadataStorage.addTypeMetadata(metadata); + }; } /** @@ -36,10 +45,14 @@ export function Type(typeFunction?: (type?: TypeHelpOptions) => Function, option * you want to skip this property. */ export function Expose(options?: ExposeOptions) { - return function(object: Record|Function, propertyName?: string): void { - const metadata = new ExposeMetadata(object instanceof Function ? object : object.constructor, propertyName, options || {}); - defaultMetadataStorage.addExposeMetadata(metadata); - }; + return function (object: Record | Function, propertyName?: string): void { + const metadata = new ExposeMetadata( + object instanceof Function ? object : object.constructor, + propertyName, + options || {} + ); + defaultMetadataStorage.addExposeMetadata(metadata); + }; } /** @@ -48,59 +61,69 @@ export function Expose(options?: ExposeOptions) { * you want to skip this property. */ export function Exclude(options?: ExcludeOptions) { - return function(object: Record|Function, propertyName?: string): void { - const metadata = new ExcludeMetadata(object instanceof Function ? object : object.constructor, propertyName, options || {}); - defaultMetadataStorage.addExcludeMetadata(metadata); - }; + return function (object: Record | Function, propertyName?: string): void { + const metadata = new ExcludeMetadata( + object instanceof Function ? object : object.constructor, + propertyName, + options || {} + ); + defaultMetadataStorage.addExcludeMetadata(metadata); + }; } /** * Transform the object from class to plain object and return only with the exposed properties. */ export function TransformClassToPlain(params?: ClassTransformOptions): Function { + return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor): void { + const classTransformer: ClassTransformer = new ClassTransformer(); + const originalMethod = descriptor.value; - return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor): void { - const classTransformer: ClassTransformer = new ClassTransformer(); - const originalMethod = descriptor.value; - - descriptor.value = function(...args: any[]): Record { - const result: any = originalMethod.apply(this, args); - const isPromise = !!result && (typeof result === "object" || typeof result === "function") && typeof result.then === "function"; - return isPromise ? result.then((data: any) => classTransformer.classToPlain(data, params)) : classTransformer.classToPlain(result, params); - }; + descriptor.value = function (...args: any[]): Record { + const result: any = originalMethod.apply(this, args); + const isPromise = + !!result && (typeof result === 'object' || typeof result === 'function') && typeof result.then === 'function'; + return isPromise + ? result.then((data: any) => classTransformer.classToPlain(data, params)) + : classTransformer.classToPlain(result, params); }; + }; } /** * Return the class instance only with the exposed properties. */ export function TransformClassToClass(params?: ClassTransformOptions): Function { + return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor): void { + const classTransformer: ClassTransformer = new ClassTransformer(); + const originalMethod = descriptor.value; - return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor): void { - const classTransformer: ClassTransformer = new ClassTransformer(); - const originalMethod = descriptor.value; - - descriptor.value = function(...args: any[]): Record { - const result: any = originalMethod.apply(this, args); - const isPromise = !!result && (typeof result === "object" || typeof result === "function") && typeof result.then === "function"; - return isPromise ? result.then((data: any) => classTransformer.classToClass(data, params)) : classTransformer.classToClass(result, params); - }; + descriptor.value = function (...args: any[]): Record { + const result: any = originalMethod.apply(this, args); + const isPromise = + !!result && (typeof result === 'object' || typeof result === 'function') && typeof result.then === 'function'; + return isPromise + ? result.then((data: any) => classTransformer.classToClass(data, params)) + : classTransformer.classToClass(result, params); }; + }; } /** * Return the class instance only with the exposed properties. */ export function TransformPlainToClass(classType: any, params?: ClassTransformOptions): Function { + return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor): void { + const classTransformer: ClassTransformer = new ClassTransformer(); + const originalMethod = descriptor.value; - return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor): void { - const classTransformer: ClassTransformer = new ClassTransformer(); - const originalMethod = descriptor.value; - - descriptor.value = function(...args: any[]): Record { - const result: any = originalMethod.apply(this, args); - const isPromise = !!result && (typeof result === "object" || typeof result === "function") && typeof result.then === "function"; - return isPromise ? result.then((data: any) => classTransformer.plainToClass(classType, data, params)) : classTransformer.plainToClass(classType, result, params); - }; + descriptor.value = function (...args: any[]): Record { + const result: any = originalMethod.apply(this, args); + const isPromise = + !!result && (typeof result === 'object' || typeof result === 'function') && typeof result.then === 'function'; + return isPromise + ? result.then((data: any) => classTransformer.plainToClass(classType, data, params)) + : classTransformer.plainToClass(classType, result, params); }; + }; } diff --git a/src/index.ts b/src/index.ts index 926b2bf9b..4075aed31 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,10 @@ -import {ClassTransformer, ClassType} from "./ClassTransformer"; -import {ClassTransformOptions} from "./ClassTransformOptions"; +import { ClassTransformer, ClassType } from './ClassTransformer'; +import { ClassTransformOptions } from './ClassTransformOptions'; -export {ClassTransformer} from "./ClassTransformer"; -export {ClassTransformOptions} from "./ClassTransformOptions"; -export * from "./metadata/ExposeExcludeOptions"; -export * from "./decorators"; +export { ClassTransformer } from './ClassTransformer'; +export { ClassTransformOptions } from './ClassTransformOptions'; +export * from './metadata/ExposeExcludeOptions'; +export * from './decorators'; const classTransformer = new ClassTransformer(); @@ -13,8 +13,11 @@ const classTransformer = new ClassTransformer(); */ export function classToPlain(object: T, options?: ClassTransformOptions): Record; export function classToPlain(object: T[], options?: ClassTransformOptions): Record[]; -export function classToPlain(object: T|T[], options?: ClassTransformOptions): Record|Record[] { - return classTransformer.classToPlain(object, options); +export function classToPlain( + object: T | T[], + options?: ClassTransformOptions +): Record | Record[] { + return classTransformer.classToPlain(object, options); } /** @@ -22,10 +25,22 @@ export function classToPlain(object: T|T[], options?: ClassTransformOptions): * Uses given plain object as source object (it means fills given plain object with data from class object). * Also works with arrays. */ -export function classToPlainFromExist(object: T, plainObject: Record, options?: ClassTransformOptions): Record; -export function classToPlainFromExist(object: T, plainObjects: Record[], options?: ClassTransformOptions): Record[]; -export function classToPlainFromExist(object: T, plainObject: Record|Record[], options?: ClassTransformOptions): Record|Record[] { - return classTransformer.classToPlainFromExist(object, plainObject, options); +export function classToPlainFromExist( + object: T, + plainObject: Record, + options?: ClassTransformOptions +): Record; +export function classToPlainFromExist( + object: T, + plainObjects: Record[], + options?: ClassTransformOptions +): Record[]; +export function classToPlainFromExist( + object: T, + plainObject: Record | Record[], + options?: ClassTransformOptions +): Record | Record[] { + return classTransformer.classToPlainFromExist(object, plainObject, options); } /** @@ -33,8 +48,8 @@ export function classToPlainFromExist(object: T, plainObject: Record(cls: ClassType, plain: V[], options?: ClassTransformOptions): T[]; export function plainToClass(cls: ClassType, plain: V, options?: ClassTransformOptions): T; -export function plainToClass(cls: ClassType, plain: V|V[], options?: ClassTransformOptions): T|T[] { - return classTransformer.plainToClass(cls, plain as any, options); +export function plainToClass(cls: ClassType, plain: V | V[], options?: ClassTransformOptions): T | T[] { + return classTransformer.plainToClass(cls, plain as any, options); } /** @@ -44,8 +59,8 @@ export function plainToClass(cls: ClassType, plain: V|V[], options?: Cl */ export function plainToClassFromExist(clsObject: T[], plain: V[], options?: ClassTransformOptions): T[]; export function plainToClassFromExist(clsObject: T, plain: V, options?: ClassTransformOptions): T; -export function plainToClassFromExist(clsObject: T, plain: V|V[], options?: ClassTransformOptions): T|T[] { - return classTransformer.plainToClassFromExist(clsObject, plain, options); +export function plainToClassFromExist(clsObject: T, plain: V | V[], options?: ClassTransformOptions): T | T[] { + return classTransformer.plainToClassFromExist(clsObject, plain, options); } /** @@ -53,8 +68,8 @@ export function plainToClassFromExist(clsObject: T, plain: V|V[], options? */ export function classToClass(object: T, options?: ClassTransformOptions): T; export function classToClass(object: T[], options?: ClassTransformOptions): T[]; -export function classToClass(object: T|T[], options?: ClassTransformOptions): T|T[] { - return classTransformer.classToClass(object, options); +export function classToClass(object: T | T[], options?: ClassTransformOptions): T | T[] { + return classTransformer.classToClass(object, options); } /** @@ -64,8 +79,8 @@ export function classToClass(object: T|T[], options?: ClassTransformOptions): */ export function classToClassFromExist(object: T, fromObject: T, options?: ClassTransformOptions): T; export function classToClassFromExist(object: T, fromObjects: T[], options?: ClassTransformOptions): T[]; -export function classToClassFromExist(object: T, fromObject: T|T[], options?: ClassTransformOptions): T|T[] { - return classTransformer.classToClassFromExist(object, fromObject, options); +export function classToClassFromExist(object: T, fromObject: T | T[], options?: ClassTransformOptions): T | T[] { + return classTransformer.classToClassFromExist(object, fromObject, options); } /** @@ -73,22 +88,22 @@ export function classToClassFromExist(object: T, fromObject: T|T[], options?: */ export function serialize(object: T, options?: ClassTransformOptions): string; export function serialize(object: T[], options?: ClassTransformOptions): string; -export function serialize(object: T|T[], options?: ClassTransformOptions): string { - return classTransformer.serialize(object, options); +export function serialize(object: T | T[], options?: ClassTransformOptions): string { + return classTransformer.serialize(object, options); } /** * Deserializes given JSON string to a object of the given class. */ export function deserialize(cls: ClassType, json: string, options?: ClassTransformOptions): T { - return classTransformer.deserialize(cls, json, options); + return classTransformer.deserialize(cls, json, options); } /** * Deserializes given JSON string to an array of objects of the given class. */ export function deserializeArray(cls: ClassType, json: string, options?: ClassTransformOptions): T[] { - return classTransformer.deserializeArray(cls, json, options); + return classTransformer.deserializeArray(cls, json, options); } /** @@ -96,7 +111,7 @@ export function deserializeArray(cls: ClassType, json: string, options?: C */ export enum TransformationType { - PLAIN_TO_CLASS, - CLASS_TO_PLAIN, - CLASS_TO_CLASS + PLAIN_TO_CLASS, + CLASS_TO_PLAIN, + CLASS_TO_CLASS, } diff --git a/src/metadata/ExcludeMetadata.ts b/src/metadata/ExcludeMetadata.ts index f0eb19720..98b090294 100644 --- a/src/metadata/ExcludeMetadata.ts +++ b/src/metadata/ExcludeMetadata.ts @@ -1,10 +1,5 @@ -import {ExcludeOptions} from "./ExposeExcludeOptions"; +import { ExcludeOptions } from './ExposeExcludeOptions'; export class ExcludeMetadata { - - constructor(public target: Function, - public propertyName: string, - public options: ExcludeOptions) { - } - -} \ No newline at end of file + constructor(public target: Function, public propertyName: string, public options: ExcludeOptions) {} +} diff --git a/src/metadata/ExposeExcludeOptions.ts b/src/metadata/ExposeExcludeOptions.ts index a44b7e520..59206b361 100644 --- a/src/metadata/ExposeExcludeOptions.ts +++ b/src/metadata/ExposeExcludeOptions.ts @@ -1,46 +1,45 @@ - export interface TransformOptions { - since?: number; - until?: number; - groups?: string[]; - toClassOnly?: boolean; - toPlainOnly?: boolean; + since?: number; + until?: number; + groups?: string[]; + toClassOnly?: boolean; + toPlainOnly?: boolean; } export interface TypeOptions { - discriminator?: Discriminator; - /** - * Is false by default. - */ - keepDiscriminatorProperty?: boolean; + discriminator?: Discriminator; + /** + * Is false by default. + */ + keepDiscriminatorProperty?: boolean; } export interface TypeHelpOptions { - newObject: any; - object: Record; - property: string; + newObject: any; + object: Record; + property: string; } export interface ExposeOptions { - name?: string; - since?: number; - until?: number; - groups?: string[]; - toClassOnly?: boolean; - toPlainOnly?: boolean; + name?: string; + since?: number; + until?: number; + groups?: string[]; + toClassOnly?: boolean; + toPlainOnly?: boolean; } export interface ExcludeOptions { - toClassOnly?: boolean; - toPlainOnly?: boolean; + toClassOnly?: boolean; + toPlainOnly?: boolean; } export interface Discriminator { - property: string; - subTypes: JsonSubType[]; + property: string; + subTypes: JsonSubType[]; } export interface JsonSubType { - value: new (...args: any[]) => any; - name: string; + value: new (...args: any[]) => any; + name: string; } diff --git a/src/metadata/ExposeMetadata.ts b/src/metadata/ExposeMetadata.ts index e3ab755c7..43ce826cd 100644 --- a/src/metadata/ExposeMetadata.ts +++ b/src/metadata/ExposeMetadata.ts @@ -1,10 +1,5 @@ -import {ExposeOptions} from "./ExposeExcludeOptions"; +import { ExposeOptions } from './ExposeExcludeOptions'; export class ExposeMetadata { - - constructor(public target: Function, - public propertyName: string, - public options: ExposeOptions) { - } - -} \ No newline at end of file + constructor(public target: Function, public propertyName: string, public options: ExposeOptions) {} +} diff --git a/src/metadata/MetadataStorage.ts b/src/metadata/MetadataStorage.ts index 9d148e80a..1fc2bfdc4 100644 --- a/src/metadata/MetadataStorage.ts +++ b/src/metadata/MetadataStorage.ts @@ -1,234 +1,257 @@ -import {TypeMetadata} from "./TypeMetadata"; -import {ExposeMetadata} from "./ExposeMetadata"; -import {ExcludeMetadata} from "./ExcludeMetadata"; -import {TransformationType} from "../TransformOperationExecutor"; -import {TransformMetadata} from "./TransformMetadata"; +import { TypeMetadata } from './TypeMetadata'; +import { ExposeMetadata } from './ExposeMetadata'; +import { ExcludeMetadata } from './ExcludeMetadata'; +import { TransformationType } from '../TransformOperationExecutor'; +import { TransformMetadata } from './TransformMetadata'; /** * Storage all library metadata. */ export class MetadataStorage { + // ------------------------------------------------------------------------- + // Properties + // ------------------------------------------------------------------------- - // ------------------------------------------------------------------------- - // Properties - // ------------------------------------------------------------------------- + private _typeMetadatas = new Map>(); + private _transformMetadatas = new Map>(); + private _exposeMetadatas = new Map>(); + private _excludeMetadatas = new Map>(); + private _ancestorsMap = new Map(); - private _typeMetadatas = new Map>(); - private _transformMetadatas = new Map>(); - private _exposeMetadatas = new Map>(); - private _excludeMetadatas = new Map>(); - private _ancestorsMap = new Map(); + // ------------------------------------------------------------------------- + // Adder Methods + // ------------------------------------------------------------------------- - // ------------------------------------------------------------------------- - // Adder Methods - // ------------------------------------------------------------------------- - - addTypeMetadata(metadata: TypeMetadata): void { - if (!this._typeMetadatas.has(metadata.target)) { - this._typeMetadatas.set(metadata.target, new Map()); - } - this._typeMetadatas.get(metadata.target).set(metadata.propertyName, metadata); + addTypeMetadata(metadata: TypeMetadata): void { + if (!this._typeMetadatas.has(metadata.target)) { + this._typeMetadatas.set(metadata.target, new Map()); } + this._typeMetadatas.get(metadata.target).set(metadata.propertyName, metadata); + } - addTransformMetadata(metadata: TransformMetadata): void { - if (!this._transformMetadatas.has(metadata.target)) { - this._transformMetadatas.set(metadata.target, new Map()); + addTransformMetadata(metadata: TransformMetadata): void { + if (!this._transformMetadatas.has(metadata.target)) { + this._transformMetadatas.set(metadata.target, new Map()); } - if (!this._transformMetadatas.get(metadata.target).has(metadata.propertyName)) { - this._transformMetadatas.get(metadata.target).set(metadata.propertyName, []); - } - this._transformMetadatas.get(metadata.target).get(metadata.propertyName).push(metadata); + if (!this._transformMetadatas.get(metadata.target).has(metadata.propertyName)) { + this._transformMetadatas.get(metadata.target).set(metadata.propertyName, []); } + this._transformMetadatas.get(metadata.target).get(metadata.propertyName).push(metadata); + } - addExposeMetadata(metadata: ExposeMetadata): void { - if (!this._exposeMetadatas.has(metadata.target)) { - this._exposeMetadatas.set(metadata.target, new Map()); - } - this._exposeMetadatas.get(metadata.target).set(metadata.propertyName, metadata); + addExposeMetadata(metadata: ExposeMetadata): void { + if (!this._exposeMetadatas.has(metadata.target)) { + this._exposeMetadatas.set(metadata.target, new Map()); } + this._exposeMetadatas.get(metadata.target).set(metadata.propertyName, metadata); + } - addExcludeMetadata(metadata: ExcludeMetadata): void { - if (!this._excludeMetadatas.has(metadata.target)) { - this._excludeMetadatas.set(metadata.target, new Map()); - } - this._excludeMetadatas.get(metadata.target).set(metadata.propertyName, metadata); + addExcludeMetadata(metadata: ExcludeMetadata): void { + if (!this._excludeMetadatas.has(metadata.target)) { + this._excludeMetadatas.set(metadata.target, new Map()); } + this._excludeMetadatas.get(metadata.target).set(metadata.propertyName, metadata); + } - // ------------------------------------------------------------------------- - // Public Methods - // ------------------------------------------------------------------------- - - findTransformMetadatas(target: Function, propertyName: string, transformationType: TransformationType): TransformMetadata[] { - return this.findMetadatas(this._transformMetadatas, target, propertyName) - .filter(metadata => { - if (!metadata.options) - return true; - if (metadata.options.toClassOnly === true && metadata.options.toPlainOnly === true) - return true; - - if (metadata.options.toClassOnly === true) { - return transformationType === TransformationType.CLASS_TO_CLASS || transformationType === TransformationType.PLAIN_TO_CLASS; - } - if (metadata.options.toPlainOnly === true) { - return transformationType === TransformationType.CLASS_TO_PLAIN; - } - - return true; - }); - } + // ------------------------------------------------------------------------- + // Public Methods + // ------------------------------------------------------------------------- - findExcludeMetadata(target: Function, propertyName: string): ExcludeMetadata { - return this.findMetadata(this._excludeMetadatas, target, propertyName); - } + findTransformMetadatas( + target: Function, + propertyName: string, + transformationType: TransformationType + ): TransformMetadata[] { + return this.findMetadatas(this._transformMetadatas, target, propertyName).filter(metadata => { + if (!metadata.options) return true; + if (metadata.options.toClassOnly === true && metadata.options.toPlainOnly === true) return true; - findExposeMetadata(target: Function, propertyName: string): ExposeMetadata { - return this.findMetadata(this._exposeMetadatas, target, propertyName); - } + if (metadata.options.toClassOnly === true) { + return ( + transformationType === TransformationType.CLASS_TO_CLASS || + transformationType === TransformationType.PLAIN_TO_CLASS + ); + } + if (metadata.options.toPlainOnly === true) { + return transformationType === TransformationType.CLASS_TO_PLAIN; + } - findExposeMetadataByCustomName(target: Function, name: string): ExposeMetadata { - return this.getExposedMetadatas(target).find(metadata => { - return metadata.options && metadata.options.name === name; - }); - } + return true; + }); + } - findTypeMetadata(target: Function, propertyName: string): TypeMetadata { - return this.findMetadata(this._typeMetadatas, target, propertyName); - } + findExcludeMetadata(target: Function, propertyName: string): ExcludeMetadata { + return this.findMetadata(this._excludeMetadatas, target, propertyName); + } - getStrategy(target: Function): "excludeAll"|"exposeAll"|"none" { - const excludeMap = this._excludeMetadatas.get(target); - const exclude = excludeMap && excludeMap.get(undefined); - const exposeMap = this._exposeMetadatas.get(target); - const expose = exposeMap && exposeMap.get(undefined); - if ((exclude && expose) || (!exclude && !expose)) return "none"; - return exclude ? "excludeAll" : "exposeAll"; - } + findExposeMetadata(target: Function, propertyName: string): ExposeMetadata { + return this.findMetadata(this._exposeMetadatas, target, propertyName); + } - getExposedMetadatas(target: Function): ExposeMetadata[] { - return this.getMetadata(this._exposeMetadatas, target); - } + findExposeMetadataByCustomName(target: Function, name: string): ExposeMetadata { + return this.getExposedMetadatas(target).find(metadata => { + return metadata.options && metadata.options.name === name; + }); + } - getExcludedMetadatas(target: Function): ExcludeMetadata[] { - return this.getMetadata(this._excludeMetadatas, target); - } + findTypeMetadata(target: Function, propertyName: string): TypeMetadata { + return this.findMetadata(this._typeMetadatas, target, propertyName); + } - getExposedProperties(target: Function, transformationType: TransformationType): string[] { - return this.getExposedMetadatas(target) - .filter(metadata => { - if (!metadata.options) - return true; - if (metadata.options.toClassOnly === true && metadata.options.toPlainOnly === true) - return true; - - if (metadata.options.toClassOnly === true) { - return transformationType === TransformationType.CLASS_TO_CLASS || transformationType === TransformationType.PLAIN_TO_CLASS; - } - if (metadata.options.toPlainOnly === true) { - return transformationType === TransformationType.CLASS_TO_PLAIN; - } - - return true; - }) - .map(metadata => metadata.propertyName); - } + getStrategy(target: Function): 'excludeAll' | 'exposeAll' | 'none' { + const excludeMap = this._excludeMetadatas.get(target); + const exclude = excludeMap && excludeMap.get(undefined); + const exposeMap = this._exposeMetadatas.get(target); + const expose = exposeMap && exposeMap.get(undefined); + if ((exclude && expose) || (!exclude && !expose)) return 'none'; + return exclude ? 'excludeAll' : 'exposeAll'; + } - getExcludedProperties(target: Function, transformationType: TransformationType): string[] { - return this.getExcludedMetadatas(target) - .filter(metadata => { - if (!metadata.options) - return true; - if (metadata.options.toClassOnly === true && metadata.options.toPlainOnly === true) - return true; - - if (metadata.options.toClassOnly === true) { - return transformationType === TransformationType.CLASS_TO_CLASS || transformationType === TransformationType.PLAIN_TO_CLASS; - } - if (metadata.options.toPlainOnly === true) { - return transformationType === TransformationType.CLASS_TO_PLAIN; - } - - return true; - }) - .map(metadata => metadata.propertyName); - } + getExposedMetadatas(target: Function): ExposeMetadata[] { + return this.getMetadata(this._exposeMetadatas, target); + } - clear(): void { - this._typeMetadatas.clear(); - this._exposeMetadatas.clear(); - this._excludeMetadatas.clear(); - this._ancestorsMap.clear(); - } + getExcludedMetadatas(target: Function): ExcludeMetadata[] { + return this.getMetadata(this._excludeMetadatas, target); + } - // ------------------------------------------------------------------------- - // Private Methods - // ------------------------------------------------------------------------- + getExposedProperties(target: Function, transformationType: TransformationType): string[] { + return this.getExposedMetadatas(target) + .filter(metadata => { + if (!metadata.options) return true; + if (metadata.options.toClassOnly === true && metadata.options.toPlainOnly === true) return true; - private getMetadata(metadatas: Map>, target: Function): T[] { - const metadataFromTargetMap = metadatas.get(target); - let metadataFromTarget: T[]; - if (metadataFromTargetMap) { - metadataFromTarget = Array.from(metadataFromTargetMap.values()).filter(meta => meta.propertyName !== undefined); + if (metadata.options.toClassOnly === true) { + return ( + transformationType === TransformationType.CLASS_TO_CLASS || + transformationType === TransformationType.PLAIN_TO_CLASS + ); } - const metadataFromAncestors: T[] = []; - for (const ancestor of this.getAncestors(target)) { - const ancestorMetadataMap = metadatas.get(ancestor); - if (ancestorMetadataMap) { - const metadataFromAncestor = Array.from(ancestorMetadataMap.values()).filter(meta => meta.propertyName !== undefined); - metadataFromAncestors.push(...metadataFromAncestor); - } + if (metadata.options.toPlainOnly === true) { + return transformationType === TransformationType.CLASS_TO_PLAIN; } - return metadataFromAncestors.concat(metadataFromTarget || []); - } - private findMetadata(metadatas: Map>, target: Function, propertyName: string): T { - const metadataFromTargetMap = metadatas.get(target); - if (metadataFromTargetMap) { - const metadataFromTarget = metadataFromTargetMap.get(propertyName); - if (metadataFromTarget) { - return metadataFromTarget; - } + return true; + }) + .map(metadata => metadata.propertyName); + } + + getExcludedProperties(target: Function, transformationType: TransformationType): string[] { + return this.getExcludedMetadatas(target) + .filter(metadata => { + if (!metadata.options) return true; + if (metadata.options.toClassOnly === true && metadata.options.toPlainOnly === true) return true; + + if (metadata.options.toClassOnly === true) { + return ( + transformationType === TransformationType.CLASS_TO_CLASS || + transformationType === TransformationType.PLAIN_TO_CLASS + ); } - for (const ancestor of this.getAncestors(target)) { - const ancestorMetadataMap = metadatas.get(ancestor); - if (ancestorMetadataMap) { - const ancestorResult = ancestorMetadataMap.get(propertyName); - if (ancestorResult) { - return ancestorResult; - } - } + if (metadata.options.toPlainOnly === true) { + return transformationType === TransformationType.CLASS_TO_PLAIN; } - return undefined; + + return true; + }) + .map(metadata => metadata.propertyName); + } + + clear(): void { + this._typeMetadatas.clear(); + this._exposeMetadatas.clear(); + this._excludeMetadatas.clear(); + this._ancestorsMap.clear(); + } + + // ------------------------------------------------------------------------- + // Private Methods + // ------------------------------------------------------------------------- + + private getMetadata( + metadatas: Map>, + target: Function + ): T[] { + const metadataFromTargetMap = metadatas.get(target); + let metadataFromTarget: T[]; + if (metadataFromTargetMap) { + metadataFromTarget = Array.from(metadataFromTargetMap.values()).filter(meta => meta.propertyName !== undefined); + } + const metadataFromAncestors: T[] = []; + for (const ancestor of this.getAncestors(target)) { + const ancestorMetadataMap = metadatas.get(ancestor); + if (ancestorMetadataMap) { + const metadataFromAncestor = Array.from(ancestorMetadataMap.values()).filter( + meta => meta.propertyName !== undefined + ); + metadataFromAncestors.push(...metadataFromAncestor); + } } + return metadataFromAncestors.concat(metadataFromTarget || []); + } - private findMetadatas(metadatas: Map>, target: Function, propertyName: string): T[] { - const metadataFromTargetMap = metadatas.get(target); - let metadataFromTarget: T[]; - if (metadataFromTargetMap) { - metadataFromTarget = metadataFromTargetMap.get(propertyName); - } - const metadataFromAncestorsTarget: T[] = []; - for (const ancestor of this.getAncestors(target)) { - const ancestorMetadataMap = metadatas.get(ancestor); - if (ancestorMetadataMap) { - if (ancestorMetadataMap.has(propertyName)) { - metadataFromAncestorsTarget.push(...ancestorMetadataMap.get(propertyName)); - } - } + private findMetadata( + metadatas: Map>, + target: Function, + propertyName: string + ): T { + const metadataFromTargetMap = metadatas.get(target); + if (metadataFromTargetMap) { + const metadataFromTarget = metadataFromTargetMap.get(propertyName); + if (metadataFromTarget) { + return metadataFromTarget; + } + } + for (const ancestor of this.getAncestors(target)) { + const ancestorMetadataMap = metadatas.get(ancestor); + if (ancestorMetadataMap) { + const ancestorResult = ancestorMetadataMap.get(propertyName); + if (ancestorResult) { + return ancestorResult; } - return (metadataFromAncestorsTarget).slice().reverse().concat((metadataFromTarget || []).slice().reverse()); + } } + return undefined; + } - private getAncestors(target: Function): Function[] { - if (!target) return []; - if (!this._ancestorsMap.has(target)) { - const ancestors: Function[] = []; - for (let baseClass = Object.getPrototypeOf(target.prototype.constructor); - typeof baseClass.prototype !== "undefined"; - baseClass = Object.getPrototypeOf(baseClass.prototype.constructor)) { - ancestors.push(baseClass); - } - this._ancestorsMap.set(target, ancestors); + private findMetadatas( + metadatas: Map>, + target: Function, + propertyName: string + ): T[] { + const metadataFromTargetMap = metadatas.get(target); + let metadataFromTarget: T[]; + if (metadataFromTargetMap) { + metadataFromTarget = metadataFromTargetMap.get(propertyName); + } + const metadataFromAncestorsTarget: T[] = []; + for (const ancestor of this.getAncestors(target)) { + const ancestorMetadataMap = metadatas.get(ancestor); + if (ancestorMetadataMap) { + if (ancestorMetadataMap.has(propertyName)) { + metadataFromAncestorsTarget.push(...ancestorMetadataMap.get(propertyName)); } - return this._ancestorsMap.get(target); + } + } + return metadataFromAncestorsTarget + .slice() + .reverse() + .concat((metadataFromTarget || []).slice().reverse()); + } + + private getAncestors(target: Function): Function[] { + if (!target) return []; + if (!this._ancestorsMap.has(target)) { + const ancestors: Function[] = []; + for ( + let baseClass = Object.getPrototypeOf(target.prototype.constructor); + typeof baseClass.prototype !== 'undefined'; + baseClass = Object.getPrototypeOf(baseClass.prototype.constructor) + ) { + ancestors.push(baseClass); + } + this._ancestorsMap.set(target, ancestors); } + return this._ancestorsMap.get(target); + } } diff --git a/src/metadata/TransformMetadata.ts b/src/metadata/TransformMetadata.ts index 1e64dab65..b9a6e588d 100644 --- a/src/metadata/TransformMetadata.ts +++ b/src/metadata/TransformMetadata.ts @@ -1,12 +1,11 @@ -import {TransformOptions} from "./ExposeExcludeOptions"; -import {TransformationType} from "../TransformOperationExecutor"; +import { TransformOptions } from './ExposeExcludeOptions'; +import { TransformationType } from '../TransformOperationExecutor'; export class TransformMetadata { - - constructor(public target: Function, - public propertyName: string, - public transformFn: (value: any, obj: any, transformationType: TransformationType) => any, - public options: TransformOptions) { - } - + constructor( + public target: Function, + public propertyName: string, + public transformFn: (value: any, obj: any, transformationType: TransformationType) => any, + public options: TransformOptions + ) {} } diff --git a/src/storage.ts b/src/storage.ts index 43258687e..aa119ef2c 100644 --- a/src/storage.ts +++ b/src/storage.ts @@ -1,4 +1,4 @@ -import {MetadataStorage} from "./metadata/MetadataStorage"; +import { MetadataStorage } from './metadata/MetadataStorage'; /** * Default metadata storage is used as singleton and can be used to storage all metadatas. diff --git a/test/functional/basic-functionality.spec.ts b/test/functional/basic-functionality.spec.ts index 7f96086d9..f7ae6ee28 100644 --- a/test/functional/basic-functionality.spec.ts +++ b/test/functional/basic-functionality.spec.ts @@ -1,1794 +1,1831 @@ -import "reflect-metadata"; -import {classToClass, classToClassFromExist, classToPlain, classToPlainFromExist, plainToClass, plainToClassFromExist} from "../../src/index"; -import {defaultMetadataStorage} from "../../src/storage"; -import {Exclude, Expose, Type} from "../../src/decorators"; -import {testForBuffer} from "../../src/TransformOperationExecutor"; - -describe("basic functionality", () => { - it("should return true if Buffer is present in environment, else false", () => { - expect(testForBuffer()).toBeTruthy(); - const bufferImp = global.Buffer; - delete global.Buffer; - expect(testForBuffer()).toBeFalsy(); - global.Buffer = bufferImp; - }); - - it("should convert instance of the given object to plain javascript object and should expose all properties since its a default behaviour", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - firstName: string; - lastName: string; - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - - const existUser = {id: 1, age: 27}; - const plainUser2 = classToPlainFromExist(user, existUser); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - - const classToClassUser = classToClass(user); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).toEqual(user); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - }); - - it("should exclude extraneous values if the excludeExtraneousValues option is set to true", () => { - defaultMetadataStorage.clear(); - - class User { - @Expose() id: number; - @Expose() firstName: string; - @Expose() lastName: string; - } - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - age: 12 - }; - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toHaveProperty("age"); - expect(transformedUser.id).toBeUndefined(); - - const transformedUserWithoutExtra = plainToClass(User, fromPlainUser, {excludeExtraneousValues: true}); - expect(transformedUserWithoutExtra).toBeInstanceOf(User); - expect(transformedUserWithoutExtra).not.toHaveProperty("age"); - }); - - it("should exclude all objects marked with @Exclude() decorator", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - firstName: string; - lastName: string; - @Exclude() - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - expect(plainUser.password).toBeUndefined(); - - const existUser = {id: 1, age: 27, password: "yayayaya"}; - const plainUser2 = classToPlainFromExist(user, existUser); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "yayayaya" - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassUser = classToClass(user); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - }); - - it("should exclude all properties from object if whole class is marked with @Exclude() decorator", () => { - defaultMetadataStorage.clear(); - - @Exclude() - class User { - id: number; - firstName: string; - lastName: string; - password: string; - } - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({}); - expect(plainUser.firstName).toBeUndefined(); - expect(plainUser.lastName).toBeUndefined(); - expect(plainUser.password).toBeUndefined(); - - const existUser = {id: 1, age: 27}; - const plainUser2 = classToPlainFromExist(user, existUser); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27 - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({}); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1 - }); - - const classToClassUser = classToClass(user); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({}); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1 - }); - }); - - it("should exclude all properties from object if whole class is marked with @Exclude() decorator, but include properties marked with @Expose() decorator", () => { - defaultMetadataStorage.clear(); - - @Exclude() - class User { - id: number; - - @Expose() - firstName: string; - - @Expose() - lastName: string; - - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - expect(plainUser.password).toBeUndefined(); - - const existUser = {id: 1, age: 27}; - const plainUser2 = classToPlainFromExist(user, existUser); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassUser = classToClass(user); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - }); - - it("should exclude all properties from object if its defined via transformation options, but include properties marked with @Expose() decorator", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - - @Expose() - firstName: string; - - @Expose() - lastName: string; - - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user, {strategy: "excludeAll"}); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - expect(plainUser.password).toBeUndefined(); - - const existUser = {id: 1, age: 27}; - const plainUser2 = classToPlainFromExist(user, existUser, {strategy: "excludeAll"}); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser, {strategy: "excludeAll"}); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, {strategy: "excludeAll"}); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassUser = classToClass(user, {strategy: "excludeAll"}); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, {strategy: "excludeAll"}); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - }); - - it("should expose all properties from object if its defined via transformation options, but exclude properties marked with @Exclude() decorator", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - firstName: string; - - @Exclude() - lastName: string; - - @Exclude() - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user, {strategy: "exposeAll"}); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed" - }); - expect(plainUser.lastName).toBeUndefined(); - expect(plainUser.password).toBeUndefined(); - - const existUser = {id: 1, age: 27}; - const plainUser2 = classToPlainFromExist(user, existUser, {strategy: "exposeAll"}); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed" - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser, {strategy: "exposeAll"}); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "Umed" - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, {strategy: "exposeAll"}); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed" - }); - - const classToClassUser = classToClass(user, {strategy: "exposeAll"}); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({ - firstName: "Umed" - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, {strategy: "exposeAll"}); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed" - }); - }); - - it("should convert values to specific types if they are set via @Type decorator", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - - @Type(type => String) - firstName: string; - - @Type(type => String) - lastName: string; - - @Type(type => Number) - password: number; - - @Type(type => Boolean) - isActive: boolean; - - @Type(type => Date) - registrationDate: Date; - - @Type(type => String) - lastVisitDate: string; - - @Type(type => Buffer) - uuidBuffer: Buffer; - - @Type(type => String) - nullableString?: null | string; - - @Type(type => Number) - nullableNumber?: null | number; - - @Type(type => Boolean) - nullableBoolean?: null | boolean; - - @Type(type => Date) - nullableDate?: null | Date; - - @Type(type => Buffer) - nullableBuffer?: null | Buffer; - } - - const date = new Date(); - const user = new User(); - const uuid = Buffer.from('1234'); - user.firstName = 321 as any; - user.lastName = 123 as any; - user.password = "123" as any; - user.isActive = "1" as any; - user.registrationDate = date.toString() as any; - user.lastVisitDate = date as any; - user.uuidBuffer = uuid as any; - user.nullableString = null as any; - user.nullableNumber = null as any; - user.nullableBoolean = null as any; - user.nullableDate = null as any; - user.nullableBuffer = null as any; - - const fromPlainUser = { - firstName: 321, - lastName: 123, - password: "123", - isActive: "1", - registrationDate: date.toString(), - lastVisitDate: date, - uuidBuffer: uuid, - nullableString: null as null | string, - nullableNumber: null as null | string, - nullableBoolean: null as null | string, - nullableDate: null as null | string, - nullableBuffer: null as null | string, - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user, {strategy: "exposeAll"}); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - uuidBuffer: uuid, - nullableString: null, - nullableNumber: null, - nullableBoolean: null, - nullableDate: null, - nullableBuffer: null - }); - - const existUser = {id: 1, age: 27}; - const plainUser2 = classToPlainFromExist(user, existUser, {strategy: "exposeAll"}); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - uuidBuffer: uuid, - nullableString: null, - nullableNumber: null, - nullableBoolean: null, - nullableDate: null, - nullableBuffer: null - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser, {strategy: "exposeAll"}); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - uuidBuffer: uuid, - nullableString: null, - nullableNumber: null, - nullableBoolean: null, - nullableDate: null, - nullableBuffer: null - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, {strategy: "exposeAll"}); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - uuidBuffer: uuid, - nullableString: null, - nullableNumber: null, - nullableBoolean: null, - nullableDate: null, - nullableBuffer: null - }); - - const classToClassUser = classToClass(user, {strategy: "exposeAll"}); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({ - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - uuidBuffer: uuid, - nullableString: null, - nullableNumber: null, - nullableBoolean: null, - nullableDate: null, - nullableBuffer: null - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, {strategy: "exposeAll"}); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - uuidBuffer: uuid, - nullableString: null, - nullableNumber: null, - nullableBoolean: null, - nullableDate: null, - nullableBuffer: null - }); - }); - - it("should transform nested objects too and make sure their decorators are used too", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - name: string; - - @Exclude() - filename: string; - - uploadDate: Date; - } - - class User { - firstName: string; - lastName: string; - - @Exclude() - password: string; - - photo: Photo; // type should be automatically guessed - } - - const photo = new Photo(); - photo.id = 1; - photo.name = "Me"; - photo.filename = "iam.jpg"; - photo.uploadDate = new Date(); - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.photo = photo; - - const plainUser: any = classToPlain(user, {strategy: "exposeAll"}); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser.photo).not.toBeInstanceOf(Photo); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - uploadDate: photo.uploadDate - } - }); - expect(plainUser.password).toBeUndefined(); - expect(plainUser.photo.filename).toBeUndefined(); - expect(plainUser.photo.uploadDate).toEqual(photo.uploadDate); - expect(plainUser.photo.uploadDate).not.toBe(photo.uploadDate); - - const existUser = {id: 1, age: 27, photo: {id: 2, description: "photo"}}; - const plainUser2: any = classToPlainFromExist(user, existUser, {strategy: "exposeAll"}); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2.photo).not.toBeInstanceOf(Photo); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - uploadDate: photo.uploadDate, - description: "photo" - } - }); - expect(plainUser2).toEqual(existUser); - expect(plainUser2.password).toBeUndefined(); - expect(plainUser2.photo.filename).toBeUndefined(); - expect(plainUser2.photo.uploadDate).toEqual(photo.uploadDate); - expect(plainUser2.photo.uploadDate).not.toBe(photo.uploadDate); - }); - - it("should transform nested objects too and make sure given type is used instead of automatically guessed one", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - name: string; - - @Exclude() - filename: string; - } - - class ExtendedPhoto implements Photo { - id: number; - - @Exclude() - name: string; - - filename: string; - } - - class User { - id: number; - firstName: string; - lastName: string; - - @Exclude() - password: string; - - @Type(type => ExtendedPhoto) // force specific type - photo: Photo; - } - - const photo = new Photo(); - photo.id = 1; - photo.name = "Me"; - photo.filename = "iam.jpg"; - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.photo = photo; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "iam.jpg" - } - }); - expect(plainUser.password).toBeUndefined(); - expect(plainUser.photo.name).toBeUndefined(); - }); - - it("should convert given plain object to class instance object", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - name: string; - - @Exclude() - filename: string; - - metadata: string; - uploadDate: Date; - } - - class User { - id: number; - firstName: string; - lastName: string; - - @Exclude() - password: string; - - @Type(type => Photo) - photo: Photo; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.photo = new Photo(); - user.photo.id = 1; - user.photo.name = "Me"; - user.photo.filename = "iam.jpg"; - user.photo.uploadDate = new Date(); - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - name: "Me", - filename: "iam.jpg", - uploadDate: new Date(), - } - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - const fromExistPhoto = new Photo(); - fromExistPhoto.metadata = "taken by Camera"; - fromExistUser.photo = fromExistPhoto; - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser.photo).toBeInstanceOf(Photo); - expect(transformedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - uploadDate: fromPlainUser.photo.uploadDate - } - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - expect(fromExistTransformedUser).toEqual(fromExistUser); - expect(fromExistTransformedUser.photo).toEqual(fromExistPhoto); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - metadata: "taken by Camera", - uploadDate: fromPlainUser.photo.uploadDate - } - }); - - const classToClassUser = classToClass(user); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser.photo).toBeInstanceOf(Photo); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).not.toEqual(user.photo); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - uploadDate: user.photo.uploadDate - } - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).not.toEqual(user.photo); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - metadata: "taken by Camera", - uploadDate: user.photo.uploadDate - } - }); - }); - - it("should expose only properties that match given group", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - - @Expose({ - groups: ["user", "guest"] - }) - filename: string; - - @Expose({ - groups: ["admin"] - }) - status: number; - - metadata: string; - } - - class User { - id: number; - firstName: string; - - @Expose({ - groups: ["user", "guest"] - }) - lastName: string; - - @Expose({ - groups: ["user"] - }) - password: string; - - @Expose({ - groups: ["admin"] - }) - isActive: boolean; - - @Type(type => Photo) - photo: Photo; - - @Expose({ - groups: ["admin"] - }) - @Type(type => Photo) - photos: Photo[]; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.isActive = false; - user.photo = new Photo(); - user.photo.id = 1; - user.photo.filename = "myphoto.jpg"; - user.photo.status = 1; - user.photos = [user.photo]; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - isActive: false, - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1, - }] - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - fromExistUser.photo = new Photo(); - fromExistUser.photo.metadata = "taken by Camera"; - - const plainUser1: any = classToPlain(user); - expect(plainUser1).not.toBeInstanceOf(User); - expect(plainUser1).toEqual({ - firstName: "Umed", - photo: { - id: 1 - } - }); - expect(plainUser1.lastName).toBeUndefined(); - expect(plainUser1.password).toBeUndefined(); - expect(plainUser1.isActive).toBeUndefined(); - - const plainUser2: any = classToPlain(user, {groups: ["user"]}); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - expect(plainUser2.isActive).toBeUndefined(); - - const transformedUser2 = plainToClass(User, fromPlainUser, {groups: ["user"]}); - expect(transformedUser2).toBeInstanceOf(User); - expect(transformedUser2.photo).toBeInstanceOf(Photo); - expect(transformedUser2).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, {groups: ["user"]}); - expect(fromExistTransformedUser).toEqual(fromExistUser); - expect(fromExistTransformedUser.photo).toEqual(fromExistUser.photo); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - metadata: "taken by Camera", - filename: "myphoto.jpg" - } - }); - - const classToClassUser = classToClass(user, {groups: ["user"]}); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser.photo).toBeInstanceOf(Photo); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).not.toEqual(user.photo); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, {groups: ["user"]}); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).not.toEqual(user.photo); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - metadata: "taken by Camera", - filename: "myphoto.jpg" - } - }); - - const plainUser3: any = classToPlain(user, {groups: ["guest"]}); - expect(plainUser3).not.toBeInstanceOf(User); - expect(plainUser3).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - expect(plainUser3.password).toBeUndefined(); - expect(plainUser3.isActive).toBeUndefined(); - - const transformedUser3 = plainToClass(User, fromPlainUser, {groups: ["guest"]}); - expect(transformedUser3).toBeInstanceOf(User); - expect(transformedUser3.photo).toBeInstanceOf(Photo); - expect(transformedUser3).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - - const plainUser4: any = classToPlain(user, {groups: ["admin"]}); - expect(plainUser4).not.toBeInstanceOf(User); - expect(plainUser4).toEqual({ - firstName: "Umed", - isActive: false, - photo: { - id: 1, - status: 1 - }, - photos: [{ - id: 1, - status: 1 - }] - }); - expect(plainUser4.lastName).toBeUndefined(); - expect(plainUser4.password).toBeUndefined(); - - const transformedUser4 = plainToClass(User, fromPlainUser, {groups: ["admin"]}); - expect(transformedUser4).toBeInstanceOf(User); - expect(transformedUser4.photo).toBeInstanceOf(Photo); - expect(transformedUser4.photos[0]).toBeInstanceOf(Photo); - expect(transformedUser4).toEqual({ - firstName: "Umed", - isActive: false, - photo: { - id: 1, - status: 1 - }, - photos: [{ - id: 1, - status: 1 - }] - }); - - const plainUser5: any = classToPlain(user, {groups: ["admin", "user"]}); - expect(plainUser5).not.toBeInstanceOf(User); - expect(plainUser5).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - isActive: false, - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1 - }] - }); - - const transformedUser5 = plainToClass(User, fromPlainUser, {groups: ["admin", "user"]}); - expect(transformedUser5).toBeInstanceOf(User); - expect(transformedUser5).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - isActive: false, - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1 - }] - }); - }); - - it("should expose only properties that match given version", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - - @Expose({ - since: 1.5, - until: 2 - }) - filename: string; - - @Expose({ - since: 2 - }) - status: number; - } - - class User { - @Expose({ - since: 1, - until: 2 - }) - firstName: string; - - @Expose({ - since: 0.5 - }) - lastName: string; - - @Exclude() - password: string; - - @Type(type => Photo) - photo: Photo; - - @Expose({ - since: 3 - }) - @Type(type => Photo) - photos: Photo[]; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.photo = new Photo(); - user.photo.id = 1; - user.photo.filename = "myphoto.jpg"; - user.photo.status = 1; - user.photos = [user.photo]; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1, - }] - }; - - const plainUser1: any = classToPlain(user); - expect(plainUser1).not.toBeInstanceOf(User); - expect(plainUser1).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1 - }] - }); - - const transformedUser1 = plainToClass(User, fromPlainUser); - expect(transformedUser1).toBeInstanceOf(User); - expect(transformedUser1.photo).toBeInstanceOf(Photo); - expect(transformedUser1.photos[0]).toBeInstanceOf(Photo); - expect(transformedUser1).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1 - }] - }); - - const plainUser2: any = classToPlain(user, {version: 0.3}); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - photo: { - id: 1 - } - }); - - const transformedUser2 = plainToClass(User, fromPlainUser, {version: 0.3}); - expect(transformedUser2).toBeInstanceOf(User); - expect(transformedUser2.photo).toBeInstanceOf(Photo); - expect(transformedUser2).toEqual({ - photo: { - id: 1 - } - }); - - const plainUser3: any = classToPlain(user, {version: 0.5}); - expect(plainUser3).not.toBeInstanceOf(User); - expect(plainUser3).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1 - } - }); - - const transformedUser3 = plainToClass(User, fromPlainUser, {version: 0.5}); - expect(transformedUser3).toBeInstanceOf(User); - expect(transformedUser3.photo).toBeInstanceOf(Photo); - expect(transformedUser3).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1 - } - }); - - const plainUser4: any = classToPlain(user, {version: 1}); - expect(plainUser4).not.toBeInstanceOf(User); - expect(plainUser4).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1 - } - }); - - const transformedUser4 = plainToClass(User, fromPlainUser, {version: 1}); - expect(transformedUser4).toBeInstanceOf(User); - expect(transformedUser4.photo).toBeInstanceOf(Photo); - expect(transformedUser4).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1 - } - }); - - const plainUser5: any = classToPlain(user, {version: 1.5}); - expect(plainUser5).not.toBeInstanceOf(User); - expect(plainUser5).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - - const transformedUser5 = plainToClass(User, fromPlainUser, {version: 1.5}); - expect(transformedUser5).toBeInstanceOf(User); - expect(transformedUser5.photo).toBeInstanceOf(Photo); - expect(transformedUser5).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - - const plainUser6: any = classToPlain(user, {version: 2}); - expect(plainUser6).not.toBeInstanceOf(User); - expect(plainUser6).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1, - status: 1 - } - }); - - const transformedUser6 = plainToClass(User, fromPlainUser, {version: 2}); - expect(transformedUser6).toBeInstanceOf(User); - expect(transformedUser6.photo).toBeInstanceOf(Photo); - expect(transformedUser6).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1, - status: 1 - } - }); - - const plainUser7: any = classToPlain(user, {version: 3}); - expect(plainUser7).not.toBeInstanceOf(User); - expect(plainUser7).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1, - status: 1 - }, - photos: [{ - id: 1, - status: 1 - }] - }); - - const transformedUser7 = plainToClass(User, fromPlainUser, {version: 3}); - expect(transformedUser7).toBeInstanceOf(User); - expect(transformedUser7.photo).toBeInstanceOf(Photo); - expect(transformedUser7.photos[0]).toBeInstanceOf(Photo); - expect(transformedUser7).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1, - status: 1 - }, - photos: [{ - id: 1, - status: 1 - }] - }); - - }); - - it("should expose method and accessors that have @Expose()", () => { - defaultMetadataStorage.clear(); - - class User { - firstName: string; - lastName: string; - - @Exclude() - password: string; - - @Expose() - get name(): string { - return this.firstName + " " + this.lastName; - } - - @Expose() - getName(): string { - return this.firstName + " " + this.lastName; - } - - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - name: "Umed Khudoiberdiev", - getName: "Umed Khudoiberdiev" - }); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - const likeUser = new User(); - likeUser.firstName = "Umed"; - likeUser.lastName = "Khudoiberdiev"; - expect(transformedUser).toEqual(likeUser); - }); - - it("should expose with alternative name if its given", () => { - defaultMetadataStorage.clear(); - - class User { - @Expose({name: "myName"}) - firstName: string; - - @Expose({name: "secondName"}) - lastName: string; - - @Exclude() - password: string; - - @Expose() - get name(): string { - return this.firstName + " " + this.lastName; - } - - @Expose({name: "fullName"}) - getName(): string { - return this.firstName + " " + this.lastName; - } - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - myName: "Umed", - secondName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - myName: "Umed", - secondName: "Khudoiberdiev", - name: "Umed Khudoiberdiev", - fullName: "Umed Khudoiberdiev" - }); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - const likeUser = new User(); - likeUser.firstName = "Umed"; - likeUser.lastName = "Khudoiberdiev"; - expect(transformedUser).toEqual(likeUser); - }); - - it("should exclude all prefixed properties if prefix is given", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - $filename: string; - status: number; - } - - class User { - $system: string; - _firstName: string; - _lastName: string; - - @Exclude() - password: string; - - @Type(() => Photo) - photo: Photo; - - @Expose() - get name(): string { - return this._firstName + " " + this._lastName; - } - } - - const user = new User(); - user.$system = "@#$%^&*token(*&^%$#@!"; - user._firstName = "Umed"; - user._lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.photo = new Photo(); - user.photo.id = 1; - user.photo.$filename = "myphoto.jpg"; - user.photo.status = 1; - - const fromPlainUser = { - $system: "@#$%^&*token(*&^%$#@!", - _firstName: "Khudoiberdiev", - _lastName: "imnosuperman", - password: "imnosuperman", - photo: { - id: 1, - $filename: "myphoto.jpg", - status: 1, - } - }; - - const plainUser: any = classToPlain(user, {excludePrefixes: ["_", "$"]}); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - name: "Umed Khudoiberdiev", - photo: { - id: 1, - status: 1 - } - }); - - const transformedUser = plainToClass(User, fromPlainUser, {excludePrefixes: ["_", "$"]}); - expect(transformedUser).toBeInstanceOf(User); - const likeUser = new User(); - likeUser.photo = new Photo(); - likeUser.photo.id = 1; - likeUser.photo.status = 1; - expect(transformedUser).toEqual(likeUser); - }); - - it("should transform array", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - firstName: string; - lastName: string; - - @Exclude() - password: string; - - @Expose() - get name(): string { - return this.firstName + " " + this.lastName; - } - } - - const user1 = new User(); - user1.firstName = "Umed"; - user1.lastName = "Khudoiberdiev"; - user1.password = "imnosuperman"; - - const user2 = new User(); - user2.firstName = "Dima"; - user2.lastName = "Zotov"; - user2.password = "imnomesser"; - - const users = [user1, user2]; - - const plainUsers: any = classToPlain(users); - expect(plainUsers).toEqual([{ - firstName: "Umed", - lastName: "Khudoiberdiev", - name: "Umed Khudoiberdiev" - }, { - firstName: "Dima", - lastName: "Zotov", - name: "Dima Zotov" - }]); - - const fromPlainUsers = [{ - firstName: "Umed", - lastName: "Khudoiberdiev", - name: "Umed Khudoiberdiev" - }, { - firstName: "Dima", - lastName: "Zotov", - name: "Dima Zotov" - }]; - - const existUsers = [{id: 1, age: 27}, {id: 2, age: 30}]; - const plainUser2 = classToPlainFromExist(users, existUsers); - expect(plainUser2).toEqual([{ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev", - name: "Umed Khudoiberdiev" - }, { - id: 2, - age: 30, - firstName: "Dima", - lastName: "Zotov", - name: "Dima Zotov" - }]); - - const transformedUser = plainToClass(User, fromPlainUsers); - - expect(transformedUser[0]).toBeInstanceOf(User); - expect(transformedUser[1]).toBeInstanceOf(User); - const likeUser1 = new User(); - likeUser1.firstName = "Umed"; - likeUser1.lastName = "Khudoiberdiev"; - - const likeUser2 = new User(); - likeUser2.firstName = "Dima"; - likeUser2.lastName = "Zotov"; - expect(transformedUser).toEqual([likeUser1, likeUser2]); - - const classToClassUsers = classToClass(users); - expect(classToClassUsers[0]).toBeInstanceOf(User); - expect(classToClassUsers[1]).toBeInstanceOf(User); - expect(classToClassUsers[0]).not.toEqual(user1); - expect(classToClassUsers[1]).not.toEqual(user1); - - const classUserLike1 = new User(); - classUserLike1.firstName = "Umed"; - classUserLike1.lastName = "Khudoiberdiev"; - - const classUserLike2 = new User(); - classUserLike2.firstName = "Dima"; - classUserLike2.lastName = "Zotov"; - - expect(classToClassUsers).toEqual([classUserLike1, classUserLike2]); - - const fromExistUser1 = new User(); - fromExistUser1.id = 1; - - const fromExistUser2 = new User(); - fromExistUser2.id = 2; - - const fromExistUsers = [fromExistUser1, fromExistUser2]; - - const classToClassFromExistUser = classToClassFromExist(users, fromExistUsers); - expect(classToClassFromExistUser[0]).toBeInstanceOf(User); - expect(classToClassFromExistUser[1]).toBeInstanceOf(User); - expect(classToClassFromExistUser[0]).not.toEqual(user1); - expect(classToClassFromExistUser[1]).not.toEqual(user1); - expect(classToClassFromExistUser).toEqual(fromExistUsers); - - const fromExistUserLike1 = new User(); - fromExistUserLike1.id = 1; - fromExistUserLike1.firstName = "Umed"; - fromExistUserLike1.lastName = "Khudoiberdiev"; - - const fromExistUserLike2 = new User(); - fromExistUserLike2.id = 2; - fromExistUserLike2.firstName = "Dima"; - fromExistUserLike2.lastName = "Zotov"; - - expect(classToClassFromExistUser).toEqual([fromExistUserLike1, fromExistUserLike2]); - }); - - it("should transform objects with null prototype", () => { - class TestClass { - prop: string; - } - - const obj = Object.create(null); - obj.a = "JS FTW"; - - const transformedClass = plainToClass(TestClass, obj); - expect(transformedClass).toBeInstanceOf(TestClass); - }); - - it('should not pollute the prototype with a `__proto__` property',() => { - const object = JSON.parse('{"__proto__": { "admin": true }}'); - const plainObject = {}; - classToPlainFromExist(object, plainObject); - expect((plainObject as any).admin).toEqual(undefined); - }); - - it('should not pollute the prototype with a `constructor.prototype` property', () => { - const object = JSON.parse('{"constructor": { "prototype": { "admin": true }}}'); - const plainObject = {}; - classToPlainFromExist(object, plainObject); - expect((plainObject as any).admin).toEqual(undefined); +import 'reflect-metadata'; +import { + classToClass, + classToClassFromExist, + classToPlain, + classToPlainFromExist, + plainToClass, + plainToClassFromExist, +} from '../../src/index'; +import { defaultMetadataStorage } from '../../src/storage'; +import { Exclude, Expose, Type } from '../../src/decorators'; +import { testForBuffer } from '../../src/TransformOperationExecutor'; + +describe('basic functionality', () => { + it('should return true if Buffer is present in environment, else false', () => { + expect(testForBuffer()).toBeTruthy(); + const bufferImp = global.Buffer; + delete global.Buffer; + expect(testForBuffer()).toBeFalsy(); + global.Buffer = bufferImp; + }); + + it('should convert instance of the given object to plain javascript object and should expose all properties since its a default behaviour', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + firstName: string; + lastName: string; + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', }); - it("should default union types where the plain type is an array to an array result", () => { - class User { - name: string; - } + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + + const classToClassUser = classToClass(user); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).toEqual(user); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + }); + + it('should exclude extraneous values if the excludeExtraneousValues option is set to true', () => { + defaultMetadataStorage.clear(); + + class User { + @Expose() id: number; + @Expose() firstName: string; + @Expose() lastName: string; + } + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + age: 12, + }; + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toHaveProperty('age'); + expect(transformedUser.id).toBeUndefined(); + + const transformedUserWithoutExtra = plainToClass(User, fromPlainUser, { excludeExtraneousValues: true }); + expect(transformedUserWithoutExtra).toBeInstanceOf(User); + expect(transformedUserWithoutExtra).not.toHaveProperty('age'); + }); + + it('should exclude all objects marked with @Exclude() decorator', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + firstName: string; + lastName: string; + @Exclude() + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + expect(plainUser.password).toBeUndefined(); + + const existUser = { id: 1, age: 27, password: 'yayayaya' }; + const plainUser2 = classToPlainFromExist(user, existUser); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'yayayaya', + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassUser = classToClass(user); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + }); + + it('should exclude all properties from object if whole class is marked with @Exclude() decorator', () => { + defaultMetadataStorage.clear(); + + @Exclude() + class User { + id: number; + firstName: string; + lastName: string; + password: string; + } + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({}); + expect(plainUser.firstName).toBeUndefined(); + expect(plainUser.lastName).toBeUndefined(); + expect(plainUser.password).toBeUndefined(); + + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({}); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + }); + + const classToClassUser = classToClass(user); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({}); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + }); + }); + + it('should exclude all properties from object if whole class is marked with @Exclude() decorator, but include properties marked with @Expose() decorator', () => { + defaultMetadataStorage.clear(); + + @Exclude() + class User { + id: number; + + @Expose() + firstName: string; + + @Expose() + lastName: string; + + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + expect(plainUser.password).toBeUndefined(); + + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassUser = classToClass(user); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + }); + + it('should exclude all properties from object if its defined via transformation options, but include properties marked with @Expose() decorator', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + + @Expose() + firstName: string; + + @Expose() + lastName: string; + + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user, { strategy: 'excludeAll' }); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + expect(plainUser.password).toBeUndefined(); + + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser, { strategy: 'excludeAll' }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser, { strategy: 'excludeAll' }); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: 'excludeAll' }); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassUser = classToClass(user, { strategy: 'excludeAll' }); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: 'excludeAll' }); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + }); + + it('should expose all properties from object if its defined via transformation options, but exclude properties marked with @Exclude() decorator', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + firstName: string; + + @Exclude() + lastName: string; + + @Exclude() + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user, { strategy: 'exposeAll' }); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + }); + expect(plainUser.lastName).toBeUndefined(); + expect(plainUser.password).toBeUndefined(); + + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser, { strategy: 'exposeAll' }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + }); + expect(plainUser2).toEqual(existUser); - class TestClass { - @Type(() => User) - usersDefined: User[] | undefined; + const transformedUser = plainToClass(User, fromPlainUser, { strategy: 'exposeAll' }); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: 'Umed', + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: 'exposeAll' }); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + }); + + const classToClassUser = classToClass(user, { strategy: 'exposeAll' }); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: 'exposeAll' }); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + }); + }); + + it('should convert values to specific types if they are set via @Type decorator', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + + @Type(type => String) + firstName: string; + + @Type(type => String) + lastName: string; + + @Type(type => Number) + password: number; + + @Type(type => Boolean) + isActive: boolean; + + @Type(type => Date) + registrationDate: Date; + + @Type(type => String) + lastVisitDate: string; + + @Type(type => Buffer) + uuidBuffer: Buffer; + + @Type(type => String) + nullableString?: null | string; + + @Type(type => Number) + nullableNumber?: null | number; + + @Type(type => Boolean) + nullableBoolean?: null | boolean; + + @Type(type => Date) + nullableDate?: null | Date; + + @Type(type => Buffer) + nullableBuffer?: null | Buffer; + } + + const date = new Date(); + const user = new User(); + const uuid = Buffer.from('1234'); + user.firstName = 321 as any; + user.lastName = 123 as any; + user.password = '123' as any; + user.isActive = '1' as any; + user.registrationDate = date.toString() as any; + user.lastVisitDate = date as any; + user.uuidBuffer = uuid as any; + user.nullableString = null as any; + user.nullableNumber = null as any; + user.nullableBoolean = null as any; + user.nullableDate = null as any; + user.nullableBuffer = null as any; + + const fromPlainUser = { + firstName: 321, + lastName: 123, + password: '123', + isActive: '1', + registrationDate: date.toString(), + lastVisitDate: date, + uuidBuffer: uuid, + nullableString: null as null | string, + nullableNumber: null as null | string, + nullableBoolean: null as null | string, + nullableDate: null as null | string, + nullableBuffer: null as null | string, + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user, { strategy: 'exposeAll' }); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + uuidBuffer: uuid, + nullableString: null, + nullableNumber: null, + nullableBoolean: null, + nullableDate: null, + nullableBuffer: null, + }); + + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser, { strategy: 'exposeAll' }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + uuidBuffer: uuid, + nullableString: null, + nullableNumber: null, + nullableBoolean: null, + nullableDate: null, + nullableBuffer: null, + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser, { strategy: 'exposeAll' }); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + uuidBuffer: uuid, + nullableString: null, + nullableNumber: null, + nullableBoolean: null, + nullableDate: null, + nullableBuffer: null, + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: 'exposeAll' }); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + uuidBuffer: uuid, + nullableString: null, + nullableNumber: null, + nullableBoolean: null, + nullableDate: null, + nullableBuffer: null, + }); + + const classToClassUser = classToClass(user, { strategy: 'exposeAll' }); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + uuidBuffer: uuid, + nullableString: null, + nullableNumber: null, + nullableBoolean: null, + nullableDate: null, + nullableBuffer: null, + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: 'exposeAll' }); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + uuidBuffer: uuid, + nullableString: null, + nullableNumber: null, + nullableBoolean: null, + nullableDate: null, + nullableBuffer: null, + }); + }); + + it('should transform nested objects too and make sure their decorators are used too', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + name: string; + + @Exclude() + filename: string; + + uploadDate: Date; + } + + class User { + firstName: string; + lastName: string; + + @Exclude() + password: string; + + photo: Photo; // type should be automatically guessed + } + + const photo = new Photo(); + photo.id = 1; + photo.name = 'Me'; + photo.filename = 'iam.jpg'; + photo.uploadDate = new Date(); + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.photo = photo; + + const plainUser: any = classToPlain(user, { strategy: 'exposeAll' }); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser.photo).not.toBeInstanceOf(Photo); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + uploadDate: photo.uploadDate, + }, + }); + expect(plainUser.password).toBeUndefined(); + expect(plainUser.photo.filename).toBeUndefined(); + expect(plainUser.photo.uploadDate).toEqual(photo.uploadDate); + expect(plainUser.photo.uploadDate).not.toBe(photo.uploadDate); + + const existUser = { id: 1, age: 27, photo: { id: 2, description: 'photo' } }; + const plainUser2: any = classToPlainFromExist(user, existUser, { strategy: 'exposeAll' }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2.photo).not.toBeInstanceOf(Photo); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + uploadDate: photo.uploadDate, + description: 'photo', + }, + }); + expect(plainUser2).toEqual(existUser); + expect(plainUser2.password).toBeUndefined(); + expect(plainUser2.photo.filename).toBeUndefined(); + expect(plainUser2.photo.uploadDate).toEqual(photo.uploadDate); + expect(plainUser2.photo.uploadDate).not.toBe(photo.uploadDate); + }); + + it('should transform nested objects too and make sure given type is used instead of automatically guessed one', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + name: string; + + @Exclude() + filename: string; + } + + class ExtendedPhoto implements Photo { + id: number; + + @Exclude() + name: string; + + filename: string; + } + + class User { + id: number; + firstName: string; + lastName: string; + + @Exclude() + password: string; + + @Type(type => ExtendedPhoto) // force specific type + photo: Photo; + } + + const photo = new Photo(); + photo.id = 1; + photo.name = 'Me'; + photo.filename = 'iam.jpg'; + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.photo = photo; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'iam.jpg', + }, + }); + expect(plainUser.password).toBeUndefined(); + expect(plainUser.photo.name).toBeUndefined(); + }); + + it('should convert given plain object to class instance object', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + name: string; + + @Exclude() + filename: string; + + metadata: string; + uploadDate: Date; + } + + class User { + id: number; + firstName: string; + lastName: string; + + @Exclude() + password: string; + + @Type(type => Photo) + photo: Photo; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.photo = new Photo(); + user.photo.id = 1; + user.photo.name = 'Me'; + user.photo.filename = 'iam.jpg'; + user.photo.uploadDate = new Date(); + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + name: 'Me', + filename: 'iam.jpg', + uploadDate: new Date(), + }, + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + const fromExistPhoto = new Photo(); + fromExistPhoto.metadata = 'taken by Camera'; + fromExistUser.photo = fromExistPhoto; + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser.photo).toBeInstanceOf(Photo); + expect(transformedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + uploadDate: fromPlainUser.photo.uploadDate, + }, + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); + expect(fromExistTransformedUser).toEqual(fromExistUser); + expect(fromExistTransformedUser.photo).toEqual(fromExistPhoto); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + metadata: 'taken by Camera', + uploadDate: fromPlainUser.photo.uploadDate, + }, + }); + + const classToClassUser = classToClass(user); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser.photo).toBeInstanceOf(Photo); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).not.toEqual(user.photo); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + uploadDate: user.photo.uploadDate, + }, + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).not.toEqual(user.photo); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + metadata: 'taken by Camera', + uploadDate: user.photo.uploadDate, + }, + }); + }); + + it('should expose only properties that match given group', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + + @Expose({ + groups: ['user', 'guest'], + }) + filename: string; + + @Expose({ + groups: ['admin'], + }) + status: number; + + metadata: string; + } + + class User { + id: number; + firstName: string; + + @Expose({ + groups: ['user', 'guest'], + }) + lastName: string; + + @Expose({ + groups: ['user'], + }) + password: string; + + @Expose({ + groups: ['admin'], + }) + isActive: boolean; + + @Type(type => Photo) + photo: Photo; + + @Expose({ + groups: ['admin'], + }) + @Type(type => Photo) + photos: Photo[]; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.isActive = false; + user.photo = new Photo(); + user.photo.id = 1; + user.photo.filename = 'myphoto.jpg'; + user.photo.status = 1; + user.photos = [user.photo]; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + isActive: false, + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + fromExistUser.photo = new Photo(); + fromExistUser.photo.metadata = 'taken by Camera'; + + const plainUser1: any = classToPlain(user); + expect(plainUser1).not.toBeInstanceOf(User); + expect(plainUser1).toEqual({ + firstName: 'Umed', + photo: { + id: 1, + }, + }); + expect(plainUser1.lastName).toBeUndefined(); + expect(plainUser1.password).toBeUndefined(); + expect(plainUser1.isActive).toBeUndefined(); + + const plainUser2: any = classToPlain(user, { groups: ['user'] }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + expect(plainUser2.isActive).toBeUndefined(); + + const transformedUser2 = plainToClass(User, fromPlainUser, { groups: ['user'] }); + expect(transformedUser2).toBeInstanceOf(User); + expect(transformedUser2.photo).toBeInstanceOf(Photo); + expect(transformedUser2).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { groups: ['user'] }); + expect(fromExistTransformedUser).toEqual(fromExistUser); + expect(fromExistTransformedUser.photo).toEqual(fromExistUser.photo); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + metadata: 'taken by Camera', + filename: 'myphoto.jpg', + }, + }); + + const classToClassUser = classToClass(user, { groups: ['user'] }); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser.photo).toBeInstanceOf(Photo); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).not.toEqual(user.photo); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { groups: ['user'] }); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).not.toEqual(user.photo); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + metadata: 'taken by Camera', + filename: 'myphoto.jpg', + }, + }); - @Type(() => User) - usersUndefined: User[] | undefined; - } + const plainUser3: any = classToPlain(user, { groups: ['guest'] }); + expect(plainUser3).not.toBeInstanceOf(User); + expect(plainUser3).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + expect(plainUser3.password).toBeUndefined(); + expect(plainUser3.isActive).toBeUndefined(); + + const transformedUser3 = plainToClass(User, fromPlainUser, { groups: ['guest'] }); + expect(transformedUser3).toBeInstanceOf(User); + expect(transformedUser3.photo).toBeInstanceOf(Photo); + expect(transformedUser3).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + + const plainUser4: any = classToPlain(user, { groups: ['admin'] }); + expect(plainUser4).not.toBeInstanceOf(User); + expect(plainUser4).toEqual({ + firstName: 'Umed', + isActive: false, + photo: { + id: 1, + status: 1, + }, + photos: [ + { + id: 1, + status: 1, + }, + ], + }); + expect(plainUser4.lastName).toBeUndefined(); + expect(plainUser4.password).toBeUndefined(); + + const transformedUser4 = plainToClass(User, fromPlainUser, { groups: ['admin'] }); + expect(transformedUser4).toBeInstanceOf(User); + expect(transformedUser4.photo).toBeInstanceOf(Photo); + expect(transformedUser4.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser4).toEqual({ + firstName: 'Umed', + isActive: false, + photo: { + id: 1, + status: 1, + }, + photos: [ + { + id: 1, + status: 1, + }, + ], + }); + + const plainUser5: any = classToPlain(user, { groups: ['admin', 'user'] }); + expect(plainUser5).not.toBeInstanceOf(User); + expect(plainUser5).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + isActive: false, + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }); + + const transformedUser5 = plainToClass(User, fromPlainUser, { groups: ['admin', 'user'] }); + expect(transformedUser5).toBeInstanceOf(User); + expect(transformedUser5).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + isActive: false, + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }); + }); + + it('should expose only properties that match given version', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + + @Expose({ + since: 1.5, + until: 2, + }) + filename: string; + + @Expose({ + since: 2, + }) + status: number; + } + + class User { + @Expose({ + since: 1, + until: 2, + }) + firstName: string; + + @Expose({ + since: 0.5, + }) + lastName: string; + + @Exclude() + password: string; + + @Type(type => Photo) + photo: Photo; + + @Expose({ + since: 3, + }) + @Type(type => Photo) + photos: Photo[]; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.photo = new Photo(); + user.photo.id = 1; + user.photo.filename = 'myphoto.jpg'; + user.photo.status = 1; + user.photos = [user.photo]; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }; + + const plainUser1: any = classToPlain(user); + expect(plainUser1).not.toBeInstanceOf(User); + expect(plainUser1).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }); + + const transformedUser1 = plainToClass(User, fromPlainUser); + expect(transformedUser1).toBeInstanceOf(User); + expect(transformedUser1.photo).toBeInstanceOf(Photo); + expect(transformedUser1.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser1).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }); + + const plainUser2: any = classToPlain(user, { version: 0.3 }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + photo: { + id: 1, + }, + }); + + const transformedUser2 = plainToClass(User, fromPlainUser, { version: 0.3 }); + expect(transformedUser2).toBeInstanceOf(User); + expect(transformedUser2.photo).toBeInstanceOf(Photo); + expect(transformedUser2).toEqual({ + photo: { + id: 1, + }, + }); + + const plainUser3: any = classToPlain(user, { version: 0.5 }); + expect(plainUser3).not.toBeInstanceOf(User); + expect(plainUser3).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + }, + }); - const obj = Object.create(null); - obj.usersDefined = [{name: "a-name"}]; - obj.usersUndefined = undefined; + const transformedUser3 = plainToClass(User, fromPlainUser, { version: 0.5 }); + expect(transformedUser3).toBeInstanceOf(User); + expect(transformedUser3.photo).toBeInstanceOf(Photo); + expect(transformedUser3).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + }, + }); + + const plainUser4: any = classToPlain(user, { version: 1 }); + expect(plainUser4).not.toBeInstanceOf(User); + expect(plainUser4).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + }, + }); + + const transformedUser4 = plainToClass(User, fromPlainUser, { version: 1 }); + expect(transformedUser4).toBeInstanceOf(User); + expect(transformedUser4.photo).toBeInstanceOf(Photo); + expect(transformedUser4).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + }, + }); + + const plainUser5: any = classToPlain(user, { version: 1.5 }); + expect(plainUser5).not.toBeInstanceOf(User); + expect(plainUser5).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + + const transformedUser5 = plainToClass(User, fromPlainUser, { version: 1.5 }); + expect(transformedUser5).toBeInstanceOf(User); + expect(transformedUser5.photo).toBeInstanceOf(Photo); + expect(transformedUser5).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); - const transformedClass = plainToClass(TestClass, obj as Record); + const plainUser6: any = classToPlain(user, { version: 2 }); + expect(plainUser6).not.toBeInstanceOf(User); + expect(plainUser6).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + status: 1, + }, + }); - expect(transformedClass).toBeInstanceOf(TestClass); + const transformedUser6 = plainToClass(User, fromPlainUser, { version: 2 }); + expect(transformedUser6).toBeInstanceOf(User); + expect(transformedUser6.photo).toBeInstanceOf(Photo); + expect(transformedUser6).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + status: 1, + }, + }); - expect(transformedClass.usersDefined).toBeInstanceOf(Array); - expect(transformedClass.usersDefined.length).toEqual(1); - expect(transformedClass.usersDefined[0]).toBeInstanceOf(User); - expect(transformedClass.usersDefined[0].name).toEqual("a-name"); + const plainUser7: any = classToPlain(user, { version: 3 }); + expect(plainUser7).not.toBeInstanceOf(User); + expect(plainUser7).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + status: 1, + }, + photos: [ + { + id: 1, + status: 1, + }, + ], + }); - expect(transformedClass.usersUndefined).toBeUndefined(); + const transformedUser7 = plainToClass(User, fromPlainUser, { version: 3 }); + expect(transformedUser7).toBeInstanceOf(User); + expect(transformedUser7.photo).toBeInstanceOf(Photo); + expect(transformedUser7.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser7).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + status: 1, + }, + photos: [ + { + id: 1, + status: 1, + }, + ], }); + }); + + it('should expose method and accessors that have @Expose()', () => { + defaultMetadataStorage.clear(); + + class User { + firstName: string; + lastName: string; + + @Exclude() + password: string; + + @Expose() + get name(): string { + return this.firstName + ' ' + this.lastName; + } + + @Expose() + getName(): string { + return this.firstName + ' ' + this.lastName; + } + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + name: 'Umed Khudoiberdiev', + getName: 'Umed Khudoiberdiev', + }); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + const likeUser = new User(); + likeUser.firstName = 'Umed'; + likeUser.lastName = 'Khudoiberdiev'; + expect(transformedUser).toEqual(likeUser); + }); + + it('should expose with alternative name if its given', () => { + defaultMetadataStorage.clear(); + + class User { + @Expose({ name: 'myName' }) + firstName: string; + + @Expose({ name: 'secondName' }) + lastName: string; + + @Exclude() + password: string; + + @Expose() + get name(): string { + return this.firstName + ' ' + this.lastName; + } + + @Expose({ name: 'fullName' }) + getName(): string { + return this.firstName + ' ' + this.lastName; + } + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + myName: 'Umed', + secondName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + myName: 'Umed', + secondName: 'Khudoiberdiev', + name: 'Umed Khudoiberdiev', + fullName: 'Umed Khudoiberdiev', + }); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + const likeUser = new User(); + likeUser.firstName = 'Umed'; + likeUser.lastName = 'Khudoiberdiev'; + expect(transformedUser).toEqual(likeUser); + }); + + it('should exclude all prefixed properties if prefix is given', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + $filename: string; + status: number; + } + + class User { + $system: string; + _firstName: string; + _lastName: string; + + @Exclude() + password: string; + + @Type(() => Photo) + photo: Photo; + + @Expose() + get name(): string { + return this._firstName + ' ' + this._lastName; + } + } + + const user = new User(); + user.$system = '@#$%^&*token(*&^%$#@!'; + user._firstName = 'Umed'; + user._lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.photo = new Photo(); + user.photo.id = 1; + user.photo.$filename = 'myphoto.jpg'; + user.photo.status = 1; + + const fromPlainUser = { + $system: '@#$%^&*token(*&^%$#@!', + _firstName: 'Khudoiberdiev', + _lastName: 'imnosuperman', + password: 'imnosuperman', + photo: { + id: 1, + $filename: 'myphoto.jpg', + status: 1, + }, + }; + + const plainUser: any = classToPlain(user, { excludePrefixes: ['_', '$'] }); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + name: 'Umed Khudoiberdiev', + photo: { + id: 1, + status: 1, + }, + }); + + const transformedUser = plainToClass(User, fromPlainUser, { excludePrefixes: ['_', '$'] }); + expect(transformedUser).toBeInstanceOf(User); + const likeUser = new User(); + likeUser.photo = new Photo(); + likeUser.photo.id = 1; + likeUser.photo.status = 1; + expect(transformedUser).toEqual(likeUser); + }); + + it('should transform array', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + firstName: string; + lastName: string; + + @Exclude() + password: string; + + @Expose() + get name(): string { + return this.firstName + ' ' + this.lastName; + } + } + + const user1 = new User(); + user1.firstName = 'Umed'; + user1.lastName = 'Khudoiberdiev'; + user1.password = 'imnosuperman'; + + const user2 = new User(); + user2.firstName = 'Dima'; + user2.lastName = 'Zotov'; + user2.password = 'imnomesser'; + + const users = [user1, user2]; + + const plainUsers: any = classToPlain(users); + expect(plainUsers).toEqual([ + { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + name: 'Umed Khudoiberdiev', + }, + { + firstName: 'Dima', + lastName: 'Zotov', + name: 'Dima Zotov', + }, + ]); + + const fromPlainUsers = [ + { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + name: 'Umed Khudoiberdiev', + }, + { + firstName: 'Dima', + lastName: 'Zotov', + name: 'Dima Zotov', + }, + ]; + + const existUsers = [ + { id: 1, age: 27 }, + { id: 2, age: 30 }, + ]; + const plainUser2 = classToPlainFromExist(users, existUsers); + expect(plainUser2).toEqual([ + { + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + name: 'Umed Khudoiberdiev', + }, + { + id: 2, + age: 30, + firstName: 'Dima', + lastName: 'Zotov', + name: 'Dima Zotov', + }, + ]); + + const transformedUser = plainToClass(User, fromPlainUsers); + + expect(transformedUser[0]).toBeInstanceOf(User); + expect(transformedUser[1]).toBeInstanceOf(User); + const likeUser1 = new User(); + likeUser1.firstName = 'Umed'; + likeUser1.lastName = 'Khudoiberdiev'; + + const likeUser2 = new User(); + likeUser2.firstName = 'Dima'; + likeUser2.lastName = 'Zotov'; + expect(transformedUser).toEqual([likeUser1, likeUser2]); + + const classToClassUsers = classToClass(users); + expect(classToClassUsers[0]).toBeInstanceOf(User); + expect(classToClassUsers[1]).toBeInstanceOf(User); + expect(classToClassUsers[0]).not.toEqual(user1); + expect(classToClassUsers[1]).not.toEqual(user1); + + const classUserLike1 = new User(); + classUserLike1.firstName = 'Umed'; + classUserLike1.lastName = 'Khudoiberdiev'; + + const classUserLike2 = new User(); + classUserLike2.firstName = 'Dima'; + classUserLike2.lastName = 'Zotov'; + + expect(classToClassUsers).toEqual([classUserLike1, classUserLike2]); + + const fromExistUser1 = new User(); + fromExistUser1.id = 1; + + const fromExistUser2 = new User(); + fromExistUser2.id = 2; + + const fromExistUsers = [fromExistUser1, fromExistUser2]; + + const classToClassFromExistUser = classToClassFromExist(users, fromExistUsers); + expect(classToClassFromExistUser[0]).toBeInstanceOf(User); + expect(classToClassFromExistUser[1]).toBeInstanceOf(User); + expect(classToClassFromExistUser[0]).not.toEqual(user1); + expect(classToClassFromExistUser[1]).not.toEqual(user1); + expect(classToClassFromExistUser).toEqual(fromExistUsers); + + const fromExistUserLike1 = new User(); + fromExistUserLike1.id = 1; + fromExistUserLike1.firstName = 'Umed'; + fromExistUserLike1.lastName = 'Khudoiberdiev'; + + const fromExistUserLike2 = new User(); + fromExistUserLike2.id = 2; + fromExistUserLike2.firstName = 'Dima'; + fromExistUserLike2.lastName = 'Zotov'; + + expect(classToClassFromExistUser).toEqual([fromExistUserLike1, fromExistUserLike2]); + }); + + it('should transform objects with null prototype', () => { + class TestClass { + prop: string; + } + + const obj = Object.create(null); + obj.a = 'JS FTW'; + + const transformedClass = plainToClass(TestClass, obj); + expect(transformedClass).toBeInstanceOf(TestClass); + }); + + it('should not pollute the prototype with a `__proto__` property', () => { + const object = JSON.parse('{"__proto__": { "admin": true }}'); + const plainObject = {}; + classToPlainFromExist(object, plainObject); + expect((plainObject as any).admin).toEqual(undefined); + }); + + it('should not pollute the prototype with a `constructor.prototype` property', () => { + const object = JSON.parse('{"constructor": { "prototype": { "admin": true }}}'); + const plainObject = {}; + classToPlainFromExist(object, plainObject); + expect((plainObject as any).admin).toEqual(undefined); + }); + + it('should default union types where the plain type is an array to an array result', () => { + class User { + name: string; + } + + class TestClass { + @Type(() => User) + usersDefined: User[] | undefined; + + @Type(() => User) + usersUndefined: User[] | undefined; + } + + const obj = Object.create(null); + obj.usersDefined = [{ name: 'a-name' }]; + obj.usersUndefined = undefined; + + const transformedClass = plainToClass(TestClass, obj as Record); + + expect(transformedClass).toBeInstanceOf(TestClass); + + expect(transformedClass.usersDefined).toBeInstanceOf(Array); + expect(transformedClass.usersDefined.length).toEqual(1); + expect(transformedClass.usersDefined[0]).toBeInstanceOf(User); + expect(transformedClass.usersDefined[0].name).toEqual('a-name'); + + expect(transformedClass.usersUndefined).toBeUndefined(); + }); }); diff --git a/test/functional/circular-reference-problem.spec.ts b/test/functional/circular-reference-problem.spec.ts index 8d66e065a..d1045edd0 100644 --- a/test/functional/circular-reference-problem.spec.ts +++ b/test/functional/circular-reference-problem.spec.ts @@ -1,148 +1,151 @@ -import "reflect-metadata"; -import {classToClass, classToPlain, plainToClass} from "../../src/index"; -import {defaultMetadataStorage} from "../../src/storage"; -import {TransformOperationExecutor} from "../../src/TransformOperationExecutor"; - -describe("circular reference problem", () => { - it("should skip circular reference objects in classToPlain operation", () => { - defaultMetadataStorage.clear(); - - class Caption { - text: string; - } - - class Photo { - id: number; - filename: string; - user: User; - users: User[]; - caption: Caption; - } - - class User { - id: number; - firstName: string; - caption: Caption; - photos: Photo[]; - } - - const photo1 = new Photo(); - photo1.id = 1; - photo1.filename = "me.jpg"; - - const photo2 = new Photo(); - photo2.id = 2; - photo2.filename = "she.jpg"; - - const caption = new Caption(); - caption.text = "cool photo"; - - const user = new User(); - user.caption = caption; - user.firstName = "Umed Khudoiberdiev"; - user.photos = [photo1, photo2]; - - photo1.user = user; - photo2.user = user; - photo1.users = [user]; - photo2.users = [user]; - - photo1.caption = caption; - photo2.caption = caption; - - const plainUser = classToPlain(user, { enableCircularCheck: true }); - expect(plainUser).toEqual({ - firstName: "Umed Khudoiberdiev", - caption: { text: "cool photo" }, - photos: [{ - id: 1, - filename: "me.jpg", - users: [], - caption: { text: "cool photo" } - }, { - id: 2, - filename: "she.jpg", - users: [], - caption: { text: "cool photo" } - }] - }); +import 'reflect-metadata'; +import { classToClass, classToPlain, plainToClass } from '../../src/index'; +import { defaultMetadataStorage } from '../../src/storage'; +import { TransformOperationExecutor } from '../../src/TransformOperationExecutor'; + +describe('circular reference problem', () => { + it('should skip circular reference objects in classToPlain operation', () => { + defaultMetadataStorage.clear(); + + class Caption { + text: string; + } + + class Photo { + id: number; + filename: string; + user: User; + users: User[]; + caption: Caption; + } + + class User { + id: number; + firstName: string; + caption: Caption; + photos: Photo[]; + } + + const photo1 = new Photo(); + photo1.id = 1; + photo1.filename = 'me.jpg'; + + const photo2 = new Photo(); + photo2.id = 2; + photo2.filename = 'she.jpg'; + + const caption = new Caption(); + caption.text = 'cool photo'; + + const user = new User(); + user.caption = caption; + user.firstName = 'Umed Khudoiberdiev'; + user.photos = [photo1, photo2]; + + photo1.user = user; + photo2.user = user; + photo1.users = [user]; + photo2.users = [user]; + + photo1.caption = caption; + photo2.caption = caption; + + const plainUser = classToPlain(user, { enableCircularCheck: true }); + expect(plainUser).toEqual({ + firstName: 'Umed Khudoiberdiev', + caption: { text: 'cool photo' }, + photos: [ + { + id: 1, + filename: 'me.jpg', + users: [], + caption: { text: 'cool photo' }, + }, + { + id: 2, + filename: 'she.jpg', + users: [], + caption: { text: 'cool photo' }, + }, + ], + }); + }); + + it('should not skip circular reference objects, but handle it correctly in classToClass operation', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + filename: string; + user: User; + users: User[]; + } + + class User { + id: number; + firstName: string; + photos: Photo[]; + } + + const photo1 = new Photo(); + photo1.id = 1; + photo1.filename = 'me.jpg'; + + const photo2 = new Photo(); + photo2.id = 2; + photo2.filename = 'she.jpg'; + + const user = new User(); + user.firstName = 'Umed Khudoiberdiev'; + user.photos = [photo1, photo2]; + + photo1.user = user; + photo2.user = user; + photo1.users = [user]; + photo2.users = [user]; + + const classUser = classToClass(user, { enableCircularCheck: true }); + expect(classUser).not.toBe(user); + expect(classUser).toBeInstanceOf(User); + expect(classUser).toEqual(user); + }); + + describe('enableCircularCheck option', () => { + class Photo { + id: number; + filename: string; + } + + class User { + id: number; + firstName: string; + photos: Photo[]; + } + let isCircularSpy: jest.SpyInstance; + const photo1 = new Photo(); + photo1.id = 1; + photo1.filename = 'me.jpg'; + + const user = new User(); + user.firstName = 'Umed Khudoiberdiev'; + user.photos = [photo1]; + + beforeEach(() => { + isCircularSpy = jest.spyOn(TransformOperationExecutor.prototype, 'isCircular' as any); + }); + + afterEach(() => { + isCircularSpy.mockRestore(); }); - it("should not skip circular reference objects, but handle it correctly in classToClass operation", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - filename: string; - user: User; - users: User[]; - } - - class User { - id: number; - firstName: string; - photos: Photo[]; - } - - const photo1 = new Photo(); - photo1.id = 1; - photo1.filename = "me.jpg"; - - const photo2 = new Photo(); - photo2.id = 2; - photo2.filename = "she.jpg"; - - const user = new User(); - user.firstName = "Umed Khudoiberdiev"; - user.photos = [photo1, photo2]; - - photo1.user = user; - photo2.user = user; - photo1.users = [user]; - photo2.users = [user]; - - const classUser = classToClass(user, { enableCircularCheck: true }); - expect(classUser).not.toBe(user); - expect(classUser).toBeInstanceOf(User); - expect(classUser).toEqual(user); + it('enableCircularCheck option is undefined (default)', () => { + plainToClass>(User, user); + expect(isCircularSpy).not.toHaveBeenCalled(); }); - describe("enableCircularCheck option", () => { - class Photo { - id: number; - filename: string; - } - - class User { - id: number; - firstName: string; - photos: Photo[]; - } - let isCircularSpy: jest.SpyInstance; - const photo1 = new Photo(); - photo1.id = 1; - photo1.filename = "me.jpg"; - - const user = new User(); - user.firstName = "Umed Khudoiberdiev"; - user.photos = [photo1]; - - beforeEach(() => { - isCircularSpy = jest.spyOn(TransformOperationExecutor.prototype, "isCircular" as any); - }); - - afterEach(() => { - isCircularSpy.mockRestore(); - }); - - it("enableCircularCheck option is undefined (default)", () => { - plainToClass>(User, user); - expect(isCircularSpy).not.toHaveBeenCalled(); - }); - - it("enableCircularCheck option is true", () => { - plainToClass>(User, user, { enableCircularCheck: true }); - expect(isCircularSpy).toHaveBeenCalled(); - }); + it('enableCircularCheck option is true', () => { + plainToClass>(User, user, { enableCircularCheck: true }); + expect(isCircularSpy).toHaveBeenCalled(); }); + }); }); diff --git a/test/functional/custom-transform.spec.ts b/test/functional/custom-transform.spec.ts index f20ee6f32..036b0afc6 100644 --- a/test/functional/custom-transform.spec.ts +++ b/test/functional/custom-transform.spec.ts @@ -1,709 +1,717 @@ /* eslint-disable @typescript-eslint/camelcase */ -import "reflect-metadata"; -import {classToClass, classToPlain, plainToClass} from "../../src/index"; -import {defaultMetadataStorage} from "../../src/storage"; -import {Expose, Transform, Type} from "../../src/decorators"; -import {TransformationType} from "../../src/TransformOperationExecutor"; -import dayjs from "dayjs"; - -describe("custom transformation decorator", () => { - it("@Expose decorator with \"name\" option should work with @Transform decorator", () => { - defaultMetadataStorage.clear(); - - class User { - @Expose({ name: "user_name" }) - @Transform(value => value.toUpperCase()) - name: string; - } - - const plainUser = { - user_name: "Johny Cage" - }; - - const classedUser = plainToClass(User, plainUser); - expect(classedUser.name).toEqual("JOHNY CAGE"); - }); - - it("@Transform decorator logic should be executed depend of toPlainOnly and toClassOnly set", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - name: string; - - @Transform(value => value.toString(), { toPlainOnly: true }) - @Transform(value => dayjs(value), { toClassOnly: true }) - date: Date; - } - - const plainUser = { - id: 1, - name: "Johny Cage", - date: new Date().valueOf() - }; - - const user = new User(); - user.id = 1; - user.name = "Johny Cage"; - user.date = new Date(); - - const classedUser = plainToClass(User, plainUser); - expect(classedUser).toBeInstanceOf(User); - expect(classedUser.id).toEqual(1); - expect(classedUser.name).toEqual("Johny Cage"); - expect(dayjs.isDayjs(classedUser.date)).toBeTruthy(); - - const plainedUser = classToPlain(user); - expect(plainedUser).not.toBeInstanceOf(User); - expect(plainedUser).toEqual({ - id: 1, - name: "Johny Cage", - date: user.date.toString() - }); - }); - - it("versions and groups should work with @Transform decorator too", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - name: string; - - @Type(() => Date) - @Transform(value => dayjs(value), { since: 1, until: 2 }) - date: Date; - - @Type(() => Date) - @Transform(value => value.toString(), { groups: ["user"] }) - lastVisitDate: Date; - } - - const plainUser = { - id: 1, - name: "Johny Cage", - date: new Date().valueOf(), - lastVisitDate: new Date().valueOf() - }; - - const classedUser1 = plainToClass(User, plainUser); - expect(classedUser1).toBeInstanceOf(User); - expect(classedUser1.id).toEqual(1); - expect(classedUser1.name).toEqual("Johny Cage"); - expect(dayjs.isDayjs(classedUser1.date)).toBeTruthy(); - - const classedUser2 = plainToClass(User, plainUser, { version: 0.5 }); - expect(classedUser2).toBeInstanceOf(User); - expect(classedUser2.id).toEqual(1); - expect(classedUser2.name).toEqual("Johny Cage"); - expect(classedUser2.date).toBeInstanceOf(Date); - - const classedUser3 = plainToClass(User, plainUser, { version: 1 }); - expect(classedUser3).toBeInstanceOf(User); - expect(classedUser3.id).toEqual(1); - expect(classedUser3.name).toEqual("Johny Cage"); - expect(dayjs.isDayjs(classedUser3.date)).toBeTruthy(); - - const classedUser4 = plainToClass(User, plainUser, { version: 2 }); - expect(classedUser4).toBeInstanceOf(User); - expect(classedUser4.id).toEqual(1); - expect(classedUser4.name).toEqual("Johny Cage"); - expect(classedUser4.date).toBeInstanceOf(Date); - - const classedUser5 = plainToClass(User, plainUser, { groups: ["user"] }); - expect(classedUser5).toBeInstanceOf(User); - expect(classedUser5.id).toEqual(1); - expect(classedUser5.name).toEqual("Johny Cage"); - expect(classedUser5.lastVisitDate).toEqual(new Date(plainUser.lastVisitDate).toString()); - }); - - it("@Transform decorator callback should be given correct arguments", () => { - defaultMetadataStorage.clear(); - - let objArg: any; - let typeArg: TransformationType; - - function transformCallback(value: any, obj: any, type: TransformationType): any { - objArg = obj; - typeArg = type; - return value; - } - - class User { - @Transform(transformCallback, { toPlainOnly: true }) - @Transform(transformCallback, { toClassOnly: true }) - name: string; - } - - const plainUser = { - name: "Johny Cage", - }; - - plainToClass(User, plainUser); - expect(objArg).toEqual(plainUser); - expect(typeArg).toEqual(TransformationType.PLAIN_TO_CLASS); - - const user = new User(); - user.name = "Johny Cage"; - - classToPlain(user); - expect(objArg).toEqual(user); - expect(typeArg).toEqual(TransformationType.CLASS_TO_PLAIN); - }); - - let model: any; - it("should serialize json into model instance of class Person", () => { - defaultMetadataStorage.clear(); - expect(() => { - const json = { - name: "John Doe", - address: { - street: "Main Street 25", - tel: "5454-534-645", - zip: 10353, - country: "West Samoa" - }, - age: 25, - hobbies: [ - { type: "sport", name: "sailing" }, - { type: "relax", name: "reading" }, - { type: "sport", name: "jogging" }, - { type: "relax", name: "movies" } - ] - }; - class Hobby { - public type: string; - public name: string; - } - class Address { - public street: string; - - @Expose({ name: "tel" }) - public telephone: string; - - public zip: number; - - public country: string; - } - class Person { - public name: string; - - @Type(() => Address) - public address: Address; - - @Type(() => Hobby) - @Transform(value => value.filter((hobby: any) => hobby.type === "sport"), { toClassOnly: true }) - public hobbies: Hobby[]; - - public age: number; - } - model = plainToClass(Person, json); - expect(model instanceof Person); - expect(model.address instanceof Address); - model.hobbies.forEach((hobby: Hobby) => expect(hobby instanceof Hobby && hobby.type === "sport")); - }).not.toThrow(); - }); - - it("should serialize json into model instance of class Person with different possibilities for type of one property (polymorphism)", () => { - defaultMetadataStorage.clear(); - expect(() => { - const json = { - name: "John Doe", - hobby: { __type: "program", name: "typescript coding", specialAbility: "testing" } - }; - - abstract class Hobby { - public name: string; - } - - class Sports extends Hobby { - // Empty - } - - class Relaxing extends Hobby { - // Empty - } - - class Programming extends Hobby { - @Transform((value: string) => value.toUpperCase()) - specialAbility: string; - } - - class Person { - public name: string; - - @Type(() => Hobby, { - discriminator: { - property: "__type", - subTypes: [ - { value: Sports, name: "sports" }, { value: Relaxing, name: "relax" }, { value: Programming, name: "program" } - ] - } - }) - public hobby: any; - } - - const expectedHobby = { name: "typescript coding", specialAbility: "TESTING" }; - - const model: Person = plainToClass(Person, json); - expect(model).toBeInstanceOf(Person); - expect(model.hobby).toBeInstanceOf(Programming); - expect(model.hobby).not.toHaveProperty("__type"); - expect(model.hobby).toHaveProperty("specialAbility", "TESTING"); - }).not.toThrow(); - }); - - it("should serialize json into model instance of class Person with different types in array (polymorphism)", () => { - defaultMetadataStorage.clear(); - expect(() => { - const json = { - name: "John Doe", - hobbies: [ - { __type: "program", name: "typescript coding", specialAbility: "testing" }, - { __type: "relax", name: "sun" } - ] - }; - - abstract class Hobby { - public name: string; - } - - class Sports extends Hobby { - // Empty - } - - class Relaxing extends Hobby { - // Empty - } - - class Programming extends Hobby { - @Transform((value: string) => value.toUpperCase()) - specialAbility: string; - } - - class Person { - public name: string; - - @Type(() => Hobby, { - discriminator: { - property: "__type", - subTypes: [ - { value: Sports, name: "sports" }, { value: Relaxing, name: "relax" }, { value: Programming, name: "program" } - ] - } - }) - public hobbies: any[]; - } - - - const model: Person = plainToClass(Person, json); - expect(model).toBeInstanceOf(Person); - expect(model.hobbies[0]).toBeInstanceOf(Programming); - expect(model.hobbies[1]).toBeInstanceOf(Relaxing); - expect(model.hobbies[0]).not.toHaveProperty("__type"); - expect(model.hobbies[1]).not.toHaveProperty("__type"); - expect(model.hobbies[1]).toHaveProperty("name", "sun"); - expect(model.hobbies[0]).toHaveProperty("specialAbility", "TESTING"); - }).not.toThrow(); - }); - - it("should serialize json into model instance of class Person with different possibilities for type of one property AND keeps discriminator property (polymorphism)", () => { - defaultMetadataStorage.clear(); - expect(() => { - const json = { - name: "John Doe", - hobby: { __type: "program", name: "typescript coding", specialAbility: "testing" } - }; - - abstract class Hobby { - public name: string; - } - - class Sports extends Hobby { - // Empty - } - - class Relaxing extends Hobby { - // Empty - } - - class Programming extends Hobby { - @Transform((value: string) => value.toUpperCase()) - specialAbility: string; - } - - class Person { - public name: string; - - @Type(() => Hobby, { - discriminator: { - property: "__type", - subTypes: [ - { value: Sports, name: "sports" }, { value: Relaxing, name: "relax" }, { value: Programming, name: "program" } - ] - }, - keepDiscriminatorProperty: true - }) - public hobby: any; - } - - const model: Person = plainToClass(Person, json); - expect(model).toBeInstanceOf(Person); - expect(model.hobby).toBeInstanceOf(Programming); - expect(model.hobby).toHaveProperty("__type"); - expect(model.hobby).toHaveProperty("specialAbility", "TESTING"); - }).not.toThrow(); - }); - - it("should serialize json into model instance of class Person with different types in array AND keeps discriminator property (polymorphism)", () => { - defaultMetadataStorage.clear(); - expect(() => { - const json = { - name: "John Doe", - hobbies: [ - { __type: "program", name: "typescript coding", specialAbility: "testing" }, - { __type: "relax", name: "sun" } - ] - }; - - abstract class Hobby { - public name: string; - } - - class Sports extends Hobby { - // Empty - } - - class Relaxing extends Hobby { - // Empty - } - - class Programming extends Hobby { - @Transform((value: string) => value.toUpperCase()) - specialAbility: string; - } - - class Person { - public name: string; - - @Type(() => Hobby, { - discriminator: { - property: "__type", - subTypes: [ - { value: Sports, name: "sports" }, { value: Relaxing, name: "relax" }, { value: Programming, name: "program" } - ] - }, - keepDiscriminatorProperty: true - }) - public hobbies: any[]; - } - - const model: Person = plainToClass(Person, json); - expect(model).toBeInstanceOf(Person); - expect(model.hobbies[0]).toBeInstanceOf(Programming); - expect(model.hobbies[1]).toBeInstanceOf(Relaxing); - expect(model.hobbies[0]).toHaveProperty("__type"); - expect(model.hobbies[1]).toHaveProperty("__type"); - expect(model.hobbies[1]).toHaveProperty("name", "sun"); - expect(model.hobbies[0]).toHaveProperty("specialAbility", "TESTING"); - }).not.toThrow(); - }); - - it("should deserialize class Person into json with different possibilities for type of one property (polymorphism)", () => { - defaultMetadataStorage.clear(); - expect(() => { - abstract class Hobby { - public name: string; - } - - class Sports extends Hobby { - // Empty - } - - class Relaxing extends Hobby { - // Empty - } - - class Programming extends Hobby { - @Transform((value: string) => value.toUpperCase()) - specialAbility: string; - } - - class Person { - public name: string; - - @Type(() => Hobby, { - discriminator: { - property: "__type", - subTypes: [ - { value: Sports, name: "sports" }, { value: Relaxing, name: "relax" }, { value: Programming, name: "program" } - ] - } - }) - public hobby: any; - } - - const model: Person = new Person(); - const program = new Programming(); - program.name = "typescript coding"; - program.specialAbility = "testing"; - model.name = "John Doe"; - model.hobby = program; - const json: any = classToPlain(model); - expect(json).not.toBeInstanceOf(Person); - expect(json.hobby).toHaveProperty("__type", "program"); - }).not.toThrow(); - }); - - it("should deserialize class Person into json with different types in array (polymorphism)", () => { - defaultMetadataStorage.clear(); - expect(() => { - abstract class Hobby { - public name: string; - } - - class Sports extends Hobby { - // Empty - } - - class Relaxing extends Hobby { - // Empty - } - - class Programming extends Hobby { - @Transform((value: string) => value.toUpperCase()) - specialAbility: string; - } - - class Person { - public name: string; - - @Type(() => Hobby, { - discriminator: { - property: "__type", - subTypes: [ - { value: Sports, name: "sports" }, { value: Relaxing, name: "relax" }, { value: Programming, name: "program" } - ] - } - }) - public hobbies: any[]; - } - - const model: Person = new Person(); - const sport = new Sports(); - sport.name = "Football"; - const program = new Programming(); - program.name = "typescript coding"; - program.specialAbility = "testing"; - model.name = "John Doe"; - model.hobbies = [ - sport, - program - ]; - const json: any = classToPlain(model); - expect(json).not.toBeInstanceOf(Person); - expect(json.hobbies[0]).toHaveProperty("__type", "sports"); - expect(json.hobbies[1]).toHaveProperty("__type", "program"); - }).not.toThrow(); - }); - - it("should transform class Person into class OtherPerson with different possibilities for type of one property (polymorphism)", () => { - defaultMetadataStorage.clear(); - expect(() => { - abstract class Hobby { - public name: string; - } - - class Sports extends Hobby { - // Empty - } - - class Relaxing extends Hobby { - // Empty - } - - class Programming extends Hobby { - @Transform((value: string) => value.toUpperCase()) - specialAbility: string; - } - - class Person { - public name: string; - - @Type(() => Hobby, { - discriminator: { - property: "__type", - subTypes: [ - { value: Sports, name: "sports" }, { value: Relaxing, name: "relax" }, { value: Programming, name: "program" } - ] - } - }) - public hobby: any; - } - - const model: Person = new Person(); - const program = new Programming(); - program.name = "typescript coding"; - program.specialAbility = "testing"; - model.name = "John Doe"; - model.hobby = program; - const person: Person = classToClass(model); - expect(person).toBeInstanceOf(Person); - expect(person.hobby).not.toHaveProperty("__type"); - }).not.toThrow(); - }); - - it("should transform class Person into class OtherPerson with different types in array (polymorphism)", () => { - defaultMetadataStorage.clear(); - expect(() => { - abstract class Hobby { - public name: string; - } - - class Sports extends Hobby { - // Empty - } - - class Relaxing extends Hobby { - // Empty - } - - class Programming extends Hobby { - @Transform((value: string) => value.toUpperCase()) - specialAbility: string; - } - - class Person { - public name: string; - - @Type(() => Hobby, { - discriminator: { - property: "__type", - subTypes: [ - { value: Sports, name: "sports" }, { value: Relaxing, name: "relax" }, { value: Programming, name: "program" } - ] - } - }) - public hobbies: any[]; - } - - const model: Person = new Person(); - const sport = new Sports(); - sport.name = "Football"; - const program = new Programming(); - program.name = "typescript coding"; - program.specialAbility = "testing"; - model.name = "John Doe"; - model.hobbies = [ - sport, - program - ]; - const person: Person = classToClass(model); - expect(person).toBeInstanceOf(Person); - expect(person.hobbies[0]).not.toHaveProperty("__type"); - expect(person.hobbies[1]).not.toHaveProperty("__type"); - }).not.toThrow(); - }); - - it("should serialize json into model instance of class Person with different possibilities for type of one property AND uses default as fallback (polymorphism)", () => { - defaultMetadataStorage.clear(); - expect(() => { - const json = { - name: "John Doe", - hobby: { __type: "program", name: "typescript coding", specialAbility: "testing" } - }; - - abstract class Hobby { - public name: string; - } - - class Sports extends Hobby { - // Empty - } - - class Relaxing extends Hobby { - // Empty - } - - class Programming extends Hobby { - @Transform((value: string) => value.toUpperCase()) - specialAbility: string; - } - - class Person { - public name: string; - - @Type(() => Hobby, { - discriminator: { - property: "__type", - subTypes: [] - }, - }) - public hobby: any; - } - - const model: Person = plainToClass(Person, json); - expect(model).toBeInstanceOf(Person); - expect(model.hobby).toBeInstanceOf(Hobby); - expect(model.hobby).not.toHaveProperty("__type"); - expect(model.hobby).toHaveProperty("specialAbility", "testing"); - }).not.toThrow(); - }); - - it("should serialize json into model instance of class Person with different types in array AND uses default as fallback (polymorphism)", () => { - defaultMetadataStorage.clear(); - expect(() => { - const json = { - name: "John Doe", - hobbies: [ - { __type: "program", name: "typescript coding", specialAbility: "testing" }, - { __type: "relax", name: "sun" } - ] - }; - - abstract class Hobby { - public name: string; - } - - class Sports extends Hobby { - // Empty - } - - class Relaxing extends Hobby { - // Empty - } - - class Programming extends Hobby { - @Transform((value: string) => value.toUpperCase()) - specialAbility: string; - } - - class Person { - public name: string; - - @Type(() => Hobby, { - discriminator: { - property: "__type", - subTypes: [] - }, - }) - public hobbies: any[]; - } - - - const model: Person = plainToClass(Person, json); - expect(model).toBeInstanceOf(Person); - expect(model.hobbies[0]).toBeInstanceOf(Hobby); - expect(model.hobbies[1]).toBeInstanceOf(Hobby); - expect(model.hobbies[0]).not.toHaveProperty("__type"); - expect(model.hobbies[1]).not.toHaveProperty("__type"); - expect(model.hobbies[1]).toHaveProperty("name", "sun"); - expect(model.hobbies[0]).toHaveProperty("specialAbility", "testing"); - }).not.toThrow(); - }); - - it("should serialize a model into json", () => { - expect(() => { - classToPlain(model); - }).not.toThrow(); +import 'reflect-metadata'; +import { classToClass, classToPlain, plainToClass } from '../../src/index'; +import { defaultMetadataStorage } from '../../src/storage'; +import { Expose, Transform, Type } from '../../src/decorators'; +import { TransformationType } from '../../src/TransformOperationExecutor'; +import dayjs from 'dayjs'; + +describe('custom transformation decorator', () => { + it('@Expose decorator with "name" option should work with @Transform decorator', () => { + defaultMetadataStorage.clear(); + + class User { + @Expose({ name: 'user_name' }) + @Transform(value => value.toUpperCase()) + name: string; + } + + const plainUser = { + user_name: 'Johny Cage', + }; + + const classedUser = plainToClass(User, plainUser); + expect(classedUser.name).toEqual('JOHNY CAGE'); + }); + + it('@Transform decorator logic should be executed depend of toPlainOnly and toClassOnly set', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + name: string; + + @Transform(value => value.toString(), { toPlainOnly: true }) + @Transform(value => dayjs(value), { toClassOnly: true }) + date: Date; + } + + const plainUser = { + id: 1, + name: 'Johny Cage', + date: new Date().valueOf(), + }; + + const user = new User(); + user.id = 1; + user.name = 'Johny Cage'; + user.date = new Date(); + + const classedUser = plainToClass(User, plainUser); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser.id).toEqual(1); + expect(classedUser.name).toEqual('Johny Cage'); + expect(dayjs.isDayjs(classedUser.date)).toBeTruthy(); + + const plainedUser = classToPlain(user); + expect(plainedUser).not.toBeInstanceOf(User); + expect(plainedUser).toEqual({ + id: 1, + name: 'Johny Cage', + date: user.date.toString(), }); + }); + + it('versions and groups should work with @Transform decorator too', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + name: string; + + @Type(() => Date) + @Transform(value => dayjs(value), { since: 1, until: 2 }) + date: Date; + + @Type(() => Date) + @Transform(value => value.toString(), { groups: ['user'] }) + lastVisitDate: Date; + } + + const plainUser = { + id: 1, + name: 'Johny Cage', + date: new Date().valueOf(), + lastVisitDate: new Date().valueOf(), + }; + + const classedUser1 = plainToClass(User, plainUser); + expect(classedUser1).toBeInstanceOf(User); + expect(classedUser1.id).toEqual(1); + expect(classedUser1.name).toEqual('Johny Cage'); + expect(dayjs.isDayjs(classedUser1.date)).toBeTruthy(); + + const classedUser2 = plainToClass(User, plainUser, { version: 0.5 }); + expect(classedUser2).toBeInstanceOf(User); + expect(classedUser2.id).toEqual(1); + expect(classedUser2.name).toEqual('Johny Cage'); + expect(classedUser2.date).toBeInstanceOf(Date); + + const classedUser3 = plainToClass(User, plainUser, { version: 1 }); + expect(classedUser3).toBeInstanceOf(User); + expect(classedUser3.id).toEqual(1); + expect(classedUser3.name).toEqual('Johny Cage'); + expect(dayjs.isDayjs(classedUser3.date)).toBeTruthy(); + + const classedUser4 = plainToClass(User, plainUser, { version: 2 }); + expect(classedUser4).toBeInstanceOf(User); + expect(classedUser4.id).toEqual(1); + expect(classedUser4.name).toEqual('Johny Cage'); + expect(classedUser4.date).toBeInstanceOf(Date); + + const classedUser5 = plainToClass(User, plainUser, { groups: ['user'] }); + expect(classedUser5).toBeInstanceOf(User); + expect(classedUser5.id).toEqual(1); + expect(classedUser5.name).toEqual('Johny Cage'); + expect(classedUser5.lastVisitDate).toEqual(new Date(plainUser.lastVisitDate).toString()); + }); + + it('@Transform decorator callback should be given correct arguments', () => { + defaultMetadataStorage.clear(); + + let objArg: any; + let typeArg: TransformationType; + + function transformCallback(value: any, obj: any, type: TransformationType): any { + objArg = obj; + typeArg = type; + return value; + } + + class User { + @Transform(transformCallback, { toPlainOnly: true }) + @Transform(transformCallback, { toClassOnly: true }) + name: string; + } + + const plainUser = { + name: 'Johny Cage', + }; + + plainToClass(User, plainUser); + expect(objArg).toEqual(plainUser); + expect(typeArg).toEqual(TransformationType.PLAIN_TO_CLASS); + + const user = new User(); + user.name = 'Johny Cage'; + + classToPlain(user); + expect(objArg).toEqual(user); + expect(typeArg).toEqual(TransformationType.CLASS_TO_PLAIN); + }); + + let model: any; + it('should serialize json into model instance of class Person', () => { + defaultMetadataStorage.clear(); + expect(() => { + const json = { + name: 'John Doe', + address: { + street: 'Main Street 25', + tel: '5454-534-645', + zip: 10353, + country: 'West Samoa', + }, + age: 25, + hobbies: [ + { type: 'sport', name: 'sailing' }, + { type: 'relax', name: 'reading' }, + { type: 'sport', name: 'jogging' }, + { type: 'relax', name: 'movies' }, + ], + }; + class Hobby { + public type: string; + public name: string; + } + class Address { + public street: string; + + @Expose({ name: 'tel' }) + public telephone: string; + + public zip: number; + + public country: string; + } + class Person { + public name: string; + + @Type(() => Address) + public address: Address; + + @Type(() => Hobby) + @Transform(value => value.filter((hobby: any) => hobby.type === 'sport'), { toClassOnly: true }) + public hobbies: Hobby[]; + + public age: number; + } + model = plainToClass(Person, json); + expect(model instanceof Person); + expect(model.address instanceof Address); + model.hobbies.forEach((hobby: Hobby) => expect(hobby instanceof Hobby && hobby.type === 'sport')); + }).not.toThrow(); + }); + + it('should serialize json into model instance of class Person with different possibilities for type of one property (polymorphism)', () => { + defaultMetadataStorage.clear(); + expect(() => { + const json = { + name: 'John Doe', + hobby: { __type: 'program', name: 'typescript coding', specialAbility: 'testing' }, + }; + + abstract class Hobby { + public name: string; + } + + class Sports extends Hobby { + // Empty + } + + class Relaxing extends Hobby { + // Empty + } + + class Programming extends Hobby { + @Transform((value: string) => value.toUpperCase()) + specialAbility: string; + } + + class Person { + public name: string; + + @Type(() => Hobby, { + discriminator: { + property: '__type', + subTypes: [ + { value: Sports, name: 'sports' }, + { value: Relaxing, name: 'relax' }, + { value: Programming, name: 'program' }, + ], + }, + }) + public hobby: any; + } + + const expectedHobby = { name: 'typescript coding', specialAbility: 'TESTING' }; + + const model: Person = plainToClass(Person, json); + expect(model).toBeInstanceOf(Person); + expect(model.hobby).toBeInstanceOf(Programming); + expect(model.hobby).not.toHaveProperty('__type'); + expect(model.hobby).toHaveProperty('specialAbility', 'TESTING'); + }).not.toThrow(); + }); + + it('should serialize json into model instance of class Person with different types in array (polymorphism)', () => { + defaultMetadataStorage.clear(); + expect(() => { + const json = { + name: 'John Doe', + hobbies: [ + { __type: 'program', name: 'typescript coding', specialAbility: 'testing' }, + { __type: 'relax', name: 'sun' }, + ], + }; + + abstract class Hobby { + public name: string; + } + + class Sports extends Hobby { + // Empty + } + + class Relaxing extends Hobby { + // Empty + } + + class Programming extends Hobby { + @Transform((value: string) => value.toUpperCase()) + specialAbility: string; + } + + class Person { + public name: string; + + @Type(() => Hobby, { + discriminator: { + property: '__type', + subTypes: [ + { value: Sports, name: 'sports' }, + { value: Relaxing, name: 'relax' }, + { value: Programming, name: 'program' }, + ], + }, + }) + public hobbies: any[]; + } + + const model: Person = plainToClass(Person, json); + expect(model).toBeInstanceOf(Person); + expect(model.hobbies[0]).toBeInstanceOf(Programming); + expect(model.hobbies[1]).toBeInstanceOf(Relaxing); + expect(model.hobbies[0]).not.toHaveProperty('__type'); + expect(model.hobbies[1]).not.toHaveProperty('__type'); + expect(model.hobbies[1]).toHaveProperty('name', 'sun'); + expect(model.hobbies[0]).toHaveProperty('specialAbility', 'TESTING'); + }).not.toThrow(); + }); + + it('should serialize json into model instance of class Person with different possibilities for type of one property AND keeps discriminator property (polymorphism)', () => { + defaultMetadataStorage.clear(); + expect(() => { + const json = { + name: 'John Doe', + hobby: { __type: 'program', name: 'typescript coding', specialAbility: 'testing' }, + }; + + abstract class Hobby { + public name: string; + } + + class Sports extends Hobby { + // Empty + } + + class Relaxing extends Hobby { + // Empty + } + + class Programming extends Hobby { + @Transform((value: string) => value.toUpperCase()) + specialAbility: string; + } + + class Person { + public name: string; + + @Type(() => Hobby, { + discriminator: { + property: '__type', + subTypes: [ + { value: Sports, name: 'sports' }, + { value: Relaxing, name: 'relax' }, + { value: Programming, name: 'program' }, + ], + }, + keepDiscriminatorProperty: true, + }) + public hobby: any; + } + + const model: Person = plainToClass(Person, json); + expect(model).toBeInstanceOf(Person); + expect(model.hobby).toBeInstanceOf(Programming); + expect(model.hobby).toHaveProperty('__type'); + expect(model.hobby).toHaveProperty('specialAbility', 'TESTING'); + }).not.toThrow(); + }); + + it('should serialize json into model instance of class Person with different types in array AND keeps discriminator property (polymorphism)', () => { + defaultMetadataStorage.clear(); + expect(() => { + const json = { + name: 'John Doe', + hobbies: [ + { __type: 'program', name: 'typescript coding', specialAbility: 'testing' }, + { __type: 'relax', name: 'sun' }, + ], + }; + + abstract class Hobby { + public name: string; + } + + class Sports extends Hobby { + // Empty + } + + class Relaxing extends Hobby { + // Empty + } + + class Programming extends Hobby { + @Transform((value: string) => value.toUpperCase()) + specialAbility: string; + } + + class Person { + public name: string; + + @Type(() => Hobby, { + discriminator: { + property: '__type', + subTypes: [ + { value: Sports, name: 'sports' }, + { value: Relaxing, name: 'relax' }, + { value: Programming, name: 'program' }, + ], + }, + keepDiscriminatorProperty: true, + }) + public hobbies: any[]; + } + + const model: Person = plainToClass(Person, json); + expect(model).toBeInstanceOf(Person); + expect(model.hobbies[0]).toBeInstanceOf(Programming); + expect(model.hobbies[1]).toBeInstanceOf(Relaxing); + expect(model.hobbies[0]).toHaveProperty('__type'); + expect(model.hobbies[1]).toHaveProperty('__type'); + expect(model.hobbies[1]).toHaveProperty('name', 'sun'); + expect(model.hobbies[0]).toHaveProperty('specialAbility', 'TESTING'); + }).not.toThrow(); + }); + + it('should deserialize class Person into json with different possibilities for type of one property (polymorphism)', () => { + defaultMetadataStorage.clear(); + expect(() => { + abstract class Hobby { + public name: string; + } + + class Sports extends Hobby { + // Empty + } + + class Relaxing extends Hobby { + // Empty + } + + class Programming extends Hobby { + @Transform((value: string) => value.toUpperCase()) + specialAbility: string; + } + + class Person { + public name: string; + + @Type(() => Hobby, { + discriminator: { + property: '__type', + subTypes: [ + { value: Sports, name: 'sports' }, + { value: Relaxing, name: 'relax' }, + { value: Programming, name: 'program' }, + ], + }, + }) + public hobby: any; + } + + const model: Person = new Person(); + const program = new Programming(); + program.name = 'typescript coding'; + program.specialAbility = 'testing'; + model.name = 'John Doe'; + model.hobby = program; + const json: any = classToPlain(model); + expect(json).not.toBeInstanceOf(Person); + expect(json.hobby).toHaveProperty('__type', 'program'); + }).not.toThrow(); + }); + + it('should deserialize class Person into json with different types in array (polymorphism)', () => { + defaultMetadataStorage.clear(); + expect(() => { + abstract class Hobby { + public name: string; + } + + class Sports extends Hobby { + // Empty + } + + class Relaxing extends Hobby { + // Empty + } + + class Programming extends Hobby { + @Transform((value: string) => value.toUpperCase()) + specialAbility: string; + } + + class Person { + public name: string; + + @Type(() => Hobby, { + discriminator: { + property: '__type', + subTypes: [ + { value: Sports, name: 'sports' }, + { value: Relaxing, name: 'relax' }, + { value: Programming, name: 'program' }, + ], + }, + }) + public hobbies: any[]; + } + + const model: Person = new Person(); + const sport = new Sports(); + sport.name = 'Football'; + const program = new Programming(); + program.name = 'typescript coding'; + program.specialAbility = 'testing'; + model.name = 'John Doe'; + model.hobbies = [sport, program]; + const json: any = classToPlain(model); + expect(json).not.toBeInstanceOf(Person); + expect(json.hobbies[0]).toHaveProperty('__type', 'sports'); + expect(json.hobbies[1]).toHaveProperty('__type', 'program'); + }).not.toThrow(); + }); + + it('should transform class Person into class OtherPerson with different possibilities for type of one property (polymorphism)', () => { + defaultMetadataStorage.clear(); + expect(() => { + abstract class Hobby { + public name: string; + } + + class Sports extends Hobby { + // Empty + } + + class Relaxing extends Hobby { + // Empty + } + + class Programming extends Hobby { + @Transform((value: string) => value.toUpperCase()) + specialAbility: string; + } + + class Person { + public name: string; + + @Type(() => Hobby, { + discriminator: { + property: '__type', + subTypes: [ + { value: Sports, name: 'sports' }, + { value: Relaxing, name: 'relax' }, + { value: Programming, name: 'program' }, + ], + }, + }) + public hobby: any; + } + + const model: Person = new Person(); + const program = new Programming(); + program.name = 'typescript coding'; + program.specialAbility = 'testing'; + model.name = 'John Doe'; + model.hobby = program; + const person: Person = classToClass(model); + expect(person).toBeInstanceOf(Person); + expect(person.hobby).not.toHaveProperty('__type'); + }).not.toThrow(); + }); + + it('should transform class Person into class OtherPerson with different types in array (polymorphism)', () => { + defaultMetadataStorage.clear(); + expect(() => { + abstract class Hobby { + public name: string; + } + + class Sports extends Hobby { + // Empty + } + + class Relaxing extends Hobby { + // Empty + } + + class Programming extends Hobby { + @Transform((value: string) => value.toUpperCase()) + specialAbility: string; + } + + class Person { + public name: string; + + @Type(() => Hobby, { + discriminator: { + property: '__type', + subTypes: [ + { value: Sports, name: 'sports' }, + { value: Relaxing, name: 'relax' }, + { value: Programming, name: 'program' }, + ], + }, + }) + public hobbies: any[]; + } + + const model: Person = new Person(); + const sport = new Sports(); + sport.name = 'Football'; + const program = new Programming(); + program.name = 'typescript coding'; + program.specialAbility = 'testing'; + model.name = 'John Doe'; + model.hobbies = [sport, program]; + const person: Person = classToClass(model); + expect(person).toBeInstanceOf(Person); + expect(person.hobbies[0]).not.toHaveProperty('__type'); + expect(person.hobbies[1]).not.toHaveProperty('__type'); + }).not.toThrow(); + }); + + it('should serialize json into model instance of class Person with different possibilities for type of one property AND uses default as fallback (polymorphism)', () => { + defaultMetadataStorage.clear(); + expect(() => { + const json = { + name: 'John Doe', + hobby: { __type: 'program', name: 'typescript coding', specialAbility: 'testing' }, + }; + + abstract class Hobby { + public name: string; + } + + class Sports extends Hobby { + // Empty + } + + class Relaxing extends Hobby { + // Empty + } + + class Programming extends Hobby { + @Transform((value: string) => value.toUpperCase()) + specialAbility: string; + } + + class Person { + public name: string; + + @Type(() => Hobby, { + discriminator: { + property: '__type', + subTypes: [], + }, + }) + public hobby: any; + } + + const model: Person = plainToClass(Person, json); + expect(model).toBeInstanceOf(Person); + expect(model.hobby).toBeInstanceOf(Hobby); + expect(model.hobby).not.toHaveProperty('__type'); + expect(model.hobby).toHaveProperty('specialAbility', 'testing'); + }).not.toThrow(); + }); + + it('should serialize json into model instance of class Person with different types in array AND uses default as fallback (polymorphism)', () => { + defaultMetadataStorage.clear(); + expect(() => { + const json = { + name: 'John Doe', + hobbies: [ + { __type: 'program', name: 'typescript coding', specialAbility: 'testing' }, + { __type: 'relax', name: 'sun' }, + ], + }; + + abstract class Hobby { + public name: string; + } + + class Sports extends Hobby { + // Empty + } + + class Relaxing extends Hobby { + // Empty + } + + class Programming extends Hobby { + @Transform((value: string) => value.toUpperCase()) + specialAbility: string; + } + + class Person { + public name: string; + + @Type(() => Hobby, { + discriminator: { + property: '__type', + subTypes: [], + }, + }) + public hobbies: any[]; + } + + const model: Person = plainToClass(Person, json); + expect(model).toBeInstanceOf(Person); + expect(model.hobbies[0]).toBeInstanceOf(Hobby); + expect(model.hobbies[1]).toBeInstanceOf(Hobby); + expect(model.hobbies[0]).not.toHaveProperty('__type'); + expect(model.hobbies[1]).not.toHaveProperty('__type'); + expect(model.hobbies[1]).toHaveProperty('name', 'sun'); + expect(model.hobbies[0]).toHaveProperty('specialAbility', 'testing'); + }).not.toThrow(); + }); + + it('should serialize a model into json', () => { + expect(() => { + classToPlain(model); + }).not.toThrow(); + }); }); diff --git a/test/functional/es6-data-types.spec.ts b/test/functional/es6-data-types.spec.ts index 96c867a7b..b8ef4507d 100644 --- a/test/functional/es6-data-types.spec.ts +++ b/test/functional/es6-data-types.spec.ts @@ -1,270 +1,255 @@ -import "reflect-metadata"; -import {classToPlain, plainToClass} from "../../src/index"; -import {defaultMetadataStorage} from "../../src/storage"; -import {Type} from "../../src/decorators"; - -describe("es6 data types", () => { - it("using Map", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - name: string; - @Type(() => String) - weapons: Map; - } - - const plainUser = { - id: 1, - name: "Max Pain", - weapons: { - firstWeapon: "knife", - secondWeapon: "eagle", - thirdWeapon: "ak-47", - } - }; - - const weapons = new Map(); - weapons.set("firstWeapon", "knife"); - weapons.set("secondWeapon", "eagle"); - weapons.set("thirdWeapon", "ak-47"); - - const user = new User(); - user.id = 1; - user.name = "Max Pain"; - user.weapons = weapons; - - const classedUser = plainToClass(User, plainUser); - expect(classedUser).toBeInstanceOf(User); - expect(classedUser.id).toEqual(1); - expect(classedUser.name).toEqual("Max Pain"); - expect(classedUser.weapons).toBeInstanceOf(Map); - expect(classedUser.weapons.size).toEqual(3); - expect(classedUser.weapons.get("firstWeapon")).toEqual("knife"); - expect(classedUser.weapons.get("secondWeapon")).toEqual("eagle"); - expect(classedUser.weapons.get("thirdWeapon")).toEqual("ak-47"); - - const plainedUser = classToPlain(user); - expect(plainedUser).not.toBeInstanceOf(User); - expect(plainedUser).toEqual({ - id: 1, - name: "Max Pain", - weapons: { - firstWeapon: "knife", - secondWeapon: "eagle", - thirdWeapon: "ak-47", - } - }); - +import 'reflect-metadata'; +import { classToPlain, plainToClass } from '../../src/index'; +import { defaultMetadataStorage } from '../../src/storage'; +import { Type } from '../../src/decorators'; + +describe('es6 data types', () => { + it('using Map', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + name: string; + @Type(() => String) + weapons: Map; + } + + const plainUser = { + id: 1, + name: 'Max Pain', + weapons: { + firstWeapon: 'knife', + secondWeapon: 'eagle', + thirdWeapon: 'ak-47', + }, + }; + + const weapons = new Map(); + weapons.set('firstWeapon', 'knife'); + weapons.set('secondWeapon', 'eagle'); + weapons.set('thirdWeapon', 'ak-47'); + + const user = new User(); + user.id = 1; + user.name = 'Max Pain'; + user.weapons = weapons; + + const classedUser = plainToClass(User, plainUser); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser.id).toEqual(1); + expect(classedUser.name).toEqual('Max Pain'); + expect(classedUser.weapons).toBeInstanceOf(Map); + expect(classedUser.weapons.size).toEqual(3); + expect(classedUser.weapons.get('firstWeapon')).toEqual('knife'); + expect(classedUser.weapons.get('secondWeapon')).toEqual('eagle'); + expect(classedUser.weapons.get('thirdWeapon')).toEqual('ak-47'); + + const plainedUser = classToPlain(user); + expect(plainedUser).not.toBeInstanceOf(User); + expect(plainedUser).toEqual({ + id: 1, + name: 'Max Pain', + weapons: { + firstWeapon: 'knife', + secondWeapon: 'eagle', + thirdWeapon: 'ak-47', + }, }); - - it("using Set", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - name: string; - @Type(() => Set) - weapons: Set; - } - - const plainUser = { - id: 1, - name: "Max Pain", - weapons: [ - "knife", - "eagle", - "ak-47" - ] - }; - - const weapons = new Set(); - weapons.add("knife"); - weapons.add("eagle"); - weapons.add("ak-47"); - - const user = new User(); - user.id = 1; - user.name = "Max Pain"; - user.weapons = weapons; - - const classedUser = plainToClass(User, plainUser); - expect(classedUser).toBeInstanceOf(User); - expect(classedUser.id).toEqual(1); - expect(classedUser.name).toEqual("Max Pain"); - expect(classedUser.weapons).toBeInstanceOf(Set); - expect(classedUser.weapons.size).toEqual(3); - expect(classedUser.weapons.has("knife")).toBeTruthy(); - expect(classedUser.weapons.has("eagle")).toBeTruthy(); - expect(classedUser.weapons.has("ak-47")).toBeTruthy(); - - const plainedUser = classToPlain(user); - expect(plainedUser).not.toBeInstanceOf(User); - expect(plainedUser).toEqual({ - id: 1, - name: "Max Pain", - weapons: [ - "knife", - "eagle", - "ak-47" - ] - }); - + }); + + it('using Set', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + name: string; + @Type(() => Set) + weapons: Set; + } + + const plainUser = { + id: 1, + name: 'Max Pain', + weapons: ['knife', 'eagle', 'ak-47'], + }; + + const weapons = new Set(); + weapons.add('knife'); + weapons.add('eagle'); + weapons.add('ak-47'); + + const user = new User(); + user.id = 1; + user.name = 'Max Pain'; + user.weapons = weapons; + + const classedUser = plainToClass(User, plainUser); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser.id).toEqual(1); + expect(classedUser.name).toEqual('Max Pain'); + expect(classedUser.weapons).toBeInstanceOf(Set); + expect(classedUser.weapons.size).toEqual(3); + expect(classedUser.weapons.has('knife')).toBeTruthy(); + expect(classedUser.weapons.has('eagle')).toBeTruthy(); + expect(classedUser.weapons.has('ak-47')).toBeTruthy(); + + const plainedUser = classToPlain(user); + expect(plainedUser).not.toBeInstanceOf(User); + expect(plainedUser).toEqual({ + id: 1, + name: 'Max Pain', + weapons: ['knife', 'eagle', 'ak-47'], }); - - it("using Map with objects", () => { - defaultMetadataStorage.clear(); - - class Weapon { - constructor(public model: string, - public range: number) { - } - } - - class User { - id: number; - name: string; - @Type(() => Weapon) - weapons: Map; - } - - const plainUser = { - id: 1, - name: "Max Pain", - weapons: { - firstWeapon: { - model: "knife", - range: 1 - }, - secondWeapon: { - model: "eagle", - range: 200 - }, - thirdWeapon: { - model: "ak-47", - range: 800 - } - } - }; - - const weapons = new Map(); - weapons.set("firstWeapon", new Weapon("knife", 1)); - weapons.set("secondWeapon", new Weapon("eagle", 200)); - weapons.set("thirdWeapon", new Weapon("ak-47", 800)); - - const user = new User(); - user.id = 1; - user.name = "Max Pain"; - user.weapons = weapons; - - const classedUser = plainToClass(User, plainUser); - expect(classedUser).toBeInstanceOf(User); - expect(classedUser.id).toEqual(1); - expect(classedUser.name).toEqual("Max Pain"); - expect(classedUser.weapons).toBeInstanceOf(Map); - expect(classedUser.weapons.size).toEqual(3); - expect(classedUser.weapons.get("firstWeapon")).toBeInstanceOf(Weapon); - expect(classedUser.weapons.get("firstWeapon")).toEqual({ - model: "knife", - range: 1 - }); - expect(classedUser.weapons.get("secondWeapon")).toBeInstanceOf(Weapon); - expect(classedUser.weapons.get("secondWeapon")).toEqual({ - model: "eagle", - range: 200 - }); - expect(classedUser.weapons.get("thirdWeapon")).toBeInstanceOf(Weapon); - expect(classedUser.weapons.get("thirdWeapon")).toEqual({ - model: "ak-47", - range: 800 - }); - - const plainedUser = classToPlain(user); - expect(plainedUser).not.toBeInstanceOf(User); - expect(plainedUser).toEqual({ - id: 1, - name: "Max Pain", - weapons: { - firstWeapon: { - model: "knife", - range: 1 - }, - secondWeapon: { - model: "eagle", - range: 200 - }, - thirdWeapon: { - model: "ak-47", - range: 800 - } - } - }); - + }); + + it('using Map with objects', () => { + defaultMetadataStorage.clear(); + + class Weapon { + constructor(public model: string, public range: number) {} + } + + class User { + id: number; + name: string; + @Type(() => Weapon) + weapons: Map; + } + + const plainUser = { + id: 1, + name: 'Max Pain', + weapons: { + firstWeapon: { + model: 'knife', + range: 1, + }, + secondWeapon: { + model: 'eagle', + range: 200, + }, + thirdWeapon: { + model: 'ak-47', + range: 800, + }, + }, + }; + + const weapons = new Map(); + weapons.set('firstWeapon', new Weapon('knife', 1)); + weapons.set('secondWeapon', new Weapon('eagle', 200)); + weapons.set('thirdWeapon', new Weapon('ak-47', 800)); + + const user = new User(); + user.id = 1; + user.name = 'Max Pain'; + user.weapons = weapons; + + const classedUser = plainToClass(User, plainUser); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser.id).toEqual(1); + expect(classedUser.name).toEqual('Max Pain'); + expect(classedUser.weapons).toBeInstanceOf(Map); + expect(classedUser.weapons.size).toEqual(3); + expect(classedUser.weapons.get('firstWeapon')).toBeInstanceOf(Weapon); + expect(classedUser.weapons.get('firstWeapon')).toEqual({ + model: 'knife', + range: 1, + }); + expect(classedUser.weapons.get('secondWeapon')).toBeInstanceOf(Weapon); + expect(classedUser.weapons.get('secondWeapon')).toEqual({ + model: 'eagle', + range: 200, + }); + expect(classedUser.weapons.get('thirdWeapon')).toBeInstanceOf(Weapon); + expect(classedUser.weapons.get('thirdWeapon')).toEqual({ + model: 'ak-47', + range: 800, }); - it("using Set with objects", () => { - defaultMetadataStorage.clear(); - - class Weapon { - constructor(public model: string, - public range: number) { - } - } - - class User { - id: number; - name: string; - @Type(() => Weapon) - weapons: Set; - } - - const plainUser = { - id: 1, - name: "Max Pain", - weapons: [ - { model: "knife", range: 1 }, - { model: "eagle", range: 200 }, - { model: "ak-47", range: 800 }, - ] - }; - - const weapons = new Set(); - weapons.add(new Weapon("knife", 1)); - weapons.add(new Weapon("eagle", 200)); - weapons.add(new Weapon("ak-47", 800)); - - const user = new User(); - user.id = 1; - user.name = "Max Pain"; - user.weapons = weapons; - - const classedUser = plainToClass(User, plainUser); - expect(classedUser).toBeInstanceOf(User); - expect(classedUser.id).toEqual(1); - expect(classedUser.name).toEqual("Max Pain"); - expect(classedUser.weapons).toBeInstanceOf(Set); - expect(classedUser.weapons.size).toEqual(3); - const it = classedUser.weapons.values(); - const first = it.next().value; - const second = it.next().value; - const third = it.next().value; - expect(first).toBeInstanceOf(Weapon); - expect(first).toEqual({ model: "knife", range: 1 }); - expect(second).toBeInstanceOf(Weapon); - expect(second).toEqual({ model: "eagle", range: 200 }); - expect(third).toBeInstanceOf(Weapon); - expect(third).toEqual({ model: "ak-47", range: 800 }); - - const plainedUser = classToPlain(user); - expect(plainedUser).not.toBeInstanceOf(User); - expect(plainedUser).toEqual({ - id: 1, - name: "Max Pain", - weapons: [ - { model: "knife", range: 1 }, - { model: "eagle", range: 200 }, - { model: "ak-47", range: 800 }, - ] - }); + const plainedUser = classToPlain(user); + expect(plainedUser).not.toBeInstanceOf(User); + expect(plainedUser).toEqual({ + id: 1, + name: 'Max Pain', + weapons: { + firstWeapon: { + model: 'knife', + range: 1, + }, + secondWeapon: { + model: 'eagle', + range: 200, + }, + thirdWeapon: { + model: 'ak-47', + range: 800, + }, + }, + }); + }); + + it('using Set with objects', () => { + defaultMetadataStorage.clear(); + + class Weapon { + constructor(public model: string, public range: number) {} + } + + class User { + id: number; + name: string; + @Type(() => Weapon) + weapons: Set; + } + + const plainUser = { + id: 1, + name: 'Max Pain', + weapons: [ + { model: 'knife', range: 1 }, + { model: 'eagle', range: 200 }, + { model: 'ak-47', range: 800 }, + ], + }; + + const weapons = new Set(); + weapons.add(new Weapon('knife', 1)); + weapons.add(new Weapon('eagle', 200)); + weapons.add(new Weapon('ak-47', 800)); + + const user = new User(); + user.id = 1; + user.name = 'Max Pain'; + user.weapons = weapons; + + const classedUser = plainToClass(User, plainUser); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser.id).toEqual(1); + expect(classedUser.name).toEqual('Max Pain'); + expect(classedUser.weapons).toBeInstanceOf(Set); + expect(classedUser.weapons.size).toEqual(3); + const it = classedUser.weapons.values(); + const first = it.next().value; + const second = it.next().value; + const third = it.next().value; + expect(first).toBeInstanceOf(Weapon); + expect(first).toEqual({ model: 'knife', range: 1 }); + expect(second).toBeInstanceOf(Weapon); + expect(second).toEqual({ model: 'eagle', range: 200 }); + expect(third).toBeInstanceOf(Weapon); + expect(third).toEqual({ model: 'ak-47', range: 800 }); + + const plainedUser = classToPlain(user); + expect(plainedUser).not.toBeInstanceOf(User); + expect(plainedUser).toEqual({ + id: 1, + name: 'Max Pain', + weapons: [ + { model: 'knife', range: 1 }, + { model: 'eagle', range: 200 }, + { model: 'ak-47', range: 800 }, + ], }); + }); }); diff --git a/test/functional/ignore-decorators.spec.ts b/test/functional/ignore-decorators.spec.ts index ffbcb742c..6ae4a5b04 100644 --- a/test/functional/ignore-decorators.spec.ts +++ b/test/functional/ignore-decorators.spec.ts @@ -1,35 +1,35 @@ -import "reflect-metadata"; -import {classToPlain} from "../../src/index"; -import {defaultMetadataStorage} from "../../src/storage"; -import {Exclude, Expose} from "../../src/decorators"; +import 'reflect-metadata'; +import { classToPlain } from '../../src/index'; +import { defaultMetadataStorage } from '../../src/storage'; +import { Exclude, Expose } from '../../src/decorators'; -describe("ignoring specific decorators", () => { - it("when ignoreDecorators is set to true it should ignore all decorators", () => { - defaultMetadataStorage.clear(); +describe('ignoring specific decorators', () => { + it('when ignoreDecorators is set to true it should ignore all decorators', () => { + defaultMetadataStorage.clear(); - class User { - id: number; + class User { + id: number; - @Expose({ name: "lala" }) - firstName: string; + @Expose({ name: 'lala' }) + firstName: string; - @Expose({ groups: ["user"] }) - lastName: string; + @Expose({ groups: ['user'] }) + lastName: string; - @Exclude() - password: string; - } + @Exclude() + password: string; + } - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; - const plainedUser = classToPlain(user, { ignoreDecorators: true }); - expect(plainedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); + const plainedUser = classToPlain(user, { ignoreDecorators: true }); + expect(plainedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', }); + }); }); diff --git a/test/functional/implicit-type-declarations.spec.ts b/test/functional/implicit-type-declarations.spec.ts index e0ff39bab..a762c2ee1 100644 --- a/test/functional/implicit-type-declarations.spec.ts +++ b/test/functional/implicit-type-declarations.spec.ts @@ -1,128 +1,144 @@ -import "reflect-metadata"; -import {plainToClass,} from "../../src/index"; -import {defaultMetadataStorage} from "../../src/storage"; -import {Expose, Type} from "../../src/decorators"; - -describe("implicit type conversion", () => { - it("should run only when enabled", () => { - defaultMetadataStorage.clear(); - - class SimpleExample { - @Expose() - readonly implicitTypeNumber: number; - - @Expose() - readonly implicitTypeString: string; - } - - const result1: SimpleExample = plainToClass(SimpleExample, { - implicitTypeNumber: "100", - implicitTypeString: 133123, - }, {enableImplicitConversion: true}); - - const result2: SimpleExample = plainToClass(SimpleExample, { - implicitTypeNumber: "100", - implicitTypeString: 133123, - }, {enableImplicitConversion: false}); - - expect(result1).toEqual({implicitTypeNumber: 100, implicitTypeString: "133123"}); - expect(result2).toEqual({implicitTypeNumber: "100", implicitTypeString: 133123}); - }); -}); +import 'reflect-metadata'; +import { plainToClass } from '../../src/index'; +import { defaultMetadataStorage } from '../../src/storage'; +import { Expose, Type } from '../../src/decorators'; -describe("implicit and explicity type declarations", () => { +describe('implicit type conversion', () => { + it('should run only when enabled', () => { defaultMetadataStorage.clear(); - class Example { - @Expose() - readonly implicitTypeViaOtherDecorator: Date; - - @Type() - readonly implicitTypeViaEmptyTypeDecorator: number; + class SimpleExample { + @Expose() + readonly implicitTypeNumber: number; - @Type(() => String) - readonly explicitType: string; + @Expose() + readonly implicitTypeString: string; } - const result: Example = plainToClass(Example, { - implicitTypeViaOtherDecorator: "2018-12-24T12:00:00Z", - implicitTypeViaEmptyTypeDecorator: "100", - explicitType: 100, - }, {enableImplicitConversion: true}); - - it("should use implicitly defined design:type to convert value when no @Type decorator is used", () => { - expect(result.implicitTypeViaOtherDecorator).toBeInstanceOf(Date); - expect(result.implicitTypeViaOtherDecorator.getTime()).toEqual(new Date("2018-12-24T12:00:00Z").getTime()); - }); - - it("should use implicitly defined design:type to convert value when empty @Type() decorator is used", () => { - expect(typeof result.implicitTypeViaEmptyTypeDecorator).toBe("number"); - expect(result.implicitTypeViaEmptyTypeDecorator).toEqual(100); - }); - - it("should use explicitly defined type when @Type(() => Construtable) decorator is used", () => { - expect(typeof result.explicitType).toBe("string"); - expect(result.explicitType).toEqual("100"); - }); + const result1: SimpleExample = plainToClass( + SimpleExample, + { + implicitTypeNumber: '100', + implicitTypeString: 133123, + }, + { enableImplicitConversion: true } + ); + + const result2: SimpleExample = plainToClass( + SimpleExample, + { + implicitTypeNumber: '100', + implicitTypeString: 133123, + }, + { enableImplicitConversion: false } + ); + + expect(result1).toEqual({ implicitTypeNumber: 100, implicitTypeString: '133123' }); + expect(result2).toEqual({ implicitTypeNumber: '100', implicitTypeString: 133123 }); + }); }); -describe("plainToClass transforms built-in primitive types properly", () => { - defaultMetadataStorage.clear(); - - class Example { - @Type() - date: Date; - - @Type() - string: string; - - @Type() - string2: string; - - @Type() - number: number; - - @Type() - number2: number; - - @Type() - boolean: boolean; - - @Type() - boolean2: boolean; - } +describe('implicit and explicity type declarations', () => { + defaultMetadataStorage.clear(); + + class Example { + @Expose() + readonly implicitTypeViaOtherDecorator: Date; + + @Type() + readonly implicitTypeViaEmptyTypeDecorator: number; + + @Type(() => String) + readonly explicitType: string; + } + + const result: Example = plainToClass( + Example, + { + implicitTypeViaOtherDecorator: '2018-12-24T12:00:00Z', + implicitTypeViaEmptyTypeDecorator: '100', + explicitType: 100, + }, + { enableImplicitConversion: true } + ); + + it('should use implicitly defined design:type to convert value when no @Type decorator is used', () => { + expect(result.implicitTypeViaOtherDecorator).toBeInstanceOf(Date); + expect(result.implicitTypeViaOtherDecorator.getTime()).toEqual(new Date('2018-12-24T12:00:00Z').getTime()); + }); + + it('should use implicitly defined design:type to convert value when empty @Type() decorator is used', () => { + expect(typeof result.implicitTypeViaEmptyTypeDecorator).toBe('number'); + expect(result.implicitTypeViaEmptyTypeDecorator).toEqual(100); + }); + + it('should use explicitly defined type when @Type(() => Construtable) decorator is used', () => { + expect(typeof result.explicitType).toBe('string'); + expect(result.explicitType).toEqual('100'); + }); +}); - const result: Example = plainToClass(Example, { - date: "2018-12-24T12:00:00Z", - string: "100", - string2: 100, - number: "100", - number2: 100, - boolean: 1, - boolean2: 0, - }, {enableImplicitConversion: true}); - - it("should recognize and convert to Date", () => { - expect(result.date).toBeInstanceOf(Date); - expect(result.date.getTime()).toEqual(new Date("2018-12-24T12:00:00Z").getTime()); - }); - - it("should recognize and convert to string", () => { - expect(typeof result.string).toBe("string"); - expect(typeof result.string2).toBe("string"); - expect(result.string).toEqual("100"); - expect(result.string2).toEqual("100"); - }); - - it("should recognize and convert to number", () => { - expect(typeof result.number).toBe("number"); - expect(typeof result.number2).toBe("number"); - expect(result.number).toEqual(100); - expect(result.number2).toEqual(100); - }); - - it("should recognize and convert to boolean", () => { - expect(result.boolean).toBeTruthy(); - expect(result.boolean2).toBeFalsy(); - }); +describe('plainToClass transforms built-in primitive types properly', () => { + defaultMetadataStorage.clear(); + + class Example { + @Type() + date: Date; + + @Type() + string: string; + + @Type() + string2: string; + + @Type() + number: number; + + @Type() + number2: number; + + @Type() + boolean: boolean; + + @Type() + boolean2: boolean; + } + + const result: Example = plainToClass( + Example, + { + date: '2018-12-24T12:00:00Z', + string: '100', + string2: 100, + number: '100', + number2: 100, + boolean: 1, + boolean2: 0, + }, + { enableImplicitConversion: true } + ); + + it('should recognize and convert to Date', () => { + expect(result.date).toBeInstanceOf(Date); + expect(result.date.getTime()).toEqual(new Date('2018-12-24T12:00:00Z').getTime()); + }); + + it('should recognize and convert to string', () => { + expect(typeof result.string).toBe('string'); + expect(typeof result.string2).toBe('string'); + expect(result.string).toEqual('100'); + expect(result.string2).toEqual('100'); + }); + + it('should recognize and convert to number', () => { + expect(typeof result.number).toBe('number'); + expect(typeof result.number2).toBe('number'); + expect(result.number).toEqual(100); + expect(result.number2).toEqual(100); + }); + + it('should recognize and convert to boolean', () => { + expect(result.boolean).toBeTruthy(); + expect(result.boolean2).toBeFalsy(); + }); }); diff --git a/test/functional/inheritence.spec.ts b/test/functional/inheritence.spec.ts index df3c4558c..4b17e3db1 100644 --- a/test/functional/inheritence.spec.ts +++ b/test/functional/inheritence.spec.ts @@ -1,42 +1,42 @@ -import "reflect-metadata"; -import {plainToClass, Transform, Type} from "../../src/index"; -import {defaultMetadataStorage} from "../../src/storage"; +import 'reflect-metadata'; +import { plainToClass, Transform, Type } from '../../src/index'; +import { defaultMetadataStorage } from '../../src/storage'; -describe("inheritence", () => { - it("decorators should work inside a base class", () => { - defaultMetadataStorage.clear(); +describe('inheritence', () => { + it('decorators should work inside a base class', () => { + defaultMetadataStorage.clear(); - class Contact { - @Transform(value => value.toUpperCase()) - name: string; - @Type(() => Date) - birthDate: Date; - } + class Contact { + @Transform(value => value.toUpperCase()) + name: string; + @Type(() => Date) + birthDate: Date; + } - class User extends Contact { - @Type(() => Number) - id: number; - email: string; - } + class User extends Contact { + @Type(() => Number) + id: number; + email: string; + } - class Student extends User { - @Transform(value => value.toUpperCase()) - university: string; - } + class Student extends User { + @Transform(value => value.toUpperCase()) + university: string; + } - const plainStudent = { - name: "Johny Cage", - university: "mit", - birthDate: new Date(1967, 2, 1).toDateString(), - id: 100, - email: "johnny.cage@gmail.com" - }; + const plainStudent = { + name: 'Johny Cage', + university: 'mit', + birthDate: new Date(1967, 2, 1).toDateString(), + id: 100, + email: 'johnny.cage@gmail.com', + }; - const classedStudent = plainToClass(Student, plainStudent); - expect(classedStudent.name).toEqual("JOHNY CAGE"); - expect(classedStudent.university).toEqual("MIT"); - expect(classedStudent.birthDate.getTime()).toEqual(new Date(1967, 2, 1).getTime()); - expect(classedStudent.id).toEqual(plainStudent.id); - expect(classedStudent.email).toEqual(plainStudent.email); - }); + const classedStudent = plainToClass(Student, plainStudent); + expect(classedStudent.name).toEqual('JOHNY CAGE'); + expect(classedStudent.university).toEqual('MIT'); + expect(classedStudent.birthDate.getTime()).toEqual(new Date(1967, 2, 1).getTime()); + expect(classedStudent.id).toEqual(plainStudent.id); + expect(classedStudent.email).toEqual(plainStudent.email); + }); }); diff --git a/test/functional/serialization-deserialization.spec.ts b/test/functional/serialization-deserialization.spec.ts index 7b3710100..201f226c9 100644 --- a/test/functional/serialization-deserialization.spec.ts +++ b/test/functional/serialization-deserialization.spec.ts @@ -1,126 +1,135 @@ -import "reflect-metadata"; -import {deserialize, deserializeArray, serialize} from "../../src/index"; -import {defaultMetadataStorage} from "../../src/storage"; -import {Exclude} from "../../src/decorators"; - -describe("serialization and deserialization objects", () => { - it("should perform serialization and deserialization properly", () => { - defaultMetadataStorage.clear(); - - class User { - firstName: string; - lastName: string; - @Exclude() - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const user1 = new User(); - user1.firstName = "Dima"; - user1.lastName = "Zotov"; - user1.password = "imnosuperman"; - - const user2 = new User(); - user2.firstName = "Bakhrom"; - user2.lastName = "Baubekov"; - user2.password = "imnosuperman"; - - const users = [user1, user2]; - const plainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const plainUsers = [{ - firstName: "Dima", - lastName: "Zotov", - password: "imnobatman" - }, { - firstName: "Bakhrom", - lastName: "Baubekov", - password: "imnosuperman" - }]; - - const plainedUser = serialize(user); - expect(plainedUser).toEqual(JSON.stringify({ - firstName: "Umed", - lastName: "Khudoiberdiev" - })); - - const plainedUsers = serialize(users); - expect(plainedUsers).toEqual(JSON.stringify([{ - firstName: "Dima", - lastName: "Zotov", - }, { - firstName: "Bakhrom", - lastName: "Baubekov", - }])); - - const classedUser = deserialize(User, JSON.stringify(plainUser)); - expect(classedUser).toBeInstanceOf(User); - expect(classedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classedUsers = deserializeArray(User, JSON.stringify(plainUsers)); - expect(classedUsers[0]).toBeInstanceOf(User); - expect(classedUsers[1]).toBeInstanceOf(User); - - const userLike1 = new User(); - userLike1.firstName = "Dima"; - userLike1.lastName = "Zotov"; - - const userLike2 = new User(); - userLike2.firstName = "Bakhrom"; - userLike2.lastName = "Baubekov"; - - expect(classedUsers).toEqual([userLike1, userLike2]); +import 'reflect-metadata'; +import { deserialize, deserializeArray, serialize } from '../../src/index'; +import { defaultMetadataStorage } from '../../src/storage'; +import { Exclude } from '../../src/decorators'; + +describe('serialization and deserialization objects', () => { + it('should perform serialization and deserialization properly', () => { + defaultMetadataStorage.clear(); + + class User { + firstName: string; + lastName: string; + @Exclude() + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const user1 = new User(); + user1.firstName = 'Dima'; + user1.lastName = 'Zotov'; + user1.password = 'imnosuperman'; + + const user2 = new User(); + user2.firstName = 'Bakhrom'; + user2.lastName = 'Baubekov'; + user2.password = 'imnosuperman'; + + const users = [user1, user2]; + const plainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const plainUsers = [ + { + firstName: 'Dima', + lastName: 'Zotov', + password: 'imnobatman', + }, + { + firstName: 'Bakhrom', + lastName: 'Baubekov', + password: 'imnosuperman', + }, + ]; + + const plainedUser = serialize(user); + expect(plainedUser).toEqual( + JSON.stringify({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }) + ); + + const plainedUsers = serialize(users); + expect(plainedUsers).toEqual( + JSON.stringify([ + { + firstName: 'Dima', + lastName: 'Zotov', + }, + { + firstName: 'Bakhrom', + lastName: 'Baubekov', + }, + ]) + ); + + const classedUser = deserialize(User, JSON.stringify(plainUser)); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', }); - it("should successfully deserialize object with unknown nested properties ", () => { - defaultMetadataStorage.clear(); - - class TestObject { - prop: string; - } - - const payload = { - prop: "Hi", - extra: { - anotherProp: "let's see how this works out!" - } - }; - - const result = deserialize(TestObject, JSON.stringify(payload)); - expect(result).toBeInstanceOf(TestObject); - expect(result.prop).toEqual("Hi"); - // TODO: We should strip, but it's a breaking change - // (result).extra.should.be.undefined; - }); - - - it("should not overwrite non writable properties on deserialize", () => { - class TestObject { - get getterOnlyProp(): string { - return "I cannot write!"; - } - - normalProp: string = "Hello!"; - } - - const payload = { - getterOnlyProp: "I CAN write!", - normalProp: "Goodbye!" - }; - - const result = deserialize(TestObject, JSON.stringify(payload)); - expect(result.getterOnlyProp).toEqual("I cannot write!"); - expect(result.normalProp).toEqual("Goodbye!"); - }); + const classedUsers = deserializeArray(User, JSON.stringify(plainUsers)); + expect(classedUsers[0]).toBeInstanceOf(User); + expect(classedUsers[1]).toBeInstanceOf(User); + + const userLike1 = new User(); + userLike1.firstName = 'Dima'; + userLike1.lastName = 'Zotov'; + + const userLike2 = new User(); + userLike2.firstName = 'Bakhrom'; + userLike2.lastName = 'Baubekov'; + + expect(classedUsers).toEqual([userLike1, userLike2]); + }); + + it('should successfully deserialize object with unknown nested properties ', () => { + defaultMetadataStorage.clear(); + + class TestObject { + prop: string; + } + + const payload = { + prop: 'Hi', + extra: { + anotherProp: "let's see how this works out!", + }, + }; + + const result = deserialize(TestObject, JSON.stringify(payload)); + expect(result).toBeInstanceOf(TestObject); + expect(result.prop).toEqual('Hi'); + // TODO: We should strip, but it's a breaking change + // (result).extra.should.be.undefined; + }); + + it('should not overwrite non writable properties on deserialize', () => { + class TestObject { + get getterOnlyProp(): string { + return 'I cannot write!'; + } + + normalProp: string = 'Hello!'; + } + + const payload = { + getterOnlyProp: 'I CAN write!', + normalProp: 'Goodbye!', + }; + + const result = deserialize(TestObject, JSON.stringify(payload)); + expect(result.getterOnlyProp).toEqual('I cannot write!'); + expect(result.normalProp).toEqual('Goodbye!'); + }); }); diff --git a/test/functional/specify-maps.spec.ts b/test/functional/specify-maps.spec.ts index 2eaf2dd4b..398d5dca4 100644 --- a/test/functional/specify-maps.spec.ts +++ b/test/functional/specify-maps.spec.ts @@ -1,1636 +1,1675 @@ -import "reflect-metadata"; -import {classToClass, classToClassFromExist, classToPlain, classToPlainFromExist, plainToClass, plainToClassFromExist} from "../../src/index"; -import {defaultMetadataStorage} from "../../src/storage"; -import {Exclude, Expose, Type} from "../../src/decorators"; - -describe("specifying target maps", () => { - it("should convert instance of the given object to plain javascript object and should expose all properties since its a default behaviour", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - firstName: string; - lastName: string; - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - - const existUser = { id: 1, age: 27 }; - const plainUser2 = classToPlainFromExist(user, existUser); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - - const classToClassUser = classToClass(user); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toBe(user); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - }); - - it("should exclude all objects marked with @Exclude() decorator", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - firstName: string; - lastName: string; - @Exclude() - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - expect(plainUser.password).toBeUndefined(); - - const existUser = { id: 1, age: 27, password: "yayayaya" }; - const plainUser2 = classToPlainFromExist(user, existUser); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "yayayaya" - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassUser = classToClass(user); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - }); - - it("should exclude all properties from object if whole class is marked with @Exclude() decorator", () => { - defaultMetadataStorage.clear(); - - @Exclude() - class User { - id: number; - firstName: string; - lastName: string; - password: string; - } - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({}); - expect(plainUser.firstName).toBeUndefined(); - expect(plainUser.lastName).toBeUndefined(); - expect(plainUser.password).toBeUndefined(); - - const existUser = { id: 1, age: 27 }; - const plainUser2 = classToPlainFromExist(user, existUser); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27 - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({}); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1 - }); - - const classToClassUser = classToClass(user); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({}); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1 - }); - }); - - it("should exclude all properties from object if whole class is marked with @Exclude() decorator, but include properties marked with @Expose() decorator", () => { - defaultMetadataStorage.clear(); - - @Exclude() - class User { - id: number; - - @Expose() - firstName: string; - - @Expose() - lastName: string; - - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - expect(plainUser.password).toBeUndefined(); - - const existUser = { id: 1, age: 27 }; - const plainUser2 = classToPlainFromExist(user, existUser); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassUser = classToClass(user); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - }); - - it("should exclude all properties from object if its defined via transformation options, but include properties marked with @Expose() decorator", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - - @Expose() - firstName: string; - - @Expose() - lastName: string; - - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user, { strategy: "excludeAll" }); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - expect(plainUser.password).toBeUndefined(); - - const existUser = { id: 1, age: 27 }; - const plainUser2 = classToPlainFromExist(user, existUser, { strategy: "excludeAll" }); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser, { strategy: "excludeAll" }); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: "excludeAll" }); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassUser = classToClass(user, { strategy: "excludeAll" }); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: "excludeAll" }); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - }); - - it("should expose all properties from object if its defined via transformation options, but exclude properties marked with @Exclude() decorator", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - firstName: string; - - @Exclude() - lastName: string; - - @Exclude() - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user, { strategy: "exposeAll" }); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed" - }); - expect(plainUser.lastName).toBeUndefined(); - expect(plainUser.password).toBeUndefined(); - - const existUser = { id: 1, age: 27 }; - const plainUser2 = classToPlainFromExist(user, existUser, { strategy: "exposeAll" }); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed" - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser, { strategy: "exposeAll" }); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "Umed" - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: "exposeAll" }); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed" - }); - - const classToClassUser = classToClass(user, { strategy: "exposeAll" }); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({ - firstName: "Umed" - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: "exposeAll" }); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed" - }); - }); - - it("should convert values to specific types if they are set via @Type decorator", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - - @Type(type => String) - firstName: string; - - @Type(type => String) - lastName: string; - - @Type(type => Number) - password: number; - - @Type(type => Boolean) - isActive: boolean; - - @Type(type => Date) - registrationDate: Date; - - @Type(type => String) - lastVisitDate: string; - } - - const date = new Date(); - const user = new User(); - user.firstName = 321 as any; - user.lastName = 123 as any; - user.password = "123" as any; - user.isActive = "1" as any; - user.registrationDate = date.toString() as any; - user.lastVisitDate = date as any; - - const fromPlainUser = { - firstName: 321, - lastName: 123, - password: "123", - isActive: "1", - registrationDate: date.toString(), - lastVisitDate: date - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - - const plainUser: any = classToPlain(user, { strategy: "exposeAll" }); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - }); - - const existUser = { id: 1, age: 27 }; - const plainUser2 = classToPlainFromExist(user, existUser, { strategy: "exposeAll" }); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - }); - expect(plainUser2).toEqual(existUser); - - const transformedUser = plainToClass(User, fromPlainUser, { strategy: "exposeAll" }); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser).toEqual({ - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: "exposeAll" }); - expect(fromExistTransformedUser).toBeInstanceOf(User); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - }); - - const classToClassUser = classToClass(user, { strategy: "exposeAll" }); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).toEqual({ - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: "exposeAll" }); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "321", - lastName: "123", - password: 123, - isActive: true, - registrationDate: new Date(date.toString()), - lastVisitDate: date.toString(), - }); - }); - - it("should transform nested objects too and make sure their decorators are used too", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - name: string; - - @Exclude() - filename: string; - - uploadDate: Date; - } - - class User { - firstName: string; - lastName: string; - - @Exclude() - password: string; - - photo: Photo; // type should be automatically guessed - } - - const photo = new Photo(); - photo.id = 1; - photo.name = "Me"; - photo.filename = "iam.jpg"; - photo.uploadDate = new Date(); - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.photo = photo; - - const plainUser: any = classToPlain(user, { strategy: "exposeAll" }); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser.photo).not.toBeInstanceOf(Photo); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - uploadDate: photo.uploadDate - } - }); - expect(plainUser.password).toBeUndefined(); - expect(plainUser.photo.filename).toBeUndefined(); - expect(plainUser.photo.uploadDate).toEqual(photo.uploadDate); - expect(plainUser.photo.uploadDate).not.toBe(photo.uploadDate); - - const existUser = { id: 1, age: 27, photo: { id: 2, description: "photo" } }; - const plainUser2: any = classToPlainFromExist(user, existUser, { strategy: "exposeAll" }); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2.photo).not.toBeInstanceOf(Photo); - expect(plainUser2).toEqual({ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - uploadDate: photo.uploadDate, - description: "photo" - } - }); - expect(plainUser2).toEqual(existUser); - expect(plainUser2.password).toBeUndefined(); - expect(plainUser2.photo.filename).toBeUndefined(); - expect(plainUser2.photo.uploadDate).toEqual(photo.uploadDate); - expect(plainUser2.photo.uploadDate).not.toBe(photo.uploadDate); - }); - - it("should transform nested objects too and make sure given type is used instead of automatically guessed one", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - name: string; - - @Exclude() - filename: string; - } - - class ExtendedPhoto implements Photo { - id: number; - - @Exclude() - name: string; - - filename: string; - } - - class User { - id: number; - firstName: string; - lastName: string; - - @Exclude() - password: string; - - @Type(type => ExtendedPhoto) // force specific type - photo: Photo; - } - - const photo = new Photo(); - photo.id = 1; - photo.name = "Me"; - photo.filename = "iam.jpg"; - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.photo = photo; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "iam.jpg" - } - }); - expect(plainUser.password).toBeUndefined(); - expect(plainUser.photo.name).toBeUndefined(); - }); - - it("should convert given plain object to class instance object", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - name: string; - - @Exclude() - filename: string; - - metadata: string; - uploadDate: Date; - } - - class User { - id: number; - firstName: string; - lastName: string; - - @Exclude() - password: string; - - @Type(type => Photo) - photo: Photo; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.photo = new Photo(); - user.photo.id = 1; - user.photo.name = "Me"; - user.photo.filename = "iam.jpg"; - user.photo.uploadDate = new Date(); - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - name: "Me", - filename: "iam.jpg", - uploadDate: new Date(), - } - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - const fromExistPhoto = new Photo(); - fromExistPhoto.metadata = "taken by Camera"; - fromExistUser.photo = fromExistPhoto; - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - expect(transformedUser.photo).toBeInstanceOf(Photo); - expect(transformedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - uploadDate: fromPlainUser.photo.uploadDate - } - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); - expect(fromExistTransformedUser).toEqual(fromExistUser); - expect(fromExistTransformedUser.photo).toEqual(fromExistPhoto); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - metadata: "taken by Camera", - uploadDate: fromPlainUser.photo.uploadDate - } - }); - - const classToClassUser = classToClass(user); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser.photo).toBeInstanceOf(Photo); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).not.toEqual(user.photo); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - uploadDate: user.photo.uploadDate - } - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).not.toEqual(user.photo); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - name: "Me", - metadata: "taken by Camera", - uploadDate: user.photo.uploadDate - } - }); - }); - - it("should expose only properties that match given group", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - - @Expose({ - groups: ["user", "guest"] - }) - filename: string; - - @Expose({ - groups: ["admin"] - }) - status: number; - - metadata: string; - } - - class User { - id: number; - firstName: string; - - @Expose({ - groups: ["user", "guest"] - }) - lastName: string; - - @Expose({ - groups: ["user"] - }) - password: string; - - @Expose({ - groups: ["admin"] - }) - isActive: boolean; - - @Type(type => Photo) - photo: Photo; - - @Expose({ - groups: ["admin"] - }) - @Type(type => Photo) - photos: Photo[]; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.isActive = false; - user.photo = new Photo(); - user.photo.id = 1; - user.photo.filename = "myphoto.jpg"; - user.photo.status = 1; - user.photos = [user.photo]; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - isActive: false, - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1, - }] - }; - - const fromExistUser = new User(); - fromExistUser.id = 1; - fromExistUser.photo = new Photo(); - fromExistUser.photo.metadata = "taken by Camera"; - - const plainUser1: any = classToPlain(user); - expect(plainUser1).not.toBeInstanceOf(User); - expect(plainUser1).toEqual({ - firstName: "Umed", - photo: { - id: 1 - } - }); - expect(plainUser1.lastName).toBeUndefined(); - expect(plainUser1.password).toBeUndefined(); - expect(plainUser1.isActive).toBeUndefined(); - - const plainUser2: any = classToPlain(user, { groups: ["user"] }); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - expect(plainUser2.isActive).toBeUndefined(); - - const transformedUser2 = plainToClass(User, fromPlainUser, { groups: ["user"] }); - expect(transformedUser2).toBeInstanceOf(User); - expect(transformedUser2.photo).toBeInstanceOf(Photo); - expect(transformedUser2).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - - const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { groups: ["user"] }); - expect(fromExistTransformedUser).toEqual(fromExistUser); - expect(fromExistTransformedUser.photo).toEqual(fromExistUser.photo); - expect(fromExistTransformedUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - metadata: "taken by Camera", - filename: "myphoto.jpg" - } - }); - - const classToClassUser = classToClass(user, { groups: ["user"] }); - expect(classToClassUser).toBeInstanceOf(User); - expect(classToClassUser.photo).toBeInstanceOf(Photo); - expect(classToClassUser).not.toEqual(user); - expect(classToClassUser).not.toEqual(user.photo); - expect(classToClassUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - - const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { groups: ["user"] }); - expect(classToClassFromExistUser).toBeInstanceOf(User); - expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); - expect(classToClassFromExistUser).not.toEqual(user); - expect(classToClassFromExistUser).not.toEqual(user.photo); - expect(classToClassFromExistUser).toEqual(fromExistUser); - expect(classToClassFromExistUser).toEqual({ - id: 1, - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - metadata: "taken by Camera", - filename: "myphoto.jpg" - } - }); - - const plainUser3: any = classToPlain(user, { groups: ["guest"] }); - expect(plainUser3).not.toBeInstanceOf(User); - expect(plainUser3).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - expect(plainUser3.password).toBeUndefined(); - expect(plainUser3.isActive).toBeUndefined(); - - const transformedUser3 = plainToClass(User, fromPlainUser, { groups: ["guest"] }); - expect(transformedUser3).toBeInstanceOf(User); - expect(transformedUser3.photo).toBeInstanceOf(Photo); - expect(transformedUser3).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - - const plainUser4: any = classToPlain(user, { groups: ["admin"] }); - expect(plainUser4).not.toBeInstanceOf(User); - expect(plainUser4).toEqual({ - firstName: "Umed", - isActive: false, - photo: { - id: 1, - status: 1 - }, - photos: [{ - id: 1, - status: 1 - }] - }); - expect(plainUser4.lastName).toBeUndefined(); - expect(plainUser4.password).toBeUndefined(); - - const transformedUser4 = plainToClass(User, fromPlainUser, { groups: ["admin"] }); - expect(transformedUser4).toBeInstanceOf(User); - expect(transformedUser4.photo).toBeInstanceOf(Photo); - expect(transformedUser4.photos[0]).toBeInstanceOf(Photo); - expect(transformedUser4).toEqual({ - firstName: "Umed", - isActive: false, - photo: { - id: 1, - status: 1 - }, - photos: [{ - id: 1, - status: 1 - }] - }); - - const plainUser5: any = classToPlain(user, { groups: ["admin", "user"] }); - expect(plainUser5).not.toBeInstanceOf(User); - expect(plainUser5).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - isActive: false, - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1 - }] - }); - - const transformedUser5 = plainToClass(User, fromPlainUser, { groups: ["admin", "user"] }); - expect(transformedUser5).toBeInstanceOf(User); - expect(transformedUser5).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - isActive: false, - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1 - }] - }); - }); - - it("should expose only properties that match given version", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - - @Expose({ - since: 1.5, - until: 2 - }) - filename: string; - - @Expose({ - since: 2 - }) - status: number; - } - - class User { - @Expose({ - since: 1, - until: 2 - }) - firstName: string; - - @Expose({ - since: 0.5 - }) - lastName: string; - - @Exclude() - password: string; - - @Type(type => Photo) - photo: Photo; - - @Expose({ - since: 3 - }) - @Type(type => Photo) - photos: Photo[]; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.photo = new Photo(); - user.photo.id = 1; - user.photo.filename = "myphoto.jpg"; - user.photo.status = 1; - user.photos = [user.photo]; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman", - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1, - }] - }; - - const plainUser1: any = classToPlain(user); - expect(plainUser1).not.toBeInstanceOf(User); - expect(plainUser1).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1 - }] - }); - - const transformedUser1 = plainToClass(User, fromPlainUser); - expect(transformedUser1).toBeInstanceOf(User); - expect(transformedUser1.photo).toBeInstanceOf(Photo); - expect(transformedUser1.photos[0]).toBeInstanceOf(Photo); - expect(transformedUser1).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg", - status: 1 - }, - photos: [{ - id: 1, - filename: "myphoto.jpg", - status: 1 - }] - }); - - const plainUser2: any = classToPlain(user, { version: 0.3 }); - expect(plainUser2).not.toBeInstanceOf(User); - expect(plainUser2).toEqual({ - photo: { - id: 1 - } - }); - - const transformedUser2 = plainToClass(User, fromPlainUser, { version: 0.3 }); - expect(transformedUser2).toBeInstanceOf(User); - expect(transformedUser2.photo).toBeInstanceOf(Photo); - expect(transformedUser2).toEqual({ - photo: { - id: 1 - } - }); - - const plainUser3: any = classToPlain(user, { version: 0.5 }); - expect(plainUser3).not.toBeInstanceOf(User); - expect(plainUser3).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1 - } - }); - - const transformedUser3 = plainToClass(User, fromPlainUser, { version: 0.5 }); - expect(transformedUser3).toBeInstanceOf(User); - expect(transformedUser3.photo).toBeInstanceOf(Photo); - expect(transformedUser3).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1 - } - }); - - const plainUser4: any = classToPlain(user, { version: 1 }); - expect(plainUser4).not.toBeInstanceOf(User); - expect(plainUser4).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1 - } - }); - - const transformedUser4 = plainToClass(User, fromPlainUser, { version: 1 }); - expect(transformedUser4).toBeInstanceOf(User); - expect(transformedUser4.photo).toBeInstanceOf(Photo); - expect(transformedUser4).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1 - } - }); - - const plainUser5: any = classToPlain(user, { version: 1.5 }); - expect(plainUser5).not.toBeInstanceOf(User); - expect(plainUser5).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - - const transformedUser5 = plainToClass(User, fromPlainUser, { version: 1.5 }); - expect(transformedUser5).toBeInstanceOf(User); - expect(transformedUser5.photo).toBeInstanceOf(Photo); - expect(transformedUser5).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - photo: { - id: 1, - filename: "myphoto.jpg" - } - }); - - const plainUser6: any = classToPlain(user, { version: 2 }); - expect(plainUser6).not.toBeInstanceOf(User); - expect(plainUser6).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1, - status: 1 - } - }); - - const transformedUser6 = plainToClass(User, fromPlainUser, { version: 2 }); - expect(transformedUser6).toBeInstanceOf(User); - expect(transformedUser6.photo).toBeInstanceOf(Photo); - expect(transformedUser6).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1, - status: 1 - } - }); - - const plainUser7: any = classToPlain(user, { version: 3 }); - expect(plainUser7).not.toBeInstanceOf(User); - expect(plainUser7).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1, - status: 1 - }, - photos: [{ - id: 1, - status: 1 - }] - }); - - const transformedUser7 = plainToClass(User, fromPlainUser, { version: 3 }); - expect(transformedUser7).toBeInstanceOf(User); - expect(transformedUser7.photo).toBeInstanceOf(Photo); - expect(transformedUser7.photos[0]).toBeInstanceOf(Photo); - expect(transformedUser7).toEqual({ - lastName: "Khudoiberdiev", - photo: { - id: 1, - status: 1 - }, - photos: [{ - id: 1, - status: 1 - }] - }); - }); - - it("should expose method and accessors that have @Expose()", () => { - defaultMetadataStorage.clear(); - - class User { - firstName: string; - lastName: string; - - @Exclude() - password: string; - - @Expose() - get name(): string { - return this.firstName + " " + this.lastName; - } - - @Expose() - getName(): string { - return this.firstName + " " + this.lastName; - } - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - name: "Umed Khudoiberdiev", - getName: "Umed Khudoiberdiev" - }); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - const likeUser = new User(); - likeUser.firstName = "Umed"; - likeUser.lastName = "Khudoiberdiev"; - expect(transformedUser).toEqual(likeUser); - }); - - it("should expose with alternative name if its given", () => { - defaultMetadataStorage.clear(); - - class User { - @Expose({ name: "myName" }) - firstName: string; - - @Expose({ name: "secondName" }) - lastName: string; - - @Exclude() - password: string; - - @Expose() - get name(): string { - return this.firstName + " " + this.lastName; - } - - @Expose({ name: "fullName" }) - getName(): string { - return this.firstName + " " + this.lastName; - } - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const fromPlainUser = { - myName: "Umed", - secondName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const plainUser: any = classToPlain(user); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - myName: "Umed", - secondName: "Khudoiberdiev", - name: "Umed Khudoiberdiev", - fullName: "Umed Khudoiberdiev" - }); - - const transformedUser = plainToClass(User, fromPlainUser); - expect(transformedUser).toBeInstanceOf(User); - const likeUser = new User(); - likeUser.firstName = "Umed"; - likeUser.lastName = "Khudoiberdiev"; - expect(transformedUser).toEqual(likeUser); - }); - - it("should exclude all prefixed properties if prefix is given", () => { - defaultMetadataStorage.clear(); - - class Photo { - id: number; - $filename: string; - status: number; - } - - class User { - $system: string; - _firstName: string; - _lastName: string; - - @Exclude() - password: string; - - @Type(() => Photo) - photo: Photo; - - @Expose() - get name(): string { - return this._firstName + " " + this._lastName; - } - } - - const user = new User(); - user.$system = "@#$%^&*token(*&^%$#@!"; - user._firstName = "Umed"; - user._lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - user.photo = new Photo(); - user.photo.id = 1; - user.photo.$filename = "myphoto.jpg"; - user.photo.status = 1; - - const fromPlainUser = { - $system: "@#$%^&*token(*&^%$#@!", - _firstName: "Khudoiberdiev", - _lastName: "imnosuperman", - password: "imnosuperman", - photo: { - id: 1, - $filename: "myphoto.jpg", - status: 1, - } - }; - - const plainUser: any = classToPlain(user, { excludePrefixes: ["_", "$"] }); - expect(plainUser).not.toBeInstanceOf(User); - expect(plainUser).toEqual({ - name: "Umed Khudoiberdiev", - photo: { - id: 1, - status: 1 - } - }); - - const transformedUser = plainToClass(User, fromPlainUser, { excludePrefixes: ["_", "$"] }); - expect(transformedUser).toBeInstanceOf(User); - const likeUser = new User(); - likeUser.photo = new Photo(); - likeUser.photo.id = 1; - likeUser.photo.status = 1; - expect(transformedUser).toEqual(likeUser); - }); - - it("should be able to transform array too", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - firstName: string; - lastName: string; - - @Exclude() - password: string; - - @Expose() - get name(): string { - return this.firstName + " " + this.lastName; - } - } - - const user1 = new User(); - user1.firstName = "Umed"; - user1.lastName = "Khudoiberdiev"; - user1.password = "imnosuperman"; - - const user2 = new User(); - user2.firstName = "Dima"; - user2.lastName = "Zotov"; - user2.password = "imnomesser"; - - const users = [user1, user2]; - - const plainUsers: any = classToPlain(users); - expect(plainUsers).toEqual([{ - firstName: "Umed", - lastName: "Khudoiberdiev", - name: "Umed Khudoiberdiev" - }, { - firstName: "Dima", - lastName: "Zotov", - name: "Dima Zotov" - }]); - - const fromPlainUsers = [{ - firstName: "Umed", - lastName: "Khudoiberdiev", - name: "Umed Khudoiberdiev" - }, { - firstName: "Dima", - lastName: "Zotov", - name: "Dima Zotov" - }]; - - const existUsers = [{ id: 1, age: 27 }, { id: 2, age: 30 }]; - const plainUser2 = classToPlainFromExist(users, existUsers); - expect(plainUser2).toEqual([{ - id: 1, - age: 27, - firstName: "Umed", - lastName: "Khudoiberdiev", - name: "Umed Khudoiberdiev" - }, { - id: 2, - age: 30, - firstName: "Dima", - lastName: "Zotov", - name: "Dima Zotov" - }]); - - const transformedUser = plainToClass(User, fromPlainUsers); - - expect(transformedUser[0]).toBeInstanceOf(User); - expect(transformedUser[1]).toBeInstanceOf(User); - const likeUser1 = new User(); - likeUser1.firstName = "Umed"; - likeUser1.lastName = "Khudoiberdiev"; - - const likeUser2 = new User(); - likeUser2.firstName = "Dima"; - likeUser2.lastName = "Zotov"; - expect(transformedUser).toEqual([likeUser1, likeUser2]); - - const classToClassUsers = classToClass(users); - expect(classToClassUsers[0]).toBeInstanceOf(User); - expect(classToClassUsers[1]).toBeInstanceOf(User); - expect(classToClassUsers[0]).not.toEqual(user1); - expect(classToClassUsers[1]).not.toEqual(user1); - - const classUserLike1 = new User(); - classUserLike1.firstName = "Umed"; - classUserLike1.lastName = "Khudoiberdiev"; - - const classUserLike2 = new User(); - classUserLike2.firstName = "Dima"; - classUserLike2.lastName = "Zotov"; - - expect(classToClassUsers).toEqual([classUserLike1, classUserLike2]); - - const fromExistUser1 = new User(); - fromExistUser1.id = 1; - - const fromExistUser2 = new User(); - fromExistUser2.id = 2; - - const fromExistUsers = [fromExistUser1, fromExistUser2]; - - const classToClassFromExistUser = classToClassFromExist(users, fromExistUsers); - expect(classToClassFromExistUser[0]).toBeInstanceOf(User); - expect(classToClassFromExistUser[1]).toBeInstanceOf(User); - expect(classToClassFromExistUser[0]).not.toEqual(user1); - expect(classToClassFromExistUser[1]).not.toEqual(user1); - expect(classToClassFromExistUser).toEqual(fromExistUsers); - - const fromExistUserLike1 = new User(); - fromExistUserLike1.id = 1; - fromExistUserLike1.firstName = "Umed"; - fromExistUserLike1.lastName = "Khudoiberdiev"; - - const fromExistUserLike2 = new User(); - fromExistUserLike2.id = 2; - fromExistUserLike2.firstName = "Dima"; - fromExistUserLike2.lastName = "Zotov"; - - expect(classToClassFromExistUser).toEqual([fromExistUserLike1, fromExistUserLike2]); +import 'reflect-metadata'; +import { + classToClass, + classToClassFromExist, + classToPlain, + classToPlainFromExist, + plainToClass, + plainToClassFromExist, +} from '../../src/index'; +import { defaultMetadataStorage } from '../../src/storage'; +import { Exclude, Expose, Type } from '../../src/decorators'; + +describe('specifying target maps', () => { + it('should convert instance of the given object to plain javascript object and should expose all properties since its a default behaviour', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + firstName: string; + lastName: string; + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', }); + + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + + const classToClassUser = classToClass(user); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toBe(user); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + }); + + it('should exclude all objects marked with @Exclude() decorator', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + firstName: string; + lastName: string; + @Exclude() + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + expect(plainUser.password).toBeUndefined(); + + const existUser = { id: 1, age: 27, password: 'yayayaya' }; + const plainUser2 = classToPlainFromExist(user, existUser); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'yayayaya', + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassUser = classToClass(user); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + }); + + it('should exclude all properties from object if whole class is marked with @Exclude() decorator', () => { + defaultMetadataStorage.clear(); + + @Exclude() + class User { + id: number; + firstName: string; + lastName: string; + password: string; + } + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({}); + expect(plainUser.firstName).toBeUndefined(); + expect(plainUser.lastName).toBeUndefined(); + expect(plainUser.password).toBeUndefined(); + + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({}); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + }); + + const classToClassUser = classToClass(user); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({}); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + }); + }); + + it('should exclude all properties from object if whole class is marked with @Exclude() decorator, but include properties marked with @Expose() decorator', () => { + defaultMetadataStorage.clear(); + + @Exclude() + class User { + id: number; + + @Expose() + firstName: string; + + @Expose() + lastName: string; + + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + expect(plainUser.password).toBeUndefined(); + + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassUser = classToClass(user); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + }); + + it('should exclude all properties from object if its defined via transformation options, but include properties marked with @Expose() decorator', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + + @Expose() + firstName: string; + + @Expose() + lastName: string; + + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user, { strategy: 'excludeAll' }); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + expect(plainUser.password).toBeUndefined(); + + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser, { strategy: 'excludeAll' }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser, { strategy: 'excludeAll' }); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: 'excludeAll' }); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassUser = classToClass(user, { strategy: 'excludeAll' }); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: 'excludeAll' }); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + }); + + it('should expose all properties from object if its defined via transformation options, but exclude properties marked with @Exclude() decorator', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + firstName: string; + + @Exclude() + lastName: string; + + @Exclude() + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user, { strategy: 'exposeAll' }); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + }); + expect(plainUser.lastName).toBeUndefined(); + expect(plainUser.password).toBeUndefined(); + + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser, { strategy: 'exposeAll' }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser, { strategy: 'exposeAll' }); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: 'Umed', + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: 'exposeAll' }); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + }); + + const classToClassUser = classToClass(user, { strategy: 'exposeAll' }); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: 'exposeAll' }); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + }); + }); + + it('should convert values to specific types if they are set via @Type decorator', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + + @Type(type => String) + firstName: string; + + @Type(type => String) + lastName: string; + + @Type(type => Number) + password: number; + + @Type(type => Boolean) + isActive: boolean; + + @Type(type => Date) + registrationDate: Date; + + @Type(type => String) + lastVisitDate: string; + } + + const date = new Date(); + const user = new User(); + user.firstName = 321 as any; + user.lastName = 123 as any; + user.password = '123' as any; + user.isActive = '1' as any; + user.registrationDate = date.toString() as any; + user.lastVisitDate = date as any; + + const fromPlainUser = { + firstName: 321, + lastName: 123, + password: '123', + isActive: '1', + registrationDate: date.toString(), + lastVisitDate: date, + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + + const plainUser: any = classToPlain(user, { strategy: 'exposeAll' }); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + }); + + const existUser = { id: 1, age: 27 }; + const plainUser2 = classToPlainFromExist(user, existUser, { strategy: 'exposeAll' }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + }); + expect(plainUser2).toEqual(existUser); + + const transformedUser = plainToClass(User, fromPlainUser, { strategy: 'exposeAll' }); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser).toEqual({ + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { strategy: 'exposeAll' }); + expect(fromExistTransformedUser).toBeInstanceOf(User); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + }); + + const classToClassUser = classToClass(user, { strategy: 'exposeAll' }); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).toEqual({ + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { strategy: 'exposeAll' }); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: '321', + lastName: '123', + password: 123, + isActive: true, + registrationDate: new Date(date.toString()), + lastVisitDate: date.toString(), + }); + }); + + it('should transform nested objects too and make sure their decorators are used too', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + name: string; + + @Exclude() + filename: string; + + uploadDate: Date; + } + + class User { + firstName: string; + lastName: string; + + @Exclude() + password: string; + + photo: Photo; // type should be automatically guessed + } + + const photo = new Photo(); + photo.id = 1; + photo.name = 'Me'; + photo.filename = 'iam.jpg'; + photo.uploadDate = new Date(); + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.photo = photo; + + const plainUser: any = classToPlain(user, { strategy: 'exposeAll' }); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser.photo).not.toBeInstanceOf(Photo); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + uploadDate: photo.uploadDate, + }, + }); + expect(plainUser.password).toBeUndefined(); + expect(plainUser.photo.filename).toBeUndefined(); + expect(plainUser.photo.uploadDate).toEqual(photo.uploadDate); + expect(plainUser.photo.uploadDate).not.toBe(photo.uploadDate); + + const existUser = { id: 1, age: 27, photo: { id: 2, description: 'photo' } }; + const plainUser2: any = classToPlainFromExist(user, existUser, { strategy: 'exposeAll' }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2.photo).not.toBeInstanceOf(Photo); + expect(plainUser2).toEqual({ + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + uploadDate: photo.uploadDate, + description: 'photo', + }, + }); + expect(plainUser2).toEqual(existUser); + expect(plainUser2.password).toBeUndefined(); + expect(plainUser2.photo.filename).toBeUndefined(); + expect(plainUser2.photo.uploadDate).toEqual(photo.uploadDate); + expect(plainUser2.photo.uploadDate).not.toBe(photo.uploadDate); + }); + + it('should transform nested objects too and make sure given type is used instead of automatically guessed one', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + name: string; + + @Exclude() + filename: string; + } + + class ExtendedPhoto implements Photo { + id: number; + + @Exclude() + name: string; + + filename: string; + } + + class User { + id: number; + firstName: string; + lastName: string; + + @Exclude() + password: string; + + @Type(type => ExtendedPhoto) // force specific type + photo: Photo; + } + + const photo = new Photo(); + photo.id = 1; + photo.name = 'Me'; + photo.filename = 'iam.jpg'; + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.photo = photo; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'iam.jpg', + }, + }); + expect(plainUser.password).toBeUndefined(); + expect(plainUser.photo.name).toBeUndefined(); + }); + + it('should convert given plain object to class instance object', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + name: string; + + @Exclude() + filename: string; + + metadata: string; + uploadDate: Date; + } + + class User { + id: number; + firstName: string; + lastName: string; + + @Exclude() + password: string; + + @Type(type => Photo) + photo: Photo; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.photo = new Photo(); + user.photo.id = 1; + user.photo.name = 'Me'; + user.photo.filename = 'iam.jpg'; + user.photo.uploadDate = new Date(); + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + name: 'Me', + filename: 'iam.jpg', + uploadDate: new Date(), + }, + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + const fromExistPhoto = new Photo(); + fromExistPhoto.metadata = 'taken by Camera'; + fromExistUser.photo = fromExistPhoto; + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + expect(transformedUser.photo).toBeInstanceOf(Photo); + expect(transformedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + uploadDate: fromPlainUser.photo.uploadDate, + }, + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser); + expect(fromExistTransformedUser).toEqual(fromExistUser); + expect(fromExistTransformedUser.photo).toEqual(fromExistPhoto); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + metadata: 'taken by Camera', + uploadDate: fromPlainUser.photo.uploadDate, + }, + }); + + const classToClassUser = classToClass(user); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser.photo).toBeInstanceOf(Photo); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).not.toEqual(user.photo); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + uploadDate: user.photo.uploadDate, + }, + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).not.toEqual(user.photo); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + name: 'Me', + metadata: 'taken by Camera', + uploadDate: user.photo.uploadDate, + }, + }); + }); + + it('should expose only properties that match given group', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + + @Expose({ + groups: ['user', 'guest'], + }) + filename: string; + + @Expose({ + groups: ['admin'], + }) + status: number; + + metadata: string; + } + + class User { + id: number; + firstName: string; + + @Expose({ + groups: ['user', 'guest'], + }) + lastName: string; + + @Expose({ + groups: ['user'], + }) + password: string; + + @Expose({ + groups: ['admin'], + }) + isActive: boolean; + + @Type(type => Photo) + photo: Photo; + + @Expose({ + groups: ['admin'], + }) + @Type(type => Photo) + photos: Photo[]; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.isActive = false; + user.photo = new Photo(); + user.photo.id = 1; + user.photo.filename = 'myphoto.jpg'; + user.photo.status = 1; + user.photos = [user.photo]; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + isActive: false, + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }; + + const fromExistUser = new User(); + fromExistUser.id = 1; + fromExistUser.photo = new Photo(); + fromExistUser.photo.metadata = 'taken by Camera'; + + const plainUser1: any = classToPlain(user); + expect(plainUser1).not.toBeInstanceOf(User); + expect(plainUser1).toEqual({ + firstName: 'Umed', + photo: { + id: 1, + }, + }); + expect(plainUser1.lastName).toBeUndefined(); + expect(plainUser1.password).toBeUndefined(); + expect(plainUser1.isActive).toBeUndefined(); + + const plainUser2: any = classToPlain(user, { groups: ['user'] }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + expect(plainUser2.isActive).toBeUndefined(); + + const transformedUser2 = plainToClass(User, fromPlainUser, { groups: ['user'] }); + expect(transformedUser2).toBeInstanceOf(User); + expect(transformedUser2.photo).toBeInstanceOf(Photo); + expect(transformedUser2).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + + const fromExistTransformedUser = plainToClassFromExist(fromExistUser, fromPlainUser, { groups: ['user'] }); + expect(fromExistTransformedUser).toEqual(fromExistUser); + expect(fromExistTransformedUser.photo).toEqual(fromExistUser.photo); + expect(fromExistTransformedUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + metadata: 'taken by Camera', + filename: 'myphoto.jpg', + }, + }); + + const classToClassUser = classToClass(user, { groups: ['user'] }); + expect(classToClassUser).toBeInstanceOf(User); + expect(classToClassUser.photo).toBeInstanceOf(Photo); + expect(classToClassUser).not.toEqual(user); + expect(classToClassUser).not.toEqual(user.photo); + expect(classToClassUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + + const classToClassFromExistUser = classToClassFromExist(user, fromExistUser, { groups: ['user'] }); + expect(classToClassFromExistUser).toBeInstanceOf(User); + expect(classToClassFromExistUser.photo).toBeInstanceOf(Photo); + expect(classToClassFromExistUser).not.toEqual(user); + expect(classToClassFromExistUser).not.toEqual(user.photo); + expect(classToClassFromExistUser).toEqual(fromExistUser); + expect(classToClassFromExistUser).toEqual({ + id: 1, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + metadata: 'taken by Camera', + filename: 'myphoto.jpg', + }, + }); + + const plainUser3: any = classToPlain(user, { groups: ['guest'] }); + expect(plainUser3).not.toBeInstanceOf(User); + expect(plainUser3).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + expect(plainUser3.password).toBeUndefined(); + expect(plainUser3.isActive).toBeUndefined(); + + const transformedUser3 = plainToClass(User, fromPlainUser, { groups: ['guest'] }); + expect(transformedUser3).toBeInstanceOf(User); + expect(transformedUser3.photo).toBeInstanceOf(Photo); + expect(transformedUser3).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + + const plainUser4: any = classToPlain(user, { groups: ['admin'] }); + expect(plainUser4).not.toBeInstanceOf(User); + expect(plainUser4).toEqual({ + firstName: 'Umed', + isActive: false, + photo: { + id: 1, + status: 1, + }, + photos: [ + { + id: 1, + status: 1, + }, + ], + }); + expect(plainUser4.lastName).toBeUndefined(); + expect(plainUser4.password).toBeUndefined(); + + const transformedUser4 = plainToClass(User, fromPlainUser, { groups: ['admin'] }); + expect(transformedUser4).toBeInstanceOf(User); + expect(transformedUser4.photo).toBeInstanceOf(Photo); + expect(transformedUser4.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser4).toEqual({ + firstName: 'Umed', + isActive: false, + photo: { + id: 1, + status: 1, + }, + photos: [ + { + id: 1, + status: 1, + }, + ], + }); + + const plainUser5: any = classToPlain(user, { groups: ['admin', 'user'] }); + expect(plainUser5).not.toBeInstanceOf(User); + expect(plainUser5).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + isActive: false, + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }); + + const transformedUser5 = plainToClass(User, fromPlainUser, { groups: ['admin', 'user'] }); + expect(transformedUser5).toBeInstanceOf(User); + expect(transformedUser5).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + isActive: false, + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }); + }); + + it('should expose only properties that match given version', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + + @Expose({ + since: 1.5, + until: 2, + }) + filename: string; + + @Expose({ + since: 2, + }) + status: number; + } + + class User { + @Expose({ + since: 1, + until: 2, + }) + firstName: string; + + @Expose({ + since: 0.5, + }) + lastName: string; + + @Exclude() + password: string; + + @Type(type => Photo) + photo: Photo; + + @Expose({ + since: 3, + }) + @Type(type => Photo) + photos: Photo[]; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.photo = new Photo(); + user.photo.id = 1; + user.photo.filename = 'myphoto.jpg'; + user.photo.status = 1; + user.photos = [user.photo]; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }; + + const plainUser1: any = classToPlain(user); + expect(plainUser1).not.toBeInstanceOf(User); + expect(plainUser1).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }); + + const transformedUser1 = plainToClass(User, fromPlainUser); + expect(transformedUser1).toBeInstanceOf(User); + expect(transformedUser1.photo).toBeInstanceOf(Photo); + expect(transformedUser1.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser1).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + photos: [ + { + id: 1, + filename: 'myphoto.jpg', + status: 1, + }, + ], + }); + + const plainUser2: any = classToPlain(user, { version: 0.3 }); + expect(plainUser2).not.toBeInstanceOf(User); + expect(plainUser2).toEqual({ + photo: { + id: 1, + }, + }); + + const transformedUser2 = plainToClass(User, fromPlainUser, { version: 0.3 }); + expect(transformedUser2).toBeInstanceOf(User); + expect(transformedUser2.photo).toBeInstanceOf(Photo); + expect(transformedUser2).toEqual({ + photo: { + id: 1, + }, + }); + + const plainUser3: any = classToPlain(user, { version: 0.5 }); + expect(plainUser3).not.toBeInstanceOf(User); + expect(plainUser3).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + }, + }); + + const transformedUser3 = plainToClass(User, fromPlainUser, { version: 0.5 }); + expect(transformedUser3).toBeInstanceOf(User); + expect(transformedUser3.photo).toBeInstanceOf(Photo); + expect(transformedUser3).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + }, + }); + + const plainUser4: any = classToPlain(user, { version: 1 }); + expect(plainUser4).not.toBeInstanceOf(User); + expect(plainUser4).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + }, + }); + + const transformedUser4 = plainToClass(User, fromPlainUser, { version: 1 }); + expect(transformedUser4).toBeInstanceOf(User); + expect(transformedUser4.photo).toBeInstanceOf(Photo); + expect(transformedUser4).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + }, + }); + + const plainUser5: any = classToPlain(user, { version: 1.5 }); + expect(plainUser5).not.toBeInstanceOf(User); + expect(plainUser5).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + + const transformedUser5 = plainToClass(User, fromPlainUser, { version: 1.5 }); + expect(transformedUser5).toBeInstanceOf(User); + expect(transformedUser5.photo).toBeInstanceOf(Photo); + expect(transformedUser5).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + photo: { + id: 1, + filename: 'myphoto.jpg', + }, + }); + + const plainUser6: any = classToPlain(user, { version: 2 }); + expect(plainUser6).not.toBeInstanceOf(User); + expect(plainUser6).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + status: 1, + }, + }); + + const transformedUser6 = plainToClass(User, fromPlainUser, { version: 2 }); + expect(transformedUser6).toBeInstanceOf(User); + expect(transformedUser6.photo).toBeInstanceOf(Photo); + expect(transformedUser6).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + status: 1, + }, + }); + + const plainUser7: any = classToPlain(user, { version: 3 }); + expect(plainUser7).not.toBeInstanceOf(User); + expect(plainUser7).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + status: 1, + }, + photos: [ + { + id: 1, + status: 1, + }, + ], + }); + + const transformedUser7 = plainToClass(User, fromPlainUser, { version: 3 }); + expect(transformedUser7).toBeInstanceOf(User); + expect(transformedUser7.photo).toBeInstanceOf(Photo); + expect(transformedUser7.photos[0]).toBeInstanceOf(Photo); + expect(transformedUser7).toEqual({ + lastName: 'Khudoiberdiev', + photo: { + id: 1, + status: 1, + }, + photos: [ + { + id: 1, + status: 1, + }, + ], + }); + }); + + it('should expose method and accessors that have @Expose()', () => { + defaultMetadataStorage.clear(); + + class User { + firstName: string; + lastName: string; + + @Exclude() + password: string; + + @Expose() + get name(): string { + return this.firstName + ' ' + this.lastName; + } + + @Expose() + getName(): string { + return this.firstName + ' ' + this.lastName; + } + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + name: 'Umed Khudoiberdiev', + getName: 'Umed Khudoiberdiev', + }); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + const likeUser = new User(); + likeUser.firstName = 'Umed'; + likeUser.lastName = 'Khudoiberdiev'; + expect(transformedUser).toEqual(likeUser); + }); + + it('should expose with alternative name if its given', () => { + defaultMetadataStorage.clear(); + + class User { + @Expose({ name: 'myName' }) + firstName: string; + + @Expose({ name: 'secondName' }) + lastName: string; + + @Exclude() + password: string; + + @Expose() + get name(): string { + return this.firstName + ' ' + this.lastName; + } + + @Expose({ name: 'fullName' }) + getName(): string { + return this.firstName + ' ' + this.lastName; + } + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const fromPlainUser = { + myName: 'Umed', + secondName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const plainUser: any = classToPlain(user); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + myName: 'Umed', + secondName: 'Khudoiberdiev', + name: 'Umed Khudoiberdiev', + fullName: 'Umed Khudoiberdiev', + }); + + const transformedUser = plainToClass(User, fromPlainUser); + expect(transformedUser).toBeInstanceOf(User); + const likeUser = new User(); + likeUser.firstName = 'Umed'; + likeUser.lastName = 'Khudoiberdiev'; + expect(transformedUser).toEqual(likeUser); + }); + + it('should exclude all prefixed properties if prefix is given', () => { + defaultMetadataStorage.clear(); + + class Photo { + id: number; + $filename: string; + status: number; + } + + class User { + $system: string; + _firstName: string; + _lastName: string; + + @Exclude() + password: string; + + @Type(() => Photo) + photo: Photo; + + @Expose() + get name(): string { + return this._firstName + ' ' + this._lastName; + } + } + + const user = new User(); + user.$system = '@#$%^&*token(*&^%$#@!'; + user._firstName = 'Umed'; + user._lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + user.photo = new Photo(); + user.photo.id = 1; + user.photo.$filename = 'myphoto.jpg'; + user.photo.status = 1; + + const fromPlainUser = { + $system: '@#$%^&*token(*&^%$#@!', + _firstName: 'Khudoiberdiev', + _lastName: 'imnosuperman', + password: 'imnosuperman', + photo: { + id: 1, + $filename: 'myphoto.jpg', + status: 1, + }, + }; + + const plainUser: any = classToPlain(user, { excludePrefixes: ['_', '$'] }); + expect(plainUser).not.toBeInstanceOf(User); + expect(plainUser).toEqual({ + name: 'Umed Khudoiberdiev', + photo: { + id: 1, + status: 1, + }, + }); + + const transformedUser = plainToClass(User, fromPlainUser, { excludePrefixes: ['_', '$'] }); + expect(transformedUser).toBeInstanceOf(User); + const likeUser = new User(); + likeUser.photo = new Photo(); + likeUser.photo.id = 1; + likeUser.photo.status = 1; + expect(transformedUser).toEqual(likeUser); + }); + + it('should be able to transform array too', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + firstName: string; + lastName: string; + + @Exclude() + password: string; + + @Expose() + get name(): string { + return this.firstName + ' ' + this.lastName; + } + } + + const user1 = new User(); + user1.firstName = 'Umed'; + user1.lastName = 'Khudoiberdiev'; + user1.password = 'imnosuperman'; + + const user2 = new User(); + user2.firstName = 'Dima'; + user2.lastName = 'Zotov'; + user2.password = 'imnomesser'; + + const users = [user1, user2]; + + const plainUsers: any = classToPlain(users); + expect(plainUsers).toEqual([ + { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + name: 'Umed Khudoiberdiev', + }, + { + firstName: 'Dima', + lastName: 'Zotov', + name: 'Dima Zotov', + }, + ]); + + const fromPlainUsers = [ + { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + name: 'Umed Khudoiberdiev', + }, + { + firstName: 'Dima', + lastName: 'Zotov', + name: 'Dima Zotov', + }, + ]; + + const existUsers = [ + { id: 1, age: 27 }, + { id: 2, age: 30 }, + ]; + const plainUser2 = classToPlainFromExist(users, existUsers); + expect(plainUser2).toEqual([ + { + id: 1, + age: 27, + firstName: 'Umed', + lastName: 'Khudoiberdiev', + name: 'Umed Khudoiberdiev', + }, + { + id: 2, + age: 30, + firstName: 'Dima', + lastName: 'Zotov', + name: 'Dima Zotov', + }, + ]); + + const transformedUser = plainToClass(User, fromPlainUsers); + + expect(transformedUser[0]).toBeInstanceOf(User); + expect(transformedUser[1]).toBeInstanceOf(User); + const likeUser1 = new User(); + likeUser1.firstName = 'Umed'; + likeUser1.lastName = 'Khudoiberdiev'; + + const likeUser2 = new User(); + likeUser2.firstName = 'Dima'; + likeUser2.lastName = 'Zotov'; + expect(transformedUser).toEqual([likeUser1, likeUser2]); + + const classToClassUsers = classToClass(users); + expect(classToClassUsers[0]).toBeInstanceOf(User); + expect(classToClassUsers[1]).toBeInstanceOf(User); + expect(classToClassUsers[0]).not.toEqual(user1); + expect(classToClassUsers[1]).not.toEqual(user1); + + const classUserLike1 = new User(); + classUserLike1.firstName = 'Umed'; + classUserLike1.lastName = 'Khudoiberdiev'; + + const classUserLike2 = new User(); + classUserLike2.firstName = 'Dima'; + classUserLike2.lastName = 'Zotov'; + + expect(classToClassUsers).toEqual([classUserLike1, classUserLike2]); + + const fromExistUser1 = new User(); + fromExistUser1.id = 1; + + const fromExistUser2 = new User(); + fromExistUser2.id = 2; + + const fromExistUsers = [fromExistUser1, fromExistUser2]; + + const classToClassFromExistUser = classToClassFromExist(users, fromExistUsers); + expect(classToClassFromExistUser[0]).toBeInstanceOf(User); + expect(classToClassFromExistUser[1]).toBeInstanceOf(User); + expect(classToClassFromExistUser[0]).not.toEqual(user1); + expect(classToClassFromExistUser[1]).not.toEqual(user1); + expect(classToClassFromExistUser).toEqual(fromExistUsers); + + const fromExistUserLike1 = new User(); + fromExistUserLike1.id = 1; + fromExistUserLike1.firstName = 'Umed'; + fromExistUserLike1.lastName = 'Khudoiberdiev'; + + const fromExistUserLike2 = new User(); + fromExistUserLike2.id = 2; + fromExistUserLike2.firstName = 'Dima'; + fromExistUserLike2.lastName = 'Zotov'; + + expect(classToClassFromExistUser).toEqual([fromExistUserLike1, fromExistUserLike2]); + }); }); diff --git a/test/functional/transformation-option.spec.ts b/test/functional/transformation-option.spec.ts index ed70a1325..70dcca04f 100644 --- a/test/functional/transformation-option.spec.ts +++ b/test/functional/transformation-option.spec.ts @@ -1,164 +1,164 @@ -import "reflect-metadata"; -import {classToPlain, plainToClass} from "../../src/index"; -import {defaultMetadataStorage} from "../../src/storage"; -import {Exclude, Expose} from "../../src/decorators"; - -describe("filtering by transformation option", () => { - it("@Exclude with toPlainOnly set to true then it should be excluded only during classToPlain and classToPlainFromExist operations", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - firstName: string; - lastName: string; - - @Exclude({ toPlainOnly: true }) - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const plainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const plainedUser = classToPlain(user); - expect(plainedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classedUser = plainToClass(User, plainUser); - expect(classedUser).toBeInstanceOf(User); - expect(classedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); +import 'reflect-metadata'; +import { classToPlain, plainToClass } from '../../src/index'; +import { defaultMetadataStorage } from '../../src/storage'; +import { Exclude, Expose } from '../../src/decorators'; + +describe('filtering by transformation option', () => { + it('@Exclude with toPlainOnly set to true then it should be excluded only during classToPlain and classToPlainFromExist operations', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + firstName: string; + lastName: string; + + @Exclude({ toPlainOnly: true }) + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const plainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const plainedUser = classToPlain(user); + expect(plainedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', }); - it("@Exclude with toClassOnly set to true then it should be excluded only during plainToClass and plainToClassFromExist operations", () => { - defaultMetadataStorage.clear(); - - class User { - id: number; - firstName: string; - lastName: string; - - @Exclude({ toClassOnly: true }) - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const plainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const classedUser = plainToClass(User, plainUser); - expect(classedUser).toBeInstanceOf(User); - expect(classedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const plainedUser = classToPlain(user); - expect(plainedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); + const classedUser = plainToClass(User, plainUser); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + }); + + it('@Exclude with toClassOnly set to true then it should be excluded only during plainToClass and plainToClassFromExist operations', () => { + defaultMetadataStorage.clear(); + + class User { + id: number; + firstName: string; + lastName: string; + + @Exclude({ toClassOnly: true }) + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const plainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const classedUser = plainToClass(User, plainUser); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', }); - it("@Expose with toClassOnly set to true then it should be excluded only during classToPlain and classToPlainFromExist operations", () => { - defaultMetadataStorage.clear(); - - @Exclude() - class User { - @Expose() - firstName: string; - - @Expose() - lastName: string; - - @Expose({ toClassOnly: true }) - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const plainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const plainedUser = classToPlain(user); - expect(plainedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); - - const classedUser = plainToClass(User, plainUser); - expect(classedUser).toBeInstanceOf(User); - expect(classedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); + const plainedUser = classToPlain(user); + expect(plainedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + }); + + it('@Expose with toClassOnly set to true then it should be excluded only during classToPlain and classToPlainFromExist operations', () => { + defaultMetadataStorage.clear(); + + @Exclude() + class User { + @Expose() + firstName: string; + + @Expose() + lastName: string; + + @Expose({ toClassOnly: true }) + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const plainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const plainedUser = classToPlain(user); + expect(plainedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + }); + + const classedUser = plainToClass(User, plainUser); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }); + }); + + it('@Expose with toPlainOnly set to true then it should be excluded only during classToPlain and classToPlainFromExist operations', () => { + defaultMetadataStorage.clear(); + + @Exclude() + class User { + @Expose() + firstName: string; + + @Expose() + lastName: string; + + @Expose({ toPlainOnly: true }) + password: string; + } + + const user = new User(); + user.firstName = 'Umed'; + user.lastName = 'Khudoiberdiev'; + user.password = 'imnosuperman'; + + const plainUser = { + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', + }; + + const plainedUser = classToPlain(user); + expect(plainedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', + password: 'imnosuperman', }); - it("@Expose with toPlainOnly set to true then it should be excluded only during classToPlain and classToPlainFromExist operations", () => { - defaultMetadataStorage.clear(); - - @Exclude() - class User { - @Expose() - firstName: string; - - @Expose() - lastName: string; - - @Expose({ toPlainOnly: true }) - password: string; - } - - const user = new User(); - user.firstName = "Umed"; - user.lastName = "Khudoiberdiev"; - user.password = "imnosuperman"; - - const plainUser = { - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }; - - const plainedUser = classToPlain(user); - expect(plainedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev", - password: "imnosuperman" - }); - - const classedUser = plainToClass(User, plainUser); - expect(classedUser).toBeInstanceOf(User); - expect(classedUser).toEqual({ - firstName: "Umed", - lastName: "Khudoiberdiev" - }); + const classedUser = plainToClass(User, plainUser); + expect(classedUser).toBeInstanceOf(User); + expect(classedUser).toEqual({ + firstName: 'Umed', + lastName: 'Khudoiberdiev', }); + }); }); diff --git a/test/functional/transformer-method.spec.ts b/test/functional/transformer-method.spec.ts index b5e0aff2a..2d0bc0e07 100644 --- a/test/functional/transformer-method.spec.ts +++ b/test/functional/transformer-method.spec.ts @@ -1,262 +1,256 @@ -import "reflect-metadata"; -import {defaultMetadataStorage} from "../../src/storage"; -import {Exclude, Expose, TransformClassToClass, TransformClassToPlain, TransformPlainToClass} from "../../src/decorators"; - -describe("transformer methods decorator", () => { - it("should expose non configuration properties and return User instance class", () => { - defaultMetadataStorage.clear(); - - @Exclude() - class User { - id: number; - - @Expose() - firstName: string; - - @Expose() - lastName: string; - - password: string; - } - - class UserController { - @TransformClassToClass() - getUser(): User { - const user = new User(); - user.firstName = "Snir"; - user.lastName = "Segal"; - user.password = "imnosuperman"; - - return user; - } - } - - const controller = new UserController(); - - const result = controller.getUser(); - expect(result.password).toBeUndefined(); - - const plainUser = { - firstName: "Snir", - lastName: "Segal" - }; - - - expect(result).toEqual(plainUser); - expect(result).toBeInstanceOf(User); - }); - - it("should expose non configuration properties and return User instance class instead of plain object", () => { - defaultMetadataStorage.clear(); - - @Exclude() - class User { - - id: number; - - @Expose() - firstName: string; - - @Expose() - lastName: string; - - password: string; - } - - class UserController { - - @TransformPlainToClass(User) - getUser(): User { - const user: any = {}; - user.firstName = "Snir"; - user.lastName = "Segal"; - user.password = "imnosuperman"; - - return user; - } - } - - const controller = new UserController(); - - const result = controller.getUser(); - expect(result.password).toBeUndefined(); - +import 'reflect-metadata'; +import { defaultMetadataStorage } from '../../src/storage'; +import { + Exclude, + Expose, + TransformClassToClass, + TransformClassToPlain, + TransformPlainToClass, +} from '../../src/decorators'; + +describe('transformer methods decorator', () => { + it('should expose non configuration properties and return User instance class', () => { + defaultMetadataStorage.clear(); + + @Exclude() + class User { + id: number; + + @Expose() + firstName: string; + + @Expose() + lastName: string; + + password: string; + } + + class UserController { + @TransformClassToClass() + getUser(): User { const user = new User(); - user.firstName = "Snir"; - user.lastName = "Segal"; - - expect(result).toEqual(user); - expect(result).toBeInstanceOf(User); - }); + user.firstName = 'Snir'; + user.lastName = 'Segal'; + user.password = 'imnosuperman'; - it("should expose non configuration properties", () => { - defaultMetadataStorage.clear(); + return user; + } + } - @Exclude() - class User { + const controller = new UserController(); - id: number; + const result = controller.getUser(); + expect(result.password).toBeUndefined(); - @Expose() - firstName: string; + const plainUser = { + firstName: 'Snir', + lastName: 'Segal', + }; - @Expose() - lastName: string; + expect(result).toEqual(plainUser); + expect(result).toBeInstanceOf(User); + }); - password: string; - } + it('should expose non configuration properties and return User instance class instead of plain object', () => { + defaultMetadataStorage.clear(); - class UserController { + @Exclude() + class User { + id: number; - @TransformClassToPlain() - getUser(): User { - const user = new User(); - user.firstName = "Snir"; - user.lastName = "Segal"; - user.password = "imnosuperman"; + @Expose() + firstName: string; - return user; - } - } + @Expose() + lastName: string; - const controller = new UserController(); + password: string; + } - const result = controller.getUser(); - expect(result.password).toBeUndefined(); + class UserController { + @TransformPlainToClass(User) + getUser(): User { + const user: any = {}; + user.firstName = 'Snir'; + user.lastName = 'Segal'; + user.password = 'imnosuperman'; - const plainUser = { - firstName: "Snir", - lastName: "Segal" - }; + return user; + } + } - expect(result).toEqual(plainUser); - }); + const controller = new UserController(); - it("should expose non configuration properties and properties with specific groups", () => { - defaultMetadataStorage.clear(); + const result = controller.getUser(); + expect(result.password).toBeUndefined(); - @Exclude() - class User { + const user = new User(); + user.firstName = 'Snir'; + user.lastName = 'Segal'; - id: number; + expect(result).toEqual(user); + expect(result).toBeInstanceOf(User); + }); - @Expose() - firstName: string; + it('should expose non configuration properties', () => { + defaultMetadataStorage.clear(); - @Expose() - lastName: string; + @Exclude() + class User { + id: number; - @Expose({ groups: ["user.permissions"] }) - roles: string[]; + @Expose() + firstName: string; - password: string; - } + @Expose() + lastName: string; - class UserController { + password: string; + } - @TransformClassToPlain({ groups: ["user.permissions"] }) - getUserWithRoles(): User { - const user = new User(); - user.firstName = "Snir"; - user.lastName = "Segal"; - user.password = "imnosuperman"; - user.roles = ["USER", "MANAGER"]; - - return user; - } + class UserController { + @TransformClassToPlain() + getUser(): User { + const user = new User(); + user.firstName = 'Snir'; + user.lastName = 'Segal'; + user.password = 'imnosuperman'; - } + return user; + } + } - const controller = new UserController(); + const controller = new UserController(); - const result = controller.getUserWithRoles(); - expect(result.password).toBeUndefined(); + const result = controller.getUser(); + expect(result.password).toBeUndefined(); - const plainUser = { - firstName: "Snir", - lastName: "Segal", - roles: ["USER", "MANAGER"] - }; + const plainUser = { + firstName: 'Snir', + lastName: 'Segal', + }; - expect(result).toEqual(plainUser); - }); + expect(result).toEqual(plainUser); + }); - it("should expose non configuration properties with specific version", () => { - defaultMetadataStorage.clear(); + it('should expose non configuration properties and properties with specific groups', () => { + defaultMetadataStorage.clear(); - @Exclude() - class User { + @Exclude() + class User { + id: number; - id: number; + @Expose() + firstName: string; - @Expose() - firstName: string; + @Expose() + lastName: string; - @Expose() - lastName: string; + @Expose({ groups: ['user.permissions'] }) + roles: string[]; - @Expose({ groups: ["user.permissions"] }) - roles: string[]; + password: string; + } - @Expose({ since: 2 }) - websiteUrl?: string; + class UserController { + @TransformClassToPlain({ groups: ['user.permissions'] }) + getUserWithRoles(): User { + const user = new User(); + user.firstName = 'Snir'; + user.lastName = 'Segal'; + user.password = 'imnosuperman'; + user.roles = ['USER', 'MANAGER']; - password: string; - } + return user; + } + } - class UserController { + const controller = new UserController(); - @TransformClassToPlain({ version: 1 }) - getUserVersion1(): User { - const user = new User(); - user.firstName = "Snir"; - user.lastName = "Segal"; - user.password = "imnosuperman"; - user.roles = ["USER", "MANAGER"]; - user.websiteUrl = "http://www.github.com"; + const result = controller.getUserWithRoles(); + expect(result.password).toBeUndefined(); - return user; - } + const plainUser = { + firstName: 'Snir', + lastName: 'Segal', + roles: ['USER', 'MANAGER'], + }; - @TransformClassToPlain({ version: 2 }) - getUserVersion2(): User { - const user = new User(); - user.firstName = "Snir"; - user.lastName = "Segal"; - user.password = "imnosuperman"; - user.roles = ["USER", "MANAGER"]; - user.websiteUrl = "http://www.github.com"; + expect(result).toEqual(plainUser); + }); - return user; - } + it('should expose non configuration properties with specific version', () => { + defaultMetadataStorage.clear(); - } + @Exclude() + class User { + id: number; - const controller = new UserController(); + @Expose() + firstName: string; - const resultV2 = controller.getUserVersion2(); - expect(resultV2.password).toBeUndefined(); - expect(resultV2.roles).toBeUndefined(); + @Expose() + lastName: string; - const plainUserV2 = { - firstName: "Snir", - lastName: "Segal", - websiteUrl: "http://www.github.com" - }; + @Expose({ groups: ['user.permissions'] }) + roles: string[]; - expect(resultV2).toEqual(plainUserV2); + @Expose({ since: 2 }) + websiteUrl?: string; - const resultV1 = controller.getUserVersion1(); - expect(resultV1.password).toBeUndefined(); - expect(resultV1.roles).toBeUndefined(); - expect(resultV1.websiteUrl).toBeUndefined(); + password: string; + } - const plainUserV1 = { - firstName: "Snir", - lastName: "Segal" - }; + class UserController { + @TransformClassToPlain({ version: 1 }) + getUserVersion1(): User { + const user = new User(); + user.firstName = 'Snir'; + user.lastName = 'Segal'; + user.password = 'imnosuperman'; + user.roles = ['USER', 'MANAGER']; + user.websiteUrl = 'http://www.github.com'; - expect(resultV1).toEqual(plainUserV1); - }); + return user; + } + @TransformClassToPlain({ version: 2 }) + getUserVersion2(): User { + const user = new User(); + user.firstName = 'Snir'; + user.lastName = 'Segal'; + user.password = 'imnosuperman'; + user.roles = ['USER', 'MANAGER']; + user.websiteUrl = 'http://www.github.com'; + + return user; + } + } + + const controller = new UserController(); + + const resultV2 = controller.getUserVersion2(); + expect(resultV2.password).toBeUndefined(); + expect(resultV2.roles).toBeUndefined(); + + const plainUserV2 = { + firstName: 'Snir', + lastName: 'Segal', + websiteUrl: 'http://www.github.com', + }; + + expect(resultV2).toEqual(plainUserV2); + + const resultV1 = controller.getUserVersion1(); + expect(resultV1.password).toBeUndefined(); + expect(resultV1.roles).toBeUndefined(); + expect(resultV1.websiteUrl).toBeUndefined(); + + const plainUserV1 = { + firstName: 'Snir', + lastName: 'Segal', + }; + + expect(resultV1).toEqual(plainUserV1); + }); }); diff --git a/test/functional/transformer-order.spec.ts b/test/functional/transformer-order.spec.ts index 1e79df00d..312c587e5 100644 --- a/test/functional/transformer-order.spec.ts +++ b/test/functional/transformer-order.spec.ts @@ -1,28 +1,28 @@ -import "reflect-metadata"; -import { plainToClass } from "../../src/index"; -import { defaultMetadataStorage } from "../../src/storage"; -import { Expose, Transform } from "../../src/decorators"; +import 'reflect-metadata'; +import { plainToClass } from '../../src/index'; +import { defaultMetadataStorage } from '../../src/storage'; +import { Expose, Transform } from '../../src/decorators'; -describe("applying several transformations", () => { +describe('applying several transformations', () => { beforeEach(() => defaultMetadataStorage.clear()); afterEach(() => defaultMetadataStorage.clear()); - it("should keep the order of the applied decorators after several plainToClass() calls", () => { + it('should keep the order of the applied decorators after several plainToClass() calls', () => { class User { - @Transform(() => "Jonathan") - @Transform(() => "John") + @Transform(() => 'Jonathan') + @Transform(() => 'John') @Expose() name: string; } - const firstUser = plainToClass(User, { name: "Joe" }); - expect(firstUser.name).toEqual("John"); + const firstUser = plainToClass(User, { name: 'Joe' }); + expect(firstUser.name).toEqual('John'); // Prior to this pull request [#355](https://github.com/typestack/class-transformer/pull/355) // the order of the transformations was reversed after every `plainToClass()` call // So after consecutive calls `User#name` would be "John" - "Jonathan" - "John" - "Jonathan"... // This test ensures the last transformation is always the last one to be applied - const secondUser = plainToClass(User, { name: "Joe" }); - expect(secondUser.name).toEqual("John"); + const secondUser = plainToClass(User, { name: 'Joe' }); + expect(secondUser.name).toEqual('John'); }); }); From b8f4c47743bc338bb2dcc979664689cfd011378c Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Wed, 29 Jul 2020 21:55:39 +0200 Subject: [PATCH 27/30] build: strip pacakge.json before publishing package --- .github/workflows/continuous-deployment-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous-deployment-workflow.yml b/.github/workflows/continuous-deployment-workflow.yml index 860f77c41..1072536db 100644 --- a/.github/workflows/continuous-deployment-workflow.yml +++ b/.github/workflows/continuous-deployment-workflow.yml @@ -18,7 +18,7 @@ jobs: - run: npm run build - run: cp LICENSE build/LICENSE - run: cp README.md build/README.md - - run: cp package.json build/package.json + - run: jq 'del(.devDependencies) | del(.scripts)' package.json > build/package.json - run: npm publish ./build env: NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} From 9c61afff2aab046c3bfb16d8c437a13f57cab7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20Ol=C3=A1h?= Date: Wed, 29 Jul 2020 22:50:47 +0200 Subject: [PATCH 28/30] refactor: extract TransformationType enum from executor (#380) --- src/ClassTransformer.ts | 3 ++- src/TransformOperationExecutor.ts | 7 +------ src/decorators.ts | 2 +- src/enums/index.ts | 1 + src/enums/transformation-type.enum.ts | 5 +++++ src/metadata/MetadataStorage.ts | 2 +- src/metadata/TransformMetadata.ts | 2 +- test/functional/custom-transform.spec.ts | 2 +- 8 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 src/enums/index.ts create mode 100644 src/enums/transformation-type.enum.ts diff --git a/src/ClassTransformer.ts b/src/ClassTransformer.ts index 521173c17..3ccb1d628 100644 --- a/src/ClassTransformer.ts +++ b/src/ClassTransformer.ts @@ -1,5 +1,6 @@ import { ClassTransformOptions } from './ClassTransformOptions'; -import { TransformOperationExecutor, TransformationType } from './TransformOperationExecutor'; +import { TransformOperationExecutor } from './TransformOperationExecutor'; +import { TransformationType } from './enums'; export type ClassType = { new (...args: any[]): T; diff --git a/src/TransformOperationExecutor.ts b/src/TransformOperationExecutor.ts index 6b10ebfe7..3bc944432 100644 --- a/src/TransformOperationExecutor.ts +++ b/src/TransformOperationExecutor.ts @@ -2,12 +2,7 @@ import { ClassTransformOptions } from './ClassTransformOptions'; import { defaultMetadataStorage } from './storage'; import { TypeHelpOptions, TypeOptions } from './metadata/ExposeExcludeOptions'; import { TypeMetadata } from './metadata/TypeMetadata'; - -export enum TransformationType { - PLAIN_TO_CLASS, - CLASS_TO_PLAIN, - CLASS_TO_CLASS, -} +import { TransformationType } from './enums'; export function testForBuffer(): boolean { try { diff --git a/src/decorators.ts b/src/decorators.ts index a26de57a0..1cadb2cef 100644 --- a/src/decorators.ts +++ b/src/decorators.ts @@ -12,7 +12,7 @@ import { import { ExcludeMetadata } from './metadata/ExcludeMetadata'; import { TransformMetadata } from './metadata/TransformMetadata'; import { ClassTransformOptions } from './ClassTransformOptions'; -import { TransformationType } from './TransformOperationExecutor'; +import { TransformationType } from './enums'; /** * Defines a custom logic for value transformation. diff --git a/src/enums/index.ts b/src/enums/index.ts new file mode 100644 index 000000000..7d356eb5a --- /dev/null +++ b/src/enums/index.ts @@ -0,0 +1 @@ +export * from './transformation-type.enum'; diff --git a/src/enums/transformation-type.enum.ts b/src/enums/transformation-type.enum.ts new file mode 100644 index 000000000..cfc37dd01 --- /dev/null +++ b/src/enums/transformation-type.enum.ts @@ -0,0 +1,5 @@ +export enum TransformationType { + PLAIN_TO_CLASS, + CLASS_TO_PLAIN, + CLASS_TO_CLASS, +} diff --git a/src/metadata/MetadataStorage.ts b/src/metadata/MetadataStorage.ts index 1fc2bfdc4..e1ad6e5a0 100644 --- a/src/metadata/MetadataStorage.ts +++ b/src/metadata/MetadataStorage.ts @@ -1,8 +1,8 @@ import { TypeMetadata } from './TypeMetadata'; import { ExposeMetadata } from './ExposeMetadata'; import { ExcludeMetadata } from './ExcludeMetadata'; -import { TransformationType } from '../TransformOperationExecutor'; import { TransformMetadata } from './TransformMetadata'; +import { TransformationType } from '../enums'; /** * Storage all library metadata. diff --git a/src/metadata/TransformMetadata.ts b/src/metadata/TransformMetadata.ts index b9a6e588d..fa6ca9a33 100644 --- a/src/metadata/TransformMetadata.ts +++ b/src/metadata/TransformMetadata.ts @@ -1,5 +1,5 @@ import { TransformOptions } from './ExposeExcludeOptions'; -import { TransformationType } from '../TransformOperationExecutor'; +import { TransformationType } from '../enums'; export class TransformMetadata { constructor( diff --git a/test/functional/custom-transform.spec.ts b/test/functional/custom-transform.spec.ts index 036b0afc6..79f8885bc 100644 --- a/test/functional/custom-transform.spec.ts +++ b/test/functional/custom-transform.spec.ts @@ -3,7 +3,7 @@ import 'reflect-metadata'; import { classToClass, classToPlain, plainToClass } from '../../src/index'; import { defaultMetadataStorage } from '../../src/storage'; import { Expose, Transform, Type } from '../../src/decorators'; -import { TransformationType } from '../../src/TransformOperationExecutor'; +import { TransformationType } from '../../src/enums'; import dayjs from 'dayjs'; describe('custom transformation decorator', () => { From 9b634f55ea04c7e8d1f9eaed95625cbad176f4fb Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Thu, 30 Jul 2020 00:04:10 +0200 Subject: [PATCH 29/30] docs: add changelog for 0.3.1 --- CHANGELOG.md | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 179af61e9..9abf83765 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,37 @@ -# Changelog and release notes +# Changelog -### 0.2.3 [BREAKING CHANGE] +_This changelog follows the [keep a changelog][keep-a-changelog]_ format to maintain a human readable changelog. + +### [0.3.1][v0.3.1] - 2020-07-29 + +#### Added + +- table of content added to readme + +#### Changed + +- moved from Mocha to Jest +- added Prettier for code formatting +- added Eslint for linting +- updated CI configuration +- removed some unused dev dependencies +- updated dependencies to latest version + +#### Fixed + +- circular dependency fixed +- dev dependencies removed from package.json before publishing (no more security warnings) +- transformer oder is deterministic now (#231) +- fix prototype pollution issue (#367) + +### [0.2.3][v0.2.3] [BREAKING CHANGE] #### Changed - `enableImplicitConversion` has been added and imlplicit value conversion is disabled by default. - reverted #234 - fix: write properties with defined default values on prototype which broke the `@Exclude` decorator. -### 0.2.2 [BREAKING CHANGE] +### [0.2.2][v0.2.2] [BREAKING CHANGE] > **NOTE:** This version is deprecated. @@ -17,7 +41,7 @@ This version has introduced a breaking-change when this library is used with cla - implicity type conversion between values. -### 0.2.1 +### [0.2.1][v0.2.1] > **NOTE:** This version is deprecated. @@ -25,7 +49,7 @@ This version has introduced a breaking-change when this library is used with cla - add option to strip unkown properties via using the `excludeExtraneousValues` option -### 0.2.0 [BREAKING CHANGE] +### [0.2.0][v0.2.0] [BREAKING CHANGE] #### Added @@ -117,3 +141,10 @@ This version has introduced a breaking-change when this library is used with cla - Library has changed its name from `serializer.ts` to `constructor-utils`. - Added `constructor-utils` namespace. + +[v0.3.1]: https://github.com/typestack/class-transformer/compare/v0.2.3...v0.3.1 +[v0.2.3]: https://github.com/typestack/class-transformer/compare/v0.2.2...v0.2.3 +[v0.2.2]: https://github.com/typestack/class-transformer/compare/v0.2.1...v0.2.2 +[v0.2.1]: https://github.com/typestack/class-transformer/compare/v0.2.0...v0.2.1 +[v0.2.0]: https://github.com/typestack/class-transformer/compare/v0.1.10...v0.2.0 +[keep-a-changelog]: https://keepachangelog.com/en/1.0.0/ From ba88a607635c8325971d7c6f8ef6102c71049d39 Mon Sep 17 00:00:00 2001 From: Attila Olah Date: Thu, 30 Jul 2020 00:04:39 +0200 Subject: [PATCH 30/30] build: bump version to 0.3.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2b822ff87..f362453e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "class-transformer", - "version": "0.3.0", + "version": "0.3.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b2ecd24ee..4e11e733f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "class-transformer", - "version": "0.3.0", + "version": "0.3.1", "description": "Proper decorator-based transformation / serialization / deserialization of plain javascript objects to class constructors", "license": "MIT", "readmeFilename": "README.md",