From 8e21c1088e94880e0775dceae551448875f7b759 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Fri, 8 May 2020 10:14:16 -0700 Subject: [PATCH 01/23] chore: wiping the slate clean for a rewrite --- .babelrc | 10 - .circleci/config.yml | 38 - .editorconfig | 11 - .eslintrc.js | 19 - README.md | 38 - bin/posttest.sh | 9 - package-lock.json | 7271 +-------------------------- package.json | 33 +- src/api.js | 97 - src/cli.js | 51 - src/commands/deploy.js | 246 - src/commands/docs.js | 18 - src/commands/help.js | 98 - src/commands/init.js | 139 - src/commands/keys.js | 20 - src/commands/link.js | 68 - src/commands/local.js | 39 - src/commands/login.js | 124 - src/commands/logout.js | 25 - src/commands/logs.js | 38 - src/commands/ls.js | 53 - src/commands/run.js | 64 - src/commands/secret.js | 38 - src/commands/signup.js | 10 - src/commands/unlink.js | 38 - src/commands/update.js | 40 - src/commands/whoami.js | 18 - src/lib/enquirer.js | 14 - src/lib/invoke.js | 50 - src/lib/package-json.js | 76 - src/lib/prompt-message.js | 20 - src/lib/request.js | 68 - src/utils/console.js | 17 - src/utils/exit.js | 7 - src/utils/file-utils.js | 82 - src/utils/handler-utils.js | 90 - src/utils/handler.js | 26 - src/utils/stub.js | 18 - src/utils/utils.js | 218 - test/.eslintrc | 5 - test/api.test.js | 63 - test/babel.js | 8 - test/commands/deploy.test.js | 221 - test/commands/docs.test.js | 12 - test/commands/help.test.js | 15 - test/commands/init.test.js | 136 - test/commands/link.test.js | 63 - test/commands/logout.test.js | 24 - test/commands/run.test.js | 99 - test/commands/secret.test.js | 37 - test/commands/unlink.test.js | 66 - test/commands/update.test.js | 69 - test/commands/whoami.test.js | 24 - test/fixtures/existing-package.json | 12 - test/fixtures/image.JPG | Bin 388834 -> 0 bytes test/fixtures/test.jpg | 0 test/lib/package-json.test.js | 131 - test/mocha.opts | 3 - test/set-node-env.js | 1 - test/utils/doc-fixture.js | 6 - test/utils/file-utils.test.js | 122 - test/utils/handler-utils.test.js | 105 - test/utils/utils.test.js | 97 - 63 files changed, 3 insertions(+), 10655 deletions(-) delete mode 100644 .babelrc delete mode 100644 .circleci/config.yml delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100755 bin/posttest.sh delete mode 100644 src/api.js delete mode 100755 src/cli.js delete mode 100644 src/commands/deploy.js delete mode 100644 src/commands/docs.js delete mode 100644 src/commands/help.js delete mode 100644 src/commands/init.js delete mode 100644 src/commands/keys.js delete mode 100644 src/commands/link.js delete mode 100644 src/commands/local.js delete mode 100644 src/commands/login.js delete mode 100644 src/commands/logout.js delete mode 100644 src/commands/logs.js delete mode 100644 src/commands/ls.js delete mode 100644 src/commands/run.js delete mode 100644 src/commands/secret.js delete mode 100644 src/commands/signup.js delete mode 100644 src/commands/unlink.js delete mode 100644 src/commands/update.js delete mode 100644 src/commands/whoami.js delete mode 100644 src/lib/enquirer.js delete mode 100644 src/lib/invoke.js delete mode 100644 src/lib/package-json.js delete mode 100644 src/lib/prompt-message.js delete mode 100644 src/lib/request.js delete mode 100644 src/utils/console.js delete mode 100644 src/utils/exit.js delete mode 100644 src/utils/file-utils.js delete mode 100644 src/utils/handler-utils.js delete mode 100644 src/utils/handler.js delete mode 100644 src/utils/stub.js delete mode 100644 src/utils/utils.js delete mode 100644 test/.eslintrc delete mode 100644 test/api.test.js delete mode 100644 test/babel.js delete mode 100644 test/commands/deploy.test.js delete mode 100644 test/commands/docs.test.js delete mode 100644 test/commands/help.test.js delete mode 100644 test/commands/init.test.js delete mode 100644 test/commands/link.test.js delete mode 100644 test/commands/logout.test.js delete mode 100644 test/commands/run.test.js delete mode 100644 test/commands/secret.test.js delete mode 100644 test/commands/unlink.test.js delete mode 100644 test/commands/update.test.js delete mode 100644 test/commands/whoami.test.js delete mode 100644 test/fixtures/existing-package.json delete mode 100644 test/fixtures/image.JPG delete mode 100644 test/fixtures/test.jpg delete mode 100644 test/lib/package-json.test.js delete mode 100644 test/mocha.opts delete mode 100644 test/set-node-env.js delete mode 100644 test/utils/doc-fixture.js delete mode 100644 test/utils/file-utils.test.js delete mode 100644 test/utils/handler-utils.test.js delete mode 100644 test/utils/utils.test.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 07f151dc..00000000 --- a/.babelrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "presets": [ - ["env", { - "targets": { - "node": "6.11" - }, - "modules": false - }] - ] -} diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 05c1877d..00000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,38 +0,0 @@ -# Javascript Node CircleCI 2.0 configuration file -# -# Check https://circleci.com/docs/2.0/language-javascript/ for more details -# -version: 2 -jobs: - build: - docker: - # specify the version you desire here - - image: circleci/node:8.4.0 - environment: - CC_TEST_REPORTER_ID: fa769d277e2a189337651f20a6c817d8d546bd2e42ab05d243421ea6f34480c5 - - working_directory: ~/repo - - steps: - - checkout - - # Download and cache dependencies - - restore_cache: - keys: - - v1-dependencies-{{ checksum "package.json" }} - # fallback to using the latest cache if no exact match is found - - v1-dependencies- - - - run: npm install - - - save_cache: - paths: - - node_modules - key: v1-dependencies-{{ checksum "package.json" }} - - # run tests! - - run: curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter - - run: chmod +x ./cc-test-reporter - - run: ./cc-test-reporter before-build - - run: npm test - - run: ./cc-test-reporter after-build -t lcov --exit-code $? \ No newline at end of file diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index f3602775..00000000 --- a/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -root = true - -# Unix-style newlines with a newline ending every file -[*] -end_of_line = lf -insert_final_newline = true - -[*js] -charset = utf-8 -indent_style = space -trim_trailing_whitespace = true diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index a24eea6b..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = { - "extends": "airbnb-base", - "plugins": [ - "import" - ], - "rules": { - "arrow-body-style": 0, - "no-console": "off", - "no-use-before-define": "off", - "global-require": "off", - "import/no-dynamic-require": "off", - "no-restricted-syntax": "off", - "guard-for-in": "off", - "strict": "off", - "no-underscore-dangle": "off", - "prefer-rest-params": "off", - "no-param-reassign": ["error", { "props": false }], - } -}; diff --git a/README.md b/README.md index 977857a8..a1df0ab7 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,2 @@ # api -[![CircleCI](https://circleci.com/gh/readmeio/api.svg?style=svg&circle-token=98043ed3103dabae88fdfed5275742eff4d2df9c)](https://circleci.com/gh/readmeio/api) -The easiest way ever to create an awesome API... no, really. It's as simple as: - -```shell -$ npm install api -g -$ api init -[ Edit files] -$ api deploy -``` - -There's a bunch of stuff below, but seriously... just run those commands above, and see how simple it is! - -## Usage - -With npm: -``` -npm install api -g -``` - -With yarn: -``` -yarn global add api -``` - -This gives you the `api` command line program - -```sh -# Displays usage information -api - -# In a fresh directory -api init -``` - -## Credits -[Dom Harrington](https://github.com/domharrington) - -[Marc Cuva](https://github.com/mjcuva) diff --git a/bin/posttest.sh b/bin/posttest.sh deleted file mode 100755 index 49871167..00000000 --- a/bin/posttest.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -nyc report --reporter=text-summary -nyc report --reporter=lcov -nyc check-coverage --statements 60 --branches 60 --functions 50 --lines 60 - -if [[ $? == 1 ]]; then - echo 'To see the test coverage report: \n\n nyc report --reporter=html && open coverage/index.html\n'; - exit 1 -fi diff --git a/package-lock.json b/package-lock.json index 8d6301fd..0bb6c767 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7274 +1,5 @@ { "name": "api", "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "access-control": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/access-control/-/access-control-1.0.0.tgz", - "integrity": "sha1-rrooLO53MT6FJAFj1p41sp421iY=", - "requires": { - "millisecond": "0.1.2", - "setheader": "0.0.4", - "vary": "1.1.1" - } - }, - "acorn": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "requires": { - "string-width": "2.0.0" - } - }, - "ansi-bgblack": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", - "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgblue": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz", - "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgcyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz", - "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bggreen": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz", - "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgmagenta": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz", - "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgred": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz", - "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgwhite": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz", - "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgyellow": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz", - "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-black": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz", - "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-blue": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz", - "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bold": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz", - "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-colors": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz", - "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=", - "requires": { - "ansi-bgblack": "0.1.1", - "ansi-bgblue": "0.1.1", - "ansi-bgcyan": "0.1.1", - "ansi-bggreen": "0.1.1", - "ansi-bgmagenta": "0.1.1", - "ansi-bgred": "0.1.1", - "ansi-bgwhite": "0.1.1", - "ansi-bgyellow": "0.1.1", - "ansi-black": "0.1.1", - "ansi-blue": "0.1.1", - "ansi-bold": "0.1.1", - "ansi-cyan": "0.1.1", - "ansi-dim": "0.1.1", - "ansi-gray": "0.1.1", - "ansi-green": "0.1.1", - "ansi-grey": "0.1.1", - "ansi-hidden": "0.1.1", - "ansi-inverse": "0.1.1", - "ansi-italic": "0.1.1", - "ansi-magenta": "0.1.1", - "ansi-red": "0.1.1", - "ansi-reset": "0.1.1", - "ansi-strikethrough": "0.1.1", - "ansi-underline": "0.1.1", - "ansi-white": "0.1.1", - "ansi-yellow": "0.1.1", - "lazy-cache": "2.0.2" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-dim": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz", - "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-green": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", - "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-grey": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz", - "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-hidden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz", - "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-inverse": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz", - "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-italic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz", - "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-magenta": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz", - "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-reset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz", - "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-strikethrough": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz", - "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "ansi-underline": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz", - "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-white": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz", - "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" - }, - "ansi-yellow": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz", - "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "any-promise": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", - "integrity": "sha1-gwtoCqflbzNFHUsEnzvYBESY7ic=" - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "archiver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", - "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", - "requires": { - "archiver-utils": "1.3.0", - "async": "2.4.1", - "buffer-crc32": "0.2.13", - "glob": "7.1.2", - "lodash": "4.17.4", - "readable-stream": "2.3.1", - "tar-stream": "1.5.4", - "walkdir": "0.0.11", - "zip-stream": "1.2.0" - } - }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "requires": { - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lazystream": "1.0.0", - "lodash": "4.17.4", - "normalize-path": "2.1.1", - "readable-stream": "2.3.1" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "1.0.3" - } - }, - "arr-flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", - "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "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.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "optional": 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.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "assertion-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", - "dev": true - }, - "async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.4.1.tgz", - "integrity": "sha1-YqVrJ5yYoR0JhwlqAcw+6463u9c=", - "requires": { - "lodash": "4.17.4" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true, - "optional": true - }, - "asyncemit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/asyncemit/-/asyncemit-3.0.1.tgz", - "integrity": "sha1-zD4P4No5tTzBXls6qGFupqcr1Zk=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "babel-cli": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", - "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-polyfill": "6.26.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "chokidar": "1.7.0", - "commander": "2.11.0", - "convert-source-map": "1.5.0", - "fs-readdir-recursive": "1.0.0", - "glob": "7.1.2", - "lodash": "4.17.4", - "output-file-sync": "1.1.2", - "path-is-absolute": "1.0.1", - "slash": "1.0.0", - "source-map": "0.5.7", - "v8flags": "2.1.1" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - } - } - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.0", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - } - } - }, - "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "0.10.1" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "regenerator-runtime": "0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - } - } - }, - "babel-preset-env": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.5.1", - "invariant": "2.2.2", - "semver": "5.3.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.1.tgz", - "integrity": "sha1-s2p/ERE4U6NCoVaR2Y4tzIpswnA=", - "requires": { - "arr-union": "3.1.0", - "cache-base": "0.8.5", - "class-utils": "0.3.5", - "component-emitter": "1.2.1", - "define-property": "0.2.5", - "isobject": "2.1.0", - "lazy-cache": "2.0.2", - "mixin-deep": "1.2.0", - "pascalcase": "0.1.1" - } - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "binary-extensions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", - "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", - "dev": true, - "optional": true - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "requires": { - "readable-stream": "2.3.1" - } - }, - "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.16.3" - } - }, - "boxen": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.0.tgz", - "integrity": "sha512-tfKK3nq0qXXOxvXEYW1k1XNRrDuQzO2oFPvLD3Fs1I58n0leuTNlftBmu3seUCyZvDfiqgRaxlqZs9WJAbSA7g==", - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.0.1", - "cli-boxes": "1.0.0", - "string-width": "2.0.0", - "term-size": "1.2.0", - "widest-line": "1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", - "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", - "requires": { - "ansi-styles": "3.1.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.2.0" - } - }, - "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "requires": { - "color-name": "1.1.2" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "supports-color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.0.tgz", - "integrity": "sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "optional": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserslist": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.5.1.tgz", - "integrity": "sha512-jAvM2ku7YDJ+leAq3bFH1DE0Ylw+F+EQDq4GkqZfgPEqpWYw9ofQH85uKSB9r3Tv7XDbfqVtE+sdvKJW7IlPJA==", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000749", - "electron-to-chromium": "1.3.27" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "build-docs": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/build-docs/-/build-docs-2.2.0.tgz", - "integrity": "sha512-cuiMZTbTiILkD5ZCZOLxOWFwP1gIR4EZqygYQ2nJNxs3B1TN5o5FqgdKsGt8GfSJDryeEZdd3KNuu9r6YKpfUg==", - "requires": { - "comments-parser": "github:readmeio/node-comments-parser#1ea996db8ce36edc6e42bca7f6915a70cfa338b3", - "lodash.template": "4.4.0" - }, - "dependencies": { - "comments-parser": { - "version": "github:readmeio/node-comments-parser#1ea996db8ce36edc6e42bca7f6915a70cfa338b3", - "requires": { - "esprima": "4.0.0" - } - } - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" - }, - "cache-base": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-0.8.5.tgz", - "integrity": "sha1-YM6zUEAh7O7HAR/TOEt/TpVym/o=", - "requires": { - "collection-visit": "0.2.3", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "0.3.1", - "isobject": "3.0.0", - "lazy-cache": "2.0.2", - "set-value": "0.4.3", - "to-object-path": "0.3.0", - "union-value": "0.2.4", - "unset-value": "0.1.2" - }, - "dependencies": { - "isobject": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.0.tgz", - "integrity": "sha1-OVZSF/NmF4nooKDAgNX35rxG4aA=" - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "caniuse-lite": { - "version": "1.0.30000749", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000749.tgz", - "integrity": "sha1-L/OChlrq2MyjXaz7qwT1jv+kwBw=", - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", - "dev": true, - "requires": { - "assertion-error": "1.0.2", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "choices-separator": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/choices-separator/-/choices-separator-0.1.2.tgz", - "integrity": "sha1-3f6Wfse7dkPIWqBQJq+h0F9dcNQ=", - "requires": { - "ansi-gray": "0.1.1", - "debug": "2.6.8", - "repeat-string": "1.6.1" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.2", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "circular-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", - "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=", - "dev": true - }, - "class-utils": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.5.tgz", - "integrity": "sha1-F+eTEDdQ+WJ7IXbqNM/RtWWQPIA=", - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.0", - "lazy-cache": "2.0.2", - "static-extend": "0.1.2" - }, - "dependencies": { - "isobject": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.0.tgz", - "integrity": "sha1-OVZSF/NmF4nooKDAgNX35rxG4aA=" - } - } - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "cli-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=" - }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "requires": { - "for-own": "0.1.5", - "is-plain-object": "2.0.3", - "kind-of": "3.2.2", - "lazy-cache": "1.0.4", - "shallow-clone": "0.1.2" - }, - "dependencies": { - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "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=" - }, - "collection-visit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz", - "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=", - "requires": { - "lazy-cache": "2.0.2", - "map-visit": "0.1.5", - "object-visit": "0.3.4" - } - }, - "color": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/color/-/color-0.8.0.tgz", - "integrity": "sha1-iQwHw/1OZJU3Y4kRz2keVFi2/KU=", - "requires": { - "color-convert": "0.5.3", - "color-string": "0.3.0" - } - }, - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" - }, - "color-name": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz", - "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=" - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "requires": { - "color-name": "1.1.2" - } - }, - "colornames": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-0.0.2.tgz", - "integrity": "sha1-2BH9bIT1kClJmorEQ2ICk1uSvjE=" - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "colorspace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.0.1.tgz", - "integrity": "sha1-yZx5btMRKLmHalLh7l7gOkpxl0k=", - "requires": { - "color": "0.8.0", - "text-hex": "0.0.0" - } - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "compress-commons": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz", - "integrity": "sha1-WFhwku8g03y1i68AARLJJ4/3O58=", - "requires": { - "buffer-crc32": "0.2.13", - "crc32-stream": "2.0.0", - "normalize-path": "2.1.1", - "readable-stream": "2.3.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.1", - "typedarray": "0.0.6" - } - }, - "configstore": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz", - "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=", - "requires": { - "dot-prop": "4.1.1", - "graceful-fs": "4.1.11", - "make-dir": "1.0.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.1.0", - "xdg-basedir": "3.0.0" - } - }, - "connected": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/connected/-/connected-0.0.2.tgz", - "integrity": "sha1-e1dVshbOMf+rzMOOn04d/Bw7fG0=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", - "dev": true - }, - "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=" - }, - "crc": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", - "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "requires": { - "crc": "3.4.4", - "readable-stream": "2.3.1" - } - }, - "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=", - "requires": { - "capture-stack-trace": "1.0.0" - } - }, - "create-server": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/create-server/-/create-server-1.0.1.tgz", - "integrity": "sha1-FkNCg08Yi77Hx7xGZ0Y8wrEwTEQ=", - "requires": { - "connected": "0.0.2" - } - }, - "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=", - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.2.14" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.10.1" - } - }, - "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=" - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.24" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, - "requires": { - "type-detect": "0.1.1" - }, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - } - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.5" - } - }, - "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.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "diagnostics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.0.tgz", - "integrity": "sha1-4QkJALSVI+hSe+IPCBJ1IF8q42o=", - "requires": { - "colorspace": "1.0.1", - "enabled": "1.0.2", - "kuler": "0.0.0" - } - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "dot-prop": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", - "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=", - "requires": { - "is-obj": "1.0.1" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "electron-to-chromium": { - "version": "1.3.27", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", - "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=", - "dev": true - }, - "emits": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emits/-/emits-3.0.0.tgz", - "integrity": "sha1-MnUrupXhcHshlWI4Srm7ix/WL3A=" - }, - "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { - "env-variable": "0.0.3" - } - }, - "end-of-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", - "requires": { - "once": "1.4.0" - } - }, - "enquirer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-0.4.1.tgz", - "integrity": "sha1-fOZxxEz/9jrdHnlxvzK5yz78l+0=", - "requires": { - "choices-separator": "0.1.2", - "clone-deep": "0.2.4", - "collection-visit": "0.2.3", - "component-emitter": "1.2.1", - "debug": "2.6.8", - "extend-shallow": "2.0.1", - "isobject": "2.1.0", - "lazy-cache": "2.0.2", - "promise-reduce": "2.1.0", - "prompt-base": "0.5.2", - "prompt-question": "0.4.1", - "readline-ui": "0.1.4" - } - }, - "env-variable": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.3.tgz", - "integrity": "sha1-uGwWQb5WECZ9UG8YBx6nbXBwl8s=" - }, - "error-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", - "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=" - }, - "es5-ext": { - "version": "0.10.24", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", - "integrity": "sha1-pVh3yZJLwMjZvTwsvhdJWsFwmxQ=", - "dev": true, - "requires": { - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", - "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", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.15.0.tgz", - "integrity": "sha1-vcxqbF/+CBYOe5PAZmlTYqkeMPI=", - "dev": true, - "requires": { - "babel-code-frame": "6.22.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.8", - "doctrine": "1.5.0", - "escope": "3.6.0", - "espree": "3.4.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.3", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.9.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" - } - }, - "eslint-config-airbnb-base": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.1.0.tgz", - "integrity": "sha1-3Js+xwuMdNy+bWJXydo5ksOcoso=", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", - "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", - "dev": true, - "requires": { - "debug": "2.6.8", - "object-assign": "4.1.1", - "resolve": "1.3.3" - } - }, - "eslint-module-utils": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", - "dev": true, - "requires": { - "debug": "2.6.8", - "pkg-dir": "1.0.0" - } - }, - "eslint-plugin-import": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", - "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.2.3", - "eslint-module-utils": "2.1.1", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "pkg-up": "1.0.0" - } - }, - "espree": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", - "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", - "dev": true, - "requires": { - "acorn": "5.1.1", - "acorn-jsx": "3.0.1" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24" - } - }, - "eventemitter3": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", - "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=" - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "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, - "optional": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - }, - "extendible": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/extendible/-/extendible-0.1.1.tgz", - "integrity": "sha1-4qN+2HEp+0+VM+io11BiMKU5yQU=" - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "1.2.2", - "object-assign": "4.1.1" - } - }, - "file-type": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.4.0.tgz", - "integrity": "sha1-KnyU9ioAMBULt9m2xwz6HT51nIY=" - }, - "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, - "optional": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "optional": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - }, - "dependencies": { - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "3.2.2" - } - } - } - }, - "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.1.0", - "pinkie-promise": "2.0.1" - } - }, - "flat-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", - "dev": true, - "requires": { - "circular-json": "0.3.1", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "1.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "forwarded-for": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/forwarded-for/-/forwarded-for-1.0.1.tgz", - "integrity": "sha1-59pIFAJRaP/AoQ0/954UFfRq9Gk=" - }, - "fs-readdir-recursive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", - "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.7.0", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, - "function-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", - "dev": true - }, - "fusing": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fusing/-/fusing-1.0.0.tgz", - "integrity": "sha1-VQwV12r5Jld4qgUezkTUAAoJjUU=", - "requires": { - "emits": "3.0.0", - "predefine": "0.1.2" - } - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "optional": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "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.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "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.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "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=" - }, - "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 - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "1.1.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.1" - } - }, - "ignore": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", - "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "info-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", - "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang=" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true, - "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.1.0", - "figures": "1.7.0", - "lodash": "4.17.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" - }, - "dependencies": { - "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.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - } - }, - "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, - "optional": true, - "requires": { - "binary-extensions": "1.10.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - } - }, - "is-descriptor": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.5.tgz", - "integrity": "sha1-4/uLSrZfOjc3M4jhi0AdeMWMvqc=", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "3.2.2", - "lazy-cache": "2.0.2" - } - }, - "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, - "optional": 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, - "optional": 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=" - }, - "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-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.1" - } - }, - "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-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" - } - }, - "is-my-json-valid": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.3.tgz", - "integrity": "sha1-wVvz5LZrYtcu+vKSWEhmPsvGGbY=", - "requires": { - "isobject": "3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.0.tgz", - "integrity": "sha1-OVZSF/NmF4nooKDAgNX35rxG4aA=" - } - } - }, - "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, - "optional": 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, - "optional": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "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=" - }, - "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "1.0.3" - } - }, - "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-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-windows": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", - "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "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=" - }, - "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.9.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.0.tgz", - "integrity": "sha512-0LoUNELX4S+iofCT8f4uEHIiRBR+c2AINyC8qRWfC6QNruLtxVZRJaPcu/xwMgFIgDxF25tGHaDjvxzJCNE9yw==", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - } - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "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=", - "requires": { - "jsonify": "0.0.0" - } - }, - "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=" - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.5" - } - }, - "koalas": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/koalas/-/koalas-1.0.2.tgz", - "integrity": "sha1-MYQz8HQjXbePrlZhoCqMpT7ilc0=" - }, - "kuler": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-0.0.0.tgz", - "integrity": "sha1-tmu0a5NOVQ9Z2BiEjgq7pPf1VTw=", - "requires": { - "colornames": "0.0.2" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "requires": { - "package-json": "4.0.1" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "0.1.0" - } - }, - "lazy-req": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-2.0.0.tgz", - "integrity": "sha1-yUUKNj7N2i5vDHATKtTzf48G8rQ=" - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { - "readable-stream": "2.3.1" - } - }, - "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" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "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.1", - "lodash.keys": "3.1.2" - } - }, - "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._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._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._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", - "dev": true - }, - "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=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "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.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "requires": { - "lodash._reinterpolate": "3.0.0" - } - }, - "log-ok": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", - "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", - "requires": { - "ansi-green": "0.1.1", - "success-symbol": "0.1.0" - } - }, - "log-utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz", - "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=", - "requires": { - "ansi-colors": "0.2.0", - "error-symbol": "0.1.0", - "info-symbol": "0.1.0", - "log-ok": "0.1.1", - "success-symbol": "0.1.0", - "time-stamp": "1.1.0", - "warning-symbol": "0.1.0" - } - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", - "requires": { - "pify": "2.3.0" - } - }, - "map-visit": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", - "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=", - "requires": { - "lazy-cache": "2.0.2", - "object-visit": "0.3.4" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "millisecond": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/millisecond/-/millisecond-0.1.2.tgz", - "integrity": "sha1-bMWtOGJByrjniv+WT4cCjuyS2sU=" - }, - "mime-db": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" - }, - "mime-types": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "mixin-deep": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.2.0.tgz", - "integrity": "sha1-0CuMb4ttS49ZgtP9AJxJGYUcP+I=", - "requires": { - "for-in": "1.0.2", - "is-extendable": "0.1.1" - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "requires": { - "for-in": "0.1.8", - "is-extendable": "0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "mocha": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.2.0.tgz", - "integrity": "sha1-fcT0XlCIB1FxpoiWgU5q6et6heM=", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.5", - "glob": "7.0.5", - "growl": "1.9.2", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "glob": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", - "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "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" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "nan": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", - "dev": true, - "optional": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nock": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/nock/-/nock-9.0.14.tgz", - "integrity": "sha1-IhFVAlMXPOKYvNifyoJeg4E8pys=", - "dev": true, - "requires": { - "chai": "3.5.0", - "debug": "2.6.8", - "deep-equal": "1.0.1", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "propagate": "0.4.0", - "qs": "6.4.0", - "semver": "5.3.0" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "1.0.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=", - "requires": { - "path-key": "2.0.1" - } - }, - "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=" - }, - "nyc": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-10.1.2.tgz", - "integrity": "sha1-6nrKogojUhAQFgT059VtKEU7AnQ=", - "dev": true, - "requires": { - "archy": "1.0.0", - "arrify": "1.0.1", - "caching-transform": "1.0.1", - "convert-source-map": "1.3.0", - "debug-log": "1.0.1", - "default-require-extensions": "1.0.0", - "find-cache-dir": "0.1.1", - "find-up": "1.1.2", - "foreground-child": "1.5.6", - "glob": "7.1.1", - "istanbul-lib-coverage": "1.0.1", - "istanbul-lib-hook": "1.0.0", - "istanbul-lib-instrument": "1.4.2", - "istanbul-lib-report": "1.0.0-alpha.3", - "istanbul-lib-source-maps": "1.1.0", - "istanbul-reports": "1.0.0", - "md5-hex": "1.3.0", - "merge-source-map": "1.0.3", - "micromatch": "2.3.11", - "mkdirp": "0.5.1", - "resolve-from": "2.0.0", - "rimraf": "2.5.4", - "signal-exit": "3.0.2", - "spawn-wrap": "1.2.4", - "test-exclude": "3.3.0", - "yargs": "6.6.0", - "yargs-parser": "4.2.1" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.1.0", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "bundled": true, - "dev": true - }, - "append-transform": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "requires": { - "default-require-extensions": "1.0.0" - } - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "arr-flatten": "1.0.1" - } - }, - "arr-flatten": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "async": { - "version": "1.5.2", - "bundled": true, - "dev": true - }, - "babel-code-frame": { - "version": "6.20.0", - "bundled": true, - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "2.0.0" - } - }, - "babel-generator": { - "version": "6.21.0", - "bundled": true, - "dev": true, - "requires": { - "babel-messages": "6.8.0", - "babel-runtime": "6.20.0", - "babel-types": "6.21.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6" - } - }, - "babel-messages": { - "version": "6.8.0", - "bundled": true, - "dev": true, - "requires": { - "babel-runtime": "6.20.0" - } - }, - "babel-runtime": { - "version": "6.20.0", - "bundled": true, - "dev": true, - "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.10.1" - } - }, - "babel-template": { - "version": "6.16.0", - "bundled": true, - "dev": true, - "requires": { - "babel-runtime": "6.20.0", - "babel-traverse": "6.21.0", - "babel-types": "6.21.0", - "babylon": "6.15.0", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.21.0", - "bundled": true, - "dev": true, - "requires": { - "babel-code-frame": "6.20.0", - "babel-messages": "6.8.0", - "babel-runtime": "6.20.0", - "babel-types": "6.21.0", - "babylon": "6.15.0", - "debug": "2.6.0", - "globals": "9.14.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.21.0", - "bundled": true, - "dev": true, - "requires": { - "babel-runtime": "6.20.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.2" - } - }, - "babylon": { - "version": "6.15.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.6", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "bundled": true, - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "caching-transform": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "md5-hex": "1.3.0", - "mkdirp": "0.5.1", - "write-file-atomic": "1.3.1" - } - }, - "camelcase": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "cliui": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "commondir": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "core-js": { - "version": "2.4.1", - "bundled": true, - "dev": true - }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "4.0.2", - "which": "1.2.12" - } - }, - "debug": { - "version": "2.6.0", - "bundled": true, - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "debug-log": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "strip-bom": "2.0.0" - } - }, - "detect-indent": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "error-ex": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "esutils": { - "version": "2.0.2", - "bundled": true, - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "bundled": true, - "dev": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "extglob": { - "version": "0.3.2", - "bundled": true, - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "filename-regex": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "bundled": true, - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.6", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "find-cache-dir": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "for-in": { - "version": "0.1.6", - "bundled": true, - "dev": true - }, - "for-own": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "for-in": "0.1.6" - } - }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "4.0.2", - "signal-exit": "3.0.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "glob": { - "version": "7.1.1", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.3", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "bundled": true, - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "9.14.0", - "bundled": true, - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "handlebars": { - "version": "4.0.6", - "bundled": true, - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.7.5" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "bundled": true, - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "has-ansi": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "hosted-git-info": { - "version": "2.1.5", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invariant": { - "version": "2.2.2", - "bundled": true, - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-buffer": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-dotfile": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-glob": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "3.1.0" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "isobject": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "babel-generator": "6.21.0", - "babel-template": "6.16.0", - "babel-traverse": "6.21.0", - "babel-types": "6.21.0", - "babylon": "6.15.0", - "istanbul-lib-coverage": "1.0.1", - "semver": "5.3.0" - } - }, - "istanbul-lib-report": { - "version": "1.0.0-alpha.3", - "bundled": true, - "dev": true, - "requires": { - "async": "1.5.2", - "istanbul-lib-coverage": "1.0.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "rimraf": "2.5.4", - "supports-color": "3.2.3" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "1.0.1", - "mkdirp": "0.5.1", - "rimraf": "2.5.4", - "source-map": "0.5.6" - } - }, - "istanbul-reports": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "handlebars": "4.0.6" - } - }, - "js-tokens": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "jsesc": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "1.1.4" - } - }, - "lazy-cache": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "lodash": { - "version": "4.17.4", - "bundled": true, - "dev": true - }, - "longest": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "js-tokens": "3.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.0", - "bundled": true, - "dev": true - } - } - }, - "lru-cache": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.0.0" - } - }, - "md5-hex": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "merge-source-map": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "source-map": "0.5.6" - } - }, - "micromatch": { - "version": "2.3.11", - "bundled": true, - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.0", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.1.0", - "normalize-path": "2.0.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.3" - } - }, - "minimatch": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.6" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "0.7.2", - "bundled": true, - "dev": true - }, - "normalize-package-data": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "2.1.5", - "is-builtin-module": "1.0.0", - "semver": "5.3.0", - "validate-npm-package-license": "3.0.1" - } - }, - "normalize-path": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "object.omit": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "for-own": "0.1.4", - "is-extendable": "0.1.1" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "parse-glob": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.2", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "requires": { - "error-ex": "1.3.0" - } - }, - "path-exists": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "bundled": true, - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "1.1.2" - } - }, - "preserve": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "randomatic": { - "version": "1.1.6", - "bundled": true, - "dev": true, - "requires": { - "is-number": "2.1.0", - "kind-of": "3.1.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.3.5", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "regenerator-runtime": { - "version": "0.10.1", - "bundled": true, - "dev": true - }, - "regex-cache": { - "version": "0.4.3", - "bundled": true, - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" - } - }, - "repeat-element": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "bundled": true, - "dev": true - }, - "repeating": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve-from": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "right-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.5.4", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.1" - } - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "slide": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "source-map": { - "version": "0.5.6", - "bundled": true, - "dev": true - }, - "spawn-wrap": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "1.5.6", - "mkdirp": "0.5.1", - "os-homedir": "1.0.2", - "rimraf": "2.5.4", - "signal-exit": "2.1.2", - "which": "1.2.12" - }, - "dependencies": { - "signal-exit": { - "version": "2.1.2", - "bundled": true, - "dev": true - } - } - }, - "spdx-correct": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "supports-color": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "3.3.0", - "bundled": true, - "dev": true, - "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" - } - }, - "to-fast-properties": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uglify-js": { - "version": "2.7.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "async": "0.2.10", - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "bundled": true, - "dev": true, - "optional": true - }, - "yargs": { - "version": "3.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "which": { - "version": "1.2.12", - "bundled": true, - "dev": true, - "requires": { - "isexe": "1.1.2" - } - }, - "which-module": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "window-size": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "y18n": { - "version": "3.2.1", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "6.6.0", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "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": "4.2.1" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "cliui": { - "version": "3.2.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - } - } - }, - "yargs-parser": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "bundled": true, - "dev": true - } - } - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - } - }, - "object-visit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", - "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=", - "requires": { - "isobject": "2.1.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, - "optional": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "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", - "wordwrap": "1.0.0" - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" - }, - "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 - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.3.0" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "optional": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "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.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "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", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - }, - "pkg-up": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "predefine": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/predefine/-/predefine-0.1.2.tgz", - "integrity": "sha1-KqkrRJa8H4VU5DpF92v75Q0z038=", - "requires": { - "extendible": "0.1.1" - } - }, - "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 - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "optional": true - }, - "primus": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/primus/-/primus-6.1.0.tgz", - "integrity": "sha1-s79Mk46weHS4crwrDOnA2oVdbBI=", - "requires": { - "access-control": "1.0.0", - "asyncemit": "3.0.1", - "create-server": "1.0.1", - "diagnostics": "1.1.0", - "eventemitter3": "2.0.3", - "forwarded-for": "1.0.1", - "fusing": "1.0.0", - "setheader": "0.0.4", - "ultron": "1.1.0", - "yeast": "0.1.2" - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "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=" - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" - }, - "promise-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/promise-reduce/-/promise-reduce-2.1.0.tgz", - "integrity": "sha1-dxmHMbXGLL1fjhhFUREx0A47bEc=", - "requires": { - "any-promise": "0.1.0" - } - }, - "prompt-base": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/prompt-base/-/prompt-base-0.5.2.tgz", - "integrity": "sha1-vWyPQ1nbWt1OcCgNaOThhFak4kU=", - "requires": { - "base": "0.11.1", - "debug": "2.6.8", - "define-property": "0.2.5", - "log-utils": "0.2.1", - "prompt-question": "0.4.1", - "readline-ui": "0.1.4" - } - }, - "prompt-choices": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/prompt-choices/-/prompt-choices-0.4.1.tgz", - "integrity": "sha1-EfqNWGr4T65DazOSL+88Gp9wLwM=", - "requires": { - "arr-flatten": "1.0.3", - "choices-separator": "0.1.2", - "clone-deep": "0.2.4", - "debug": "2.6.8", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "isobject": "2.1.0", - "kind-of": "3.2.2", - "lazy-cache": "2.0.2", - "log-utils": "0.2.1", - "radio-symbol": "0.2.3", - "set-value": "0.4.3", - "terminal-paginator": "0.2.2", - "toggle-array": "0.1.0" - } - }, - "prompt-list": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/prompt-list/-/prompt-list-0.2.0.tgz", - "integrity": "sha1-SLJtAB/8885r/gEcEnAyTWkNB9Y=", - "requires": { - "debug": "2.6.8", - "log-utils": "0.2.1", - "prompt-base": "0.6.2", - "terminal-paginator": "0.2.2" - }, - "dependencies": { - "base": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/base/-/base-0.13.0.tgz", - "integrity": "sha1-eTnYD1I2M87w3X8PO/rJ1xk2CPk=", - "requires": { - "arr-union": "3.1.0", - "cache-base": "1.0.0", - "class-utils": "0.3.5", - "component-emitter": "1.2.1", - "define-property": "0.2.5", - "isobject": "3.0.0", - "mixin-deep": "1.2.0", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.5" - } - } - } - }, - "cache-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.0.tgz", - "integrity": "sha1-XA9in9F18NIy0l4l49buduZE2Zk=", - "requires": { - "collection-visit": "0.2.3", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "0.3.1", - "isobject": "3.0.0", - "lazy-cache": "2.0.2", - "set-value": "0.4.3", - "to-object-path": "0.3.0", - "union-value": "0.2.4", - "unset-value": "0.1.2" - } - }, - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.0" - }, - "dependencies": { - "is-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.0.tgz", - "integrity": "sha1-1uxobyOPawLyN1er4Sz2suonkPk=", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "3.2.2", - "lazy-cache": "2.0.2" - } - } - } - }, - "isobject": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.0.tgz", - "integrity": "sha1-OVZSF/NmF4nooKDAgNX35rxG4aA=" - }, - "prompt-base": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/prompt-base/-/prompt-base-0.6.2.tgz", - "integrity": "sha1-96S4rN7KKeE36W5QsekdVqGf9pQ=", - "requires": { - "base": "0.13.0", - "debug": "2.6.8", - "define-property": "1.0.0", - "log-utils": "0.2.1", - "prompt-question": "1.0.0", - "readline-ui": "0.1.4" - } - }, - "prompt-choices": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prompt-choices/-/prompt-choices-1.0.1.tgz", - "integrity": "sha1-3VOJ7KcdBeK7T8CDqapmmJ8/LoU=", - "requires": { - "arr-flatten": "1.0.3", - "choices-separator": "0.1.2", - "clone-deep": "0.2.4", - "debug": "2.6.8", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "kind-of": "3.2.2", - "lazy-cache": "2.0.2", - "log-utils": "0.2.1", - "radio-symbol": "1.0.3", - "set-value": "0.4.3", - "strip-color": "0.1.0", - "terminal-paginator": "0.2.2", - "toggle-array": "0.1.0" - } - }, - "prompt-question": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prompt-question/-/prompt-question-1.0.0.tgz", - "integrity": "sha1-IwsZ+iPRykOx4IPe0Cx52km6h2M=", - "requires": { - "clone-deep": "0.2.4", - "debug": "2.6.8", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "kind-of": "3.2.2", - "koalas": "1.0.2", - "lazy-cache": "2.0.2", - "prompt-choices": "1.0.1" - } - }, - "radio-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/radio-symbol/-/radio-symbol-1.0.3.tgz", - "integrity": "sha1-ljN3eo47S+hc8Izuse4aiN1Ivak=", - "requires": { - "ansi-gray": "0.1.1", - "ansi-green": "0.1.1", - "is-windows": "1.0.1" - } - } - } - }, - "prompt-password": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/prompt-password/-/prompt-password-0.1.1.tgz", - "integrity": "sha1-P4BMJV0vOzqtTqeXIUXv8LFN36M=", - "requires": { - "ansi-cyan": "0.1.1", - "ansi-red": "0.1.1", - "prompt-base": "0.5.2" - } - }, - "prompt-question": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/prompt-question/-/prompt-question-0.4.1.tgz", - "integrity": "sha1-UXOOVQXv7UjV/Du9GFq+ST+gJkQ=", - "requires": { - "clone-deep": "0.2.4", - "debug": "2.6.8", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "kind-of": "3.2.2", - "lazy-cache": "2.0.2", - "prompt-choices": "0.4.1" - } - }, - "propagate": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.4.0.tgz", - "integrity": "sha1-8/zKCm/gZzanulcpZgaWF8EwtIE=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" - }, - "radio-symbol": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/radio-symbol/-/radio-symbol-0.2.3.tgz", - "integrity": "sha1-UbfC7uX8/rsmLpqQZe9HvcUrR7k=", - "requires": { - "ansi-gray": "0.1.1", - "ansi-green": "0.1.1", - "is-windows": "1.0.1" - } - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "optional": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - } - }, - "readable-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.1.tgz", - "integrity": "sha512-u6cxIvtbZcjq2HH71Zc/SRBUl7vbv62szIqmqqGpK3HY5J1c0kR/LUzKUpeoFgMzapvVAlBD+QY56ilWmHi4Nw==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.2", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.1", - "set-immediate-shim": "1.0.1" - } - }, - "readline-ui": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/readline-ui/-/readline-ui-0.1.4.tgz", - "integrity": "sha1-QSw3QzVZvBoKexXi3MpLqm2SJ1w=", - "requires": { - "component-emitter": "1.2.1", - "debug": "2.6.8", - "readline-utils": "0.1.6", - "string-width": "2.0.0", - "strip-color": "0.1.0" - } - }, - "readline-utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/readline-utils/-/readline-utils-0.1.6.tgz", - "integrity": "sha1-Op2pqZaJDBfxflQMqJ5FajEhH2c=", - "requires": { - "arr-flatten": "1.0.3", - "cli-width": "2.1.0", - "extend-shallow": "2.0.1", - "get-value": "2.0.6", - "is-number": "3.0.0", - "is-windows": "1.0.1", - "lazy-cache": "2.0.2", - "mute-stream": "0.0.7" - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - }, - "dependencies": { - "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.1" - } - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "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.3.3" - } - }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "optional": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "registry-auth-token": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", - "requires": { - "rc": "1.2.1", - "safe-buffer": "5.1.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "requires": { - "rc": "1.2.1" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=" - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "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.2" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "request-promise": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.1.1.tgz", - "integrity": "sha1-JgIeT29W/Uwwn2vx69jJepWsH7U=", - "requires": { - "bluebird": "3.5.0", - "request-promise-core": "1.1.1", - "stealthy-require": "1.1.1" - } - }, - "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", - "requires": { - "lodash": "4.17.4" - } - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, - "resolve": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", - "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { - "semver": "5.3.0" - } - }, - "set-getter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "requires": { - "to-object-path": "0.3.0" - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true, - "optional": true - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.3", - "to-object-path": "0.3.0" - } - }, - "setheader": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/setheader/-/setheader-0.0.4.tgz", - "integrity": "sha1-km7SjPdiFJYgkx566j8blYFuxpQ=", - "requires": { - "debug": "0.7.4" - }, - "dependencies": { - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" - } - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "requires": { - "is-extendable": "0.1.1", - "kind-of": "2.0.1", - "lazy-cache": "0.2.7", - "mixin-object": "2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "1.1.5" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "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=" - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "7.1.2", - "interpret": "1.0.3", - "rechoir": "0.6.2" - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.16.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz", - "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=", - "requires": { - "safe-buffer": "5.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" - } - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-color": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", - "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=" - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "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=" - }, - "success-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", - "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.4", - "slice-ansi": "0.0.4", - "string-width": "2.0.0" - } - }, - "tar-stream": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", - "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", - "requires": { - "bl": "1.2.1", - "end-of-stream": "1.4.0", - "readable-stream": "2.3.1", - "xtend": "4.0.1" - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "0.7.0" - } - }, - "terminal-paginator": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/terminal-paginator/-/terminal-paginator-0.2.2.tgz", - "integrity": "sha1-6TuGAoorcrhHAIwQAj5ZNbV5mTA=", - "requires": { - "debug": "2.6.8", - "log-utils": "0.2.1" - } - }, - "text-hex": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-0.0.0.tgz", - "integrity": "sha1-V4+8haapJjbkLdF7QdAhjM6esrM=" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" - }, - "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=" - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "3.2.2" - } - }, - "toggle-array": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/toggle-array/-/toggle-array-0.1.0.tgz", - "integrity": "sha1-MFwEaxt7G40dA5jQvrT+mhnxNPs=", - "requires": { - "isobject": "2.1.0" - } - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "requires": { - "punycode": "1.4.1" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": 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" - } - }, - "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "ultron": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", - "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=" - }, - "union-value": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz", - "integrity": "sha1-c3UVJ4ZnkFfns3qmdug0aPwCdPA=", - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - } - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "requires": { - "crypto-random-string": "1.0.0" - } - }, - "unset-value": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz", - "integrity": "sha1-UGgQuGfyfCpabpsEgzYx9t5Y0xA=", - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.0.tgz", - "integrity": "sha1-OVZSF/NmF4nooKDAgNX35rxG4aA=" - } - } - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, - "update-notifier": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.1.0.tgz", - "integrity": "sha1-7AweU1NrdmR6JLd8uDlm2TFRI9k=", - "requires": { - "boxen": "1.2.0", - "chalk": "1.1.3", - "configstore": "3.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "lazy-req": "2.0.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - } - }, - "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=", - "requires": { - "prepend-http": "1.0.4" - } - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "1.1.1" - }, - "dependencies": { - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - } - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "requires": { - "builtins": "1.0.3" - } - }, - "vary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", - "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "requires": { - "extsprintf": "1.0.2" - } - }, - "walkdir": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", - "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=" - }, - "warning-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", - "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=" - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "requires": { - "isexe": "2.0.0" - } - }, - "widest-line": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", - "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", - "requires": { - "string-width": "1.0.2" - }, - "dependencies": { - "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=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "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=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "0.5.1" - } - }, - "write-file-atomic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", - "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==", - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", - "requires": { - "options": "0.0.6", - "ultron": "1.0.2" - }, - "dependencies": { - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" - } - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "requires": { - "archiver-utils": "1.3.0", - "compress-commons": "1.2.0", - "lodash": "4.17.4", - "readable-stream": "2.3.1" - } - } - } + "lockfileVersion": 1 } diff --git a/package.json b/package.json index d62938f0..3786075e 100644 --- a/package.json +++ b/package.json @@ -23,35 +23,6 @@ }, "author": "ReadMe.io", "license": "ISC", - "dependencies": { - "archiver": "^1.3.0", - "build-docs": "2.2.0", - "call-me-maybe": "^1.0.1", - "colors": "^1.1.2", - "enquirer": "^0.4.1", - "file-type": "^7.4.0", - "glob": "^7.1.1", - "minimist": "^1.2.0", - "primus": "6.1.0", - "progress": "1.1.8", - "prompt-list": "^0.2.0", - "prompt-password": "^0.1.1", - "request": "2.81.0", - "request-promise": "4.1.1", - "semver": "^5.3.0", - "tough-cookie": "^2.3.2", - "update-notifier": "2.1.0", - "validate-npm-package-name": "^3.0.0", - "ws": "1.1.2" - }, - "devDependencies": { - "babel-cli": "^6.26.0", - "babel-preset-env": "^1.6.1", - "eslint": "3.15.0", - "eslint-config-airbnb-base": "11.1.0", - "eslint-plugin-import": "2.2.0", - "mocha": "3.2.0", - "nock": "9.0.14", - "nyc": "10.1.2" - } + "dependencies": {}, + "devDependencies": {} } diff --git a/src/api.js b/src/api.js deleted file mode 100644 index ab65d9d6..00000000 --- a/src/api.js +++ /dev/null @@ -1,97 +0,0 @@ -const path = require('path'); -const maybe = require('call-me-maybe'); -require('colors'); - -const { baseLinks } = require('./commands/link'); -const utils = require('./utils/utils'); -const { parseLocalFileResponse, convertToFileType, file } = require('./utils/file-utils'); -const console = require('./utils/console'); -const invoke = require('./lib/invoke'); - -const linksPath = path.join(utils.sharedDirectoryPath(), 'links.json'); - -const scope = {}; - -module.exports.config = (apiKey) => { - scope.key = apiKey; - - function setService(service) { - scope.service = service; - return api; - } - return Object.assign(setService.bind(scope), api); -}; - -const api = { - run(action, d, opts, cb) { - if (scope.key && scope.key.startsWith('demo')) { - return maybe(cb, new Promise((resolve) => { - console.log('This is a demo API key!'.red); - console.log('To get your own, run:'); - console.log(''); - console.log(` ${'$'.grey} ${'api signup'.yellow}`); - console.log(''); - - return resolve(); - })); - } - - // Can't reassign params - let data = d; - let callback = cb; - - // Make outputs an optional parameter - if (typeof opts === 'function') { - callback = opts; - } - - // If no data is passed in, default to {} - if (typeof data === 'function') { - callback = data; - data = {}; - } else if (!data) { - data = {}; - } - - // Don't call api if there is a local link - const localLinks = utils.fileExists(linksPath) ? require(linksPath) : baseLinks; - if (localLinks.services[scope.service] && localLinks.directories[process.cwd()].length) { - const handler = require(path.join(process.cwd(), 'node_modules/api/src/utils/handler.js')); - const errors = utils.buildErrors(localLinks.services[scope.service]); - - const event = { - name: action, - data, - pathOverride: localLinks.services[scope.service], - errors, - }; - - console.log(`Running ${scope.service} from ${localLinks.services[scope.service]}`.yellow); - - return maybe(callback, new Promise(async (resolve, reject) => { - event.data = await convertToFileType(event.data); - - handler.go(event, undefined, (err, response) => { - if (err) return reject(err); - - return resolve(parseLocalFileResponse(JSON.stringify(response))); - }); - })); - } - - return maybe(callback, new Promise((resolve, reject) => { - return invoke(scope.key, scope.service, action, data, opts).then((response) => { - return resolve(response); - }).catch((err) => { - return reject(err); - }); - })); - }, - file, -}; - -module.exports.file = file; - -/* - * docsTest: This is an example for docs.test.js - */ diff --git a/src/cli.js b/src/cli.js deleted file mode 100755 index f2beab37..00000000 --- a/src/cli.js +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env node - -const parseArgs = require('minimist')(process.argv.slice(2)); -const path = require('path'); -require('colors'); -const updateNotifier = require('update-notifier'); -const pkg = require('../package.json'); - -const utils = require('./utils/utils'); - -// Notifies the user if there is an update to the api module -updateNotifier({ pkg }).notify(); - -// --verson and -v -if (parseArgs.version || parseArgs.v) { - console.log(pkg.version); - if (process.env.BUILD_HOST) console.log(`BUILD_HOST: ${utils.BUILD_URL}`); - process.exit(0); -} - -const args = parseArgs._; -const action = load(args[0]); - -// -t readme and --team readme work -if (parseArgs.t && !parseArgs.team) { - parseArgs.team = parseArgs.t; -} - -try { - action.run(args, parseArgs); -} catch (e) { - console.error(`Error running \`${args[0]}\`:\n\n `, e.message.red, '\n'); -} - -function load(verb = 'help') { - let file = path.join(__dirname, 'commands', `${verb}.js`); - - if (utils.fileExists(file)) { - return require(file); - } - - const alias = utils.getAliasFile(verb); - if (alias) { - file = path.join(__dirname, 'commands', `${alias}.js`); - return require(file); - } - - console.log('Command not found.'.red); - console.log(`Type ${'api help'.yellow} to see all commands`); - return process.exit(); -} diff --git a/src/commands/deploy.js b/src/commands/deploy.js deleted file mode 100644 index 20a0e13a..00000000 --- a/src/commands/deploy.js +++ /dev/null @@ -1,246 +0,0 @@ -module.exports.usage = `Deploys a service to build - -Usage: api deploy`; - -module.exports.weight = 2; - -module.exports.category = 'basic'; - -const validName = require('validate-npm-package-name'); -const archiver = require('archiver'); -const semver = require('semver'); -const fs = require('fs'); -const request = require('../lib/request'); -const buildDocs = require('build-docs'); -const path = require('path'); -const createEnquirer = require('../lib/enquirer'); -const ProgressBar = require('progress'); -const utils = require('../utils/utils'); -const exit = require('../utils/exit'); - -const readmePath = path.join(process.cwd(), 'readme.md'); -const zipDir = path.join(utils.cacheDir(), 'output.zip'); -const enquirer = createEnquirer(); - -function fetchDeployedVersion(packageJson) { - let deployed = { versions: [] }; - let hasDeployedVersion = false; - - // Pass in team as a query string if this is a private package - const qs = packageJson.get('team') ? { team: packageJson.get('team') } : null; - - return request.get(`/services/${packageJson.get('name')}`, { defaultErrorHandler: false, qs }) - .then((response) => { - deployed = JSON.parse(response); - hasDeployedVersion = deployed.versions.some(version => version.version === packageJson.get('version')); - - if (hasDeployedVersion) { - console.log(`\nv${packageJson.get('version')} has already been deployed.`.red); - } - - return { deployed, hasDeployedVersion }; - }).catch((err) => { - if (err && err.statusCode !== 404) throw err; - - return { deployed, hasDeployedVersion }; - }); -} - -module.exports.fetchDeployedVersion = fetchDeployedVersion; - -function fetchTeams() { - return request.get('/teams').then(response => JSON.parse(response)); -} - -module.exports.run = () => { - const packageJson = require('../lib/package-json')(); - const valid = validName(packageJson.get('name')); - if (!valid.validForNewPackages) { - console.log('Invalid Package Name'.red); - return undefined; - } - - return Promise.all([fetchDeployedVersion(packageJson), fetchTeams()]) - .then((results) => { - const { deployed, hasDeployedVersion } = results[0]; - const teams = results[1]; - - enquirer - .ask(module.exports.questions(deployed.versions, hasDeployedVersion, teams)) - .then(module.exports.deploy.bind(null, packageJson, teams[0])); - }).catch(request.errorHandler); -}; - -function prepareDeploy(packageJson, defaultTeam, answers) { - if (answers.private && answers.private.includes('private')) { - packageJson.set('name', `@${answers.team || defaultTeam.name}/${packageJson.get('name')}`); - } - - if (answers.version) { - packageJson.set('version', answers.version); - } - - // If there is a team answer, then this must be a newly deployed - // service, so persist it to the package.json - if (answers.team) { - packageJson.set('team', answers.team, { build: true }); - } else if (!packageJson.has('team', { build: true })) { - packageJson.set('team', defaultTeam.name, { build: true }); - } -} - -module.exports.prepareDeploy = prepareDeploy; - -module.exports.deploy = (packageJson, defaultTeam, answers) => { - prepareDeploy(packageJson, defaultTeam, answers); - - const output = fs.createWriteStream(zipDir); - const archive = archiver('zip', { store: true }); - - console.log(`Deploying version: ${packageJson.get('version')}`.green); - console.log('Converting to travel size...'); - - const readme = utils.fileExists(readmePath) ? fs.readFileSync(readmePath, 'utf8') : false; - - if (!readme) { - console.warn('No readme.md file is present'.yellow); - } - - // listen for all archive data to be written - output.on('close', () => { - console.log('Flying up to the cloud...'); - - const req = request.post('/services/', { resolveWithFullResponse: true, sendRequest: false }); - const form = req.form(); - - let docs; - try { - docs = buildDocs.parseDirectory(path.join(process.cwd(), 'endpoints')); - } catch (e) { - console.error(`\nError generating documentation: ${e.message.red}\n`); - exit(1); - } - - // Check if user edited the documentation - // We want to force people to at least delete the stub - const unchangedDocs = utils.getUnchangedDocs(docs); - if (unchangedDocs.length) { - console.error('\nThe comments in your endpoints are important!'.red); - console.error('\nThey are used to generate documentation and inform Build about your code.\n\nEdit the comments in the following files to deploy:\n'); - for (const doc of unchangedDocs) { - console.error(`endpoints/${doc}.js\n`.green); - } - exit(1); - } - - form.append('version', packageJson.get('version')); - form.append('name', packageJson.get('name')); - form.append('docs', JSON.stringify(docs)); - form.append('readme', readme || ''); - form.append('team', packageJson.get('team')); - form.append('service', fs.createReadStream(zipDir), { - filename: `${packageJson.get('name')}.zip`, - contentType: 'application/zip', - }); - - let progressBar; - - // get upload size - form.getLength((err, size) => { - progressBar = new ProgressBar('Uploading [:bar] :percent :etas', { - total: size, - complete: '=', - incomplete: ' ', - width: 50, - }); - }); - - // calculate uploaded size chunk by chunk - form.on('data', (data) => { - progressBar.tick(data.length); - }); - - req.then((res) => { - console.log('Cleaning up...'); - fs.unlinkSync(zipDir); - - console.log('Persisting changes back to package.json'); - packageJson.write(); - - const url = res.headers.location.replace(/www\./, ''); - console.log(`\n🎉 ${'Success!'.green} Your API is deployed!`); - console.log(`\nSee the documentation: ${url.cyan.underline}`); - }).catch(request.errorHandler); - }); - - archive.on('error', (err) => { - console.error('Error during upload', err); - }); - - archive.pipe(output); - - const handler = path.join(__dirname, '../utils/handler.js'); - const handlerUtils = path.join(__dirname, '../utils/handler-utils.js'); - archive.append(fs.createReadStream(handler), { name: 'handler.js' }); - archive.append(fs.createReadStream(handlerUtils), { name: 'handler-utils.js' }); - archive.append(`module.exports = ${JSON.stringify(utils.buildErrors())}`, { name: '_errors.js' }); - - archive.glob('**'); - - archive.finalize(); -}; - -module.exports.questions = (versions, hasDeployedVersion, teams) => { - const packageJson = require('../lib/package-json')(); - let newVersion; - try { - // Increment minor if it ends with a 0, or patch if there's already a patch - newVersion = semver.inc(packageJson.get('version'), ( - packageJson.get('version').split('.')[2] === '0' ? - 'minor' : 'patch')); - } catch (e) { - // Carry on! - } - - const questions = [{ - type: 'input', - name: 'version', - message: 'What version do you want to deploy?', - default: newVersion, - // Ask what version to deploy if this version has already - // been deployed once - when: () => hasDeployedVersion, - validate: (v) => { - if (!semver.valid(v)) { - return `${v} is not a valid semver version`; - } - - if (versions.find(version => version === v)) { - return `Version ${v} has already been deployed.`; - } - return true; - }, - }]; - - // Checking for `build.team` and only asking if unset - if (!packageJson.has('team', { build: true })) { - questions.push({ - type: 'list', - name: 'private', - message: 'Is your service public or private?', - choices: module.exports.privateChoices, - }); - - questions.push({ - type: 'list', - name: 'team', - message: 'Which team should this service be deployed to?', - choices: teams.map(t => t.name), - when: () => teams.length > 1, - }); - } - - return questions; -}; - -module.exports.privateChoices = ['public (free)', 'private (requires paid plan)']; diff --git a/src/commands/docs.js b/src/commands/docs.js deleted file mode 100644 index d7c74bfc..00000000 --- a/src/commands/docs.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports.usage = `Generate the docs that will be shown on the build website - -Usage: api docs - -Outputs the docs which display on the website. Generated using https://github.com/readmeio/build-docs`; - -const path = require('path'); - -const console = require('../utils/console'); -const exit = require('../utils/exit'); -const buildDocs = require('build-docs'); - -module.exports.run = () => { - const docs = buildDocs.parseDirectory(path.join(process.cwd(), 'endpoints')); - // console.log('Generated docs for', main.green, '\n'); - console.log(require('util').inspect(docs, { depth: null })); - return exit(0); -}; diff --git a/src/commands/help.js b/src/commands/help.js deleted file mode 100644 index 1bf34fd8..00000000 --- a/src/commands/help.js +++ /dev/null @@ -1,98 +0,0 @@ -module.exports.usage = 'Displays this usage information'; -module.exports.category = 'utility'; -module.exports.weight = 1; - -const fs = require('fs'); -const path = require('path'); - -const console = require('../utils/console'); -const exit = require('../utils/exit'); - -const commands = fs.readdirSync(__dirname).map(getAliases).filter(Boolean); - -function getAliases(file) { - if (!file.match(/.js$/)) return undefined; - const command = require(path.join(__dirname, file)); - return { - cmd: file.replace('.js', ''), - shortUsage: (command.usage || '').split('\n')[0], - usage: (command.usage || ''), - category: (command.category || ''), - weight: (command.weight || 100), - }; -} - -function singleUsage(command) { - console.log(command.usage || `\`${command.cmd}\` Not yet documented`); - return exit(0); -} - -module.exports.run = (args) => { - console.log(''); - console.log('Usage: api '); - - if (args && args[1]) { - const command = commands.find(cmd => args[1] === cmd.cmd); - if (command) return singleUsage(command); - } - - const categories = { - basic: { - desc: 'Commands for getting started', - commands: [], - }, - using: { - desc: 'Run APIs in the command line', - commands: [], - }, - utility: { - desc: 'Utility functions', - commands: [], - }, - }; - - const pad = text => `${text} `.substr(0, 15); - - commands.forEach((cmd) => { - if (cmd.category) { - categories[cmd.category].commands.push({ - text: ` ${'$'.grey} ${pad(`api ${cmd.cmd}`)} ${cmd.shortUsage ? cmd.shortUsage.grey : ''}`, - weight: cmd.weight, - }); - } - }); - - for (const cat in categories) { - const category = categories[cat]; - console.log(''); - console.log(category.desc); - category.commands.sort((a, b) => a.weight - b.weight); - category.commands.forEach(command => console.log(command.text)); - } - - console.log(''); - console.log(`Learn more with ${'api help '.yellow}`.grey); - console.log(''); - - let existingPackageJson; - try { - existingPackageJson = require(path.join(process.cwd(), 'package.json')); - } catch (e) { - existingPackageJson = {}; - } - - const alreadySetup = existingPackageJson.dependencies && existingPackageJson.dependencies.api; - - if (alreadySetup) { - console.log('Ready to deploy?'.green); - console.log(`Run ${'api deploy'.yellow} to upload your API!`); - console.log(''); - } else { - console.log('Just getting started?'.green); - console.log(`Run ${'api init'.yellow} to set up your new API!`); - console.log(''); - } - - return exit(0); -}; - diff --git a/src/commands/init.js b/src/commands/init.js deleted file mode 100644 index 68c6e96f..00000000 --- a/src/commands/init.js +++ /dev/null @@ -1,139 +0,0 @@ -module.exports.usage = `Set up a new service - -Usage: api init - -Asks a series of questions which will be used to generate a new service in the current directory`; - -module.exports.category = 'basic'; -module.exports.weight = 1; - -require('colors'); -const fs = require('fs'); -const path = require('path'); -const semver = require('semver'); -const utils = require('../utils/utils'); -const validName = require('validate-npm-package-name'); -const createEnquirer = require('../lib/enquirer'); -const packageJson = require('../lib/package-json'); -const exit = require('../utils/exit'); - -module.exports.run = () => { - const enquirer = createEnquirer(); - - console.log(''); - console.log('Let\'s create your new API!'.cyan); - console.log(''); - console.log('ReadMe Build is a really, really simple way to create awesome APIs.'); - console.log(`Learn more at ${'https://readme.build'.underline}`.grey); - console.log(''); - - let existingPackageJson; - - try { - existingPackageJson = require(path.join(process.cwd(), 'package.json')); - } catch (e) { - existingPackageJson = {}; - } - - return enquirer.ask(module.exports.questions(existingPackageJson)).then(module.exports.init); -}; - -module.exports.questions = (existingPackageJson) => { - return [ - { - type: 'input', - name: 'name', - message: 'Name your service', - default: existingPackageJson.name || path.basename(process.cwd()).toLowerCase(), - validate: (input) => { - const valid = validName(input); - if (!valid.validForNewPackages) { - // npms package used to allow this, so the warning - // isn't very good for our case - return (valid.errors || valid.warnings.map(warning => warning.replace('can no longer', 'cannot'))).join('\n'); - } - return true; - }, - }, - { - type: 'input', - name: 'version', - message: 'Version number', - default: existingPackageJson.version || '0.0.1', - validate: (v) => { - if (!semver.valid(v)) { - return `${v} is not a valid semver version`; - } - return true; - }, - }, - { - type: 'input', - name: 'action', - message: 'What is the name of your first endpoint?', - default: 'helloWorld', - }, - { - type: 'list', - name: 'continue', - message: 'It seems like there are already files here. Do you want to create a new directory?', - choices: ['yes', 'no', 'abort'], - when: () => fs.readdirSync(process.cwd()).length, - }, - ]; -}; - -module.exports.init = (answers) => { - if (answers.continue === 'abort') { - exit(0); - } - - const data = fs.readFileSync(path.join(__dirname, '../utils/stub.js'), 'utf8'); - const stub = data.replace(/<>/g, answers.action); - - let chdirMessage = ''; - if (answers.continue === 'yes') { - const newPath = `./${answers.name}`; - fs.mkdirSync(newPath); - process.chdir(newPath); - chdirMessage = `\n ${'$'.grey} ${'cd'.yellow} ${answers.name.yellow}\n`; - } - - fs.mkdirSync('./endpoints'); - fs.writeFileSync(`./endpoints/${answers.action}.js`, stub); - - // Need to initialise the package.json object down here - // so that process.cwd() is different in tests - const pjson = packageJson(); - pjson.set('name', answers.name); - pjson.set('version', answers.version); - pjson.write(); - - // Only add a readme if one does not exist - if (!fs.existsSync('readme.md')) { - fs.writeFileSync('readme.md', `# ${answers.name}\n\nWelcome to ${answers.name}\n`); - } - - if (process.env.NODE_ENV === 'testing') { - return undefined; - } - - const filename = `./endpoints/${answers.action}.js`; - - const name = (utils.getGitConfig('user.name') || 'Julie').split(' ')[0]; - - return console.log(`\n${'============================='.grey} - -${'Great! We\'ve set up your api!'.green} - -1. Try running it locally first: - ${chdirMessage} - ${'$'.grey} ${(`api local ${answers.action} name=${name}`).yellow} - -2. Edit ${filename.cyan} and build your API! - -3. When you're ready to release, run: - - ${'$'.grey} ${('api deploy').yellow} -`); -}; diff --git a/src/commands/keys.js b/src/commands/keys.js deleted file mode 100644 index 811c646f..00000000 --- a/src/commands/keys.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports.usage = `List your API keys - -Usage: api keys -`; - -const request = require('request-promise'); - -const utils = require('../utils/utils'); - -module.exports.category = 'utility'; - -module.exports.run = () => { - const jar = utils.getJar(); - request(`${utils.BUILD_URL}/users/me`, { jar }).then((user) => { - const userParsed = JSON.parse(user); - for (const team of userParsed.teams) { - console.log(`${team.name.cyan}: ${team.key}`); - } - }); -}; diff --git a/src/commands/link.js b/src/commands/link.js deleted file mode 100644 index 6302bd8d..00000000 --- a/src/commands/link.js +++ /dev/null @@ -1,68 +0,0 @@ -/* Link file format: - - ~/.readme-build/links.json - - { - services: { // Services linked globally that are available - math: '~/Desktop/math/', - }, - directories: { // Services that the consumer have linked - '~/Desktop/consumer/': ['math'], - }, - } -*/ - - -module.exports.usage = `Run services in code from local computer - -Usage: - api link # Allows service to be run locally from code - api link math # Allows service math to be run from current directory -`; - -module.exports.category = 'utility'; - -const utils = require('../utils/utils'); -const path = require('path'); -const fs = require('fs'); - -const packageJson = require('../lib/package-json'); - -module.exports.baseLinks = { services: {}, directories: {} }; - -module.exports.run = (args) => { - // Creates .readme-build in the home directory if it doesn't exist - utils.setupSharedDirectory(); - - const linksPath = path.join(utils.sharedDirectoryPath(), 'links.json'); - - const pjsonName = packageJson().get('name'); - - const links = utils.fileExists(linksPath) ? require(linksPath) : module.exports.baseLinks; - - // Setting up linked service `api link` - if (args.length === 1) { - links.services[pjsonName] = process.cwd(); - try { - fs.writeFileSync(linksPath, JSON.stringify(links)); - console.log('Local link added!'); - const greenString = `api link ${pjsonName}`.green; - console.log(`Run ${greenString} to use in another project`); - } catch (err) { - console.error(err); - } - } else if (links.services[args[1]]) { // check we know about service trying to be linked - if (!links.directories[process.cwd()]) { - links.directories[process.cwd()] = []; - } - links.directories[process.cwd()].push(args[1]); - try { - fs.writeFileSync(linksPath, JSON.stringify(links)); - console.log(`Link added! Calls to ${args[1]} will be made locally.`); - } catch (err) { - console.error(err); - } - } else { - console.log(`You need to run ${'`api link`'.green} in your service directory first!`); // TODO: come up with better message - } -}; diff --git a/src/commands/local.js b/src/commands/local.js deleted file mode 100644 index 1202eb38..00000000 --- a/src/commands/local.js +++ /dev/null @@ -1,39 +0,0 @@ -module.exports.usage = `Run a service locally - -Usage: api local [arg1=val1, arg2=val2...argn=valn] - -Runs your api locally. Useful for testing changes before deploying`; - -module.exports.category = 'using'; -module.exports.weight = 2; - -const utils = require('../utils/utils'); -const { convertToFileType } = require('../utils/file-utils'); -const handler = require('../utils/handler'); - -module.exports.aliases = ['invoke-local', 'dev']; - -module.exports.run = async (args) => { - let data = utils.parseArgs(args.splice(2)); - - data = await convertToFileType(data); - - const errors = utils.buildErrors(); - - const event = { - name: args[1], - data, - errors, - }; - - handler.go(event, undefined, (err, response) => { - if (err) { - const parsedError = JSON.parse(err); - console.log(parsedError); - } else if (Buffer.isBuffer(response)) { - process.stdout.write(response); - } else { - console.log(response); - } - }); -}; diff --git a/src/commands/login.js b/src/commands/login.js deleted file mode 100644 index c2f30281..00000000 --- a/src/commands/login.js +++ /dev/null @@ -1,124 +0,0 @@ -module.exports.usage = `Login to Build - -Usage: api login`; - -module.exports.weight = 3; - -const createEnquirer = require('../lib/enquirer'); -const request = require('request-promise'); -const fs = require('fs'); -const utils = require('../utils/utils'); - -const proxyUrl = utils.BUILD_URL; -const enquirer = createEnquirer(); - -module.exports.aliases = ['signup']; - -module.exports.category = 'utility'; - -let action; - -const getEmail = (args) => { - action = args[0]; - if (utils.fileExists(utils.credPath)) { - console.log(`You are already logged in. Run ${'api logout'.green} switch accounts.`); - } else { - enquirer - .ask({ - type: 'input', - name: 'email', - message: 'Enter your email address', - default: utils.getGitConfig('user.email'), - }) - .then(getToken) - .catch(console.log); - } -}; - -const getToken = (input) => { - request.post(`${proxyUrl}/users/action`, { - json: true, - body: input, - }).then((res) => { - if (res === 'signup') { - if (action !== 'signup') console.log('It seems like you need to sign up!'); - enquirer - .ask([ - { - type: 'input', - name: 'username', - message: 'Enter a username', - default: utils.makeUsername(), - }, - ]).then((u) => { - getPassword().then(p => signup(input.email, u.username, p.password, p.inviteCode)); - }).catch(console.log); - } else if (res === 'login' && action !== 'signup') { - getPassword().then(p => login(input.email, p.password)).catch(console.log); - } else { - console.log(`An account already exists with that email. Run ${'api login'.green} to log in!`); - } - }); -}; - -const getPassword = () => { - return enquirer - .ask({ - type: 'password', - name: 'password', - message: 'Enter your password', - }); -}; - -const signup = (email, username, password, inviteCode) => { - request.post(`${proxyUrl}/users`, { - json: true, - body: { - email, - username, - password, - inviteCode, - }, - }).then(() => login(email, password)).catch((res) => { - if (res.error.errors.password) { - console.log(res.error.errors.password.red); - } else { - console.log(res.error.error); - } - }); -}; - -const j = request.jar(); -function saveCookie() { - utils.setupSharedDirectory(); - fs.writeFile(utils.credPath, JSON.stringify(j._jar), (err) => { - if (err) console.log(err); - if (action === 'signup') { - console.log('Account Created!'.green); - console.log(''); - - // For people who run the demo code, and are sent this way - console.log('To see your API keys, run:'); - console.log(''); - console.log(` ${'$'.grey} ${'api keys'.yellow}`); - console.log(''); - } else { - console.log('Successfully Logged In!'.green); - } - }); -} - -const login = (email, password) => { - request.post(`${proxyUrl}/login/cli`, { - json: true, - jar: j, - body: { - usermail: email, - password, - }, - }).then(saveCookie).catch((res) => { - console.log(res.error.error.red); - }); -}; - -module.exports.run = getEmail; diff --git a/src/commands/logout.js b/src/commands/logout.js deleted file mode 100644 index 36ae10f9..00000000 --- a/src/commands/logout.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports.usage = `Logout the current user - -Usage: api logout`; -module.exports.weight = 4; - -module.exports.category = 'utility'; - -const fs = require('fs'); - -const request = require('../lib/request'); -const console = require('../utils/console'); - -const { credPath } = require('../utils/utils'); - -module.exports.run = () => { - return request.post('/logout').then(() => { - console.log('You have been logged out.'); - - try { - fs.unlinkSync(credPath); - } catch (e) { - // - } - }); -}; diff --git a/src/commands/logs.js b/src/commands/logs.js deleted file mode 100644 index d49a6bdb..00000000 --- a/src/commands/logs.js +++ /dev/null @@ -1,38 +0,0 @@ -module.exports.usage = `See recent logs - -Usage: api logs -`; -require('colors'); -const Primus = require('primus'); -const request = require('request-promise'); - -const utils = require('../utils/utils'); - -module.exports.category = 'using'; - -module.exports.run = () => { - const Socket = Primus.createSocket(); - const client = Socket(utils.WS_URL); - - const jar = utils.getJar(); - - client.on('open', () => { - console.log('Tailing logs...'.green); - request(`${utils.BUILD_URL}/users/me`, { jar }).then((user) => { - const parsedUser = JSON.parse(user); - client.write({ action: 'join', room: parsedUser.teams[0]._id }); - }); - }); - - client.on('data', (data) => { - console.log.apply(undefined, data); - }); - - client.on('end', () => { - client.end(); - }); - - client.on('error', () => { - client.end(); - }); -}; diff --git a/src/commands/ls.js b/src/commands/ls.js deleted file mode 100644 index c28f61fa..00000000 --- a/src/commands/ls.js +++ /dev/null @@ -1,53 +0,0 @@ -module.exports.usage = `List deployed/versions/used from the server - -Usage: - api ls # Returns deployed services by team - api ls versions # Returns deployed versions of this service - api ls used # Returns versions that you are using -`; - -module.exports.category = 'utility'; - -require('colors'); -const request = require('../lib/request'); - -const packageJson = require('../lib/package-json')(); - -module.exports.aliases = ['list']; - -module.exports.run = (args) => { - if (args.length === 1) { - request.get('/services/deployed').then((response) => { - const teams = JSON.parse(response); - console.log('\nListing deployed services by team'.green); - for (const team in teams) { - console.log(`\n${team.blue}`); - for (const service in teams[team]) { - console.log(` ${service}`); - } - } - }); - } else if (args[1] === 'versions') { - request.get(`/services/${packageJson.get('name')}`).then((response) => { - const service = JSON.parse(response); - const versions = service.versions; - console.log(`Listing deployed versions for ${packageJson.get('name')}`.blue); - for (const version of versions) { - console.log(version.version); - } - }).catch(() => { - console.log(`Service "${packageJson.get('name')}" is not deployed`.red); - }); - } else if (args[1] === 'used') { - request.get('/services/used').then((response) => { - const services = JSON.parse(response); - console.log('\nListing used services'.green); - for (const team in services) { - console.log(`\n${team.blue}`); - for (const name in services[team]) { - console.log(` ${name} v${services[team][name].version.version}`); - } - } - }); - } -}; diff --git a/src/commands/run.js b/src/commands/run.js deleted file mode 100644 index ea87aafe..00000000 --- a/src/commands/run.js +++ /dev/null @@ -1,64 +0,0 @@ -module.exports.usage = `Run a service remotely - -Usage: api run [--team ] - ---team is used to designate which team you would like to run this endpoint against. -This roughly equates to which API key we will use when invoking the service. -You may have access to some services from only certain teams, so this is important. - -The team defaults to your personal user team. -`; - -const request = require('../lib/request'); -const utils = require('../utils/utils'); -const console = require('../utils/console'); -const invoke = require('../lib/invoke'); - -module.exports.aliases = ['invoke']; - -module.exports.category = 'using'; -module.exports.weight = 1; - -module.exports.run = (args, opts) => { - if (!args[1]) throw new Error('Missing service'); - if (!args[2]) throw new Error('Missing endpoint'); - - let service = args[1]; - const action = args[2]; - - const data = utils.parseArgs(args.splice(3)); - - return request.get('/users/me').then(response => JSON.parse(response)).then((user) => { - let team = user.teams.find(t => t.personal); - if (opts.team) { - team = user.teams.find(t => t.name === opts.team); - } - - if (!team) { - console.log(`Cannot find team ${opts.team}`.red); - return Promise.reject(new Error(`Cannot find team ${opts.team}`)); - } - - if (service.indexOf('/') > -1 && !service.startsWith('@')) { - service = `@${service}`; - } - - return invoke(team.key, service, action, data, { isCLI: true }).then((response) => { - if (Buffer.isBuffer(response.file)) { - process.stdout.write(response.file); - } else { - console.log(response); - } - }).catch((err) => { - try { - if (opts.json) { - console.log(err.response.body); - } else { - console.error(err.response.body.error.red); - } - } catch (e) { - console.error('Unexpected error occured'.red); - } - }); - }); -}; diff --git a/src/commands/secret.js b/src/commands/secret.js deleted file mode 100644 index 8f787645..00000000 --- a/src/commands/secret.js +++ /dev/null @@ -1,38 +0,0 @@ -// module.exports.usage = `Sets a secret for a build service - -// Usage: api secret key=value`; - -// module.exports.category = 'basic'; - -const request = require('request-promise'); - -const utils = require('../utils/utils'); -const exit = require('../utils/exit'); -const console = require('../utils/console'); - -module.exports.run = ([_, service, secret], opts) => { - if (!service) { - console.error('You must provide a service'); - - return exit(1); - } - - if (!secret) { - console.error('You must provide a secret in the form of key=value'); - - return exit(1); - } - - const jar = utils.getJar(); - const base = utils.BUILD_URL; - const body = { - key: secret.split('=')[0], - value: secret.split('=')[1], - }; - if (opts.team) body.team = opts.team; - return request.post(`${base}/secrets/${service}`, { - json: true, - jar, - body, - }).then(console.log).catch(console.error); -}; diff --git a/src/commands/signup.js b/src/commands/signup.js deleted file mode 100644 index 7728608a..00000000 --- a/src/commands/signup.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports.usage = `Signup to Build - -Usage: api signup`; -module.exports.weight = 2; - -module.exports.category = 'utility'; - -const login = require('./login'); - -module.exports.run = login.run; diff --git a/src/commands/unlink.js b/src/commands/unlink.js deleted file mode 100644 index 596fd05f..00000000 --- a/src/commands/unlink.js +++ /dev/null @@ -1,38 +0,0 @@ -module.exports.usage = `Remove linked services - -Usage: - api unlink # Removes all local links from service in current directory - api unlink math # Removes local link to math service in current directory -`; - -module.exports.category = 'utility'; - -const utils = require('../utils/utils'); -const path = require('path'); -const fs = require('fs'); - -const packageJson = require('../lib/package-json'); - -module.exports.run = (args) => { - const linksPath = path.join(utils.sharedDirectoryPath(), 'links.json'); - const links = utils.fileExists(linksPath) ? require(linksPath) : {}; - - const pjsonName = packageJson().get('name'); - - // Don't want service to be linked anymore - if (args.length === 1) { - delete links.services[pjsonName]; - for (const p in links.directories) { - links.directories[p] = links.directories[p].filter(s => s !== pjsonName); - } - console.log(`Removed ${pjsonName.green} from links`); - } else { // unlink service from consumer - for (const p in links.directories) { - links.directories[p] = links.directories[p].filter(s => s !== args[1]); - } - console.log(`Removed ${args[1]} from links`); - } - fs.writeFile(linksPath, JSON.stringify(links), (err) => { - if (err) console.error(err); - }); -}; diff --git a/src/commands/update.js b/src/commands/update.js deleted file mode 100644 index 93f718e1..00000000 --- a/src/commands/update.js +++ /dev/null @@ -1,40 +0,0 @@ -module.exports.usage = `Update the used version of this service - -Usage: api update [] [--team ] - -The version is optional, and will by default update you to the latest. ---team is used to designate which team you would like to update -`; -module.exports.weight = 5; - -module.exports.category = 'utility'; - -require('colors'); -const createEnquirer = require('../lib/enquirer'); -const request = require('../lib/request'); -const console = require('../utils/console'); -const { prefixName } = require('../lib/invoke'); - -const enquirer = createEnquirer(); - -module.exports.run = (args, opts) => { - if (!args[1]) throw new Error('Please include a service you want to upgrade!'); - if (!args[2]) console.log('No version specified, updating to latest'); - - return request.put(`/services/${prefixName(args[1])}/update`, { - json: { version: args[2], team: opts.team }, - defaultErrorHandler: false, - }).then((s) => { - console.log(`${args[1]} updated to version ${s.version.green}`); - }).catch((e) => { - if (e.error.code === 'TeamSelectionRequired') { - enquirer.ask([{ - type: 'list', - name: 'team', - message: 'Which team should be updated?', - choices: e.error.data.teams, - }]).then(results => module.exports.run(args, results)); - } - }); -}; - diff --git a/src/commands/whoami.js b/src/commands/whoami.js deleted file mode 100644 index 36964246..00000000 --- a/src/commands/whoami.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports.usage = `Returns the current logged in user - -Usage: api whoami`; - -module.exports.category = 'utility'; - -const request = require('../lib/request'); -const console = require('../utils/console'); - -module.exports.run = () => { - return request.get('/users/me').then((response) => { - try { - console.log(JSON.parse(response).username); - } catch (e) { - // - } - }); -}; diff --git a/src/lib/enquirer.js b/src/lib/enquirer.js deleted file mode 100644 index 2432bc08..00000000 --- a/src/lib/enquirer.js +++ /dev/null @@ -1,14 +0,0 @@ -const Enquirer = require('enquirer'); -const list = require('prompt-list'); -const password = require('prompt-password'); -const message = require('./prompt-message'); - -module.exports = function createEnquirer() { - const enquirer = new Enquirer(); - - enquirer.register('list', list); - enquirer.register('password', password); - enquirer.register('message', message); - - return enquirer; -}; diff --git a/src/lib/invoke.js b/src/lib/invoke.js deleted file mode 100644 index 2eac269e..00000000 --- a/src/lib/invoke.js +++ /dev/null @@ -1,50 +0,0 @@ -const request = require('request-promise'); -const os = require('os'); -const querystring = require('querystring'); - -const { BUILD_URL, getSDKVersion, parseResponse, parseData } = require('../utils/utils'); - -module.exports = (key, service, action, data, opts = {}) => { - const outputs = opts.outputs; - - const headers = { - 'X-Build-Meta-Language': `node@${process.version.replace(/^v/, '')}`, - 'X-Build-Meta-SDK': getSDKVersion(opts.isCLI), - 'X-Build-Meta-OS': `${os.type().toLowerCase()}@${os.release()}`, - }; - - if (outputs !== undefined) { - const parsedOutput = querystring.stringify(outputs); - headers['X-Build-Output'] = parsedOutput; - } - - return request.post(`${BUILD_URL}/run/${prefixName(service)}/${action}`, { - formData: parseData(data), - resolveWithFullResponse: true, - headers, - auth: { user: key }, - }).then((response) => { - if (response.headers) checkDeprecated(response); - return parseResponse(response); - }).catch((err) => { - if (err.response && err.response.headers) checkDeprecated(err.response); - return Promise.reject(err.error); - }); -}; - -module.exports.prefixName = prefixName; -function prefixName(name) { - if (name.indexOf('/') > -1 && !name.startsWith('@')) { - return `@${name}`; - } - - return name; -} - -function checkDeprecated(response) { - const service = response.headers['x-build-service']; - const version = response.headers['x-build-version']; - if (response.headers['x-build-deprecated']) { - console.log(`${service} v${version} is deprecated! Run \`api update ${service}\` to use the latest version`.red); - } -} diff --git a/src/lib/package-json.js b/src/lib/package-json.js deleted file mode 100644 index 00331ec9..00000000 --- a/src/lib/package-json.js +++ /dev/null @@ -1,76 +0,0 @@ -const fs = require('fs'); -const { join } = require('path'); - -class PackageJson { - constructor(packageJson, path = process.cwd()) { - this.path = path; - this.packageJson = packageJson; - - if (!this.packageJson) { - try { - this.packageJson = require(join(this.path, 'package.json')); - } catch (e) { - this.packageJson = {}; - } - } - } - - get(key, opts = { build: false }) { - const rootProperty = this.packageJson[key]; - const buildProperty = (this.packageJson.build || {})[key]; - - if (opts.build === true) return buildProperty; - - return buildProperty || rootProperty; - } - - has(key, opts = { build: false }) { - const existsInRoot = typeof this.packageJson[key] !== 'undefined'; - const existsInBuild = typeof (this.packageJson.build || {})[key] !== 'undefined'; - - if (opts.build === true) return existsInBuild; - - return existsInRoot || existsInBuild; - } - - set(key, value, opts = { root: false, build: false }) { - // If the `root` option is set, then attempt to set with a priority - // in the root as opposed to in `build`. This is useful for updating - // the `version` property of the package.json when it hasn't - // diverged from the base version - if (opts.root === true) { - if (this.packageJson.build && this.packageJson.build[key]) { - this.packageJson.build[key] = value; - } else { - this.packageJson[key] = value; - } - return; - } - - // If the `build` option is set, then set in `build` instead of - // attempting to set in the root first. This is useful for updating - // the `private` property of the package.json which when in the root - // means that a package shouldn't be deployed to npm - if (opts.build === true) { - if (!this.packageJson.build) this.packageJson.build = {}; - this.packageJson.build[key] = value; - return; - } - - if (this.packageJson[key]) { - // Ignore property if it's the same - if (this.packageJson[key] === value) return; - - if (!this.packageJson.build) this.packageJson.build = {}; - this.packageJson.build[key] = value; - } else { - this.packageJson[key] = value; - } - } - - write() { - return fs.writeFileSync(join(this.path, 'package.json'), JSON.stringify(this.packageJson, undefined, 2)); - } -} - -module.exports = (...args) => new PackageJson(...args); diff --git a/src/lib/prompt-message.js b/src/lib/prompt-message.js deleted file mode 100644 index ba3b48f6..00000000 --- a/src/lib/prompt-message.js +++ /dev/null @@ -1,20 +0,0 @@ -// This just allows you to print out a little description -// between prompmts for enquirer - -function PromptMessage(q) { - console.log(''); - if (typeof q.message === 'function') { - q.message(); - } else { - console.log(q.message); - } - console.log(''); -} - -PromptMessage.prototype.run = () => { - return new Promise((resolve) => { - resolve(true); - }); -}; - -module.exports = PromptMessage; diff --git a/src/lib/request.js b/src/lib/request.js deleted file mode 100644 index b782c034..00000000 --- a/src/lib/request.js +++ /dev/null @@ -1,68 +0,0 @@ -const request = require('request-promise'); - -const utils = require('../utils/utils'); -const console = require('../utils/console'); - -const baseUrl = utils.BUILD_URL; - -function errorHandler(err) { - // Pass along errors in testing environment - if (process.env.NODE_ENV === 'testing') throw err; - - let parsed; - try { - parsed = JSON.parse(err.response.body); - } catch (e) { - // Ignore the error, we have defaults set below - parsed = {}; - } - - // Nicer error message if they need to upgrade - if (parsed.code === 'UpgradeRequired') { - console.error(`\nThis requires a paid plan. To upgrade visit: ${'https://www.readme.build/settings/team'.green}\n`); - process.exit(1); - } - - if (err.response) { - console.error(` - Error making request to ${err.options.baseUrl}${err.options.uri} - - Message: ${parsed.error || 'An unexpected error has occurred'} - Code: ${parsed.code || 'Unknown'} - Response status: ${err.response.statusCode} ${err.response.statusMessage} - `); - } else { // If we dont have a response, then something has really gone wrong! - console.error(` - Error making request to ${err.options.baseUrl}${err.options.uri} - - Message: ${err.message} - `); - } -} - -module.exports.errorHandler = errorHandler; - -['get', 'post', 'put'].forEach((method) => { - module.exports[method] = (uri, options = { defaultErrorHandler: true, sendRequest: true }) => { - const jar = utils.getJar(); - const agent = request.defaults({ baseUrl, jar }); - const opts = Object.assign({}, options, { - uri, - headers: { - 'user-agent': `api/${require('../../package.json').version} ${process.platform}/${process.version}`, - }, - }); - if (options.sendRequest === false) { - return agent[method](opts); - } - - // We have to wrap the promise so that we can get a default error handler - // on all http requests. This is configurable via the `defaultErrorHandler` - // option when making the request - return new Promise((resolve, reject) => { - return agent[method](opts) - .then(resolve) - .catch(options.defaultErrorHandler !== false ? errorHandler : reject); - }); - }; -}); diff --git a/src/utils/console.js b/src/utils/console.js deleted file mode 100644 index 6b44d0e2..00000000 --- a/src/utils/console.js +++ /dev/null @@ -1,17 +0,0 @@ -const logs = []; - -module.exports._flush = () => logs.splice(0).join('\n'); - -function createLog(method, ...args) { - if (process.env.NODE_ENV === 'testing') { - logs.push(...args); - return args; - } - - return console[method](...args); -} - -module.exports.log = createLog.bind(null, 'log'); - -module.exports.error = createLog.bind(null, 'error'); -module.exports.warn = console.warn; diff --git a/src/utils/exit.js b/src/utils/exit.js deleted file mode 100644 index 5ebf05c6..00000000 --- a/src/utils/exit.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = (code) => { - if (process.env.NODE_ENV === 'testing') { - return Promise[code === 0 ? 'resolve' : 'reject'](new Error(`Process exit: ${code}`)); - } - - return process.exit(code); -}; diff --git a/src/utils/file-utils.js b/src/utils/file-utils.js deleted file mode 100644 index 3aa92910..00000000 --- a/src/utils/file-utils.js +++ /dev/null @@ -1,82 +0,0 @@ -const fileType = require('file-type'); -const Stream = require('stream'); -const request = require('request-promise'); -const fs = require('fs'); -const { URL } = require('url'); - -exports.file = (p) => { - if (exports.isUrl(p)) { - return request.get({ url: p, encoding: null }); - } - return fs.createReadStream(p); -}; - -exports.isUrl = (s) => { - try { - new URL(s); // eslint-disable-line no-new - return true; - } catch (e) { - return false; - } -}; - -// Converts a stream to a buffer -// Useful for locally calling a service -// with a file -exports.streamToBuffer = (s) => { - return new Promise((resolve, reject) => { - const out = []; - s.on('data', (data) => { - out.push(data); - }); - s.on('end', () => { - resolve(Buffer.concat(out)); - }); - s.on('error', reject); - }); -}; - -// Converts buffers in response to file type -// Only used for api.local -exports.parseLocalFileResponse = (response) => { - return JSON.parse(response, (k, v) => { - if (v && v.type === 'Buffer') { - const file = Buffer.from(v.data); - return { - type: exports.getBufferType(file), - file, - }; - } - return v; - }); -}; - -exports.getBufferType = (buffer) => { - const type = fileType(buffer); - return type ? type.ext : 'string'; -}; - -// Converts data into the file type if stream or buffer -exports.convertToFileType = async (data) => { - const out = {}; - for (const d in data) { - if (data[d] instanceof Stream) { - /* eslint-disable no-await-in-loop */ - const file = await exports.streamToBuffer(data[d]); - /* eslint-enable no-await-in-loop */ - - out[d] = { - file: JSON.parse(JSON.stringify(file)), - type: fileType(file).ext, - }; - } else if (Buffer.isBuffer(data[d])) { - out[d] = { - file: JSON.parse(JSON.stringify(data[d])), - type: fileType(data[d]).ext, - }; - } else { - out[d] = data[d]; - } - } - return out; -}; diff --git a/src/utils/handler-utils.js b/src/utils/handler-utils.js deleted file mode 100644 index ed35db26..00000000 --- a/src/utils/handler-utils.js +++ /dev/null @@ -1,90 +0,0 @@ -const http = require('http'); - -module.exports.success = callback => response => callback(null, response); - -module.exports.error = (event, callback) => (name, props) => { - if (name instanceof Error) { - return callback(JSON.stringify(module.exports.parseErrors(event, name)), null); - } - - const e = new Error(); - e.name = name; - e.handled = true; - e.props = props; - - return callback(JSON.stringify(module.exports.parseErrors(event, e)), null); -}; - -module.exports.parseErrors = (event, error) => { - let compiledErrors; - try { - compiledErrors = require('./_errors'); // eslint-disable-line import/no-unresolved - } catch (e) { - compiledErrors = event.errors || { [event.name]: {} }; - } - - const errors = compiledErrors[event.name]; - - const e = {}; - // Normallize api.error('message') - if (!errors[error.name] && error.handled) { - e.message = error.name; - e.name = 'Error'; - } - - const outError = { - name: e.name || error.name, - message: e.message || error.message, - handled: error.handled || false, - data: event.data, - }; - - // Parse if error message is a template - if (errors[error.name]) { - try { - // We compile the error with lodash.template in build-docs so that we don't - // to have it installed in lambda. This is a hack to replace the string and - // make the error message nice based on the docs. Eval isn't great, but it works - const template = errors[error.name]; - outError.message = eval(`(${template})`)(error.props); // eslint-disable-line no-eval - } catch (err) { - outError.message = ''; - } - } - return outError; -}; - -module.exports.log = function log() { - const args = Array.prototype.slice.call(arguments); - const logKey = process.env.logKey; - if (logKey) { - const options = { - hostname: 'api.readme.build', - port: 80, - path: '/logs/console', - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - }; - const req = http.request(options); - const data = { logKey, log }; - req.write(`${data.toString()}`); - req.end(); - } - console.log.apply(undefined, args); -}; - -module.exports.getSecret = secrets => secret => secrets.find(s => s.key === secret).value; - -module.exports.fixBuffers = (d) => { - const data = Object.assign({}, d); - for (const arg in data) { - if (typeof data[arg] === 'object') { - data[arg].file = Buffer.from(data[arg].file.data); - } else if (typeof data[arg] !== 'string') { - data[arg] = JSON.parse(data[arg]); - } - } - return data; -}; diff --git a/src/utils/handler.js b/src/utils/handler.js deleted file mode 100644 index 69859b61..00000000 --- a/src/utils/handler.js +++ /dev/null @@ -1,26 +0,0 @@ -const path = require('path'); -const fs = require('fs'); -const utils = require('./handler-utils'); - -exports.go = (event, context, callback) => { - const basePath = event.pathOverride || process.cwd(); - const endpointPath = path.join(basePath, 'endpoints', `${event.name}.js`); - try { - fs.statSync(endpointPath).isFile(); - } catch (e) { - throw new Error('Endpoint does not exist'); - } - const endpoint = require(endpointPath); - const parsedData = utils.fixBuffers(event.data); - try { - endpoint(parsedData, { - success: utils.success(callback), - error: utils.error(event, callback), - log: utils.log, - getSecret: utils.getSecret(event.secrets), - }); - } catch (e) { - const error = utils.parseErrors(event, e); - callback(JSON.stringify(error), null); - } -}; diff --git a/src/utils/stub.js b/src/utils/stub.js deleted file mode 100644 index 47f37bbc..00000000 --- a/src/utils/stub.js +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Edit the description of your service here - * - * THESE COMMENTS ARE YOUR DOCUMENTATION! - * You can view the full docs for our documentation format at: - * https://docs.readme.build/docs/writing-documentation - * - * Write a description and define your API in this - * code block. - * - * @param {string} name=Name Name of the person - * @throws {ValidationError} Must provide all required fields - * @returns {string} A very friendly greeting - */ -module.exports = (data, api) => { - if (!data.name) return api.error('ValidationError'); - api.success('Hey there ' + data.name + '! It worked!\n\nNow edit <>.js to write your own code!'); -}; diff --git a/src/utils/utils.js b/src/utils/utils.js deleted file mode 100644 index 662ca3b1..00000000 --- a/src/utils/utils.js +++ /dev/null @@ -1,218 +0,0 @@ -const os = require('os'); -const fs = require('fs'); -const url = require('url'); -const path = require('path'); -const glob = require('glob'); -const stream = require('stream'); -const request = require('request-promise'); -const CookieJar = require('tough-cookie').CookieJar; -const execSync = require('child_process').execSync; -const buildDocs = require('build-docs'); - -const console = require('./console'); -const exit = require('./exit'); - -const fileUtils = require('./file-utils'); - -const host = process.env.BUILD_HOST || 'api.readme.build'; -const protocol = process.env.BUILD_HOST ? 'http' : 'https'; // if overriding -const www = process.env.WWW_HOST || 'readme.build'; -const version = process.env.BUILD_HOST ? '' : 'v1'; - -exports.WWW_URL = url.format({ host: www, protocol }); -exports.BUILD_URL = url.format({ host, protocol, pathname: version }); -exports.WS_URL = url.format({ host, protocol: 'ws', slashes: true }); - -// Sets up ~/.readme-build/ if it doesn't exist -exports.setupSharedDirectory = () => { - const homePath = exports.sharedDirectoryPath(); - if (!fs.existsSync(homePath)) { - fs.mkdirSync(homePath); - } -}; - -exports.sharedDirectoryPath = () => path.join(process.env.HOME_DIR || os.homedir(), '.readme-build'); -exports.credPath = path.join(exports.sharedDirectoryPath(), 'creds.json'); - -// Sets up ~/.readme-build/.cache -// Currently we just use this for the deploy zip (and delete the zip after deploy) -// But in the future we could do more stuff here -exports.cacheDir = () => { - // Make sure shared directory is set up - exports.setupSharedDirectory(); - - const cachePath = path.join(exports.sharedDirectoryPath(), '.cache'); - if (!fs.existsSync(cachePath)) { - fs.mkdirSync(cachePath); - } - return cachePath; -}; - -exports.fileExists = (file) => { - try { - return fs.statSync(file).isFile(); - } catch (err) { - return false; - } -}; - -exports.getAliasFile = (unknownAction) => { - const files = glob.sync(path.join(__dirname, '../commands', '*.js')); - let foundAction = false; - for (const file of files) { - const actionInfo = require(file); - if (actionInfo.aliases && actionInfo.aliases.indexOf(unknownAction) >= 0) { - foundAction = file.match(/(\w+).js/)[1]; - } - } - return foundAction; -}; - -exports.getJar = () => { - const jar = request.jar(); - try { - const s = fs.readFileSync(exports.credPath).toString(); - CookieJar.deserializeSync(s, jar._jar.store); - return jar; - } catch (e) { - if (e.code !== 'ENOENT') throw e; - - if (process.env.NODE_ENV === 'testing') return undefined; - - console.error(`You must be logged in to perform that action: - - ${'api login'.green} - -Don't have an account? Signup is free and takes 5 seconds! - - ${'api signup'.green} - `); - - return exit(1); - } -}; - -// Converts command line arguments to a javascript object -// test=1 test2='hello' test3=@/path/to/file -// { test: 1, test2: 'hello', test3: BUFFER } -exports.parseArgs = (args) => { - const data = {}; - const passedData = exports.fixMinimistSpaces(args); - for (const arg of passedData) { - const i = arg.indexOf('='); - const parsedArg = [arg.slice(0, i), arg.slice(i + 1)]; - data[parsedArg[0]] = exports.convertArgToProperType(parsedArg[1]); - } - return data; -}; - -exports.convertArgToProperType = (arg) => { - // It's a file - if (arg.indexOf('@') === 0) { - return fileUtils.file(arg.split('@')[1]); - } - - let value = arg; - try { - value = JSON.parse(arg); - } catch (e) { - // Already in proper format - // console.log(e); - } - return value; -}; - -// fixes args like numbers=[1, 3, 2] -// Spaces confuse minimist -exports.fixMinimistSpaces = (args) => { - const parsed = []; - for (const arg of args) { - const stringArg = arg.toString(); - if (stringArg.indexOf('=') === -1) { - parsed[parsed.length - 1] += stringArg; - } else { - parsed.push(arg); - } - } - return parsed; -}; - -exports.getGitConfig = (config) => { - let val; - try { - val = execSync(`git config --global ${config}`).toString().trim(); - } catch (e) { - // hi - } - return val; -}; - -// Gets the current version of the sdk -// api-cli@version if `api run` -// api@version if in code -exports.getSDKVersion = (isCLI = false) => { - const sdkVersion = require(path.join(__dirname, '../../package.json')).version; - if (isCLI) { - return `api-cli@${sdkVersion}`; - } - return `api@${sdkVersion}`; -}; - -exports.makeUsername = () => { - if (exports.getGitConfig('github.user')) { - return exports.getGitConfig('github.user'); - } - - const name = exports.getGitConfig('user.name'); - if (!name) return undefined; - - const split = name.split(' '); - split[0] = split[0][0]; // first character of first name - - return split.join('').replace(/[^\w]/g, '').toLowerCase(); -}; - -exports.buildErrors = (baseDir = process.cwd()) => { - const docs = buildDocs.parseDirectory(path.join(baseDir, 'endpoints')); - const errors = {}; - for (const doc of docs) { - if (doc.errors) { - errors[doc.name] = doc.errors.toString(); - } - } - return errors; -}; - -// Get names of files still containing stub documentation -exports.getUnchangedDocs = (docs) => { - return docs.filter(doc => doc.fullDescription && doc.fullDescription.indexOf('https://docs.readme.build/docs/writing-documentation') >= 0) - .map(doc => doc.name); -}; - -// Parses response to make sure its the correct type -exports.parseResponse = (response) => { - let parsedResponse = response.body; - try { - parsedResponse = JSON.parse(response.body, (k, v) => { - return v && v.type === 'Buffer' ? Buffer.from(v.data) : v; - }); - } catch (e) { /* response is a string */ } - return parsedResponse; -}; - -// Parses data to be sent for invoke -// body.data is stringified json -// Other is files -exports.parseData = (data) => { - const files = {}; - const filelessData = {}; - for (const param in data) { - if (data[param] instanceof stream || Buffer.isBuffer(data[param])) { - files[param] = data[param]; - } else { - filelessData[param] = data[param]; - } - } - - return Object.assign({}, files, { data: JSON.stringify(filelessData) }); -}; diff --git a/test/.eslintrc b/test/.eslintrc deleted file mode 100644 index 7eeefc33..00000000 --- a/test/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "env": { - "mocha": true - } -} diff --git a/test/api.test.js b/test/api.test.js deleted file mode 100644 index 44128e6b..00000000 --- a/test/api.test.js +++ /dev/null @@ -1,63 +0,0 @@ -const assert = require('assert'); -const nock = require('nock'); - -const { BUILD_URL } = require('../dist/utils/utils'); -const api = require('../'); -const logger = require('../dist/utils/console'); - -describe('api', () => { - describe('#config()', () => { - it('should take an api key and allow to run a service', () => { - const newApi = api.config('1234'); - assert.equal(typeof newApi, 'function'); - assert.equal(typeof newApi.run, 'function'); - assert.equal(typeof newApi.file, 'function'); - }); - }); - - describe('#run()', () => { - const key = '123456'; - const action = 'action'; - const body = { name: 'test', number: 1 }; - const responseBody = 'hello world'; - - it('should call invoke', () => { - const service = 'service'; - - const invokeMock = nock(BUILD_URL) - .post(`/run/${service}/${action}`, (passedBody) => { - return passedBody.includes(`form-data; name="data"\r\n\r\n${JSON.stringify(body)}`); - }) - .basicAuth({ user: key }) - .reply(() => { - return [200, responseBody, {}]; - }); - - return api.config(key)(service).run(action, body).then((response) => { - assert.equal(response, responseBody); - invokeMock.done(); - }); - }); - - it('should prefix service name with @ if it contains a slash', () => { - const service = 'team/service'; - - const invokeMock = nock(BUILD_URL) - .post(`/run/@${service}/${action}`, (passedBody) => { - return passedBody.includes(`form-data; name="data"\r\n\r\n${JSON.stringify(body)}`); - }) - .basicAuth({ user: key }) - .reply(() => { - return [200, {}, {}]; - }); - - return api.config(key)(service).run(action, body).then(() => invokeMock.done()); - }); - - it('should log if demo API key used', async () => { - await api.config('demo_asdsdsa')('service').run('action', 'body'); - - assert(logger._flush().indexOf('This is a demo API key!') > -1, 'Should show error message'); - }); - }); -}); diff --git a/test/babel.js b/test/babel.js deleted file mode 100644 index e9976345..00000000 --- a/test/babel.js +++ /dev/null @@ -1,8 +0,0 @@ -const { execSync } = require('child_process'); - -if (process.argv.includes('-w') || process.argv.includes('--watch')) { - console.warn('You\'re watching the tests but not rebuilding the source.'); - console.warn('Run `npm run watch` in a new console'); -} else { - execSync('npm run build'); -} diff --git a/test/commands/deploy.test.js b/test/commands/deploy.test.js deleted file mode 100644 index b7cc5014..00000000 --- a/test/commands/deploy.test.js +++ /dev/null @@ -1,221 +0,0 @@ -const assert = require('assert'); -const fs = require('fs'); -const os = require('os'); -const nock = require('nock'); -const BUILD_URL = require('../../dist/utils/utils').BUILD_URL.replace('/v1', ''); -const { questions, prepareDeploy, fetchDeployedVersion, privateChoices } = require('../../dist/commands/deploy'); -const packageJson = require('../../dist/lib/package-json'); - -let cwd; -let tmpDir; - -describe('deploy command', () => { - before(() => nock.disableNetConnect()); - after(() => nock.enableNetConnect()); - after(() => nock.cleanAll()); - beforeEach(() => { - cwd = process.cwd(); - - tmpDir = fs.mkdtempSync(`${os.tmpdir()}/`); - - process.chdir(tmpDir); - }); - - afterEach(() => { - process.chdir(cwd); - }); - - describe('fetchDeployedVersion()', () => { - it('should fetch deployed versions', async () => { - const pjson = packageJson(); - pjson.set('name', 'service'); - - const mock = nock(BUILD_URL) - .get('/v1/services/service') - .reply(200, { versions: [] }); - - await fetchDeployedVersion(pjson); - - return mock.done(); - }); - - it('should pass team from package json if set', async () => { - const team = 'team-name'; - const pjson = packageJson(); - pjson.set('name', 'service'); - pjson.set('team', team, { build: true }); - - const mock = nock(BUILD_URL) - .get('/v1/services/service') - .query({ team }) - .reply(200, { versions: [] }); - - await fetchDeployedVersion(pjson); - - return mock.done(); - }); - - it('should ignore error if it is a 404', async () => { - const pjson = packageJson(); - pjson.set('name', 'service'); - - const mock = nock(BUILD_URL) - .get('/v1/services/service') - .reply(404, { versions: [] }); - - try { - const result = await fetchDeployedVersion(pjson); - assert.equal(result.deployed.versions.length, 0); - assert.equal(result.hasDeployedVersion, false); - return mock.done(); - } catch (e) { - console.log(e); - throw new Error('Should not get here'); - } - }); - - it('should pass along other errors', async () => { - const pjson = packageJson(); - pjson.set('name', 'service'); - - const mock = nock(BUILD_URL) - .get('/v1/services/service') - .reply(500, { versions: [] }); - - try { - await fetchDeployedVersion(pjson); - throw new Error('Should not get here'); - } catch (e) { - return mock.done(); - } - }); - }); - - describe('prepareDeploy()', () => { - describe('name', () => { - it('should prefix with @team if it is a private package', () => { - const pjson = packageJson(); - pjson.set('name', 'service'); - prepareDeploy(pjson, { name: 'team' }, { team: 'team', private: privateChoices[1] }); - - assert.equal(pjson.get('name'), '@team/service'); - assert.equal(pjson.get('team', { build: true }), 'team'); - }); - - it('should not prefix with @team if it is a public package', () => { - const pjson = packageJson(); - pjson.set('name', 'service'); - prepareDeploy(pjson, { name: 'team' }, { team: 'test', private: privateChoices[0] }); - - assert.equal(pjson.get('name'), 'service'); - assert.equal(pjson.get('team', { build: true }), 'test'); - }); - - it('should not overwrite team if it is already set and no answer provided', () => { - const pjson = packageJson(); - pjson.set('name', 'service'); - pjson.set('team', 'team', { build: true }); - prepareDeploy(pjson, { name: 'team' }, {}); - - assert.equal(pjson.get('team', { build: true }), 'team'); - }); - }); - - describe('version', () => { - it('should set version if provided', () => { - const pjson = packageJson(); - pjson.set('version', '1.0.0'); - prepareDeploy(pjson, { name: 'team' }, { - version: '2.0.0', - }); - - assert.equal(pjson.get('version'), '2.0.0'); - }); - - it('should default to package.json version', () => { - const pjson = packageJson(); - pjson.set('version', '1.0.0'); - prepareDeploy(pjson, { name: 'team' }, {}); - - assert.equal(pjson.get('version'), '1.0.0'); - }); - }); - }); - - describe('questions', () => { - describe('version', () => { - it('should not ask if version has not yet been deployed', () => { - const versionQuestion = questions(['1.0.0'], false, []).find(question => question.name === 'version'); - - assert.equal(versionQuestion.when(), false); - }); - - it('should ask if version has already been deployed', () => { - const versionQuestion = questions(['1.0.0'], true, []).find(question => question.name === 'version'); - - assert.equal(versionQuestion.when(), true); - }); - - it('should validate against semver version', () => { - const versionQuestion = questions(['1.0.0'], true, []).find(question => question.name === 'version'); - assert.equal(versionQuestion.validate('not-valid'), 'not-valid is not a valid semver version'); - assert.equal(versionQuestion.validate('2.0.0'), true); - }); - - it('should error if version has already been deployed', () => { - const versionQuestion = questions(['1.0.0'], true, []).find(question => question.name === 'version'); - assert.equal(versionQuestion.validate('1.0.0'), 'Version 1.0.0 has already been deployed.'); - }); - }); - - describe('team', () => { - it('should ask for team if not set in `build.team`', () => { - const teams = [ - { name: 'test', personal: true }, - { name: 'another-team', personal: false }, - ]; - const pjson = packageJson(); - pjson.set('name', 'name'); - pjson.write(); - const teamQuestion = questions(['1.0.0'], true, teams).find(question => question.name === 'team'); - assert.equal(typeof teamQuestion, 'object'); - assert.equal(teamQuestion.choices.length, teams.length); - }); - - it('should not ask for team if `build.team` is set', () => { - const pjson = packageJson(); - pjson.set('team', 'team-name', { build: true }); - pjson.write(); - - const teamQuestion = questions(['1.0.0'], true).find(question => question.name === 'team'); - assert.equal(teamQuestion, undefined); - }); - - it('should not ask for team if `build.team` is set', () => { - const pjson = packageJson(); - pjson.set('team', 'team-name', { build: true }); - pjson.write(); - - const teamQuestion = questions(['1.0.0'], true).find(question => question.name === 'team'); - assert.equal(teamQuestion, undefined); - }); - }); - - describe('private', () => { - it('should ask question', () => { - const privateQuestion = questions(['1.0.0'], true, []).find(question => question.name === 'private'); - - assert.deepEqual(privateQuestion.choices, ['public (free)', 'private (requires paid plan)']); - }); - - it('should not ask if `build.team` is set', () => { - const pjson = packageJson(); - pjson.set('team', 'team-name', { build: true }); - pjson.write(); - - const privateQuestion = questions(['1.0.0'], true, []).find(question => question.name === 'private'); - assert.equal(privateQuestion, undefined); - }); - }); - }); -}); diff --git a/test/commands/docs.test.js b/test/commands/docs.test.js deleted file mode 100644 index e2a1f590..00000000 --- a/test/commands/docs.test.js +++ /dev/null @@ -1,12 +0,0 @@ -const assert = require('assert'); -const docs = require('../../dist/commands/docs'); -const logger = require('../../dist/utils/console'); - -describe.skip('docs command', () => { - it('should output built docs', () => { - docs.run(); - const output = logger._flush(); - assert(output.indexOf('name: \'docsTest\'') > -1, 'Should output docs information'); - assert(output.indexOf('description: \'This is an example for docs.test.js\'') > -1, 'Should output docs information'); - }); -}); diff --git a/test/commands/help.test.js b/test/commands/help.test.js deleted file mode 100644 index 120c0ff9..00000000 --- a/test/commands/help.test.js +++ /dev/null @@ -1,15 +0,0 @@ -const assert = require('assert'); -const help = require('../../dist/commands/help'); -const logger = require('../../dist/utils/console'); - -describe('help command', () => { - it('should output help information', () => { - help.run(); - assert(logger._flush().indexOf('Usage: api ') > -1, 'Should output help information'); - }); - - it('should output specific command help information', () => { - help.run(['help', 'deploy']); - assert(logger._flush().indexOf('Deploys a service to build') > -1, 'Should output help information'); - }); -}); diff --git a/test/commands/init.test.js b/test/commands/init.test.js deleted file mode 100644 index 1958efe1..00000000 --- a/test/commands/init.test.js +++ /dev/null @@ -1,136 +0,0 @@ -const assert = require('assert'); -const fs = require('fs'); -const os = require('os'); -const { init, questions } = require('../../dist/commands/init'); -const { join, basename } = require('path'); - -let cwd; -let tmpDir; - -describe('init command', () => { - beforeEach(() => { - cwd = process.cwd(); - - tmpDir = fs.mkdtempSync(`${os.tmpdir()}/`); - - process.chdir(tmpDir); - }); - - afterEach(() => { - process.chdir(cwd); - }); - - it('should generate new project', () => { - const answers = { - name: 'name', - version: '1.0.0', - action: 'sayHello', - }; - - init(answers); - - const packageJson = require(join(tmpDir, 'package.json')); - const main = `${answers.action}.js`; - assert.equal(packageJson.name, answers.name); - assert.equal(packageJson.version, answers.version); - - const readme = fs.readFileSync(join(tmpDir, 'readme.md'), 'utf8'); - assert(readme.indexOf(`# ${answers.name}`) > -1, 'Should have readme title'); - - const mainFile = fs.readFileSync(join(tmpDir, 'endpoints', main), 'utf8'); - assert(mainFile.indexOf('module.exports =') > -1, 'Should have default action'); - }); - - it('should extend existing package.json', () => { - const existingPackage = fs.readFileSync(join(__dirname, '../fixtures/existing-package.json')); - fs.writeFileSync('package.json', existingPackage); - - const answers = { - name: 'name', - version: '1.0.0', - action: 'sayHello', - }; - - init(answers); - - const existingPackageJson = require(join(__dirname, '../fixtures/existing-package.json')); - const packageJson = require(join(tmpDir, 'package.json')); - - assert.deepEqual(packageJson, Object.assign({}, existingPackageJson, { - build: { - name: answers.name, - version: answers.version, - }, - })); - }); - - it('should not add properties to `build` for matching values', () => { - const existingPackage = fs.readFileSync(join(__dirname, '../fixtures/existing-package.json')); - fs.writeFileSync('package.json', existingPackage); - - const existingPackageJson = require(join(__dirname, '../fixtures/existing-package.json')); - - const answers = { - name: existingPackageJson.name, - version: 'v1.0.0', - action: 'sayHello', - }; - - init(answers); - - const packageJson = require(join(tmpDir, 'package.json')); - - assert.deepEqual(packageJson, Object.assign({}, existingPackageJson, { - build: { - version: 'v1.0.0', - }, - })); - }); - - it('should leave existing readme', () => { - const readme = '# This is an already existing readme file'; - fs.writeFileSync('readme.md', readme); - - const answers = { - name: 'name', - version: '1.0.0', - action: 'sayHello', - }; - - init(answers); - - assert.equal(fs.readFileSync('readme.md', 'utf8'), readme); - }); - - describe('questions', () => { - describe('name', () => { - it('should offer existing package.json as a name', () => { - const name = 'existing'; - const nameQuestion = questions({ name }).find(question => question.name === 'name'); - - assert.equal(nameQuestion.default, name); - }); - - it('should give lowercased current folder directory if no package.json', () => { - const nameQuestion = questions({}).find(question => question.name === 'name'); - - assert.equal(nameQuestion.default, basename(tmpDir).toLowerCase()); - }); - - it('should error for invalid package names', () => { - const nameQuestion = questions({}).find(question => question.name === 'name'); - assert.equal(nameQuestion.validate('!'), 'name cannot contain special characters ("~\'!()*")'); - assert.equal(nameQuestion.validate(' name'), 'name cannot contain leading or trailing spaces\nname can only contain URL-friendly characters'); - }); - }); - - describe('version', () => { - it('should offer existing package.json as a version', () => { - const version = '1.0.1'; - const versionQuestion = questions({ version }).find(question => question.name === 'version'); - - assert.equal(versionQuestion.default, version); - }); - }); - }); -}); diff --git a/test/commands/link.test.js b/test/commands/link.test.js deleted file mode 100644 index 02915751..00000000 --- a/test/commands/link.test.js +++ /dev/null @@ -1,63 +0,0 @@ -const assert = require('assert'); -const fs = require('fs'); -const os = require('os'); -const { join } = require('path'); -const { init } = require('../../dist/commands/init'); -const link = require('../../dist/commands/link'); - -let cwd; -let tmpDir; -let tmpPath; -let linksPath; - -describe('link command', () => { - const answers = { - name: 'name', - version: '1.0.0', - action: 'sayHello', - }; - - beforeEach(() => { - cwd = process.cwd(); - - tmpPath = `${os.tmpdir()}/`; - tmpDir = fs.mkdtempSync(tmpPath); - linksPath = join(tmpPath, '.readme-build', 'links.json'); - process.env.HOME_DIR = tmpPath; - - process.chdir(tmpDir); - - init(answers); - }); - - afterEach(() => { - fs.unlinkSync(linksPath); - delete require.cache[require.resolve(linksPath)]; - process.chdir(cwd); - }); - - it('should create a global link when ran in a producer directory', () => { - link.run(['link']); - const links = require(linksPath); - assert.deepEqual(links, { - services: { - [answers.name]: process.cwd(), - }, - directories: {}, - }); - }); - - it('should create a local link when passed a service', () => { - link.run(['link']); - link.run(['link', answers.name]); - const links = require(linksPath); - assert.deepEqual(links, { - services: { - [answers.name]: process.cwd(), - }, - directories: { - [process.cwd()]: [answers.name], - }, - }); - }); -}); diff --git a/test/commands/logout.test.js b/test/commands/logout.test.js deleted file mode 100644 index b6c15f9d..00000000 --- a/test/commands/logout.test.js +++ /dev/null @@ -1,24 +0,0 @@ -const assert = require('assert'); -const nock = require('nock'); - -const logout = require('../../dist/commands/logout'); -const { BUILD_URL } = require('../../dist/utils/utils'); -const logger = require('../../dist/utils/console'); - -describe('`logout` command', () => { - before(() => nock.disableNetConnect()); - after(() => nock.enableNetConnect()); - - it('should call `/logout`', async () => { - const mock = nock(BUILD_URL).post('/logout').reply(200); - - return logout.run().then(() => { - mock.done(); - - // Need to do this on next tick, as it logs after the response - process.nextTick(() => { - assert(logger._flush().indexOf('You have been logged out') > -1, 'Should show logout message'); - }); - }); - }); -}); diff --git a/test/commands/run.test.js b/test/commands/run.test.js deleted file mode 100644 index 8e8a7501..00000000 --- a/test/commands/run.test.js +++ /dev/null @@ -1,99 +0,0 @@ -const assert = require('assert'); -const nock = require('nock'); -const path = require('path'); - -const { BUILD_URL } = require('../../dist/utils/utils'); -const { run } = require('../../dist/commands/run'); - -describe('run command', () => { - it('should throw if no service provided', () => { - assert.throws(() => { - run(['run']); - }, 'Missing service'); - }); - - it('should throw if no action provided', () => { - assert.throws(() => { - run(['run', 'service']); - }, 'Missing action'); - }); - - const key = '123456'; - const action = 'action'; - - it('should default team to personal team', () => { - const service = 'service'; - const teamsMock = nock(BUILD_URL).get('/users/me').reply(200, JSON.stringify({ - teams: [ - { key, personal: true }, - { key: '456789', personal: false }, - ], - })); - - const invokeMock = nock(BUILD_URL) - .post(`/run/${service}/${action}`) - .basicAuth({ user: key }) - .reply(() => { - return [200, {}, {}]; - }); - - return run(['run', service, action], {}).then(() => { - teamsMock.done(); - invokeMock.done(); - }); - }); - - it('should report invalid team', () => { - const service = 'service'; - nock(BUILD_URL).get('/users/me').reply(200, JSON.stringify({ - teams: [ - { key, personal: true, name: 'team1' }, - { key: '456789', personal: false, name: 'team2' }, - ], - })); - - return run(['run', service, action], { team: 'team3' }).catch((err) => { - assert.equal(err.message, 'Cannot find team team3'); - }); - }); - - it('should prefix service name with @ if it contains a slash', () => { - const service = 'team/service-1'; - nock(BUILD_URL).get('/users/me').reply(200, JSON.stringify({ - teams: [{ key, personal: true }], - })); - - const invokeMock = nock(BUILD_URL) - .post(`/run/@${service}/${action}`) - .basicAuth({ user: key }) - .reply(() => { - return [200, {}, {}]; - }); - - return run(['run', service, action], {}).then(() => { - return invokeMock.done(); - }); - }); - - it('should pass file if @path is used', () => { - const service = 'service-1'; - nock(BUILD_URL).get('/users/me').reply(200, JSON.stringify({ - teams: [{ key, personal: true }], - })); - const invokeMock = nock(BUILD_URL) - .post(`/run/${service}/${action}`, (passedBody) => { - const test1 = passedBody.includes('form-data; name="file"; filename="test.jpg"'); - const test2 = passedBody.includes('Content-Type: image/jpeg'); - return test1 && test2; - }) - .basicAuth({ user: key }) - .reply(() => { - return [200, {}, {}]; - }); - - return run(['run', service, action, `file=@${path.join(__dirname, '../fixtures/test.jpg')}`], {}).then(() => { - return invokeMock.done(); - }); - }); -}); - diff --git a/test/commands/secret.test.js b/test/commands/secret.test.js deleted file mode 100644 index f2973817..00000000 --- a/test/commands/secret.test.js +++ /dev/null @@ -1,37 +0,0 @@ -const assert = require('assert'); -const nock = require('nock'); - -const secret = require('../../dist/commands/secret'); -const { BUILD_URL } = require('../../dist/utils/utils'); -const logger = require('../../dist/utils/console'); - -describe('`secret` command', () => { - before(() => nock.disableNetConnect()); - after(() => nock.enableNetConnect()); - - it('should not throw if nothing provided', () => { - assert.doesNotThrow(() => { - secret.run(['secret']).catch(e => e); - }, TypeError); - }); - - it('should log if no service provided', () => { - return secret.run(['secret']).catch(() => { - assert(logger._flush().indexOf('You must provide a service') > -1, 'Should show error message'); - }); - }); - - it('should log if no secrets provided', () => { - return secret.run(['secret', 'service']).catch(() => { - assert(logger._flush().indexOf('You must provide a secret in the form of key=value') > -1, 'Should show error message'); - }); - }); - - it('should call `/secret`', async () => { - const mock = nock(BUILD_URL).post('/secrets/service', { key: 'a', value: '1' }).reply(200); - - return secret.run(['secret', 'service', 'a=1'], {}).then(() => { - mock.done(); - }); - }); -}); diff --git a/test/commands/unlink.test.js b/test/commands/unlink.test.js deleted file mode 100644 index 4b0b3b82..00000000 --- a/test/commands/unlink.test.js +++ /dev/null @@ -1,66 +0,0 @@ -const assert = require('assert'); -const fs = require('fs'); -const os = require('os'); -const { init } = require('../../dist/commands/init'); -const { join } = require('path'); -const link = require('../../dist/commands/link'); -const unlink = require('../../dist/commands/unlink'); - -let cwd; -let tmpDir; -let tmpPath; -let linksPath; - -describe('unlink command', () => { - const answers = { - name: 'name', - version: '1.0.0', - action: 'sayHello', - }; - - beforeEach(() => { - cwd = process.cwd(); - - tmpPath = `${os.tmpdir()}/`; - tmpDir = fs.mkdtempSync(tmpPath); - linksPath = join(tmpPath, '.readme-build', 'links.json'); - process.env.HOME_DIR = tmpPath; - - process.chdir(tmpDir); - - init(answers); - - link.run(['link']); - link.run(['link', answers.name]); - }); - - afterEach(() => { - fs.unlinkSync(linksPath); - delete require.cache[require.resolve(linksPath)]; - process.chdir(cwd); - }); - - it('should remove all links if removing link from service', () => { - unlink.run(['unlink']); - const links = require(linksPath); - assert.deepEqual(links, { - services: {}, - directories: { - [process.cwd()]: [], - }, - }); - }); - - it('should unlink a specific service', () => { - unlink.run(['unlink', answers.name]); - const links = require(linksPath); - assert.deepEqual(links, { - services: { - [answers.name]: process.cwd(), - }, - directories: { - [process.cwd()]: [], - }, - }); - }); -}); diff --git a/test/commands/update.test.js b/test/commands/update.test.js deleted file mode 100644 index d2111d97..00000000 --- a/test/commands/update.test.js +++ /dev/null @@ -1,69 +0,0 @@ -const assert = require('assert'); -const nock = require('nock'); - -const { BUILD_URL } = require('../../dist/utils/utils'); -const { run } = require('../../dist/commands/update'); - -describe('update command', () => { - it('should throw if no service provided', () => { - assert.throws(() => { - run(['update']); - }, 'Missing service'); - }); - - const service = 'service'; - - it('should make a request to update', () => { - const updateMock = nock(BUILD_URL) - .put(`/services/${service}/update`) - .reply(() => { - return [200, { version: '1.0.0' }, {}]; - }); - - return run(['update', service], {}).then(() => { - updateMock.done(); - }); - }); - - it('should allow you to pass the version', () => { - const version = '1.5.0'; - - const updateMock = nock(BUILD_URL) - .put(`/services/${service}/update`, { version }) - .reply(() => { - return [200, { version: '1.0.0' }, {}]; - }); - - return run(['update', service, version], {}).then(() => { - updateMock.done(); - }); - }); - - it('should allow you to pass the team', () => { - const team = 'team-name'; - - const updateMock = nock(BUILD_URL) - .put(`/services/${service}/update`, { team }) - .reply(() => { - return [200, { version: '1.0.0' }, {}]; - }); - - return run(['update', service], { team }).then(() => { - updateMock.done(); - }); - }); - - it('should prefix the service with @ if necessary', () => { - const teamService = 'team/service'; - const updateMock = nock(BUILD_URL) - .put(`/services/@${teamService}/update`) - .reply(() => { - return [200, { version: '1.0.0' }, {}]; - }); - - return run(['update', teamService], {}).then(() => { - updateMock.done(); - }); - }); -}); - diff --git a/test/commands/whoami.test.js b/test/commands/whoami.test.js deleted file mode 100644 index fcbca85f..00000000 --- a/test/commands/whoami.test.js +++ /dev/null @@ -1,24 +0,0 @@ -const assert = require('assert'); -const nock = require('nock'); - -const whoami = require('../../dist/commands/whoami'); -const { BUILD_URL } = require('../../dist/utils/utils'); -const logger = require('../../dist/utils/console'); - -describe('`whoami` command', () => { - before(() => nock.disableNetConnect()); - after(() => nock.enableNetConnect()); - - it('should call `/users/me`', async () => { - const mock = nock(BUILD_URL).get('/users/me').reply(201, { username: 'example' }); - - await whoami.run(); - - mock.done(); - - // Need to do this on next tick, as it logs after the response - process.nextTick(() => { - assert(logger._flush().indexOf('example') > -1, 'Should print the username'); - }); - }); -}); diff --git a/test/fixtures/existing-package.json b/test/fixtures/existing-package.json deleted file mode 100644 index ce37828a..00000000 --- a/test/fixtures/existing-package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "my-new-service", - "version": "2.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC" -} diff --git a/test/fixtures/image.JPG b/test/fixtures/image.JPG deleted file mode 100644 index 13fb9124705215d3856de712dfcb8c00ef9c2395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388834 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 z 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

UxW3M*R`FYy-1DY7@33Y&Q*0%3QXLK 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≷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 nxk*g$bH!*Mhe0| diff --git a/test/fixtures/test.jpg b/test/fixtures/test.jpg deleted file mode 100644 index e69de29b..00000000 diff --git a/test/lib/package-json.test.js b/test/lib/package-json.test.js deleted file mode 100644 index 3d49eb5c..00000000 --- a/test/lib/package-json.test.js +++ /dev/null @@ -1,131 +0,0 @@ -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); -const os = require('os'); - -const packageJson = require('../../dist/lib/package-json'); - -describe('package-json', () => { - describe('constructor', () => { - it('should default path to `process.cwd()`', () => { - assert.equal(packageJson().path, process.cwd()); - }); - - it('should default packageJson to `path.join(this.path, \'package.json\')`', () => { - assert.equal(packageJson().packageJson.name, require('../../package.json').name); - }); - - it('should default to empty object if no package.json found', () => { - const tmpdir = fs.mkdtempSync(path.join(os.tmpdir(), '/')); - assert.deepEqual(packageJson(null, tmpdir).packageJson, {}); - }); - }); - - describe('#get()', () => { - it('should return the property from `build` if set', () => { - assert.equal(packageJson({ name: 'name', build: { name: 'build-name' } }).get('name'), 'build-name'); - }); - - it('should return the property from normal if not set', () => { - assert.equal(packageJson({ name: 'name', build: {} }).get('name'), 'name'); - assert.equal(packageJson({ name: 'name' }).get('name'), 'name'); - }); - - describe('`opts.build`', () => { - it('should return value if it is set in `build`', () => { - assert.equal(packageJson({ build: { private: true } }).get('private', { build: true }), true); - assert.equal(packageJson({ build: { private: false } }).get('private', { build: true }), false); - }); - - it('should return undefined if it is not set in `build`', () => { - assert.equal(packageJson({ build: {} }).get('private', { build: true }), undefined); - assert.equal(packageJson({ private: true }).get('private', { build: true }), undefined); - assert.equal(packageJson({ private: false }).get('private', { build: true }), undefined); - }); - }); - }); - - describe('#has()', () => { - it('should return true if the property is set on either', () => { - assert.equal(packageJson({ name: 'name' }).has('name'), true); - assert.equal(packageJson({ build: { name: 'build-name' } }).has('name'), true); - }); - - it('should return false if it is not set on either', () => { - assert.equal(packageJson({}).has('name'), false); - assert.equal(packageJson({ build: {} }).has('name'), false); - }); - - describe('`opts.build`', () => { - it('should return true if it is set in `build` or not', () => { - assert.equal(packageJson({ build: { private: true } }).has('private', { build: true }), true); - assert.equal(packageJson({ build: { private: false } }).has('private', { build: true }), true); - }); - - it('should return false if it is not set in `build`', () => { - assert.equal(packageJson({ build: {} }).has('private', { build: true }), false); - assert.equal(packageJson({ private: true }).has('private', { build: true }), false); - assert.equal(packageJson({ private: false }).has('private', { build: true }), false); - }); - }); - }); - - describe('#set()', () => { - it('should set the property in `build` if it is already set in main', () => { - const pjson = packageJson({ name: 'name' }); - pjson.set('name', 'build-name'); - assert.equal(pjson.packageJson.build.name, 'build-name'); - }); - - it('should not set the property in `build` if it is the same as main', () => { - const pjson = packageJson({ name: 'name' }); - pjson.set('name', 'name'); - assert.equal(pjson.packageJson.name, 'name'); - assert.equal(pjson.packageJson.build, undefined); - }); - - it('should set it in the main if it is not set there', () => { - const pjson = packageJson({}); - pjson.set('name', 'name'); - assert.equal(pjson.packageJson.name, 'name'); - }); - - describe('`opts.root`', () => { - it('should allow manually setting in the root if required', () => { - const pjson = packageJson({ version: '1.0.0' }); - pjson.set('version', '2.0.0', { root: true }); - assert.equal(pjson.packageJson.version, '2.0.0'); - assert.equal(pjson.packageJson.build, undefined); - }); - - it('should not set in the root if property is set in sub object', () => { - const pjson = packageJson({ version: '1.0.0', build: { version: '1.5.0' } }); - pjson.set('version', '2.0.0', { root: true }); - assert.equal(pjson.packageJson.version, '1.0.0'); - assert.equal(pjson.packageJson.build.version, '2.0.0'); - }); - }); - - describe('`opts.build`', () => { - it('should set in `build` object if `opts.build` is true', () => { - const pjson = packageJson({}); - pjson.set('private', true, { build: true }); - - assert.equal(pjson.packageJson.private, undefined); - assert.equal(pjson.packageJson.build.private, true); - }); - }); - }); - - describe('#write()', () => { - it('should write to disk in a given path', () => { - const tmpdir = fs.mkdtempSync(path.join(os.tmpdir(), '/')); - const pjson = packageJson({ name: 'test' }, tmpdir); - assert.equal(pjson.path, tmpdir); - - pjson.write(); - assert.equal(fs.existsSync(path.join(tmpdir, 'package.json')), true); - assert.deepEqual(JSON.parse(fs.readFileSync(path.join(tmpdir, 'package.json'), 'utf8')), { name: 'test' }); - }); - }); -}); diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index 403da175..00000000 --- a/test/mocha.opts +++ /dev/null @@ -1,3 +0,0 @@ ---require ./test/set-node-env.js ---require ./test/babel.js ---recursive diff --git a/test/set-node-env.js b/test/set-node-env.js deleted file mode 100644 index 4bee43ca..00000000 --- a/test/set-node-env.js +++ /dev/null @@ -1 +0,0 @@ -process.env.NODE_ENV = 'testing'; diff --git a/test/utils/doc-fixture.js b/test/utils/doc-fixture.js deleted file mode 100644 index 16fdd1a5..00000000 --- a/test/utils/doc-fixture.js +++ /dev/null @@ -1,6 +0,0 @@ -/* - * createUser: Creates a user in the database - * - * @throws {ValidationError} Error - * @throws {TemplateError} Error ${test} - */ diff --git a/test/utils/file-utils.test.js b/test/utils/file-utils.test.js deleted file mode 100644 index 0b7e3c4d..00000000 --- a/test/utils/file-utils.test.js +++ /dev/null @@ -1,122 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const assert = require('assert'); - -const fileUtils = require('../../dist/utils/file-utils'); - -describe('file-utils', () => { - describe('#isUrl', () => { - it('should return true if valid url', () => { - assert(fileUtils.isUrl('https://google.com')); - }); - - it('should return false if not valid url', () => { - assert.equal(fileUtils.isUrl('/path/to/image'), false); - }); - }); - - describe('#streamToBuffer', () => { - it('should convert stream to buffer', async () => { - const filePath = path.join(__dirname, './utils.test.js'); - const stream = fs.createReadStream(filePath); - const file = fs.readFileSync(filePath); - const buffer = await fileUtils.streamToBuffer(stream); - assert.equal(buffer.toString(), file.toString()); - }); - }); - - describe('#parseLocalFileResponse', () => { - it('should convert a buffer response to our file type', () => { - const file = fs.readFileSync(path.join(__dirname, '../fixtures/image.JPG')); - const response = JSON.stringify(file); - const parsedResponse = fileUtils.parseLocalFileResponse(response); - - assert.equal(parsedResponse.type, 'jpg'); - assert.equal(Buffer.isBuffer(parsedResponse.file), true); - }); - - it('Should work if buffer is in nested object', () => { - const file = fs.readFileSync(path.join(__dirname, '../fixtures/image.JPG')); - const response = JSON.stringify({ - file: { - test: 1, - file, - }, - width: 100, - }); - const parsedResponse = fileUtils.parseLocalFileResponse(response); - - assert.equal(parsedResponse.file.file.type, 'jpg'); - assert.equal(Buffer.isBuffer(parsedResponse.file.file.file), true); - assert.equal(parsedResponse.file.test, 1); - assert.equal(parsedResponse.width, 100); - }); - - it('Should work if response is single value', () => { - const response = 1; - const parsedResponse = fileUtils.parseLocalFileResponse(response); - assert.equal(response, parsedResponse); - }); - }); - - describe('#getBufferType', () => { - it('should correctly get type of image', () => { - const file = fs.readFileSync(path.join(__dirname, '../fixtures/image.JPG')); - assert.equal(fileUtils.getBufferType(file), 'jpg'); - }); - - it('should return string otherwise', () => { - const buffer = new Buffer('string'); - assert.equal(fileUtils.getBufferType(buffer), 'string'); - }); - }); - - describe('#convertToFileType', () => { - it('should convert streams to file type', async () => { - const data = { - image: fs.createReadStream(path.join(__dirname, '../fixtures/image.JPG')), - }; - const imageBuffer = fs.readFileSync(path.join(__dirname, '../fixtures/image.JPG')); - const parsedData = await fileUtils.convertToFileType(data); - assert.deepEqual(parsedData, { - image: { - file: JSON.parse(JSON.stringify(imageBuffer)), - type: 'jpg', - }, - }); - }); - - it('should convert buffers to file type', async () => { - const data = { - image: fs.readFileSync(path.join(__dirname, '../fixtures/image.JPG')), - }; - - const parsedData = await fileUtils.convertToFileType(data); - assert.deepEqual(parsedData, { - image: { - file: JSON.parse(JSON.stringify(data.image)), - type: 'jpg', - }, - }); - }); - - it('should leave other types alone', async () => { - const data = { - a: 1, - b: 2, - }; - - const parsedData = await fileUtils.convertToFileType(data); - assert.deepEqual(data, parsedData); - }); - - it('should leave original object unmodified', async () => { - const data = { - image: fs.readFileSync(path.join(__dirname, '../fixtures/image.JPG')), - }; - const originalData = Object.assign({}, data); - await fileUtils.convertToFileType(data); - assert.deepEqual(data, originalData); - }); - }); -}); diff --git a/test/utils/handler-utils.test.js b/test/utils/handler-utils.test.js deleted file mode 100644 index b36132b1..00000000 --- a/test/utils/handler-utils.test.js +++ /dev/null @@ -1,105 +0,0 @@ -const path = require('path'); -const assert = require('assert'); -const fs = require('fs'); -const buildDocs = require('build-docs'); - -const utils = require('../../dist/utils/handler-utils'); - -describe('handler-utils', () => { - describe('#error', () => { - it('should throw error when called', () => { - try { - utils.error('Name', { x: 1 }); - } catch (e) { - assert.equal(e.name, 'Name'); - assert.deepEqual(e.props, { x: 1 }); - assert.equal(e.handled, true); - } - }); - - it('should pass through if an Error object is provided', () => { - const msg = 'This is an error object'; - const err = new Error(msg); - try { - utils.error(err); - } catch (e) { - assert.equal(e.name, 'Error'); - assert.equal(e.message, msg); - } - }); - }); - - describe('#parseErrors', () => { - const docFile = path.join(__dirname, 'doc-fixture.js'); - const event = { - name: 'createUser', - data: { x: 1 }, - errors: { createUser: buildDocs(fs.readFileSync(docFile)).errors.toString() }, - }; - - it('should create error for api.error calls', () => { - const error = new Error(); - error.name = 'ValidationError'; - error.handled = true; - - const e = utils.parseErrors(event, error); - assert.equal(e.name, error.name); - assert.equal(e.message, 'Error'); - assert.deepEqual(e.data, event.data); - assert(e.handled); - }); - - it('should replace message if template string', () => { - const error = new Error(); - error.name = 'TemplateError'; - error.handled = true; - error.props = { test: 10 }; - - const e = utils.parseErrors(event, error); - assert.equal(e.name, error.name); - assert.equal(e.message, 'Error 10'); - assert.deepEqual(e.data, event.data); - assert(e.handled); - }); - - it('should handle errors not in docs', () => { - const error = new Error(); - error.name = 'UnknownError'; - error.handled = true; - - const e = utils.parseErrors(event, error); - assert.equal(e.name, 'Error'); - assert.equal(e.message, error.name); - assert.deepEqual(e.data, event.data); - assert(e.handled); - }); - - it('should handle thrown errors', () => { - const message = 'error message'; - const error = new Error(message); - error.name = 'UnknownError'; - - const e = utils.parseErrors(event, error); - assert.equal(e.name, 'UnknownError'); - assert.equal(e.message, message); - assert.deepEqual(e.data, event.data); - assert.equal(e.handled, false); - }); - }); - - describe('#fixBuffers', () => { - it('should convert stringified buffers back to buffers', () => { - const string = 'a'; - const params = { - test: 1, - image: { - type: 'png', - file: JSON.parse(JSON.stringify(new Buffer(string))), - }, - }; - - const parsed = utils.fixBuffers(params); - assert.equal(parsed.image.file.toString(), string); - }); - }); -}); diff --git a/test/utils/utils.test.js b/test/utils/utils.test.js deleted file mode 100644 index 59540aa2..00000000 --- a/test/utils/utils.test.js +++ /dev/null @@ -1,97 +0,0 @@ -const assert = require('assert'); -const Stream = require('stream'); - -const utils = require('../../dist/utils/utils'); - -describe('utils', () => { - describe('#parseArgs', () => { - it('should parse file types', () => { - const args = ['file=@../fixtures/image.JPG']; - const parsed = utils.parseArgs(args); - assert.equal(parsed.file instanceof Stream, true); - }); - - it('should convert to json', () => { - const args = ['x=1', 'y=2']; - const parsed = utils.parseArgs(args); - assert.deepEqual(parsed, { - x: 1, - y: 2, - }); - }); - }); - - describe('#getUnchangedDocs', () => { - it('Return with an empty array if docs changed', () => { - const docs = [{ name: 'helloWorld' }]; - const unchanged = utils.getUnchangedDocs(docs); - assert.deepEqual(unchanged, []); - }); - - it('Should return with action name if unchanged', () => { - const defaultDocs = [{ - name: 'helloWorld', - description: 'Edit the description of your service here', - fullDescription: 'THESE COMMENTS ARE YOUR DOCUMENTATION! You can view the full docs for our documentation format at: https://docs.readme.build/docs/writing-documentation Write a description and define your API in this code block.', - returns: { description: 'A very friendly greeting', type: 'string' }, - }]; - const unchanged = utils.getUnchangedDocs(defaultDocs); - assert.deepEqual(unchanged, ['helloWorld']); - }); - }); - - describe('#parseResponse', () => { - it('should parse a string response', () => { - const response = { body: 'test' }; - assert.equal(response.body, utils.parseResponse(response)); - }); - - it('should parse number response', () => { - const response = { body: 1 }; - assert.equal(response.body, utils.parseResponse(response)); - }); - - it('should parse object response', () => { - const body = { test: 1 }; - const response = { body: JSON.stringify(body) }; - assert.deepEqual(body, utils.parseResponse(response)); - }); - - it('should parse buffer response', () => { - const body = new Buffer('test'); - const response = { body: JSON.stringify(body) }; - assert.deepEqual(body, utils.parseResponse(response)); - }); - - it('should parse nested response', () => { - const body = { - test: 1, - file: { - image: new Buffer('test'), - }, - }; - const response = { body: JSON.stringify(body) }; - assert.deepEqual(body, utils.parseResponse(response)); - }); - }); - - describe('#parseData', () => { - it('should parse data with primitives', () => { - const data = { x: 1, y: 2, test: 'test' }; - assert.deepEqual({ data: JSON.stringify(data) }, utils.parseData(data)); - }); - - it('should parse data with just a buffer', () => { - const data = { file: new Buffer('test') }; - assert.deepEqual(Object.assign({ data: '{}' }, data), utils.parseData(data)); - }); - - - it('should parse data with a buffer and other data', () => { - const data = { file: new Buffer('test'), width: 100, height: 200 }; - const dataString = JSON.stringify({ width: 100, height: 200 }); - const expected = Object.assign({ data: dataString }, { file: data.file }); - assert.deepEqual(expected, utils.parseData(data)); - }); - }); -}); From c914cdbce6cc7cd158a23fe11cf12a41827d3d66 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Fri, 8 May 2020 10:22:39 -0700 Subject: [PATCH 02/23] chore: pulling in dev packages for the rewrite --- .eslintignore | 6 +- .eslintrc | 4 + .github/workflows/ci.yml | 26 + .gitignore | 9 +- .npmignore | 6 +- .prettierignore | 1 + __tests__/.eslintrc | 14 + package-lock.json | 2270 +++++++++++++++++++++++++++++++++++++- package.json | 24 +- 9 files changed, 2333 insertions(+), 27 deletions(-) create mode 100644 .eslintrc create mode 100644 .github/workflows/ci.yml create mode 100644 .prettierignore create mode 100644 __tests__/.eslintrc diff --git a/.eslintignore b/.eslintignore index fa75c1f3..528702fc 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,3 @@ -src/utils/stub.js -coverage/* -dist/ +.github/ +coverage/ +node_modules/ diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..90564095 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,4 @@ +{ + "extends": "@readme/eslint-config", + "root": true +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..588d42a6 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,26 @@ +name: CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [10.x, 12.x, 14.x] + + steps: + - uses: actions/checkout@v1 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - name: npm install + run: npm ci + + - name: tests + run: npm test diff --git a/.gitignore b/.gitignore index 291d7678..b509c88b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,2 @@ -node_modules/* -data/creds.json -data/links.json -data/output.zip -.DS_Store -.nyc_output coverage/ -npm-debug.log -dist/ +node_modules/ diff --git a/.npmignore b/.npmignore index ea9bfd01..dab87b6f 100644 --- a/.npmignore +++ b/.npmignore @@ -1,2 +1,4 @@ -src/ -test/ +__tests__/ +.eslint* +.gitignore +.prettier* diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..404abb22 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +coverage/ diff --git a/__tests__/.eslintrc b/__tests__/.eslintrc new file mode 100644 index 00000000..53a45d17 --- /dev/null +++ b/__tests__/.eslintrc @@ -0,0 +1,14 @@ +{ + "extends": "@readme/eslint-config/testing", + "rules": { + "jest/expect-expect": [ + "warn", + { + "assertFunctionNames": [ + "expect", + "nock" + ] + } + ] + } +} diff --git a/package-lock.json b/package-lock.json index 0bb6c767..d52f15fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,2273 @@ { "name": "api", "version": "1.0.0", - "lockfileVersion": 1 + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/runtime": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", + "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.9.6.tgz", + "integrity": "sha512-6toWAfaALQjt3KMZQc6fABqZwUDDuWzz+cAfPhqyEnzxvdWOAkjwPNxgF8xlmo7OWLsSjaKjsskpKHRLaMArOA==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@readme/eslint-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@readme/eslint-config/-/eslint-config-2.1.0.tgz", + "integrity": "sha512-CHEgpeEZbhmeqrtR3sVbkxkgL56qXevujP6TUYa0NKZqi+gckJ1dDYnyMka/frPVfuiHl1L9dwN5oHi8UwADqQ==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^14.0.0", + "eslint-config-prettier": "^6.5.0", + "eslint-plugin-eslint-comments": "^3.1.2", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-jest": "^23.1.1", + "eslint-plugin-jest-formatting": "^1.2.0", + "eslint-plugin-jsx-a11y": "^6.2.3", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^3.1.1", + "eslint-plugin-react": "^7.17.0", + "eslint-plugin-sonarjs": "^0.5.0", + "eslint-plugin-unicorn": "^19.0.1" + } + }, + "@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/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/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 + }, + "@typescript-eslint/experimental-utils": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz", + "integrity": "sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.31.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.31.0.tgz", + "integrity": "sha512-vxW149bXFXXuBrAak0eKHOzbcu9cvi6iNcJDzEtOkRwGHxJG15chiAQAwhLOsk+86p9GTr/TziYvw+H9kMaIgA==", + "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" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "axobject-query": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", + "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "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 + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", + "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" + } + }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "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" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-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": { + "object-keys": "^1.0.12" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "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.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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 + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-ast-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", + "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", + "dev": true, + "requires": { + "lodash.get": "^4.4.2", + "lodash.zip": "^4.2.0" + } + }, + "eslint-config-airbnb-base": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz", + "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.1" + } + }, + "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-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + } + }, + "eslint-plugin-es": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", + "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-eslint-comments": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz", + "integrity": "sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "ignore": "^5.0.5" + } + }, + "eslint-plugin-import": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + } + }, + "eslint-plugin-jest": { + "version": "23.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.9.0.tgz", + "integrity": "sha512-8mt5xJQIFh33W5nE7vCikkDTE4saTo08V91KjU6yI5sLQ9e8Jkp1OXkWJoIHLheFqY5OXIZdAjZmNYHSJ3IpzQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^2.5.0" + } + }, + "eslint-plugin-jest-formatting": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest-formatting/-/eslint-plugin-jest-formatting-1.2.0.tgz", + "integrity": "sha512-EqsbDByAtdQa5vEhJFUFMqTW7fghN0Qhb8oulM7R3j9+9xRuMsQKCPjWvCIxpWhl3SJJmlxBC25o1pUXiBHaAw==", + "dev": true + }, + "eslint-plugin-jsx-a11y": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.5", + "aria-query": "^3.0.0", + "array-includes": "^3.0.3", + "ast-types-flow": "^0.0.7", + "axobject-query": "^2.0.2", + "damerau-levenshtein": "^1.0.4", + "emoji-regex": "^7.0.2", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.1" + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz", + "integrity": "sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", + "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.3", + "object.entries": "^1.1.1", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.15.1", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.2", + "xregexp": "^4.3.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-sonarjs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.5.0.tgz", + "integrity": "sha512-XW5MnzlRjhXpIdbULC/qAdJYHWw3rRLws/DyawdlPU/IdVr9AmRK1r2LaCvabwKOAW2XYYSo3kDX58E4MrB7PQ==", + "dev": true + }, + "eslint-plugin-unicorn": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-19.0.1.tgz", + "integrity": "sha512-fu0/h5mHXfBC6EkA3i2vCjsfC8j53+T9txGhNL4fpxJ+1JKsUKfv+tmXDgy0XnLHhFjnOZp4tRWJWbcykeIP2Q==", + "dev": true, + "requires": { + "ci-info": "^2.0.0", + "clean-regexp": "^1.0.0", + "eslint-ast-utils": "^1.1.0", + "eslint-template-visitor": "^1.1.0", + "eslint-utils": "^2.0.0", + "import-modules": "^2.0.0", + "lodash": "^4.17.15", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.21", + "reserved-words": "^0.1.2", + "safe-regex": "^2.1.1", + "semver": "^7.1.3" + }, + "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-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": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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-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-template-visitor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-1.1.0.tgz", + "integrity": "sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", + "multimap": "^1.0.2" + } + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-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" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "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" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "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 + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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": "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.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "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-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.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 + }, + "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 + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "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" + } + }, + "import-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.0.0.tgz", + "integrity": "sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + } + }, + "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-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "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-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", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "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-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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" + } + }, + "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", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "jsx-ast-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.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" + } + }, + "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 + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.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", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multimap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", + "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "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" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "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.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.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "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 + }, + "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 + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, + "regexp-tree": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.21.tgz", + "integrity": "sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", + "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", + "dev": true + }, + "resolve": { + "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" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "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" + } + }, + "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-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, + "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": { + "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 + }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "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": { + "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 + } + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.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==", + "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 + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "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" + }, + "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 + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.matchall": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", + "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2" + } + }, + "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.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "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" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "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" + } + }, + "tslib": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-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 + }, + "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" + } + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "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" + } + }, + "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 + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xregexp": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "dev": true, + "requires": { + "@babel/runtime-corejs3": "^7.8.3" + } + } + } } diff --git a/package.json b/package.json index 3786075e..af801872 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,11 @@ { "name": "api", "version": "1.0.0", - "description": "API CLI and NPM module for Readme Build", - "main": "dist/api.js", - "bin": { - "api": "dist/cli.js" - }, + "description": "Generate an SDK from an OpenAPI document", "scripts": { - "pretest": "eslint . -f unix", - "test": "nyc --reporter=none mocha", - "posttest": "./bin/posttest.sh", - "build": "babel src --out-dir dist", - "watch": "babel src --out-dir dist -w", - "prepublish": "npm run build" + "lint": "eslint .", + "pretest": "npm run lint && npm run prettier", + "prettier": "prettier --list-different --write \"./**/**.js\"" }, "repository": { "type": "git", @@ -21,8 +14,13 @@ "bugs": { "url": "https://github.com/readmeio/api/issues" }, - "author": "ReadMe.io", + "author": "Jon Ursenbach ", "license": "ISC", "dependencies": {}, - "devDependencies": {} + "devDependencies": { + "@readme/eslint-config": "^2.1.0", + "eslint": "^6.8.0", + "prettier": "^2.0.5" + }, + "prettier": "@readme/eslint-config/prettier" } From bea8fbea52c96f66d5c055947d6d67d43684eefe Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 30 Apr 2020 22:48:45 -0700 Subject: [PATCH 03/23] feat: pulling over the new api sdk from our other repo + tests --- __tests__/__fixtures__/petstore.json | 223 + __tests__/index.test.js | 334 ++ package-lock.json | 7171 ++++++++++++++++++++++---- package.json | 13 +- src/index.js | 84 + 5 files changed, 6846 insertions(+), 979 deletions(-) create mode 100644 __tests__/__fixtures__/petstore.json create mode 100644 __tests__/index.test.js create mode 100644 src/index.js diff --git a/__tests__/__fixtures__/petstore.json b/__tests__/__fixtures__/petstore.json new file mode 100644 index 00000000..ff971cb2 --- /dev/null +++ b/__tests__/__fixtures__/petstore.json @@ -0,0 +1,223 @@ +{ + "openapi": "3.0.0", + "info": { + "version": "1.0.0", + "title": "Swagger Petstore", + "license": { + "name": "MIT" + } + }, + "servers": [ + { + "url": "http://petstore.swagger.io/v1" + } + ], + "paths": { + "/pets": { + "get": { + "summary": "List all pets", + "operationId": "listPets", + "tags": [ + "pets" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "description": "How many items to return at one time (max 100)", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "A paged array of pets", + "headers": { + "x-next": { + "description": "A link to the next page of responses", + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pets" + } + } + } + }, + "default": { + "description": "unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "post": { + "summary": "Create a pet", + "operationId": "createPets", + "tags": [ + "pets" + ], + "requestBody": { + "$ref": "#/components/schemas/Pet" + }, + "responses": { + "201": { + "description": "Null response" + }, + "default": { + "description": "unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/pets/{petId}": { + "get": { + "summary": "Info for a specific pet", + "operationId": "showPetById", + "tags": [ + "pets" + ], + "parameters": [ + { + "name": "petId", + "in": "path", + "required": true, + "description": "The id of the pet to retrieve", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Expected response to a valid request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "default": { + "description": "unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "put": { + "summary": "Info for a specific pet", + "operationId": "updatePetById", + "tags": [ + "pets" + ], + "requestBody": { + "$ref": "#/components/schemas/Pet" + }, + "parameters": [ + { + "name": "petId", + "in": "path", + "required": true, + "description": "The id of the pet to retrieve", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Expected response to a valid request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "default": { + "description": "unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Pet": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + }, + "Pets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + }, + "Error": { + "type": "object", + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + } + } + } + } + } +} diff --git a/__tests__/index.test.js b/__tests__/index.test.js new file mode 100644 index 00000000..d9784ee4 --- /dev/null +++ b/__tests__/index.test.js @@ -0,0 +1,334 @@ +/* eslint-disable jest-formatting/padding-around-test-blocks */ +const nock = require('nock'); +const { join } = require('path'); +const api = require('../src'); + +const petstore = api(join(__dirname, './__fixtures__/petstore.json')); + +const oasUrl = 'https://api.example.com'; + +console.logFull = obj => { + // eslint-disable-next-line global-require + console.log(require('util').inspect(obj, false, null, true)); +}; + +function createOas(method = 'get', path = '/', operation = {}) { + return { + openapi: '3.0.0', + info: { + title: 'OAS test', + }, + servers: [ + { + url: oasUrl, + }, + ], + paths: { + [path]: { + [method]: operation, + }, + }, + }; +} + +beforeAll(() => { + nock.disableNetConnect(); +}); + +describe('#preloading', () => { + it.todo('should error if passing in swagger 2'); + it.todo('should error if oas file is not valid'); + + describe('file', () => { + it.todo('should default to swagger.json/openapi.json'); + it.todo('should fetch files over http'); + it.todo('should fetch files from disk'); + it.todo('should work for yaml'); + it.todo('should work for json'); + + it('should work for object', () => { + const sdk = api(createOas()); + expect(typeof sdk.get).toBe('function'); + }); + }); +}); + +describe('#accessors', () => { + it('should have a function for each http method', () => { + ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'].forEach(method => { + expect(typeof petstore[method]).toBe('function'); + }); + }); + + describe('#operationId', () => { + it('should work for operationId', () => { + const mock = nock('http://petstore.swagger.io/v1').get('/pets').reply(200); + expect(() => petstore.listPets()).not.toThrow(); + mock.done(); + }); + + it('should work for other methods', () => { + const mock = nock('http://petstore.swagger.io/v1').post('/pets').reply(200, {}); + expect(() => petstore.createPets()).not.toThrow(); + mock.done(); + }); + + it.todo('should allow operationId to be the same as a http method'); + it.todo('should allow namespaced operationIds'); // sdk.name.space() + it.todo('should suggest a similar sounding operation name'); + + it('should error if an operationId does not exist', () => { + expect(() => petstore.listPetz()).toThrow(/not a function/); + }); + }); + + describe('#method(path)', () => { + it('should work for method and path', () => { + const mock = nock('http://petstore.swagger.io/v1').get('/pets').reply(200); + expect(() => petstore.get('/pets')).not.toThrow(); + mock.done(); + }); + + it.todo('should error if method and path does not exist'); + }); +}); + +describe('#fetch', () => { + const petId = 123; + const body = { a: 1 }; + + describe('operationId', () => { + it.todo('should pass through path/body/other params'); + it.todo('should pass through query params'); + it.todo('should pass through header params'); + it.todo('should pass through auth params'); + + it('should pass through path params for operationId', () => { + const response = { + id: petId, + name: 'Buster', + }; + + const mock = nock('http://petstore.swagger.io/v1').get(`/pets/${petId}`).reply(200, response); + + return petstore + .showPetById({ petId }) + .then(res => { + expect(res.status).toBe(200); + return res.json(); + }) + .then(res => { + expect(res).toStrictEqual(response); + mock.done(); + }); + }); + + it('should pass through body for operationId', () => { + const mock = nock('http://petstore.swagger.io/v1') + .post('/pets', body) + .reply(200, (uri, requestBody) => { + return { + a: requestBody.a + 100, + }; + }); + + return petstore + .createPets(body) + .then(res => { + expect(res.status).toBe(200); + return res.json(); + }) + .then(res => { + expect(res).toStrictEqual({ a: 101 }); + mock.done(); + }); + }); + + it('should pass through path params and body for operationId', () => { + const mock = nock('http://petstore.swagger.io/v1') + .put(`/pets/${petId}`, body) + .reply(200, (uri, requestBody) => { + return { + a: requestBody.a + 100, + }; + }); + + return petstore + .updatePetById({ petId }, body) + .then(res => { + expect(res.status).toBe(200); + return res.json(); + }) + .then(res => { + expect(res).toStrictEqual({ a: 101 }); + mock.done(); + }); + }); + }); + + describe('method + path', () => { + it.todo('should pass through path/body/other params'); + it.todo('should pass through query params'); + it.todo('should pass through header params'); + it.todo('should pass through auth params'); + + it('should pass through body for method + path', () => { + const mock = nock('http://petstore.swagger.io/v1') + .post('/pets', body) + .reply(200, (uri, requestBody) => { + return { + a: requestBody.a + 100, + }; + }); + + return petstore + .post('/pets', body) + .then(res => { + expect(res.status).toBe(200); + return res.json(); + }) + .then(res => { + expect(res).toStrictEqual({ a: 101 }); + mock.done(); + }); + }); + + it('should pass through path params for method + path', () => { + const sdk = api( + createOas('put', '/{id}', { + parameters: [ + { + name: 'id', + in: 'path', + schema: { + type: 'string', + }, + }, + ], + }) + ); + + const mock = nock(oasUrl).put('/123').reply(200); + return sdk.put('/{id}', { id: 123 }).then(res => { + expect(res.status).toBe(200); + expect(res.url).toBe(`${oasUrl}/123`); + mock.done(); + }); + }); + + it('should pass through path params and body params for method + path', () => { + const sdk = api( + createOas('put', '/{id}', { + parameters: [ + { + name: 'id', + in: 'path', + schema: { + type: 'string', + }, + }, + ], + requestBody: { + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + a: { + type: 'string', + }, + }, + }, + }, + }, + }, + }) + ); + + const mock = nock(oasUrl) + .put('/123', { a: 1 }) + .reply(200, (uri, requestBody) => { + return { a: requestBody.a + 100 }; + }); + + return sdk + .put('/{id}', { id: 123 }, { a: 1 }) + .then(res => { + expect(res.status).toBe(200); + return res.json(); + }) + .then(res => { + expect(res).toStrictEqual({ a: 101 }); + mock.done(); + }); + }); + }); + + describe('validation', () => { + it.todo('should validate body based on JSON Schema'); + it.todo('should validate path params'); + it.todo('should validate query params'); + it.todo('should validate header params'); + it.todo('should validate auth params'); + }); +}); + +describe('#auth', () => { + describe('OAuth 2', () => { + const securityOas = Object.assign( + createOas('get', '/', { + operationId: 'getSomething', + security: [ + { + auth: [], + }, + ], + }), + { + components: { + securitySchemes: { + auth: { + type: 'oauth2', + }, + }, + }, + } + ); + + it.skip('should allow you to pass in a single auth', () => { + const apiKey = '123'; + const sdk = api(securityOas); + + const mock = nock(oasUrl, { + reqheaders: { + authorization: `bearer ${apiKey}`, + }, + }) + .get('/') + .reply(200, {}); + + sdk.auth(apiKey); + sdk.getSomething(); + + mock.done(); + }); + + it('should allow you to pass in multiple auths', () => { + const apiKey = '123'; + const sdk = api(securityOas); + + const mock = nock(oasUrl, { + reqheaders: { + authorization: `Bearer ${apiKey}`, + }, + }) + .get('/') + .reply(200, {}); + + sdk.auth({ auth: apiKey }); + sdk.getSomething(); + + mock.done(); + }); + }); +}); diff --git a/package-lock.json b/package-lock.json index d52f15fa..b910d2fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,12 +13,195 @@ "@babel/highlight": "^7.8.3" } }, + "@babel/core": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", + "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.6", + "@babel/parser": "^7.9.6", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6", + "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": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "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.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.6", + "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 + } + } + }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@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" + } + }, + "@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" + } + }, + "@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" + } + }, + "@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": { + "@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" + } + }, + "@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" + } + }, + "@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 + }, + "@babel/helper-replace-supers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", + "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, + "@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.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", "dev": true }, + "@babel/helpers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", + "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, "@babel/highlight": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", @@ -30,6 +213,102 @@ "js-tokens": "^4.0.0" } }, + "@babel/parser": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", + "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", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", + "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz", + "integrity": "sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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": { + "@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/runtime": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", @@ -49,69 +328,32 @@ "regenerator-runtime": "^0.13.4" } }, - "@readme/eslint-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@readme/eslint-config/-/eslint-config-2.1.0.tgz", - "integrity": "sha512-CHEgpeEZbhmeqrtR3sVbkxkgL56qXevujP6TUYa0NKZqi+gckJ1dDYnyMka/frPVfuiHl1L9dwN5oHi8UwADqQ==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^14.0.0", - "eslint-config-prettier": "^6.5.0", - "eslint-plugin-eslint-comments": "^3.1.2", - "eslint-plugin-import": "^2.18.2", - "eslint-plugin-jest": "^23.1.1", - "eslint-plugin-jest-formatting": "^1.2.0", - "eslint-plugin-jsx-a11y": "^6.2.3", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^3.1.1", - "eslint-plugin-react": "^7.17.0", - "eslint-plugin-sonarjs": "^0.5.0", - "eslint-plugin-unicorn": "^19.0.1" - } - }, - "@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/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/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 - }, - "@typescript-eslint/experimental-utils": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz", - "integrity": "sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA==", + "@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": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.31.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, - "@typescript-eslint/typescript-estree": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.31.0.tgz", - "integrity": "sha512-vxW149bXFXXuBrAak0eKHOzbcu9cvi6iNcJDzEtOkRwGHxJG15chiAQAwhLOsk+86p9GTr/TziYvw+H9kMaIgA==", + "@babel/traverse": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", "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" + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" }, "dependencies": { "debug": { @@ -123,395 +365,744 @@ "ms": "^2.1.1" } }, + "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 + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true } } }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true + "@babel/types": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } }, - "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==", + "@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 }, - "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==", + "@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": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" } }, - "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==", + "@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": { - "type-fest": "^0.11.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.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==", + "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 } } }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "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" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "@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==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", + "slash": "^3.0.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "@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==", "dev": true, "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" + "@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.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", + "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": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "@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==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0" } }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "@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==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "@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" } }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "axobject-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", - "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "@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": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@jest/environment": "^25.5.0", + "@jest/types": "^25.5.0", + "expect": "^25.5.0" } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "@jest/reporters": { + "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@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", + "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.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.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "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", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "@jest/source-map": { + "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.4", + "source-map": "^0.6.0" + } }, - "clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "@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==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "@jest/test-sequencer": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz", + "integrity": "sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "@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" } }, - "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 - }, - "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==", + "@jest/transform": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", + "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", "dev": true, "requires": { - "color-name": "1.1.3" + "@babel/core": "^7.1.0", + "@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.4", + "jest-haste-map": "^25.5.1", + "jest-regex-util": "^25.2.6", + "jest-util": "^25.5.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": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.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 + "@jest/types": { + "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", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "@readme/eslint-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@readme/eslint-config/-/eslint-config-2.1.0.tgz", + "integrity": "sha512-CHEgpeEZbhmeqrtR3sVbkxkgL56qXevujP6TUYa0NKZqi+gckJ1dDYnyMka/frPVfuiHl1L9dwN5oHi8UwADqQ==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^14.0.0", + "eslint-config-prettier": "^6.5.0", + "eslint-plugin-eslint-comments": "^3.1.2", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-jest": "^23.1.1", + "eslint-plugin-jest-formatting": "^1.2.0", + "eslint-plugin-jsx-a11y": "^6.2.3", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^3.1.1", + "eslint-plugin-react": "^7.17.0", + "eslint-plugin-sonarjs": "^0.5.0", + "eslint-plugin-unicorn": "^19.0.1" + } }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", - "dev": true + "@readme/oas-extensions": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@readme/oas-extensions/-/oas-extensions-6.4.0.tgz", + "integrity": "sha512-/zLzwK9E8E/pQSQ97gl4TADzpiwSpADYfbD89zx2PmYdUwEah0Pm9yAiLIk5qfBVnOtDLjLijQoVAsf7u0NNwg==" }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true + "@readme/oas-to-har": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/@readme/oas-to-har/-/oas-to-har-6.6.2.tgz", + "integrity": "sha512-HvTkP9yvEoeXN3XdDcsE1bVx5q5L/48sI1DSnIEfMlk+rkChuOqRCqYVOSiiw6rJ/NB6ot/0k2A7URKsZK5dCw==", + "requires": { + "@readme/oas-extensions": "^6.4.0", + "@readme/oas-tooling": "^3.3.3", + "querystring": "^0.2.0" + } }, - "core-js-pure": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", - "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", - "dev": true + "@readme/oas-tooling": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@readme/oas-tooling/-/oas-tooling-3.3.5.tgz", + "integrity": "sha512-aRsxgkiSyD1UCAjM043qf9T9O/7eFQf6aSp1X8+ez9DpGe89vAFLZeM1jGxyKw91G6UT6IW4EhiS354UKm26tw==", + "requires": { + "jsonpointer": "^4.0.1", + "path-to-regexp": "^6.1.0" + } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "@sinonjs/commons": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", + "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", "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" + "type-detect": "4.0.8" } }, - "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "@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": { - "ms": "2.0.0" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "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 + "@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" + } }, - "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==", + "@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": { - "object-keys": "^1.0.12" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "@types/babel__traverse": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz", + "integrity": "sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "@babel/types": "^7.3.0" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "@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 }, - "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==", + "@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": { - "is-arrayish": "^0.2.1" + "@types/node": "*" } }, - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "@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 + }, + "@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": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "@types/istanbul-lib-coverage": "*" } }, - "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==", + "@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": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "@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 }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "@types/node": { + "version": "13.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", + "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==", + "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", + "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": { - "@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", + "@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 + }, + "@typescript-eslint/experimental-utils": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz", + "integrity": "sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.31.0", "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.31.0.tgz", + "integrity": "sha512-vxW149bXFXXuBrAak0eKHOzbcu9cvi6iNcJDzEtOkRwGHxJG15chiAQAwhLOsk+86p9GTr/TziYvw+H9kMaIgA==", + "dev": true, + "requires": { + "debug": "^4.1.1", "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" + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" }, "dependencies": { "debug": { @@ -523,697 +1114,3658 @@ "ms": "^2.1.1" } }, - "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" - } - }, - "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" - } - }, - "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 - }, "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 - }, - "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 - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true } } }, - "eslint-ast-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", - "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", - "dev": true, - "requires": { - "lodash.get": "^4.4.2", - "lodash.zip": "^4.2.0" - } + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true }, - "eslint-config-airbnb-base": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz", - "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.9", - "object.assign": "^4.1.0", - "object.entries": "^1.1.1" - } + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true }, - "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==", + "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": { - "get-stdin": "^6.0.0" + "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 + } } }, - "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "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", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "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": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" + "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 + } } }, - "eslint-plugin-es": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", - "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" + "color-convert": "^1.9.0" } }, - "eslint-plugin-eslint-comments": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz", - "integrity": "sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ==", + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "eslint-plugin-import": { - "version": "2.20.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", - "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" + "sprintf-js": "~1.0.2" } }, - "eslint-plugin-jest": { - "version": "23.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.9.0.tgz", - "integrity": "sha512-8mt5xJQIFh33W5nE7vCikkDTE4saTo08V91KjU6yI5sLQ9e8Jkp1OXkWJoIHLheFqY5OXIZdAjZmNYHSJ3IpzQ==", + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "^2.5.0" + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" } }, - "eslint-plugin-jest-formatting": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest-formatting/-/eslint-plugin-jest-formatting-1.2.0.tgz", - "integrity": "sha512-EqsbDByAtdQa5vEhJFUFMqTW7fghN0Qhb8oulM7R3j9+9xRuMsQKCPjWvCIxpWhl3SJJmlxBC25o1pUXiBHaAw==", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.5", - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", - "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" - } + "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 }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "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-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "dev": true, "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" } }, - "eslint-plugin-prettier": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz", - "integrity": "sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ==", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", "dev": true, "requires": { - "prettier-linter-helpers": "^1.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, - "eslint-plugin-react": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", - "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.15.1", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.2", - "xregexp": "^4.3.0" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "safer-buffer": "~2.1.0" } }, - "eslint-plugin-sonarjs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.5.0.tgz", - "integrity": "sha512-XW5MnzlRjhXpIdbULC/qAdJYHWw3rRLws/DyawdlPU/IdVr9AmRK1r2LaCvabwKOAW2XYYSo3kDX58E4MrB7PQ==", + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "eslint-plugin-unicorn": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-19.0.1.tgz", - "integrity": "sha512-fu0/h5mHXfBC6EkA3i2vCjsfC8j53+T9txGhNL4fpxJ+1JKsUKfv+tmXDgy0XnLHhFjnOZp4tRWJWbcykeIP2Q==", + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "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 + }, + "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 + }, + "axobject-query": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", + "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==", + "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==", "dev": true, "requires": { - "ci-info": "^2.0.0", - "clean-regexp": "^1.0.0", - "eslint-ast-utils": "^1.1.0", - "eslint-template-visitor": "^1.1.0", - "eslint-utils": "^2.0.0", - "import-modules": "^2.0.0", - "lodash": "^4.17.15", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.21", - "reserved-words": "^0.1.2", - "safe-regex": "^2.1.1", - "semver": "^7.1.3" + "@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.5.0", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.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==", + "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": { - "p-locate": "^4.1.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "p-try": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.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==", + "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": { - "p-limit": "^2.2.0" + "color-name": "~1.1.4" } }, - "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==", + "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 }, - "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" - } - }, - "path-exists": { + "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "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==", + "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": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "has-flag": "^4.0.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 } } }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "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": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "@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" } }, - "eslint-template-visitor": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-1.1.0.tgz", - "integrity": "sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw==", + "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==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.1", - "multimap": "^1.0.2" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__traverse": "^7.0.6" } }, - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "babel-preset-current-node-syntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz", + "integrity": "sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "@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-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" } }, - "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==", + "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==", "dev": true, "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "babel-plugin-jest-hoist": "^25.5.0", + "babel-preset-current-node-syntax": "^0.1.2" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "estraverse": "^5.1.0" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { - "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", - "dev": true + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.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" + } } } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "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": { - "estraverse": "^4.1.0" + "tweetnacl": "^0.14.3" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "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-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "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": { - "escape-string-regexp": "^1.0.5" + "fill-range": "^7.0.1" } }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "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": { - "flat-cache": "^2.0.1" + "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 + } } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "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": { - "locate-path": "^2.0.0" + "node-int64": "^0.4.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==", + "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 + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "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": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "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==", + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "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" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } } }, - "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==", + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", "dev": true, "requires": { - "is-glob": "^4.0.1" + "escape-string-regexp": "^1.0.5" } }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "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": { - "type-fest": "^0.8.1" + "restore-cursor": "^3.1.0" } }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "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 }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.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" + } + } } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "has-symbols": { + "collect-v8-coverage": { "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 - }, - "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==", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "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==", + "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": { - "safer-buffer": ">= 2.1.2 < 3" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "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 }, - "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==", + "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, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "delayed-stream": "~1.0.0" } }, - "import-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.0.0.tgz", - "integrity": "sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw==", + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "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 }, - "inflight": { + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "convert-source-map": { + "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" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", + "dev": true + }, + "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 + } + } + }, + "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 + } + } + }, + "damerau-levenshtein": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "assert-plus": "^1.0.0" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "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": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "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 + }, + "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-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": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-newline": { + "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-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "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": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "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 + }, + "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": { + "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.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "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.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "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", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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 + } + } + }, + "eslint-ast-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", + "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", + "dev": true, + "requires": { + "lodash.get": "^4.4.2", + "lodash.zip": "^4.2.0" + } + }, + "eslint-config-airbnb-base": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz", + "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.1" + } + }, + "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-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "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 + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-es": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", + "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-eslint-comments": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz", + "integrity": "sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "ignore": "^5.0.5" + } + }, + "eslint-plugin-import": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + } + }, + "eslint-plugin-jest": { + "version": "23.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.9.0.tgz", + "integrity": "sha512-8mt5xJQIFh33W5nE7vCikkDTE4saTo08V91KjU6yI5sLQ9e8Jkp1OXkWJoIHLheFqY5OXIZdAjZmNYHSJ3IpzQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^2.5.0" + } + }, + "eslint-plugin-jest-formatting": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest-formatting/-/eslint-plugin-jest-formatting-1.2.0.tgz", + "integrity": "sha512-EqsbDByAtdQa5vEhJFUFMqTW7fghN0Qhb8oulM7R3j9+9xRuMsQKCPjWvCIxpWhl3SJJmlxBC25o1pUXiBHaAw==", + "dev": true + }, + "eslint-plugin-jsx-a11y": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.5", + "aria-query": "^3.0.0", + "array-includes": "^3.0.3", + "ast-types-flow": "^0.0.7", + "axobject-query": "^2.0.2", + "damerau-levenshtein": "^1.0.4", + "emoji-regex": "^7.0.2", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.1" + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + } + }, + "eslint-plugin-prettier": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz", + "integrity": "sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", + "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.3", + "object.entries": "^1.1.1", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.15.1", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.2", + "xregexp": "^4.3.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-plugin-sonarjs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.5.0.tgz", + "integrity": "sha512-XW5MnzlRjhXpIdbULC/qAdJYHWw3rRLws/DyawdlPU/IdVr9AmRK1r2LaCvabwKOAW2XYYSo3kDX58E4MrB7PQ==", + "dev": true + }, + "eslint-plugin-unicorn": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-19.0.1.tgz", + "integrity": "sha512-fu0/h5mHXfBC6EkA3i2vCjsfC8j53+T9txGhNL4fpxJ+1JKsUKfv+tmXDgy0XnLHhFjnOZp4tRWJWbcykeIP2Q==", + "dev": true, + "requires": { + "ci-info": "^2.0.0", + "clean-regexp": "^1.0.0", + "eslint-ast-utils": "^1.1.0", + "eslint-template-visitor": "^1.1.0", + "eslint-utils": "^2.0.0", + "import-modules": "^2.0.0", + "lodash": "^4.17.15", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.21", + "reserved-words": "^0.1.2", + "safe-regex": "^2.1.1", + "semver": "^7.1.3" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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-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-template-visitor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-1.1.0.tgz", + "integrity": "sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", + "multimap": "^1.0.2" + } + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "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": "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": "^6.0.0", + "get-stream": "^4.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" + } + }, + "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", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + } + } + }, + "expect": { + "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.5.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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "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", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "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" + } + } + } + }, + "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-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "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" + } + }, + "fetch-har": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fetch-har/-/fetch-har-2.3.1.tgz", + "integrity": "sha512-G8NAHB5dcu2/G2r7bcRXPlMXOlVkLAwNkr5bglE/QG1QbCRk+Eny7CXEiNTMa38NSRPMDHmm6Zvvnm1G0AqyGw==" + }, + "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", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "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" + } + }, + "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", + "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": { + "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 + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "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", + "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-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", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "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": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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": "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.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "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": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "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-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.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", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "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", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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", + "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 + }, + "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": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "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 + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "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" + } + }, + "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" + } + }, + "import-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.0.0.tgz", + "integrity": "sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + } + }, + "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-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "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": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-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", + "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-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", + "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", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "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-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", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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-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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "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, + "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=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "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-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": { + "@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" + } + }, + "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": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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 + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "istanbul-reports": { + "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", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.5.4.tgz", + "integrity": "sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ==", + "dev": true, + "requires": { + "@jest/core": "^25.5.4", + "import-local": "^3.0.2", + "jest-cli": "^25.5.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "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 + }, + "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" + } + }, + "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==", + "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", + "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", + "micromatch": "^4.0.2", + "pretty-format": "^25.5.0", + "realpath-native": "^2.0.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "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.5.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "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.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.5.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "jest-util": "^25.5.0", + "pretty-format": "^25.5.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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==", + "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-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==", + "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-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.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.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.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.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.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.5.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", + "throat": "^5.0.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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==", + "dev": true, + "requires": { + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, + "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==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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==", + "dev": true, + "requires": { + "@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==", + "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.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.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.17.0", + "slash": "^3.0.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "jest-regex-util": "^25.2.6", + "jest-snapshot": "^25.5.1" + } + }, + "jest-runner": { + "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.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.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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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", + "@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.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", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-bom": { + "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 + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-serializer": { + "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.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.5.0", + "@types/prettier": "^1.19.0", + "chalk": "^3.0.0", + "expect": "^25.5.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", + "natural-compare": "^1.4.0", + "pretty-format": "^25.5.0", + "semver": "^6.3.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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==", "dev": true, "requires": { - "ansi-escapes": "^4.2.1", + "@jest/types": "^25.5.0", "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" + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -1257,15 +4809,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -1277,92 +4820,165 @@ } } }, - "internal-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", - "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", - "dev": true, - "requires": { - "es-abstract": "^1.17.0-next.1", - "has": "^1.0.3", - "side-channel": "^1.0.2" - } - }, - "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-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "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-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", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "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==", + "jest-validate": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", + "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "@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.5.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "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==", "dev": true, "requires": { - "has": "^1.0.3" + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "jest-util": "^25.5.0", + "string-length": "^3.1.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "is-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==", + "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==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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 + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "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", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -1379,12 +4995,64 @@ "esprima": "^4.0.0" } }, + "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-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", + "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", @@ -1397,6 +5065,38 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "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" + } + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "jsx-ast-utils": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", @@ -1407,6 +5107,24 @@ "object.assign": "^4.1.0" } }, + "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", @@ -1436,13 +5154,11 @@ } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { @@ -1457,12 +5173,27 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "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 + }, "lodash.zip": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", "dev": true }, + "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" + } + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -1472,6 +5203,69 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "make-dir": { + "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==", + "requires": { + "semver": "^6.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.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 + }, + "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": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mime-db": { + "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.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.44.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -1493,6 +5287,27 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "mixin-deep": { + "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", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -1520,6 +5335,25 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -1532,6 +5366,66 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "nock": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz", + "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.13", + "propagate": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "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 + }, + "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": { + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", + "shellwords": "^0.1.1", + "which": "^1.3.1" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -1542,14 +5436,80 @@ "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 + }, + "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=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "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 + }, + "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-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + } + } + }, "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", @@ -1562,6 +5522,15 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", @@ -1598,6 +5567,15 @@ "has": "^1.0.3" } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "object.values": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", @@ -1648,29 +5626,38 @@ "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", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true + }, + "p-finally": { + "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": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.2.0" } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "parent-module": { "version": "1.0.1", @@ -1690,12 +5677,23 @@ "error-ex": "^1.2.0" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "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==" + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -1714,6 +5712,11 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-to-regexp": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz", + "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==" + }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", @@ -1723,21 +5726,53 @@ "pify": "^2.0.0" } }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "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", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "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": { - "find-up": "^2.1.0" + "node-modules-regexp": "^1.0.0" + } + }, + "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==", + "requires": { + "find-up": "^4.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", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -1759,12 +5794,61 @@ "fast-diff": "^1.1.2" } }, + "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==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.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": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, "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", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, "prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", @@ -1776,12 +5860,45 @@ "react-is": "^16.8.1" } }, + "propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true + }, + "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 + }, + "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" + } + }, "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 + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -1799,15 +5916,72 @@ "path-type": "^2.0.0" } }, - "read-pkg-up": { + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "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 + } + } + }, + "realpath-native": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true }, "regenerator-runtime": { "version": "0.13.5", @@ -1815,6 +5989,27 @@ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "dev": true }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + } + } + }, "regexp-tree": { "version": "0.1.21", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.21.tgz", @@ -1837,6 +6032,108 @@ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "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": { + "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" + } + } + } + }, + "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": { + "lodash": "^4.17.15" + } + }, + "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": { + "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 + }, "reserved-words": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", @@ -1852,12 +6149,35 @@ "path-parse": "^1.0.6" } }, + "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": { + "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": "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": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "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", @@ -1868,6 +6188,12 @@ "signal-exit": "^3.0.2" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -1877,6 +6203,12 @@ "glob": "^7.1.3" } }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "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", @@ -1892,6 +6224,12 @@ "tslib": "^1.9.0" } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "safe-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", @@ -1907,12 +6245,190 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "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": { + "@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": { + "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" + } + } + } + }, + "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": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-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", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^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" + } + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -1928,6 +6444,13 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "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 + }, "side-channel": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", @@ -1944,6 +6467,18 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "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", @@ -1963,6 +6498,154 @@ } } }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.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" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.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" + } + } + } + }, + "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 + }, + "source-map-resolve": { + "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.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "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", + "source-map": "^0.6.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 + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -1989,17 +6672,86 @@ "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==", + "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", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "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", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "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 }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "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==", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" + } }, "string-width": { "version": "4.2.0", @@ -2108,6 +6860,18 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "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-json-comments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", @@ -2123,6 +6887,39 @@ "has-flag": "^3.0.0" } }, + "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": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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 + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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 + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -2154,12 +6951,39 @@ } } }, + "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": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "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": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "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", @@ -2175,6 +6999,90 @@ "os-tmpdir": "~1.0.2" } }, + "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", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + } + } + }, + "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": { + "is-number": "^7.0.0" + } + }, + "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" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "tslib": { "version": "1.11.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", @@ -2190,6 +7098,21 @@ "tslib": "^1.8.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": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -2199,12 +7122,79 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "typedarray-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, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "union-value": { + "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": "^2.0.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -2214,12 +7204,49 @@ "punycode": "^2.1.0" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "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 + }, + "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-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.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", + "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 + } + } + }, "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", @@ -2230,6 +7257,78 @@ "spdx-expression-parse": "^3.0.0" } }, + "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" + } + }, + "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": { + "browser-process-hrtime": "^1.0.0" + } + }, + "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": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "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": { + "iconv-lite": "0.4.24" + } + }, + "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": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -2239,12 +7338,65 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wrap-ansi": { + "version": "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": { + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -2260,6 +7412,36 @@ "mkdirp": "^0.5.1" } }, + "write-file-atomic": { + "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": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", + "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "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 + }, "xregexp": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", @@ -2268,6 +7450,41 @@ "requires": { "@babel/runtime-corejs3": "^7.8.3" } + }, + "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": "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" + } } } } diff --git a/package.json b/package.json index af801872..4d2f51e5 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "scripts": { "lint": "eslint .", "pretest": "npm run lint && npm run prettier", - "prettier": "prettier --list-different --write \"./**/**.js\"" + "prettier": "prettier --list-different --write \"./**/**.js\"", + "test": "jest --coverage" }, "repository": { "type": "git", @@ -16,10 +17,18 @@ }, "author": "Jon Ursenbach ", "license": "ISC", - "dependencies": {}, + "dependencies": { + "@readme/oas-to-har": "^6.6.2", + "@readme/oas-tooling": "^3.3.5", + "fetch-har": "^2.3.1", + "find-cache-dir": "^3.3.1", + "node-fetch": "^2.6.0" + }, "devDependencies": { "@readme/eslint-config": "^2.1.0", "eslint": "^6.8.0", + "jest": "^25.5.2", + "nock": "^12.0.3", "prettier": "^2.0.5" }, "prettier": "@readme/eslint-config/prettier" diff --git a/src/index.js b/src/index.js new file mode 100644 index 00000000..fe822b01 --- /dev/null +++ b/src/index.js @@ -0,0 +1,84 @@ +/* eslint-disable global-require */ +const fetch = require('node-fetch'); +const fetchHar = require('fetch-har'); +// const { URL } = require('url'); +const pkg = require('../package.json'); + +const Oas = require('@readme/oas-tooling'); +const oasToHar = require('@readme/oas-to-har'); +const findCacheDir = require('find-cache-dir'); + +global.fetch = fetch; +global.Request = fetch.Request; + +const HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']; +const cacheDir = findCacheDir({ name: pkg.name }); + +console.logFull = obj => { + console.log(require('util').inspect(obj, false, null, true)); +}; + +function getOperations(spec) { + return Object.keys(spec.paths) + .map(path => { + return Object.keys(spec.paths[path]).map(method => { + return { + method, + path, + ...spec.paths[path][method], + }; + }); + }) + .reduce((prev, next) => prev.concat(next), []); +} + +module.exports = uri => { + // eslint-disable-next-line import/no-dynamic-require, global-require + const spec = new Oas(typeof uri === 'string' ? require(uri) : uri); + + let authValues = {}; + + function auth(values) { + authValues = values; + } + + function fetchOperation(operation, path, body /* , other */) { + const params = {}; + if (arguments.length === 2) { + params.path = path; + params.body = path; + } else if (arguments.length === 3) { + params.path = path; + params.body = body; + } + + const har = oasToHar(spec, operation, params, authValues); + + // console.logFull(har); + + return fetchHar(har); + } + + const methods = HTTP_METHODS.map(name => { + return { + [name]: ((method, path, ...args) => { + const operation = spec.operation(path, method); + return fetchOperation(operation, ...args); + }).bind(null, name), + }; + }).reduce((prev, next) => Object.assign(prev, next)); + + return { + auth, + ...methods, + ...getOperations(spec) + .filter(operation => operation.operationId) + .reduce((prev, next) => { + return Object.assign(prev, { + [next.operationId]: ((operation, ...args) => { + return fetchOperation(operation, ...args); + }).bind(null, next), + }); + }, {}), + }; +}; From 5581667bbc84c89779d769d748b88b964f332f78 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 7 May 2020 11:24:40 -0700 Subject: [PATCH 04/23] feat: support for all kinds of oas-supported auth schemes --- .eslintrc | 5 +- __tests__/index.test.js | 235 +++++++++++++++++++++++++++++++--------- package-lock.json | 162 +++++++++++++-------------- package.json | 1 - src/index.js | 88 ++++++++++++--- 5 files changed, 344 insertions(+), 147 deletions(-) diff --git a/.eslintrc b/.eslintrc index 90564095..9ee8c36b 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,4 +1,7 @@ { "extends": "@readme/eslint-config", - "root": true + "root": true, + "rules": { + "no-console": "off" + } } diff --git a/__tests__/index.test.js b/__tests__/index.test.js index d9784ee4..f257bab8 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -1,3 +1,6 @@ +/* eslint-disable jest-formatting/padding-around-before-each-blocks */ +/* eslint-disable jest/no-commented-out-tests */ +/* eslint-disable prettier/prettier */ /* eslint-disable jest-formatting/padding-around-test-blocks */ const nock = require('nock'); const { join } = require('path'); @@ -7,7 +10,7 @@ const petstore = api(join(__dirname, './__fixtures__/petstore.json')); const oasUrl = 'https://api.example.com'; -console.logFull = obj => { +console.logx = obj => { // eslint-disable-next-line global-require console.log(require('util').inspect(obj, false, null, true)); }; @@ -38,18 +41,15 @@ beforeAll(() => { describe('#preloading', () => { it.todo('should error if passing in swagger 2'); it.todo('should error if oas file is not valid'); - - describe('file', () => { - it.todo('should default to swagger.json/openapi.json'); - it.todo('should fetch files over http'); - it.todo('should fetch files from disk'); - it.todo('should work for yaml'); - it.todo('should work for json'); - - it('should work for object', () => { - const sdk = api(createOas()); - expect(typeof sdk.get).toBe('function'); - }); + it.todo('should default to swagger.json/openapi.json'); + it.todo('should fetch files over http'); + it.todo('should fetch files from disk'); + it.todo('should work for yaml'); + it.todo('should work for json'); + + it('should work for object', () => { + const sdk = api(createOas()); + expect(typeof sdk.get).toBe('function'); }); }); @@ -60,7 +60,7 @@ describe('#accessors', () => { }); }); - describe('#operationId', () => { + describe('#operationId()', () => { it('should work for operationId', () => { const mock = nock('http://petstore.swagger.io/v1').get('/pets').reply(200); expect(() => petstore.listPets()).not.toThrow(); @@ -273,62 +273,199 @@ describe('#fetch', () => { }); }); -describe('#auth', () => { - describe('OAuth 2', () => { - const securityOas = Object.assign( - createOas('get', '/', { - operationId: 'getSomething', - security: [ - { - auth: [], +describe('#auth()', () => { + const baseSecurityOas = createOas('get', '/', { + operationId: 'getSomething', + security: [ + { + auth: [], + }, + ], + }); + + describe('API Keys', () => { + const apiKey = '123457890'; + + describe('in: query', () => { + const securityOas = { + ...baseSecurityOas, + components: { + securitySchemes: { + auth: { + type: 'apiKey', + name: 'apiKeyParam', + in: 'query', + }, }, - ], - }), - { + }, + } + + it('should allow you to supply auth', () => { + const sdk = api(securityOas); + const mock = nock(oasUrl) + .get('/') + .query({apiKeyParam: apiKey}) + .reply(200, {}); + + return sdk.auth(apiKey).getSomething().then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); + + it('should throw if you supply multiple auth keys', () => { + const sdk = api(securityOas); + + expect(() => { + sdk.auth(apiKey, apiKey).getSomething(); + }).toThrow(/only a single key is needed/i); + }); + }); + + describe('in: header', () => { + const securityOas = { + ...baseSecurityOas, components: { securitySchemes: { auth: { - type: 'oauth2', + type: 'apiKey', + name: 'apiKeyHeader', + in: 'header', }, }, }, } - ); - it.skip('should allow you to pass in a single auth', () => { - const apiKey = '123'; - const sdk = api(securityOas); + it('should allow you to supply auth', () => { + const sdk = api(securityOas); + const mock = nock(oasUrl, { reqheaders: { apiKeyHeader: apiKey} }) + .get('/') + .reply(200, {}); + + return sdk.auth(apiKey).getSomething().then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); + + it('should throw if you supply multiple auth keys', () => { + const sdk = api(securityOas); - const mock = nock(oasUrl, { - reqheaders: { - authorization: `bearer ${apiKey}`, + expect(() => { + sdk.auth(apiKey, apiKey).getSomething(); + }).toThrow(/only a single key is needed/i); + }); + }); + }); + + describe('HTTP', () => { + describe('scheme: basic', () => { + const user = 'username' + const pass = 'changeme'; + const securityOas = { + ...baseSecurityOas, + components: { + securitySchemes: { + auth: { + type: 'http', + scheme: 'basic', + }, + }, }, - }) - .get('/') - .reply(200, {}); + } - sdk.auth(apiKey); - sdk.getSomething(); + it('should allow you to supply auth', () => { + const sdk = api(securityOas); + const mock = nock(oasUrl, { reqheaders: { authorization: `Basic ${Buffer.from(`${user}:${pass}`).toString('base64')}` } }) + .get('/') + .reply(200, {}); - mock.done(); + return sdk.auth(user, pass).getSomething().then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); + + it('should allow you to not pass in a password', () => { + const sdk = api(securityOas); + const mock = nock(oasUrl, { reqheaders: { authorization: `Basic ${Buffer.from(`${user}:`).toString('base64')}` } }) + .get('/') + .reply(200, {}); + + return sdk.auth(user).getSomething().then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); }); - it('should allow you to pass in multiple auths', () => { - const apiKey = '123'; - const sdk = api(securityOas); + describe('scheme: bearer', () => { + const apiKey = '123457890'; + const securityOas = { + ...baseSecurityOas, + components: { + securitySchemes: { + auth: { + type: 'http', + scheme: 'bearer', + }, + }, + }, + } - const mock = nock(oasUrl, { - reqheaders: { - authorization: `Bearer ${apiKey}`, + it('should allow you to supply auth', () => { + const sdk = api(securityOas); + const mock = nock(oasUrl, { reqheaders: { authorization: `Bearer ${apiKey}` } }) + .get('/') + .reply(200, {}); + + return sdk.auth(apiKey).getSomething().then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); + + it('should throw if you pass in multiple bearer tokens', () => { + const sdk = api(securityOas); + + expect(() => { + sdk.auth(apiKey, apiKey).getSomething(); + }).toThrow(/only a single token is needed/i); + }); + }); + }); + + describe('OAuth 2', () => { + const apiKey = '123457890'; + const securityOas = { + ...baseSecurityOas, + components: { + securitySchemes: { + auth: { + type: 'oauth2', + }, }, - }) + }, + } + + it('should allow you to supply auth', () => { + const sdk = api(securityOas); + const mock = nock(oasUrl, { reqheaders: { authorization: `Bearer ${apiKey}` } }) .get('/') .reply(200, {}); - sdk.auth({ auth: apiKey }); - sdk.getSomething(); + return sdk.auth(apiKey).getSomething().then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); + + it('should throw if you pass in multiple bearer tokens', () => { + const sdk = api(securityOas); - mock.done(); + expect(() => { + sdk.auth(apiKey, apiKey).getSomething(); + }).toThrow(/only a single token is needed/i); }); }); }); diff --git a/package-lock.json b/package-lock.json index b910d2fe..bc979a14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1786,11 +1786,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1912,15 +1907,6 @@ "whatwg-url": "^7.0.0" } }, - "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" - } - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -2245,6 +2231,23 @@ "requires": { "debug": "^2.6.9", "resolve": "^1.13.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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "eslint-module-utils": { @@ -2257,63 +2260,20 @@ "pkg-dir": "^2.0.0" }, "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "ms": "2.0.0" } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { + "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } } } }, @@ -2355,6 +2315,23 @@ "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", "resolve": "^1.12.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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "eslint-plugin-jest": { @@ -2653,6 +2630,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", @@ -2670,6 +2656,12 @@ "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 } } }, @@ -2888,16 +2880,6 @@ "to-regex-range": "^5.0.1" } }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -5207,8 +5189,17 @@ "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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "makeerror": { @@ -5317,12 +5308,6 @@ "minimist": "^1.2.5" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "multimap": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", @@ -6514,6 +6499,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", @@ -6532,6 +6526,12 @@ "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", diff --git a/package.json b/package.json index 4d2f51e5..a66e5466 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "@readme/oas-to-har": "^6.6.2", "@readme/oas-tooling": "^3.3.5", "fetch-har": "^2.3.1", - "find-cache-dir": "^3.3.1", "node-fetch": "^2.6.0" }, "devDependencies": { diff --git a/src/index.js b/src/index.js index fe822b01..84569e5f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,20 +1,23 @@ +/* eslint-disable no-underscore-dangle */ +/* eslint-disable prettier/prettier */ +/* eslint-disable no-unused-vars */ /* eslint-disable global-require */ +/* eslint-disable import/no-dynamic-require */ const fetch = require('node-fetch'); const fetchHar = require('fetch-har'); // const { URL } = require('url'); -const pkg = require('../package.json'); +// const pkg = require('../package.json'); const Oas = require('@readme/oas-tooling'); const oasToHar = require('@readme/oas-to-har'); -const findCacheDir = require('find-cache-dir'); global.fetch = fetch; global.Request = fetch.Request; +global.Headers = fetch.Headers; const HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']; -const cacheDir = findCacheDir({ name: pkg.name }); -console.logFull = obj => { +console.logx = obj => { console.log(require('util').inspect(obj, false, null, true)); }; @@ -22,27 +25,80 @@ function getOperations(spec) { return Object.keys(spec.paths) .map(path => { return Object.keys(spec.paths[path]).map(method => { - return { - method, - path, - ...spec.paths[path][method], - }; + return spec.operation(path, method); }); }) .reduce((prev, next) => prev.concat(next), []); } module.exports = uri => { - // eslint-disable-next-line import/no-dynamic-require, global-require const spec = new Oas(typeof uri === 'string' ? require(uri) : uri); - let authValues = {}; + const authKeys = []; - function auth(values) { - authValues = values; + function auth(...values) { + authKeys.push(values); + return this; + } + + // Needs work for supporting multiple different kinds of auth at the same time. for example if an operation uses + // OAuth and HTTP bearer, how can we guarantee that the OAuth bearer is used with oauth? + // @todo + function prepareAuth(operation) { + if (authKeys.length === 0) { + return {}; + } + + const prepared = {}; + const security = operation.prepareSecurity(); + const securitySchemes = Object.keys(security); + + authKeys.forEach((authKey, idx) => { + const schemes = security[securitySchemes[idx]]; + if (schemes.length > 1) { + throw new Error(`Sorry, this API currently requires multiple forms of authentication which we don't yet support.`); + } + + const scheme = schemes[0]; + if (scheme.type === 'http') { + if (scheme.scheme === 'basic') { + prepared[scheme._key] = { + user: authKey[0], + pass: (authKey.length === 2) ? authKey[1] : '' + }; + } else if (scheme.scheme === 'bearer') { + if (authKey.length > 1) { + throw new Error('Multiple auth tokens were supplied for the auth on this endpoint, but only a single token is needed.'); + } + + prepared[scheme._key] = authKey[0]; + } + } else if (scheme.type === 'oauth2') { + if (authKey.length > 1) { + throw new Error('Multiple auth tokens were supplied for the auth on this endpoint, but only a single token is needed.'); + } + + prepared[scheme._key] = authKey[0]; + } else if (scheme.type === 'apiKey') { + if (authKey.length > 1) { + throw new Error('Multiple auth keys were supplied for the auth on this endpoint, but only a single key is needed.'); + } + + if (scheme.in === 'query' || scheme.in === 'header') { + prepared[scheme._key] = authKey[0]; + } + } else { + throw new Error(`Sorry, this API currently supports a scheme, ${scheme.type}, that we don't yet support.`); + } + }); + + return prepared } function fetchOperation(operation, path, body /* , other */) { + // console.logFull(spec.operation('/', 'get')) + // console.logFull(operation) + const params = {}; if (arguments.length === 2) { params.path = path; @@ -52,9 +108,11 @@ module.exports = uri => { params.body = body; } - const har = oasToHar(spec, operation, params, authValues); + const har = oasToHar(spec, operation, params, prepareAuth(operation)); - // console.logFull(har); + // console.logx(spec); + // console.logx(authValues); + // console.logx(har); return fetchHar(har); } From 4efb16f45d4bc4011c4c49c18666de363b86bcb8 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Fri, 8 May 2020 10:37:18 -0700 Subject: [PATCH 05/23] test: splitting the auth tests out into its own file --- .gitignore | 1 + __tests__/__fixtures__/createOas.js | 20 +++ __tests__/auth.test.js | 221 +++++++++++++++++++++++++++ __tests__/index.test.js | 229 +--------------------------- 4 files changed, 247 insertions(+), 224 deletions(-) create mode 100644 __tests__/__fixtures__/createOas.js create mode 100644 __tests__/auth.test.js diff --git a/.gitignore b/.gitignore index b509c88b..a36e8379 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ coverage/ node_modules/ +example.js diff --git a/__tests__/__fixtures__/createOas.js b/__tests__/__fixtures__/createOas.js new file mode 100644 index 00000000..7a5dd719 --- /dev/null +++ b/__tests__/__fixtures__/createOas.js @@ -0,0 +1,20 @@ +module.exports = serverUrl => { + return function (method = 'get', path = '/', operation = {}) { + return { + openapi: '3.0.0', + info: { + title: 'OAS test', + }, + servers: [ + { + url: serverUrl, + }, + ], + paths: { + [path]: { + [method]: operation, + }, + }, + }; + }; +}; diff --git a/__tests__/auth.test.js b/__tests__/auth.test.js new file mode 100644 index 00000000..e88d040c --- /dev/null +++ b/__tests__/auth.test.js @@ -0,0 +1,221 @@ +const nock = require('nock'); +const api = require('../src'); + +const serverUrl = 'https://api.example.com'; +const createOas = require('./__fixtures__/createOas')(serverUrl); + +describe('#auth()', () => { + const baseSecurityOas = createOas('get', '/', { + operationId: 'getSomething', + security: [ + { + auth: [], + }, + ], + }); + + describe('API Keys', () => { + const apiKey = '123457890'; + + describe('in: query', () => { + const securityOas = { + ...baseSecurityOas, + components: { + securitySchemes: { + auth: { + type: 'apiKey', + name: 'apiKeyParam', + in: 'query', + }, + }, + }, + }; + + it('should allow you to supply auth', () => { + const sdk = api(securityOas); + const mock = nock(serverUrl).get('/').query({ apiKeyParam: apiKey }).reply(200, {}); + + return sdk + .auth(apiKey) + .getSomething() + .then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); + + it('should throw if you supply multiple auth keys', () => { + const sdk = api(securityOas); + + expect(() => { + sdk.auth(apiKey, apiKey).getSomething(); + }).toThrow(/only a single key is needed/i); + }); + }); + + describe('in: header', () => { + const securityOas = { + ...baseSecurityOas, + components: { + securitySchemes: { + auth: { + type: 'apiKey', + name: 'apiKeyHeader', + in: 'header', + }, + }, + }, + }; + + it('should allow you to supply auth', () => { + const sdk = api(securityOas); + const mock = nock(serverUrl, { reqheaders: { apiKeyHeader: apiKey } }) + .get('/') + .reply(200, {}); + + return sdk + .auth(apiKey) + .getSomething() + .then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); + + it('should throw if you supply multiple auth keys', () => { + const sdk = api(securityOas); + + expect(() => { + sdk.auth(apiKey, apiKey).getSomething(); + }).toThrow(/only a single key is needed/i); + }); + }); + }); + + describe('HTTP', () => { + describe('scheme: basic', () => { + const user = 'username'; + const pass = 'changeme'; + const securityOas = { + ...baseSecurityOas, + components: { + securitySchemes: { + auth: { + type: 'http', + scheme: 'basic', + }, + }, + }, + }; + + it('should allow you to supply auth', () => { + const sdk = api(securityOas); + const mock = nock(serverUrl, { + reqheaders: { authorization: `Basic ${Buffer.from(`${user}:${pass}`).toString('base64')}` }, + }) + .get('/') + .reply(200, {}); + + return sdk + .auth(user, pass) + .getSomething() + .then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); + + it('should allow you to not pass in a password', () => { + const sdk = api(securityOas); + const mock = nock(serverUrl, { + reqheaders: { authorization: `Basic ${Buffer.from(`${user}:`).toString('base64')}` }, + }) + .get('/') + .reply(200, {}); + + return sdk + .auth(user) + .getSomething() + .then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); + }); + + describe('scheme: bearer', () => { + const apiKey = '123457890'; + const securityOas = { + ...baseSecurityOas, + components: { + securitySchemes: { + auth: { + type: 'http', + scheme: 'bearer', + }, + }, + }, + }; + + it('should allow you to supply auth', () => { + const sdk = api(securityOas); + const mock = nock(serverUrl, { reqheaders: { authorization: `Bearer ${apiKey}` } }) + .get('/') + .reply(200, {}); + + return sdk + .auth(apiKey) + .getSomething() + .then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); + + it('should throw if you pass in multiple bearer tokens', () => { + const sdk = api(securityOas); + + expect(() => { + sdk.auth(apiKey, apiKey).getSomething(); + }).toThrow(/only a single token is needed/i); + }); + }); + }); + + describe('OAuth 2', () => { + const apiKey = '123457890'; + const securityOas = { + ...baseSecurityOas, + components: { + securitySchemes: { + auth: { + type: 'oauth2', + }, + }, + }, + }; + + it('should allow you to supply auth', () => { + const sdk = api(securityOas); + const mock = nock(serverUrl, { reqheaders: { authorization: `Bearer ${apiKey}` } }) + .get('/') + .reply(200, {}); + + return sdk + .auth(apiKey) + .getSomething() + .then(res => { + expect(res.status).toBe(200); + mock.done(); + }); + }); + + it('should throw if you pass in multiple bearer tokens', () => { + const sdk = api(securityOas); + + expect(() => { + sdk.auth(apiKey, apiKey).getSomething(); + }).toThrow(/only a single token is needed/i); + }); + }); +}); diff --git a/__tests__/index.test.js b/__tests__/index.test.js index f257bab8..4d415f1d 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -8,36 +8,14 @@ const api = require('../src'); const petstore = api(join(__dirname, './__fixtures__/petstore.json')); -const oasUrl = 'https://api.example.com'; +const serverUrl = 'https://api.example.com'; +const createOas = require('./__fixtures__/createOas')(serverUrl); console.logx = obj => { // eslint-disable-next-line global-require console.log(require('util').inspect(obj, false, null, true)); }; -function createOas(method = 'get', path = '/', operation = {}) { - return { - openapi: '3.0.0', - info: { - title: 'OAS test', - }, - servers: [ - { - url: oasUrl, - }, - ], - paths: { - [path]: { - [method]: operation, - }, - }, - }; -} - -beforeAll(() => { - nock.disableNetConnect(); -}); - describe('#preloading', () => { it.todo('should error if passing in swagger 2'); it.todo('should error if oas file is not valid'); @@ -208,10 +186,10 @@ describe('#fetch', () => { }) ); - const mock = nock(oasUrl).put('/123').reply(200); + const mock = nock(serverUrl).put('/123').reply(200); return sdk.put('/{id}', { id: 123 }).then(res => { expect(res.status).toBe(200); - expect(res.url).toBe(`${oasUrl}/123`); + expect(res.url).toBe(`${serverUrl}/123`); mock.done(); }); }); @@ -245,7 +223,7 @@ describe('#fetch', () => { }) ); - const mock = nock(oasUrl) + const mock = nock(serverUrl) .put('/123', { a: 1 }) .reply(200, (uri, requestBody) => { return { a: requestBody.a + 100 }; @@ -272,200 +250,3 @@ describe('#fetch', () => { it.todo('should validate auth params'); }); }); - -describe('#auth()', () => { - const baseSecurityOas = createOas('get', '/', { - operationId: 'getSomething', - security: [ - { - auth: [], - }, - ], - }); - - describe('API Keys', () => { - const apiKey = '123457890'; - - describe('in: query', () => { - const securityOas = { - ...baseSecurityOas, - components: { - securitySchemes: { - auth: { - type: 'apiKey', - name: 'apiKeyParam', - in: 'query', - }, - }, - }, - } - - it('should allow you to supply auth', () => { - const sdk = api(securityOas); - const mock = nock(oasUrl) - .get('/') - .query({apiKeyParam: apiKey}) - .reply(200, {}); - - return sdk.auth(apiKey).getSomething().then(res => { - expect(res.status).toBe(200); - mock.done(); - }); - }); - - it('should throw if you supply multiple auth keys', () => { - const sdk = api(securityOas); - - expect(() => { - sdk.auth(apiKey, apiKey).getSomething(); - }).toThrow(/only a single key is needed/i); - }); - }); - - describe('in: header', () => { - const securityOas = { - ...baseSecurityOas, - components: { - securitySchemes: { - auth: { - type: 'apiKey', - name: 'apiKeyHeader', - in: 'header', - }, - }, - }, - } - - it('should allow you to supply auth', () => { - const sdk = api(securityOas); - const mock = nock(oasUrl, { reqheaders: { apiKeyHeader: apiKey} }) - .get('/') - .reply(200, {}); - - return sdk.auth(apiKey).getSomething().then(res => { - expect(res.status).toBe(200); - mock.done(); - }); - }); - - it('should throw if you supply multiple auth keys', () => { - const sdk = api(securityOas); - - expect(() => { - sdk.auth(apiKey, apiKey).getSomething(); - }).toThrow(/only a single key is needed/i); - }); - }); - }); - - describe('HTTP', () => { - describe('scheme: basic', () => { - const user = 'username' - const pass = 'changeme'; - const securityOas = { - ...baseSecurityOas, - components: { - securitySchemes: { - auth: { - type: 'http', - scheme: 'basic', - }, - }, - }, - } - - it('should allow you to supply auth', () => { - const sdk = api(securityOas); - const mock = nock(oasUrl, { reqheaders: { authorization: `Basic ${Buffer.from(`${user}:${pass}`).toString('base64')}` } }) - .get('/') - .reply(200, {}); - - return sdk.auth(user, pass).getSomething().then(res => { - expect(res.status).toBe(200); - mock.done(); - }); - }); - - it('should allow you to not pass in a password', () => { - const sdk = api(securityOas); - const mock = nock(oasUrl, { reqheaders: { authorization: `Basic ${Buffer.from(`${user}:`).toString('base64')}` } }) - .get('/') - .reply(200, {}); - - return sdk.auth(user).getSomething().then(res => { - expect(res.status).toBe(200); - mock.done(); - }); - }); - }); - - describe('scheme: bearer', () => { - const apiKey = '123457890'; - const securityOas = { - ...baseSecurityOas, - components: { - securitySchemes: { - auth: { - type: 'http', - scheme: 'bearer', - }, - }, - }, - } - - it('should allow you to supply auth', () => { - const sdk = api(securityOas); - const mock = nock(oasUrl, { reqheaders: { authorization: `Bearer ${apiKey}` } }) - .get('/') - .reply(200, {}); - - return sdk.auth(apiKey).getSomething().then(res => { - expect(res.status).toBe(200); - mock.done(); - }); - }); - - it('should throw if you pass in multiple bearer tokens', () => { - const sdk = api(securityOas); - - expect(() => { - sdk.auth(apiKey, apiKey).getSomething(); - }).toThrow(/only a single token is needed/i); - }); - }); - }); - - describe('OAuth 2', () => { - const apiKey = '123457890'; - const securityOas = { - ...baseSecurityOas, - components: { - securitySchemes: { - auth: { - type: 'oauth2', - }, - }, - }, - } - - it('should allow you to supply auth', () => { - const sdk = api(securityOas); - const mock = nock(oasUrl, { reqheaders: { authorization: `Bearer ${apiKey}` } }) - .get('/') - .reply(200, {}); - - return sdk.auth(apiKey).getSomething().then(res => { - expect(res.status).toBe(200); - mock.done(); - }); - }); - - it('should throw if you pass in multiple bearer tokens', () => { - const sdk = api(securityOas); - - expect(() => { - sdk.auth(apiKey, apiKey).getSomething(); - }).toThrow(/only a single token is needed/i); - }); - }); -}); From 3ddf767aed5a8ff54dd4aba07bded4035c18d6f4 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Wed, 13 May 2020 16:27:04 -0700 Subject: [PATCH 06/23] feat: first draft on body/metadata parameter handling sugar --- .prettierignore | 1 + README.md | 3 + __tests__/index.test.js | 7 +- __tests__/lib/prepareParams.test.js | 187 ++++++++++++ package-lock.json | 457 +++++++++++++++++++++------- package.json | 21 +- src/index.js | 80 +---- src/lib/index.js | 7 + src/lib/prepareAuth.js | 67 ++++ src/lib/prepareParams.js | 134 ++++++++ 10 files changed, 771 insertions(+), 193 deletions(-) create mode 100644 __tests__/lib/prepareParams.test.js create mode 100644 src/lib/index.js create mode 100644 src/lib/prepareAuth.js create mode 100644 src/lib/prepareParams.js diff --git a/.prettierignore b/.prettierignore index 404abb22..9a793a85 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,2 @@ coverage/ +example.js diff --git a/README.md b/README.md index a1df0ab7..13a7f6e8 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ # api + + +[![Build](https://github.com/readmeio/api/workflows/CI/badge.svg)](https://github.com/readmeio/api) diff --git a/__tests__/index.test.js b/__tests__/index.test.js index 4d415f1d..2d6d04a1 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -1,6 +1,3 @@ -/* eslint-disable jest-formatting/padding-around-before-each-blocks */ -/* eslint-disable jest/no-commented-out-tests */ -/* eslint-disable prettier/prettier */ /* eslint-disable jest-formatting/padding-around-test-blocks */ const nock = require('nock'); const { join } = require('path'); @@ -25,6 +22,8 @@ describe('#preloading', () => { it.todo('should work for yaml'); it.todo('should work for json'); + it.todo('should deref before caching'); + it('should work for object', () => { const sdk = api(createOas()); expect(typeof sdk.get).toBe('function'); @@ -81,7 +80,7 @@ describe('#fetch', () => { it.todo('should pass through header params'); it.todo('should pass through auth params'); - it('should pass through path params for operationId', () => { + it.only('should pass through path params for operationId', () => { const response = { id: petId, name: 'Buster', diff --git a/__tests__/lib/prepareParams.test.js b/__tests__/lib/prepareParams.test.js new file mode 100644 index 00000000..9778524f --- /dev/null +++ b/__tests__/lib/prepareParams.test.js @@ -0,0 +1,187 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable jest/no-commented-out-tests */ +/* eslint-disable jest/expect-expect */ +/* eslint-disable jest-formatting/padding-around-test-blocks */ +/* eslint-disable prettier/prettier */ +const Oas = require('@readme/oas-tooling'); +const $RefParser = require("@apidevtools/json-schema-ref-parser"); +const oasToHar = require('@readme/oas-to-har'); +const readmeExample = require('@readme/oas-examples/3.0/json/readme.json'); +const usptoExample = require('@readme/oas-examples/3.0/json/uspto.json'); + +const serverUrl = 'https://api.example.com'; +const createOas = require('../__fixtures__/createOas')(serverUrl); +const prepareParams = require('../../src/lib/prepareParams'); + +console.logx = obj => { + // eslint-disable-next-line global-require + console.log(require('util').inspect(obj, false, null, true)); +}; + +const arraySchema = createOas('put', '/', { + requestBody: { + content: { + 'application/json': { + schema: { + type: 'array', + items: { + type: 'object', + properties: { + name: { + type: 'string' + } + } + } + } + } + } + } +}) + +describe('#prepareParams', () => { + let readmeSpec; + let usptoSpec; + + beforeAll(async () => { + let schema = await $RefParser.dereference(readmeExample); + readmeSpec = new Oas(schema); + + schema = await $RefParser.dereference(usptoExample); + usptoSpec = new Oas(schema); + }); + + it('should prepare nothing if nothing was supplied', () => { + const operation = readmeSpec.operation('/api-specification', 'post') + + expect(prepareParams(operation)).toStrictEqual({}); + expect(prepareParams(operation, null, null)).toStrictEqual({}); + expect(prepareParams(operation, [], [])).toStrictEqual({}); + expect(prepareParams(operation, {}, {})).toStrictEqual({}); + }); + + it('should prepare body and metadata when both are supplied', async () => { + const operation = readmeSpec.operation('/api-specification', 'post') + const body = { + spec: 'this is the contents of an api specification' + }; + + const metadata = { + 'x-readme-version': '1.0' + }; + + expect(prepareParams(operation, body, metadata)).toStrictEqual({ + body: { + spec: 'this is the contents of an api specification' + }, + header: { + 'x-readme-version': '1.0' + }, + }) + }); + + it('should prepare body if body is a primitive', () => { + const schema = createOas('put', '/', { + requestBody: { + content: { + 'text/plain': { + schema: { + type: 'string' + } + } + } + } + }); + + const operation = (new Oas(schema)).operation('/', 'put'); + const body = 'Brie cheeseburger ricotta.'; + + expect(prepareParams(operation, body, {})).toStrictEqual({ + body + }); + }); + + it('should prepare body if body is an array', () => { + const operation = (new Oas(arraySchema)).operation('/', 'put'); + const body = [ + { + name: 'Buster' + } + ] + + expect(prepareParams(operation, body, {})).toStrictEqual({ + body + }); + }); + + it('should handle bodies when the content type is application/x-www-form-urlencoded', async () => { + const operation = usptoSpec.operation('/{dataset}/{version}/records', 'post'); + const body = { + criteria: '*:*' + }; + + const metadata = { + dataset: 'v1', + version: 'oa_citations' + }; + + expect(prepareParams(operation, body, metadata)).toStrictEqual({ + path: { + dataset: 'v1', + version: 'oa_citations' + }, + formData: { + criteria: '*:*' + } + }); + }); + + describe('supplying just a body or metadata', () => { + it('should handle if supplied is a body', () => { + const operation = readmeSpec.operation('/api-specification', 'post') + const body = { + spec: 'this is the contents of an api specification', + }; + + expect(prepareParams(operation, body)).toStrictEqual({ + body + }) + }); + + it('should prepare a body if supplied is primitive', () => { + const operation = readmeSpec.operation('/api-specification', 'post') + const body = 'this is a primitive value'; + + expect(prepareParams(operation, body)).toStrictEqual({ + body + }) + }); + + it('should prepare just a body if supplied argument is an array', () => { + const operation = (new Oas(arraySchema)).operation('/', 'put'); + const body = [ + { + name: 'Buster' + } + ] + + expect(prepareParams(operation, body)).toStrictEqual({ + body + }) + }); + + it('should prepare just metadata if supplied is metadata', () => { + const operation = readmeSpec.operation('/api-specification', 'post') + const metadata = { + 'x-readme-version': '1.0' + }; + + expect(prepareParams(operation, metadata)).toStrictEqual({ + header: { + 'x-readme-version': '1.0' + } + }) + }); + }); + + it.todo(`should be able to handle parameters when they're defined as common parameters`); +}); diff --git a/package-lock.json b/package-lock.json index bc979a14..1adcbbf5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,16 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@apidevtools/json-schema-ref-parser": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.1.tgz", + "integrity": "sha512-Qsdz0W0dyK84BuBh5KZATWXOtVDXIF2EeNRzpyWblPUeAmnIokwWcwrpAm5pTPMjuWoIQt9C67X3Af1OlL6oSw==", + "requires": { + "@jsdevtools/ono": "^7.1.2", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -899,10 +909,23 @@ } } }, + "@jsdevtools/ono": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.2.tgz", + "integrity": "sha512-qS/a24RA5FEoiJS9wiv6Pwg2c/kiUo3IVUQcfeM9JvsR6pM8Yx+yl/6xWYLckZCT5jpLNhslgjiA8p/XcGyMRQ==" + }, + "@openapi-contrib/openapi-schema-to-json-schema": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.0.0.tgz", + "integrity": "sha512-nM0Xn6lCwk1nt/fCWwiLBT1SbH4TlX099bWfz4h5lleW7yeu3SHGDP3knFBDHXPCLwywo5qqOOTVvjTTGf/7lA==", + "requires": { + "deep-equal": "^1.0.1" + } + }, "@readme/eslint-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@readme/eslint-config/-/eslint-config-2.1.0.tgz", - "integrity": "sha512-CHEgpeEZbhmeqrtR3sVbkxkgL56qXevujP6TUYa0NKZqi+gckJ1dDYnyMka/frPVfuiHl1L9dwN5oHi8UwADqQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@readme/eslint-config/-/eslint-config-3.0.0.tgz", + "integrity": "sha512-+u9UGfU8mV+X1MoF7lfYkHY0VR5CP7Jg36qV9AeH8esSQgvbnzHNMPOTwFyRVucZis/YuiN8/ZBK9Fz3fZnViw==", "dev": true, "requires": { "eslint-config-airbnb-base": "^14.0.0", @@ -919,10 +942,15 @@ "eslint-plugin-unicorn": "^19.0.1" } }, + "@readme/oas-examples": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@readme/oas-examples/-/oas-examples-3.4.0.tgz", + "integrity": "sha512-Wc682b1UMkVZ8YjdEGVglYNy0+UCrBc8Ark9O32pt7/kRWWoWzTrTZCpLqyiyMIC5vAV8LQkzq49MhE0+hnosA==" + }, "@readme/oas-extensions": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@readme/oas-extensions/-/oas-extensions-6.4.0.tgz", - "integrity": "sha512-/zLzwK9E8E/pQSQ97gl4TADzpiwSpADYfbD89zx2PmYdUwEah0Pm9yAiLIk5qfBVnOtDLjLijQoVAsf7u0NNwg==" + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/@readme/oas-extensions/-/oas-extensions-6.9.4.tgz", + "integrity": "sha512-FnuLVigSsmCUHgwIqSkWLrwCdt/7ou2/zKincUgkZbgS422WKMt1LdRpvH7Kg4FzTafuA2bxlyCsbBQVuIBKZw==" }, "@readme/oas-to-har": { "version": "6.6.2", @@ -935,9 +963,9 @@ } }, "@readme/oas-tooling": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@readme/oas-tooling/-/oas-tooling-3.3.5.tgz", - "integrity": "sha512-aRsxgkiSyD1UCAjM043qf9T9O/7eFQf6aSp1X8+ez9DpGe89vAFLZeM1jGxyKw91G6UT6IW4EhiS354UKm26tw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@readme/oas-tooling/-/oas-tooling-3.4.0.tgz", + "integrity": "sha512-LpeVG4x+iHq12c2YkDgZ3heHUKqAYfwEVcOdNqwlekDIKiUEMmNjLmJ+I1ODfUfbpdGFQkxuX8eS69ozOyKokg==", "requires": { "jsonpointer": "^4.0.1", "path-to-regexp": "^6.1.0" @@ -1079,21 +1107,21 @@ "dev": true }, "@typescript-eslint/experimental-utils": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz", - "integrity": "sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.32.0.tgz", + "integrity": "sha512-oDWuB2q5AXsQ/mLq2N4qtWiBASWXPf7KhqXgeGH4QsyVKx+km8F6Vfqd3bspJQyhyCqxcbLO/jKJuIV3DzHZ6A==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.31.0", + "@typescript-eslint/typescript-estree": "2.32.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.31.0.tgz", - "integrity": "sha512-vxW149bXFXXuBrAak0eKHOzbcu9cvi6iNcJDzEtOkRwGHxJG15chiAQAwhLOsk+86p9GTr/TziYvw+H9kMaIgA==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.32.0.tgz", + "integrity": "sha512-hQpbWM/Y2iq6jB9FHYJBqa3h1R9IEGodOtajhb261cVHt9cz30AKjXM6WP7LxJdEPPlyJ9rPTZVgBUgZgiyPgw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -1101,7 +1129,7 @@ "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": { @@ -1119,6 +1147,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true } } }, @@ -1222,7 +1256,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -1615,6 +1648,11 @@ "unset-value": "^1.0.0" } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1907,6 +1945,15 @@ "whatwg-url": "^7.0.0" } }, + "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" + } + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -1919,6 +1966,19 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -1935,7 +1995,6 @@ "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": { "object-keys": "^1.0.12" } @@ -2056,7 +2115,6 @@ "version": "1.17.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -2075,7 +2133,6 @@ "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": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -2102,22 +2159,22 @@ } }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.0.0.tgz", + "integrity": "sha512-qY1cwdOxMONHJfGqw52UOpZDeqXy8xmD0u8CT6jIstil72jkhURC704W8CFyTPDPllz4z4lu0Ql1+07PG/XdIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", + "eslint-utils": "^2.0.0", "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "espree": "^7.0.0", + "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", @@ -2130,22 +2187,67 @@ "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", + "levn": "^0.4.1", "lodash": "^4.17.14", "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": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -2164,32 +2266,127 @@ "esutils": "^2.0.2" } }, - "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==", + "espree": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz", + "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==", "dev": true, "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.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 + }, "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 }, + "levn": { + "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.2.1", + "type-check": "~0.4.0" + } + }, "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 }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "optionator": { + "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.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "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 + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "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 + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-check": { + "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.2.1" + } + }, + "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" + } } } }, @@ -2231,23 +2428,6 @@ "requires": { "debug": "^2.6.9", "resolve": "^1.13.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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } } }, "eslint-module-utils": { @@ -2260,20 +2440,63 @@ "pkg-dir": "^2.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "ms": "2.0.0" + "locate-path": "^2.0.0" } }, - "ms": { + "locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "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 + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } } } }, @@ -2315,29 +2538,12 @@ "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", "resolve": "^1.12.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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } } }, "eslint-plugin-jest": { - "version": "23.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.9.0.tgz", - "integrity": "sha512-8mt5xJQIFh33W5nE7vCikkDTE4saTo08V91KjU6yI5sLQ9e8Jkp1OXkWJoIHLheFqY5OXIZdAjZmNYHSJ3IpzQ==", + "version": "23.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.10.0.tgz", + "integrity": "sha512-cHC//nesojSO1MLxVmFJR/bUaQQG7xvMHQD8YLbsQzevR41WKm8paKDUv2wMHlUy5XLZUmNcWuflOi4apS8D+Q==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^2.5.0" @@ -2547,8 +2753,7 @@ "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 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { "version": "1.3.1", @@ -2884,6 +3089,7 @@ "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" @@ -2954,8 +3160,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -3070,7 +3275,6 @@ "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" } @@ -3084,8 +3288,7 @@ "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 + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, "has-value": { "version": "1.0.0", @@ -3359,6 +3562,11 @@ } } }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3374,8 +3582,7 @@ "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" }, "is-ci": { "version": "2.0.0", @@ -3409,8 +3616,7 @@ "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 + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-descriptor": { "version": "0.1.6", @@ -3490,7 +3696,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -3511,7 +3716,6 @@ "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" } @@ -4971,7 +5175,6 @@ "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" @@ -5067,6 +5270,11 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" }, + "jsonschema": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.6.tgz", + "integrity": "sha512-SqhURKZG07JyKKeo/ir24QnS4/BV7a6gQy93bUSe4lUdNp0QNpIz2c9elWJQ9dpc5cQYY6cvCzgRwy0MQCLyqA==" + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -5139,6 +5347,7 @@ "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" } @@ -5308,6 +5517,12 @@ "minimist": "^1.2.5" } }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "multimap": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", @@ -5498,14 +5713,21 @@ "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", @@ -5520,7 +5742,6 @@ "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", @@ -5627,6 +5848,7 @@ "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" } @@ -5635,6 +5857,7 @@ "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" } @@ -5642,7 +5865,8 @@ "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==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "parent-module": { "version": "1.0.1", @@ -5677,7 +5901,8 @@ "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==" + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -5742,6 +5967,7 @@ "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": { "find-up": "^4.0.0" } @@ -6005,7 +6231,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" @@ -6383,7 +6608,8 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true }, "set-blocking": { "version": "2.0.0", @@ -6690,8 +6916,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { "version": "1.16.1", @@ -6799,7 +7024,6 @@ "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" @@ -6809,7 +7033,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5", @@ -6820,7 +7043,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5", @@ -6831,7 +7053,6 @@ "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" diff --git a/package.json b/package.json index a66e5466..f3a2f0fa 100644 --- a/package.json +++ b/package.json @@ -17,18 +17,31 @@ }, "author": "Jon Ursenbach ", "license": "ISC", + "engines": { + "node": ">=10" + }, "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.1", + "@openapi-contrib/openapi-schema-to-json-schema": "^3.0.0", + "@readme/oas-examples": "^3.4.0", + "@readme/oas-extensions": "^6.9.4", "@readme/oas-to-har": "^6.6.2", - "@readme/oas-tooling": "^3.3.5", + "@readme/oas-tooling": "^3.4.0", "fetch-har": "^2.3.1", + "jsonschema": "^1.2.6", "node-fetch": "^2.6.0" }, "devDependencies": { - "@readme/eslint-config": "^2.1.0", - "eslint": "^6.8.0", + "@readme/eslint-config": "^3.0.0", + "eslint": "^7.0.0", "jest": "^25.5.2", "nock": "^12.0.3", "prettier": "^2.0.5" }, - "prettier": "@readme/eslint-config/prettier" + "prettier": "@readme/eslint-config/prettier", + "jest": { + "testPathIgnorePatterns": [ + "__tests__/__fixtures__/" + ] + } } diff --git a/src/index.js b/src/index.js index 84569e5f..4d2833ee 100644 --- a/src/index.js +++ b/src/index.js @@ -1,16 +1,13 @@ -/* eslint-disable no-underscore-dangle */ /* eslint-disable prettier/prettier */ -/* eslint-disable no-unused-vars */ /* eslint-disable global-require */ /* eslint-disable import/no-dynamic-require */ const fetch = require('node-fetch'); const fetchHar = require('fetch-har'); -// const { URL } = require('url'); -// const pkg = require('../package.json'); - const Oas = require('@readme/oas-tooling'); const oasToHar = require('@readme/oas-to-har'); +const { prepareAuth, prepareParams } = require('./lib/index'); + global.fetch = fetch; global.Request = fetch.Request; global.Headers = fetch.Headers; @@ -31,6 +28,10 @@ function getOperations(spec) { .reduce((prev, next) => prev.concat(next), []); } +function isPrimitive(val) { + return typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean'; +} + module.exports = uri => { const spec = new Oas(typeof uri === 'string' ? require(uri) : uri); @@ -41,78 +42,23 @@ module.exports = uri => { return this; } - // Needs work for supporting multiple different kinds of auth at the same time. for example if an operation uses - // OAuth and HTTP bearer, how can we guarantee that the OAuth bearer is used with oauth? - // @todo - function prepareAuth(operation) { - if (authKeys.length === 0) { - return {}; - } - - const prepared = {}; - const security = operation.prepareSecurity(); - const securitySchemes = Object.keys(security); - - authKeys.forEach((authKey, idx) => { - const schemes = security[securitySchemes[idx]]; - if (schemes.length > 1) { - throw new Error(`Sorry, this API currently requires multiple forms of authentication which we don't yet support.`); - } - - const scheme = schemes[0]; - if (scheme.type === 'http') { - if (scheme.scheme === 'basic') { - prepared[scheme._key] = { - user: authKey[0], - pass: (authKey.length === 2) ? authKey[1] : '' - }; - } else if (scheme.scheme === 'bearer') { - if (authKey.length > 1) { - throw new Error('Multiple auth tokens were supplied for the auth on this endpoint, but only a single token is needed.'); - } - - prepared[scheme._key] = authKey[0]; - } - } else if (scheme.type === 'oauth2') { - if (authKey.length > 1) { - throw new Error('Multiple auth tokens were supplied for the auth on this endpoint, but only a single token is needed.'); - } - - prepared[scheme._key] = authKey[0]; - } else if (scheme.type === 'apiKey') { - if (authKey.length > 1) { - throw new Error('Multiple auth keys were supplied for the auth on this endpoint, but only a single key is needed.'); - } - - if (scheme.in === 'query' || scheme.in === 'header') { - prepared[scheme._key] = authKey[0]; - } - } else { - throw new Error(`Sorry, this API currently supports a scheme, ${scheme.type}, that we don't yet support.`); - } - }); - - return prepared - } - - function fetchOperation(operation, path, body /* , other */) { - // console.logFull(spec.operation('/', 'get')) - // console.logFull(operation) + function fetchOperation(operation, body, metadata /* path, body /* , other */) { + // console.logx(operation.parameters) - const params = {}; - if (arguments.length === 2) { + // const params = {}; + /* if (arguments.length === 2) { params.path = path; params.body = path; } else if (arguments.length === 3) { params.path = path; params.body = body; - } + } */ - const har = oasToHar(spec, operation, params, prepareAuth(operation)); + const har = oasToHar(spec, operation, prepareParams(operation, body, metadata), prepareAuth(authKeys, operation)); // console.logx(spec); // console.logx(authValues); - // console.logx(har); + console.logx(har); return fetchHar(har); } diff --git a/src/lib/index.js b/src/lib/index.js new file mode 100644 index 00000000..706f5131 --- /dev/null +++ b/src/lib/index.js @@ -0,0 +1,7 @@ +const prepareAuth = require('./prepareAuth'); +const prepareParams = require('./prepareParams'); + +module.exports = { + prepareAuth, + prepareParams, +}; diff --git a/src/lib/prepareAuth.js b/src/lib/prepareAuth.js new file mode 100644 index 00000000..a90d7669 --- /dev/null +++ b/src/lib/prepareAuth.js @@ -0,0 +1,67 @@ +/* eslint-disable no-underscore-dangle */ +// Needs work for supporting multiple different kinds of auth at the same time. for example if an operation uses +// OAuth and HTTP bearer, how can we guarantee that the OAuth bearer is used with oauth? +// @todo +module.exports = (authKeys, operation) => { + if (authKeys.length === 0) { + return {}; + } + + const prepared = {}; + const security = operation.prepareSecurity(); + const securitySchemes = Object.keys(security); + + if (securitySchemes.length === 0) { + // If there's no auth configured on this operation, don't prepare anything (even if it was supplied by the user). + return {}; + } + + authKeys.forEach((authKey, idx) => { + const schemes = security[securitySchemes[idx]]; + if (schemes.length > 1) { + throw new Error( + `Sorry, this API currently requires multiple forms of authentication which we don't yet support.` + ); + } + + const scheme = schemes[0]; + if (scheme.type === 'http') { + if (scheme.scheme === 'basic') { + prepared[scheme._key] = { + user: authKey[0], + pass: authKey.length === 2 ? authKey[1] : '', + }; + } else if (scheme.scheme === 'bearer') { + if (authKey.length > 1) { + throw new Error( + 'Multiple auth tokens were supplied for the auth on this endpoint, but only a single token is needed.' + ); + } + + prepared[scheme._key] = authKey[0]; + } + } else if (scheme.type === 'oauth2') { + if (authKey.length > 1) { + throw new Error( + 'Multiple auth tokens were supplied for the auth on this endpoint, but only a single token is needed.' + ); + } + + prepared[scheme._key] = authKey[0]; + } else if (scheme.type === 'apiKey') { + if (authKey.length > 1) { + throw new Error( + 'Multiple auth keys were supplied for the auth on this endpoint, but only a single key is needed.' + ); + } + + if (scheme.in === 'query' || scheme.in === 'header') { + prepared[scheme._key] = authKey[0]; + } + } else { + throw new Error(`Sorry, this API currently supports a scheme, ${scheme.type}, that we don't yet support.`); + } + }); + + return prepared; +}; diff --git a/src/lib/prepareParams.js b/src/lib/prepareParams.js new file mode 100644 index 00000000..fba8f53c --- /dev/null +++ b/src/lib/prepareParams.js @@ -0,0 +1,134 @@ +/* eslint-disable prettier/prettier */ +console.logx = obj => { + // eslint-disable-next-line global-require + console.log(require('util').inspect(obj, false, null, true)); +}; + +function digestParameters(parameters) { + return parameters.reduce((prev, param) => { + if ('$ref' in param || 'allOf' in param || 'anyOf' in param || 'oneOf' in param) { + throw new Error(`The OpenAPI document for this operation wasn't dereferenced before processing.`); + } else if (param.name in prev) { + throw new Error(`The operation you are using has the same parameter, ${param.name}, spread across multiple entry points. We unfortunately can't handle this right now.`); + } + + return Object.assign(prev, { [param.name]: param }); + }, {}); +} + +// https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_isempty +function isEmpty(obj) { + return [Object, Array].includes((obj || {}).constructor) && !Object.entries((obj || {})).length; +} + +module.exports = function (operation, body, metadata) { + // If no data was supplied, just return immediately. + if (isEmpty(body) && isEmpty(metadata)) { + return {}; + } + + const params = {}; + let shouldDigestParams = false; + const contentType = operation.getContentType(); + + if (Array.isArray(body)) { + // If the body param is an array, then it's absolutely a body and not something we need to do analysis against. + params.body = body; + + if (typeof metadata !== 'undefined') { + shouldDigestParams = true; + } + } else if (typeof metadata === 'undefined') { + // No metadata was explicitly defined so we need to analyze the body to determine if it should actually be treated + // as metadata. + shouldDigestParams = true; + } else { + // Body and metadata were both supplied. + params.body = body; + shouldDigestParams = true; + } + + let digested = {}; + let hasDigestedParams = false; + if (shouldDigestParams) { + // @todo `operation.parameters` should also pull in common params (this does not happen automatically when dereffing!) + if ('parameters' in operation) { + digested = digestParameters(operation.parameters); + hasDigestedParams = Object.keys(digested).length; + } + } + + // No metadata was explicitly defined so we need to analyze the supplied, and we haven't already set a body then we + // need to analyze the supplied body to see if it should actually be metadata. If not, then we can just treat it as a + // body and pass it along. + if (!('body' in params) && typeof metadata === 'undefined') { + if (!hasDigestedParams) { + // No parameters were able to be digested, so we just have to assume that what the user supplied was for a body. + // This might lead to unwanted false positives if an OAS isn't accurate, but short of throwing an error there + // isn't anything we can really do about it. + params.body = body; + } else { + const intersection = Object.keys(body).filter(value => Object.keys(digested).includes(value)).length; + if (intersection && (intersection / Object.keys(body).length) > 0.25) { + // If more than 25% of the body intersects with the parameters that we've got on hand, then we should treat it + // as a metadata object and organize into parameters. + // eslint-disable-next-line no-param-reassign + metadata = body; + } else { + // For all other cases, we should just treat the supplied body as a body. + params.body = body; + } + } + } + + // @todo add in a debug mode that would run jsonschema validation against request bodies and parameters and throw back errors if what's supplied isn't up to spec. + + // Only spend time trying to organize metadata into parameters if we were able to digest parameters out of the + // operation schema. If we couldn't digest anything, but metadata was supplied then we wouldn't know where to place + // the metadata! + if (hasDigestedParams) { + params.header = {} + params.path = {} + params.query = {} + + if (typeof metadata === 'object' && !isEmpty(metadata)) { + const metadataKeys = Object.keys(metadata); + if (metadataKeys.length) { + metadataKeys.forEach(param => { + if (!(param in digested)) { + // This param isn't documented in the OAS, so we can't know where to put it! + return; + } + + if (digested[param].in === 'path') { + params.path[param] = metadata[param]; + } else if (digested[param].in === 'query') { + params.query[param] = metadata[param]; + } else if (digested[param].in === 'header') { + params.header[param] = metadata[param]; + } else if (digested[param].in === 'cookie') { + // @todo add support cookie params here and also in @readme/oas-to-har + } + }); + } + } + } + + // Form data should be placed inside `formData` instead of `body` for it to properly get picked up. + if (contentType === 'application/x-www-form-urlencoded') { + params.formData = body; + delete params.body; + } + + // @todo add required params with defaults if they aren't supplied + // @todo in debug mode, if a path param is missing (and required -- they always are), and no defaults are present, we should throw an error + + // Clean up any empty items. + ['body', 'formData', 'header', 'path', 'query'].forEach(type => { + if (type in params && Object.keys(params[type]).length === 0) { + delete params[type]; + } + }); + + return params; +}; From 6720f5c2c5c880bd5f5f2aa5faa95c5b8dcf8c4a Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Wed, 13 May 2020 17:26:46 -0700 Subject: [PATCH 07/23] style: minor prettier cleanup and remove unused packages --- __tests__/lib/prepareParams.test.js | 108 +++++++++++++--------------- package-lock.json | 73 +++++++------------ package.json | 5 +- src/index.js | 20 +----- src/lib/prepareParams.js | 15 ++-- 5 files changed, 88 insertions(+), 133 deletions(-) diff --git a/__tests__/lib/prepareParams.test.js b/__tests__/lib/prepareParams.test.js index 9778524f..c324aab0 100644 --- a/__tests__/lib/prepareParams.test.js +++ b/__tests__/lib/prepareParams.test.js @@ -1,11 +1,5 @@ -/* eslint-disable no-unused-vars */ -/* eslint-disable jest/no-commented-out-tests */ -/* eslint-disable jest/expect-expect */ -/* eslint-disable jest-formatting/padding-around-test-blocks */ -/* eslint-disable prettier/prettier */ const Oas = require('@readme/oas-tooling'); -const $RefParser = require("@apidevtools/json-schema-ref-parser"); -const oasToHar = require('@readme/oas-to-har'); +const $RefParser = require('@apidevtools/json-schema-ref-parser'); const readmeExample = require('@readme/oas-examples/3.0/json/readme.json'); const usptoExample = require('@readme/oas-examples/3.0/json/uspto.json'); @@ -28,15 +22,15 @@ const arraySchema = createOas('put', '/', { type: 'object', properties: { name: { - type: 'string' - } - } - } - } - } - } - } -}) + type: 'string', + }, + }, + }, + }, + }, + }, + }, +}); describe('#prepareParams', () => { let readmeSpec; @@ -51,7 +45,7 @@ describe('#prepareParams', () => { }); it('should prepare nothing if nothing was supplied', () => { - const operation = readmeSpec.operation('/api-specification', 'post') + const operation = readmeSpec.operation('/api-specification', 'post'); expect(prepareParams(operation)).toStrictEqual({}); expect(prepareParams(operation, null, null)).toStrictEqual({}); @@ -60,23 +54,23 @@ describe('#prepareParams', () => { }); it('should prepare body and metadata when both are supplied', async () => { - const operation = readmeSpec.operation('/api-specification', 'post') + const operation = readmeSpec.operation('/api-specification', 'post'); const body = { - spec: 'this is the contents of an api specification' + spec: 'this is the contents of an api specification', }; const metadata = { - 'x-readme-version': '1.0' + 'x-readme-version': '1.0', }; expect(prepareParams(operation, body, metadata)).toStrictEqual({ body: { - spec: 'this is the contents of an api specification' + spec: 'this is the contents of an api specification', }, header: { - 'x-readme-version': '1.0' + 'x-readme-version': '1.0', }, - }) + }); }); it('should prepare body if body is a primitive', () => { @@ -85,101 +79,101 @@ describe('#prepareParams', () => { content: { 'text/plain': { schema: { - type: 'string' - } - } - } - } + type: 'string', + }, + }, + }, + }, }); - const operation = (new Oas(schema)).operation('/', 'put'); + const operation = new Oas(schema).operation('/', 'put'); const body = 'Brie cheeseburger ricotta.'; expect(prepareParams(operation, body, {})).toStrictEqual({ - body + body, }); }); it('should prepare body if body is an array', () => { - const operation = (new Oas(arraySchema)).operation('/', 'put'); + const operation = new Oas(arraySchema).operation('/', 'put'); const body = [ { - name: 'Buster' - } - ] + name: 'Buster', + }, + ]; expect(prepareParams(operation, body, {})).toStrictEqual({ - body + body, }); }); it('should handle bodies when the content type is application/x-www-form-urlencoded', async () => { const operation = usptoSpec.operation('/{dataset}/{version}/records', 'post'); const body = { - criteria: '*:*' + criteria: '*:*', }; const metadata = { dataset: 'v1', - version: 'oa_citations' + version: 'oa_citations', }; expect(prepareParams(operation, body, metadata)).toStrictEqual({ path: { dataset: 'v1', - version: 'oa_citations' + version: 'oa_citations', }, formData: { - criteria: '*:*' - } + criteria: '*:*', + }, }); }); describe('supplying just a body or metadata', () => { it('should handle if supplied is a body', () => { - const operation = readmeSpec.operation('/api-specification', 'post') + const operation = readmeSpec.operation('/api-specification', 'post'); const body = { spec: 'this is the contents of an api specification', }; expect(prepareParams(operation, body)).toStrictEqual({ - body - }) + body, + }); }); it('should prepare a body if supplied is primitive', () => { - const operation = readmeSpec.operation('/api-specification', 'post') + const operation = readmeSpec.operation('/api-specification', 'post'); const body = 'this is a primitive value'; expect(prepareParams(operation, body)).toStrictEqual({ - body - }) + body, + }); }); it('should prepare just a body if supplied argument is an array', () => { - const operation = (new Oas(arraySchema)).operation('/', 'put'); + const operation = new Oas(arraySchema).operation('/', 'put'); const body = [ { - name: 'Buster' - } - ] + name: 'Buster', + }, + ]; expect(prepareParams(operation, body)).toStrictEqual({ - body - }) + body, + }); }); it('should prepare just metadata if supplied is metadata', () => { - const operation = readmeSpec.operation('/api-specification', 'post') + const operation = readmeSpec.operation('/api-specification', 'post'); const metadata = { - 'x-readme-version': '1.0' + 'x-readme-version': '1.0', }; expect(prepareParams(operation, metadata)).toStrictEqual({ header: { - 'x-readme-version': '1.0' - } - }) + 'x-readme-version': '1.0', + }, + }); }); }); diff --git a/package-lock.json b/package-lock.json index 1adcbbf5..5c7499e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -914,14 +914,6 @@ "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.2.tgz", "integrity": "sha512-qS/a24RA5FEoiJS9wiv6Pwg2c/kiUo3IVUQcfeM9JvsR6pM8Yx+yl/6xWYLckZCT5jpLNhslgjiA8p/XcGyMRQ==" }, - "@openapi-contrib/openapi-schema-to-json-schema": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.0.0.tgz", - "integrity": "sha512-nM0Xn6lCwk1nt/fCWwiLBT1SbH4TlX099bWfz4h5lleW7yeu3SHGDP3knFBDHXPCLwywo5qqOOTVvjTTGf/7lA==", - "requires": { - "deep-equal": "^1.0.1" - } - }, "@readme/eslint-config": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@readme/eslint-config/-/eslint-config-3.0.0.tgz", @@ -945,7 +937,8 @@ "@readme/oas-examples": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@readme/oas-examples/-/oas-examples-3.4.0.tgz", - "integrity": "sha512-Wc682b1UMkVZ8YjdEGVglYNy0+UCrBc8Ark9O32pt7/kRWWoWzTrTZCpLqyiyMIC5vAV8LQkzq49MhE0+hnosA==" + "integrity": "sha512-Wc682b1UMkVZ8YjdEGVglYNy0+UCrBc8Ark9O32pt7/kRWWoWzTrTZCpLqyiyMIC5vAV8LQkzq49MhE0+hnosA==", + "dev": true }, "@readme/oas-extensions": { "version": "6.9.4", @@ -1966,19 +1959,6 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -1995,6 +1975,7 @@ "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": { "object-keys": "^1.0.12" } @@ -2115,6 +2096,7 @@ "version": "1.17.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -2133,6 +2115,7 @@ "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": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -3160,7 +3143,8 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "functional-red-black-tree": { "version": "1.0.1", @@ -3275,6 +3259,7 @@ "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" } @@ -3288,7 +3273,8 @@ "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==" + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true }, "has-value": { "version": "1.0.0", @@ -3562,11 +3548,6 @@ } } }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3582,7 +3563,8 @@ "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true }, "is-ci": { "version": "2.0.0", @@ -3616,7 +3598,8 @@ "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==" + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true }, "is-descriptor": { "version": "0.1.6", @@ -3696,6 +3679,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, "requires": { "has": "^1.0.3" } @@ -3716,6 +3700,7 @@ "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" } @@ -5270,11 +5255,6 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" }, - "jsonschema": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.6.tgz", - "integrity": "sha512-SqhURKZG07JyKKeo/ir24QnS4/BV7a6gQy93bUSe4lUdNp0QNpIz2c9elWJQ9dpc5cQYY6cvCzgRwy0MQCLyqA==" - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -5713,21 +5693,14 @@ "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" - }, - "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "object-visit": { "version": "1.0.1", @@ -5742,6 +5715,7 @@ "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", @@ -6231,6 +6205,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" @@ -7024,6 +6999,7 @@ "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" @@ -7033,6 +7009,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5", @@ -7043,6 +7020,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5", @@ -7053,6 +7031,7 @@ "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" diff --git a/package.json b/package.json index f3a2f0fa..b7af20e7 100644 --- a/package.json +++ b/package.json @@ -22,17 +22,14 @@ }, "dependencies": { "@apidevtools/json-schema-ref-parser": "^9.0.1", - "@openapi-contrib/openapi-schema-to-json-schema": "^3.0.0", - "@readme/oas-examples": "^3.4.0", - "@readme/oas-extensions": "^6.9.4", "@readme/oas-to-har": "^6.6.2", "@readme/oas-tooling": "^3.4.0", "fetch-har": "^2.3.1", - "jsonschema": "^1.2.6", "node-fetch": "^2.6.0" }, "devDependencies": { "@readme/eslint-config": "^3.0.0", + "@readme/oas-examples": "^3.4.0", "eslint": "^7.0.0", "jest": "^25.5.2", "nock": "^12.0.3", diff --git a/src/index.js b/src/index.js index 4d2833ee..464256ac 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,3 @@ -/* eslint-disable prettier/prettier */ /* eslint-disable global-require */ /* eslint-disable import/no-dynamic-require */ const fetch = require('node-fetch'); @@ -28,10 +27,6 @@ function getOperations(spec) { .reduce((prev, next) => prev.concat(next), []); } -function isPrimitive(val) { - return typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean'; -} - module.exports = uri => { const spec = new Oas(typeof uri === 'string' ? require(uri) : uri); @@ -42,23 +37,12 @@ module.exports = uri => { return this; } - function fetchOperation(operation, body, metadata /* path, body /* , other */) { - // console.logx(operation.parameters) - - // const params = {}; - /* if (arguments.length === 2) { - params.path = path; - params.body = path; - } else if (arguments.length === 3) { - params.path = path; - params.body = body; - } */ - + function fetchOperation(operation, body, metadata) { const har = oasToHar(spec, operation, prepareParams(operation, body, metadata), prepareAuth(authKeys, operation)); // console.logx(spec); // console.logx(authValues); - console.logx(har); + // console.logx(har); return fetchHar(har); } diff --git a/src/lib/prepareParams.js b/src/lib/prepareParams.js index fba8f53c..fc987fa7 100644 --- a/src/lib/prepareParams.js +++ b/src/lib/prepareParams.js @@ -1,4 +1,3 @@ -/* eslint-disable prettier/prettier */ console.logx = obj => { // eslint-disable-next-line global-require console.log(require('util').inspect(obj, false, null, true)); @@ -9,7 +8,9 @@ function digestParameters(parameters) { if ('$ref' in param || 'allOf' in param || 'anyOf' in param || 'oneOf' in param) { throw new Error(`The OpenAPI document for this operation wasn't dereferenced before processing.`); } else if (param.name in prev) { - throw new Error(`The operation you are using has the same parameter, ${param.name}, spread across multiple entry points. We unfortunately can't handle this right now.`); + throw new Error( + `The operation you are using has the same parameter, ${param.name}, spread across multiple entry points. We unfortunately can't handle this right now.` + ); } return Object.assign(prev, { [param.name]: param }); @@ -18,7 +19,7 @@ function digestParameters(parameters) { // https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_isempty function isEmpty(obj) { - return [Object, Array].includes((obj || {}).constructor) && !Object.entries((obj || {})).length; + return [Object, Array].includes((obj || {}).constructor) && !Object.entries(obj || {}).length; } module.exports = function (operation, body, metadata) { @@ -69,7 +70,7 @@ module.exports = function (operation, body, metadata) { params.body = body; } else { const intersection = Object.keys(body).filter(value => Object.keys(digested).includes(value)).length; - if (intersection && (intersection / Object.keys(body).length) > 0.25) { + if (intersection && intersection / Object.keys(body).length > 0.25) { // If more than 25% of the body intersects with the parameters that we've got on hand, then we should treat it // as a metadata object and organize into parameters. // eslint-disable-next-line no-param-reassign @@ -87,9 +88,9 @@ module.exports = function (operation, body, metadata) { // operation schema. If we couldn't digest anything, but metadata was supplied then we wouldn't know where to place // the metadata! if (hasDigestedParams) { - params.header = {} - params.path = {} - params.query = {} + params.header = {}; + params.path = {}; + params.query = {}; if (typeof metadata === 'object' && !isEmpty(metadata)) { const metadataKeys = Object.keys(metadata); From 07c555b6537283d998de60c1dc583f6944a5e23f Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 14 May 2020 10:16:41 -0700 Subject: [PATCH 08/23] test: adding some tests for body/metadata intersection logic --- __tests__/lib/prepareParams.test.js | 42 +++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/__tests__/lib/prepareParams.test.js b/__tests__/lib/prepareParams.test.js index c324aab0..77a01644 100644 --- a/__tests__/lib/prepareParams.test.js +++ b/__tests__/lib/prepareParams.test.js @@ -163,6 +163,48 @@ describe('#prepareParams', () => { }); }); + it('should prepare metadata if more than 25% of the supplied argument lines up with known parameters', () => { + const operation = usptoSpec.operation('/{dataset}/{version}/records', 'post'); + const body = { + version: 'v1', + dataset: 'oa_citations', + randomUnknownParameter: true, + }; + + expect(prepareParams(operation, body)).toStrictEqual({ + path: { + version: 'v1', + dataset: 'oa_citations', + }, + formData: { + version: 'v1', + dataset: 'oa_citations', + randomUnknownParameter: true, + }, + }); + }); + + it('should prepare metadata if less than 25% of the supplied argument lines up with known parameters', () => { + const operation = usptoSpec.operation('/{dataset}/{version}/records', 'post'); + const body = { + version: 'v1', // This a known parameter, but the others aren't and should be treated as body payload data. + randomUnknownParameter: true, + randomUnknownParameter2: true, + randomUnknownParameter3: true, + randomUnknownParameter4: true, + }; + + expect(prepareParams(operation, body)).toStrictEqual({ + formData: { + version: 'v1', + randomUnknownParameter: true, + randomUnknownParameter2: true, + randomUnknownParameter3: true, + randomUnknownParameter4: true, + }, + }); + }); + it('should prepare just metadata if supplied is metadata', () => { const operation = readmeSpec.operation('/api-specification', 'post'); const metadata = { From 902a367d6e347010dbb84204d30e8d71d25d4477 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Fri, 15 May 2020 00:16:01 -0700 Subject: [PATCH 09/23] feat: first draft on a mechanism for caching and loading specs --- package-lock.json | 213 +++++++++++++++++++++++++++++++++++++--------- package.json | 7 +- src/cache.js | 141 ++++++++++++++++++++++++++++++ src/cli.js | 61 +++++++++++++ src/index.js | 102 ++++++++++++---------- 5 files changed, 438 insertions(+), 86 deletions(-) create mode 100644 src/cache.js create mode 100755 src/cli.js diff --git a/package-lock.json b/package-lock.json index 5c7499e5..53b4d6c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,42 @@ "js-yaml": "^3.13.1" } }, + "@apidevtools/openapi-schemas": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.0.3.tgz", + "integrity": "sha512-QoPaxGXfgqgGpK1p21FJ400z56hV681a8DOcZt3J5z0WIHgFeaIZ4+6bX5ATqmOoCpRCsH4ITEwKaOyFMz7wOA==" + }, + "@apidevtools/swagger-methods": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.1.tgz", + "integrity": "sha512-1Vlm18XYW6Yg7uHunroXeunWz5FShPFAdxBbPy8H6niB2Elz9QQsCoYHMbcc11EL1pTxaIr9HXz2An/mHXlX1Q==" + }, + "@apidevtools/swagger-parser": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-9.0.1.tgz", + "integrity": "sha512-Irqybg4dQrcHhZcxJc/UM4vO7Ksoj1Id5e+K94XUOzllqX1n47HEA50EKiXTCQbykxuJ4cYGIivjx/MRSTC5OA==", + "requires": { + "@apidevtools/json-schema-ref-parser": "^8.0.0", + "@apidevtools/openapi-schemas": "^2.0.2", + "@apidevtools/swagger-methods": "^3.0.0", + "@jsdevtools/ono": "^7.1.0", + "call-me-maybe": "^1.0.1", + "openapi-types": "^1.3.5", + "z-schema": "^4.2.2" + }, + "dependencies": { + "@apidevtools/json-schema-ref-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", + "integrity": "sha512-n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==", + "requires": { + "@jsdevtools/ono": "^7.1.0", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + } + } + }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -221,6 +257,34 @@ "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "dependencies": { + "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" + } + }, + "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/parser": { @@ -323,7 +387,6 @@ "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -1017,8 +1080,7 @@ "@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 + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, "@types/graceful-fs": { "version": "4.1.3", @@ -1261,6 +1323,14 @@ "requires": { "ast-types-flow": "0.0.7", "commander": "^2.11.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } } }, "arr-diff": { @@ -1674,14 +1744,36 @@ "dev": true }, "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, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "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" + }, + "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==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } } }, "chardet": { @@ -1812,10 +1904,14 @@ } }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "component-emitter": { "version": "1.3.0", @@ -3068,11 +3164,20 @@ "to-regex-range": "^5.0.1" } }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -3265,10 +3370,9 @@ } }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "has-symbols": { "version": "1.0.1", @@ -5327,7 +5431,6 @@ "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" } @@ -5341,8 +5444,12 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, "lodash.sortby": { "version": "4.7.0", @@ -5378,7 +5485,6 @@ "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" }, @@ -5386,8 +5492,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -5786,6 +5891,11 @@ "mimic-fn": "^2.1.0" } }, + "openapi-types": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-1.3.5.tgz", + "integrity": "sha512-11oi4zYorsgvg5yBarZplAqbpev5HkuVNPlZaPTknPDzAynq+lnJdXAmruGWP0s+dNYZS7bjM+xrTpJw7184Fg==" + }, "optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -5822,7 +5932,6 @@ "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" } @@ -5831,7 +5940,6 @@ "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" } @@ -5839,8 +5947,7 @@ "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 + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "parent-module": { "version": "1.0.1", @@ -5875,8 +5982,7 @@ "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 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", @@ -5941,7 +6047,6 @@ "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": { "find-up": "^4.0.0" } @@ -6171,8 +6276,7 @@ "regenerator-runtime": { "version": "0.13.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" }, "regex-not": { "version": "1.0.2", @@ -7079,12 +7183,11 @@ "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, + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "supports-hyperlinks": { @@ -7457,6 +7560,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "validator": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", + "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==" + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -7657,6 +7765,14 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, + "yaml": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.9.2.tgz", + "integrity": "sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, "yargs": { "version": "15.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", @@ -7685,6 +7801,25 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "z-schema": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.3.tgz", + "integrity": "sha512-zkvK/9TC6p38IwcrbnT3ul9in1UX4cm1y/VZSs4GHKIiDCrlafc+YQBgQBUdDXLAoZHf2qvQ7gJJOo6yT1LH6A==", + "requires": { + "commander": "^2.7.1", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^12.0.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true + } + } } } } diff --git a/package.json b/package.json index b7af20e7..df317566 100644 --- a/package.json +++ b/package.json @@ -22,10 +22,15 @@ }, "dependencies": { "@apidevtools/json-schema-ref-parser": "^9.0.1", + "@apidevtools/swagger-parser": "^9.0.1", "@readme/oas-to-har": "^6.6.2", "@readme/oas-tooling": "^3.4.0", + "chalk": "^4.0.0", + "commander": "^5.1.0", "fetch-har": "^2.3.1", - "node-fetch": "^2.6.0" + "find-cache-dir": "^3.3.1", + "node-fetch": "^2.6.0", + "yaml": "^1.9.2" }, "devDependencies": { "@readme/eslint-config": "^3.0.0", diff --git a/src/cache.js b/src/cache.js new file mode 100644 index 00000000..9adcb2a1 --- /dev/null +++ b/src/cache.js @@ -0,0 +1,141 @@ +const fetch = require('node-fetch'); +const chalk = require('chalk'); +const SwaggerParser = require('@apidevtools/swagger-parser'); +const $RefParser = require('@apidevtools/json-schema-ref-parser'); +const yaml = require('yaml'); +const crypto = require('crypto'); +const findCacheDir = require('find-cache-dir'); +const pkg = require('../package.json'); +const fs = require('fs'); + +const cacheDir = findCacheDir({ name: pkg.name, thunk: true }); + +console.logx = obj => { + // eslint-disable-next-line global-require + console.log(require('util').inspect(obj, false, null, true)); +}; + +class SdkCache { + constructor(uri) { + this.uri = uri; + this.uriHash = SdkCache.getCacheHash(this.uri); + this.dir = cacheDir(); + this.cacheStore = cacheDir('cache.json'); + this.specsCache = cacheDir('specs'); + } + + static getCacheHash(file) { + return crypto.createHash('md5').update(file).digest('hex'); + } + + getCache() { + let cache = {}; + if (fs.existsSync(this.cacheStore)) { + cache = JSON.parse(fs.readFileSync(this.cacheStore, 'utf8')); + } + + return cache; + } + + load() { + const cache = this.getCache(); + + if (!(this.uriHash in cache)) { + throw new Error( + `Please run \`npx api install ${this.uri}\` to install this SDK's OpenAPI document before using it.` + ); + } + + return JSON.parse(fs.readFileSync(cache[this.uriHash].path, 'utf8')); + } + + save(json) { + const self = this; + + if (json.swagger) { + throw new Error('Sorry, this module only supports OpenAPI documents.'); + } + + return new Promise(resolve => { + return resolve(json); + }) + .then(res => { + return SwaggerParser.validate(res).catch(err => { + if (/is not a valid openapi api definition/i.test(err.message)) { + throw new Error("Sorry, it doesn't look like that is a valid OpenAPI document."); + } + + throw err; + }); + }) + .then(res => { + console.log(chalk.green('Dereferencing so it can easily handled...')); + return $RefParser.dereference(res); + }) + .then(async res => { + if (!fs.existsSync(self.dir)) { + fs.mkdirSync(self.dir, { recursive: true }); + } + + if (!fs.existsSync(self.specsCache)) { + fs.mkdirSync(self.specsCache, { recursive: true }); + } + + const cache = self.getCache(); + if (this.uriHash in cache) { + console.log(chalk.green('The specification is already installed.')); + } else { + const spec = JSON.stringify(res, null, 2); + const jsonHash = crypto.createHash('md5').update(spec).digest('hex'); + + cache[this.uriHash] = { + path: cacheDir('specs', `${jsonHash}.json`), + original: this.uri, + title: 'title' in res.info ? res.info.title : undefined, + version: 'version' in res.info ? res.info.version : undefined, + }; + + fs.writeFileSync(cache[this.uriHash].path, spec); + fs.writeFileSync(self.cacheStore, JSON.stringify(cache, null, 2)); + + console.log(chalk.green('Installation complete!')); + } + }); + } + + saveUrl() { + return fetch(this.uri) + .then(res => { + if (!res.ok) { + throw new Error(`Unable to retrieve URL. Reason: ${res.statusText}`); + } + + if (res.headers.get('content-type') === 'application/yaml' || /\.(yaml|yml)/.test(this.uri)) { + console.log(chalk.green('Converting YAML to JSON...')); + return res.text().then(text => { + return yaml.parse(text); + }); + } + + return res.json(); + }) + .then(json => this.save(json)); + } + + saveFile() { + return new Promise(resolve => { + return resolve(fs.readFileSync(this.uri, 'utf8')); + }) + .then(res => { + if (/\.(yaml|yml)/.test(this.uri)) { + console.log(chalk.green('Converting YAML to JSON...')); + return yaml.parse(res); + } + + return JSON.parse(res); + }) + .then(json => this.save(json)); + } +} + +module.exports = SdkCache; diff --git a/src/cli.js b/src/cli.js new file mode 100755 index 00000000..660ac222 --- /dev/null +++ b/src/cli.js @@ -0,0 +1,61 @@ +#! /usr/bin/env node +const chalk = require('chalk'); +const pkg = require('../package.json'); +const { Command } = require('commander'); +const fetch = require('node-fetch'); +const fs = require('fs').promises; +const Cache = require('./cache'); + +global.fetch = fetch; +global.Request = fetch.Request; +global.Headers = fetch.Headers; + +const program = new Command(); +program.version(pkg.version); + +console.logx = obj => { + // eslint-disable-next-line global-require + console.log(require('util').inspect(obj, false, null, true)); +}; + +program + .command('install ') + .description('Install an OpenAPI Document to be later used as an SDK') + .action(async location => { + console.log(chalk.green('Retrieving...')); + + let url; + let cacheFrom; + + try { + url = new URL(location); + cacheFrom = 'url'; + } catch (err) { + // This doens't look to be a valid URL so does it exist on their filesystem instead? + await fs + .stat(location) + .then(() => { + cacheFrom = 'file'; + }) + .catch(() => { + console.log( + chalk.red( + 'Sorry, we were unable to install that OpenAPI document. Please either supply a URL or a path on your filesystem.' + ) + ); + process.exit(); + }); + } + + if (cacheFrom === 'url') { + await new Cache(url.href).saveUrl().catch(err => { + console.log(chalk.red(err.message)); + }); + } else { + await new Cache(location).saveFile().catch(err => { + console.log(chalk.red(err.message)); + }); + } + }); + +program.parse(process.argv); diff --git a/src/index.js b/src/index.js index 464256ac..c1710313 100644 --- a/src/index.js +++ b/src/index.js @@ -1,72 +1,82 @@ -/* eslint-disable global-require */ -/* eslint-disable import/no-dynamic-require */ +/* eslint-disable prettier/prettier */ const fetch = require('node-fetch'); const fetchHar = require('fetch-har'); const Oas = require('@readme/oas-tooling'); const oasToHar = require('@readme/oas-to-har'); +const SdkCache = require('./cache'); const { prepareAuth, prepareParams } = require('./lib/index'); global.fetch = fetch; global.Request = fetch.Request; global.Headers = fetch.Headers; -const HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']; - console.logx = obj => { + // eslint-disable-next-line global-require console.log(require('util').inspect(obj, false, null, true)); }; -function getOperations(spec) { - return Object.keys(spec.paths) - .map(path => { - return Object.keys(spec.paths[path]).map(method => { - return spec.operation(path, method); - }); - }) - .reduce((prev, next) => prev.concat(next), []); -} - -module.exports = uri => { - const spec = new Oas(typeof uri === 'string' ? require(uri) : uri); +class Sdk { + constructor(uri) { + this.uri = uri; + this.supportedVerbs = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']; - const authKeys = []; + // @todo SdkCache should still be able to handle passing in a raw object for testing purposes + this.spec = new Oas(new SdkCache(this.uri).load()) + } - function auth(...values) { - authKeys.push(values); - return this; + static getOperations(spec) { + return Object.keys(spec.paths) + .map(path => { + return Object.keys(spec.paths[path]).map(method => { + return spec.operation(path, method); + }); + }) + .reduce((prev, next) => prev.concat(next), []); } - function fetchOperation(operation, body, metadata) { - const har = oasToHar(spec, operation, prepareParams(operation, body, metadata), prepareAuth(authKeys, operation)); + load() { + const { spec } = this; + const authKeys = []; - // console.logx(spec); - // console.logx(authValues); - // console.logx(har); + function auth(...values) { + authKeys.push(values); + return this; + } - return fetchHar(har); - } + function fetchOperation(operation, body, metadata) { + const har = oasToHar(spec, operation, prepareParams(operation, body, metadata), prepareAuth(authKeys, operation)); + + return fetchHar(har); + } + + const methods = this.supportedVerbs + .map(name => { + return { + [name]: ((method, path, ...args) => { + const operation = spec.operation(path, method); + return fetchOperation(operation, ...args); + }).bind(null, name), + }; + }) + .reduce((prev, next) => Object.assign(prev, next)); - const methods = HTTP_METHODS.map(name => { return { - [name]: ((method, path, ...args) => { - const operation = spec.operation(path, method); - return fetchOperation(operation, ...args); - }).bind(null, name), + auth, + ...methods, + ...Sdk.getOperations(spec) + .filter(operation => operation.operationId) + .reduce((prev, next) => { + return Object.assign(prev, { + [next.operationId]: ((operation, ...args) => { + return fetchOperation(operation, ...args); + }).bind(null, next), + }); + }, {}), }; - }).reduce((prev, next) => Object.assign(prev, next)); + } +} - return { - auth, - ...methods, - ...getOperations(spec) - .filter(operation => operation.operationId) - .reduce((prev, next) => { - return Object.assign(prev, { - [next.operationId]: ((operation, ...args) => { - return fetchOperation(operation, ...args); - }).bind(null, next), - }); - }, {}), - }; +module.exports = uri => { + return new Sdk(uri).load(); }; From 734d699d4288eec7575244bd18f1d69944e26c5c Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Mon, 18 May 2020 16:20:55 -0700 Subject: [PATCH 10/23] test: adding unit tests for the SdkCache component --- __tests__/cache.test.js | 163 ++++++++++++++++++++++++++++++++++++++++ __tests__/index.test.js | 2 +- package-lock.json | 22 ++++-- package.json | 5 +- 4 files changed, 181 insertions(+), 11 deletions(-) create mode 100644 __tests__/cache.test.js diff --git a/__tests__/cache.test.js b/__tests__/cache.test.js new file mode 100644 index 00000000..82c277f7 --- /dev/null +++ b/__tests__/cache.test.js @@ -0,0 +1,163 @@ +const nock = require('nock'); +const fsMock = require('mock-fs'); +const findCacheDir = require('find-cache-dir'); +const path = require('path'); +const fs = require('fs').promises; + +const Cache = require('../src/cache'); +const pkg = require('../package.json'); + +let readmeExampleJson; +let readmeExampleYaml; +const originalLog = console.log; +const examplesDir = path.join(__dirname, 'examples'); + +beforeEach(async () => { + readmeExampleJson = await fs.readFile( + path.join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/readme.json'), + 'utf8' + ); + + readmeExampleYaml = await fs.readFile( + path.join(__dirname, '../node_modules/@readme/oas-examples/3.0/yaml/readme.yaml'), + 'utf8' + ); + + console.log = jest.fn().mockImplementation(() => {}); + + fsMock({ + [examplesDir]: { + 'invalid-openapi.json': JSON.stringify(pkg), + 'readme.json': readmeExampleJson, + 'readme.yaml': readmeExampleYaml, + 'swagger.json': await fs.readFile( + path.join(__dirname, '../node_modules/@readme/oas-examples/2.0/json/petstore.json'), + 'utf8' + ), + }, + [findCacheDir({ name: pkg.name })]: {}, + }); +}); + +afterEach(() => { + console.log = originalLog; + fsMock.restore(); +}); + +describe('#saveUrl()', () => { + it('should be able to save a definition', () => { + const mock = nock('http://example.com').get('/readme.json').reply(200, readmeExampleJson); + + return new Cache('http://example.com/readme.json').saveUrl().then(() => { + expect(console.log).toHaveBeenNthCalledWith(1, expect.stringMatching(/dereferencing so it can/i)); + expect(console.log).toHaveBeenNthCalledWith(2, expect.stringMatching(/installation complete/i)); + mock.done(); + }); + }); + + it('should error if the url cannot be reached', async () => { + const mock = nock('http://example.com').get('/unknown.json').reply(404); + + await expect(() => new Cache('http://example.com/unknown.json').saveUrl()).rejects.toThrow( + 'Unable to retrieve URL. Reason: Not Found' + ); + + mock.done(); + }); + + it('should convert yaml to json', async () => { + const mock = nock('http://example.com').get('/readme.yaml').reply(200, readmeExampleYaml); + + const definition = 'http://example.com/readme.yaml'; + const cacheStore = new Cache(definition); + const hash = Cache.getCacheHash(definition); + + await cacheStore.saveUrl().then(() => { + expect(console.log).toHaveBeenNthCalledWith(1, expect.stringMatching(/converting yaml to json/i)); + expect(console.log).toHaveBeenNthCalledWith(2, expect.stringMatching(/dereferencing so it can/i)); + expect(console.log).toHaveBeenNthCalledWith(3, expect.stringMatching(/installation complete/i)); + mock.done(); + }); + + const cached = cacheStore.getCache(); + expect(cached).toHaveProperty(hash); + expect(cached[hash].path).toMatch(/\.json$/); + }); +}); + +describe('#saveFile()', () => { + it('should be able to save a definition', () => { + return new Cache(path.join(examplesDir, 'readme.json')).saveFile().then(() => { + expect(console.log).toHaveBeenNthCalledWith(1, expect.stringMatching(/dereferencing so it can/i)); + expect(console.log).toHaveBeenNthCalledWith(2, expect.stringMatching(/installation complete/i)); + }); + }); + + it('should convert yaml to json', async () => { + const file = path.join(examplesDir, 'readme.yaml'); + const cacheStore = new Cache(file); + const hash = Cache.getCacheHash(file); + + await cacheStore.saveFile().then(() => { + expect(console.log).toHaveBeenNthCalledWith(1, expect.stringMatching(/converting yaml to json/i)); + expect(console.log).toHaveBeenNthCalledWith(2, expect.stringMatching(/dereferencing so it can/i)); + expect(console.log).toHaveBeenNthCalledWith(3, expect.stringMatching(/installation complete/i)); + }); + + const cached = cacheStore.getCache(); + expect(cached).toHaveProperty(hash); + expect(cached[hash].path).toMatch(/\.json$/); + }); +}); + +describe('#save()', () => { + it('should error if definition is a swagger file', async () => { + await expect(() => new Cache(path.join(examplesDir, 'swagger.json')).saveFile()).rejects.toThrow( + 'Sorry, this module only supports OpenAPI documents.' + ); + }); + + it('should error if definition is not a valid openapi file', async () => { + await expect(() => new Cache(path.join(examplesDir, 'invalid-openapi.json')).saveFile()).rejects.toThrow( + "Sorry, it doesn't look like that is a valid OpenAPI document" + ); + }); + + it('should cache a new file', async () => { + const file = path.join(examplesDir, 'readme.json'); + const cacheStore = new Cache(file); + const hash = Cache.getCacheHash(file); + + expect(cacheStore.getCache()).not.toHaveProperty(hash); + + await cacheStore.saveFile(); + + expect(cacheStore.getCache()).toHaveProperty(hash); + }); + + it.todo('should not re-cache a file if it already exists'); +}); + +describe('#load', () => { + it('should load a file out of cache', async () => { + const file = path.join(examplesDir, 'readme.json'); + const cacheStore = new Cache(file); + + await cacheStore.saveFile(); + + const loaded = cacheStore.load(); + expect(loaded).toHaveProperty('components'); + expect(loaded).toHaveProperty('info'); + expect(loaded).toHaveProperty('paths'); + expect(loaded).toHaveProperty('servers'); + }); + + it('should error if the file is not cached', () => { + const file = path.join(examplesDir, 'readme.json'); + const cacheStore = new Cache(file); + + expect(() => { + return cacheStore.load(); + }).toThrow(/to install this SDK's OpenAPI document/); + }); +}); diff --git a/__tests__/index.test.js b/__tests__/index.test.js index 2d6d04a1..2774a9ff 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -80,7 +80,7 @@ describe('#fetch', () => { it.todo('should pass through header params'); it.todo('should pass through auth params'); - it.only('should pass through path params for operationId', () => { + it('should pass through path params for operationId', () => { const response = { id: petId, name: 'Buster', diff --git a/package-lock.json b/package-lock.json index 53b4d6c7..19a8afa0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1009,19 +1009,19 @@ "integrity": "sha512-FnuLVigSsmCUHgwIqSkWLrwCdt/7ou2/zKincUgkZbgS422WKMt1LdRpvH7Kg4FzTafuA2bxlyCsbBQVuIBKZw==" }, "@readme/oas-to-har": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/@readme/oas-to-har/-/oas-to-har-6.6.2.tgz", - "integrity": "sha512-HvTkP9yvEoeXN3XdDcsE1bVx5q5L/48sI1DSnIEfMlk+rkChuOqRCqYVOSiiw6rJ/NB6ot/0k2A7URKsZK5dCw==", + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@readme/oas-to-har/-/oas-to-har-6.9.6.tgz", + "integrity": "sha512-ept5E0Vo9aBMkUbl4BVDFxaZPbeTF04EF9dxvUJdulRFwnvdpYDOVI2fGrhPjPM1xp9cZ2WU14FVAjp32rokMw==", "requires": { - "@readme/oas-extensions": "^6.4.0", - "@readme/oas-tooling": "^3.3.3", + "@readme/oas-extensions": "^6.9.4", + "@readme/oas-tooling": "^3.4.0", "querystring": "^0.2.0" } }, "@readme/oas-tooling": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@readme/oas-tooling/-/oas-tooling-3.4.0.tgz", - "integrity": "sha512-LpeVG4x+iHq12c2YkDgZ3heHUKqAYfwEVcOdNqwlekDIKiUEMmNjLmJ+I1ODfUfbpdGFQkxuX8eS69ozOyKokg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@readme/oas-tooling/-/oas-tooling-3.4.1.tgz", + "integrity": "sha512-7MwgCqCHIL5SZluf3Emt8uD6PJOOwfOwl6JfseiLMKoZx8Op4gSSm+dwmDB1W+texQkrJmukIsxDlK3GJCDpNA==", "requires": { "jsonpointer": "^4.0.1", "path-to-regexp": "^6.1.0" @@ -5602,6 +5602,12 @@ "minimist": "^1.2.5" } }, + "mock-fs": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.12.0.tgz", + "integrity": "sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", diff --git a/package.json b/package.json index df317566..be12604a 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,8 @@ "dependencies": { "@apidevtools/json-schema-ref-parser": "^9.0.1", "@apidevtools/swagger-parser": "^9.0.1", - "@readme/oas-to-har": "^6.6.2", - "@readme/oas-tooling": "^3.4.0", + "@readme/oas-to-har": "^6.9.6", + "@readme/oas-tooling": "^3.4.1", "chalk": "^4.0.0", "commander": "^5.1.0", "fetch-har": "^2.3.1", @@ -37,6 +37,7 @@ "@readme/oas-examples": "^3.4.0", "eslint": "^7.0.0", "jest": "^25.5.2", + "mock-fs": "^4.12.0", "nock": "^12.0.3", "prettier": "^2.0.5" }, From 3a2cd9bc76c4609da82aed076b02c0646732f7c2 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Tue, 19 May 2020 12:34:19 -0700 Subject: [PATCH 11/23] test: getting tests working again under the new cache system --- __tests__/__fixtures__/petstore.json | 223 --------------------------- __tests__/cache.test.js | 42 ++--- __tests__/index.test.js | 208 ++++++++++++------------- src/cache.js | 14 +- src/index.js | 5 +- 5 files changed, 143 insertions(+), 349 deletions(-) delete mode 100644 __tests__/__fixtures__/petstore.json diff --git a/__tests__/__fixtures__/petstore.json b/__tests__/__fixtures__/petstore.json deleted file mode 100644 index ff971cb2..00000000 --- a/__tests__/__fixtures__/petstore.json +++ /dev/null @@ -1,223 +0,0 @@ -{ - "openapi": "3.0.0", - "info": { - "version": "1.0.0", - "title": "Swagger Petstore", - "license": { - "name": "MIT" - } - }, - "servers": [ - { - "url": "http://petstore.swagger.io/v1" - } - ], - "paths": { - "/pets": { - "get": { - "summary": "List all pets", - "operationId": "listPets", - "tags": [ - "pets" - ], - "parameters": [ - { - "name": "limit", - "in": "query", - "description": "How many items to return at one time (max 100)", - "required": false, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "200": { - "description": "A paged array of pets", - "headers": { - "x-next": { - "description": "A link to the next page of responses", - "schema": { - "type": "string" - } - } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pets" - } - } - } - }, - "default": { - "description": "unexpected error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - } - } - }, - "post": { - "summary": "Create a pet", - "operationId": "createPets", - "tags": [ - "pets" - ], - "requestBody": { - "$ref": "#/components/schemas/Pet" - }, - "responses": { - "201": { - "description": "Null response" - }, - "default": { - "description": "unexpected error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - } - } - } - }, - "/pets/{petId}": { - "get": { - "summary": "Info for a specific pet", - "operationId": "showPetById", - "tags": [ - "pets" - ], - "parameters": [ - { - "name": "petId", - "in": "path", - "required": true, - "description": "The id of the pet to retrieve", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Expected response to a valid request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "default": { - "description": "unexpected error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - } - } - }, - "put": { - "summary": "Info for a specific pet", - "operationId": "updatePetById", - "tags": [ - "pets" - ], - "requestBody": { - "$ref": "#/components/schemas/Pet" - }, - "parameters": [ - { - "name": "petId", - "in": "path", - "required": true, - "description": "The id of the pet to retrieve", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Expected response to a valid request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pet" - } - } - } - }, - "default": { - "description": "unexpected error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "Pet": { - "type": "object", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "tag": { - "type": "string" - } - } - }, - "Pets": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Pet" - } - }, - "Error": { - "type": "object", - "required": [ - "code", - "message" - ], - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - } - } - } - } - } -} diff --git a/__tests__/cache.test.js b/__tests__/cache.test.js index 82c277f7..074ca4bc 100644 --- a/__tests__/cache.test.js +++ b/__tests__/cache.test.js @@ -1,7 +1,7 @@ const nock = require('nock'); const fsMock = require('mock-fs'); const findCacheDir = require('find-cache-dir'); -const path = require('path'); +const { join } = require('path'); const fs = require('fs').promises; const Cache = require('../src/cache'); @@ -10,16 +10,16 @@ const pkg = require('../package.json'); let readmeExampleJson; let readmeExampleYaml; const originalLog = console.log; -const examplesDir = path.join(__dirname, 'examples'); +const examplesDir = join(__dirname, 'examples'); beforeEach(async () => { readmeExampleJson = await fs.readFile( - path.join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/readme.json'), + join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/readme.json'), 'utf8' ); readmeExampleYaml = await fs.readFile( - path.join(__dirname, '../node_modules/@readme/oas-examples/3.0/yaml/readme.yaml'), + join(__dirname, '../node_modules/@readme/oas-examples/3.0/yaml/readme.yaml'), 'utf8' ); @@ -31,7 +31,7 @@ beforeEach(async () => { 'readme.json': readmeExampleJson, 'readme.yaml': readmeExampleYaml, 'swagger.json': await fs.readFile( - path.join(__dirname, '../node_modules/@readme/oas-examples/2.0/json/petstore.json'), + join(__dirname, '../node_modules/@readme/oas-examples/2.0/json/petstore.json'), 'utf8' ), }, @@ -87,14 +87,14 @@ describe('#saveUrl()', () => { describe('#saveFile()', () => { it('should be able to save a definition', () => { - return new Cache(path.join(examplesDir, 'readme.json')).saveFile().then(() => { + return new Cache(join(examplesDir, 'readme.json')).saveFile().then(() => { expect(console.log).toHaveBeenNthCalledWith(1, expect.stringMatching(/dereferencing so it can/i)); expect(console.log).toHaveBeenNthCalledWith(2, expect.stringMatching(/installation complete/i)); }); }); it('should convert yaml to json', async () => { - const file = path.join(examplesDir, 'readme.yaml'); + const file = join(examplesDir, 'readme.yaml'); const cacheStore = new Cache(file); const hash = Cache.getCacheHash(file); @@ -112,19 +112,19 @@ describe('#saveFile()', () => { describe('#save()', () => { it('should error if definition is a swagger file', async () => { - await expect(() => new Cache(path.join(examplesDir, 'swagger.json')).saveFile()).rejects.toThrow( + await expect(() => new Cache(join(examplesDir, 'swagger.json')).saveFile()).rejects.toThrow( 'Sorry, this module only supports OpenAPI documents.' ); }); it('should error if definition is not a valid openapi file', async () => { - await expect(() => new Cache(path.join(examplesDir, 'invalid-openapi.json')).saveFile()).rejects.toThrow( + await expect(() => new Cache(join(examplesDir, 'invalid-openapi.json')).saveFile()).rejects.toThrow( "Sorry, it doesn't look like that is a valid OpenAPI document" ); }); it('should cache a new file', async () => { - const file = path.join(examplesDir, 'readme.json'); + const file = join(examplesDir, 'readme.json'); const cacheStore = new Cache(file); const hash = Cache.getCacheHash(file); @@ -134,15 +134,24 @@ describe('#save()', () => { expect(cacheStore.getCache()).toHaveProperty(hash); }); - - it.todo('should not re-cache a file if it already exists'); }); describe('#load', () => { - it('should load a file out of cache', async () => { - const file = path.join(examplesDir, 'readme.json'); - const cacheStore = new Cache(file); + let cacheStore; + + beforeEach(() => { + const file = join(examplesDir, 'readme.json'); + cacheStore = new Cache(file); + }); + + it('should return an object if the current uri is an object (used for unit testing)', async () => { + const obj = JSON.parse(readmeExampleJson); + const loaded = new Cache(obj).load(); + expect(loaded).toStrictEqual(obj); + }); + + it('should load a file out of cache', async () => { await cacheStore.saveFile(); const loaded = cacheStore.load(); @@ -153,9 +162,6 @@ describe('#load', () => { }); it('should error if the file is not cached', () => { - const file = path.join(examplesDir, 'readme.json'); - const cacheStore = new Cache(file); - expect(() => { return cacheStore.load(); }).toThrow(/to install this SDK's OpenAPI document/); diff --git a/__tests__/index.test.js b/__tests__/index.test.js index 2774a9ff..f8ce6d4f 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -1,18 +1,62 @@ /* eslint-disable jest-formatting/padding-around-test-blocks */ const nock = require('nock'); const { join } = require('path'); +const findCacheDir = require('find-cache-dir'); +const fsMock = require('mock-fs'); +const fs = require('fs').promises; const api = require('../src'); - -const petstore = api(join(__dirname, './__fixtures__/petstore.json')); +const Cache = require('../src/cache'); +const pkg = require('../package.json'); const serverUrl = 'https://api.example.com'; const createOas = require('./__fixtures__/createOas')(serverUrl); console.logx = obj => { // eslint-disable-next-line global-require - console.log(require('util').inspect(obj, false, null, true)); + process.stdout.write(`${require('util').inspect(obj, false, null, true)}\n`); + // console.log(require('util').inspect(obj, false, null, true)); }; +const originalLog = console.log; +const examplesDir = join(__dirname, 'examples'); + +let petstoreSdk; +let readmeSdk; +const petstoreServerUrl = 'http://petstore.swagger.io/api'; + +beforeEach(async () => { + // mock-fs has issues when you try to console.log when a mock filesystem is present. + // https://github.com/tschaub/mock-fs/issues/234 + console.log = jest.fn().mockImplementation(() => {}); + + fsMock({ + [examplesDir]: { + 'petstore.json': await fs.readFile( + join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/petstore-expanded.json'), + 'utf8' + ), + 'readme.json': await fs.readFile( + join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/readme.json'), + 'utf8' + ), + }, + [findCacheDir({ name: pkg.name })]: {}, + }); + + const petstore = join(examplesDir, 'petstore.json'); + await new Cache(petstore).saveFile(); + petstoreSdk = api(petstore); + + const readme = join(examplesDir, 'readme.json'); + await new Cache(readme).saveFile(); + readmeSdk = api(readme); +}); + +afterEach(() => { + console.log = originalLog; + fsMock.restore(); +}); + describe('#preloading', () => { it.todo('should error if passing in swagger 2'); it.todo('should error if oas file is not valid'); @@ -33,20 +77,24 @@ describe('#preloading', () => { describe('#accessors', () => { it('should have a function for each http method', () => { ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'].forEach(method => { - expect(typeof petstore[method]).toBe('function'); + expect(typeof petstoreSdk[method]).toBe('function'); }); }); describe('#operationId()', () => { it('should work for operationId', () => { - const mock = nock('http://petstore.swagger.io/v1').get('/pets').reply(200); - expect(() => petstore.listPets()).not.toThrow(); + const mock = nock(petstoreServerUrl).get('/pets').reply(200); + expect(() => petstoreSdk.findPets()).not.toThrow(); mock.done(); }); + it('should work with operationIds that have contain spaces', () => { + expect(typeof petstoreSdk['find pet by id']).toBe('function'); + }); + it('should work for other methods', () => { - const mock = nock('http://petstore.swagger.io/v1').post('/pets').reply(200, {}); - expect(() => petstore.createPets()).not.toThrow(); + const mock = nock(petstoreServerUrl).post('/pets').reply(200, {}); + expect(() => petstoreSdk.addPet()).not.toThrow(); mock.done(); }); @@ -55,14 +103,14 @@ describe('#accessors', () => { it.todo('should suggest a similar sounding operation name'); it('should error if an operationId does not exist', () => { - expect(() => petstore.listPetz()).toThrow(/not a function/); + expect(() => petstoreSdk.findPetz()).toThrow(/not a function/); }); }); describe('#method(path)', () => { it('should work for method and path', () => { - const mock = nock('http://petstore.swagger.io/v1').get('/pets').reply(200); - expect(() => petstore.get('/pets')).not.toThrow(); + const mock = nock(petstoreServerUrl).get('/pets').reply(200); + expect(() => petstoreSdk.get('/pets')).not.toThrow(); mock.done(); }); @@ -72,7 +120,6 @@ describe('#accessors', () => { describe('#fetch', () => { const petId = 123; - const body = { a: 1 }; describe('operationId', () => { it.todo('should pass through path/body/other params'); @@ -86,10 +133,10 @@ describe('#fetch', () => { name: 'Buster', }; - const mock = nock('http://petstore.swagger.io/v1').get(`/pets/${petId}`).reply(200, response); + const mock = nock(petstoreServerUrl).delete(`/pets/${petId}`).reply(200, response); - return petstore - .showPetById({ petId }) + return petstoreSdk + .deletePet({ id: petId }) .then(res => { expect(res.status).toBe(200); return res.json(); @@ -101,45 +148,28 @@ describe('#fetch', () => { }); it('should pass through body for operationId', () => { - const mock = nock('http://petstore.swagger.io/v1') - .post('/pets', body) - .reply(200, (uri, requestBody) => { - return { - a: requestBody.a + 100, - }; - }); + const body = { name: 'Buster' }; + const mock = nock(petstoreServerUrl).post('/pets', body).reply(200); - return petstore - .createPets(body) - .then(res => { - expect(res.status).toBe(200); - return res.json(); - }) - .then(res => { - expect(res).toStrictEqual({ a: 101 }); - mock.done(); - }); + return petstoreSdk.addPet(body).then(res => { + expect(res.status).toBe(200); + mock.done(); + }); }); it('should pass through path params and body for operationId', () => { - const mock = nock('http://petstore.swagger.io/v1') - .put(`/pets/${petId}`, body) - .reply(200, (uri, requestBody) => { - return { - a: requestBody.a + 100, - }; - }); + const slug = 'new-release'; + const body = { + title: 'revised title', + body: 'updated body', + }; - return petstore - .updatePetById({ petId }, body) - .then(res => { - expect(res.status).toBe(200); - return res.json(); - }) - .then(res => { - expect(res).toStrictEqual({ a: 101 }); - mock.done(); - }); + const mock = nock('https://dash.readme.io/api/v1').put(`/changelogs/${slug}`, body).reply(200); + + return readmeSdk.updateChangelog(body, { slug }).then(res => { + expect(res.status).toBe(200); + mock.done(); + }); }); }); @@ -150,92 +180,64 @@ describe('#fetch', () => { it.todo('should pass through auth params'); it('should pass through body for method + path', () => { - const mock = nock('http://petstore.swagger.io/v1') + const body = { name: 'Buster' }; + + const mock = nock(petstoreServerUrl) .post('/pets', body) .reply(200, (uri, requestBody) => { return { - a: requestBody.a + 100, + id: 100, + name: requestBody.name, }; }); - return petstore + return petstoreSdk .post('/pets', body) .then(res => { expect(res.status).toBe(200); return res.json(); }) .then(res => { - expect(res).toStrictEqual({ a: 101 }); + expect(res).toStrictEqual({ id: 100, name: body.name }); mock.done(); }); }); it('should pass through path params for method + path', () => { - const sdk = api( - createOas('put', '/{id}', { - parameters: [ - { - name: 'id', - in: 'path', - schema: { - type: 'string', - }, - }, - ], - }) - ); - - const mock = nock(serverUrl).put('/123').reply(200); - return sdk.put('/{id}', { id: 123 }).then(res => { + const slug = 'new-release'; + const mock = nock('https://dash.readme.io/api/v1').put(`/changelogs/${slug}`).reply(200); + return readmeSdk.put('/changelogs/{slug}', { slug }).then(res => { expect(res.status).toBe(200); - expect(res.url).toBe(`${serverUrl}/123`); + expect(res.url).toBe(`https://dash.readme.io/api/v1/changelogs/${slug}`); mock.done(); }); }); it('should pass through path params and body params for method + path', () => { - const sdk = api( - createOas('put', '/{id}', { - parameters: [ - { - name: 'id', - in: 'path', - schema: { - type: 'string', - }, - }, - ], - requestBody: { - content: { - 'application/json': { - schema: { - type: 'object', - properties: { - a: { - type: 'string', - }, - }, - }, - }, - }, - }, - }) - ); + const slug = 'new-release'; + const body = { + title: 'revised title', + body: 'updated body', + }; - const mock = nock(serverUrl) - .put('/123', { a: 1 }) + const mock = nock('https://dash.readme.io/api/v1') + .put(`/changelogs/${slug}`, body) .reply(200, (uri, requestBody) => { - return { a: requestBody.a + 100 }; + return { + ...requestBody, + slug, + }; }); - return sdk - .put('/{id}', { id: 123 }, { a: 1 }) + return readmeSdk + .put('/changelogs/{slug}', body, { slug }) .then(res => { expect(res.status).toBe(200); + expect(res.url).toBe(`https://dash.readme.io/api/v1/changelogs/${slug}`); return res.json(); }) .then(res => { - expect(res).toStrictEqual({ a: 101 }); + expect(res).toStrictEqual({ ...body, slug }); mock.done(); }); }); diff --git a/src/cache.js b/src/cache.js index 9adcb2a1..644321fa 100644 --- a/src/cache.js +++ b/src/cache.js @@ -25,7 +25,14 @@ class SdkCache { } static getCacheHash(file) { - return crypto.createHash('md5').update(file).digest('hex'); + let data = file; + if (typeof file === 'object') { + // Under certain unit testing circumstances, we might be supplying the class with a raw JSON object so we'll need + // to convert it to a string in order to hand it off to the crypto module. + data = JSON.stringify(file); + } + + return crypto.createHash('md5').update(data).digest('hex'); } getCache() { @@ -38,6 +45,11 @@ class SdkCache { } load() { + // If the class was supplied a raw object, just go ahead and bypass the caching system and return that. + if (typeof this.uri === 'object') { + return this.uri; + } + const cache = this.getCache(); if (!(this.uriHash in cache)) { diff --git a/src/index.js b/src/index.js index c1710313..0652c595 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,3 @@ -/* eslint-disable prettier/prettier */ const fetch = require('node-fetch'); const fetchHar = require('fetch-har'); const Oas = require('@readme/oas-tooling'); @@ -20,9 +19,7 @@ class Sdk { constructor(uri) { this.uri = uri; this.supportedVerbs = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']; - - // @todo SdkCache should still be able to handle passing in a raw object for testing purposes - this.spec = new Oas(new SdkCache(this.uri).load()) + this.spec = new Oas(new SdkCache(uri).load()); } static getOperations(spec) { From b01b698a44b84bb57652b879193ee9b65b7ab7d2 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Wed, 20 May 2020 22:52:36 -0700 Subject: [PATCH 12/23] feat: rewriting the sdk to support a proxy-based loading system --- README.md | 2 +- __tests__/auth.test.js | 10 +++- __tests__/cache.test.js | 22 +++++--- __tests__/index.test.js | 67 +++++++++++++++++++---- package-lock.json | 54 +++++++++---------- package.json | 3 +- src/cache.js | 69 ++++++++++++++++++------ src/cli.js | 61 --------------------- src/index.js | 115 +++++++++++++++++++++++++++++++--------- 9 files changed, 250 insertions(+), 153 deletions(-) delete mode 100755 src/cli.js diff --git a/README.md b/README.md index 13a7f6e8..ed2b2751 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# api +# 📦 api diff --git a/__tests__/auth.test.js b/__tests__/auth.test.js index e88d040c..b40c4749 100644 --- a/__tests__/auth.test.js +++ b/__tests__/auth.test.js @@ -4,6 +4,12 @@ const api = require('../src'); const serverUrl = 'https://api.example.com'; const createOas = require('./__fixtures__/createOas')(serverUrl); +console.logx = obj => { + // process.stdout.write(`${require('util').inspect(obj, false, null, true)}\n`); + // eslint-disable-next-line global-require + console.log(require('util').inspect(obj, false, null, true)); +}; + describe('#auth()', () => { const baseSecurityOas = createOas('get', '/', { operationId: 'getSomething', @@ -31,10 +37,12 @@ describe('#auth()', () => { }, }; - it('should allow you to supply auth', () => { + it.only('should allow you to supply auth', async () => { const sdk = api(securityOas); const mock = nock(serverUrl).get('/').query({ apiKeyParam: apiKey }).reply(200, {}); + // console.logx(sdk.auth(apiKey)); + return sdk .auth(apiKey) .getSomething() diff --git a/__tests__/cache.test.js b/__tests__/cache.test.js index 074ca4bc..2c501b03 100644 --- a/__tests__/cache.test.js +++ b/__tests__/cache.test.js @@ -1,3 +1,4 @@ +/* eslint-disable jest-formatting/padding-around-test-blocks */ const nock = require('nock'); const fsMock = require('mock-fs'); const findCacheDir = require('find-cache-dir'); @@ -44,6 +45,12 @@ afterEach(() => { fsMock.restore(); }); +describe('#load', () => { + it.todo('should be able to load a url'); + it.todo('should be able to load a file'); + it.todo('should throw an error if neither a url or file are detected'); +}); + describe('#saveUrl()', () => { it('should be able to save a definition', () => { const mock = nock('http://example.com').get('/readme.json').reply(200, readmeExampleJson); @@ -126,17 +133,16 @@ describe('#save()', () => { it('should cache a new file', async () => { const file = join(examplesDir, 'readme.json'); const cacheStore = new Cache(file); - const hash = Cache.getCacheHash(file); - expect(cacheStore.getCache()).not.toHaveProperty(hash); + expect(cacheStore.isCached()).toBe(false); await cacheStore.saveFile(); - expect(cacheStore.getCache()).toHaveProperty(hash); + expect(cacheStore.isCached()).toBe(true); }); }); -describe('#load', () => { +describe('#get', () => { let cacheStore; beforeEach(() => { @@ -146,7 +152,7 @@ describe('#load', () => { it('should return an object if the current uri is an object (used for unit testing)', async () => { const obj = JSON.parse(readmeExampleJson); - const loaded = new Cache(obj).load(); + const loaded = new Cache(obj).get(); expect(loaded).toStrictEqual(obj); }); @@ -154,7 +160,7 @@ describe('#load', () => { it('should load a file out of cache', async () => { await cacheStore.saveFile(); - const loaded = cacheStore.load(); + const loaded = cacheStore.get(); expect(loaded).toHaveProperty('components'); expect(loaded).toHaveProperty('info'); expect(loaded).toHaveProperty('paths'); @@ -163,7 +169,7 @@ describe('#load', () => { it('should error if the file is not cached', () => { expect(() => { - return cacheStore.load(); - }).toThrow(/to install this SDK's OpenAPI document/); + return cacheStore.get(); + }).toThrow(/has not been cached yet/); }); }); diff --git a/__tests__/index.test.js b/__tests__/index.test.js index f8ce6d4f..c72c0879 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -39,6 +39,10 @@ beforeEach(async () => { join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/readme.json'), 'utf8' ), + 'uspto.json': await fs.readFile( + join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/uspto.json'), + 'utf8' + ), }, [findCacheDir({ name: pkg.name })]: {}, }); @@ -58,6 +62,42 @@ afterEach(() => { }); describe('#preloading', () => { + const uspto = join(examplesDir, 'uspto.json'); + + it('should proxy an sdk for the first time', async () => { + const mock = nock('https://developer.uspto.gov/ds-api').get('/').reply(200); + + // Asserting that we have not previously loaded this API. + expect(new Cache(uspto).isCached()).toBe(false); + + const sdk = api(uspto); + + // SDK should still not be loaded since we haven't officially called it yet. + expect(new Cache(uspto).isCached()).toBe(false); + expect(Object.keys(sdk)).toStrictEqual(['auth']); + + await sdk.get('/').then(() => { + mock.done(); + }); + + // Now that we've called something on the SDK, it should now be fully loaded. + expect(new Cache(uspto).isCached()).toBe(true); + expect(Object.keys(sdk)).toStrictEqual([ + 'auth', + 'get', + 'put', + 'post', + 'delete', + 'options', + 'head', + 'patch', + 'trace', + 'list-data-sets', + 'list-searchable-fields', + 'perform-search', + ]); + }); + it.todo('should error if passing in swagger 2'); it.todo('should error if oas file is not valid'); it.todo('should default to swagger.json/openapi.json'); @@ -68,7 +108,7 @@ describe('#preloading', () => { it.todo('should deref before caching'); - it('should work for object', () => { + it('should work when supplied a JSON OAS object', () => { const sdk = api(createOas()); expect(typeof sdk.get).toBe('function'); }); @@ -82,10 +122,13 @@ describe('#accessors', () => { }); describe('#operationId()', () => { - it('should work for operationId', () => { + it('should work for operationId', async () => { const mock = nock(petstoreServerUrl).get('/pets').reply(200); - expect(() => petstoreSdk.findPets()).not.toThrow(); - mock.done(); + + expect(async () => { + await petstoreSdk.findPets(); + mock.done(); + }).not.toThrow(); }); it('should work with operationIds that have contain spaces', () => { @@ -94,8 +137,11 @@ describe('#accessors', () => { it('should work for other methods', () => { const mock = nock(petstoreServerUrl).post('/pets').reply(200, {}); - expect(() => petstoreSdk.addPet()).not.toThrow(); - mock.done(); + + expect(async () => { + await petstoreSdk.addPet(); + mock.done(); + }).not.toThrow(); }); it.todo('should allow operationId to be the same as a http method'); @@ -103,15 +149,18 @@ describe('#accessors', () => { it.todo('should suggest a similar sounding operation name'); it('should error if an operationId does not exist', () => { - expect(() => petstoreSdk.findPetz()).toThrow(/not a function/); + return expect(petstoreSdk.findPetz()).rejects.toThrow(/does not appear to be a valid operation/); }); }); describe('#method(path)', () => { it('should work for method and path', () => { const mock = nock(petstoreServerUrl).get('/pets').reply(200); - expect(() => petstoreSdk.get('/pets')).not.toThrow(); - mock.done(); + + expect(async () => { + await petstoreSdk.get('/pets'); + mock.done(); + }).not.toThrow(); }); it.todo('should error if method and path does not exist'); diff --git a/package-lock.json b/package-lock.json index 19a8afa0..aa9d2035 100644 --- a/package-lock.json +++ b/package-lock.json @@ -978,9 +978,9 @@ "integrity": "sha512-qS/a24RA5FEoiJS9wiv6Pwg2c/kiUo3IVUQcfeM9JvsR6pM8Yx+yl/6xWYLckZCT5jpLNhslgjiA8p/XcGyMRQ==" }, "@readme/eslint-config": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@readme/eslint-config/-/eslint-config-3.0.0.tgz", - "integrity": "sha512-+u9UGfU8mV+X1MoF7lfYkHY0VR5CP7Jg36qV9AeH8esSQgvbnzHNMPOTwFyRVucZis/YuiN8/ZBK9Fz3fZnViw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@readme/eslint-config/-/eslint-config-3.1.0.tgz", + "integrity": "sha512-zdOl3cchiscOhmFdNNMBtC/xwHbe7iX1w5arI554rqNd8tzHM/7gn8srVMslcKb4w9QVLws/9aRI0KivwblRrw==", "dev": true, "requires": { "eslint-config-airbnb-base": "^14.0.0", @@ -994,7 +994,7 @@ "eslint-plugin-prettier": "^3.1.1", "eslint-plugin-react": "^7.17.0", "eslint-plugin-sonarjs": "^0.5.0", - "eslint-plugin-unicorn": "^19.0.1" + "eslint-plugin-unicorn": "^20.0.0" } }, "@readme/oas-examples": { @@ -1162,21 +1162,21 @@ "dev": true }, "@typescript-eslint/experimental-utils": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.32.0.tgz", - "integrity": "sha512-oDWuB2q5AXsQ/mLq2N4qtWiBASWXPf7KhqXgeGH4QsyVKx+km8F6Vfqd3bspJQyhyCqxcbLO/jKJuIV3DzHZ6A==", + "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": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.32.0", + "@typescript-eslint/typescript-estree": "2.34.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.32.0.tgz", - "integrity": "sha512-hQpbWM/Y2iq6jB9FHYJBqa3h1R9IEGodOtajhb261cVHt9cz30AKjXM6WP7LxJdEPPlyJ9rPTZVgBUgZgiyPgw==", + "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": { "debug": "^4.1.1", @@ -1903,11 +1903,6 @@ "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==" - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -2580,9 +2575,9 @@ } }, "eslint-plugin-es": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", - "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", "dev": true, "requires": { "eslint-utils": "^2.0.0", @@ -2620,9 +2615,9 @@ } }, "eslint-plugin-jest": { - "version": "23.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.10.0.tgz", - "integrity": "sha512-cHC//nesojSO1MLxVmFJR/bUaQQG7xvMHQD8YLbsQzevR41WKm8paKDUv2wMHlUy5XLZUmNcWuflOi4apS8D+Q==", + "version": "23.13.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.13.1.tgz", + "integrity": "sha512-TRLJH6M6EDvGocD98a7yVThrAOCK9WJfo9phuUb0MJptcrOYZeCKzC9aOzZCD93sxXCsiJVZywaTHdI/mAi0FQ==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^2.5.0" @@ -2675,9 +2670,9 @@ } }, "eslint-plugin-react": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", - "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz", + "integrity": "sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA==", "dev": true, "requires": { "array-includes": "^3.1.1", @@ -2689,7 +2684,6 @@ "object.values": "^1.1.1", "prop-types": "^15.7.2", "resolve": "^1.15.1", - "semver": "^6.3.0", "string.prototype.matchall": "^4.0.2", "xregexp": "^4.3.0" }, @@ -2712,9 +2706,9 @@ "dev": true }, "eslint-plugin-unicorn": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-19.0.1.tgz", - "integrity": "sha512-fu0/h5mHXfBC6EkA3i2vCjsfC8j53+T9txGhNL4fpxJ+1JKsUKfv+tmXDgy0XnLHhFjnOZp4tRWJWbcykeIP2Q==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-20.0.0.tgz", + "integrity": "sha512-Uob50ZUfqKO4kK3YI3johD3Mnlzs2mWHGELbxFPEWj/2sOAMTV5769t9gGQNzarif+HXRmsKnqZS6XMkfb80Bg==", "dev": true, "requires": { "ci-info": "^2.0.0", @@ -2728,7 +2722,7 @@ "regexp-tree": "^0.1.21", "reserved-words": "^0.1.2", "safe-regex": "^2.1.1", - "semver": "^7.1.3" + "semver": "^7.3.2" }, "dependencies": { "parse-json": { diff --git a/package.json b/package.json index be12604a..fd8c81a0 100644 --- a/package.json +++ b/package.json @@ -26,14 +26,13 @@ "@readme/oas-to-har": "^6.9.6", "@readme/oas-tooling": "^3.4.1", "chalk": "^4.0.0", - "commander": "^5.1.0", "fetch-har": "^2.3.1", "find-cache-dir": "^3.3.1", "node-fetch": "^2.6.0", "yaml": "^1.9.2" }, "devDependencies": { - "@readme/eslint-config": "^3.0.0", + "@readme/eslint-config": "^3.1.0", "@readme/oas-examples": "^3.4.0", "eslint": "^7.0.0", "jest": "^25.5.2", diff --git a/src/cache.js b/src/cache.js index 644321fa..9b8eeec4 100644 --- a/src/cache.js +++ b/src/cache.js @@ -12,7 +12,8 @@ const cacheDir = findCacheDir({ name: pkg.name, thunk: true }); console.logx = obj => { // eslint-disable-next-line global-require - console.log(require('util').inspect(obj, false, null, true)); + process.stdout.write(`${require('util').inspect(obj, false, null, true)}\n`); + // console.log(require('util').inspect(obj, false, null, true)); }; class SdkCache { @@ -22,6 +23,9 @@ class SdkCache { this.dir = cacheDir(); this.cacheStore = cacheDir('cache.json'); this.specsCache = cacheDir('specs'); + + // This should default to false so we have awareness if we've looked at the cache yet. + this.cached = false; } static getCacheHash(file) { @@ -35,30 +39,59 @@ class SdkCache { return crypto.createHash('md5').update(data).digest('hex'); } + isCached() { + const cache = this.getCache(); + return cache && this.uriHash in cache; + } + getCache() { - let cache = {}; + if (typeof this.cached === 'object') { + return this.cached; + } + + this.cached = {}; + if (fs.existsSync(this.cacheStore)) { - cache = JSON.parse(fs.readFileSync(this.cacheStore, 'utf8')); + this.cached = JSON.parse(fs.readFileSync(this.cacheStore, 'utf8')); } - return cache; + return this.cached; } - load() { + get() { // If the class was supplied a raw object, just go ahead and bypass the caching system and return that. if (typeof this.uri === 'object') { return this.uri; } + if (!this.isCached()) { + throw new Error(`${this.uri} has not been cached yet and must do so before being retrieved.`); + } + const cache = this.getCache(); + return JSON.parse(fs.readFileSync(cache[this.uriHash].path, 'utf8')); + } - if (!(this.uriHash in cache)) { - throw new Error( - `Please run \`npx api install ${this.uri}\` to install this SDK's OpenAPI document before using it.` - ); + async load() { + // If the class was supplied a raw object, just go ahead and bypass the caching system and return that. + if (typeof this.uri === 'object') { + return this.uri; } - return JSON.parse(fs.readFileSync(cache[this.uriHash].path, 'utf8')); + try { + const url = new URL(this.uri); + this.uri = url.href; + + return this.saveUrl(); + } catch (err) { + if (!fs.existsSync(this.uri)) { + throw new Error( + `Sorry, we were unable to load that OpenAPI document. Please either supply a URL or a path on your filesystem.` + ); + } + + return this.saveFile(); + } } save(json) { @@ -84,7 +117,7 @@ class SdkCache { console.log(chalk.green('Dereferencing so it can easily handled...')); return $RefParser.dereference(res); }) - .then(async res => { + .then(async spec => { if (!fs.existsSync(self.dir)) { fs.mkdirSync(self.dir, { recursive: true }); } @@ -97,21 +130,25 @@ class SdkCache { if (this.uriHash in cache) { console.log(chalk.green('The specification is already installed.')); } else { - const spec = JSON.stringify(res, null, 2); - const jsonHash = crypto.createHash('md5').update(spec).digest('hex'); + const saved = JSON.stringify(spec, null, 2); + const jsonHash = crypto.createHash('md5').update(saved).digest('hex'); cache[this.uriHash] = { path: cacheDir('specs', `${jsonHash}.json`), original: this.uri, - title: 'title' in res.info ? res.info.title : undefined, - version: 'version' in res.info ? res.info.version : undefined, + title: 'title' in spec.info ? spec.info.title : undefined, + version: 'version' in spec.info ? spec.info.version : undefined, }; - fs.writeFileSync(cache[this.uriHash].path, spec); + fs.writeFileSync(cache[this.uriHash].path, saved); fs.writeFileSync(self.cacheStore, JSON.stringify(cache, null, 2)); + self.cache = cache; + console.log(chalk.green('Installation complete!')); } + + return spec; }); } diff --git a/src/cli.js b/src/cli.js deleted file mode 100755 index 660ac222..00000000 --- a/src/cli.js +++ /dev/null @@ -1,61 +0,0 @@ -#! /usr/bin/env node -const chalk = require('chalk'); -const pkg = require('../package.json'); -const { Command } = require('commander'); -const fetch = require('node-fetch'); -const fs = require('fs').promises; -const Cache = require('./cache'); - -global.fetch = fetch; -global.Request = fetch.Request; -global.Headers = fetch.Headers; - -const program = new Command(); -program.version(pkg.version); - -console.logx = obj => { - // eslint-disable-next-line global-require - console.log(require('util').inspect(obj, false, null, true)); -}; - -program - .command('install ') - .description('Install an OpenAPI Document to be later used as an SDK') - .action(async location => { - console.log(chalk.green('Retrieving...')); - - let url; - let cacheFrom; - - try { - url = new URL(location); - cacheFrom = 'url'; - } catch (err) { - // This doens't look to be a valid URL so does it exist on their filesystem instead? - await fs - .stat(location) - .then(() => { - cacheFrom = 'file'; - }) - .catch(() => { - console.log( - chalk.red( - 'Sorry, we were unable to install that OpenAPI document. Please either supply a URL or a path on your filesystem.' - ) - ); - process.exit(); - }); - } - - if (cacheFrom === 'url') { - await new Cache(url.href).saveUrl().catch(err => { - console.log(chalk.red(err.message)); - }); - } else { - await new Cache(location).saveFile().catch(err => { - console.log(chalk.red(err.message)); - }); - } - }); - -program.parse(process.argv); diff --git a/src/index.js b/src/index.js index 0652c595..69b14ebc 100644 --- a/src/index.js +++ b/src/index.js @@ -3,7 +3,7 @@ const fetchHar = require('fetch-har'); const Oas = require('@readme/oas-tooling'); const oasToHar = require('@readme/oas-to-har'); -const SdkCache = require('./cache'); +const Cache = require('./cache'); const { prepareAuth, prepareParams } = require('./lib/index'); global.fetch = fetch; @@ -18,8 +18,6 @@ console.logx = obj => { class Sdk { constructor(uri) { this.uri = uri; - this.supportedVerbs = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']; - this.spec = new Oas(new SdkCache(uri).load()); } static getOperations(spec) { @@ -33,44 +31,111 @@ class Sdk { } load() { - const { spec } = this; const authKeys = []; + const cache = new Cache(this.uri); - function auth(...values) { + let isLoaded = false; + let isCached = cache.isCached(); + let sdk = {}; + + /* function auth(...values) { authKeys.push(values); - return this; - } + return sdk; + } */ - function fetchOperation(operation, body, metadata) { + function fetchOperation(spec, operation, body, metadata) { const har = oasToHar(spec, operation, prepareParams(operation, body, metadata), prepareAuth(authKeys, operation)); return fetchHar(har); } - const methods = this.supportedVerbs - .map(name => { - return { - [name]: ((method, path, ...args) => { - const operation = spec.operation(path, method); - return fetchOperation(operation, ...args); - }).bind(null, name), - }; - }) - .reduce((prev, next) => Object.assign(prev, next)); + sdk = { + auth: (...values) => { + authKeys.push(values); + return sdk; + }, + }; + + function loadMethods(spec) { + const supportedVerbs = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']; - return { - auth, - ...methods, - ...Sdk.getOperations(spec) + return supportedVerbs + .map(name => { + return { + [name]: ((method, path, ...args) => { + const operation = spec.operation(path, method); + return fetchOperation(spec, operation, ...args); + }).bind(null, name), + }; + }) + .reduce((prev, next) => Object.assign(prev, next)); + } + + function loadOperations(spec) { + return Sdk.getOperations(spec) .filter(operation => operation.operationId) .reduce((prev, next) => { return Object.assign(prev, { [next.operationId]: ((operation, ...args) => { - return fetchOperation(operation, ...args); + return fetchOperation(spec, operation, ...args); }).bind(null, next), }); - }, {}), - }; + }, {}); + } + + async function loadFromCache() { + let cachedSpec; + if (isCached) { + console.logx('🌀 retrieving from cache') + cachedSpec = await cache.get(); + } else { + console.logx('💾 loading and caching') + cachedSpec = await cache.load(); + isCached = true; + } + + const spec = new Oas(cachedSpec); + + sdk = Object.assign(sdk, { + ...loadMethods(spec), + ...loadOperations(spec), + }); + + isLoaded = true; + } + + return new Proxy(sdk, { + get(target, method) { + return async function (...args) { + /* if (method === 'auth') { + authKeys.push(args); + console.logx(Object.keys(sdk)); + return target; + } */ + + console.logx(`${method} was called. is it in the target? ${method in target}`); + + if (!(method in target)) { + // If this method doesn't exist on the proxy (SDK), have we loaded the SDK? If we have, then this method + // isn't valid. + if (isLoaded) { + throw new Error(`Sorry, \`${method}\` does not appear to be a valid operation on this API.`); + } + + await loadFromCache(); + + // If after loading the SDK this method still doesn't exist, then it's not real! + if (!(method in sdk)) { + throw new Error(`Sorry, \`${method}\` does not appear to be a valid operation on this API.`); + } + + return sdk[method].apply(this, args); + } + + return target[method].apply(this, args); + }; + }, + }); } } From 7db0d2527b64d8337ddf17ed4bbd268cb9eb325f Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Wed, 20 May 2020 23:46:52 -0700 Subject: [PATCH 13/23] fix: reworking the proxy so it can be chained off `.auth` calls --- __tests__/auth.test.js | 24 ++++++--------------- src/index.js | 48 ++++++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/__tests__/auth.test.js b/__tests__/auth.test.js index b40c4749..bcf05eea 100644 --- a/__tests__/auth.test.js +++ b/__tests__/auth.test.js @@ -1,13 +1,13 @@ const nock = require('nock'); const api = require('../src'); +const util = require('util'); const serverUrl = 'https://api.example.com'; const createOas = require('./__fixtures__/createOas')(serverUrl); console.logx = obj => { // process.stdout.write(`${require('util').inspect(obj, false, null, true)}\n`); - // eslint-disable-next-line global-require - console.log(require('util').inspect(obj, false, null, true)); + console.log(util.inspect(obj, false, null, true)); }; describe('#auth()', () => { @@ -37,12 +37,10 @@ describe('#auth()', () => { }, }; - it.only('should allow you to supply auth', async () => { + it('should allow you to supply auth', () => { const sdk = api(securityOas); const mock = nock(serverUrl).get('/').query({ apiKeyParam: apiKey }).reply(200, {}); - // console.logx(sdk.auth(apiKey)); - return sdk .auth(apiKey) .getSomething() @@ -55,9 +53,7 @@ describe('#auth()', () => { it('should throw if you supply multiple auth keys', () => { const sdk = api(securityOas); - expect(() => { - sdk.auth(apiKey, apiKey).getSomething(); - }).toThrow(/only a single key is needed/i); + return expect(sdk.auth(apiKey, apiKey).getSomething()).rejects.toThrow(/only a single key is needed/i); }); }); @@ -93,9 +89,7 @@ describe('#auth()', () => { it('should throw if you supply multiple auth keys', () => { const sdk = api(securityOas); - expect(() => { - sdk.auth(apiKey, apiKey).getSomething(); - }).toThrow(/only a single key is needed/i); + return expect(sdk.auth(apiKey, apiKey).getSomething()).rejects.toThrow(/only a single key is needed/i); }); }); }); @@ -183,9 +177,7 @@ describe('#auth()', () => { it('should throw if you pass in multiple bearer tokens', () => { const sdk = api(securityOas); - expect(() => { - sdk.auth(apiKey, apiKey).getSomething(); - }).toThrow(/only a single token is needed/i); + return expect(sdk.auth(apiKey, apiKey).getSomething()).rejects.toThrow(/only a single token is needed/i); }); }); }); @@ -221,9 +213,7 @@ describe('#auth()', () => { it('should throw if you pass in multiple bearer tokens', () => { const sdk = api(securityOas); - expect(() => { - sdk.auth(apiKey, apiKey).getSomething(); - }).toThrow(/only a single token is needed/i); + return expect(sdk.auth(apiKey, apiKey).getSomething()).rejects.toThrow(/only a single token is needed/i); }); }); }); diff --git a/src/index.js b/src/index.js index 69b14ebc..3ee9f889 100644 --- a/src/index.js +++ b/src/index.js @@ -38,24 +38,12 @@ class Sdk { let isCached = cache.isCached(); let sdk = {}; - /* function auth(...values) { - authKeys.push(values); - return sdk; - } */ - function fetchOperation(spec, operation, body, metadata) { const har = oasToHar(spec, operation, prepareParams(operation, body, metadata), prepareAuth(authKeys, operation)); return fetchHar(har); } - sdk = { - auth: (...values) => { - authKeys.push(values); - return sdk; - }, - }; - function loadMethods(spec) { const supportedVerbs = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']; @@ -86,10 +74,10 @@ class Sdk { async function loadFromCache() { let cachedSpec; if (isCached) { - console.logx('🌀 retrieving from cache') + // console.logx('🌀 retrieving from cache') cachedSpec = await cache.get(); } else { - console.logx('💾 loading and caching') + // console.logx('💾 loading and caching') cachedSpec = await cache.load(); isCached = true; } @@ -104,16 +92,21 @@ class Sdk { isLoaded = true; } - return new Proxy(sdk, { + const sdkProxy = { get(target, method) { - return async function (...args) { - /* if (method === 'auth') { - authKeys.push(args); - console.logx(Object.keys(sdk)); - return target; - } */ + // console.logx(`📲 calling .${method}`); + + // Since auth returns a self-proxy, we **do not** want it to fall through into the async function below as when + // that'll happen, instead of returning a self-proxy, it'll end up returning a Promise. When that happens, + // chaining `sdk.auth().operationId()` will fail. + if (method === 'auth') { + return function (...args) { + return target[method].apply(this, args); + }; + } - console.logx(`${method} was called. is it in the target? ${method in target}`); + return async function (...args) { + // console.logx(`🚨 ${method} was called. is it in the target? ${method in target}`); if (!(method in target)) { // If this method doesn't exist on the proxy (SDK), have we loaded the SDK? If we have, then this method @@ -135,7 +128,16 @@ class Sdk { return target[method].apply(this, args); }; }, - }); + }; + + sdk = { + auth: (...values) => { + authKeys.push(values); + return new Proxy(sdk, sdkProxy); + }, + }; + + return new Proxy(sdk, sdkProxy); } } From ccfdb01c687583a5aacaa2b8b127bcaddbd219f0 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 21 May 2020 00:14:39 -0700 Subject: [PATCH 14/23] fix: caching system no longer logs to the console --- __tests__/auth.test.js | 6 --- __tests__/cache.test.js | 63 ++++++++++++++++++++--------- __tests__/index.test.js | 12 ------ __tests__/lib/prepareParams.test.js | 5 --- package-lock.json | 49 +--------------------- package.json | 1 - src/cache.js | 16 +------- src/index.js | 11 ----- src/lib/prepareParams.js | 5 --- 9 files changed, 46 insertions(+), 122 deletions(-) diff --git a/__tests__/auth.test.js b/__tests__/auth.test.js index bcf05eea..32bcaeb0 100644 --- a/__tests__/auth.test.js +++ b/__tests__/auth.test.js @@ -1,15 +1,9 @@ const nock = require('nock'); const api = require('../src'); -const util = require('util'); const serverUrl = 'https://api.example.com'; const createOas = require('./__fixtures__/createOas')(serverUrl); -console.logx = obj => { - // process.stdout.write(`${require('util').inspect(obj, false, null, true)}\n`); - console.log(util.inspect(obj, false, null, true)); -}; - describe('#auth()', () => { const baseSecurityOas = createOas('get', '/', { operationId: 'getSomething', diff --git a/__tests__/cache.test.js b/__tests__/cache.test.js index 2c501b03..6e8aced0 100644 --- a/__tests__/cache.test.js +++ b/__tests__/cache.test.js @@ -10,9 +10,26 @@ const pkg = require('../package.json'); let readmeExampleJson; let readmeExampleYaml; -const originalLog = console.log; const examplesDir = join(__dirname, 'examples'); +expect.extend({ + // Custom matcher so we can easily test that dereferencing of OpenAPI files is working as expected. + toBeDereferenced(received) { + const pass = !received.filter(obj => '$ref' in obj).length; + if (pass) { + return { + message: () => `expected supplied array not to be dereferenced`, + pass: true, + }; + } + + return { + message: () => `expected supplied array to be dereferenced`, + pass: false, + }; + }, +}); + beforeEach(async () => { readmeExampleJson = await fs.readFile( join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/readme.json'), @@ -24,8 +41,6 @@ beforeEach(async () => { 'utf8' ); - console.log = jest.fn().mockImplementation(() => {}); - fsMock({ [examplesDir]: { 'invalid-openapi.json': JSON.stringify(pkg), @@ -41,7 +56,6 @@ beforeEach(async () => { }); afterEach(() => { - console.log = originalLog; fsMock.restore(); }); @@ -54,10 +68,13 @@ describe('#load', () => { describe('#saveUrl()', () => { it('should be able to save a definition', () => { const mock = nock('http://example.com').get('/readme.json').reply(200, readmeExampleJson); + const cacheStore = new Cache('http://example.com/readme.json'); - return new Cache('http://example.com/readme.json').saveUrl().then(() => { - expect(console.log).toHaveBeenNthCalledWith(1, expect.stringMatching(/dereferencing so it can/i)); - expect(console.log).toHaveBeenNthCalledWith(2, expect.stringMatching(/installation complete/i)); + expect(cacheStore.isCached()).toBe(false); + + return cacheStore.saveUrl().then(() => { + expect(cacheStore.get().paths['/api-specification'].get.parameters).toBeDereferenced(); + expect(cacheStore.isCached()).toBe(true); mock.done(); }); }); @@ -79,10 +96,11 @@ describe('#saveUrl()', () => { const cacheStore = new Cache(definition); const hash = Cache.getCacheHash(definition); + expect(cacheStore.isCached()).toBe(false); + await cacheStore.saveUrl().then(() => { - expect(console.log).toHaveBeenNthCalledWith(1, expect.stringMatching(/converting yaml to json/i)); - expect(console.log).toHaveBeenNthCalledWith(2, expect.stringMatching(/dereferencing so it can/i)); - expect(console.log).toHaveBeenNthCalledWith(3, expect.stringMatching(/installation complete/i)); + expect(cacheStore.get().paths['/api-specification'].get.parameters).toBeDereferenced(); + expect(cacheStore.isCached()).toBe(true); mock.done(); }); @@ -94,9 +112,13 @@ describe('#saveUrl()', () => { describe('#saveFile()', () => { it('should be able to save a definition', () => { - return new Cache(join(examplesDir, 'readme.json')).saveFile().then(() => { - expect(console.log).toHaveBeenNthCalledWith(1, expect.stringMatching(/dereferencing so it can/i)); - expect(console.log).toHaveBeenNthCalledWith(2, expect.stringMatching(/installation complete/i)); + const cacheStore = new Cache(join(examplesDir, 'readme.json')); + + expect(cacheStore.isCached()).toBe(false); + + return cacheStore.saveFile().then(() => { + expect(cacheStore.get().paths['/api-specification'].get.parameters).toBeDereferenced(); + expect(cacheStore.isCached()).toBe(true); }); }); @@ -105,10 +127,11 @@ describe('#saveFile()', () => { const cacheStore = new Cache(file); const hash = Cache.getCacheHash(file); + expect(cacheStore.isCached()).toBe(false); + await cacheStore.saveFile().then(() => { - expect(console.log).toHaveBeenNthCalledWith(1, expect.stringMatching(/converting yaml to json/i)); - expect(console.log).toHaveBeenNthCalledWith(2, expect.stringMatching(/dereferencing so it can/i)); - expect(console.log).toHaveBeenNthCalledWith(3, expect.stringMatching(/installation complete/i)); + expect(cacheStore.get().paths['/api-specification'].get.parameters).toBeDereferenced(); + expect(cacheStore.isCached()).toBe(true); }); const cached = cacheStore.getCache(); @@ -118,14 +141,14 @@ describe('#saveFile()', () => { }); describe('#save()', () => { - it('should error if definition is a swagger file', async () => { - await expect(() => new Cache(join(examplesDir, 'swagger.json')).saveFile()).rejects.toThrow( + it('should error if definition is a swagger file', () => { + return expect(new Cache(join(examplesDir, 'swagger.json')).saveFile()).rejects.toThrow( 'Sorry, this module only supports OpenAPI documents.' ); }); - it('should error if definition is not a valid openapi file', async () => { - await expect(() => new Cache(join(examplesDir, 'invalid-openapi.json')).saveFile()).rejects.toThrow( + it('should error if definition is not a valid openapi file', () => { + return expect(new Cache(join(examplesDir, 'invalid-openapi.json')).saveFile()).rejects.toThrow( "Sorry, it doesn't look like that is a valid OpenAPI document" ); }); diff --git a/__tests__/index.test.js b/__tests__/index.test.js index c72c0879..b1978bc5 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -11,13 +11,6 @@ const pkg = require('../package.json'); const serverUrl = 'https://api.example.com'; const createOas = require('./__fixtures__/createOas')(serverUrl); -console.logx = obj => { - // eslint-disable-next-line global-require - process.stdout.write(`${require('util').inspect(obj, false, null, true)}\n`); - // console.log(require('util').inspect(obj, false, null, true)); -}; - -const originalLog = console.log; const examplesDir = join(__dirname, 'examples'); let petstoreSdk; @@ -25,10 +18,6 @@ let readmeSdk; const petstoreServerUrl = 'http://petstore.swagger.io/api'; beforeEach(async () => { - // mock-fs has issues when you try to console.log when a mock filesystem is present. - // https://github.com/tschaub/mock-fs/issues/234 - console.log = jest.fn().mockImplementation(() => {}); - fsMock({ [examplesDir]: { 'petstore.json': await fs.readFile( @@ -57,7 +46,6 @@ beforeEach(async () => { }); afterEach(() => { - console.log = originalLog; fsMock.restore(); }); diff --git a/__tests__/lib/prepareParams.test.js b/__tests__/lib/prepareParams.test.js index 77a01644..19d85ac9 100644 --- a/__tests__/lib/prepareParams.test.js +++ b/__tests__/lib/prepareParams.test.js @@ -7,11 +7,6 @@ const serverUrl = 'https://api.example.com'; const createOas = require('../__fixtures__/createOas')(serverUrl); const prepareParams = require('../../src/lib/prepareParams'); -console.logx = obj => { - // eslint-disable-next-line global-require - console.log(require('util').inspect(obj, false, null, true)); -}; - const arraySchema = createOas('put', '/', { requestBody: { content: { diff --git a/package-lock.json b/package-lock.json index aa9d2035..c430b8b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1080,7 +1080,8 @@ "@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==" + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true }, "@types/graceful-fs": { "version": "4.1.3", @@ -1743,39 +1744,6 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "chalk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", - "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.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==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - } - }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -3363,11 +3331,6 @@ "function-bind": "^1.1.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==" - }, "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", @@ -7182,14 +7145,6 @@ "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", "dev": true }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - }, "supports-hyperlinks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", diff --git a/package.json b/package.json index fd8c81a0..e2819394 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "@apidevtools/swagger-parser": "^9.0.1", "@readme/oas-to-har": "^6.9.6", "@readme/oas-tooling": "^3.4.1", - "chalk": "^4.0.0", "fetch-har": "^2.3.1", "find-cache-dir": "^3.3.1", "node-fetch": "^2.6.0", diff --git a/src/cache.js b/src/cache.js index 9b8eeec4..973768f8 100644 --- a/src/cache.js +++ b/src/cache.js @@ -1,5 +1,4 @@ const fetch = require('node-fetch'); -const chalk = require('chalk'); const SwaggerParser = require('@apidevtools/swagger-parser'); const $RefParser = require('@apidevtools/json-schema-ref-parser'); const yaml = require('yaml'); @@ -10,12 +9,6 @@ const fs = require('fs'); const cacheDir = findCacheDir({ name: pkg.name, thunk: true }); -console.logx = obj => { - // eslint-disable-next-line global-require - process.stdout.write(`${require('util').inspect(obj, false, null, true)}\n`); - // console.log(require('util').inspect(obj, false, null, true)); -}; - class SdkCache { constructor(uri) { this.uri = uri; @@ -114,7 +107,6 @@ class SdkCache { }); }) .then(res => { - console.log(chalk.green('Dereferencing so it can easily handled...')); return $RefParser.dereference(res); }) .then(async spec => { @@ -127,9 +119,7 @@ class SdkCache { } const cache = self.getCache(); - if (this.uriHash in cache) { - console.log(chalk.green('The specification is already installed.')); - } else { + if (!(this.uriHash in cache)) { const saved = JSON.stringify(spec, null, 2); const jsonHash = crypto.createHash('md5').update(saved).digest('hex'); @@ -144,8 +134,6 @@ class SdkCache { fs.writeFileSync(self.cacheStore, JSON.stringify(cache, null, 2)); self.cache = cache; - - console.log(chalk.green('Installation complete!')); } return spec; @@ -160,7 +148,6 @@ class SdkCache { } if (res.headers.get('content-type') === 'application/yaml' || /\.(yaml|yml)/.test(this.uri)) { - console.log(chalk.green('Converting YAML to JSON...')); return res.text().then(text => { return yaml.parse(text); }); @@ -177,7 +164,6 @@ class SdkCache { }) .then(res => { if (/\.(yaml|yml)/.test(this.uri)) { - console.log(chalk.green('Converting YAML to JSON...')); return yaml.parse(res); } diff --git a/src/index.js b/src/index.js index 3ee9f889..f4409410 100644 --- a/src/index.js +++ b/src/index.js @@ -10,11 +10,6 @@ global.fetch = fetch; global.Request = fetch.Request; global.Headers = fetch.Headers; -console.logx = obj => { - // eslint-disable-next-line global-require - console.log(require('util').inspect(obj, false, null, true)); -}; - class Sdk { constructor(uri) { this.uri = uri; @@ -74,10 +69,8 @@ class Sdk { async function loadFromCache() { let cachedSpec; if (isCached) { - // console.logx('🌀 retrieving from cache') cachedSpec = await cache.get(); } else { - // console.logx('💾 loading and caching') cachedSpec = await cache.load(); isCached = true; } @@ -94,8 +87,6 @@ class Sdk { const sdkProxy = { get(target, method) { - // console.logx(`📲 calling .${method}`); - // Since auth returns a self-proxy, we **do not** want it to fall through into the async function below as when // that'll happen, instead of returning a self-proxy, it'll end up returning a Promise. When that happens, // chaining `sdk.auth().operationId()` will fail. @@ -106,8 +97,6 @@ class Sdk { } return async function (...args) { - // console.logx(`🚨 ${method} was called. is it in the target? ${method in target}`); - if (!(method in target)) { // If this method doesn't exist on the proxy (SDK), have we loaded the SDK? If we have, then this method // isn't valid. diff --git a/src/lib/prepareParams.js b/src/lib/prepareParams.js index fc987fa7..badf5fca 100644 --- a/src/lib/prepareParams.js +++ b/src/lib/prepareParams.js @@ -1,8 +1,3 @@ -console.logx = obj => { - // eslint-disable-next-line global-require - console.log(require('util').inspect(obj, false, null, true)); -}; - function digestParameters(parameters) { return parameters.reduce((prev, param) => { if ('$ref' in param || 'allOf' in param || 'anyOf' in param || 'oneOf' in param) { From b191c74fa6414a29dddd16660f7fbbe92504775c Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 21 May 2020 10:07:19 -0700 Subject: [PATCH 15/23] chore: adding some more files to npmignore --- .eslintignore | 1 + .eslintrc | 5 +---- .npmignore | 3 +++ 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.eslintignore b/.eslintignore index 528702fc..89849309 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ .github/ coverage/ node_modules/ +example.js diff --git a/.eslintrc b/.eslintrc index 9ee8c36b..90564095 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,7 +1,4 @@ { "extends": "@readme/eslint-config", - "root": true, - "rules": { - "no-console": "off" - } + "root": true } diff --git a/.npmignore b/.npmignore index dab87b6f..34d9be78 100644 --- a/.npmignore +++ b/.npmignore @@ -1,4 +1,7 @@ __tests__/ +.github/ +coverage/ .eslint* .gitignore .prettier* +example.js From de9efe3fd4e44b0a8dce329589f6fcb37e9512f5 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 21 May 2020 10:31:50 -0700 Subject: [PATCH 16/23] chore: rebuilding package-lock.json --- .github/workflows/ci.yml | 4 ++-- package-lock.json | 44 ++++++++++++++++------------------------ 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 588d42a6..b1d1f879 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,8 +19,8 @@ jobs: with: node-version: ${{ matrix.node-version }} - - name: npm install + - name: Install dependencies run: npm ci - - name: tests + - name: Run tests run: npm test diff --git a/package-lock.json b/package-lock.json index e00596e1..7bd4a9e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -276,38 +276,34 @@ "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" - } - }, "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 + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, "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 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "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 + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "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" + } } } }, @@ -2122,10 +2118,10 @@ "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { "esutils": "^2.0.2", @@ -6979,12 +6975,6 @@ "extend-shallow": "^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 - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", From 6627546836ab754d337db3b3b77f385e02118b0f Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 21 May 2020 11:58:17 -0700 Subject: [PATCH 17/23] docs: revising the readme and adding tons of docs --- README.md | 126 +++++++++++++++++++++++++++++++++++++++++++++++++-- package.json | 2 +- 2 files changed, 124 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ed2b2751..b306012d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,125 @@ -# 📦 api +# 🚀 api - +[![npm](https://img.shields.io/npm/v/api)](https://npm.im/api) [![Build](https://github.com/readmeio/api/workflows/CI/badge.svg)](https://github.com/readmeio/api) -[![Build](https://github.com/readmeio/api/workflows/CI/badge.svg)](https://github.com/readmeio/api) +Automatic SDK generation from an OpenAPI definition. + +* [Installation](#installation) +* [Usage](#usage) + * [Authentication](#authentication) + * [Parameters and Payloads](#parameters-and-payloads) + * [HTTP requests](#http-requests) +* [How does it work?](#how-does-it-work) +* [Interested in contributing?](#interested-in-contributing) +* [FAQ](#faq) + +## Installation +``` +npm install api --save +``` + +## Usage +Using `api` is as simple as supplying it an OpenAPI and using the SDK as you would any other! + +```js +const sdk = require('api')('https://raw.githubusercontent.com/readmeio/oas/master/packages/examples/3.0/json/petstore.json'); + +sdk.listPets().then(res => res.json()).then(res => { + console.log(`My pets name is ${res[0].name}!`); +}); +``` + +The OpenAPI definition is automatically downloaded, cached, and transformed into a chainable [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) Promise that you can use to make API requests. + +### Authentication +`api` supports API authentication through an `.auth()` method that you can chain to your requests, as such: + +```js +sdk.auth('myApiToken').listPets().then(...); +``` + +With the exception of OpenID, it supports all forms of authentication supported by the OpenAPI specification! Just give `.auth()` your credentials and it'll figure out how to use it according to the API you're using. + +For example: + +* HTTP Basic auth: `sdk.auth('username', 'password')` +* Bearer tokens (HTTP or OAuth 2): `sdk.auth('myBearerToken')` +* API Keys: `sdk.auth('myApiKey')` + +### Parameters and Payloads +When supplying parameters and/or request body payloads to an API request, you don't to explicitly define what goes where since the API definition contains all that information. All you need to do is supply either one or two objects: + +* `body`: This will contain all data required for a request body payload for a POST, PUT, etc. request. It can either be an array or an object, whichever you need to use the API operation you're using. +* `metadata`: This is an object where all parameters (path, query, header, cookie) go. Again, don't worry about telling the SDK that a path parameter is for the path, that's all handled for you. + +For example, if you wanted to make a simple GET request: + +```js +sdk.showPetById({ petId: 1234 }).then(...) +``` + +Since `petId` matches up with the `petId` path parameter, the SDK here will issue a GET request against `/pets/1234`. + +What about a POST request? + +```js +sdk.createPets({ name: 'Buster' }).then(...) +``` + +Since `name` here would coorespond on `createPets` to request body payload, this will issue a POST request against `/pets` to make a new pet named "Buster". + +What about operations that require both? Well you can mix them too! + +```js +sdk.updatePet({ name: 'Buster 2' }, { petId: 1234 }).then(...) +``` + +Since we've supplied two objects here, the SDK automatically knows that you're supplying both a `body` and `metadata`, and can make a PUT request against `/pets/1234` for you. + +### HTTP requests +If the API you're using doesn't have any documented operation IDs, you can make requests with HTTP verbs instead: + +```js +sdk.get('/pets/{petId}', { petId: 1234 }).then(...) +``` + +The SDK supports GET, PUT, POST, DELETE, OPTIONS, HEAD, and TRACE requests. + +## How does it work? +Behind the scenes, `api` will: + +1. Download the supplied OpenAPI definition, either from a publically accessible URLs or an absolute/relative path. +2. Dereference the definition so it's easier for us to handle. +3. Hash the definition and cache it into a directory in `node_modules/.cache/api/`. +4. Process the definition and instantiate chainable methods for HTTP verbs and operation IDs the API contains via a JS [Proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy). + +On subsequent requests, `api` will look in its cache, and if the supplied definition exists there, it'll retrieve it from the cache instead of re-retrieving it again. + +## Interested in contributing? +Welcome! Have a look at [CONTRIBUTING.md](CONTRIBUTING.md). + +## FAQ +#### Does this support YAML definitions? +Yes! YAML definitions will be automatically converted to JSON before they're cached and loaded as an SDK. + +#### Does this support Swagger 2.0 definitions? +At the moment it does not. If you wish to use an API that has a Swagger 2.0 file, you'll need to first convert it to an OpenAPI 3 definition. + +#### Does this support traditional OAuth 2 flows of creating tokens? +Not yet, unfortunately. For APIs that use OAuth 2, you'll need a fully-qualified token already for `api` to make requests. + +#### Does this support APIs that use multiple forms of authentication on a single request? +Not yet! This is something we're thinking about how to handle, but it's difficult with the simple nature of the `.auth()` method as it currently does not require the user to inform the SDK of what kind of authentication scheme the token they're supplying it should match up against. + +#### Will this work in browsers? +Not sure! If you'd like to help us out in making this compatible with browsers we'd love to help you out on a pull request. + +#### Will this validate my data before it reaches the API? +Not yet! This is something we've got planned down the road. + +#### Does this support OpenAPI definitions that require authentication to download? +Not yet! The URL that you give the module must be publicy accessible. If it isn't, you can download it to your computer/server and then use the absolute path to that file instead. + +```js +const sdk = require('api')('/path/to/downloaded.json'); +``` diff --git a/package.json b/package.json index 3a667757..55b443c9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "api", "version": "1.0.0", - "description": "Generate an SDK from an OpenAPI document", + "description": "Generate an SDK from an OpenAPI definition", "scripts": { "lint": "eslint .", "pretest": "npm run lint && npm run prettier", From c175de6c4e1b0b79a2b6e4df4c35895ab6ed20a3 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 21 May 2020 12:10:51 -0700 Subject: [PATCH 18/23] test: adding an example file with example usage --- .gitignore | 1 - example.js | 13 +++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 example.js diff --git a/.gitignore b/.gitignore index a36e8379..b509c88b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ coverage/ node_modules/ -example.js diff --git a/example.js b/example.js new file mode 100644 index 00000000..278f38d3 --- /dev/null +++ b/example.js @@ -0,0 +1,13 @@ +const sdk = require('./src')('https://raw.githubusercontent.com/readmeio/oas/master/packages/examples/3.0/yaml/readme.yaml'); + +sdk + .auth('readmeApiToken') + .getChangelogs({ + perPage: 10, + page: 1 + }) + .then(res => res.json()) + .then(res => { + console.log(`there are ${res.length} changelogs`); + console.log(res[0]); + }); From 4f2184d22184a5e5efdd972dc7e6319792a3c7f4 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 21 May 2020 12:39:51 -0700 Subject: [PATCH 19/23] docs: readme fixes Co-authored-by: Kanad Gupta --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b306012d..10959804 100644 --- a/README.md +++ b/README.md @@ -47,9 +47,9 @@ For example: * API Keys: `sdk.auth('myApiKey')` ### Parameters and Payloads -When supplying parameters and/or request body payloads to an API request, you don't to explicitly define what goes where since the API definition contains all that information. All you need to do is supply either one or two objects: +When supplying parameters and/or request body payloads to an API request, you don't need to explicitly define what goes where since the API definition contains all that information. All you need to do is supply either one or two objects: -* `body`: This will contain all data required for a request body payload for a POST, PUT, etc. request. It can either be an array or an object, whichever you need to use the API operation you're using. +* `body`: This will contain all data required for a request body payload for a POST, PUT, etc. request. It can either be an array or an object — whichever you need to use the API operation you're using. * `metadata`: This is an object where all parameters (path, query, header, cookie) go. Again, don't worry about telling the SDK that a path parameter is for the path, that's all handled for you. For example, if you wanted to make a simple GET request: @@ -66,7 +66,7 @@ What about a POST request? sdk.createPets({ name: 'Buster' }).then(...) ``` -Since `name` here would coorespond on `createPets` to request body payload, this will issue a POST request against `/pets` to make a new pet named "Buster". +Since `name` here would correspond on `createPets` to request body payload, this will issue a POST request against `/pets` to make a new pet named "Buster". What about operations that require both? Well you can mix them too! From 418099a32655a445a425830d33037bedac8aa0a7 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 21 May 2020 13:06:55 -0700 Subject: [PATCH 20/23] chore: fixing a typo in a code comment --- src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index f4409410..e7fd2857 100644 --- a/src/index.js +++ b/src/index.js @@ -106,7 +106,7 @@ class Sdk { await loadFromCache(); - // If after loading the SDK this method still doesn't exist, then it's not real! + // If after loading the SDK and this method still doesn't exist, then it's not real! if (!(method in sdk)) { throw new Error(`Sorry, \`${method}\` does not appear to be a valid operation on this API.`); } From 47af70eba765914e89f4b098ccf1c3ea29d5549a Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 21 May 2020 13:14:00 -0700 Subject: [PATCH 21/23] test: cleaning up some example oas loads --- __tests__/cache.test.js | 16 +++------------- __tests__/index.test.js | 12 +++--------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/__tests__/cache.test.js b/__tests__/cache.test.js index 6e8aced0..34abca6c 100644 --- a/__tests__/cache.test.js +++ b/__tests__/cache.test.js @@ -31,25 +31,15 @@ expect.extend({ }); beforeEach(async () => { - readmeExampleJson = await fs.readFile( - join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/readme.json'), - 'utf8' - ); - - readmeExampleYaml = await fs.readFile( - join(__dirname, '../node_modules/@readme/oas-examples/3.0/yaml/readme.yaml'), - 'utf8' - ); + readmeExampleJson = await fs.readFile(require.resolve('@readme/oas-examples/3.0/json/readme.json'), 'utf8'); + readmeExampleYaml = await fs.readFile(require.resolve('@readme/oas-examples/3.0/yaml/readme.yaml'), 'utf8'); fsMock({ [examplesDir]: { 'invalid-openapi.json': JSON.stringify(pkg), 'readme.json': readmeExampleJson, 'readme.yaml': readmeExampleYaml, - 'swagger.json': await fs.readFile( - join(__dirname, '../node_modules/@readme/oas-examples/2.0/json/petstore.json'), - 'utf8' - ), + 'swagger.json': await fs.readFile(require.resolve('@readme/oas-examples/2.0/json/petstore.json'), 'utf8'), }, [findCacheDir({ name: pkg.name })]: {}, }); diff --git a/__tests__/index.test.js b/__tests__/index.test.js index b1978bc5..13c6cd61 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -21,17 +21,11 @@ beforeEach(async () => { fsMock({ [examplesDir]: { 'petstore.json': await fs.readFile( - join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/petstore-expanded.json'), - 'utf8' - ), - 'readme.json': await fs.readFile( - join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/readme.json'), - 'utf8' - ), - 'uspto.json': await fs.readFile( - join(__dirname, '../node_modules/@readme/oas-examples/3.0/json/uspto.json'), + require.resolve('@readme/oas-examples/3.0/json/petstore-expanded.json'), 'utf8' ), + 'readme.json': await fs.readFile(require.resolve('@readme/oas-examples/3.0/json/readme.json'), 'utf8'), + 'uspto.json': await fs.readFile(require.resolve('@readme/oas-examples/3.0/json/uspto.json'), 'utf8'), }, [findCacheDir({ name: pkg.name })]: {}, }); From 1993a460b4b82d9d34ae826185d85ff7582e9959 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 21 May 2020 13:29:25 -0700 Subject: [PATCH 22/23] docs: dropping the extension on the license file --- LICENSE.md => LICENSE | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSE.md => LICENSE (100%) diff --git a/LICENSE.md b/LICENSE similarity index 100% rename from LICENSE.md rename to LICENSE From 03d73660b104268e67acb4d97f2bd023781040b0 Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Thu, 21 May 2020 15:02:21 -0700 Subject: [PATCH 23/23] test: some unit test yakshaving --- __tests__/cache.test.js | 27 +++++++++++++++++----- __tests__/index.test.js | 51 +++++++++++------------------------------ src/cache.js | 6 ++--- 3 files changed, 38 insertions(+), 46 deletions(-) diff --git a/__tests__/cache.test.js b/__tests__/cache.test.js index 34abca6c..57248570 100644 --- a/__tests__/cache.test.js +++ b/__tests__/cache.test.js @@ -1,4 +1,3 @@ -/* eslint-disable jest-formatting/padding-around-test-blocks */ const nock = require('nock'); const fsMock = require('mock-fs'); const findCacheDir = require('find-cache-dir'); @@ -50,9 +49,25 @@ afterEach(() => { }); describe('#load', () => { - it.todo('should be able to load a url'); - it.todo('should be able to load a file'); - it.todo('should throw an error if neither a url or file are detected'); + it('should return a raw object if a JSON object was initially supplied', async () => { + const obj = JSON.parse(readmeExampleJson); + + await new Cache(obj).load().then(res => { + expect(res).toStrictEqual(obj); + }); + }); + + it('should throw an error when a non-HTTP(S) url is supplied', () => { + return expect(new Cache('htt://example.com/openapi.json').load()).rejects.toThrow( + 'Only HTTP(S) protocols are supported' + ); + }); + + it('should throw an error if neither a url or file are detected', async () => { + return expect(new Cache('/this/is/not/a/real/path.json').load()).rejects.toThrow( + /supply a URL or a path on your filesystem/ + ); + }); }); describe('#saveUrl()', () => { @@ -133,13 +148,13 @@ describe('#saveFile()', () => { describe('#save()', () => { it('should error if definition is a swagger file', () => { return expect(new Cache(join(examplesDir, 'swagger.json')).saveFile()).rejects.toThrow( - 'Sorry, this module only supports OpenAPI documents.' + 'Sorry, this module only supports OpenAPI definitions.' ); }); it('should error if definition is not a valid openapi file', () => { return expect(new Cache(join(examplesDir, 'invalid-openapi.json')).saveFile()).rejects.toThrow( - "Sorry, it doesn't look like that is a valid OpenAPI document" + "Sorry, that doesn't look like a valid OpenAPI definition." ); }); diff --git a/__tests__/index.test.js b/__tests__/index.test.js index 13c6cd61..fe52dded 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -1,4 +1,3 @@ -/* eslint-disable jest-formatting/padding-around-test-blocks */ const nock = require('nock'); const { join } = require('path'); const findCacheDir = require('find-cache-dir'); @@ -48,6 +47,7 @@ describe('#preloading', () => { it('should proxy an sdk for the first time', async () => { const mock = nock('https://developer.uspto.gov/ds-api').get('/').reply(200); + const mock2 = nock('https://developer.uspto.gov/ds-api').get('/two').reply(200); // Asserting that we have not previously loaded this API. expect(new Cache(uspto).isCached()).toBe(false); @@ -78,19 +78,14 @@ describe('#preloading', () => { 'list-searchable-fields', 'perform-search', ]); - }); - - it.todo('should error if passing in swagger 2'); - it.todo('should error if oas file is not valid'); - it.todo('should default to swagger.json/openapi.json'); - it.todo('should fetch files over http'); - it.todo('should fetch files from disk'); - it.todo('should work for yaml'); - it.todo('should work for json'); - it.todo('should deref before caching'); + // Calling the same method again should also work as expected. + await sdk.get('/two').then(() => { + mock2.done(); + }); + }); - it('should work when supplied a JSON OAS object', () => { + it('should support supplying a raw JSON OAS object', () => { const sdk = api(createOas()); expect(typeof sdk.get).toBe('function'); }); @@ -127,8 +122,6 @@ describe('#accessors', () => { }); it.todo('should allow operationId to be the same as a http method'); - it.todo('should allow namespaced operationIds'); // sdk.name.space() - it.todo('should suggest a similar sounding operation name'); it('should error if an operationId does not exist', () => { return expect(petstoreSdk.findPetz()).rejects.toThrow(/does not appear to be a valid operation/); @@ -145,7 +138,9 @@ describe('#accessors', () => { }).not.toThrow(); }); - it.todo('should error if method and path does not exist'); + it('should error if method does not exist', () => { + return expect(petstoreSdk.fetch('/pets')).rejects.toThrow(/does not appear to be a valid operation/); + }); }); }); @@ -153,12 +148,7 @@ describe('#fetch', () => { const petId = 123; describe('operationId', () => { - it.todo('should pass through path/body/other params'); - it.todo('should pass through query params'); - it.todo('should pass through header params'); - it.todo('should pass through auth params'); - - it('should pass through path params for operationId', () => { + it('should pass through parameters for operationId', () => { const response = { id: petId, name: 'Buster', @@ -188,7 +178,7 @@ describe('#fetch', () => { }); }); - it('should pass through path params and body for operationId', () => { + it('should pass through parameters and body for operationId', () => { const slug = 'new-release'; const body = { title: 'revised title', @@ -205,11 +195,6 @@ describe('#fetch', () => { }); describe('method + path', () => { - it.todo('should pass through path/body/other params'); - it.todo('should pass through query params'); - it.todo('should pass through header params'); - it.todo('should pass through auth params'); - it('should pass through body for method + path', () => { const body = { name: 'Buster' }; @@ -234,7 +219,7 @@ describe('#fetch', () => { }); }); - it('should pass through path params for method + path', () => { + it('should pass through parameters for method + path', () => { const slug = 'new-release'; const mock = nock('https://dash.readme.io/api/v1').put(`/changelogs/${slug}`).reply(200); return readmeSdk.put('/changelogs/{slug}', { slug }).then(res => { @@ -244,7 +229,7 @@ describe('#fetch', () => { }); }); - it('should pass through path params and body params for method + path', () => { + it('should pass through parameters and body for method + path', () => { const slug = 'new-release'; const body = { title: 'revised title', @@ -273,12 +258,4 @@ describe('#fetch', () => { }); }); }); - - describe('validation', () => { - it.todo('should validate body based on JSON Schema'); - it.todo('should validate path params'); - it.todo('should validate query params'); - it.todo('should validate header params'); - it.todo('should validate auth params'); - }); }); diff --git a/src/cache.js b/src/cache.js index 973768f8..ddcf881f 100644 --- a/src/cache.js +++ b/src/cache.js @@ -79,7 +79,7 @@ class SdkCache { } catch (err) { if (!fs.existsSync(this.uri)) { throw new Error( - `Sorry, we were unable to load that OpenAPI document. Please either supply a URL or a path on your filesystem.` + `Sorry, we were unable to load that OpenAPI definition. Please either supply a URL or a path on your filesystem.` ); } @@ -91,7 +91,7 @@ class SdkCache { const self = this; if (json.swagger) { - throw new Error('Sorry, this module only supports OpenAPI documents.'); + throw new Error('Sorry, this module only supports OpenAPI definitions.'); } return new Promise(resolve => { @@ -100,7 +100,7 @@ class SdkCache { .then(res => { return SwaggerParser.validate(res).catch(err => { if (/is not a valid openapi api definition/i.test(err.message)) { - throw new Error("Sorry, it doesn't look like that is a valid OpenAPI document."); + throw new Error("Sorry, that doesn't look like a valid OpenAPI definition."); } throw err;

l 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