From 03de4a780c3f94a6279310d9d7898d76fc6c997d Mon Sep 17 00:00:00 2001 From: ealush Date: Sun, 22 Dec 2019 00:59:51 +0200 Subject: [PATCH] Hello, World. --- .eslintignore | 6 + .eslintrc | 49 + .github/PULL_REQUEST_TEMPLATE.md | 21 + .gitignore | 13 + .npmignore | 14 + .nvmrc | 1 + .travis.yml | 42 + CHANGELOG.md | 5 + LICENSE | 22 + README.md | 63 + config/babel-register.js | 3 + config/babel.config.js | 21 + config/jest/jest.config.js | 192 + config/jest/jest.setup.js | 19 + config/rollup.js | 46 + dist/vest.js | 1136 ++++ dist/vest.js.map | 1 + dist/vest.min.js | 2 + dist/vest.min.js.map | 1 + docs/.nojekyll | 0 docs/README.md | 63 + docs/_assets/favicon.ico | Bin 0 -> 1086 bytes docs/_assets/logo.png | Bin 0 -> 2724 bytes docs/_assets/stylesheet.css | 47 + docs/_sidebar.md | 10 + docs/draft.md | 26 + docs/enforce.md | 921 +++ docs/enforce.md.bak | 60 + docs/exclusion.md | 45 + docs/getting_started.md | 50 + docs/index.html | 31 + docs/result.md | 139 + docs/test.md | 90 + docs/warn.md | 76 + package.json | 51 + scripts/constants.js | 16 + scripts/create_release.js | 51 + scripts/determine_change_level.js | 20 + scripts/get_diff.js | 35 + scripts/get_next_version.js | 9 + scripts/handle_changes.sh | 13 + scripts/prep_docs.js | 10 + scripts/prepare_next.sh | 3 + scripts/push_tag_to_master.sh | 32 + scripts/update_changelog.js | 53 + src/__snapshots__/spec.js.snap | 141 + src/constants.js | 4 + src/core/Context/index.js | 34 + src/core/Context/spec.js | 36 + .../suiteResult/__snapshots__/spec.js.snap | 180 + src/core/suiteResult/index.js | 324 ++ src/core/suiteResult/spec.js | 322 ++ src/core/test/index.js | 126 + .../lib/TestObject/__snapshots__/spec.js.snap | 62 + src/core/test/lib/TestObject/index.js | 50 + src/core/test/lib/TestObject/spec.js | 79 + src/core/test/lib/index.js | 1 + src/core/test/spec.js | 66 + src/core/validate/__snapshots__/spec.js.snap | 23 + src/core/validate/constants.js | 4 + src/core/validate/index.js | 35 + src/core/validate/spec.js | 79 + src/hooks/constants.js | 4 + src/hooks/draft/index.js | 18 + src/hooks/draft/spec.js | 74 + src/hooks/exclusive/constants.js | 10 + src/hooks/exclusive/index.js | 73 + src/hooks/exclusive/spec.js | 130 + src/hooks/index.js | 3 + src/hooks/warn/constants.js | 4 + src/hooks/warn/index.js | 24 + src/hooks/warn/spec.js | 61 + src/index.js | 20 + src/lib/globalObject/index.js | 6 + src/lib/index.js | 3 + src/lib/singleton/constants.js | 9 + src/lib/singleton/index.js | 48 + src/lib/singleton/spec.js | 115 + src/lib/throwError/index.js | 10 + src/lib/throwError/spec.js | 22 + src/spec.js | 114 + yarn.lock | 4958 +++++++++++++++++ 82 files changed, 10780 insertions(+) create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 .nvmrc create mode 100644 .travis.yml create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 config/babel-register.js create mode 100644 config/babel.config.js create mode 100644 config/jest/jest.config.js create mode 100644 config/jest/jest.setup.js create mode 100644 config/rollup.js create mode 100644 dist/vest.js create mode 100644 dist/vest.js.map create mode 100644 dist/vest.min.js create mode 100644 dist/vest.min.js.map create mode 100644 docs/.nojekyll create mode 100644 docs/README.md create mode 100644 docs/_assets/favicon.ico create mode 100644 docs/_assets/logo.png create mode 100644 docs/_assets/stylesheet.css create mode 100644 docs/_sidebar.md create mode 100644 docs/draft.md create mode 100644 docs/enforce.md create mode 100644 docs/enforce.md.bak create mode 100644 docs/exclusion.md create mode 100644 docs/getting_started.md create mode 100644 docs/index.html create mode 100644 docs/result.md create mode 100644 docs/test.md create mode 100644 docs/warn.md create mode 100644 package.json create mode 100644 scripts/constants.js create mode 100644 scripts/create_release.js create mode 100644 scripts/determine_change_level.js create mode 100644 scripts/get_diff.js create mode 100644 scripts/get_next_version.js create mode 100644 scripts/handle_changes.sh create mode 100644 scripts/prep_docs.js create mode 100755 scripts/prepare_next.sh create mode 100755 scripts/push_tag_to_master.sh create mode 100644 scripts/update_changelog.js create mode 100644 src/__snapshots__/spec.js.snap create mode 100644 src/constants.js create mode 100644 src/core/Context/index.js create mode 100644 src/core/Context/spec.js create mode 100644 src/core/suiteResult/__snapshots__/spec.js.snap create mode 100644 src/core/suiteResult/index.js create mode 100644 src/core/suiteResult/spec.js create mode 100644 src/core/test/index.js create mode 100644 src/core/test/lib/TestObject/__snapshots__/spec.js.snap create mode 100644 src/core/test/lib/TestObject/index.js create mode 100644 src/core/test/lib/TestObject/spec.js create mode 100644 src/core/test/lib/index.js create mode 100644 src/core/test/spec.js create mode 100644 src/core/validate/__snapshots__/spec.js.snap create mode 100644 src/core/validate/constants.js create mode 100644 src/core/validate/index.js create mode 100644 src/core/validate/spec.js create mode 100644 src/hooks/constants.js create mode 100644 src/hooks/draft/index.js create mode 100644 src/hooks/draft/spec.js create mode 100644 src/hooks/exclusive/constants.js create mode 100644 src/hooks/exclusive/index.js create mode 100644 src/hooks/exclusive/spec.js create mode 100644 src/hooks/index.js create mode 100644 src/hooks/warn/constants.js create mode 100644 src/hooks/warn/index.js create mode 100644 src/hooks/warn/spec.js create mode 100644 src/index.js create mode 100644 src/lib/globalObject/index.js create mode 100644 src/lib/index.js create mode 100644 src/lib/singleton/constants.js create mode 100644 src/lib/singleton/index.js create mode 100644 src/lib/singleton/spec.js create mode 100644 src/lib/throwError/index.js create mode 100644 src/lib/throwError/spec.js create mode 100644 src/spec.js create mode 100644 yarn.lock diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..489fa4f30 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,6 @@ +./dist/* +./dev/* +./node_modules/* +./flow-typed/* +./docs +webpack.config.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..84a2b4bb0 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,49 @@ +{ + "plugins": ["jest"], + "env": { + "es6": true, + "jest": true, + "node": true + }, + "globals": { + "VEST_VERSION": true + }, + "extends": [ + "eslint:recommended", + "plugin:import/errors", + "plugin:import/warnings" + ], + "parserOptions": { + "ecmaVersion": 10, + "sourceType": "module", + "ecmaFeatures": { + "impliedStrict": true + } + }, + "rules": { + "indent": [ + "error", + 4 + ], + "no-console": 2, + "no-multi-spaces": 1, + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ], + "eqeqeq": [ + "error", + "always" + ], + "no-trailing-spaces": ["error", { "ignoreComments": true }], + "no-implicit-globals": 2, + "import/no-self-import": 2, + "import/no-useless-path-segments": 2, + "import/order": 2, + "import/newline-after-import": 2 + } +} diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..73381e1b2 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,21 @@ + + +| Q | A +| ---------------- | --- +| Bug fix? | ✔/✖ +| New feature? | ✔/✖ +| Breaking change? | ✔/✖ +| Deprecations? | ✔/✖ +| Documentation? | ✔/✖ +| Tests added? | ✔/✖ +| Fixed issues | comma-separated list of issues fixed by the pull request, where applicable + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..4efbe2d12 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +node_modules +.vscode +.sass-cache +dev_docpress +_docpress +dev +version.json +version.txt +.version +documentation/MAIN.md +documentation/assets/**/*.css +.DS_Store +*.log diff --git a/.npmignore b/.npmignore new file mode 100644 index 000000000..74bd0dd83 --- /dev/null +++ b/.npmignore @@ -0,0 +1,14 @@ +.vscode +node_modules +spec +dev +.babelrc +.eslintignore +.eslintrc +.travis.yml +webpack.config.js +yarn.lock +_docpress +_docs +flow-typed +playground \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..1a2f5bd20 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +lts/* \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..b50624d69 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,42 @@ +language: node_js +cache: npm + +before_script: +- npm run build +- npm run eslint + +after_success: +- chmod +x ./scripts/handle_changes.sh +- source ./scripts/handle_changes.sh +- node ./scripts/prep_docs.js +- chmod +x ./scripts/push_tag_to_master.sh +- if [ "$TRAVIS_BRANCH" = "release" ]; then ./scripts/push_tag_to_master.sh; fi +- chmod +x ./scripts/prepare_next.sh +- if [ "$TRAVIS_BRANCH" != "master" ]; then ./scripts/prepare_next.sh; fi + +deploy: + - provider: npm + email: $EMAIL_ADDRESS + skip_cleanup: true + api_key: $NPM_TOKEN + on: + repo: $TRAVIS_REPO_SLUG + branch: master + - provider: npm + email: $EMAIL_ADDRESS + skip_cleanup: true + api_key: $NPM_TOKEN + tag: "next" + on: + all_branches: true + condition: $TRAVIS_BRANCH = "next" + repo: $TRAVIS_REPO_SLUG + - provider: npm + email: $EMAIL_ADDRESS + skip_cleanup: true + api_key: $NPM_TOKEN + tag: "DEVELOPMENT" + on: + all_branches: true + condition: $TRAVIS_BRANCH != "next" && $TRAVIS_BRANCH != "master" && $TRAVIS_BRANCH != "release" + repo: $TRAVIS_REPO_SLUG diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..2fe9f08e0 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..548641fa1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2019 ealush +Copyright (c) 2017 Fiverr + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 000000000..fbfbcb199 --- /dev/null +++ b/README.md @@ -0,0 +1,63 @@ +![Vest](https://cdn.jsdelivr.net/gh/ealush/vest/docs/_assets/logo.png "Vest") + +# Vest - Validation Testing + +[![npm version](https://badge.fury.io/js/vest.svg)](https://badge.fury.io/js/vest) [![Build Status](https://travis-ci.org/ealush/vest.svg?branch=master)](https://travis-ci.org/ealush/vest) + +- [Documentation homepage](https://ealush.github.io/vest) +- **Try vest live** + - [Vanilla JS example](https://stackblitz.com/edit/vest-vanilla-support-example) + - [ReactJS example](https://stackblitz.com/edit/vest-react-support-example) + +## What is Vest? +Vest is a validations library for JS apps that derives its syntax from modern JS frameworks such as Mocha or Jest. It is easy to learn due to its use of already common declerative patterns. + +The idea behind Vest is that your validatios can be described as a 'spec' or a contract that reflects your form or feature structure. Your validations run in production, and they are framework agnostic - meaning Vest works well with React, Angular, Vue, or even without a framework at all. + +**Example code:** + +```js +// validation.js +import { validate, test, enforce } from 'vest'; + +const validation = (data) => validate('NewUserForm', () => { + + test('username', 'Must be at least 3 chars', () => { + enforce(data.username).longerThanOrEquals(3); + }); + + test('email', 'Is not a valid email address', () => { + enforce(data.email) + .isNotEmpty() + .matches(/[^@]+@[^\.]+\..+/g); + }); +}); + +export default validation; +``` + +```js +// myFeature.js +import validation from './validation.js'; + +const res = validation({ + username: 'example', + email: 'email@example.com' +}); + +res.hasErrors() // returns whether the form has errors +res.hasErrors('username') // returns whether the 'username' field has errors +res.getErrors() // returns an object with an array of errors per field +res.getErrors('username') // returns an array of errors for the `username` field +``` + +## Why Vest? +- Vest is really easy to learn, and you can easily take your existing knowledge of unit tests and transfer it to validations. +- Vest takes into account user interaction and warn only validations. +- Your validations are structured, making it very easy to read and write. All validation files look the same. +- Your validation logic is separate from your feature logic, preventing the spaghetti code that's usually involved with writing validations. +- Validation logic is easy to share and reuse across features. +- If your backend is node, you can use the same Vest modules for both client side and server side validations. + + +__Vest is a continuation of [Passable](https://github.com/fiverr/passable) by Fiverr.__ diff --git a/config/babel-register.js b/config/babel-register.js new file mode 100644 index 000000000..9234401a6 --- /dev/null +++ b/config/babel-register.js @@ -0,0 +1,3 @@ +require('@babel/register')({ + configFile: './config/babel.config.js' +}); diff --git a/config/babel.config.js b/config/babel.config.js new file mode 100644 index 000000000..f60e366af --- /dev/null +++ b/config/babel.config.js @@ -0,0 +1,21 @@ +module.exports = (api) => { + + if (api) { + api.cache(true); + } + + const presets = [ + '@babel/preset-env' + ]; + + const plugins = [ + 'babel-plugin-add-module-exports', + '@babel/plugin-transform-object-assign' + ]; + + return { + include: [/src/, /node_modules/], + presets, + plugins + }; +}; diff --git a/config/jest/jest.config.js b/config/jest/jest.config.js new file mode 100644 index 000000000..76e72e205 --- /dev/null +++ b/config/jest/jest.config.js @@ -0,0 +1,192 @@ +// const { createTransformer } = require('babel-jest'); +// const babelConfig = require('../../babelConfig'); + +// module.exports = createTransformer(babelConfig()); + +// For a detailed explanation regarding each configuration property, visit: +// https://jestjs.io/docs/en/configuration.html + +module.exports = { + // All imported modules in your tests should be mocked automatically + // automock: false, + + // Stop running tests after `n` failures + // bail: 0, + + // Respect "browser" field in package.json when resolving modules + // browser: false, + + // The directory where Jest should store its cached dependency information + // cacheDirectory: "/private/var/folders/j0/80v88hxn75513m7pzztvr8kc0000gp/T/jest_dy", + + // Automatically clear mock calls and instances between every test + clearMocks: true, + + // Indicates whether the coverage information should be collected while executing the test + // collectCoverage: false, + + // An array of glob patterns indicating a set of files for which coverage information should be collected + // collectCoverageFrom: null, + + // The directory where Jest should output its coverage files + // coverageDirectory: null, + + // An array of regexp pattern strings used to skip coverage collection + // coveragePathIgnorePatterns: [ + // "/node_modules/" + // ], + + // A list of reporter names that Jest uses when writing coverage reports + // coverageReporters: [ + // "json", + // "text", + // "lcov", + // "clover" + // ], + + // An object that configures minimum threshold enforcement for coverage results + // coverageThreshold: null, + + // A path to a custom dependency extractor + // dependencyExtractor: null, + + // Make calling deprecated APIs throw helpful error messages + // errorOnDeprecated: false, + + // Force coverage collection from ignored files using an array of glob patterns + // forceCoverageMatch: [], + + // A path to a module which exports an async function that is triggered once before all test suites + // globalSetup: null, + + // A path to a module which exports an async function that is triggered once after all test suites + // globalTeardown: null, + + // A set of global variables that need to be available in all test environments + // globals: {}, + + // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. + // maxWorkers: "50%", + + // An array of directory names to be searched recursively up from the requiring module's location + // moduleDirectories: [ + // "node_modules" + // ], + + // An array of file extensions your modules use + // moduleFileExtensions: [ + // "js", + // "json", + // "jsx", + // "ts", + // "tsx", + // "node" + // ], + + // A map from regular expressions to module names that allow to stub out resources with a single module + // moduleNameMapper: {}, + + // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + // modulePathIgnorePatterns: [], + + // Activates notifications for test results + // notify: false, + + // An enum that specifies notification mode. Requires { notify: true } + // notifyMode: "failure-change", + + // A preset that is used as a base for Jest's configuration + // preset: null, + + // Run tests from one or more projects + // projects: null, + + // Use this configuration option to add custom reporters to Jest + // reporters: undefined, + + // Automatically reset mock state between every test + // resetMocks: false, + + // Reset the module registry before running each individual test + // resetModules: false, + + // A path to a custom resolver + // resolver: null, + + // Automatically restore mock state between every test + // restoreMocks: false, + + // The root directory that Jest should scan for tests and modules within + rootDir: '../../', + + // A list of paths to directories that Jest should use to search for files in + roots: [ + '', + ], + + // Allows you to use a custom runner instead of Jest's default test runner + // runner: "jest-runner", + + // The paths to modules that run some code to configure or set up the testing environment before each test + setupFiles: ['./config/jest/jest.setup.js'], + + // A list of paths to modules that run some code to configure or set up the testing framework before each test + // setupFilesAfterEnv: [], + + // A list of paths to snapshot serializer modules Jest should use for snapshot testing + // snapshotSerializers: [], + + // The test environment that will be used for testing + testEnvironment: 'node', + + // Options that will be passed to the testEnvironment + // testEnvironmentOptions: {}, + + // Adds a location field to test results + // testLocationInResults: false, + + // The glob patterns Jest uses to detect test files + testMatch: [ + '**/*/spec.js' + ], + + // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + // testPathIgnorePatterns: [ + // "/node_modules/" + // ], + + // The regexp pattern or array of patterns that Jest uses to detect test files + // testRegex: [], + + // This option allows the use of a custom results processor + // testResultsProcessor: null, + + // This option allows use of a custom test runner + // testRunner: "jasmine2", + + // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href + // testURL: "http://localhost", + + // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" + // timers: "real", + + // A map from regular expressions to paths to transformers + transform: {'\\.js$': ['babel-jest', {configFile: './config/babel.config.js'}]}, + + // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + // transformIgnorePatterns: [ + // "/node_modules/" + // ], + + // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + // unmockedModulePathPatterns: undefined, + + // Indicates whether each individual test should be reported during the run + // verbose: null, + + // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + // watchPathIgnorePatterns: [], + + // Whether to use watchman for file crawling + // watchman: true, +}; diff --git a/config/jest/jest.setup.js b/config/jest/jest.setup.js new file mode 100644 index 000000000..fffc87742 --- /dev/null +++ b/config/jest/jest.setup.js @@ -0,0 +1,19 @@ +global.vestDistVersions = []; + +const isWatchMode = (process.argv || []).some((arg) => ( + arg && arg.includes('--watch') +)); + +if (!isWatchMode) { + global.vestDistVersions.push( + require('../../dist/vest.js'), + require('../../dist/vest.min.js'), + ); +} + +const { version } = require('../../package.json'); + +global.VEST_VERSION = version; + +// Registers global instance +require('../../src'); diff --git a/config/rollup.js b/config/rollup.js new file mode 100644 index 000000000..963ffa7fc --- /dev/null +++ b/config/rollup.js @@ -0,0 +1,46 @@ +import commonjs from 'rollup-plugin-commonjs'; +import resolve from 'rollup-plugin-node-resolve'; +import babel from 'rollup-plugin-babel'; +import replace from 'rollup-plugin-replace'; +import { terser } from 'rollup-plugin-terser'; +const { version } = require('../package.json'); + +const DEFAULT_FORMAT = 'umd'; +const LIBRARY_NAME = 'vest'; + +const PLUGINS = [ + resolve(), + commonjs({ + include: /node_modules\/(anyone|n4s)/ + }), + babel({ + babelrc: false, + ...require('./babel.config')() + }), + replace({ + VEST_VERSION: JSON.stringify(version) + }) +]; + +const buildConfig = ({ format = DEFAULT_FORMAT, min = false } = {}) => ({ + input: 'src/index.js', + output: { + file: [ + `dist/${LIBRARY_NAME}`, + min && 'min', + format !== DEFAULT_FORMAT && format, + 'js' + ].filter(Boolean).join('.'), + name: LIBRARY_NAME, + format + }, + plugins: min + ? [ ...PLUGINS, terser() ] + : PLUGINS + +}); + +export default [ + buildConfig({ min: true }), + buildConfig() +]; diff --git a/dist/vest.js b/dist/vest.js new file mode 100644 index 000000000..b39b04d46 --- /dev/null +++ b/dist/vest.js @@ -0,0 +1,1136 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.vest = factory()); +}(this, (function () { 'use strict'; + + function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); + } + + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } + } + + function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + } + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + var enforce_min = createCommonjsModule(function (module, exports) { + !function (n, e) { + module.exports = e() ; + }(commonjsGlobal, function () { + + function n(e) { + return (n = "function" == typeof Symbol && "symbol" == _typeof(Symbol.iterator) ? function (n) { + return _typeof(n); + } : function (n) { + return n && "function" == typeof Symbol && n.constructor === Symbol && n !== Symbol.prototype ? "symbol" : _typeof(n); + })(e); + } + + function e(n, e, t) { + return e in n ? Object.defineProperty(n, e, { + value: t, + enumerable: !0, + configurable: !0, + writable: !0 + }) : n[e] = t, n; + } + + function t(n, e) { + var t = Object.keys(n); + + if (Object.getOwnPropertySymbols) { + var r = Object.getOwnPropertySymbols(n); + e && (r = r.filter(function (e) { + return Object.getOwnPropertyDescriptor(n, e).enumerable; + })), t.push.apply(t, r); + } + + return t; + } + + function r(n) { + for (var r = 1; r < arguments.length; r++) { + var o = null != arguments[r] ? arguments[r] : {}; + r % 2 ? t(Object(o), !0).forEach(function (t) { + e(n, t, o[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(n, Object.getOwnPropertyDescriptors(o)) : t(Object(o)).forEach(function (e) { + Object.defineProperty(n, e, Object.getOwnPropertyDescriptor(o, e)); + }); + } + + return n; + } + + var o = function o(n, e) { + return Object.prototype.hasOwnProperty.call(n, e) && "function" == typeof n[e]; + }, + u = Function("return this")(), + i = function i() { + return "function" == typeof u.Proxy; + }; + + function a(n) { + return Boolean(Array.isArray(n)); + } + + function c(n) { + return Boolean("number" == typeof n); + } + + function f(n) { + return Boolean("string" == typeof n); + } + + function s(n, e) { + return e instanceof RegExp ? e.test(n) : "string" == typeof e && new RegExp(e).test(n); + } + + function l(e, t) { + return Array.isArray(t) && ["string", "number", "boolean"].includes(n(e)) ? t.includes(e) : "string" == typeof t && "string" == typeof e && t.includes(e); + } + + function y(n, e) { + return n === e; + } + + function p(n) { + var e = !isNaN(parseFloat(n)) && !isNaN(Number(n)) && isFinite(n); + return Boolean(e); + } + + function g(n, e) { + return p(n) && p(e) && Number(n) === Number(e); + } + + function b(e) { + return !e || (p(e) ? 0 === e : Object.prototype.hasOwnProperty.call(e, "length") ? 0 === e.length : "object" !== n(e) || 0 === Object.keys(e).length); + } + + function m(n, e) { + return p(n) && p(e) && Number(n) > Number(e); + } + + function v(n, e) { + return p(n) && p(e) && Number(n) >= Number(e); + } + + function h(n, e) { + return p(n) && p(e) && Number(n) < Number(e); + } + + function O(n, e) { + return p(n) && p(e) && Number(n) <= Number(e); + } + + function N(n, e) { + return n.length === e; + } + + a.negativeForm = "isNotArray", c.negativeForm = "isNotNumber", f.negativeForm = "isNotString", s.negativeForm = "notMatches", l.negativeForm = "notInside", y.negativeForm = "notEquals", p.negativeForm = "isNotNumeric", g.negativeForm = "numberNotEquals", b.negativeForm = "isNotEmpty", m.alias = "gt", v.alias = "gte", h.alias = "lt", O.alias = "lte", N.negativeForm = "lengthNotEquals"; + + function d(n) { + return !!n; + } + + d.negativeForm = "isFalsy"; + + var j = function (n) { + var e = function e(_e) { + var t = n[_e].negativeForm, + r = n[_e].alias; + t && (n[t] = function () { + return !n[_e].apply(n, arguments); + }), r && (n[r] = n[_e]); + }; + + for (var t in n) { + e(t); + } + + return n; + }({ + isArray: a, + isNumber: c, + isString: f, + matches: s, + inside: l, + equals: y, + numberEquals: g, + isNumeric: p, + isEmpty: b, + greaterThan: m, + greaterThanOrEquals: v, + lessThan: h, + lessThanOrEquals: O, + longerThan: function longerThan(n, e) { + return n.length > e; + }, + longerThanOrEquals: function longerThanOrEquals(n, e) { + return n.length >= e; + }, + shorterThan: function shorterThan(n, e) { + return n.length < e; + }, + shorterThanOrEquals: function shorterThanOrEquals(n, e) { + return n.length <= e; + }, + lengthEquals: N, + isOdd: function isOdd(n) { + return !!p(n) && n % 2 != 0; + }, + isEven: function isEven(n) { + return !!p(n) && n % 2 == 0; + }, + isTruthy: d + }); + + function E(e, t) { + if ("function" == typeof e) { + for (var r = arguments.length, o = new Array(r > 2 ? r - 2 : 0), u = 2; u < r; u++) { + o[u - 2] = arguments[u]; + } + + if (!0 !== e.apply(void 0, [t].concat(o))) throw new Error("[Enforce]: invalid ".concat(n(t), " value")); + } + } + + function w() { + var n = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, + t = r({}, j, {}, n); + if (i()) return function (n) { + var e = new Proxy(t, { + get: function get(t, r) { + if (o(t, r)) return function () { + for (var o = arguments.length, u = new Array(o), i = 0; i < o; i++) { + u[i] = arguments[i]; + } + + return E.apply(void 0, [t[r], n].concat(u)), e; + }; + } + }); + return e; + }; + var u = Object.keys(t); + return function (n) { + return u.reduce(function (u, i) { + return _extends(u, r({}, o(t, i) && e({}, i, function () { + for (var e = arguments.length, r = new Array(e), o = 0; o < e; o++) { + r[o] = arguments[o]; + } + + return E.apply(void 0, [t[i], n].concat(r)), u; + }))); + }, {}); + }; + } + + var F = new w(); + return F.Enforce = w, F; + }); + }); + + var any = createCommonjsModule(function (module, exports) { + (function (global, factory) { + module.exports = factory() ; + })(commonjsGlobal, function () { + /** + * Accepts a value or a function, and coerces it into a boolean value + * @param {*|Function} [arg] Any expression or value + * @return {Boolean} + */ + + var run = function run(arg) { + if (typeof arg === 'function') { + try { + var output = arg(); + return output != false && Boolean(output); // eslint-disable-line + } catch (err) { + return false; + } + } + + return arg != false && Boolean(arg); // eslint-disable-line + }; + /** + * Checks that at least one passed argument evaluates to a truthy value. + * @param {[]*} [args] Any amount of values or expressions. + * @returns {Boolean} + */ + + + var any = function any() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return args.some(run); + }; + + return any; + }); + }); + + /** + * @type {Object} Reference to global object. + */ + var globalObject = Function('return this')(); + + /** + * Throws a timed out error. + * @param {String} message Error message to display. + * @param {Error} [type] Alternative Error type. + */ + var throwError = function throwError(message) { + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Error; + return setTimeout(function () { + throw new type("[Vest]: ".concat(message)); + }); + }; + + /** + * @type {String} Vest's major version. + */ + var VEST_MAJOR = "1.0.0".split('.')[0]; + /** + * @type {Symbol} Used to store a global instance of Vest. + */ + + var SYMBOL_VEST = Symbol["for"]("VEST#".concat(VEST_MAJOR)); + + /** + * Throws an error when multiple versions of Vest are detected on the same runtime. + * @param {String[]} versions List of detected Vest versions. + */ + + var throwMultipleVestError = function throwMultipleVestError() { + for (var _len = arguments.length, versions = new Array(_len), _key = 0; _key < _len; _key++) { + versions[_key] = arguments[_key]; + } + + throwError("Multiple versions of Vest detected: (".concat(versions.join(), ").\n Most features should work regularly, but for optimal feature compatibility, you should have all running instances use the same version.")); + }; + /** + * Registers current Vest instance on global object. + * @param {Object} vest Reference to Vest. + * @return {Function} Global Vest reference. + */ + + + var register = function register(vest) { + var existing = globalObject[SYMBOL_VEST]; + + if (existing) { + if (existing.VERSION !== vest.VERSION) { + throwMultipleVestError(vest.VERSION, existing.VERSION); + } + } else { + globalObject[SYMBOL_VEST] = vest; + } + + return globalObject[SYMBOL_VEST]; + }; + /** + * @returns Global Vest instance. + */ + + + var use = function use() { + return globalObject[SYMBOL_VEST]; + }; + /** + * @returns Current Vest context. + */ + + + var useContext = function useContext() { + return use().ctx; + }; + + var singleton = { + use: use, + useContext: useContext, + register: register + }; + + /** + * Creates a new context object, and assigns it as a static property on Vest's singleton. + * @param {Object} parent Parent context. + */ + + function Context(parent) { + singleton.use().ctx = this; + + _extends(this, parent); + } + /** + * Sets a testObject reference on context. + * @param {TestObject} A TestObject instance. + */ + + + Context.prototype.setCurrentTest = function (testObject) { + this.currentTest = testObject; + }; + /** + * Removes current test from context. + */ + + + Context.prototype.removeCurrentTest = function () { + delete this.currentTest; + }; + /** + * Clears stored instance from constructor function. + */ + + + Context.clear = function () { + singleton.use().ctx = null; + }; + + /** + * @type {String} Error message to display when a hook was called outside of context. + */ + var ERROR_HOOK_CALLED_OUTSIDE = 'hook called outside of a running suite.'; + + /** + * @type {String} Exclusivity group name: only. + */ + var GROUP_NAME_ONLY = 'only'; + /** + * @type {String} Exclusivity group name: skip. + */ + + var GROUP_NAME_SKIP = 'skip'; + + /** + * Adds fields to a specified group. + * @param {String} group To add the fields to. + * @param {String[]|String} item A field name or a list of field names. + */ + + var addTo = function addTo(group, item) { + var ctx = singleton.useContext(); + + if (!item) { + return; + } + + if (!ctx) { + throwError("".concat(group, " ").concat(ERROR_HOOK_CALLED_OUTSIDE)); + return; + } + + ctx.exclusive = ctx.exclusive || {}; + [].concat(item).forEach(function (fieldName) { + if (typeof fieldName === 'string') { + ctx.exclusive[group] = ctx.exclusive[group] || {}; + ctx.exclusive[group][fieldName] = true; + } + }); + }; + /** + * Adds a field or multiple fields to inclusion group. + * @param {String[]|String} item Item to be added to inclusion group. + */ + + + var only = function only(item) { + return addTo(GROUP_NAME_ONLY, item); + }; + /** + * Adds a field or multiple fields to exlusion group. + * @param {String[]|String} item Item to be added to exlusion group. + */ + + var skip = function skip(item) { + return addTo(GROUP_NAME_SKIP, item); + }; + /** + * Checks whether a certain field name is excluded by any of the exclusion groups. + * @param {String} fieldName FieldN name to test. + * @returns {Boolean} + */ + + var isExcluded = function isExcluded(fieldName) { + var ctx = singleton.useContext(); + + if (!(ctx && ctx.exclusive)) { + return false; + } + + if (ctx.exclusive[GROUP_NAME_SKIP] && ctx.exclusive[GROUP_NAME_SKIP][fieldName]) { + return true; + } + + if (ctx.exclusive[GROUP_NAME_ONLY]) { + if (ctx.exclusive[GROUP_NAME_ONLY][fieldName]) { + return false; + } + + return true; + } + + return false; + }; + + /** + * Describes a test call inside a Vest suite. + * @param {Object} ctx Parent context. + * @param {String} fieldName Name of the field being tested. + * @param {String} statement The message returned when failing. + * @param {Promise|Function} testFn The actual test callbrack or promise. + */ + function TestObject(ctx, fieldName, statement, testFn) { + _extends(this, { + ctx: ctx, + testFn: testFn, + fieldName: fieldName, + statement: statement, + isWarning: false, + failed: false + }); + } + /** + * @returns {Boolean} Current validity status of a test. + */ + + + TestObject.prototype.valueOf = function () { + return this.failed !== true; + }; + /** + * Sets a test to failed. + * @returns {TestObject} Current instance. + */ + + + TestObject.prototype.fail = function () { + this.ctx.result.markFailure({ + fieldName: this.fieldName, + statement: this.statement, + isWarning: this.isWarning + }); + this.failed = true; + return this; + }; + /** + * Sets a current test's `isWarning` to true. + * @returns {TestObject} Current instance. + */ + + + TestObject.prototype.warn = function () { + this.isWarning = true; + return this; + }; + + /** + * Runs async test. + * @param {TestObject} testObject A TestObject instance. + */ + + var runAsync = function runAsync(testObject) { + var testFn = testObject.testFn, + statement = testObject.statement, + ctx = testObject.ctx; + + var done = function done() { + return ctx.result.markAsDone(testObject); + }; + + var fail = function fail(rejectionMessage) { + testObject.statement = typeof rejectionMessage === 'string' ? rejectionMessage : statement; + testObject.fail(); + done(); + }; + + ctx.setCurrentTest(testObject); + + try { + testFn.then(done, fail); + } catch (e) { + fail(); + } + + ctx.removeCurrentTest(); + }; + /** + * Runs test callback. + * @param {TestObject} testObject TestObject instance. + * @returns {*} Result from test callback. + */ + + var runTest = function runTest(testObject) { + var result; + testObject.ctx.setCurrentTest(testObject); + + try { + result = testObject.testFn.apply(testObject); + } catch (e) { + result = false; + } + + testObject.ctx.removeCurrentTest(); + + if (result === false) { + testObject.fail(); + } + + return result; + }; + /** + * Registers test, if async - adds to pending array + * @param {TestObject} testObject A TestObject Instance. + */ + + + var register$1 = function register(testObject) { + var testFn = testObject.testFn, + ctx = testObject.ctx, + fieldName = testObject.fieldName; + var isPending = false; + var result; + + if (isExcluded(fieldName)) { + ctx.result.addToSkipped(fieldName); + return; + } + + ctx.result.markTestRun(fieldName); + + if (testFn && typeof testFn.then === 'function') { + isPending = true; + } else { + result = runTest(testObject); + } + + if (result && typeof result.then === 'function') { + isPending = true; + testObject.testFn = result; + } + + if (isPending) { + ctx.result.setPending(testObject); + } + }; + /** + * Test function used by consumer to provide their own validations. + * @param {String} fieldName Name of the field to test. + * @param {String} [statement] The message returned in case of a failure. + * @param {function} testFn The actual test callback. + * @return {TestObject} A TestObject instance. + */ + + + var test = function test(fieldName) { + var statement, testFn; + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + if (typeof args[0] === 'string') { + statement = args[0]; + testFn = args[1]; + } else if (typeof args[0] === 'function') { + testFn = args[0]; + } + + if (typeof testFn !== 'function') { + return; + } + + var testObject = new TestObject(singleton.useContext(), fieldName, statement, testFn); + register$1(testObject); + return testObject; + }; + + var suiteResult = function suiteResult(name) { + var pending = { + tests: [] + }; + var doneCallbacks = []; + var fieldCallbacks = {}; + var isAsync = false; + /** + * Adds a testObject to pending list. + * @param {Object} testObject + */ + + var setPending = function setPending(testObject) { + isAsync = true; + pending.tests.push(testObject); + }; + /** + * Clears a testObject from pending list. + * @param {Object} testObject + */ + + + var clearFromPending = function clearFromPending(testObject) { + pending.tests = pending.tests.filter(function (t) { + return t !== testObject; + }); + }; + /** + * Checks if a specified field has any remaining tests. + * @param {String} fieldName + * @returns {Boolean} + */ + + + var hasRemaining = function hasRemaining(fieldName) { + if (!pending.tests.length) { + return false; + } + + if (fieldName) { + return pending.tests.some(function (testObject) { + return testObject.fieldName === fieldName; + }); + } + + return !!pending.tests.length; + }; + /** + * Bumps test counters to indicate tests that are being performed + * @param {string} fieldName - The name of the field. + */ + + + var markTestRun = function markTestRun(fieldName) { + if (!output.tests[fieldName]) { + output.tests[fieldName] = { + testCount: 0, + errorCount: 0, + warnCount: 0 + }; + output.tested.push(fieldName); + } + + output.tests[fieldName].testCount++; + output.testCount++; + }; + /** + * Marks a test as failed. + * @param {Object} testData + * @param {String} testData.fieldName Name of field being tested. + * @param {String} [testData.statement] Failure message to display. + * @param {Boolean} [testData.isWarning] Indicates warn only test. + */ + + + var markFailure = function markFailure(_ref) { + var fieldName = _ref.fieldName, + statement = _ref.statement, + isWarning = _ref.isWarning; + + if (!output.tests[fieldName]) { + return; + } + + var severityGroup, severityCount; + + if (isWarning) { + severityGroup = 'warnings'; + severityCount = 'warnCount'; + } else { + severityGroup = 'errors'; + severityCount = 'errorCount'; + } + + output.tests[fieldName][severityGroup] = output.tests[fieldName][severityGroup] || []; + + if (statement) { + output.tests[fieldName][severityGroup].push(statement); + } + + output[severityCount]++; + output.tests[fieldName][severityCount]++; + }; + /** + * Uniquely add a field to the `skipped` list + * @param {string} fieldName - The name of the field. + */ + + + var addToSkipped = function addToSkipped(fieldName) { + !output.skipped.includes(fieldName) && output.skipped.push(fieldName); + }; + /** + * Runs callbacks of specified field, or of the whole suite. + * @param {String} [fieldName] + */ + + + var runCallbacks = function runCallbacks(fieldName) { + if (!fieldName) { + return doneCallbacks.forEach(function (cb) { + return cb(output); + }); + } + + if (Array.isArray(fieldCallbacks[fieldName])) { + return fieldCallbacks[fieldName].forEach(function (cb) { + return cb(output); + }); + } + }; + /** + * Removes a field from pending, and runs its callbacks. If all fields are done, runs all callbacks. + * @param {Object} testObject a testObject to remove from pending. + */ + + + var markAsDone = function markAsDone(testObject) { + if (output.canceled) { + return; + } + + if (testObject) { + clearFromPending(testObject); + + if (!hasRemaining(testObject.fieldName)) { + runCallbacks(testObject.fieldName); + } + } + + if (!hasRemaining()) { + runCallbacks(); + } + }; + /** + * Registers a callback to run once the suite or a specified field finished running. + * @param {String} [name] Name of the field to call back after, + * @param {Function} callback A callback to run once validation is finished. + * @returns {Object} Output object. + */ + + + var done = function done() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var length = args.length, + callback = args[length - 1], + name = args[length - 2]; + + if (typeof callback !== 'function') { + return output; + } + + if (!isAsync) { + callback(output); + return output; + } + + if (name && !hasRemaining(name)) { + callback(output); + return output; + } + + if (name) { + fieldCallbacks[name] = fieldCallbacks[name] || []; + fieldCallbacks[name].push(callback); + } else { + doneCallbacks.push(callback); + } + + return output; + }; + /** + * cancels done callbacks. They won't invoke when async operations complete + */ + + + var cancel = function cancel() { + output.canceled = true; + return output; + }; + /** + * Collects all fields that have an array of specified group in their results. + * @param {String} group Group name (warnings or errors). + * @returns {Object} Object of array per field. + */ + + + var collectFailureMessages = function collectFailureMessages(group) { + var collector = {}; + + for (var fieldName in output.tests) { + if (output.tests[fieldName] && output.tests[fieldName][group]) { + collector[fieldName] = output.tests[fieldName][group]; + } + } + + return collector; + }; + /** + * Gets all the errors of a field, or of the whole object. + * @param {string} fieldName - The name of the field. + * @return {array | object} The field's errors, or all errors. + */ + + + var getErrors = function getErrors(fieldName) { + if (!fieldName) { + return collectFailureMessages('errors'); + } + + if (output.tests[fieldName].errors) { + return output.tests[fieldName].errors; + } + + return []; + }; + /** + * Gets all the warnings of a field, or of the whole object. + * @param {string} [fieldName] - The name of the field. + * @return {array | object} The field's warnings, or all warnings. + */ + + + var getWarnings = function getWarnings(fieldName) { + if (!fieldName) { + return collectFailureMessages('warnings'); + } + + if (output.tests[fieldName].warnings) { + return output.tests[fieldName].warnings; + } + + return []; + }; + /** + * Checks if a certain field (or the whole suite) has errors. + * @param {string} [fieldName] + * @return {boolean} + */ + + + var hasErrors = function hasErrors(fieldName) { + if (!fieldName) { + return !!output.errorCount; + } + + return Boolean(output.tests[fieldName] && output.tests[fieldName].errorCount); + }; + /** + * Checks if a certain field (or the whole suite) has warnings + * @param {string} [fieldName] + * @return {boolean} + */ + + + var hasWarnings = function hasWarnings(fieldName) { + if (!fieldName) { + return !!output.warnCount; + } + + return Boolean(output.tests[fieldName] && output.tests[fieldName].warnCount); + }; + + var output = { + name: name, + errorCount: 0, + warnCount: 0, + testCount: 0, + tests: {}, + skipped: [], + tested: [] + }; + Object.defineProperties(output, { + hasErrors: { + value: hasErrors, + writable: true, + configurable: true, + enumerable: false + }, + hasWarnings: { + value: hasWarnings, + writable: true, + configurable: true, + enumerable: false + }, + getErrors: { + value: getErrors, + writable: true, + configurable: true, + enumerable: false + }, + getWarnings: { + value: getWarnings, + writable: true, + configurable: true, + enumerable: false + }, + done: { + value: done, + writable: true, + configurable: true, + enumerable: false + }, + cancel: { + value: cancel, + writable: true, + configurable: true, + enumerable: false + } + }); + return { + markTestRun: markTestRun, + markFailure: markFailure, + setPending: setPending, + addToSkipped: addToSkipped, + markAsDone: markAsDone, + pending: pending.tests, + output: output + }; + }; + + /** + * @type {String} + */ + var SUITE_INIT_ERROR = 'Suite initialization error.'; + + /** + * Initializes a validation suite, creates a validation context. + * @param {String} name Descriptive name for validation suite. + * @param {Function} tests Validation suite body. + * @returns {Object} Vest output object. + */ + + var validate = function validate(name, tests) { + if (typeof name !== 'string') { + return throwError(SUITE_INIT_ERROR + ' Expected name to be a string.', TypeError); + } + + if (typeof tests !== 'function') { + return throwError(SUITE_INIT_ERROR + ' Expected tests to be a function.', TypeError); + } + + var result = suiteResult(name); + new Context({ + result: result + }); + tests(); + Context.clear(); + + _toConsumableArray(result.pending).forEach(runAsync); + + return result.output; + }; + + /** + * @returns {Object} Current output object. + */ + + var draft = function draft() { + var ctx = singleton.useContext(); + + if (ctx) { + return ctx.result.output; + } + + throwError('draft ' + ERROR_HOOK_CALLED_OUTSIDE); + }; + + /** + * @type {String} Error message to display when `warn` gets called outside of a test. + */ + var ERROR_OUTSIDE_OF_TEST = 'warn hook called outside of a test callback. It won\'t have an effect.'; + + /** + * Sets a running test to warn only mode. + */ + + var warn = function warn() { + var ctx = singleton.useContext(); + + if (!ctx) { + throwError('warn ' + ERROR_HOOK_CALLED_OUTSIDE); + return; + } + + if (!ctx.currentTest) { + throwError(ERROR_OUTSIDE_OF_TEST); + return; + } + + ctx.currentTest.warn(); + }; + + /** + * @type {String} Version number derived from current tag. + */ + var VERSION = "1.0.0"; + + var index = singleton.register({ + VERSION: VERSION, + enforce: enforce_min, + draft: draft, + Enforce: enforce_min.Enforce, + test: test, + any: any, + validate: validate, + only: only, + skip: skip, + warn: warn + }); + + return index; + +}))); +//# sourceMappingURL=vest.js.map diff --git a/dist/vest.js.map b/dist/vest.js.map new file mode 100644 index 000000000..65a1480a4 --- /dev/null +++ b/dist/vest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vest.js","sources":["../node_modules/n4s/dist/enforce.min.js","../node_modules/anyone/any/index.js","../src/lib/globalObject/index.js","../src/lib/throwError/index.js","../src/lib/singleton/constants.js","../src/lib/singleton/index.js","../src/core/Context/index.js","../src/hooks/constants.js","../src/hooks/exclusive/constants.js","../src/hooks/exclusive/index.js","../src/core/test/lib/TestObject/index.js","../src/core/test/index.js","../src/core/suiteResult/index.js","../src/core/validate/constants.js","../src/core/validate/index.js","../src/hooks/draft/index.js","../src/hooks/warn/constants.js","../src/hooks/warn/index.js","../src/constants.js","../src/index.js"],"sourcesContent":["!function(n,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(n=n||self).enforce=e()}(this,(function(){\"use strict\";function n(e){return(n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&\"function\"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?\"symbol\":typeof n})(e)}function e(n,e,t){return e in n?Object.defineProperty(n,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[e]=t,n}function t(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(n);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),t.push.apply(t,r)}return t}function r(n){for(var r=1;rNumber(e)}function v(n,e){return p(n)&&p(e)&&Number(n)>=Number(e)}function h(n,e){return p(n)&&p(e)&&Number(n)e},longerThanOrEquals:function(n,e){return n.length>=e},shorterThan:function(n,e){return n.length2?r-2:0),u=2;u0&&void 0!==arguments[0]?arguments[0]:{},t=r({},j,{},n);if(i())return function(n){var e=new Proxy(t,{get:function(t,r){if(o(t,r))return function(){for(var o=arguments.length,u=new Array(o),i=0;i setTimeout(() => {\n throw new type(`[Vest]: ${message}`);\n});\n\nexport default throwError;\n","/**\n * @type {String} Vest's major version.\n */\nconst VEST_MAJOR = VEST_VERSION.split('.')[0];\n\n/**\n * @type {Symbol} Used to store a global instance of Vest.\n */\nexport const SYMBOL_VEST = Symbol.for(`VEST#${VEST_MAJOR}`);\n","import throwError from '../throwError';\nimport go from '../globalObject';\nimport { SYMBOL_VEST } from './constants';\n\n/**\n * Throws an error when multiple versions of Vest are detected on the same runtime.\n * @param {String[]} versions List of detected Vest versions.\n */\nconst throwMultipleVestError = (...versions) => {\n throwError(`Multiple versions of Vest detected: (${versions.join()}).\n Most features should work regularly, but for optimal feature compatibility, you should have all running instances use the same version.`);\n};\n\n/**\n * Registers current Vest instance on global object.\n * @param {Object} vest Reference to Vest.\n * @return {Function} Global Vest reference.\n */\nconst register = (vest) => {\n\n const existing = go[SYMBOL_VEST];\n\n if (existing) {\n if (existing.VERSION !== vest.VERSION) {\n throwMultipleVestError(vest.VERSION, existing.VERSION);\n }\n } else {\n go[SYMBOL_VEST] = vest;\n }\n\n return go[SYMBOL_VEST];\n};\n\n/**\n * @returns Global Vest instance.\n */\nconst use = () => go[SYMBOL_VEST];\n\n/**\n * @returns Current Vest context.\n */\nconst useContext = () => use().ctx;\n\nexport default {\n use,\n useContext,\n register\n};\n","import { singleton } from '../../lib';\n\n/**\n * Creates a new context object, and assigns it as a static property on Vest's singleton.\n * @param {Object} parent Parent context.\n */\nfunction Context(parent) {\n singleton.use().ctx = this;\n Object.assign(this, parent);\n}\n\n/**\n * Sets a testObject reference on context.\n * @param {TestObject} A TestObject instance.\n */\nContext.prototype.setCurrentTest = function(testObject) {\n this.currentTest = testObject;\n};\n\n/**\n * Removes current test from context.\n */\nContext.prototype.removeCurrentTest = function() {\n delete this.currentTest;\n};\n\n/**\n * Clears stored instance from constructor function.\n */\nContext.clear = function() {\n singleton.use().ctx = null;\n};\n\nexport default Context;\n","/**\n * @type {String} Error message to display when a hook was called outside of context.\n */\nexport const ERROR_HOOK_CALLED_OUTSIDE = 'hook called outside of a running suite.';\n","\n/**\n * @type {String} Exclusivity group name: only.\n */\nexport const GROUP_NAME_ONLY = 'only';\n\n/**\n * @type {String} Exclusivity group name: skip.\n */\nexport const GROUP_NAME_SKIP = 'skip';\n","import { singleton, throwError } from '../../lib';\nimport { ERROR_HOOK_CALLED_OUTSIDE } from '../constants';\nimport { GROUP_NAME_ONLY, GROUP_NAME_SKIP } from './constants';\n\n/**\n * Adds fields to a specified group.\n * @param {String} group To add the fields to.\n * @param {String[]|String} item A field name or a list of field names.\n */\nconst addTo = (group, item) => {\n const ctx = singleton.useContext();\n\n if (!item) {\n return;\n }\n\n if (!ctx) {\n throwError(`${group} ${ERROR_HOOK_CALLED_OUTSIDE}`);\n return;\n }\n\n ctx.exclusive = ctx.exclusive || {};\n\n [].concat(item).forEach((fieldName) => {\n if (typeof fieldName === 'string') {\n ctx.exclusive[group] = ctx.exclusive[group] || {};\n ctx.exclusive[group][fieldName] = true;\n }\n });\n};\n\n/**\n * Adds a field or multiple fields to inclusion group.\n * @param {String[]|String} item Item to be added to inclusion group.\n */\nexport const only = (item) => addTo(GROUP_NAME_ONLY, item);\n\n/**\n * Adds a field or multiple fields to exlusion group.\n * @param {String[]|String} item Item to be added to exlusion group.\n */\nexport const skip = (item) => addTo(GROUP_NAME_SKIP, item);\n\n/**\n * Checks whether a certain field name is excluded by any of the exclusion groups.\n * @param {String} fieldName FieldN name to test.\n * @returns {Boolean}\n */\nexport const isExcluded = (fieldName) => {\n const ctx = singleton.useContext();\n\n if (!(ctx && ctx.exclusive)) {\n return false;\n }\n\n if (\n ctx.exclusive[GROUP_NAME_SKIP] &&\n ctx.exclusive[GROUP_NAME_SKIP][fieldName]\n ) {\n\n return true;\n }\n\n if (ctx.exclusive[GROUP_NAME_ONLY]) {\n if (ctx.exclusive[GROUP_NAME_ONLY][fieldName]) {\n return false;\n }\n\n return true;\n }\n\n return false;\n};\n","/**\n * Describes a test call inside a Vest suite.\n * @param {Object} ctx Parent context.\n * @param {String} fieldName Name of the field being tested.\n * @param {String} statement The message returned when failing.\n * @param {Promise|Function} testFn The actual test callbrack or promise.\n */\nfunction TestObject(ctx, fieldName, statement, testFn) {\n Object.assign(this, {\n ctx,\n testFn,\n fieldName,\n statement,\n isWarning: false,\n failed: false\n });\n}\n\n/**\n * @returns {Boolean} Current validity status of a test.\n */\nTestObject.prototype.valueOf = function() {\n return this.failed !== true;\n};\n\n/**\n * Sets a test to failed.\n * @returns {TestObject} Current instance.\n */\nTestObject.prototype.fail = function() {\n this.ctx.result.markFailure({\n fieldName: this.fieldName,\n statement: this.statement,\n isWarning: this.isWarning\n });\n\n this.failed = true;\n return this;\n};\n\n/**\n * Sets a current test's `isWarning` to true.\n * @returns {TestObject} Current instance.\n */\nTestObject.prototype.warn = function() {\n this.isWarning = true;\n return this;\n};\n\nexport default TestObject;\n","import { isExcluded } from '../../hooks/exclusive';\nimport { singleton } from '../../lib';\nimport { TestObject } from './lib';\n\n/**\n * Runs async test.\n * @param {TestObject} testObject A TestObject instance.\n */\nexport const runAsync = (testObject) => {\n const { testFn, statement, ctx } = testObject;\n\n const done = () => ctx.result.markAsDone(testObject);\n\n const fail = (rejectionMessage) => {\n testObject.statement = typeof rejectionMessage === 'string'\n ? rejectionMessage\n : statement;\n\n testObject.fail();\n\n done();\n };\n\n ctx.setCurrentTest(testObject);\n\n try {\n testFn.then(done, fail);\n } catch (e) {\n fail();\n }\n\n ctx.removeCurrentTest();\n};\n\n/**\n * Runs test callback.\n * @param {TestObject} testObject TestObject instance.\n * @returns {*} Result from test callback.\n */\nconst runTest = (testObject) => {\n let result;\n\n testObject.ctx.setCurrentTest(testObject);\n\n try {\n result = testObject.testFn.apply(testObject);\n } catch (e) {\n result = false;\n }\n\n testObject.ctx.removeCurrentTest();\n\n if (result === false) {\n testObject.fail();\n }\n\n return result;\n};\n\n/**\n * Registers test, if async - adds to pending array\n * @param {TestObject} testObject A TestObject Instance.\n */\nconst register = (testObject) => {\n const { testFn, ctx, fieldName } = testObject;\n let isPending = false;\n let result;\n\n if (isExcluded(fieldName)) {\n ctx.result.addToSkipped(fieldName);\n return;\n }\n\n ctx.result.markTestRun(fieldName);\n\n if (testFn && typeof testFn.then === 'function') {\n isPending = true;\n } else {\n result = runTest(testObject);\n }\n\n if (result && typeof result.then === 'function') {\n isPending = true;\n\n testObject.testFn = result;\n }\n\n if (isPending) {\n ctx.result.setPending(testObject);\n }\n};\n\n/**\n * Test function used by consumer to provide their own validations.\n * @param {String} fieldName Name of the field to test.\n * @param {String} [statement] The message returned in case of a failure.\n * @param {function} testFn The actual test callback.\n * @return {TestObject} A TestObject instance.\n */\nconst test = (fieldName, ...args) => {\n let statement,\n testFn;\n\n if (typeof args[0] === 'string') {\n [statement, testFn] = args;\n } else if (typeof args[0] === 'function') {\n [testFn] = args;\n }\n\n if (typeof testFn !== 'function') {\n return;\n }\n\n const testObject = new TestObject(\n singleton.useContext(),\n fieldName,\n statement,\n testFn\n );\n\n register(testObject);\n\n return testObject;\n};\n\nexport default test;\n","const suiteResult = (name) => {\n const pending = { tests: [] };\n const doneCallbacks = [];\n const fieldCallbacks = {};\n let isAsync = false;\n\n /**\n * Adds a testObject to pending list.\n * @param {Object} testObject\n */\n const setPending = (testObject) => {\n isAsync = true;\n pending.tests.push(testObject);\n };\n\n /**\n * Clears a testObject from pending list.\n * @param {Object} testObject\n */\n const clearFromPending = (testObject) => {\n pending.tests = pending.tests\n .filter((t) => t !== testObject);\n };\n\n /**\n * Checks if a specified field has any remaining tests.\n * @param {String} fieldName\n * @returns {Boolean}\n */\n const hasRemaining = (fieldName) => {\n if (!pending.tests.length) {\n return false;\n }\n\n if (fieldName) {\n return pending.tests\n .some((testObject) => testObject.fieldName === fieldName);\n }\n\n return !!pending.tests.length;\n };\n\n /**\n * Bumps test counters to indicate tests that are being performed\n * @param {string} fieldName - The name of the field.\n */\n const markTestRun = (fieldName) => {\n\n if (!output.tests[fieldName]) {\n output.tests[fieldName] = {\n testCount: 0,\n errorCount: 0,\n warnCount: 0\n };\n\n output.tested.push(fieldName);\n }\n\n output.tests[fieldName].testCount++;\n output.testCount++;\n };\n\n /**\n * Marks a test as failed.\n * @param {Object} testData\n * @param {String} testData.fieldName Name of field being tested.\n * @param {String} [testData.statement] Failure message to display.\n * @param {Boolean} [testData.isWarning] Indicates warn only test.\n */\n const markFailure = ({ fieldName, statement, isWarning }) => {\n if (!output.tests[fieldName]) { return; }\n\n let severityGroup, severityCount;\n\n if (isWarning) {\n severityGroup = 'warnings';\n severityCount = 'warnCount';\n } else {\n severityGroup = 'errors';\n severityCount = 'errorCount';\n }\n\n output.tests[fieldName][severityGroup] =\n output.tests[fieldName][severityGroup] || [];\n\n if (statement) {\n output.tests[fieldName][severityGroup].push(statement);\n }\n\n output[severityCount]++;\n output.tests[fieldName][severityCount]++;\n };\n\n /**\n * Uniquely add a field to the `skipped` list\n * @param {string} fieldName - The name of the field.\n */\n const addToSkipped = (fieldName) => {\n !output.skipped.includes(fieldName) && output.skipped.push(fieldName);\n };\n\n /**\n * Runs callbacks of specified field, or of the whole suite.\n * @param {String} [fieldName]\n */\n const runCallbacks = (fieldName) => {\n if (!fieldName) {\n return doneCallbacks.forEach((cb) => cb(output));\n }\n\n if (Array.isArray(fieldCallbacks[fieldName])) {\n return fieldCallbacks[fieldName].forEach((cb) => cb(output));\n }\n };\n\n /**\n * Removes a field from pending, and runs its callbacks. If all fields are done, runs all callbacks.\n * @param {Object} testObject a testObject to remove from pending.\n */\n const markAsDone = (testObject) => {\n\n if (output.canceled) {\n return;\n }\n\n if (testObject) {\n clearFromPending(testObject);\n if (!hasRemaining(testObject.fieldName)) {\n runCallbacks(testObject.fieldName);\n }\n }\n\n if (!hasRemaining()) {\n runCallbacks();\n }\n };\n\n /**\n * Registers a callback to run once the suite or a specified field finished running.\n * @param {String} [name] Name of the field to call back after,\n * @param {Function} callback A callback to run once validation is finished.\n * @returns {Object} Output object.\n */\n const done = (...args) => {\n const { length, [length-1]: callback, [length-2]: name } = args;\n\n if (typeof callback !== 'function') {\n return output;\n }\n\n if (!isAsync) {\n callback(output);\n return output;\n }\n\n if (name && !hasRemaining(name)) {\n callback(output);\n return output;\n }\n\n if (name) {\n fieldCallbacks[name] = fieldCallbacks[name] || [];\n fieldCallbacks[name].push(callback);\n } else {\n doneCallbacks.push(callback);\n }\n\n return output;\n };\n\n /**\n * cancels done callbacks. They won't invoke when async operations complete\n */\n const cancel = () => {\n output.canceled = true;\n\n return output;\n };\n\n /**\n * Collects all fields that have an array of specified group in their results.\n * @param {String} group Group name (warnings or errors).\n * @returns {Object} Object of array per field.\n */\n const collectFailureMessages = (group) => {\n const collector = {};\n\n for (const fieldName in output.tests) {\n if (output.tests[fieldName] &&\n output.tests[fieldName][group]) {\n collector[fieldName] = output.tests[fieldName][group];\n }\n }\n\n return collector;\n };\n\n /**\n * Gets all the errors of a field, or of the whole object.\n * @param {string} fieldName - The name of the field.\n * @return {array | object} The field's errors, or all errors.\n */\n const getErrors = (fieldName) => {\n if (!fieldName) {\n return collectFailureMessages('errors');\n }\n\n if (output.tests[fieldName].errors) {\n return output.tests[fieldName].errors;\n }\n\n return [];\n };\n\n /**\n * Gets all the warnings of a field, or of the whole object.\n * @param {string} [fieldName] - The name of the field.\n * @return {array | object} The field's warnings, or all warnings.\n */\n const getWarnings = (fieldName) => {\n if (!fieldName) {\n return collectFailureMessages('warnings');\n }\n\n if (output.tests[fieldName].warnings) {\n return output.tests[fieldName].warnings;\n }\n\n return [];\n };\n\n /**\n * Checks if a certain field (or the whole suite) has errors.\n * @param {string} [fieldName]\n * @return {boolean}\n */\n const hasErrors = (fieldName) => {\n if (!fieldName) {\n return !!output.errorCount;\n }\n\n return Boolean(\n output.tests[fieldName] &&\n output.tests[fieldName].errorCount\n );\n };\n\n /**\n * Checks if a certain field (or the whole suite) has warnings\n * @param {string} [fieldName]\n * @return {boolean}\n */\n const hasWarnings = (fieldName) => {\n if (!fieldName) {\n return !!output.warnCount;\n }\n\n return Boolean(\n output.tests[fieldName] &&\n output.tests[fieldName].warnCount\n );\n };\n\n const output = {\n name,\n errorCount: 0,\n warnCount: 0,\n testCount: 0,\n tests: {},\n skipped: [],\n tested: []\n };\n\n Object.defineProperties(output, {\n hasErrors: {\n value: hasErrors,\n writable: true,\n configurable: true,\n enumerable: false\n },\n hasWarnings: {\n value: hasWarnings,\n writable: true,\n configurable: true,\n enumerable: false\n },\n getErrors: {\n value: getErrors,\n writable: true,\n configurable: true,\n enumerable: false\n },\n getWarnings: {\n value: getWarnings,\n writable: true,\n configurable: true,\n enumerable: false\n },\n done: {\n value: done,\n writable: true,\n configurable: true,\n enumerable: false\n },\n cancel: {\n value: cancel,\n writable: true,\n configurable: true,\n enumerable: false\n }\n });\n\n return {\n markTestRun,\n markFailure,\n setPending,\n addToSkipped,\n markAsDone,\n pending: pending.tests,\n output\n };\n};\n\nexport default suiteResult;\n","/**\n * @type {String}\n */\nexport const SUITE_INIT_ERROR = 'Suite initialization error.';\n","import { throwError } from '../../lib';\nimport Context from '../Context';\nimport { runAsync } from '../test';\nimport suiteResult from '../suiteResult';\nimport { SUITE_INIT_ERROR } from './constants';\n\n/**\n * Initializes a validation suite, creates a validation context.\n * @param {String} name Descriptive name for validation suite.\n * @param {Function} tests Validation suite body.\n * @returns {Object} Vest output object.\n */\nconst validate = (name, tests) => {\n if (typeof name !== 'string') {\n return throwError(SUITE_INIT_ERROR + ' Expected name to be a string.', TypeError);\n }\n\n if (typeof tests !== 'function') {\n return throwError(SUITE_INIT_ERROR + ' Expected tests to be a function.', TypeError);\n }\n\n const result = suiteResult(name);\n\n new Context({ result });\n\n tests();\n\n Context.clear();\n\n [...result.pending].forEach(runAsync);\n\n return result.output;\n};\n\nexport default validate;\n","import { singleton, throwError } from '../../lib';\nimport { ERROR_HOOK_CALLED_OUTSIDE } from '../constants';\n\n/**\n * @returns {Object} Current output object.\n */\nconst draft = () => {\n\n const ctx = singleton.useContext();\n\n if (ctx) {\n return ctx.result.output;\n }\n\n throwError('draft ' + ERROR_HOOK_CALLED_OUTSIDE);\n};\n\nexport default draft;\n","/**\n * @type {String} Error message to display when `warn` gets called outside of a test.\n */\nexport const ERROR_OUTSIDE_OF_TEST = 'warn hook called outside of a test callback. It won\\'t have an effect.';\n","import { singleton, throwError } from '../../lib';\nimport { ERROR_HOOK_CALLED_OUTSIDE } from '../constants';\nimport { ERROR_OUTSIDE_OF_TEST } from './constants';\n\n/**\n * Sets a running test to warn only mode.\n */\nconst warn = () => {\n const ctx = singleton.useContext();\n\n if (!ctx) {\n throwError('warn ' + ERROR_HOOK_CALLED_OUTSIDE);\n return;\n }\n\n if (!ctx.currentTest) {\n throwError(ERROR_OUTSIDE_OF_TEST);\n return;\n }\n\n ctx.currentTest.warn();\n};\n\nexport default warn;\n","/**\n * @type {String} Version number derived from current tag.\n */\nexport const VERSION = VEST_VERSION;\n","import enforce from 'n4s/dist/enforce.min';\nimport any from 'anyone/any';\nimport validate from './core/validate';\nimport { draft, only, skip, warn } from './hooks';\nimport test from './core/test';\nimport { singleton } from './lib';\nimport { VERSION } from './constants';\n\nexport default singleton.register({\n VERSION,\n enforce,\n draft,\n Enforce: enforce.Enforce,\n test,\n any,\n validate,\n only,\n skip,\n warn\n});\n"],"names":["n","e","module","this","Symbol","iterator","constructor","prototype","t","Object","defineProperty","value","enumerable","configurable","writable","keys","getOwnPropertySymbols","r","filter","getOwnPropertyDescriptor","push","apply","arguments","length","o","forEach","getOwnPropertyDescriptors","defineProperties","hasOwnProperty","call","u","Function","i","Proxy","a","Boolean","Array","isArray","c","f","s","RegExp","test","l","includes","y","p","isNaN","parseFloat","Number","isFinite","g","b","m","v","h","O","N","negativeForm","alias","d","j","isNumber","isString","matches","inside","equals","numberEquals","isNumeric","isEmpty","greaterThan","greaterThanOrEquals","lessThan","lessThanOrEquals","longerThan","longerThanOrEquals","shorterThan","shorterThanOrEquals","lengthEquals","isOdd","isEven","isTruthy","E","concat","Error","w","get","reduce","F","Enforce","global","factory","run","arg","output","err","any","_len","args","_key","some","globalObject","throwError","message","type","setTimeout","VEST_MAJOR","VEST_VERSION","split","SYMBOL_VEST","throwMultipleVestError","versions","join","register","vest","existing","go","VERSION","use","useContext","ctx","Context","parent","singleton","setCurrentTest","testObject","currentTest","removeCurrentTest","clear","ERROR_HOOK_CALLED_OUTSIDE","GROUP_NAME_ONLY","GROUP_NAME_SKIP","addTo","group","item","exclusive","fieldName","only","skip","isExcluded","TestObject","statement","testFn","isWarning","failed","valueOf","fail","result","markFailure","warn","runAsync","done","markAsDone","rejectionMessage","then","runTest","isPending","addToSkipped","markTestRun","setPending","suiteResult","name","pending","tests","doneCallbacks","fieldCallbacks","isAsync","clearFromPending","hasRemaining","testCount","errorCount","warnCount","tested","severityGroup","severityCount","skipped","runCallbacks","cb","canceled","callback","cancel","collectFailureMessages","collector","getErrors","errors","getWarnings","warnings","hasErrors","hasWarnings","SUITE_INIT_ERROR","validate","TypeError","draft","ERROR_OUTSIDE_OF_TEST","enforce"],"mappings":"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"} \ No newline at end of file diff --git a/dist/vest.min.js b/dist/vest.min.js new file mode 100644 index 000000000..fa27814b3 --- /dev/null +++ b/dist/vest.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).vest=e()}(this,(function(){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}function e(){return(e=Object.assign||function(t){for(var e=1;eNumber(e)}function d(t,e){return m(t)&&m(e)&&Number(t)>=Number(e)}function w(t,e){return m(t)&&m(e)&&Number(t)e},longerThanOrEquals:function(t,e){return t.length>=e},shorterThan:function(t,e){return t.length2?r-2:0),u=2;u0&&void 0!==arguments[0]?arguments[0]:{},n=u({},x,{},t);if(a())return function(t){var e=new Proxy(n,{get:function(n,r){if(i(n,r))return function(){for(var o=arguments.length,u=new Array(o),i=0;i1&&void 0!==arguments[1]?arguments[1]:Error;return setTimeout((function(){throw new e("[Vest]: ".concat(t))}))},a="1.0.0".split(".")[0],c=Symbol.for("VEST#".concat(a)),f=function(){return i[c]},l={use:f,useContext:function(){return f().ctx},register:function(t){var e=i[c];return e?e.VERSION!==t.VERSION&&function(){for(var t=arguments.length,e=new Array(t),n=0;n1?r-1:0),u=1;uNumber(e)}function v(n,e){return p(n)&&p(e)&&Number(n)>=Number(e)}function h(n,e){return p(n)&&p(e)&&Number(n)e},longerThanOrEquals:function(n,e){return n.length>=e},shorterThan:function(n,e){return n.length2?r-2:0),u=2;u0&&void 0!==arguments[0]?arguments[0]:{},t=r({},j,{},n);if(i())return function(n){var e=new Proxy(t,{get:function(t,r){if(o(t,r))return function(){for(var o=arguments.length,u=new Array(o),i=0;i setTimeout(() => {\n throw new type(`[Vest]: ${message}`);\n});\n\nexport default throwError;\n","/**\n * @type {String} Vest's major version.\n */\nconst VEST_MAJOR = VEST_VERSION.split('.')[0];\n\n/**\n * @type {Symbol} Used to store a global instance of Vest.\n */\nexport const SYMBOL_VEST = Symbol.for(`VEST#${VEST_MAJOR}`);\n","import throwError from '../throwError';\nimport go from '../globalObject';\nimport { SYMBOL_VEST } from './constants';\n\n/**\n * Throws an error when multiple versions of Vest are detected on the same runtime.\n * @param {String[]} versions List of detected Vest versions.\n */\nconst throwMultipleVestError = (...versions) => {\n throwError(`Multiple versions of Vest detected: (${versions.join()}).\n Most features should work regularly, but for optimal feature compatibility, you should have all running instances use the same version.`);\n};\n\n/**\n * Registers current Vest instance on global object.\n * @param {Object} vest Reference to Vest.\n * @return {Function} Global Vest reference.\n */\nconst register = (vest) => {\n\n const existing = go[SYMBOL_VEST];\n\n if (existing) {\n if (existing.VERSION !== vest.VERSION) {\n throwMultipleVestError(vest.VERSION, existing.VERSION);\n }\n } else {\n go[SYMBOL_VEST] = vest;\n }\n\n return go[SYMBOL_VEST];\n};\n\n/**\n * @returns Global Vest instance.\n */\nconst use = () => go[SYMBOL_VEST];\n\n/**\n * @returns Current Vest context.\n */\nconst useContext = () => use().ctx;\n\nexport default {\n use,\n useContext,\n register\n};\n","import { singleton } from '../../lib';\n\n/**\n * Creates a new context object, and assigns it as a static property on Vest's singleton.\n * @param {Object} parent Parent context.\n */\nfunction Context(parent) {\n singleton.use().ctx = this;\n Object.assign(this, parent);\n}\n\n/**\n * Sets a testObject reference on context.\n * @param {TestObject} A TestObject instance.\n */\nContext.prototype.setCurrentTest = function(testObject) {\n this.currentTest = testObject;\n};\n\n/**\n * Removes current test from context.\n */\nContext.prototype.removeCurrentTest = function() {\n delete this.currentTest;\n};\n\n/**\n * Clears stored instance from constructor function.\n */\nContext.clear = function() {\n singleton.use().ctx = null;\n};\n\nexport default Context;\n","/**\n * @type {String} Error message to display when a hook was called outside of context.\n */\nexport const ERROR_HOOK_CALLED_OUTSIDE = 'hook called outside of a running suite.';\n","import { singleton, throwError } from '../../lib';\nimport { ERROR_HOOK_CALLED_OUTSIDE } from '../constants';\nimport { GROUP_NAME_ONLY, GROUP_NAME_SKIP } from './constants';\n\n/**\n * Adds fields to a specified group.\n * @param {String} group To add the fields to.\n * @param {String[]|String} item A field name or a list of field names.\n */\nconst addTo = (group, item) => {\n const ctx = singleton.useContext();\n\n if (!item) {\n return;\n }\n\n if (!ctx) {\n throwError(`${group} ${ERROR_HOOK_CALLED_OUTSIDE}`);\n return;\n }\n\n ctx.exclusive = ctx.exclusive || {};\n\n [].concat(item).forEach((fieldName) => {\n if (typeof fieldName === 'string') {\n ctx.exclusive[group] = ctx.exclusive[group] || {};\n ctx.exclusive[group][fieldName] = true;\n }\n });\n};\n\n/**\n * Adds a field or multiple fields to inclusion group.\n * @param {String[]|String} item Item to be added to inclusion group.\n */\nexport const only = (item) => addTo(GROUP_NAME_ONLY, item);\n\n/**\n * Adds a field or multiple fields to exlusion group.\n * @param {String[]|String} item Item to be added to exlusion group.\n */\nexport const skip = (item) => addTo(GROUP_NAME_SKIP, item);\n\n/**\n * Checks whether a certain field name is excluded by any of the exclusion groups.\n * @param {String} fieldName FieldN name to test.\n * @returns {Boolean}\n */\nexport const isExcluded = (fieldName) => {\n const ctx = singleton.useContext();\n\n if (!(ctx && ctx.exclusive)) {\n return false;\n }\n\n if (\n ctx.exclusive[GROUP_NAME_SKIP] &&\n ctx.exclusive[GROUP_NAME_SKIP][fieldName]\n ) {\n\n return true;\n }\n\n if (ctx.exclusive[GROUP_NAME_ONLY]) {\n if (ctx.exclusive[GROUP_NAME_ONLY][fieldName]) {\n return false;\n }\n\n return true;\n }\n\n return false;\n};\n","/**\n * Describes a test call inside a Vest suite.\n * @param {Object} ctx Parent context.\n * @param {String} fieldName Name of the field being tested.\n * @param {String} statement The message returned when failing.\n * @param {Promise|Function} testFn The actual test callbrack or promise.\n */\nfunction TestObject(ctx, fieldName, statement, testFn) {\n Object.assign(this, {\n ctx,\n testFn,\n fieldName,\n statement,\n isWarning: false,\n failed: false\n });\n}\n\n/**\n * @returns {Boolean} Current validity status of a test.\n */\nTestObject.prototype.valueOf = function() {\n return this.failed !== true;\n};\n\n/**\n * Sets a test to failed.\n * @returns {TestObject} Current instance.\n */\nTestObject.prototype.fail = function() {\n this.ctx.result.markFailure({\n fieldName: this.fieldName,\n statement: this.statement,\n isWarning: this.isWarning\n });\n\n this.failed = true;\n return this;\n};\n\n/**\n * Sets a current test's `isWarning` to true.\n * @returns {TestObject} Current instance.\n */\nTestObject.prototype.warn = function() {\n this.isWarning = true;\n return this;\n};\n\nexport default TestObject;\n","import { isExcluded } from '../../hooks/exclusive';\nimport { singleton } from '../../lib';\nimport { TestObject } from './lib';\n\n/**\n * Runs async test.\n * @param {TestObject} testObject A TestObject instance.\n */\nexport const runAsync = (testObject) => {\n const { testFn, statement, ctx } = testObject;\n\n const done = () => ctx.result.markAsDone(testObject);\n\n const fail = (rejectionMessage) => {\n testObject.statement = typeof rejectionMessage === 'string'\n ? rejectionMessage\n : statement;\n\n testObject.fail();\n\n done();\n };\n\n ctx.setCurrentTest(testObject);\n\n try {\n testFn.then(done, fail);\n } catch (e) {\n fail();\n }\n\n ctx.removeCurrentTest();\n};\n\n/**\n * Runs test callback.\n * @param {TestObject} testObject TestObject instance.\n * @returns {*} Result from test callback.\n */\nconst runTest = (testObject) => {\n let result;\n\n testObject.ctx.setCurrentTest(testObject);\n\n try {\n result = testObject.testFn.apply(testObject);\n } catch (e) {\n result = false;\n }\n\n testObject.ctx.removeCurrentTest();\n\n if (result === false) {\n testObject.fail();\n }\n\n return result;\n};\n\n/**\n * Registers test, if async - adds to pending array\n * @param {TestObject} testObject A TestObject Instance.\n */\nconst register = (testObject) => {\n const { testFn, ctx, fieldName } = testObject;\n let isPending = false;\n let result;\n\n if (isExcluded(fieldName)) {\n ctx.result.addToSkipped(fieldName);\n return;\n }\n\n ctx.result.markTestRun(fieldName);\n\n if (testFn && typeof testFn.then === 'function') {\n isPending = true;\n } else {\n result = runTest(testObject);\n }\n\n if (result && typeof result.then === 'function') {\n isPending = true;\n\n testObject.testFn = result;\n }\n\n if (isPending) {\n ctx.result.setPending(testObject);\n }\n};\n\n/**\n * Test function used by consumer to provide their own validations.\n * @param {String} fieldName Name of the field to test.\n * @param {String} [statement] The message returned in case of a failure.\n * @param {function} testFn The actual test callback.\n * @return {TestObject} A TestObject instance.\n */\nconst test = (fieldName, ...args) => {\n let statement,\n testFn;\n\n if (typeof args[0] === 'string') {\n [statement, testFn] = args;\n } else if (typeof args[0] === 'function') {\n [testFn] = args;\n }\n\n if (typeof testFn !== 'function') {\n return;\n }\n\n const testObject = new TestObject(\n singleton.useContext(),\n fieldName,\n statement,\n testFn\n );\n\n register(testObject);\n\n return testObject;\n};\n\nexport default test;\n","const suiteResult = (name) => {\n const pending = { tests: [] };\n const doneCallbacks = [];\n const fieldCallbacks = {};\n let isAsync = false;\n\n /**\n * Adds a testObject to pending list.\n * @param {Object} testObject\n */\n const setPending = (testObject) => {\n isAsync = true;\n pending.tests.push(testObject);\n };\n\n /**\n * Clears a testObject from pending list.\n * @param {Object} testObject\n */\n const clearFromPending = (testObject) => {\n pending.tests = pending.tests\n .filter((t) => t !== testObject);\n };\n\n /**\n * Checks if a specified field has any remaining tests.\n * @param {String} fieldName\n * @returns {Boolean}\n */\n const hasRemaining = (fieldName) => {\n if (!pending.tests.length) {\n return false;\n }\n\n if (fieldName) {\n return pending.tests\n .some((testObject) => testObject.fieldName === fieldName);\n }\n\n return !!pending.tests.length;\n };\n\n /**\n * Bumps test counters to indicate tests that are being performed\n * @param {string} fieldName - The name of the field.\n */\n const markTestRun = (fieldName) => {\n\n if (!output.tests[fieldName]) {\n output.tests[fieldName] = {\n testCount: 0,\n errorCount: 0,\n warnCount: 0\n };\n\n output.tested.push(fieldName);\n }\n\n output.tests[fieldName].testCount++;\n output.testCount++;\n };\n\n /**\n * Marks a test as failed.\n * @param {Object} testData\n * @param {String} testData.fieldName Name of field being tested.\n * @param {String} [testData.statement] Failure message to display.\n * @param {Boolean} [testData.isWarning] Indicates warn only test.\n */\n const markFailure = ({ fieldName, statement, isWarning }) => {\n if (!output.tests[fieldName]) { return; }\n\n let severityGroup, severityCount;\n\n if (isWarning) {\n severityGroup = 'warnings';\n severityCount = 'warnCount';\n } else {\n severityGroup = 'errors';\n severityCount = 'errorCount';\n }\n\n output.tests[fieldName][severityGroup] =\n output.tests[fieldName][severityGroup] || [];\n\n if (statement) {\n output.tests[fieldName][severityGroup].push(statement);\n }\n\n output[severityCount]++;\n output.tests[fieldName][severityCount]++;\n };\n\n /**\n * Uniquely add a field to the `skipped` list\n * @param {string} fieldName - The name of the field.\n */\n const addToSkipped = (fieldName) => {\n !output.skipped.includes(fieldName) && output.skipped.push(fieldName);\n };\n\n /**\n * Runs callbacks of specified field, or of the whole suite.\n * @param {String} [fieldName]\n */\n const runCallbacks = (fieldName) => {\n if (!fieldName) {\n return doneCallbacks.forEach((cb) => cb(output));\n }\n\n if (Array.isArray(fieldCallbacks[fieldName])) {\n return fieldCallbacks[fieldName].forEach((cb) => cb(output));\n }\n };\n\n /**\n * Removes a field from pending, and runs its callbacks. If all fields are done, runs all callbacks.\n * @param {Object} testObject a testObject to remove from pending.\n */\n const markAsDone = (testObject) => {\n\n if (output.canceled) {\n return;\n }\n\n if (testObject) {\n clearFromPending(testObject);\n if (!hasRemaining(testObject.fieldName)) {\n runCallbacks(testObject.fieldName);\n }\n }\n\n if (!hasRemaining()) {\n runCallbacks();\n }\n };\n\n /**\n * Registers a callback to run once the suite or a specified field finished running.\n * @param {String} [name] Name of the field to call back after,\n * @param {Function} callback A callback to run once validation is finished.\n * @returns {Object} Output object.\n */\n const done = (...args) => {\n const { length, [length-1]: callback, [length-2]: name } = args;\n\n if (typeof callback !== 'function') {\n return output;\n }\n\n if (!isAsync) {\n callback(output);\n return output;\n }\n\n if (name && !hasRemaining(name)) {\n callback(output);\n return output;\n }\n\n if (name) {\n fieldCallbacks[name] = fieldCallbacks[name] || [];\n fieldCallbacks[name].push(callback);\n } else {\n doneCallbacks.push(callback);\n }\n\n return output;\n };\n\n /**\n * cancels done callbacks. They won't invoke when async operations complete\n */\n const cancel = () => {\n output.canceled = true;\n\n return output;\n };\n\n /**\n * Collects all fields that have an array of specified group in their results.\n * @param {String} group Group name (warnings or errors).\n * @returns {Object} Object of array per field.\n */\n const collectFailureMessages = (group) => {\n const collector = {};\n\n for (const fieldName in output.tests) {\n if (output.tests[fieldName] &&\n output.tests[fieldName][group]) {\n collector[fieldName] = output.tests[fieldName][group];\n }\n }\n\n return collector;\n };\n\n /**\n * Gets all the errors of a field, or of the whole object.\n * @param {string} fieldName - The name of the field.\n * @return {array | object} The field's errors, or all errors.\n */\n const getErrors = (fieldName) => {\n if (!fieldName) {\n return collectFailureMessages('errors');\n }\n\n if (output.tests[fieldName].errors) {\n return output.tests[fieldName].errors;\n }\n\n return [];\n };\n\n /**\n * Gets all the warnings of a field, or of the whole object.\n * @param {string} [fieldName] - The name of the field.\n * @return {array | object} The field's warnings, or all warnings.\n */\n const getWarnings = (fieldName) => {\n if (!fieldName) {\n return collectFailureMessages('warnings');\n }\n\n if (output.tests[fieldName].warnings) {\n return output.tests[fieldName].warnings;\n }\n\n return [];\n };\n\n /**\n * Checks if a certain field (or the whole suite) has errors.\n * @param {string} [fieldName]\n * @return {boolean}\n */\n const hasErrors = (fieldName) => {\n if (!fieldName) {\n return !!output.errorCount;\n }\n\n return Boolean(\n output.tests[fieldName] &&\n output.tests[fieldName].errorCount\n );\n };\n\n /**\n * Checks if a certain field (or the whole suite) has warnings\n * @param {string} [fieldName]\n * @return {boolean}\n */\n const hasWarnings = (fieldName) => {\n if (!fieldName) {\n return !!output.warnCount;\n }\n\n return Boolean(\n output.tests[fieldName] &&\n output.tests[fieldName].warnCount\n );\n };\n\n const output = {\n name,\n errorCount: 0,\n warnCount: 0,\n testCount: 0,\n tests: {},\n skipped: [],\n tested: []\n };\n\n Object.defineProperties(output, {\n hasErrors: {\n value: hasErrors,\n writable: true,\n configurable: true,\n enumerable: false\n },\n hasWarnings: {\n value: hasWarnings,\n writable: true,\n configurable: true,\n enumerable: false\n },\n getErrors: {\n value: getErrors,\n writable: true,\n configurable: true,\n enumerable: false\n },\n getWarnings: {\n value: getWarnings,\n writable: true,\n configurable: true,\n enumerable: false\n },\n done: {\n value: done,\n writable: true,\n configurable: true,\n enumerable: false\n },\n cancel: {\n value: cancel,\n writable: true,\n configurable: true,\n enumerable: false\n }\n });\n\n return {\n markTestRun,\n markFailure,\n setPending,\n addToSkipped,\n markAsDone,\n pending: pending.tests,\n output\n };\n};\n\nexport default suiteResult;\n","import enforce from 'n4s/dist/enforce.min';\nimport any from 'anyone/any';\nimport validate from './core/validate';\nimport { draft, only, skip, warn } from './hooks';\nimport test from './core/test';\nimport { singleton } from './lib';\nimport { VERSION } from './constants';\n\nexport default singleton.register({\n VERSION,\n enforce,\n draft,\n Enforce: enforce.Enforce,\n test,\n any,\n validate,\n only,\n skip,\n warn\n});\n","/**\n * @type {String} Version number derived from current tag.\n */\nexport const VERSION = VEST_VERSION;\n","import { singleton, throwError } from '../../lib';\nimport { ERROR_HOOK_CALLED_OUTSIDE } from '../constants';\n\n/**\n * @returns {Object} Current output object.\n */\nconst draft = () => {\n\n const ctx = singleton.useContext();\n\n if (ctx) {\n return ctx.result.output;\n }\n\n throwError('draft ' + ERROR_HOOK_CALLED_OUTSIDE);\n};\n\nexport default draft;\n","import { throwError } from '../../lib';\nimport Context from '../Context';\nimport { runAsync } from '../test';\nimport suiteResult from '../suiteResult';\nimport { SUITE_INIT_ERROR } from './constants';\n\n/**\n * Initializes a validation suite, creates a validation context.\n * @param {String} name Descriptive name for validation suite.\n * @param {Function} tests Validation suite body.\n * @returns {Object} Vest output object.\n */\nconst validate = (name, tests) => {\n if (typeof name !== 'string') {\n return throwError(SUITE_INIT_ERROR + ' Expected name to be a string.', TypeError);\n }\n\n if (typeof tests !== 'function') {\n return throwError(SUITE_INIT_ERROR + ' Expected tests to be a function.', TypeError);\n }\n\n const result = suiteResult(name);\n\n new Context({ result });\n\n tests();\n\n Context.clear();\n\n [...result.pending].forEach(runAsync);\n\n return result.output;\n};\n\nexport default validate;\n","\n/**\n * @type {String} Exclusivity group name: only.\n */\nexport const GROUP_NAME_ONLY = 'only';\n\n/**\n * @type {String} Exclusivity group name: skip.\n */\nexport const GROUP_NAME_SKIP = 'skip';\n","import { singleton, throwError } from '../../lib';\nimport { ERROR_HOOK_CALLED_OUTSIDE } from '../constants';\nimport { ERROR_OUTSIDE_OF_TEST } from './constants';\n\n/**\n * Sets a running test to warn only mode.\n */\nconst warn = () => {\n const ctx = singleton.useContext();\n\n if (!ctx) {\n throwError('warn ' + ERROR_HOOK_CALLED_OUTSIDE);\n return;\n }\n\n if (!ctx.currentTest) {\n throwError(ERROR_OUTSIDE_OF_TEST);\n return;\n }\n\n ctx.currentTest.warn();\n};\n\nexport default warn;\n","/**\n * @type {String} Error message to display when `warn` gets called outside of a test.\n */\nexport const ERROR_OUTSIDE_OF_TEST = 'warn hook called outside of a test callback. It won\\'t have an effect.';\n"],"names":["module","n","e","Symbol","iterator","constructor","prototype","t","Object","defineProperty","value","enumerable","configurable","writable","keys","getOwnPropertySymbols","r","filter","getOwnPropertyDescriptor","push","apply","arguments","length","o","forEach","getOwnPropertyDescriptors","defineProperties","hasOwnProperty","call","u","Function","i","Proxy","a","Boolean","Array","isArray","c","f","s","RegExp","test","l","includes","y","p","isNaN","parseFloat","Number","isFinite","g","b","m","v","h","O","N","d","negativeForm","alias","j","isNumber","isString","matches","inside","equals","numberEquals","isNumeric","isEmpty","greaterThan","greaterThanOrEquals","lessThan","lessThanOrEquals","longerThan","longerThanOrEquals","shorterThan","shorterThanOrEquals","lengthEquals","isOdd","isEven","isTruthy","E","concat","Error","w","get","reduce","_extends","F","Enforce","run","arg","output","err","_len","args","_key","some","globalObject","throwError","message","type","setTimeout","VEST_MAJOR","VEST_VERSION","split","SYMBOL_VEST","use","go","useContext","ctx","register","vest","existing","VERSION","versions","join","throwMultipleVestError","Context","parent","singleton","this","setCurrentTest","testObject","currentTest","removeCurrentTest","clear","addTo","group","item","exclusive","fieldName","TestObject","statement","testFn","isWarning","failed","valueOf","fail","result","markFailure","warn","runAsync","done","markAsDone","rejectionMessage","then","isPending","isExcluded","markTestRun","runTest","setPending","addToSkipped","suiteResult","name","pending","tests","doneCallbacks","fieldCallbacks","isAsync","hasRemaining","runCallbacks","cb","collectFailureMessages","collector","errorCount","warnCount","testCount","skipped","tested","hasErrors","hasWarnings","getErrors","errors","getWarnings","warnings","callback","cancel","canceled","severityGroup","severityCount","clearFromPending","enforce","draft","any","validate","SUITE_INIT_ERROR","TypeError","only","skip"],"mappings":"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"} \ No newline at end of file diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..fbfbcb199 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,63 @@ +![Vest](https://cdn.jsdelivr.net/gh/ealush/vest/docs/_assets/logo.png "Vest") + +# Vest - Validation Testing + +[![npm version](https://badge.fury.io/js/vest.svg)](https://badge.fury.io/js/vest) [![Build Status](https://travis-ci.org/ealush/vest.svg?branch=master)](https://travis-ci.org/ealush/vest) + +- [Documentation homepage](https://ealush.github.io/vest) +- **Try vest live** + - [Vanilla JS example](https://stackblitz.com/edit/vest-vanilla-support-example) + - [ReactJS example](https://stackblitz.com/edit/vest-react-support-example) + +## What is Vest? +Vest is a validations library for JS apps that derives its syntax from modern JS frameworks such as Mocha or Jest. It is easy to learn due to its use of already common declerative patterns. + +The idea behind Vest is that your validatios can be described as a 'spec' or a contract that reflects your form or feature structure. Your validations run in production, and they are framework agnostic - meaning Vest works well with React, Angular, Vue, or even without a framework at all. + +**Example code:** + +```js +// validation.js +import { validate, test, enforce } from 'vest'; + +const validation = (data) => validate('NewUserForm', () => { + + test('username', 'Must be at least 3 chars', () => { + enforce(data.username).longerThanOrEquals(3); + }); + + test('email', 'Is not a valid email address', () => { + enforce(data.email) + .isNotEmpty() + .matches(/[^@]+@[^\.]+\..+/g); + }); +}); + +export default validation; +``` + +```js +// myFeature.js +import validation from './validation.js'; + +const res = validation({ + username: 'example', + email: 'email@example.com' +}); + +res.hasErrors() // returns whether the form has errors +res.hasErrors('username') // returns whether the 'username' field has errors +res.getErrors() // returns an object with an array of errors per field +res.getErrors('username') // returns an array of errors for the `username` field +``` + +## Why Vest? +- Vest is really easy to learn, and you can easily take your existing knowledge of unit tests and transfer it to validations. +- Vest takes into account user interaction and warn only validations. +- Your validations are structured, making it very easy to read and write. All validation files look the same. +- Your validation logic is separate from your feature logic, preventing the spaghetti code that's usually involved with writing validations. +- Validation logic is easy to share and reuse across features. +- If your backend is node, you can use the same Vest modules for both client side and server side validations. + + +__Vest is a continuation of [Passable](https://github.com/fiverr/passable) by Fiverr.__ diff --git a/docs/_assets/favicon.ico b/docs/_assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..954cf96e378e50a10bafdc9a6a5cc345c0f41cb5 GIT binary patch literal 1086 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 eW~5mLA;eGB?_7iGhkJ+s0000 { + test('username', 'Must be a string between 2 and 10 chars', () => { + enforce(data.username).isString().longerThan(1).shorterThan(11); + }); + + if (!vest.draft().hasErrors('username')) { + // if `username` did not pass the previous test, the following test won't run + test('username', 'username already exists', () => doesTheUserExist(username)); + } +}); +``` diff --git a/docs/enforce.md b/docs/enforce.md new file mode 100644 index 000000000..9dac20764 --- /dev/null +++ b/docs/enforce.md @@ -0,0 +1,921 @@ +## Enforce +For assertions, vest is bundled with [Enforce](https://npmjs.com/package/n4s). Enforce is a validation assertions library. It allows you to run your data against rules and conditions and test whether it passes your validations. It is intended for validation logic that gets repeated over and over again and should not be written manually. It comes with a wide-variety of pre-built rules, but it can also be extended to support your own repeated custom logic. + +The way Enforce operates is similar to most common assertion libraries. You pass it a value, and one or more rules to test your value against - if the validation fails, it throws an Error, otherwise - it will move on to the next rule rule in the chain. + +```js +import { enforce } from 'vest' + +enforce(4) + .isNumber(); +// passes + +enforce(4) + .isNumber() + .greaterThan(2); +// passes + +enforce(4) + .lessThan(2) // throws an error, will not carry on to the next rule + .greaterThan(3); +``` + +## Content +- [List of Enforce rules](#list-of-enforce-rules) +- [Custom Enforce Rules](#custom-enforce-rules) + +Enforce exposes all predefined and custom rules. You may use chaining to make multiple enfocements for the same value. + +## List of Enforce rules +Enforce rules are functions that allow you to test your data against different criteria. The following rules are supported out-of-the-box. + +- [equals](#equals) +- [notEquals](#notequals) +- [isEmpty](#isempty) +- [isNotEmpty](#isnotempty) +- [isNumeric](#isnumeric) +- [isNotNumeric](#isnotnumeric) +- [greaterThan](#greaterthan) +- [greaterThanOrEquals](#greaterthanorequals) +- [lengthEquals](#lengthequals) +- [lengthNotEquals](#lengthnotequals) +- [lessThan](#lessthan) +- [lessThanOrEquals](#lessthanorequals) +- [longerThan](#longerthan) +- [longerThanOrEquals](#longerthanorequals) +- [numberEquals](#numberequals) +- [numberNotEquals](#numbernotequals) +- [shorterThan](#shorterthan) +- [shorterThanOrEquals](#shorterthanorequals) +- [matches](#matches) +- [notMatches](#notmatches) +- [inside](#inside) +- [notInside](#notinside) +- [isTruthy](#istruthy) +- [isFalsy](#isfalsy) +- [isArray](#isarray) +- [isNotArray](#isnotarray) +- [isNumber](#isnumber) +- [isNotNumber](#isnotnumber) +- [isString](#isstring) +- [isNotString](#isnotstring) +- [isOdd](#isodd) +- [isEven](#iseven) + +### equals +#### Description +Checks if your enforced value strictly equals (`===`) another. + +It is not recommended to use this rule to compare arrays or objects, as it does not perform any sort of deep comparison on the value. + +For numeric value comparison, you should use `numberEquals`, which coerces numeric strings into numbers before comparing. + +#### Arguments +* `value`: Any value you wish to check your enforced value against + +#### Usage examples: + +```js +enforce(1).equals(1); + +enforce('hello').equals('hello'); + +const a = [1, 2, 3]; + +enforce(a).equals(a); +// passes +``` + +```js +enforce('1').equals(1); +enforce([1, 2, 3]).equals([1, 2, 3]); +// throws +``` + + +### notEquals +#### Description +Checks if your enforced value does not strictly equal (`===`) another. + +Reverse implementation of `equals`. + +#### Usage examples: + +```js +enforce('1').notEquals(1); +enforce([1, 2, 3]).notEquals([1, 2, 3]); +// passes +``` + +```js +enforce(1).notEquals(1); +enforce('hello').notEquals('hello'); + +const a = [1, 2, 3]; + +enforce(a).notEquals(a); +// throws +``` + + +### isEmpty +#### Description +Checks if your enforced value is empty, false, zero, null or undefined. + +Expected results are: +* object: checks against count of keys (`0` is empty) +* array/string: checks against length. (`0` is empty) +* number: checks the value of the number. (`0` and `NaN` are empty) +* boolean: `false` is empty. +* undefined/null: are both empty. + +#### Usage examples: + +```js +enforce([]).isEmpty(); +enforce('').isEmpty(); +enforce({}).isEmpty(); +enforce(0).isEmpty(); +enforce(NaN).isEmpty(); +enforce(undefined).isEmpty(); +enforce(null).isEmpty(); +enforce(false).isEmpty(); +// passes +``` + +```js +enforce([1]).isEmpty(); +enforce('1').isEmpty(); +enforce({1:1}).isEmpty(); +enforce(1).isEmpty(); +enforce(true).isEmpty(); +// throws +``` + + +### isNotEmpty +#### Description +Checks that your enforced value is not empty, false, or zero. +Reverse implementation of `isEmpty`. + +#### Usage examples: + +```js +enforce([1]).isNotEmpty(); +enforce('1').isNotEmpty(); +enforce({1:1}).isNotEmpty(); +// passes +``` + +```js +enforce([]).isNotEmpty(); +enforce('').isNotEmpty(); +enforce({}).isNotEmpty(); +enforce(0).isNotEmpty(); +// throws +``` + + +### isNumeric +#### Description +Checks if a value is a representation of a real number + +#### Usage examples: + +```js +enforce(143).isNumeric(); +enforce('143').isNumeric(); +// passes +``` + +```js +enforce(NaN).isNumeric(); +enforce('1hello').isNumeric(); +enforce('hi').isNumeric(); +// throws +``` + + +### isNotNumeric +#### Description +Checks if a value is not a representation of a real number. +Reverse implementation of `isNumeric`. + +#### Usage examples: + +```js +enforce(NaN).isNotNumeric(); +enforce('Hello World!').isNotNumeric(); +// passes +``` + +```js +enforce(731).isNotNumeric(); +enforce('42').isNotNumeric(); +// throws +``` + + +### greaterThan + +- alias: `gt` + +#### Description +Checks that your numeric enforced value is larger than a given numeric value. + +#### Arguments +* `value`: `number | string` | A numeric value against which you want to check your enforced value. + +Strings are parsed using `Number()`, values which are non fully numeric always return false; + +#### Usage + +```js +enforce(1).greaterThan(0); +enforce('10').greaterThan(0); +enforce(900).gt('100'); +// passes +``` + +```js +enforce(100).greaterThan(100); +enforce('100').greaterThan(110); +enforce([100]).gt(1); +// throws +``` + + +### greaterThanOrEquals +- alias: `gte()` + +#### Description +Checks that your numeric enforced value is larger than or equals to a given numeric value. + +#### Arguments +* `value`: `number | string` | A numeric value against which you want to check your enforced value. + +Strings are parsed using `Number()`, values which are non fully numeric always return false; + +#### Usage + +```js +enforce(1).greaterThanOrEquals(0); +enforce('10').greaterThanOrEquals(0); +enforce(900).greaterThanOrEquals('100'); +enforce(100).greaterThanOrEquals('100'); +enforce(900).gte('900'); +enforce('1337').gte(1337); +// passes +``` + +```js +enforce(100).greaterThanOrEquals('120'); +enforce('100').greaterThanOrEquals(110); +enforce([100]).gte(1); +// throws +``` + + +### lengthEquals +#### Description +Checks that your enforced value is equal to the given number. + +#### Arguments +* `size`: `number` | the number which you would like your initial value to be tested against. + +The `value` argument can be of the following types: +* array: checks against length. +* string: checks against length. + +#### Usage examples: + +```js +enforce([1]).lengthEquals(1); +enforce('a').lengthEquals(1); +// passes +``` + +```js +enforce([1, 2]).lengthEquals(1); +enforce('').lengthEquals(1); +// throws +``` + +### lengthNotEquals +#### Description +Checks that your enforced value is not equal to the given number. +Reverse implementation of `lengthEquals`. + +#### Arguments +* `size`: `number` | the number which you would like your initial value to be tested against. + +The `value` argument can be of the following types: +* array: checks against length. +* string: checks against length. + +#### Usage examples: + +```js +enforce([1]).lengthNotEquals(0); +enforce('a').lengthNotEquals(3); +// passes +``` + +```js +enforce([1]).lengthNotEquals(1); +enforce('').lengthNotEquals(0); +// throws +``` + + +### lessThan + +- alias: `lt()` + +#### Description +Checks that your numeric enforced value is smaller than a given numeric value. + +#### Arguments +* `value`: `number | string` | A numeric value against which you want to check your enforced value. + +Strings are parsed using `Number()`, values which are non fully numeric always return false; + +#### Usage + +```js +enforce(0).lessThan(1); +enforce(2).lessThan('10'); +enforce('90').lt(100); +// passes +``` + +```js +enforce(100).lessThan(100); +enforce('110').lessThan(100); +enforce([0]).lt(1); +// throws +``` + + +### lessThanOrEquals + +- alias: `lte()` + +#### Description +Checks that your numeric enforced value is smaller than or equals to a given numeric value. + +#### Arguments +* `value`: `number | string` | A numeric value against which you want to check your enforced value. + +Strings are parsed using `Number()`, values which are non fully numeric always return false; + +#### Usage + +```js +enforce(0).lessThanOrEquals(1); +enforce(2).lessThanOrEquals('10'); +enforce('90').lte(100); +enforce(100).lte('100'); +// passes +``` + +```js +enforce(100).lessThanOrEquals(90); +enforce('110').lessThanOrEquals(100); +enforce([0]).lte(1); +// throws +``` + + +### longerThan +#### Description +Checks that your enforced value is longer than a given number. + +#### Arguments +* `size`: `number` | the number which you would like your initial value to be tested against. + +The `value` argument can be of the following types: +* array: checks against length. +* string: checks against length. + +#### Usage examples: + +```js +enforce([1]).longerThan(0); +enforce('ab').longerThan(1); +// passes +``` + +```js +enforce([1]).longerThan(2); +enforce('').longerThan(0); +// throws +``` + + +### longerThanOrEquals +#### Description +Checks that your enforced value is longer than or equals to a given number. + +#### Arguments +* `size`: `number` | the number which you would like your initial value to be tested against. + +The `value` argument can be of the following types: +* array: checks against length. +* string: checks against length. + +#### Usage examples: + +```js +enforce([1]).longerThanOrEquals(0); +enforce('ab').longerThanOrEquals(1); +enforce([1]).longerThanOrEquals(1); +enforce('a').longerThanOrEquals(1); +// passes +``` + +```js +enforce([1]).longerThanOrEquals(2); +enforce('').longerThanOrEquals(1); +// throws +``` + + +### numberEquals +#### Description +Checks that your numeric enforced value is equals another value. + +#### Arguments +* `value`: `number | string` | A numeric value against which you want to check your enforced value. + +Strings are parsed using `Number()`, values which are non fully numeric always return false; + +#### Usage + +```js +enforce(0).numberEquals(0); +enforce(2).numberEquals('2'); +// passes +``` + +```js +enforce(100).numberEquals(10); +enforce('110').numberEquals(100); +enforce([0]).numberEquals(1); +// throws +``` + + +### numberNotEquals +#### Description +Checks that your numeric enforced value does not equal another value. +Reverse implementation of `numberEquals`. + +#### Arguments +* `value`: `number | string` | A numeric value against which you want to check your enforced value. + +Strings are parsed using `Number()`, values which are non fully numeric always return false; + +#### Usage + +```js +enforce(2).numberNotEquals(0); +enforce('11').numberNotEquals('10'); +// passes +``` + +```js +enforce(100).numberNotEquals(100); +enforce('110').numberNotEquals(100); +// throws +``` + + +### shorterThan +#### Description +Checks that your enforced value is shorter than a given number. + +#### Arguments +* `size`: `number` | the number which you would like your initial value to be tested against. + +The `value` argument can be of the following types: +* array: checks against length. +* string: checks against length. + +#### Usage examples: + +```js +enforce([]).shorterThan(1); +enforce('a').shorterThan(2); +// passes +``` + +```js +enforce([1]).shorterThan(0); +enforce('').shorterThan(0); +// throws +``` + + +### shorterThanOrEquals +#### Description +Checks that your enforced value is shorter than or equals to a given number. + +#### Arguments +* `size`: `number` | the number which you would like your initial value to be tested against. + +The `value` argument can be of the following types: +* array: checks against length. +* string: checks against length. + +#### Usage examples: + +##### Passing examples: +```js +enforce([]).shorterThanOrEquals(1); +enforce('a').shorterThanOrEquals(2); +enforce([]).shorterThanOrEquals(0); +enforce('a').shorterThanOrEquals(1); +// passes +``` + +```js +enforce([1]).shorterThanOrEquals(0); +enforce('ab').shorterThanOrEquals(1); +// throws +``` + + +### matches +#### Description +Checks if a value contains a regex match. + +#### Arguments +* `regexp`: either a `RegExp` object, or a RegExp valid string + +#### Usage examples: + +```js +enforce(1984).matches(/[0-9]/); +enforce(1984).matches('[0-9]'); +enforce('1984').matches(/[0-9]/); +enforce('1984').matches('[0-9]'); +enforce('198four').matches(/[0-9]/); +enforce('198four').matches('[0-9]'); +// passes +``` + +```js +enforce('ninety eighty four').matches(/[0-9]/); +enforce('ninety eighty four').matches('[0-9]'); +// throws +``` + + +### notMatches +#### Description +Checks if a value does not contain a regex match. +Reverse implementation of `matches`. + +#### Usage examples: + +```js +enforce(1984).notMatches(/[0-9]/); +// throws +``` + +```js +enforce('ninety eighty four').notMatches('[0-9]'); +// passes +``` + + +### inside +#### Description +Checks if your enforced value is contained in another array or string. +Your enforced value can be of the following types: +* `string` +* `number` +* `boolean` + +#### Arguments +* `container`: a `string` or an `array` which may contain the value specified. + +#### Usage examples: + +##### inside: array +Checks for membership in an array. + +- string: checks if a string is an element in an array + +```js +enforce('hello').inside(['hello', 'world']); +// passes +``` + +```js +enforce('hello!').inside(['hello', 'world']); +// throws +``` +- number: checks if a number is an element in an array + +```js +enforce(1).inside([1, 2]); +// passes +``` + +```js +enforce(3).inside([1, 2]); +// throws +``` + +- boolean: checks if a number is an element in an array + +```js +enforce(false).inside([true, false]); +// passes +``` + +```js +enforce(true).inside([1,2,3]); +// throws +``` + +##### inside: string +- string: checks if a string is inside another string + +```js +enforce('da').inside('tru dat.'); +// passes +``` + +```js +enforce('ad').inside('tru dat.'); +// throws +``` + + +### notInside +#### Description +Checks if a given value is not contained in another array or string. +Reverse implementation of `inside`. + +#### Usage examples: + +```js +enforce('ad').notInside('tru dat.'); +enforce('hello!').notInside(['hello', 'world']); +// passes +``` + +```js +enforce('hello').notInside(['hello', 'world']); +enforce('da').notInside('tru dat.'); +// throws +``` + + +### isTruthy +#### Description +Checks if a value is truthy; Meaning: if it can be coerced into boolean `true`. +Anything not in the following list is considered to be truthy. + +* `undefined` +* `null` +* `false` +* `0` +* `NaN` +* empty string (`""`) + +#### Usage examples: + +```js +enforce("hello").isTruthy(); +enforce(true).isTruthy(); +enforce(1).isTruthy(); +// passes +``` + +```js +enforce(false).isTruthy(); +enforce(null).isTruthy(); +enforce(undefined).isTruthy(); +enforce(0).isTruthy(); +enforce(NaN).isTruthy(); +enforce("").isTruthy(); +// throws +``` + + +### isFalsy +#### Description +Checks if a value is falsy; Meaning: if it can be coerced into boolean `false`. +Reverse implementation of `isTruthy`. + +Anything not in the following list is considered to be truthy: +* `undefined` +* `null` +* `false` +* `0` +* `NaN` +* empty string (`""`) + +#### Usage examples: + +```js +enforce(false).isFalsy(); +enforce(0).isFalsy(); +enforce(undefined).isFalsy(); +// passes +``` + +```js +enforce(1).isFalsy(); +enforce(true).isFalsy(); +enforce('hi').isFalsy(); +// throws +``` + + +### isArray +#### Description +Checks if a value is of type `Array`. + +#### Usage examples: + +```js +enforce(['hello']).isArray(); +// passes +``` + +```js +enforce('hello').isArray(); +// throws +``` + + +### isNotArray +#### Description +Checks if a value is of any type other than `Array`. +Reverse implementation of `isArray`. + +#### Usage examples: + +```js +enforce(['hello']).isNotArray(); +// throws +``` + +```js +enforce('hello').isNotArray(); +// passes +``` + + +### isNumber +#### Description +Checks if a value is of type `number`. + +#### Usage examples: + +```js +enforce(143).isNumber(); +enforce(NaN).isNumber(); // (NaN is of type 'number!') +// passes +``` + +```js +enforce([]).isNumber(); +enforce("143").isNumber(); +// throws +``` + + +### isNotNumber +#### Description +Checks if a value is of any type other than `number`. +Reverse implementation of `isNumber`. + +#### Usage examples: + +```js +enforce('143').isNotNumber(); +enforce(143).isNotNumber(); +// passes +``` + +```js +enforce(143).isNotNumber(); +enforce(NaN).isNotNumber(); // throws (NaN is of type 'number!') +// throws +``` + + +### isString +#### Description +Checks if a value is of type `String`. + +#### Usage examples: + +```js +enforce('hello').isString(); +// passes +``` + +```js +enforce(['hello']).isString(); +enforce(1984).isString(); +// throws +``` + + +### isNotString +#### Description +Checks if a value is of any type other than `String`. +Reverse implementation of `isString`. + +#### Usage examples: + +```js +enforce('hello').isNotString(); +// throws +``` + +```js +enforce(['hello']).isNotString(); +// passes +``` + + +### isOdd +#### Description +Checks if a value is an odd numeric value. + +#### Usage examples: + +```js +enforce('1').isOdd(); +enforce(9).isOdd(); +// passes +``` + +```js +enforce(2).isOdd(); +enforce('4').isOdd(); +enforce('1withNumber').isOdd(); +enforce([1]).isOdd(); +// throws +``` + + +### isEven +#### Description +Checks if a value is an even numeric value. + +#### Usage examples: + +```js +enforce(0).isEven(); +enforce('2').isEven(); +// passes +``` + +```js +enforce(1).isEven(); +enforce('3').isEven(); +enforce('2withNumber').isEven(); +enforce([0]).isEven(); +// throws +``` + + +# Custom enforce rules +To make it easier to reuse logic across your application, sometimes you would want to encapsulate bits of logic in rules that you can use later on, for example, "what's considered a valid email". + +Your custom rules are essentially a single javascript object containing your rules. +```js +const myCustomRules = { + isValidEmail: (value) => value.indexOf('@') > -1, + hasKey: (value, {key}) => value.hasOwnProperty(key), + passwordsMatch: (passConfirm, options) => passConfirm === options.passConfirm && options.passIsValid +} +``` +Just like the predefined rules, your custom rules can accepts two parameters: +* `value` The actual value you are testing against. +* `args` (optional) the arguments which you pass on when running your tests. + +You can extend enforce with your custom rules by creating a new instance of `Enforce` and adding the rules object as the argument. + +```js +import { Enforce } from 'vest'; + +const myCustomRules = { + isValidEmail: (value) => value.indexOf('@') > -1, + hasKey: (value, key) => value.hasOwnProperty(key), + passwordsMatch: (passConfirm, options) => passConfirm === options.passConfirm && options.passIsValid +} + +const enforce = new Enforce(myCustomRules); + +enforce(user.email).isValidEmail(); +``` diff --git a/docs/enforce.md.bak b/docs/enforce.md.bak new file mode 100644 index 000000000..3a30e5846 --- /dev/null +++ b/docs/enforce.md.bak @@ -0,0 +1,60 @@ +## Enforce +For assertions, vest is bundled with [Enforce](https://npmjs.com/package/n4s). Enforce is a validation assertions library. It allows you to run your data against rules and conditions and test whether it passes your validations. It is intended for validation logic that gets repeated over and over again and should not be written manually. It comes with a wide-variety of pre-built rules, but it can also be extended to support your own repeated custom logic. + +The way Enforce operates is similar to most common assertion libraries. You pass it a value, and one or more rules to test your value against - if the validation fails, it throws an Error, otherwise - it will move on to the next rule rule in the chain. + +```js +import { enforce } from 'vest' + +enforce(4) + .isNumber(); +// passes + +enforce(4) + .isNumber() + .greaterThan(2); +// passes + +enforce(4) + .lessThan(2) // throws an error, will not carry on to the next rule + .greaterThan(3); +``` + +## Content +- [List of Enforce rules](#list-of-enforce-rules) +- [Custom Enforce Rules](#custom-enforce-rules) + +Enforce exposes all predefined and custom rules. You may use chaining to make multiple enfocements for the same value. + +{{LIST_OF_ENFORCE_RULES}} + +# Custom enforce rules +To make it easier to reuse logic across your application, sometimes you would want to encapsulate bits of logic in rules that you can use later on, for example, "what's considered a valid email". + +Your custom rules are essentially a single javascript object containing your rules. +```js +const myCustomRules = { + isValidEmail: (value) => value.indexOf('@') > -1, + hasKey: (value, {key}) => value.hasOwnProperty(key), + passwordsMatch: (passConfirm, options) => passConfirm === options.passConfirm && options.passIsValid +} +``` +Just like the predefined rules, your custom rules can accepts two parameters: +* `value` The actual value you are testing against. +* `args` (optional) the arguments which you pass on when running your tests. + +You can extend enforce with your custom rules by creating a new instance of `Enforce` and adding the rules object as the argument. + +```js +import { Enforce } from 'vest'; + +const myCustomRules = { + isValidEmail: (value) => value.indexOf('@') > -1, + hasKey: (value, key) => value.hasOwnProperty(key), + passwordsMatch: (passConfirm, options) => passConfirm === options.passConfirm && options.passIsValid +} + +const enforce = new Enforce(myCustomRules); + +enforce(user.email).isValidEmail(); +``` diff --git a/docs/exclusion.md b/docs/exclusion.md new file mode 100644 index 000000000..09abe3467 --- /dev/null +++ b/docs/exclusion.md @@ -0,0 +1,45 @@ +# Excluding and including tests + +When performing validations in real world scenarios, you may need to only run tests of a single field in your suite, or skip certain tests according to some logic. That's why Vest includes `vest.skip()` and `vest.only()`. + +`vest.skip()` and `vest.only()` are functions that take a name of test, or a list of names to either include or exclude fields from being validated. They should be called from the body of `validate` callback, and in order for them to take effect, they should be called before anything else. + +Fields that were skipped (or not included when `only` was used) will appear in the [result object](./result) in the `skipped` array. + +### Only running specific tests +When validating upon user interactions, you will usually want to only validate the input the user currently interacts with to prevent errors appearing in unrelated places. For this you can use `vest.only()` with the name of the test currently being validated. + +In the example below we're assuming the argument `fieldName` is being populated with the name of the field we want to test. If none is passed, the call to `only` will be ignored, and all tests will run as usual. This allows us to test each field at a time during interaction, but test all on form submission. + +```js +import vest, { validate, enforce, test } from 'vest'; + +const v = (data, fieldName) => validate('New User', () => { + vest.only(fieldName); + + test('username', 'Username is invalid', () => {/* some validation logic*/}); + test('email', 'Email is invalid', () => {/* some validation logic*/}); + test('password', 'Password is invalid', () => {/* some validation logic*/}); +}); +``` + +### Skipping tests +There are not many cases for skipping tests, but they do exist. For example, when you with to prevent validation of a promo code when none provided. + +In this case, and in similar others, you can use `vest.skip()`. When called, it will only skip the specified fields, all other tests will run as they should. + +```js +import vest, { validate, enforce, test } from 'vest'; + +const v = (data) => validate('purchase', () => { + if (!data.promo) { + vest.skip('promo'); + } + + // this test won't run when data.promo is falsy. + test('promo', 'Promo code is invalid', () => {/* some validation logic*/}); +}); +``` + +**Read next about:** +- [Accessing intermediate suite result](./draft). diff --git a/docs/getting_started.md b/docs/getting_started.md new file mode 100644 index 000000000..551ccd8c4 --- /dev/null +++ b/docs/getting_started.md @@ -0,0 +1,50 @@ +## Installation +To install the stable version of Vest: + +``` +npm install vest +``` + +You can also add Vest directly as a script tag to your page: + +```html + +``` + +## Writing tests +Writing Vest tests is very much like writing unit tests, with only slight differences. Instead of using `describe/it/expect`, you will use `validate/test/enforce`. + +- `validate`: Your validation suite wrapper. +- `test`: A single validation unit, validating a field or a single value. It takes the name of the field being validated, a failure message (to display to the user), and a callback function which contains the validation logic. [Read more about test](./test). +- `enforce`: This is our assertion function. We’ll use it to make sure our validations pass. [Read more about enforce](./enforce). + +The `validate` function takes the following arguments: + +- `name`: The name of the current validation suite. Similar to a `describe` message. +- `callback`: The validation suite's body where your tests reside. + +A simple validation suite would look somewhat like this: + +```js +import { validate, test, enforce } from ‘vest’; + +export default (data) => vest('NewUserForm', () => { +    test('username', 'Must be between 2 and 10 chars', () => { +        enforce(data.username) +            .longerThanOrEquals(2) +            .shorterThan(10); +    }); + +    test('password', 'Must contain at least one digit', () => { +        enforce(data.password) +            .matches(/(?=.*[0-9])/); +    }); +}); +``` + +In the above example we validate a form called `NewUserForm` containing username and a password. + +**Read next about:** +- [Vest's result object](./result). +- [Using the test function](./test). +- [Asserting with enforce](./enforce). diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..2cce5d232 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,31 @@ + + + + + Vest - Validation Test + + + + + + + + +
+ + + + + + + diff --git a/docs/result.md b/docs/result.md new file mode 100644 index 000000000..4fe4ee11f --- /dev/null +++ b/docs/result.md @@ -0,0 +1,139 @@ +# Vest's result object +Each `validate` run results in a results object that holds all the information regarding the current run, and methods to easily interact with the data. + +An result object would look somewhat like this: +```js +{ + 'name': 'formName', // The name of the validation suite + 'testCount': 0, // Overall count of test runs in the suite + 'errorCount': 0, // Overall count of errors in the suite + 'warnCount': 0, // Overall count of warnings in the suite + 'skipped': Array [], // List of all skipped fields + 'tested': Array [], // Mirror of the `skipped` array, contains all the tests that did run + 'tests': Object { // An object containing all non-skipped tests + 'fieldName': Object { // Name of each field + 'errorCount': 0, // Error count per field + 'errors': Array [], // Array of error messages fer field (may be undefined) + 'warnings': Array [], // Array of warning messages fer field (may be undefined) + 'testCount': 0, // Test count per field + 'warnCount': 0, // Warning count per field + }, + } +} +``` +Along with these values, the result object exposes the following methods: + +## `hasErrors` and `hasWarnings` functions + +If you only need to know if a certain field has validation errors or warnings but don't really care which they are, you can use `hasErrors` or `hasWarnings` functions. + +```js +resultObject.hasErrors('username'); +// true + +resultObject.hasWarnings('password'); +// false +``` +In case you want to know whether the whole suite has errors or warnings (to prevent submit, for example), you can use the same functions, just without specifying a field + +```js +resultObject.hasErrors(); +// true + +resultObject.hasWarnings(); +// true +``` + +## `getErrors` and `getWarnings` functions +These functions return an array of errors for the specified field. If no field specified, it returns an object with all fields as keys and their error arrays as values. + +```js +resultObject.getErrors('username'); +// ['Username is too short', `Username already exists`] + +resultObject.getWarnings('password'); +// ['Password must contain special characters'] +``` + +If there are no errors for the field, the function defaults to an empty array: +```js +resultObject.getErrors('username'); +// [] + +resultObject.getWarnings('username'); +// [] +``` +**Note** If you did not specify error messages for your tests, your errors array will be empty as well. In such case you should always rely on `.hasErrors()` instead. + +## `.done()` +Done is a function that can be chained to your validation suite, and allows invoking callbacks whenever a specific, or all, tests finish their validation - regardless of the validation result. + +If we specify a fieldname in our `done` call, vest will not wait for the whole suite to finish before running our callback. It will invoke immediately when all tests with that given name finished running. + +`.done()` calls can be infinitely chained after one another, and as the validation suite completes - they will all run immediately. + +`done` takes one or two arguments: +| Name | Type | Optional | Description +|-|-|-|- +| `fieldName` | `String` | Yes | If passed, current done call will not wait for the whole suite to complete, but instead wait for a certain field to finish. +| `callback` | `Function` | No | A callback to be run when either the whole suite or the specified field finished running. + +The result object is being passed down to the `done` object as an argument. + +**Example** + +In the below example, the `done` callback for `UserName` may run before the whole suite finishes. Only when the rest of the suite finishes, it will call the other two done callbacks that do not have a fieldname specified. + +```js +import { validate, test, enforce } from 'vest'; + +validate('SendEmailForm', () => { + + test('UserEmail', 'Marked as spam address', async () => await isKnownSpammer(address)); + + test('UserName', 'must not be blacklisted', async () => await isBlacklistedUser(username)); + +}).done('UserName', (res) => { + if (res.hasErrors('UserName')) { + showUserNameErrors(res.errors) + } +}).done((output) => { + reportToServer(output); +}).done((output) => { + promptUserQuestionnaire(output); +}); +``` + +## `.cancel()` +When running your validation suite multiple times in a short amount of time - for example, when validating user inputs upon change, your async validations may finish after you already started running the suite again. This will cause the `.done()` callback of the previous run to be run in proximity to the `.done()` callback of the current run. + +Depending on what you do in your callbacks, this can lead to wasteful actions, or to validation state rapidly changing in front of the user's eyes. + +To combat this, there's the `.cancel()` callback, which cancels any pending `.done()` callbacks. + +You can use it in many ways, but the simplistic way to look at it is this: You need to keep track of your cancel callback in a scope that's still going to be accessible in the next run. + +Example: + +```js +let cancel = null; + +// this is a simple event handler +const handleChange = (e) => { + + if (cancel) { + cancel(); // now, if cancel already exists, it will cancel any pending callbacks + } + + // you should ideally import your suite from somewhere else, this is here just for the demonstration + const result = validate('MyForm', () => { + // some async validations go here + }); + + result.done((res) => { + // do something + }); + + cancel = result.cancel; // save the cancel callback aside +} +``` diff --git a/docs/test.md b/docs/test.md new file mode 100644 index 000000000..9bbde3d40 --- /dev/null +++ b/docs/test.md @@ -0,0 +1,90 @@ +# Using the `test` function + +The `test` function is a represents a single case in your validation suite. It accepts following arguments: + +| Name | Type | Optional | Description +|-|-|-|- +| `name` | `String` | No | The name of the value or field being validated. +| `message` | `String` | Yes | An error message to display to the user in case of a failure. +| `callback` | `Function` | No | The actual validation logic for the given test. + +A test can either be synchronous or asynchronous, and it can either have a [severity](./warn) of `error` or of `warn`. + +## Failing a test + +There are three ways to fail a test: + +### Throwing an errorr inside your test body (using enforce) +Just like in most unit testing frameworks, a validation fails whenever an error is thrown inside the test body. The [`enforce`](./enforce) function throws an error throws an error whenever the enforced value does not meet the specified criteria. + +```js +// const username = 'Gina.Vandervort'; +// const password = 'Q3O'; + +test('username', 'Should be at least 3 charachters long', () => { + enforce(username).longerThanOrEquals(3); +}); // this test passes + +test('password', 'Should be at least 6 charachters long', () => { + enforce(password).longerThanOrEquals(6); // an error is thrown here +}); // this test fails +``` + +### Excplicitly returning false +To make it easy to migrate your existing validation logic into Vest, it also supports validations excplicitly returning `false` (and not any other falsy value) to represent failures. + +```js +// const username = 'Gina.Vandervort'; +// const password = 'Q3O'; + +test('username', 'Should be at least 3 charachters long', () => { + return username.length >= 3; // = true +}); // this test passes + +test('password', 'Should be at least 6 charachters long', () => { + return password.length >= 6; // = false +}); // this test fails +``` + +### Rejecting a Promise +This is only true for async tests, more on that below. + +## Asynchronous Tests + +Sometimes you need to validate your data with information not present in your current context, for example - data from the server, such as username availability. In those cases, you need to go out to the server and fetch data as part of your validation logic. + +An async test is declared by returning a [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) from your test body. When the promise resolves, your test passes, and when your promise rejects, it fails. + +```js +// Example using a promise +test('name', 'I always fail', async () => Promise.reject()); + +// Example using async/await +test('name', 'Should be unique', async () => { + return await doesUserExist(user); +}); +``` + +### Rejecting with a message +When performing validations on the server, your server might need to respond with different error messages. When rejecting with a string value, your string value will be picked up as the message to show to the user. + +```js +test('name', () => new Promise((resolve, reject) => { + fetch(`/checkUsername?name=${name}`) + .then(res => res.json) + .then(data => { + if (data.status === 'fail') { + reject(data.message); // rejects with message and marks the test as failing + } else { + resolve(); // completes. doesn't mark the test as failing + } + }); +})); +``` + +**Read next about:** +- [Warn only tests](./warn). +- [Asserting with enforce](./enforce). +- [Skipping or including tests](./exclusion). +- [Accessing intermediate suite result](./draft). + diff --git a/docs/warn.md b/docs/warn.md new file mode 100644 index 000000000..4ddc2d006 --- /dev/null +++ b/docs/warn.md @@ -0,0 +1,76 @@ +# Warn only tests +By default, a failing test has a severity of `error`. Sometimes you may need to lower the severity level of a given test to `warn` so that even when it fails, it should not prevent submission. An example for this would be validating password strength. + +To set a test's severity level to `warn`, you need to simply call Vest's warn function from your test body. + +```js +import vest, { validate, test, enfroce } from 'vest'; + +const result = validate('Password', () => { + + test('password', 'A password must have at least 6 characters', () => { + enforce(password).longerThan(5); + }); // this test has a severity level of `error` + + test('password', 'Your password strength is: WEAK', () => { + vest.warn(); + + enforce(password) + .matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]$/); + }); // this test has a severity level of `warn` + + test('password', 'Your password strength is: MEDIUM', () => { + vest.warn(); + + enforce(password) + .matches(/^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]$/); + }); // this test has a severity level of `warn` +}); +``` + +**Limitations when using vest.warn()** +- You may only use warn from within the body of a `test` function. +- When using `vest.warn()` in an async test you should call the `warn` function in the sync portion of your test (and not after an `await` call or in the Promise body). Ideally, you want to call `vest.warn()` at the top of your test function. + +```js + +// ✔ +test('password', async () => { + vest.warn(); + return await someAsyncFunction(); +}); + +// ✔ +test('password', () => { + vest.warn(); + return anAsyncFunction(); +}); + +// 🚨 This will result in an your warn() call not taking effect +test('password', async () => { + await someAsyncFunction(); + + vest.warn(); // 🚨 +}); + +// 🚨 This will result in an your warn() call not taking effect +test('password', () => { + return anAsyncFunction().then(() => { + vest.warn(); // 🚨 + }); +}); +``` + +### Using warning in result object +Just like you do with errors, you can access the errors in your validation warnings using these methods: + +```js +result.hasWarnings() // Returns whether any warnings are present in the suite. +result.hasWarnings('password') // Returns whether any warnings are present in the 'password' field. + +result.getWarnings() // Returns an object with all the fields that have warnings, and an array of warnings for each. +result.getWarnings('password') // Returns an array of warnings for the password field. +``` + +**Read next about:** +- [Vest's result object](./result). diff --git a/package.json b/package.json new file mode 100644 index 000000000..894f694ae --- /dev/null +++ b/package.json @@ -0,0 +1,51 @@ +{ + "name": "vest", + "version": "1.0.0", + "description": "Validation Test", + "main": "./dist/vest.min.js", + "author": "ealush", + "license": "MIT", + "scripts": { + "build": "rollup --config config/rollup.js -m", + "pretest": "npm run build", + "test": "jest --config=config/jest/jest.config.js -i", + "eslint": "eslint -c .eslintrc \"./src/**/*.js\"; exit 0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ealush/vest.git" + }, + "bugs": { + "url": "https://github.com/ealush/vest/issues" + }, + "homepage": "https://ealush.github.io/vest/", + "devDependencies": { + "@babel/cli": "^7.5.5", + "@babel/core": "^7.7.4", + "@babel/plugin-transform-object-assign": "^7.2.0", + "@babel/preset-env": "^7.7.4", + "@babel/register": "^7.5.5", + "anyone": "0.0.5", + "babel-eslint": "^10.0.1", + "babel-jest": "^24.9.0", + "babel-loader": "^8.0.6", + "babel-plugin-add-module-exports": "^1.0.2", + "cross-env": "^6.0.0", + "date-fns": "^2.0.1", + "eslint": "^6.7.1", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-jest": "^23.0.5", + "faker": "^4.1.0", + "jest": "^24.9.0", + "lodash": "^4.17.15", + "n4s": "^0.4.2", + "node-fetch": "^2.6.0", + "rollup": "^1.18.0", + "rollup-plugin-babel": "^4.3.2", + "rollup-plugin-commonjs": "^10.0.2", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-replace": "^2.2.0", + "rollup-plugin-terser": "^5.0.0", + "semver": "^6.3.0" + } +} diff --git a/scripts/constants.js b/scripts/constants.js new file mode 100644 index 000000000..61bce5bf2 --- /dev/null +++ b/scripts/constants.js @@ -0,0 +1,16 @@ +const PATCH_KEYWORD = 'patch'; +const MINOR_KEYWORD = 'minor'; +const MAJOR_KEYWORD = 'major'; + +const CHANGELOG_TITLES = { + [MAJOR_KEYWORD]: 'Breaking changes', + [MINOR_KEYWORD]: 'Additions', + [PATCH_KEYWORD]: 'Fixes and non breaking changes' +}; + +module.exports = { + PATCH_KEYWORD, + MINOR_KEYWORD, + MAJOR_KEYWORD, + CHANGELOG_TITLES +}; diff --git a/scripts/create_release.js b/scripts/create_release.js new file mode 100644 index 000000000..614fc7e1c --- /dev/null +++ b/scripts/create_release.js @@ -0,0 +1,51 @@ +const fetch = require('node-fetch'); + +const TITLE_DELIMITER = '\n\n'; + +const changelog = process.argv[2] || ''; + +function releaseUrl(repo) { + return `https://api.github.com/repos/${repo}/releases`; +} + +function postRelease({ + repo, + token, + tag, + body +}) { + console.log('posting release'); // eslint-disable-line + fetch(releaseUrl(repo), { + method: 'POST', + headers: { Authorization: `token ${token}` }, + body: JSON.stringify({ + tag_name: tag, + name: tag, + body + }) + }); +} + +function release({ repo, token, tag }) { + console.log('In release'); // eslint-disable-line + + if (!(changelog && token && repo)) { + return; + } + + const body = changelog.substr(changelog.indexOf(TITLE_DELIMITER) + TITLE_DELIMITER.length); + + postRelease({ + repo, + token, + tag, + body + }); +} + +release({ + repo: process.env.TRAVIS_REPO_SLUG, + token: process.env.GITHUB_TOKEN, + tag: process.env.NEXT_VERSION, + changelog +}); diff --git a/scripts/determine_change_level.js b/scripts/determine_change_level.js new file mode 100644 index 000000000..276688377 --- /dev/null +++ b/scripts/determine_change_level.js @@ -0,0 +1,20 @@ +const { MAJOR_KEYWORD, MINOR_KEYWORD, PATCH_KEYWORD } = require('./constants'); + +/** + * Determines semver level + * @param {String} message + * @return {String} change level + */ +const determineChangeLevel = (message) => { + if (message.toLowerCase().includes(`[${MAJOR_KEYWORD}]`)) { + return MAJOR_KEYWORD; + } + + if (message.toLowerCase().includes(`[${MINOR_KEYWORD}]`)) { + return MINOR_KEYWORD; + } + + return PATCH_KEYWORD; +}; + +module.exports = determineChangeLevel; diff --git a/scripts/get_diff.js b/scripts/get_diff.js new file mode 100644 index 000000000..b581d7f0b --- /dev/null +++ b/scripts/get_diff.js @@ -0,0 +1,35 @@ +const fetch = require('node-fetch'); + +function compareUrl(repo, [commit1, commit2]) { + return `https://api.github.com/repos/${repo}/compare/${commit1}...${commit2}`; +} + +function listMessages(commits = []) { + return commits.reduce((accumulator, { commit, author, sha }) => { + const [message] = commit.message.split('\n'); + const name = author.login || commit.author.name; + return `${accumulator}${sha.slice(0, 7)} ${message} (${name})\n`; + }, ''); +} + +function getCommitDiff(repo, branches, token) { + return fetch(compareUrl(repo, branches), { ...token && { headers: { Authorization: `token ${token}` } } }) + .then((res) => res.json()) + .catch(() => process.exit(1)); +} + +async function init({ + repo, + branches, + token +} = {}) { + const { commits } = await getCommitDiff(repo, branches, token); + const messages = listMessages(commits); + console.log(messages); // eslint-disable-line +} + +init({ + repo: process.env.TRAVIS_REPO_SLUG, + branches: ['master', process.env.TRAVIS_BRANCH], + token: process.env.GITHUB_TOKEN +}); diff --git a/scripts/get_next_version.js b/scripts/get_next_version.js new file mode 100644 index 000000000..4841f7a1c --- /dev/null +++ b/scripts/get_next_version.js @@ -0,0 +1,9 @@ +const semver = require('semver'); +const { version } = require('../package.json'); +const determineLevel = require('./determine_change_level'); + +const changeLevel = determineLevel(process.argv[2] || ''); + +const nextVersion = semver.inc(version, changeLevel); + +console.log(nextVersion); // eslint-disable-line diff --git a/scripts/handle_changes.sh b/scripts/handle_changes.sh new file mode 100644 index 000000000..1b43421ad --- /dev/null +++ b/scripts/handle_changes.sh @@ -0,0 +1,13 @@ +echo "Script: handle_changes" + +echo "Getting diff" +export COMMIT_MESSAGES=$(node ./scripts/get_diff.js) + +echo "Commit message is:" +echo $COMMIT_MESSAGES + +echo "Getting next version" +export NEXT_VERSION=$(node ./scripts/get_next_version.js "$COMMIT_MESSAGES") + +echo "Next version is:" +echo $NEXT_VERSION diff --git a/scripts/prep_docs.js b/scripts/prep_docs.js new file mode 100644 index 000000000..99f6d4bb4 --- /dev/null +++ b/scripts/prep_docs.js @@ -0,0 +1,10 @@ +const fs = require('fs'); + +const readme = fs.readFileSync('./README.md', 'utf8'); +const n4sRules = fs.readFileSync('./node_modules/n4s/docs/rules.md', 'utf8').replace('\n#', '\n##'); +const enforceDoc = fs.readFileSync('./docs/enforce.md.bak', 'utf8'); + +const nextDoc = enforceDoc.replace('{{LIST_OF_ENFORCE_RULES}}', n4sRules); + +fs.writeFileSync('./docs/enforce.md', nextDoc); +fs.writeFileSync('./docs/README.md', readme); diff --git a/scripts/prepare_next.sh b/scripts/prepare_next.sh new file mode 100755 index 000000000..59bbd9619 --- /dev/null +++ b/scripts/prepare_next.sh @@ -0,0 +1,3 @@ +echo "Preparing next tag" + +npm version "${NEXT_VERSION}-next-${TRAVIS_COMMIT:(0):6}" --no-git-tag diff --git a/scripts/push_tag_to_master.sh b/scripts/push_tag_to_master.sh new file mode 100755 index 000000000..b365ad223 --- /dev/null +++ b/scripts/push_tag_to_master.sh @@ -0,0 +1,32 @@ +git config --global user.email "${GIT_NAME}@users.noreply.github.com" --replace-all +git config --global user.name $GIT_NAME + +echo "Removing old master" +git branch -D master + +echo "Switching to new master" +git checkout -b master + +echo "Bumping version" +npm version $NEXT_VERSION --no-git-tag + +echo "Rebuilding with current tag" +yarn build + +echo "Updating changelog" +CHANGELOG=$(node ./scripts/update_changelog.js) + +EMOJIS=(🚀 🤘 ✨ 🔔 🌈 🤯) +EMOJI=${EMOJIS[$RANDOM % ${#EMOJIS[@]}]} + +git add . +git commit -m "$EMOJI Vest update: $NEXT_VERSION" -m "$COMMIT_MESSAGES" + +echo "Pushing to master" +git push https://${GITHUB_TOKEN}@github.com/$TRAVIS_REPO_SLUG.git master + +git tag $NEXT_VERSION +git push origin $NEXT_VERSION + +echo "Publishing Release" +node ./scripts/create_release.js "$CHANGELOG" diff --git a/scripts/update_changelog.js b/scripts/update_changelog.js new file mode 100644 index 000000000..e2750555e --- /dev/null +++ b/scripts/update_changelog.js @@ -0,0 +1,53 @@ + +const fs = require('fs'); +const { format } = require('date-fns'); +const determineLevel = require('./determine_change_level'); +const { MAJOR_KEYWORD, MINOR_KEYWORD, PATCH_KEYWORD, CHANGELOG_TITLES } = require('./constants'); + +const CHANGE_LEVELS = [MAJOR_KEYWORD, MINOR_KEYWORD, PATCH_KEYWORD]; + +const version = process.env.NEXT_VERSION; +const gitLog = process.env.COMMIT_MESSAGES; + +/** + * Takes commit history and groups messages by change level + * @param {String} gitLog commit history + * @return {Object} an object with keys matching the semver levels + */ +const groupMessages = (gitLog) => gitLog.split('\n').reduce((accumulator, current) => { + const level = determineLevel(current); + + if (!CHANGE_LEVELS.some((word) => current.toLowerCase().includes(word.toLowerCase()))) { + return accumulator; + } + + if (!accumulator[level]) { + accumulator[level] = `### ${CHANGELOG_TITLES[level]}\n`; + } + + return Object.assign(accumulator, { + [level]: `${accumulator[level]}- ${current}\n` + }); +}, {}); + +const updateChangelog = () => { + const groupedMessages = groupMessages(gitLog); + + const changelogTitle = `## [${version}] - ${format(new Date(), 'yyyy-MM-dd')}\n`; + + const versionLog = [ + changelogTitle, + groupedMessages[MAJOR_KEYWORD], + groupedMessages[MINOR_KEYWORD], + groupedMessages[PATCH_KEYWORD] + ].filter(Boolean).join('\n'); + + const changelog = fs.readFileSync('./CHANGELOG.md', 'utf8').split('\n'); + changelog.splice(6, 0, versionLog); + + fs.writeFileSync('./CHANGELOG.md', changelog.join('\n')); + + console.log(versionLog); // eslint-disable-line +}; + +updateChangelog(); diff --git a/src/__snapshots__/spec.js.snap b/src/__snapshots__/spec.js.snap new file mode 100644 index 000000000..09d3eb830 --- /dev/null +++ b/src/__snapshots__/spec.js.snap @@ -0,0 +1,141 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`General scenario tests Async tests Should match snapshot 1`] = ` +Object { + "errorCount": 1, + "name": "molestias-veritatis-deserunt", + "skipped": Array [], + "testCount": 2, + "tested": Array [ + "doloribus-enim-quisquam", + ], + "tests": Object { + "doloribus-enim-quisquam": Object { + "errorCount": 1, + "errors": Array [ + "Fuga odit ut quidem autem dolores ipsam.", + ], + "testCount": 2, + "warnCount": 0, + }, + }, + "warnCount": 0, +} +`; + +exports[`General scenario tests Base case Should match snapshot 1`] = ` +Object { + "errorCount": 1, + "name": "eveniet-maxime-ea", + "skipped": Array [], + "testCount": 2, + "tested": Array [ + "sed-minima-adipisci", + "non-rem-dolorem", + ], + "tests": Object { + "non-rem-dolorem": Object { + "errorCount": 0, + "testCount": 1, + "warnCount": 0, + }, + "sed-minima-adipisci": Object { + "errorCount": 1, + "errors": Array [ + "Aliquam reprehenderit iure omnis assumenda eligendi enim id praesentium numquam.", + ], + "testCount": 1, + "warnCount": 0, + }, + }, + "warnCount": 0, +} +`; + +exports[`General scenario tests Exclusion via \`only\` Should match snapshot 1`] = ` +Object { + "errorCount": 0, + "name": "inventore-quis-impedit", + "skipped": Array [ + "autem", + "soluta", + ], + "testCount": 1, + "tested": Array [ + "doloribus-enim-quisquam", + ], + "tests": Object { + "doloribus-enim-quisquam": Object { + "errorCount": 0, + "testCount": 1, + "warnCount": 0, + }, + }, + "warnCount": 0, +} +`; + +exports[`General scenario tests Exclusion via \`skip\` Should match snapshot 1`] = ` +Object { + "errorCount": 0, + "name": "corrupti-alias-autem", + "skipped": Array [ + "doloribus-enim-quisquam", + ], + "testCount": 1, + "tested": Array [ + "autem", + ], + "tests": Object { + "autem": Object { + "errorCount": 0, + "testCount": 1, + "warnCount": 1, + "warnings": Array [ + "Temporibus ex ex.", + ], + }, + }, + "warnCount": 1, +} +`; + +exports[`General scenario tests Tests with warnings Should match snapshot 1`] = ` +Object { + "errorCount": 0, + "name": "corrupti-alias-autem", + "skipped": Array [ + "doloribus-enim-quisquam", + ], + "testCount": 2, + "tested": Array [ + "autem", + ], + "tests": Object { + "autem": Object { + "errorCount": 0, + "testCount": 2, + "warnCount": 1, + "warnings": Array [ + "Temporibus ex ex.", + ], + }, + }, + "warnCount": 1, +} +`; + +exports[`Vest exports All vest exports exist 1`] = ` +Object { + "Enforce": [Function], + "VERSION": Any, + "any": [Function], + "draft": [Function], + "enforce": [Function], + "only": [Function], + "skip": [Function], + "test": [Function], + "validate": [Function], + "warn": [Function], +} +`; diff --git a/src/constants.js b/src/constants.js new file mode 100644 index 000000000..163cfccc7 --- /dev/null +++ b/src/constants.js @@ -0,0 +1,4 @@ +/** + * @type {String} Version number derived from current tag. + */ +export const VERSION = VEST_VERSION; diff --git a/src/core/Context/index.js b/src/core/Context/index.js new file mode 100644 index 000000000..d7d17223f --- /dev/null +++ b/src/core/Context/index.js @@ -0,0 +1,34 @@ +import { singleton } from '../../lib'; + +/** + * Creates a new context object, and assigns it as a static property on Vest's singleton. + * @param {Object} parent Parent context. + */ +function Context(parent) { + singleton.use().ctx = this; + Object.assign(this, parent); +} + +/** + * Sets a testObject reference on context. + * @param {TestObject} A TestObject instance. + */ +Context.prototype.setCurrentTest = function(testObject) { + this.currentTest = testObject; +}; + +/** + * Removes current test from context. + */ +Context.prototype.removeCurrentTest = function() { + delete this.currentTest; +}; + +/** + * Clears stored instance from constructor function. + */ +Context.clear = function() { + singleton.use().ctx = null; +}; + +export default Context; diff --git a/src/core/Context/spec.js b/src/core/Context/spec.js new file mode 100644 index 000000000..440f9a338 --- /dev/null +++ b/src/core/Context/spec.js @@ -0,0 +1,36 @@ +import faker from 'faker'; +import { singleton } from '../../lib'; +import Context from '.'; + +describe('Context', () => { + let parent, instance; + + beforeEach(() => { + + parent = { + [faker.random.word()]: faker.random.word(), + [faker.random.word()]: faker.random.word(), + [faker.random.word()]: faker.random.word() + }; + + instance = new Context(parent); + }); + + it('Should assign all parent properties onto ctx instance', () => { + Object.keys(parent).forEach((key) => { + expect(instance[key]).toBe(parent[key]); + }); + }); + + it('Should store instance on singleton', () => { + expect(singleton.useContext()).toBe(instance); + }); + + describe('Context.clear', () => { + it('Should nullify stored instance', () => { + expect(singleton.useContext()).toBe(instance); + Context.clear(); + expect(singleton.useContext()).toBe(null); + }); + }); +}); diff --git a/src/core/suiteResult/__snapshots__/spec.js.snap b/src/core/suiteResult/__snapshots__/spec.js.snap new file mode 100644 index 000000000..dc41b895f --- /dev/null +++ b/src/core/suiteResult/__snapshots__/spec.js.snap @@ -0,0 +1,180 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`suiteResult module Initial suite result structure 1`] = ` +Object { + "addToSkipped": [Function], + "markAsDone": [Function], + "markFailure": [Function], + "markTestRun": [Function], + "output": Object { + "errorCount": 0, + "name": "Vest result object", + "skipped": Array [], + "testCount": 0, + "tested": Array [], + "tests": Object {}, + "warnCount": 0, + }, + "pending": Array [], + "setPending": [Function], +} +`; + +exports[`suiteResult module Marking a field as failed When severity is \`warning\` 1`] = ` +Object { + "addToSkipped": [Function], + "markAsDone": [Function], + "markFailure": [Function], + "markTestRun": [Function], + "output": Object { + "errorCount": 0, + "name": "Vest result object", + "skipped": Array [], + "testCount": 1, + "tested": Array [ + "Sleimr", + ], + "tests": Object { + "Sleimr": Object { + "errorCount": 0, + "testCount": 1, + "warnCount": 1, + "warnings": Array [ + "We finally came to an agreement.", + ], + }, + }, + "warnCount": 1, + }, + "pending": Array [], + "setPending": [Function], +} +`; + +exports[`suiteResult module Marking a field as failed When severity is default 1`] = ` +Object { + "addToSkipped": [Function], + "markAsDone": [Function], + "markFailure": [Function], + "markTestRun": [Function], + "output": Object { + "errorCount": 1, + "name": "Vest result object", + "skipped": Array [], + "testCount": 1, + "tested": Array [ + "Sleimr", + ], + "tests": Object { + "Sleimr": Object { + "errorCount": 1, + "errors": Array [ + "We finally came to an agreement.", + ], + "testCount": 1, + "warnCount": 0, + }, + }, + "warnCount": 0, + }, + "pending": Array [], + "setPending": [Function], +} +`; + +exports[`suiteResult module Marking a field as failed When statement is not provided 1`] = ` +Object { + "addToSkipped": [Function], + "markAsDone": [Function], + "markFailure": [Function], + "markTestRun": [Function], + "output": Object { + "errorCount": 1, + "name": "Vest result object", + "skipped": Array [], + "testCount": 1, + "tested": Array [ + "Sleimr", + ], + "tests": Object { + "Sleimr": Object { + "errorCount": 1, + "errors": Array [], + "testCount": 1, + "warnCount": 0, + }, + }, + "warnCount": 0, + }, + "pending": Array [], + "setPending": [Function], +} +`; + +exports[`suiteResult module Marking a test run 1`] = ` +Object { + "addToSkipped": [Function], + "markAsDone": [Function], + "markFailure": [Function], + "markTestRun": [Function], + "output": Object { + "errorCount": 0, + "name": "Vest result object", + "skipped": Array [], + "testCount": 1, + "tested": Array [ + "Sleimr", + ], + "tests": Object { + "Sleimr": Object { + "errorCount": 0, + "testCount": 1, + "warnCount": 0, + }, + }, + "warnCount": 0, + }, + "pending": Array [], + "setPending": [Function], +} +`; + +exports[`suiteResult module Output methods getErrors When no field specified Should return error object for whole suite 1`] = ` +Object { + "Borak": Array [ + "We finally came to an agreement.", + ], + "Sleimr": Array [], +} +`; + +exports[`suiteResult module Output methods getWarnings When no field specified Should return warning object for whole suite 1`] = ` +Object { + "Borak": Array [ + "We finally came to an agreement.", + ], + "Sleimr": Array [], +} +`; + +exports[`suiteResult module Skipping a field 1`] = ` +Object { + "addToSkipped": [Function], + "markAsDone": [Function], + "markFailure": [Function], + "markTestRun": [Function], + "output": Object { + "errorCount": 0, + "name": "Vest result object", + "skipped": Array [ + "Sleimr", + ], + "testCount": 0, + "tested": Array [], + "tests": Object {}, + "warnCount": 0, + }, + "pending": Array [], + "setPending": [Function], +} +`; diff --git a/src/core/suiteResult/index.js b/src/core/suiteResult/index.js new file mode 100644 index 000000000..5d08d772f --- /dev/null +++ b/src/core/suiteResult/index.js @@ -0,0 +1,324 @@ +const suiteResult = (name) => { + const pending = { tests: [] }; + const doneCallbacks = []; + const fieldCallbacks = {}; + let isAsync = false; + + /** + * Adds a testObject to pending list. + * @param {Object} testObject + */ + const setPending = (testObject) => { + isAsync = true; + pending.tests.push(testObject); + }; + + /** + * Clears a testObject from pending list. + * @param {Object} testObject + */ + const clearFromPending = (testObject) => { + pending.tests = pending.tests + .filter((t) => t !== testObject); + }; + + /** + * Checks if a specified field has any remaining tests. + * @param {String} fieldName + * @returns {Boolean} + */ + const hasRemaining = (fieldName) => { + if (!pending.tests.length) { + return false; + } + + if (fieldName) { + return pending.tests + .some((testObject) => testObject.fieldName === fieldName); + } + + return !!pending.tests.length; + }; + + /** + * Bumps test counters to indicate tests that are being performed + * @param {string} fieldName - The name of the field. + */ + const markTestRun = (fieldName) => { + + if (!output.tests[fieldName]) { + output.tests[fieldName] = { + testCount: 0, + errorCount: 0, + warnCount: 0 + }; + + output.tested.push(fieldName); + } + + output.tests[fieldName].testCount++; + output.testCount++; + }; + + /** + * Marks a test as failed. + * @param {Object} testData + * @param {String} testData.fieldName Name of field being tested. + * @param {String} [testData.statement] Failure message to display. + * @param {Boolean} [testData.isWarning] Indicates warn only test. + */ + const markFailure = ({ fieldName, statement, isWarning }) => { + if (!output.tests[fieldName]) { return; } + + let severityGroup, severityCount; + + if (isWarning) { + severityGroup = 'warnings'; + severityCount = 'warnCount'; + } else { + severityGroup = 'errors'; + severityCount = 'errorCount'; + } + + output.tests[fieldName][severityGroup] = + output.tests[fieldName][severityGroup] || []; + + if (statement) { + output.tests[fieldName][severityGroup].push(statement); + } + + output[severityCount]++; + output.tests[fieldName][severityCount]++; + }; + + /** + * Uniquely add a field to the `skipped` list + * @param {string} fieldName - The name of the field. + */ + const addToSkipped = (fieldName) => { + !output.skipped.includes(fieldName) && output.skipped.push(fieldName); + }; + + /** + * Runs callbacks of specified field, or of the whole suite. + * @param {String} [fieldName] + */ + const runCallbacks = (fieldName) => { + if (!fieldName) { + return doneCallbacks.forEach((cb) => cb(output)); + } + + if (Array.isArray(fieldCallbacks[fieldName])) { + return fieldCallbacks[fieldName].forEach((cb) => cb(output)); + } + }; + + /** + * Removes a field from pending, and runs its callbacks. If all fields are done, runs all callbacks. + * @param {Object} testObject a testObject to remove from pending. + */ + const markAsDone = (testObject) => { + + if (output.canceled) { + return; + } + + if (testObject) { + clearFromPending(testObject); + if (!hasRemaining(testObject.fieldName)) { + runCallbacks(testObject.fieldName); + } + } + + if (!hasRemaining()) { + runCallbacks(); + } + }; + + /** + * Registers a callback to run once the suite or a specified field finished running. + * @param {String} [name] Name of the field to call back after, + * @param {Function} callback A callback to run once validation is finished. + * @returns {Object} Output object. + */ + const done = (...args) => { + const { length, [length-1]: callback, [length-2]: name } = args; + + if (typeof callback !== 'function') { + return output; + } + + if (!isAsync) { + callback(output); + return output; + } + + if (name && !hasRemaining(name)) { + callback(output); + return output; + } + + if (name) { + fieldCallbacks[name] = fieldCallbacks[name] || []; + fieldCallbacks[name].push(callback); + } else { + doneCallbacks.push(callback); + } + + return output; + }; + + /** + * cancels done callbacks. They won't invoke when async operations complete + */ + const cancel = () => { + output.canceled = true; + + return output; + }; + + /** + * Collects all fields that have an array of specified group in their results. + * @param {String} group Group name (warnings or errors). + * @returns {Object} Object of array per field. + */ + const collectFailureMessages = (group) => { + const collector = {}; + + for (const fieldName in output.tests) { + if (output.tests[fieldName] && + output.tests[fieldName][group]) { + collector[fieldName] = output.tests[fieldName][group]; + } + } + + return collector; + }; + + /** + * Gets all the errors of a field, or of the whole object. + * @param {string} fieldName - The name of the field. + * @return {array | object} The field's errors, or all errors. + */ + const getErrors = (fieldName) => { + if (!fieldName) { + return collectFailureMessages('errors'); + } + + if (output.tests[fieldName].errors) { + return output.tests[fieldName].errors; + } + + return []; + }; + + /** + * Gets all the warnings of a field, or of the whole object. + * @param {string} [fieldName] - The name of the field. + * @return {array | object} The field's warnings, or all warnings. + */ + const getWarnings = (fieldName) => { + if (!fieldName) { + return collectFailureMessages('warnings'); + } + + if (output.tests[fieldName].warnings) { + return output.tests[fieldName].warnings; + } + + return []; + }; + + /** + * Checks if a certain field (or the whole suite) has errors. + * @param {string} [fieldName] + * @return {boolean} + */ + const hasErrors = (fieldName) => { + if (!fieldName) { + return !!output.errorCount; + } + + return Boolean( + output.tests[fieldName] && + output.tests[fieldName].errorCount + ); + }; + + /** + * Checks if a certain field (or the whole suite) has warnings + * @param {string} [fieldName] + * @return {boolean} + */ + const hasWarnings = (fieldName) => { + if (!fieldName) { + return !!output.warnCount; + } + + return Boolean( + output.tests[fieldName] && + output.tests[fieldName].warnCount + ); + }; + + const output = { + name, + errorCount: 0, + warnCount: 0, + testCount: 0, + tests: {}, + skipped: [], + tested: [] + }; + + Object.defineProperties(output, { + hasErrors: { + value: hasErrors, + writable: true, + configurable: true, + enumerable: false + }, + hasWarnings: { + value: hasWarnings, + writable: true, + configurable: true, + enumerable: false + }, + getErrors: { + value: getErrors, + writable: true, + configurable: true, + enumerable: false + }, + getWarnings: { + value: getWarnings, + writable: true, + configurable: true, + enumerable: false + }, + done: { + value: done, + writable: true, + configurable: true, + enumerable: false + }, + cancel: { + value: cancel, + writable: true, + configurable: true, + enumerable: false + } + }); + + return { + markTestRun, + markFailure, + setPending, + addToSkipped, + markAsDone, + pending: pending.tests, + output + }; +}; + +export default suiteResult; diff --git a/src/core/suiteResult/spec.js b/src/core/suiteResult/spec.js new file mode 100644 index 000000000..d412c69f2 --- /dev/null +++ b/src/core/suiteResult/spec.js @@ -0,0 +1,322 @@ +import faker from 'faker'; +import { TestObject } from '../test/lib'; +import suiteResult from '.'; + +const formName = 'Vest result object'; +const fieldName1 = 'Sleimr'; +const fieldName2 = 'Borak'; +const statement = 'We finally came to an agreement.'; + +describe('suiteResult module', () => { + let res; + + beforeEach(() => { + res = suiteResult(formName); + }); + + + test('Initial suite result structure', () => { + expect(res).toMatchSnapshot(); + }); + + test('Marking a test run', () => { + res.markTestRun(fieldName1); + expect(res).toMatchSnapshot(); + }); + + describe('Marking a field as failed', () => { + + beforeEach(() => { + res.markTestRun(fieldName1); + }); + + test('When severity is `warning`', () => { + res.markFailure({ + fieldName: fieldName1, + statement, + isWarning: true + }); + expect(res).toMatchSnapshot(); + }); + + test('When severity is default', () => { + res.markFailure({ + fieldName: fieldName1, + statement + }); + expect(res).toMatchSnapshot(); + }); + + test('When statement is not provided', () => { + res.markFailure({ + fieldName: fieldName1 + }); + expect(res).toMatchSnapshot(); + }); + }); + + test('Skipping a field', () => { + res.addToSkipped(fieldName1); + expect(res).toMatchSnapshot(); + }); + + test('Setting a field as pending', () => { + const testObjects = Array.from({ length: 5 }, () => new TestObject( + {}, + faker.lorem.word(), + faker.lorem.sentence(), + Function.prototype + )); + + testObjects.forEach(res.setPending); + + testObjects.forEach((obj) => { + expect(res.pending.includes(obj)).toBe(true); + }); + }); + + describe('Output methods', () => { + let output, statement2; + + beforeEach(() => { + statement2 = faker.lorem.sentence(); + output = res.output; + res.markTestRun(fieldName1); + res.markTestRun(fieldName2); + }); + + describe('hasErrors', () => { + describe('When no field specified', () => { + it('Should return current error status for all suite', () => { + expect(output.hasErrors()).toBe(false); + res.markFailure({ fieldName: fieldName1 }); + expect(output.hasErrors()).toBe(true); + }); + }); + + describe('When field specified', () => { + it('Should return error status for a given field', () => { + expect(output.hasErrors(fieldName2)).toBe(false); + res.markFailure({ fieldName: fieldName1 }); + expect(output.hasErrors(fieldName1)).toBe(true); + expect(output.hasErrors(fieldName2)).toBe(false); + }); + }); + }); + + describe('hasWarnings', () => { + describe('When no field specified', () => { + it('Should return current warn status for all suite', () => { + expect(output.hasWarnings()).toBe(false); + res.markFailure({ fieldName: fieldName1, isWarning: true }); + expect(output.hasWarnings()).toBe(true); + }); + }); + + describe('When field specified', () => { + it('Should return warn status for a given field', () => { + expect(output.hasWarnings(fieldName2)).toBe(false); + res.markFailure({ fieldName: fieldName1, isWarning: true }); + expect(output.hasWarnings(fieldName1)).toBe(true); + expect(output.hasWarnings(fieldName2)).toBe(false); + }); + }); + }); + + describe('getErrors', () => { + describe('When no field specified', () => { + it('Should return error object for whole suite', () => { + expect(output.getErrors()).toEqual({}); + res.markFailure({ fieldName: fieldName1 }); + res.markFailure({ fieldName: fieldName2, statement }); + res.markFailure({ fieldName: fieldName2, isWarning: true }); + expect(output.getErrors()).toMatchSnapshot(); + }); + }); + + describe('When field specified', () => { + + it('Should return error array for a given field', () => { + expect(output.getErrors()).toEqual({}); + res.markFailure({ fieldName: fieldName1 }); + res.markFailure({ fieldName: fieldName2, statement }); + res.markFailure({ fieldName: fieldName2, isWarning: true }); + expect(output.getErrors(fieldName1)).toEqual([]); + expect(output.getErrors(fieldName2)).toEqual([statement]); + res.markFailure({ fieldName: fieldName2, statement: statement2 }); + expect(output.getErrors(fieldName2)).toEqual([statement, statement2]); + }); + }); + }); + + describe('getWarnings', () => { + describe('When no field specified', () => { + it('Should return warning object for whole suite', () => { + expect(output.getWarnings()).toEqual({}); + res.markFailure({ fieldName: fieldName1, isWarning: true }); + res.markFailure({ fieldName: fieldName2, statement, isWarning: true }); + res.markFailure({ fieldName: fieldName2 }); + expect(output.getWarnings()).toMatchSnapshot(); + }); + }); + + describe('When field specified', () => { + it('Should return warning array for a given field', () => { + expect(output.getWarnings()).toEqual({}); + res.markFailure({ fieldName: fieldName1, isWarning: true }); + res.markFailure({ fieldName: fieldName2, statement, isWarning: true }); + res.markFailure({ fieldName: fieldName2 }); + expect(output.getWarnings(fieldName1)).toEqual([]); + expect(output.getWarnings(fieldName2)).toEqual([statement]); + res.markFailure({ fieldName: fieldName2, statement: statement2, isWarning: true }); + expect(output.getWarnings(fieldName2)).toEqual([statement, statement2]); + }); + }); + }); + + describe('done + cancel', () => { + let cb1, cb2, cb3, cb4, testObject1, testObject2; + + beforeEach(() => { + cb1 = jest.fn(); + cb2 = jest.fn(); + cb3 = jest.fn(); + cb4 = jest.fn(); + }); + + describe('When no async tests', () => { + beforeEach(() => { + [fieldName1, fieldName2].forEach(res.markTestRun); + }); + + it('Should invoke callback functions immediately', () => { + expect(cb1).not.toHaveBeenCalled(); + res.output.done(cb1); + expect(cb1).toHaveBeenCalledWith(res.output); + expect(cb2).not.toHaveBeenCalled(); + res.output.done(fieldName1, cb2); + expect(cb2).toHaveBeenCalledWith(res.output); + }); + + describe('When cancel gets called', () => { + beforeEach(() => { + res.output.cancel(); + }); + + it('Should run normally', () => { + expect(cb1).not.toHaveBeenCalled(); + res.output.done(cb1); + expect(cb1).toHaveBeenCalledWith(res.output); + expect(cb2).not.toHaveBeenCalled(); + res.output.done(fieldName1, cb2); + expect(cb2).toHaveBeenCalledWith(res.output); + }); + }); + }); + + describe('When async tests exist', () => { + beforeEach(() => { + testObject1 = new TestObject({}, fieldName1, null, jest.fn()); + testObject2 = new TestObject({}, fieldName2, null, jest.fn()); + [fieldName1, fieldName2].forEach(res.markTestRun); + res.setPending(testObject1); + res.setPending(testObject2); + }); + + it('Should return and not call callbacks immediately', () => { + expect(cb1).not.toHaveBeenCalled(); + expect(cb2).not.toHaveBeenCalled(); + expect(cb3).not.toHaveBeenCalled(); + res.output.done(cb1); + res.output.done(cb2); + res.output.done(cb3); + expect(cb1).not.toHaveBeenCalled(); + expect(cb2).not.toHaveBeenCalled(); + expect(cb3).not.toHaveBeenCalled(); + }); + + it('Should invoke all functions after all async tests are done', (done) => { + res.output.done(cb1); + res.output.done(cb2); + res.output.done(cb3); + res.output.done(cb4); + setTimeout(() => { + res.markAsDone(testObject1); + expect(cb1).not.toHaveBeenCalled(); + expect(cb2).not.toHaveBeenCalled(); + expect(cb3).not.toHaveBeenCalled(); + expect(cb4).not.toHaveBeenCalled(); + }); + + setTimeout(() => { + res.markAsDone(testObject2); + expect(cb1).toHaveBeenCalledWith(res.output); + expect(cb2).toHaveBeenCalledWith(res.output); + expect(cb3).toHaveBeenCalledWith(res.output); + expect(cb4).toHaveBeenCalledWith(res.output); + done(); + }, 100); + }); + + describe('When called with a field name', () => { + describe('When field named field is sync', () => { + it('Should only invoke named callback immediately', () => { + expect(cb1).not.toHaveBeenCalled(); + res.output.done(faker.lorem.word(), cb1); + res.output.done(cb2); + res.output.done(cb3); + res.output.done(cb4); + expect(cb1).toHaveBeenCalledWith(output); + expect(cb2).not.toHaveBeenCalled(); + expect(cb3).not.toHaveBeenCalled(); + expect(cb4).not.toHaveBeenCalled(); + }); + }); + + describe('When field named field is async', () => { + it('Should only invoke named callback after its test is complete', () => { + expect(cb3).not.toHaveBeenCalled(); + res.output.done(fieldName1, cb3); + res.output.done(cb1); + res.output.done(cb2); + res.output.done(cb4); + + expect(cb1).not.toHaveBeenCalled(); + expect(cb2).not.toHaveBeenCalled(); + expect(cb3).not.toHaveBeenCalled(); + expect(cb4).not.toHaveBeenCalled(); + + res.markAsDone(testObject1); + expect(cb3).toHaveBeenCalledWith(output); + expect(cb1).not.toHaveBeenCalled(); + expect(cb2).not.toHaveBeenCalled(); + expect(cb4).not.toHaveBeenCalled(); + }); + }); + }); + + describe('When cancel gets called before running callbacks', () => { + it('Should exit without running any left over callbacks', () => { + res.output.done(fieldName1, cb3); + res.output.done(cb1); + res.output.done(cb2); + res.output.done(cb4); + res.markAsDone(testObject1); + expect(cb3).toHaveBeenCalledWith(output); + res.output.cancel(); + res.markAsDone(); + expect(cb1).not.toHaveBeenCalled(); + expect(cb2).not.toHaveBeenCalled(); + expect(cb4).not.toHaveBeenCalled(); + }); + }); + }); + + test('Cancel adds `canceled = true` to output object', () => { + expect(res.output.canceled).toBe(undefined); + res.output.cancel(); + expect(res.output.canceled).toBe(true); + }); + }); + }); +}); diff --git a/src/core/test/index.js b/src/core/test/index.js new file mode 100644 index 000000000..ff0234aea --- /dev/null +++ b/src/core/test/index.js @@ -0,0 +1,126 @@ +import { isExcluded } from '../../hooks/exclusive'; +import { singleton } from '../../lib'; +import { TestObject } from './lib'; + +/** + * Runs async test. + * @param {TestObject} testObject A TestObject instance. + */ +export const runAsync = (testObject) => { + const { testFn, statement, ctx } = testObject; + + const done = () => ctx.result.markAsDone(testObject); + + const fail = (rejectionMessage) => { + testObject.statement = typeof rejectionMessage === 'string' + ? rejectionMessage + : statement; + + testObject.fail(); + + done(); + }; + + ctx.setCurrentTest(testObject); + + try { + testFn.then(done, fail); + } catch (e) { + fail(); + } + + ctx.removeCurrentTest(); +}; + +/** + * Runs test callback. + * @param {TestObject} testObject TestObject instance. + * @returns {*} Result from test callback. + */ +const runTest = (testObject) => { + let result; + + testObject.ctx.setCurrentTest(testObject); + + try { + result = testObject.testFn.apply(testObject); + } catch (e) { + result = false; + } + + testObject.ctx.removeCurrentTest(); + + if (result === false) { + testObject.fail(); + } + + return result; +}; + +/** + * Registers test, if async - adds to pending array + * @param {TestObject} testObject A TestObject Instance. + */ +const register = (testObject) => { + const { testFn, ctx, fieldName } = testObject; + let isPending = false; + let result; + + if (isExcluded(fieldName)) { + ctx.result.addToSkipped(fieldName); + return; + } + + ctx.result.markTestRun(fieldName); + + if (testFn && typeof testFn.then === 'function') { + isPending = true; + } else { + result = runTest(testObject); + } + + if (result && typeof result.then === 'function') { + isPending = true; + + testObject.testFn = result; + } + + if (isPending) { + ctx.result.setPending(testObject); + } +}; + +/** + * Test function used by consumer to provide their own validations. + * @param {String} fieldName Name of the field to test. + * @param {String} [statement] The message returned in case of a failure. + * @param {function} testFn The actual test callback. + * @return {TestObject} A TestObject instance. + */ +const test = (fieldName, ...args) => { + let statement, + testFn; + + if (typeof args[0] === 'string') { + [statement, testFn] = args; + } else if (typeof args[0] === 'function') { + [testFn] = args; + } + + if (typeof testFn !== 'function') { + return; + } + + const testObject = new TestObject( + singleton.useContext(), + fieldName, + statement, + testFn + ); + + register(testObject); + + return testObject; +}; + +export default test; diff --git a/src/core/test/lib/TestObject/__snapshots__/spec.js.snap b/src/core/test/lib/TestObject/__snapshots__/spec.js.snap new file mode 100644 index 000000000..cad9bb388 --- /dev/null +++ b/src/core/test/lib/TestObject/__snapshots__/spec.js.snap @@ -0,0 +1,62 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`TestObject TestObject constructor 1`] = ` +TestObject { + "ctx": Object { + "result": Object { + "markFailure": [MockFunction], + }, + }, + "failed": false, + "fieldName": "unicycle", + "isWarning": false, + "statement": "I am Root.", + "testFn": [MockFunction], +} +`; + +exports[`TestObject testObject.fail Should set \`.faild\` to true 1`] = ` +TestObject { + "ctx": Object { + "result": Object { + "markFailure": [MockFunction] { + "calls": Array [ + Array [ + Object { + "fieldName": "unicycle", + "isWarning": false, + "statement": "I am Root.", + }, + ], + ], + "results": Array [ + Object { + "type": "return", + "value": undefined, + }, + ], + }, + }, + }, + "failed": true, + "fieldName": "unicycle", + "isWarning": false, + "statement": "I am Root.", + "testFn": [MockFunction], +} +`; + +exports[`TestObject testObject.warn Should set \`.isWarning\` to true 1`] = ` +TestObject { + "ctx": Object { + "result": Object { + "markFailure": [MockFunction], + }, + }, + "failed": false, + "fieldName": "unicycle", + "isWarning": true, + "statement": "I am Root.", + "testFn": [MockFunction], +} +`; diff --git a/src/core/test/lib/TestObject/index.js b/src/core/test/lib/TestObject/index.js new file mode 100644 index 000000000..ab093f1d6 --- /dev/null +++ b/src/core/test/lib/TestObject/index.js @@ -0,0 +1,50 @@ +/** + * Describes a test call inside a Vest suite. + * @param {Object} ctx Parent context. + * @param {String} fieldName Name of the field being tested. + * @param {String} statement The message returned when failing. + * @param {Promise|Function} testFn The actual test callbrack or promise. + */ +function TestObject(ctx, fieldName, statement, testFn) { + Object.assign(this, { + ctx, + testFn, + fieldName, + statement, + isWarning: false, + failed: false + }); +} + +/** + * @returns {Boolean} Current validity status of a test. + */ +TestObject.prototype.valueOf = function() { + return this.failed !== true; +}; + +/** + * Sets a test to failed. + * @returns {TestObject} Current instance. + */ +TestObject.prototype.fail = function() { + this.ctx.result.markFailure({ + fieldName: this.fieldName, + statement: this.statement, + isWarning: this.isWarning + }); + + this.failed = true; + return this; +}; + +/** + * Sets a current test's `isWarning` to true. + * @returns {TestObject} Current instance. + */ +TestObject.prototype.warn = function() { + this.isWarning = true; + return this; +}; + +export default TestObject; diff --git a/src/core/test/lib/TestObject/spec.js b/src/core/test/lib/TestObject/spec.js new file mode 100644 index 000000000..269f435ac --- /dev/null +++ b/src/core/test/lib/TestObject/spec.js @@ -0,0 +1,79 @@ +import TestObject from '.'; + +const createContext = (data = {}) => ({ + result: { + markFailure: jest.fn() + }, + ...data +}); + +const fieldName = 'unicycle'; +const statement = 'I am Root.'; + + +describe('TestObject', () => { + let context, testObject; + + beforeEach(() => { + context = createContext(); + testObject = new TestObject( + context, + fieldName, + statement, + jest.fn() + ); + }); + + test('TestObject constructor', () => { + expect(testObject).toMatchSnapshot(); + }); + + describe('testObject.warn', () => { + it('Should return current instance', () => { + expect(testObject.warn()).toBe(testObject); + }); + + it('Should set `.isWarning` to true', () => { + expect(testObject.isWarning).toBe(false); + testObject.warn(); + expect(testObject.isWarning).toBe(true); + expect(testObject).toMatchSnapshot(); + }); + }); + + describe('testObject.fail', () => { + it('Should call `ctx.result.markFailure`', () => { + expect(context.result.markFailure).not.toHaveBeenCalled(); + testObject.fail(); + expect(context.result.markFailure).toHaveBeenCalledWith({ + fieldName, + statement, + isWarning: testObject.isWarning + }); + }); + + it('Should return current instance', () => { + expect(testObject.fail()).toBe(testObject); + }); + + it('Should set `.faild` to true', () => { + expect(testObject.failed).toBe(false); + testObject.fail(); + expect(testObject.failed).toBe(true); + expect(testObject).toMatchSnapshot(); + }); + }); + + describe('testobject.valueOf', () => { + + test('When `failed` is false', () => { + expect(testObject.failed).toBe(false); + expect(testObject.valueOf()).toBe(true); + }); + + test('When `failed` is false', () => { + testObject.fail(); + expect(testObject.valueOf()).toBe(false); + }); + }); +}); diff --git a/src/core/test/lib/index.js b/src/core/test/lib/index.js new file mode 100644 index 000000000..87a03826d --- /dev/null +++ b/src/core/test/lib/index.js @@ -0,0 +1 @@ +export { default as TestObject } from './TestObject'; diff --git a/src/core/test/spec.js b/src/core/test/spec.js new file mode 100644 index 000000000..2ab9d1cb1 --- /dev/null +++ b/src/core/test/spec.js @@ -0,0 +1,66 @@ +import faker from 'faker'; + +const runSpec = (vest) => { + const { validate, test } = vest; + describe('Test Vest\'s `test` function', () => { + + describe('test callbacks', () => { + + describe('Warn hook', () => { + it('Should be marked as warning when the warn hook gets called', () => { + validate(faker.random.word(), () => { + let testObject; + testObject = test(faker.random.word(), faker.lorem.sentence(), () => { + vest.warn(); + }); + expect(testObject.isWarning).toBe(true); + }); + }); + }); + + describe('Sync', () => { + it('Should be marked as failed after a thrown error', () => { + validate(faker.random.word(), () => { + let testObject; + testObject = test(faker.random.word(), faker.lorem.sentence(), () => { + throw new Error(); + }); + expect(testObject.failed).toBe(true); + expect(testObject == false).toBe(true); //eslint-disable-line + }); + }); + + it('Should be marked as failed for an explicit false return', () => { + validate(faker.random.word(), () => { + let testObject; + testObject = test(faker.random.word(), faker.lorem.sentence(), () => false); + expect(testObject.failed).toBe(true); + expect(testObject == false).toBe(true); //eslint-disable-line + }); + }); + }); + + describe('async', () => { + it('Should be marked as failed when a returned promise rejects', (done) => { + validate(faker.random.word(), () => { + let testObject; + testObject = test(faker.random.word(), faker.lorem.sentence(), () => new Promise((resolve, reject) => { + expect(testObject.failed).toBe(false); + setTimeout(reject, 300); + })); + expect(testObject.failed).toBe(false); + setTimeout(() => { + expect(testObject.failed).toBe(true); + done(); + }, 310); + }); + }); + }); + + }); + }); +}; + +global.vestDistVersions + .concat(require('../../')) + .forEach(runSpec); diff --git a/src/core/validate/__snapshots__/spec.js.snap b/src/core/validate/__snapshots__/spec.js.snap new file mode 100644 index 000000000..b6636d2d5 --- /dev/null +++ b/src/core/validate/__snapshots__/spec.js.snap @@ -0,0 +1,23 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Test validate suite wrapper Context creation Should create a new context object with initialized suite data 1`] = ` +Object { + "result": Object { + "addToSkipped": [Function], + "markAsDone": [Function], + "markFailure": [Function], + "markTestRun": [Function], + "output": Object { + "errorCount": 0, + "name": "formName", + "skipped": Array [], + "testCount": 0, + "tested": Array [], + "tests": Object {}, + "warnCount": 0, + }, + "pending": Array [], + "setPending": [Function], + }, +} +`; diff --git a/src/core/validate/constants.js b/src/core/validate/constants.js new file mode 100644 index 000000000..87dbf3ea8 --- /dev/null +++ b/src/core/validate/constants.js @@ -0,0 +1,4 @@ +/** + * @type {String} + */ +export const SUITE_INIT_ERROR = 'Suite initialization error.'; diff --git a/src/core/validate/index.js b/src/core/validate/index.js new file mode 100644 index 000000000..3d23e5438 --- /dev/null +++ b/src/core/validate/index.js @@ -0,0 +1,35 @@ +import { throwError } from '../../lib'; +import Context from '../Context'; +import { runAsync } from '../test'; +import suiteResult from '../suiteResult'; +import { SUITE_INIT_ERROR } from './constants'; + +/** + * Initializes a validation suite, creates a validation context. + * @param {String} name Descriptive name for validation suite. + * @param {Function} tests Validation suite body. + * @returns {Object} Vest output object. + */ +const validate = (name, tests) => { + if (typeof name !== 'string') { + return throwError(SUITE_INIT_ERROR + ' Expected name to be a string.', TypeError); + } + + if (typeof tests !== 'function') { + return throwError(SUITE_INIT_ERROR + ' Expected tests to be a function.', TypeError); + } + + const result = suiteResult(name); + + new Context({ result }); + + tests(); + + Context.clear(); + + [...result.pending].forEach(runAsync); + + return result.output; +}; + +export default validate; diff --git a/src/core/validate/spec.js b/src/core/validate/spec.js new file mode 100644 index 000000000..cc89b4f05 --- /dev/null +++ b/src/core/validate/spec.js @@ -0,0 +1,79 @@ +import faker from 'faker'; +import { noop } from 'lodash'; +import validate from '.'; + +describe('Test validate suite wrapper', () => { + + describe('Test arguments', () => { + let mockThrowError, validate; + + beforeEach(() => { + mockThrowError = jest.fn(); + jest.resetModules(); + jest.mock('../../lib/throwError/', () => ({ + __esModule: true, + default: mockThrowError + })); + validate = require('.'); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it.each([[1, {}, noop]])( + 'Should throw a typerror error for a non string name.', + (value) => { + validate(value, noop); + expect(mockThrowError).toHaveBeenCalledWith( + 'Suite initialization error. Expected name to be a string.', + TypeError + ); + } + ); + + it.each([[1, {}, 'noop']])( + 'Should throw a typerror error for a non function tests callback.', + (value) => { + validate(faker.random.word(), value); + expect(mockThrowError).toHaveBeenCalledWith( + 'Suite initialization error. Expected tests to be a function.', + TypeError + ); + } + ); + }); + + it('Calls `tests` argument', (done) => { + validate('FormName', done); + }); + + describe('Context creation', () => { + let mockContext, validate, name; + + beforeEach(() => { + name = 'formName'; + mockContext = jest.fn(); + mockContext.clear = jest.fn(); + jest.resetModules(); + jest.mock('../Context/', () => ({ + __esModule: true, + default: mockContext + })); + validate = require('.'); + validate(name, noop); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('Should create a new context object with initialized suite data', () => { + expect(mockContext.mock.calls[0][0]).toMatchSnapshot(); + }); + + it('Should clear created context', () => { + expect(mockContext.clear).toHaveBeenCalled(); + }); + }); +}); diff --git a/src/hooks/constants.js b/src/hooks/constants.js new file mode 100644 index 000000000..714158ce3 --- /dev/null +++ b/src/hooks/constants.js @@ -0,0 +1,4 @@ +/** + * @type {String} Error message to display when a hook was called outside of context. + */ +export const ERROR_HOOK_CALLED_OUTSIDE = 'hook called outside of a running suite.'; diff --git a/src/hooks/draft/index.js b/src/hooks/draft/index.js new file mode 100644 index 000000000..5fe1ccb0f --- /dev/null +++ b/src/hooks/draft/index.js @@ -0,0 +1,18 @@ +import { singleton, throwError } from '../../lib'; +import { ERROR_HOOK_CALLED_OUTSIDE } from '../constants'; + +/** + * @returns {Object} Current output object. + */ +const draft = () => { + + const ctx = singleton.useContext(); + + if (ctx) { + return ctx.result.output; + } + + throwError('draft ' + ERROR_HOOK_CALLED_OUTSIDE); +}; + +export default draft; diff --git a/src/hooks/draft/spec.js b/src/hooks/draft/spec.js new file mode 100644 index 000000000..557089537 --- /dev/null +++ b/src/hooks/draft/spec.js @@ -0,0 +1,74 @@ +import faker from 'faker'; + +const runSpec = (vest) => { + const { test, validate } = vest; + + const createSuite = (tests) => { + validate(faker.random.word(), tests); + }; + + describe('Draft', () => { + + it('Should be exposed as a function from vest', () => { + createSuite(() => { + expect(typeof vest.draft).toBe('function'); + }); + }); + + it('Should contain intermediate test result', () => { + // This test is so long because it tests `draft` throughout + // a suite's life cycle, both as an argument, and as an import + createSuite(() => { + expect(vest.draft().testCount).toBe(0); + expect(vest.draft().errorCount).toBe(0); + expect(vest.draft().warnCount).toBe(0); + expect(vest.draft().hasErrors()).toBe(false); + expect(vest.draft().hasWarnings()).toBe(false); + expect(vest.draft().skipped).toEqual([]); + + expect(vest.draft().hasErrors('field1')).toBe(false); + test('field1', 'message', () => expect(1).toBe(2)); + expect(vest.draft().testCount).toBe(1); + expect(vest.draft().errorCount).toBe(1); + expect(vest.draft().warnCount).toBe(0); + expect(vest.draft().hasErrors()).toBe(true); + expect(vest.draft().hasErrors('field1')).toBe(true); + expect(vest.draft().hasWarnings()).toBe(false); + + test('field2', 'message', () => expect(2).toBe(2)); + expect(vest.draft().testCount).toBe(2); + expect(vest.draft().errorCount).toBe(1); + expect(vest.draft().warnCount).toBe(0); + expect(vest.draft().hasErrors()).toBe(true); + expect(vest.draft().hasWarnings()).toBe(false); + + expect(vest.draft().hasWarnings('field3')).toBe(false); + test('field3', 'message', () => { + vest.warn(); + expect(2).toBe(1); + }); + expect(vest.draft().testCount).toBe(3); + expect(vest.draft().errorCount).toBe(1); + expect(vest.draft().warnCount).toBe(1); + expect(vest.draft().hasErrors()).toBe(true); + expect(vest.draft().hasWarnings()).toBe(true); + expect(vest.draft().hasWarnings('field3')).toBe(true); + + test('field4', 'message', () => { + vest.warn(); + return Promise.resolve(); + }); + // expect(vest.draft().testCount).toBe(4); + // expect(vest.draft().errorCount).toBe(1); + // expect(vest.draft().warnCount).toBe(1); + // expect(vest.draft().hasErrors()).toBe(true); + // expect(vest.draft().hasWarnings()).toBe(true); + // expect(vest.draft().hasWarnings('field4')).toBe(false); + }); + }); + }); +}; + +global.vestDistVersions + .concat(require('../../')) + .forEach(runSpec); diff --git a/src/hooks/exclusive/constants.js b/src/hooks/exclusive/constants.js new file mode 100644 index 000000000..4d936946e --- /dev/null +++ b/src/hooks/exclusive/constants.js @@ -0,0 +1,10 @@ + +/** + * @type {String} Exclusivity group name: only. + */ +export const GROUP_NAME_ONLY = 'only'; + +/** + * @type {String} Exclusivity group name: skip. + */ +export const GROUP_NAME_SKIP = 'skip'; diff --git a/src/hooks/exclusive/index.js b/src/hooks/exclusive/index.js new file mode 100644 index 000000000..c576c011b --- /dev/null +++ b/src/hooks/exclusive/index.js @@ -0,0 +1,73 @@ +import { singleton, throwError } from '../../lib'; +import { ERROR_HOOK_CALLED_OUTSIDE } from '../constants'; +import { GROUP_NAME_ONLY, GROUP_NAME_SKIP } from './constants'; + +/** + * Adds fields to a specified group. + * @param {String} group To add the fields to. + * @param {String[]|String} item A field name or a list of field names. + */ +const addTo = (group, item) => { + const ctx = singleton.useContext(); + + if (!item) { + return; + } + + if (!ctx) { + throwError(`${group} ${ERROR_HOOK_CALLED_OUTSIDE}`); + return; + } + + ctx.exclusive = ctx.exclusive || {}; + + [].concat(item).forEach((fieldName) => { + if (typeof fieldName === 'string') { + ctx.exclusive[group] = ctx.exclusive[group] || {}; + ctx.exclusive[group][fieldName] = true; + } + }); +}; + +/** + * Adds a field or multiple fields to inclusion group. + * @param {String[]|String} item Item to be added to inclusion group. + */ +export const only = (item) => addTo(GROUP_NAME_ONLY, item); + +/** + * Adds a field or multiple fields to exlusion group. + * @param {String[]|String} item Item to be added to exlusion group. + */ +export const skip = (item) => addTo(GROUP_NAME_SKIP, item); + +/** + * Checks whether a certain field name is excluded by any of the exclusion groups. + * @param {String} fieldName FieldN name to test. + * @returns {Boolean} + */ +export const isExcluded = (fieldName) => { + const ctx = singleton.useContext(); + + if (!(ctx && ctx.exclusive)) { + return false; + } + + if ( + ctx.exclusive[GROUP_NAME_SKIP] && + ctx.exclusive[GROUP_NAME_SKIP][fieldName] + ) { + + return true; + } + + if (ctx.exclusive[GROUP_NAME_ONLY]) { + if (ctx.exclusive[GROUP_NAME_ONLY][fieldName]) { + return false; + } + + return true; + } + + return false; +}; diff --git a/src/hooks/exclusive/spec.js b/src/hooks/exclusive/spec.js new file mode 100644 index 000000000..c39c3f410 --- /dev/null +++ b/src/hooks/exclusive/spec.js @@ -0,0 +1,130 @@ +const faker = require('faker'); +const { ERROR_HOOK_CALLED_OUTSIDE } = require('../constants'); +const { isExcluded } = require('.'); + +const runSpec = (vest) => { + + const { validate, only, skip } = vest; + + describe('exclusive hooks', () => { + let field1, field2, field3; + + describe('`only` hook', () => { + + beforeEach(() => { + field1 = faker.lorem.word(); + field2 = faker.lorem.word(); + field3 = faker.lorem.word(); + }); + + describe('string input', () => { + test('isExcluded returns false for included field', () => { + validate(faker.lorem.word(), () => { + only(field1); + + expect(isExcluded(field1)).toBe(false); + }); + }); + + test('isExcluded returns true for non included field', () => { + validate(faker.lorem.word(), () => { + expect(isExcluded(field2)).toBe(false); + only(field1); + expect(isExcluded(field2)).toBe(true); + }); + }); + }); + + describe('array input', () => { + test('isExcluded returns false for included field', () => { + validate(faker.lorem.word(), () => { + only([field1, field2]); + + expect(isExcluded(field1)).toBe(false); + expect(isExcluded(field2)).toBe(false); + }); + }); + + test('isExcluded returns true for non included field', () => { + validate(faker.lorem.word(), () => { + expect(isExcluded(field3)).toBe(false); + only([field1, field2]); + expect(isExcluded(field3)).toBe(true); + }); + }); + }); + }); + + describe('`skip` hook', () => { + + beforeEach(() => { + field1 = faker.lorem.word(); + field2 = faker.lorem.word(); + field3 = faker.lorem.word(); + }); + + describe('string input', () => { + test('isExcluded returns true for excluded field', () => { + validate(faker.lorem.word(), () => { + skip(field1); + + expect(isExcluded(field1)).toBe(true); + }); + }); + + test('isExcluded returns true for non excluded field', () => { + validate(faker.lorem.word(), () => { + skip(field1); + expect(isExcluded(field2)).toBe(false); + }); + }); + }); + + describe('array input', () => { + test('isExcluded returns true for excluded field', () => { + validate(faker.lorem.word(), () => { + skip([field1, field2]); + + expect(isExcluded(field1)).toBe(true); + expect(isExcluded(field2)).toBe(true); + }); + }); + + test('isExcluded returns false for non included field', () => { + validate(faker.lorem.word(), () => { + skip([field1, field2]); + expect(isExcluded(field3)).toBe(false); + }); + }); + }); + }); + + describe('Error handling', () => { + let mockThrowError, hooks; + + beforeEach(() => { + mockThrowError = jest.fn(); + jest.resetModules(); + jest.mock('../../lib/throwError/', () => ({ + __esModule: true, + default: mockThrowError + })); + hooks = require('.'); + }); + + describe.each([['only', 'skip']])('%s', (hook) => { + describe('When called outside of a suite', () => { + it('Should throw an error', () => { + hooks[hook](faker.random.word()); + expect(mockThrowError.mock.calls[0][0].includes(ERROR_HOOK_CALLED_OUTSIDE)).toBe(true); + }); + }); + }); + }); + }); +}; + + +global.vestDistVersions + .concat(require('../../')) + .forEach(runSpec); diff --git a/src/hooks/index.js b/src/hooks/index.js new file mode 100644 index 000000000..04175aa57 --- /dev/null +++ b/src/hooks/index.js @@ -0,0 +1,3 @@ +export { default as draft } from './draft'; +export { only, skip } from './exclusive'; +export { default as warn } from './warn'; diff --git a/src/hooks/warn/constants.js b/src/hooks/warn/constants.js new file mode 100644 index 000000000..9c63e6791 --- /dev/null +++ b/src/hooks/warn/constants.js @@ -0,0 +1,4 @@ +/** + * @type {String} Error message to display when `warn` gets called outside of a test. + */ +export const ERROR_OUTSIDE_OF_TEST = 'warn hook called outside of a test callback. It won\'t have an effect.'; diff --git a/src/hooks/warn/index.js b/src/hooks/warn/index.js new file mode 100644 index 000000000..cc8aaa544 --- /dev/null +++ b/src/hooks/warn/index.js @@ -0,0 +1,24 @@ +import { singleton, throwError } from '../../lib'; +import { ERROR_HOOK_CALLED_OUTSIDE } from '../constants'; +import { ERROR_OUTSIDE_OF_TEST } from './constants'; + +/** + * Sets a running test to warn only mode. + */ +const warn = () => { + const ctx = singleton.useContext(); + + if (!ctx) { + throwError('warn ' + ERROR_HOOK_CALLED_OUTSIDE); + return; + } + + if (!ctx.currentTest) { + throwError(ERROR_OUTSIDE_OF_TEST); + return; + } + + ctx.currentTest.warn(); +}; + +export default warn; diff --git a/src/hooks/warn/spec.js b/src/hooks/warn/spec.js new file mode 100644 index 000000000..02167f557 --- /dev/null +++ b/src/hooks/warn/spec.js @@ -0,0 +1,61 @@ +const faker = require('faker'); +const { singleton } = require('../../lib/'); +const { ERROR_HOOK_CALLED_OUTSIDE } = require('../constants'); +const { ERROR_OUTSIDE_OF_TEST } = require('./constants'); + +const runSpec = (vest) => { + + const { validate, test, warn } = vest; + + describe('warn hook', () => { + + describe('When currentTest exists', () => { + + it('Should set isWarning to true', () => { + let beforeWarn, afterWarn; + validate(faker.random.word(), () => { + test(faker.lorem.word(), faker.lorem.sentence(), () => { + beforeWarn = singleton.useContext().currentTest.isWarning; + warn(); + afterWarn = singleton.useContext().currentTest.isWarning; + }); + }); + + expect(beforeWarn).toBe(false); + expect(afterWarn).toBe(true); + }); + }); + + describe('Error handling', () => { + let mockThrowError, warn; + + beforeEach(() => { + mockThrowError = jest.fn(); + jest.resetModules(); + jest.mock('../../lib/throwError/', () => ({ + __esModule: true, + default: mockThrowError + })); + warn = require('.'); + }); + + it('Should throw error when currentTest is not present', () => { + validate(faker.random.word(), () => { + warn(); + }); + + expect(mockThrowError).toHaveBeenCalledWith(ERROR_OUTSIDE_OF_TEST); + }); + + it('Should throw error when no suite present', () => { + warn(); + + expect(mockThrowError.mock.calls[0][0].includes(ERROR_HOOK_CALLED_OUTSIDE)).toBe(true); + }); + }); + }); +}; + +global.vestDistVersions + .concat(require('../../')) + .forEach(runSpec); diff --git a/src/index.js b/src/index.js new file mode 100644 index 000000000..5e85c5894 --- /dev/null +++ b/src/index.js @@ -0,0 +1,20 @@ +import enforce from 'n4s/dist/enforce.min'; +import any from 'anyone/any'; +import validate from './core/validate'; +import { draft, only, skip, warn } from './hooks'; +import test from './core/test'; +import { singleton } from './lib'; +import { VERSION } from './constants'; + +export default singleton.register({ + VERSION, + enforce, + draft, + Enforce: enforce.Enforce, + test, + any, + validate, + only, + skip, + warn +}); diff --git a/src/lib/globalObject/index.js b/src/lib/globalObject/index.js new file mode 100644 index 000000000..3efdaca63 --- /dev/null +++ b/src/lib/globalObject/index.js @@ -0,0 +1,6 @@ +/** + * @type {Object} Reference to global object. + */ +const globalObject = Function('return this')(); + +export default globalObject; diff --git a/src/lib/index.js b/src/lib/index.js new file mode 100644 index 000000000..c6dee015e --- /dev/null +++ b/src/lib/index.js @@ -0,0 +1,3 @@ +export { default as globalObject } from './globalObject'; +export { default as singleton } from './singleton'; +export { default as throwError } from './throwError'; diff --git a/src/lib/singleton/constants.js b/src/lib/singleton/constants.js new file mode 100644 index 000000000..092f63835 --- /dev/null +++ b/src/lib/singleton/constants.js @@ -0,0 +1,9 @@ +/** + * @type {String} Vest's major version. + */ +const VEST_MAJOR = VEST_VERSION.split('.')[0]; + +/** + * @type {Symbol} Used to store a global instance of Vest. + */ +export const SYMBOL_VEST = Symbol.for(`VEST#${VEST_MAJOR}`); diff --git a/src/lib/singleton/index.js b/src/lib/singleton/index.js new file mode 100644 index 000000000..4d902c7a8 --- /dev/null +++ b/src/lib/singleton/index.js @@ -0,0 +1,48 @@ +import throwError from '../throwError'; +import go from '../globalObject'; +import { SYMBOL_VEST } from './constants'; + +/** + * Throws an error when multiple versions of Vest are detected on the same runtime. + * @param {String[]} versions List of detected Vest versions. + */ +const throwMultipleVestError = (...versions) => { + throwError(`Multiple versions of Vest detected: (${versions.join()}). + Most features should work regularly, but for optimal feature compatibility, you should have all running instances use the same version.`); +}; + +/** + * Registers current Vest instance on global object. + * @param {Object} vest Reference to Vest. + * @return {Function} Global Vest reference. + */ +const register = (vest) => { + + const existing = go[SYMBOL_VEST]; + + if (existing) { + if (existing.VERSION !== vest.VERSION) { + throwMultipleVestError(vest.VERSION, existing.VERSION); + } + } else { + go[SYMBOL_VEST] = vest; + } + + return go[SYMBOL_VEST]; +}; + +/** + * @returns Global Vest instance. + */ +const use = () => go[SYMBOL_VEST]; + +/** + * @returns Current Vest context. + */ +const useContext = () => use().ctx; + +export default { + use, + useContext, + register +}; diff --git a/src/lib/singleton/spec.js b/src/lib/singleton/spec.js new file mode 100644 index 000000000..40d3e7595 --- /dev/null +++ b/src/lib/singleton/spec.js @@ -0,0 +1,115 @@ +import _ from 'lodash'; +import faker from 'faker'; +import { version } from '../../../package.json'; +import vest from '../..'; +import go from '../globalObject'; +import { SYMBOL_VEST } from './constants'; +import singleton from '.'; + +describe('singleton', () => { + + afterAll(() => { + singleton.register(vest); + }); + + describe('Attaching to global scope', () => { + beforeEach(() => { + delete go[SYMBOL_VEST]; + }); + + afterEach(() => { + delete go[SYMBOL_VEST]; + }); + + test('That global instance is not populated', () => { + expect(go[SYMBOL_VEST]).toBe(undefined); + }); + + it('Should register vest on the global object', () => { + singleton.register(vest); + + expect(go[SYMBOL_VEST]).toBe(vest); + }); + + describe('When already registered', () => { + + beforeEach(() => { + singleton.register(vest); + }); + + describe('When same version', () => { + it('Should return silently', (done) => { + const timeout = setTimeout(() => done(), 300); + + process.on('uncaughtException', () => { + clearTimeout(timeout); + }); + }); + }); + + describe('When different version', () => { + let singleton, mockThrowError; + + beforeEach(() => { + mockThrowError = jest.fn(); + jest.resetModules(); + jest.mock('../throwError/', () => ({ + __esModule: true, + default: mockThrowError + })); + singleton = require('.'); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('Should throw an error', () => { + const fn = () => null; + fn.VERSION = '222'; + + singleton.register(fn); + expect(mockThrowError.mock.calls[0][0]).toBe(`Multiple versions of Vest detected: (222,${version}).\n Most features should work regularly, but for optimal feature compatibility, you should have all running instances use the same version.`); + }); + }); + }); + }); + + describe('Make sure everything works together', () => { + + beforeAll(() => { + singleton.register(vest); + }); + + const instances = [] + .concat( + require('../../'), + global.vestDistVersions + ); + + const pairs = instances.reduce((pairs, { validate }) => ( + [...pairs, ...instances.map(({ test }) => [ validate, test ])] + ), []); + + it.each(pairs)( + 'Should produce correct validation result', + (validate, test) => { + const errorCount = _.random(1, 10); + const successCount = _.random(1, 10); + const warnCount = _.random(1, 10); + const output = validate(faker.random.word(), () => { + Array.from({ length: warnCount }, () => test(faker.random.word(), faker.lorem.sentence(), function() { + this.warn(); + return false; + })); + Array.from({ length: errorCount }, () => test(faker.random.word(), faker.lorem.sentence(), () => false)); + Array.from({ length: successCount }, () => test(faker.random.word(), faker.lorem.sentence(), () => true)); + }); + + expect(output.errorCount).toBe(errorCount); + expect(output.warnCount).toBe(warnCount); + expect(output.testCount).toBe(warnCount + errorCount + successCount); + } + ); + }); +}); diff --git a/src/lib/throwError/index.js b/src/lib/throwError/index.js new file mode 100644 index 000000000..f60c32ad1 --- /dev/null +++ b/src/lib/throwError/index.js @@ -0,0 +1,10 @@ +/** + * Throws a timed out error. + * @param {String} message Error message to display. + * @param {Error} [type] Alternative Error type. + */ +const throwError = (message, type = Error) => setTimeout(() => { + throw new type(`[Vest]: ${message}`); +}); + +export default throwError; diff --git a/src/lib/throwError/spec.js b/src/lib/throwError/spec.js new file mode 100644 index 000000000..2ba2b7038 --- /dev/null +++ b/src/lib/throwError/spec.js @@ -0,0 +1,22 @@ +const faker = require('faker'); +const throwError = require('.'); + +describe('throwError', () => { + let _setTimeout, errorString; + + beforeEach(() => { + errorString = faker.lorem.sentence(); + _setTimeout = global.setTimeout; + global.setTimeout = jest.fn((cb) => cb()); + }); + + afterEach(() => { + global.setTimeout = _setTimeout; + }); + + it('Should throw a timed out error', () => { + expect(setTimeout).toHaveBeenCalledTimes(0); + expect(() => throwError(errorString)).toThrow(); + expect(setTimeout).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/spec.js b/src/spec.js new file mode 100644 index 000000000..67d56ca55 --- /dev/null +++ b/src/spec.js @@ -0,0 +1,114 @@ +const { version } = require('../package.json'); +const vest = require('.'); + +describe('Vest exports', () => { + test('All vest exports exist', () => { + expect(vest).toMatchSnapshot({ + VERSION: expect.any(String) + }); + expect(vest.VERSION).toBe(version); + }); +}); + +describe('General scenario tests', () => { + let v, test, validate, enforce; + + beforeAll(() => { + ({ test, validate, enforce } = vest); + }); + + describe('Base case', () => { + + it('Should match snapshot', () => { + + v = validate('eveniet-maxime-ea', () => { + test('sed-minima-adipisci', 'Aliquam reprehenderit iure omnis assumenda eligendi enim id praesentium numquam.', () => { + enforce(1).equals(2); + }); + + test('non-rem-dolorem', () => { + enforce(1).inside([1, 2, 3]); + }); + }); + expect(v).toMatchSnapshot(); + }); + }); + + describe('Exclusion via `only`', () => { + + it('Should match snapshot', () => { + + v = validate('inventore-quis-impedit', () => { + vest.only('doloribus-enim-quisquam'); + + test('doloribus-enim-quisquam', 'Ea quia saepe modi corrupti possimus similique expedita inventore.', () => { + enforce(1).notEquals(2); + }); + + test('autem', () => null); + test('soluta', () => null); + }); + expect(v).toMatchSnapshot(); + }); + }); + + describe('Exclusion via `skip`', () => { + + it('Should match snapshot', () => { + + v = validate('corrupti-alias-autem', () => { + vest.skip('doloribus-enim-quisquam'); + + test('doloribus-enim-quisquam', 'Ea quia saepe modi corrupti possimus similique expedita inventore.', () => { + enforce(1).notEquals(2); + }); + + test('autem', 'Temporibus ex ex.',() => { + vest.warn(); + return 1 === 2; + }); + }); + expect(v).toMatchSnapshot(); + }); + }); + + describe('Tests with warnings', () => { + + it('Should match snapshot', () => { + + v = validate('corrupti-alias-autem', () => { + vest.skip('doloribus-enim-quisquam'); + + test('doloribus-enim-quisquam', 'Ea quia saepe modi corrupti possimus similique expedita inventore.', () => { + enforce(1).notEquals(2); + }); + + test('autem', 'Temporibus ex ex.',() => { + vest.warn(); + return 1 === 2; + }); + test('autem', () => { + vest.warn(); + enforce(1).gt(0); + }); + }); + expect(v).toMatchSnapshot(); + }); + }); + + describe('Async tests', () => { + + it('Should match snapshot', (done) => { + + v = validate('molestias-veritatis-deserunt', () => { + test('doloribus-enim-quisquam', 'Fuga odit ut quidem autem dolores ipsam.', () => Promise.resolve()); + test('doloribus-enim-quisquam', 'Fuga odit ut quidem autem dolores ipsam.', () => Promise.reject()); + }); + setTimeout(() => { + expect(v).toMatchSnapshot(); + done(); + }); + }); + }); + +}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..1090475f4 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4958 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/cli@^7.5.5": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.7.7.tgz#56849acbf81d1a970dd3d1b3097c8ebf5da3f534" + integrity sha512-XQw5KyCZyu/M8/0rYiZyuwbgIQNzOrJzs9dDLX+MieSgBwTLvTj4QVbLmxJACAIvQIDT7PtyHN2sC48EOWTgaA== + dependencies: + commander "^4.0.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.13" + make-dir "^2.1.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.1.8" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.1.0", "@babel/core@^7.7.4": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" + integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.7" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.7" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.7.4", "@babel/generator@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" + integrity sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ== + dependencies: + "@babel/types" "^7.7.4" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce" + integrity sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f" + integrity sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-call-delegate@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801" + integrity sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA== + dependencies: + "@babel/helper-hoist-variables" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-create-regexp-features-plugin@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59" + integrity sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A== + dependencies: + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/helper-define-map@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz#2841bf92eb8bd9c906851546fe6b9d45e162f176" + integrity sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg== + dependencies: + "@babel/helper-function-name" "^7.7.4" + "@babel/types" "^7.7.4" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84" + integrity sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg== + dependencies: + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" + integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== + dependencies: + "@babel/helper-get-function-arity" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-get-function-arity@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" + integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helper-hoist-variables@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12" + integrity sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helper-member-expression-to-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" + integrity sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" + integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helper-module-transforms@^7.7.4", "@babel/helper-module-transforms@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz#d044da7ffd91ec967db25cd6748f704b6b244835" + integrity sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw== + dependencies: + "@babel/helper-module-imports" "^7.7.4" + "@babel/helper-simple-access" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" + integrity sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" + integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz#c68c2407350d9af0e061ed6726afb4fff16d0234" + integrity sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.7.4" + "@babel/helper-wrap-function" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-replace-supers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" + integrity sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.7.4" + "@babel/helper-optimise-call-expression" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-simple-access@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294" + integrity sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A== + dependencies: + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-split-export-declaration@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" + integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helper-wrap-function@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace" + integrity sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg== + dependencies: + "@babel/helper-function-name" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helpers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" + integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== + dependencies: + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.4", "@babel/parser@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" + integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== + +"@babel/plugin-proposal-async-generator-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d" + integrity sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.7.4" + "@babel/plugin-syntax-async-generators" "^7.7.4" + +"@babel/plugin-proposal-dynamic-import@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d" + integrity sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.7.4" + +"@babel/plugin-proposal-json-strings@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz#7700a6bfda771d8dc81973249eac416c6b4c697d" + integrity sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.7.4" + +"@babel/plugin-proposal-object-rest-spread@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz#9f27075004ab99be08c5c1bd653a2985813cb370" + integrity sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.7.4" + +"@babel/plugin-proposal-optional-catch-binding@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379" + integrity sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" + +"@babel/plugin-proposal-unicode-property-regex@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.7.tgz#433fa9dac64f953c12578b29633f456b68831c4e" + integrity sha512-80PbkKyORBUVm1fbTLrHpYdJxMThzM1UqFGh0ALEhO9TYbG86Ah9zQYAB/84axz2vcxefDLdZwWwZNlYARlu9w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-async-generators@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz#331aaf310a10c80c44a66b238b6e49132bd3c889" + integrity sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" + integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz#86e63f7d2e22f9e27129ac4e83ea989a382e86cc" + integrity sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" + integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6" + integrity sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-top-level-await@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da" + integrity sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12" + integrity sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba" + integrity sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg== + dependencies: + "@babel/helper-module-imports" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.7.4" + +"@babel/plugin-transform-block-scoped-functions@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b" + integrity sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" + integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec" + integrity sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.7.4" + "@babel/helper-define-map" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-optimise-call-expression" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d" + integrity sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267" + integrity sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.7.tgz#3e9713f1b69f339e87fa796b097d73ded16b937b" + integrity sha512-b4in+YlTeE/QmTgrllnb3bHA0HntYvjz8O3Mcbx75UBPJA2xhb5A8nle498VhxSXJHQefjtQxpnLPehDJ4TRlg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-duplicate-keys@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz#3d21731a42e3f598a73835299dd0169c3b90ac91" + integrity sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9" + integrity sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc" + integrity sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1" + integrity sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g== + dependencies: + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e" + integrity sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a" + integrity sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz#39e0fb717224b59475b306402bb8eedab01e729c" + integrity sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ== + dependencies: + "@babel/helper-module-transforms" "^7.7.5" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz#1d27f5eb0bcf7543e774950e5b2fa782e637b345" + integrity sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q== + dependencies: + "@babel/helper-module-transforms" "^7.7.5" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.7.4" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30" + integrity sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw== + dependencies: + "@babel/helper-hoist-variables" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz#1027c355a118de0aae9fee00ad7813c584d9061f" + integrity sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw== + dependencies: + "@babel/helper-module-transforms" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz#fb3bcc4ee4198e7385805007373d6b6f42c98220" + integrity sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" + +"@babel/plugin-transform-new-target@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz#4a0753d2d60639437be07b592a9e58ee00720167" + integrity sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-assign@^7.2.0": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.7.4.tgz#a31b70c434a00a078b2d4d10dbd59992fa70afca" + integrity sha512-0TpeUlnhQDwKxPLTIckdaWt46L2s61c/5w5snw1OUod5ehOJywZD98Ha3dFHVjeqkfOFtOTH7cqxddjxUuvcmg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262" + integrity sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.7.4" + +"@babel/plugin-transform-parameters@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz#7a884b2460164dc5f194f668332736584c760007" + integrity sha512-OhGSrf9ZBrr1fw84oFXj5hgi8Nmg+E2w5L7NhnG0lPvpDtqd7dbyilM2/vR8CKbJ907RyxPh2kj6sBCSSfI9Ew== + dependencies: + "@babel/helper-call-delegate" "^7.7.4" + "@babel/helper-get-function-arity" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2" + integrity sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz#3a8757ee1a2780f390e89f246065ecf59c26fce9" + integrity sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz#6a7cf123ad175bb5c69aec8f6f0770387ed3f1eb" + integrity sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e" + integrity sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578" + integrity sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c" + integrity sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604" + integrity sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz#3174626214f2d6de322882e498a38e8371b2140e" + integrity sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" + integrity sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/preset-env@^7.7.4": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.7.tgz#c294167b91e53e7e36d820e943ece8d0c7fe46ac" + integrity sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg== + dependencies: + "@babel/helper-module-imports" "^7.7.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.7.4" + "@babel/plugin-proposal-dynamic-import" "^7.7.4" + "@babel/plugin-proposal-json-strings" "^7.7.4" + "@babel/plugin-proposal-object-rest-spread" "^7.7.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.7.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.7.7" + "@babel/plugin-syntax-async-generators" "^7.7.4" + "@babel/plugin-syntax-dynamic-import" "^7.7.4" + "@babel/plugin-syntax-json-strings" "^7.7.4" + "@babel/plugin-syntax-object-rest-spread" "^7.7.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" + "@babel/plugin-syntax-top-level-await" "^7.7.4" + "@babel/plugin-transform-arrow-functions" "^7.7.4" + "@babel/plugin-transform-async-to-generator" "^7.7.4" + "@babel/plugin-transform-block-scoped-functions" "^7.7.4" + "@babel/plugin-transform-block-scoping" "^7.7.4" + "@babel/plugin-transform-classes" "^7.7.4" + "@babel/plugin-transform-computed-properties" "^7.7.4" + "@babel/plugin-transform-destructuring" "^7.7.4" + "@babel/plugin-transform-dotall-regex" "^7.7.7" + "@babel/plugin-transform-duplicate-keys" "^7.7.4" + "@babel/plugin-transform-exponentiation-operator" "^7.7.4" + "@babel/plugin-transform-for-of" "^7.7.4" + "@babel/plugin-transform-function-name" "^7.7.4" + "@babel/plugin-transform-literals" "^7.7.4" + "@babel/plugin-transform-member-expression-literals" "^7.7.4" + "@babel/plugin-transform-modules-amd" "^7.7.5" + "@babel/plugin-transform-modules-commonjs" "^7.7.5" + "@babel/plugin-transform-modules-systemjs" "^7.7.4" + "@babel/plugin-transform-modules-umd" "^7.7.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4" + "@babel/plugin-transform-new-target" "^7.7.4" + "@babel/plugin-transform-object-super" "^7.7.4" + "@babel/plugin-transform-parameters" "^7.7.7" + "@babel/plugin-transform-property-literals" "^7.7.4" + "@babel/plugin-transform-regenerator" "^7.7.5" + "@babel/plugin-transform-reserved-words" "^7.7.4" + "@babel/plugin-transform-shorthand-properties" "^7.7.4" + "@babel/plugin-transform-spread" "^7.7.4" + "@babel/plugin-transform-sticky-regex" "^7.7.4" + "@babel/plugin-transform-template-literals" "^7.7.4" + "@babel/plugin-transform-typeof-symbol" "^7.7.4" + "@babel/plugin-transform-unicode-regex" "^7.7.4" + "@babel/types" "^7.7.4" + browserslist "^4.6.0" + core-js-compat "^3.6.0" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/register@^7.5.5": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.7.7.tgz#46910c4d1926b9c6096421b23d1f9e159c1dcee1" + integrity sha512-S2mv9a5dc2pcpg/ConlKZx/6wXaEwHeqfo7x/QbXsdCAZm+WJC1ekVvL1TVxNsedTs5y/gG63MhJTEsmwmjtiA== + dependencies: + find-cache-dir "^2.0.0" + lodash "^4.17.13" + make-dir "^2.1.0" + pirates "^4.0.0" + source-map-support "^0.5.16" + +"@babel/template@^7.4.0", "@babel/template@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" + integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" + integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" + integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@types/babel__core@^7.1.0": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" + integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012" + integrity sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/estree@*": + version "0.0.40" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.40.tgz#0e6cb9b9bbd098031fa19e4b4e8131bc70e5de13" + integrity sha512-p3KZgMto/JyxosKGmnLDJ/dG5wf+qTRMUjHJcspC2oQKa4jP7mz+tv0ND56lLBu3ojHlhzY33Ol+khLyNmilkA== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" + integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + +"@types/node@*": + version "12.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.21.tgz#aa44a6363291c7037111c47e4661ad210aded23f" + integrity sha512-8sRGhbpU+ck1n0PGAUgVrWrWdjSW2aqNeyC15W88GRsMpSwzv6RJGlLhE7s2RhVSOdyDmxbqlWSeThq4/7xqlA== + +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs-parser@*": + version "13.1.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" + integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== + +"@types/yargs@^13.0.0": + version "13.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" + integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/experimental-utils@^2.5.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.12.0.tgz#e0a76ffb6293e058748408a191921e453c31d40d" + integrity sha512-jv4gYpw5N5BrWF3ntROvCuLe1IjRenLy5+U57J24NbPGwZFAjhnM45qpq0nDH1y/AZMb3Br25YiNVwyPbz6RkA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.12.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/typescript-estree@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.12.0.tgz#bd9e547ccffd17dfab0c3ab0947c80c8e2eb914c" + integrity sha512-rGehVfjHEn8Frh9UW02ZZIfJs6SIIxIu/K1bbci8rFfDE/1lQ8krIJy5OXOV3DVnNdDPtoiPOdEANkLMrwXbiQ== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash.unescape "4.0.1" + semver "^6.3.0" + tsutils "^3.17.1" + +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + +acorn-globals@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anyone@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/anyone/-/anyone-0.0.5.tgz#678fa6fc7fb96d099403b9ad7b0663c96a812ac2" + integrity sha512-9oQ6Fa4PBpt5e8ba0WXVa26+i1ig2Rxz132OVh/YJZLehlW6NnPSaoI7jAIn9E+NuoVG/taPapMJQIvwiL4zPQ== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-includes@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.0.tgz#48a929ef4c6bb1fa6dc4a92c9b023a261b0ca404" + integrity sha512-ONOEQoKrvXPKk7Su92Co0YMqYO32FfqJTzkKU9u2UpIXyYZIzLSvpdg4AwvSw4mSUW0czu6inK+zby6Oj6gDjQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.0" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" + integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== + +babel-eslint@^10.0.1: + version "10.0.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" + integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-loader@^8.0.6: + version "8.0.6" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" + integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== + dependencies: + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + pify "^4.0.1" + +babel-plugin-add-module-exports@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.2.tgz#96cd610d089af664f016467fc4567c099cce2d9c" + integrity sha512-4paN7RivvU3Rzju1vGSHWPjO8Y0rI6droWvSFKI6dvEQ4mvoV0zGojnlzVRfI6N8zISo6VERXt3coIuVmzuvNg== + optionalDependencies: + chokidar "^2.0.4" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + 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" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + 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" + +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserslist@^4.6.0, browserslist@^4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.2.tgz#b45720ad5fbc8713b7253c20766f701c9a694289" + integrity sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA== + dependencies: + caniuse-lite "^1.0.30001015" + electron-to-chromium "^1.3.322" + node-releases "^1.1.42" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +builtin-modules@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" + integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + 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" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001015: + version "1.0.30001016" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz#16ea48d7d6e8caf3cad3295c2d746fe38c4e7f66" + integrity sha512-yYQ2QfotceRiH4U+h1Us86WJXtVHDmy3nEKIdYPsZCYnOV5/tMgGbmoIlrMzmh2VXlproqYtVaKeGDBkMZifFA== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^2.0.4, chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0, commander@~2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c" + integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.0.tgz#4eb6cb69d03d99159ed7c860cd5fcf7d23a62ea9" + integrity sha512-Z3eCNjGgoYluH89Jt4wVkfYsc/VdLrA2/woX5lm0isO/pCT+P+Y+o65bOuEnjDJLthdwTBxbCVzptTXtc18fJg== + dependencies: + browserslist "^4.8.2" + semver "7.0.0" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cross-env@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941" + integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag== + dependencies: + cross-spawn "^7.0.0" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +date-fns@^2.0.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.8.1.tgz#2109362ccb6c87c3ca011e9e31f702bc09e4123b" + integrity sha512-EL/C8IHvYRwAHYgFRse4MGAPSqlJVlOrhVYZ75iQBKrnv+ZedmYsgwH3t+BCDuZDXpoo07+q9j4qgSSOa7irJg== + +debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +electron-to-chromium@^1.3.322: + version "1.3.322" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8" + integrity sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1: + version "1.17.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0-next.1.tgz#94acc93e20b05a6e96dacb5ab2f1cb3a81fc2172" + integrity sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.0" + string.prototype.trimright "^2.1.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.9.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" + integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-import-resolver-node@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.4.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.0.tgz#cdf0b40d623032274ccd2abd7e64c4e524d6e19c" + integrity sha512-kCo8pZaNz2dsAW7nCUjuVoI11EBXXpIzfNxmaoLhXoRDOnqXLC4iSGVRdZPhOitfbdEfMEfKOiENaK6wDPZEGw== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-import@^2.18.2: + version "2.19.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz#5654e10b7839d064dd0d46cd1b88ec2133a11448" + integrity sha512-x68131aKoCZlCae7rDXKSAQmbT5DQuManyXo2sK6fJJ0aK5CWAkv6A6HJZGgqC8IhjQxYPgo6/IY4Oz8AFsbBw== + dependencies: + 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@^23.0.5: + version "23.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.1.1.tgz#1220ab53d5a4bf5c3c4cd07c0dabc6199d4064dd" + integrity sha512-2oPxHKNh4j1zmJ6GaCBuGcb8FVZU7YjFUOJzGOPnl9ic7VA/MGAskArLJiRIlnFUmi1EUxY+UiATAy8dv8s5JA== + dependencies: + "@typescript-eslint/experimental-utils" "^2.5.0" + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^6.7.1: + version "6.7.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.2.tgz#c17707ca4ad7b2d8af986a33feba71e18a9fecd1" + integrity sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng== + dependencies: + "@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" + +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + 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@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + 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" + +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + 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" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +faker@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" + integrity sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" + integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + dependencies: + type-fest "^0.8.1" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +handlebars@^4.1.2: + version "4.5.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" + integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.1.tgz#13f7980eedc73c689feff3994b109c4e799c6ebb" + integrity sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + 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.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-reference@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.4.tgz#3f95849886ddb70256a3e6d062b1a68c13c51427" + integrity sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw== + dependencies: + "@types/estree" "0.0.39" + +is-regex@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" + integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== + dependencies: + handlebars "^4.1.2" + +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-utils@^1.0.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + +lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +magic-string@^0.25.2: + version "0.25.4" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.4.tgz#325b8a0a79fc423db109b77fd5a19183b7ba5143" + integrity sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mime-db@1.42.0: + version "1.42.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" + integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.25" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" + integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== + dependencies: + mime-db "1.42.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +n4s@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/n4s/-/n4s-0.4.2.tgz#13475e27bc9305415c10e5ec302f10e924f85f5c" + integrity sha512-/UfMmEpa1WPkclzG8QSF1C/EX3EN9JuHf5Bk+4mSarb2gC0nnX4xBbBcIjycT9MJW+tMxGqsB6J2ReWG6fQdGA== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + 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@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +neo-async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-fetch@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-releases@^1.1.42: + version "1.1.43" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.43.tgz#2c6ca237f88ce11d49631f11190bb01f8d0549f2" + integrity sha512-Rmfnj52WNhvr83MvuAWHEqXVoZXCcDQssSOffU4n4XOL9sPrP61mSZ88g25NqmABDvH7PiAlFCzoSCSdzA293w== + dependencies: + semver "^6.3.0" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +nwsapi@^2.0.7: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + 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@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.0, pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompts@^2.0.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4" + integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.3" + +psl@^1.1.24, psl@^1.1.28: + version "1.6.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.6.0.tgz#60557582ee23b6c43719d9890fb4170ecd91e110" + integrity sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +react-is@^16.8.4: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@^2.0.2: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +regenerate-unicode-properties@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-transform@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" + integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== + dependencies: + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpu-core@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" + integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.1.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.1.tgz#5b6b28c418f312ef42898dc6865ae2d4b9f0f7a2" + integrity sha512-7LutE94sz/NKSYegK+/4E77+8DipxF+Qn2Tmu362AcmsF2NYq/wx3+ObvU90TKEhjf7hQoFXo23ajjrXP7eUgg== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + 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.0" + 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.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.10.0, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" + integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rollup-plugin-babel@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.3.3.tgz#7eb5ac16d9b5831c3fd5d97e8df77ba25c72a2aa" + integrity sha512-tKzWOCmIJD/6aKNz0H1GMM+lW1q9KyFubbWzGiOG540zxPPifnEAHTZwjo0g991Y+DyOZcLqBgqOdqazYE5fkw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + rollup-pluginutils "^2.8.1" + +rollup-plugin-commonjs@^10.0.2: + version "10.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb" + integrity sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q== + dependencies: + estree-walker "^0.6.1" + is-reference "^1.1.2" + magic-string "^0.25.2" + resolve "^1.11.0" + rollup-pluginutils "^2.8.1" + +rollup-plugin-node-resolve@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523" + integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw== + dependencies: + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.11.1" + rollup-pluginutils "^2.8.1" + +rollup-plugin-replace@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz#f41ae5372e11e7a217cde349c8b5d5fd115e70e3" + integrity sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA== + dependencies: + magic-string "^0.25.2" + rollup-pluginutils "^2.6.0" + +rollup-plugin-terser@^5.0.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.1.3.tgz#5f4c4603b12b4f8d093f4b6f31c9aa5eba98a223" + integrity sha512-FuFuXE5QUJ7snyxHLPp/0LFXJhdomKlIx/aK7Tg88Yubsx/UU/lmInoJafXJ4jwVVNcORJ1wRUC5T9cy5yk0wA== + dependencies: + "@babel/code-frame" "^7.0.0" + jest-worker "^24.6.0" + rollup-pluginutils "^2.8.1" + serialize-javascript "^2.1.2" + terser "^4.1.0" + +rollup-pluginutils@^2.6.0, rollup-pluginutils@^2.8.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^1.18.0: + version "1.27.13" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.27.13.tgz#d6d3500512daacbf8de54d2800de62d893085b90" + integrity sha512-hDi7M07MpmNSDE8YVwGVFA8L7n8jTLJ4lG65nMAijAyqBe//rtu4JdxjUBE7JqXfdpqxqDTbCDys9WcqdpsQvw== + dependencies: + "@types/estree" "*" + "@types/node" "*" + acorn "^7.1.0" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +rxjs@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@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" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +sisteransi@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" + integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + 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" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.4: + version "1.4.6" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" + integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + 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@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimleft@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +terser@^4.1.0: + version "4.4.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.3.tgz#401abc52b88869cf904412503b1eb7da093ae2f0" + integrity sha512-0ikKraVtRDKGzHrzkCv5rUNDzqlhmhowOBqC0XqUHFpW+vJ45+20/IFBcebwKfiS2Z9fJin6Eo+F1zLZsxi8RA== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +uglify-js@^3.1.4: + version "3.7.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.2.tgz#cb1a601e67536e9ed094a92dd1e333459643d3f9" + integrity sha512-uhRwZcANNWVLrxLfNFEdltoPNhECUR3lc+UdJoG9CBpMcSnKyWA94tc3eAujB1GcMY5Uwq8ZMp4qWpxWYDQmaA== + dependencies: + commander "~2.20.3" + source-map "~0.6.1" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +uuid@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1"