├── .eslintignore ├── src ├── lgtm │ ├── config.js │ ├── validator_builder.js │ ├── utils.js │ ├── helpers │ │ └── core.js │ ├── validation.js │ └── object_validator.js └── lgtm.js ├── .npmrc ├── test ├── lgtm.js ├── mocha.opts ├── .eslintrc ├── support │ └── resolve.js ├── regressions │ ├── 17_required_message_test.js │ └── 08_duplicate_errors_test.js ├── helpers │ ├── registration_test.js │ └── core_test.js ├── helpers_test.js ├── object_validator_test.js ├── validator_test.js └── validates_test.js ├── .gitignore ├── .babelrc ├── docs ├── Squareup-API-Documentation.md ├── API Reference.md ├── Custom Helpers.md ├── ObjectValidator.md └── ValidatorBuilder.md ├── .eslintrc ├── README.md ├── LICENSE ├── CHANGELOG.md ├── .github └── workflows │ └── ci.yml ├── package.json ├── script └── build └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | dist -------------------------------------------------------------------------------- /src/lgtm/config.js: -------------------------------------------------------------------------------- 1 | export default {}; 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | registry = "https://registry.yarnpkg.com/" -------------------------------------------------------------------------------- /test/lgtm.js: -------------------------------------------------------------------------------- 1 | export * from '../src/lgtm'; 2 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --recursive --require @babel/register test 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib 2 | node_modules 3 | *.map 4 | dist 5 | *.log 6 | -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../.eslintrc", 3 | "env": { 4 | "mocha": true, 5 | "node": true 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test/support/resolve.js: -------------------------------------------------------------------------------- 1 | export default function resolve(value) { 2 | return new Promise(accept => accept(value)); 3 | } 4 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/env"], 3 | "plugins": [ 4 | "@babel/plugin-proposal-class-properties" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /docs/Squareup-API-Documentation.md: -------------------------------------------------------------------------------- 1 | Please Visit our new API Documentation located on the link below 2 | 3 | [API Documentation](https://squareup.com) -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["eslint:recommended", "prettier"], 3 | "plugins": [ 4 | "prettier" 5 | ], 6 | "env": { 7 | "es6": true 8 | }, 9 | "parser": "babel-eslint", 10 | "parserOptions": { 11 | "sourceType": "module" 12 | }, 13 | "rules": { 14 | "prettier/prettier": ["error", { 15 | "singleQuote": true 16 | }] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /test/regressions/17_required_message_test.js: -------------------------------------------------------------------------------- 1 | import { validator } from '../lgtm'; 2 | import { throws } from 'assert'; 3 | 4 | describe('#17 | Ensure `required` calls without a message fail', () => { 5 | it('throws when calling `required` without a message', () => { 6 | throws(() => { 7 | validator() 8 | .validates('password') 9 | .required() 10 | .build(); 11 | }, /expected a message but got: undefined/); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LGTM 2 | 3 | [![npm version](https://badge.fury.io/js/lgtm.svg)](https://badge.fury.io/js/lgtm) 4 | ![CI](https://github.com/square/lgtm/workflows/CI/badge.svg) 5 | 6 | LGTM is a simple JavaScript library for validating objects and collecting error 7 | messages. It leaves the display, behavior, and error messages in your hands, 8 | focusing on letting you describe your validations cleanly and concisely for 9 | whatever environment you're using. 10 | 11 | For examples, installation, setup and more [see the wiki](https://github.com/square/lgtm/wiki). 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2013 Square Inc. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | -------------------------------------------------------------------------------- /test/helpers/registration_test.js: -------------------------------------------------------------------------------- 1 | import { helpers as validations, validator } from '../lgtm'; 2 | import { notStrictEqual, strictEqual } from 'assert'; 3 | 4 | describe('helpers.(un)register', () => { 5 | it('can add and remove a helper from the builder', () => { 6 | let builder = validator(); 7 | strictEqual( 8 | builder.isEven, 9 | undefined, 10 | 'precondition: helper is not there yet' 11 | ); 12 | 13 | validations.register('isEven', function() { 14 | this.using(value => value % 2 === 0); 15 | }); 16 | 17 | notStrictEqual(builder.isEven, undefined, 'helper is added to the builder'); 18 | 19 | validations.unregister('isEven'); 20 | strictEqual( 21 | builder.isEven, 22 | undefined, 23 | 'postcondition: helper is removed after unregister' 24 | ); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## Changelog 2 | 3 | ### v0.3.2 January 29th, 2014 4 | 5 | * [FEATURE] Add .and() as a DSL alias for .when() for more readable chaining. (906a1f0) 6 | 7 | ### v0.3.1 January 29th, 2014 8 | 9 | * [FIX] Ensure conditions only apply to .using() calls made later. (7411233) 10 | 11 | ### v0.3.0 January 28th, 2014 12 | 13 | * [FEATURE] Allow calling `ValidatorBuilder#when()` multiple times per `#validates()` call. (02a6a6b) 14 | 15 | ### v0.2.0 January 7th, 2014 16 | 17 | * Update [RSVP](https://github.com/tildeio/rsvp.js) to 3.0.3. (58b1b64) 18 | 19 | ### v0.1.0 October 23, 2013 20 | 21 | * [FIX] Actually make lgtm.js omit RSVP. (a717792) 22 | 23 | ### v0.0.2 October 22, 2013 24 | 25 | * [FIX] Do parameter checking in using() and update bundled RSVP. (006ece8) 26 | 27 | ### v0.0.1 August 24, 2013 28 | 29 | * Initial release. (c967aca) 30 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: CI 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [6.x, 8.x, 10.x, 12.x, 14.x] 20 | 21 | steps: 22 | - uses: actions/checkout@v2 23 | - name: Use Node.js ${{ matrix.node-version }} 24 | uses: actions/setup-node@v1 25 | with: 26 | node-version: ${{ matrix.node-version }} 27 | - run: yarn install --frozen-lockfile --non-interactive 28 | - run: yarn lint 29 | - run: yarn test 30 | -------------------------------------------------------------------------------- /test/regressions/08_duplicate_errors_test.js: -------------------------------------------------------------------------------- 1 | import { validator } from '../lgtm'; 2 | import { deepEqual, ok } from 'assert'; 3 | 4 | describe('#8 | Dependent validations cause duplicate errors', () => { 5 | it('does not duplicate "Passwords must match"', () => { 6 | let v = validator() 7 | .validates('password') 8 | .required('Please input a password') 9 | .validates('passwordConfirm') 10 | .when('password', password => password !== undefined) 11 | .required('Please confirm your password') 12 | .using( 13 | (confirm, attr, form) => confirm === form.password, 14 | 'Passwords must match' 15 | ) 16 | .build(); 17 | 18 | let form = { 19 | password: 'asdf', 20 | passwordConfirm: undefined 21 | }; 22 | 23 | return v.validate(form).then(result => { 24 | ok(!result.valid, 'it should not be valid'); 25 | deepEqual(Object.keys(result.errors).sort(), [ 26 | 'password', 27 | 'passwordConfirm' 28 | ]); 29 | deepEqual(result.errors['password'], []); 30 | deepEqual(result.errors['passwordConfirm'], [ 31 | 'Please confirm your password', 32 | 'Passwords must match' 33 | ]); 34 | }); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lgtm", 3 | "version": "0.0.0-development", 4 | "description": "Simple JavaScript validation for objects.", 5 | "main": "dist/lgtm.js", 6 | "jsnext:main": "dist/lgtm.mjs", 7 | "scripts": { 8 | "lint": "eslint .", 9 | "build": "rm -rf dist && script/build", 10 | "pretest": "npm run lint", 11 | "test": "mocha", 12 | "prepublish": "npm test && npm run build" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/square/lgtm.git" 17 | }, 18 | "keywords": [ 19 | "validation" 20 | ], 21 | "author": "Square, Inc.", 22 | "license": "Apache-2.0", 23 | "devDependencies": { 24 | "@babel/core": "^7.10.2", 25 | "@babel/plugin-external-helpers": "^7.10.1", 26 | "@babel/plugin-proposal-class-properties": "^7.10.1", 27 | "@babel/preset-env": "^7.10.2", 28 | "@babel/register": "^7.10.1", 29 | "babel-eslint": "^10.1.0", 30 | "eslint": "^5", 31 | "eslint-config-prettier": "^6.11.0", 32 | "eslint-plugin-prettier": "^3.1.3", 33 | "file-size": "^1.0.0", 34 | "gzip-size": "^5.1.1", 35 | "mocha": "^6", 36 | "prettier": "^1.19.1", 37 | "rollup": "^1", 38 | "rollup-plugin-babel": "^4.4.0", 39 | "uglify-js": "^3.9.4" 40 | }, 41 | "files": [ 42 | "dist" 43 | ], 44 | "publishConfig": { 45 | "registry": "https://registry.npmjs.org/" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/lgtm/validator_builder.js: -------------------------------------------------------------------------------- 1 | import ObjectValidator from './object_validator'; 2 | import Validation from './validation'; 3 | 4 | export default class ValidatorBuilder { 5 | _validations = null; 6 | _validation = null; 7 | 8 | constructor(...validations) { 9 | this._validations = validations; 10 | } 11 | 12 | validates(attr) { 13 | this._validation = new Validation(attr); 14 | this._validations.push(this._validation); 15 | return this; 16 | } 17 | 18 | when(/* ...dependencies, condition */) { 19 | this._validation.when(...arguments); 20 | return this; 21 | } 22 | 23 | and(/* ...dependencies, condition */) { 24 | this._validation.and(...arguments); 25 | return this; 26 | } 27 | 28 | using(/* ...dependencies, predicate, message */) { 29 | this._validation.using(...arguments); 30 | return this; 31 | } 32 | 33 | build() { 34 | return new ObjectValidator(...this._validations); 35 | } 36 | 37 | static registerHelper(name, fn) { 38 | this.prototype[name] = function() { 39 | fn.apply(this._validation, arguments); 40 | return this; 41 | }; 42 | 43 | Validation.prototype[name] = function() { 44 | fn.apply(this, arguments); 45 | return this; 46 | }; 47 | 48 | return null; 49 | } 50 | 51 | static unregisterHelper(name) { 52 | delete this.prototype[name]; 53 | delete Validation.prototype[name]; 54 | return null; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /script/build: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | 'use strict'; 4 | 5 | let rollup = require('rollup').rollup; 6 | let babel = require('rollup-plugin-babel'); 7 | let filesize = require('file-size'); 8 | let gzipSize = require('gzip-size').sync; 9 | let readFileSync = require('fs').readFileSync; 10 | let minify = require('uglify-js').minify; 11 | 12 | rollup({ 13 | input: 'src/lgtm.js', 14 | plugins: [ 15 | babel({ 16 | babelrc: false, 17 | presets: [ 18 | [ 19 | '@babel/preset-env', 20 | { 21 | targets: ['last 2 versions', 'ie 11'], 22 | modules: false 23 | } 24 | ] 25 | ], 26 | plugins: ['@babel/plugin-proposal-class-properties'] 27 | }) 28 | ] 29 | }) 30 | .then(bundle => { 31 | return Promise.all([ 32 | bundle.write({ 33 | file: 'dist/lgtm.js', 34 | format: 'umd', 35 | name: 'LGTM', 36 | sourcemap: true 37 | }), 38 | bundle.write({ 39 | file: 'dist/lgtm.mjs', 40 | format: 'es', 41 | sourcemap: true 42 | }) 43 | ]); 44 | }) 45 | .then(() => { 46 | printFileInfo('dist/lgtm.js'); 47 | }) 48 | .catch(err => console.error(err.stack)); 49 | 50 | function printFileInfo(path) { 51 | let code = readFileSync(path); 52 | let minified = minify(code.toString('utf8')); 53 | 54 | console.log( 55 | `→ ${path} (raw: ${filesize(code.length).human('si')} / min: ${filesize( 56 | minified.code.length 57 | ).human('si')} ` + 58 | `/ min+gzip: ${filesize(gzipSize(minified.code)).human('si')})` 59 | ); 60 | } 61 | -------------------------------------------------------------------------------- /src/lgtm/utils.js: -------------------------------------------------------------------------------- 1 | import config from './config'; 2 | 3 | /** 4 | * Iteration 5 | */ 6 | 7 | export function forEach(iterable, iterator) { 8 | if (typeof iterable.forEach === 'function') { 9 | iterable.forEach(iterator); 10 | } else if ({}.toString.call(iterable) === '[object Object]') { 11 | let hasOwnProp = {}.hasOwnProperty; 12 | for (let key in iterable) { 13 | if (hasOwnProp.call(iterable, key)) { 14 | iterator(iterable[key], key); 15 | } 16 | } 17 | } else { 18 | for (let i = 0; i < iterable.length; i++) { 19 | iterator(iterable[i], i); 20 | } 21 | } 22 | } 23 | 24 | export function keys(object) { 25 | return Object.getOwnPropertyNames(object); 26 | } 27 | 28 | /** 29 | * Property access 30 | */ 31 | 32 | export function get(object, property) { 33 | if (object === null || object === undefined) { 34 | return; 35 | } else if (typeof object.get === 'function') { 36 | return object.get(property); 37 | } else { 38 | return object[property]; 39 | } 40 | } 41 | 42 | export function getProperties(object, properties) { 43 | let { get } = config; 44 | return properties.map(prop => get(object, prop)); 45 | } 46 | 47 | /** 48 | * Array manipulation 49 | */ 50 | 51 | export function contains(array, object) { 52 | return array.indexOf(object) > -1; 53 | } 54 | 55 | export function uniq(array) { 56 | let result = []; 57 | 58 | for (let i = 0; i < array.length; i++) { 59 | let item = array[i]; 60 | if (!contains(result, item)) { 61 | result.push(item); 62 | } 63 | } 64 | 65 | return result; 66 | } 67 | 68 | /** 69 | * Promises 70 | */ 71 | 72 | export function resolve(thenable) { 73 | let { Promise } = config; 74 | return new Promise(accept => accept(thenable)); 75 | } 76 | 77 | export function all(thenables) { 78 | let { Promise } = config; 79 | return Promise.all(thenables); 80 | } 81 | -------------------------------------------------------------------------------- /test/helpers_test.js: -------------------------------------------------------------------------------- 1 | import { helpers, validator, validates } from './lgtm'; 2 | import { throws } from 'assert'; 3 | 4 | describe('LGTM.helpers.(un)register', () => { 5 | afterEach(() => { 6 | helpers.unregister('isBob'); 7 | }); 8 | 9 | it('allow registering a custom helper for use in the builder DSL', () => { 10 | helpers.register('isBob', function(message) { 11 | this.using(value => value === 'Bob', message); 12 | }); 13 | 14 | // this would throw if the above didn't work 15 | validator() 16 | .validates('name') 17 | .isBob('You must be Bob.') 18 | .build(); 19 | }); 20 | 21 | it('allows using the custom helper with a validates object', () => { 22 | helpers.register('isBob', function(message) { 23 | this.using(value => value === 'Bob', message); 24 | }); 25 | 26 | // this would throw if the above didn't work 27 | validates('name').isBob('You must be Bob.'); 28 | }); 29 | 30 | it('fails when delegating to using() without a message', () => { 31 | helpers.register('isBob', function(/*message*/) { 32 | // eslint-disable-line no-unused-vars 33 | this.using(value => value === 'Bob' /* note I don't pass message here */); 34 | }); 35 | 36 | throws(() => { 37 | validator() 38 | .validates('name') 39 | .isBob('You must be Bob.') 40 | .build(); 41 | }, 'using() should have thrown an exception'); 42 | }); 43 | 44 | it('unregistering makes the helper unavailable to the builder DSL', () => { 45 | helpers.register('isBob', function(message) { 46 | this.using(value => value === 'Bob', message); 47 | }); 48 | 49 | helpers.unregister('isBob'); 50 | 51 | throws(() => { 52 | validator() 53 | .validates('name') 54 | .isBob('You must be Bob.') 55 | .build(); 56 | }, 'unregister() makes the helper unavailable'); 57 | }); 58 | }); 59 | -------------------------------------------------------------------------------- /docs/API Reference.md: -------------------------------------------------------------------------------- 1 | > [Wiki](Home) ▸ **API Reference** 2 | 3 | Everything in this library is contained in a module, which by default is 4 | exported as `LGTM` in the browser. The documentation will assume that the 5 | module is exposed in your code as `LGTM`, whether using globals, AMD, or 6 | CommonJS. 7 | 8 | ### [ValidatorBuilder](ValidatorBuilder) 9 | 10 | This is the main API you'll want to use. It is the API used in all the 11 | examples. 12 | 13 | * [LGTM.validator](ValidatorBuilder#wiki-validator) - factory method for creating a `ValidatorBuilder` 14 | * [builder.validates](ValidatorBuilder#wiki-validates) - start validations for an attribute 15 | * [builder.using](ValidatorBuilder#wiki-using) - add a validation for the current attribute 16 | * [builder.when](ValidatorBuilder#wiki-when) - make some validations conditional 17 | * [builder.build](ValidatorBuilder#wiki-build) - build an [`ObjectValidator`](ObjectValidator) 18 | 19 | #### [Core Helpers](ValidatorBuilder#core) 20 | 21 | * [core.required](ValidatorBuilder#wiki-core_required) - validate that a value is present 22 | * [core.optional](ValidatorBuilder#wiki-core_optional) - only validate if a value is present 23 | * [core.email](ValidatorBuilder#wiki-core_email) - validate that the value is an email 24 | * [core.minLength](ValidatorBuilder#wiki-core_minLength) - validate that the value has a minimum length 25 | * [core.maxLength](ValidatorBuilder#wiki-core_maxLength) - validate that the value has a maximum length 26 | 27 | 28 | ### [ObjectValidator](ObjectValidator) 29 | 30 | This is the core API underlying `ValidatorBuilder`. 31 | 32 | * [validator.validate](ObjectValidator#wiki-validate) - performs validations against a given object 33 | * [validator.attributes](ObjectValidator#wiki-attributes) - lists all the attributes directly or indirectly used in validation 34 | * [validator.addValidation](ObjectValidator#wiki-addValidation) - registers a validation for a given attribute `[internal]` 35 | * [validator.addDependentsFor](ObjectValidator#wiki-addDependentsFor) - registers dependencies between attributes `[internal]` 36 | -------------------------------------------------------------------------------- /src/lgtm/helpers/core.js: -------------------------------------------------------------------------------- 1 | import ValidatorBuilder from '../validator_builder'; 2 | 3 | export function present(value) { 4 | if (typeof value === 'string') { 5 | value = value.trim(); 6 | } 7 | 8 | return value !== '' && value !== null && value !== undefined; 9 | } 10 | 11 | const STRICT_CHARS = /^[\x20-\x7F]*$/; 12 | // http://stackoverflow.com/a/46181/11236 13 | const EMAIL = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 14 | 15 | // http://www.rfc-editor.org/errata_search.php?rfc=3696&eid=1690 16 | const MAX_EMAIL_LENGTH = 254; 17 | 18 | export function checkEmail(options = {}) { 19 | return function(value) { 20 | if (typeof value === 'string') { 21 | value = value.trim(); 22 | } 23 | 24 | if (options.strictCharacters) { 25 | if (!STRICT_CHARS.test(value)) { 26 | return false; 27 | } 28 | } 29 | 30 | return ( 31 | value !== undefined && 32 | value !== null && 33 | value.length <= MAX_EMAIL_LENGTH && 34 | EMAIL.test(value) 35 | ); 36 | }; 37 | } 38 | 39 | export function checkMinLength(minLength) { 40 | if (minLength === null || minLength === undefined) { 41 | throw new Error('must specify a min length'); 42 | } 43 | 44 | return function(value) { 45 | if (value !== null && value !== undefined) { 46 | return value.length >= minLength; 47 | } else { 48 | return false; 49 | } 50 | }; 51 | } 52 | 53 | export function checkMaxLength(maxLength) { 54 | if (maxLength === null || maxLength === undefined) { 55 | throw new Error('must specify a max length'); 56 | } 57 | 58 | return function(value) { 59 | if (value !== null && value !== undefined) { 60 | return value.length <= maxLength; 61 | } else { 62 | return false; 63 | } 64 | }; 65 | } 66 | 67 | export function register() { 68 | ValidatorBuilder.registerHelper('required', function(message) { 69 | this.using(present, message); 70 | }); 71 | 72 | ValidatorBuilder.registerHelper('optional', function() { 73 | this.when(present); 74 | }); 75 | 76 | ValidatorBuilder.registerHelper('email', function(message, options) { 77 | this.using(checkEmail(options), message); 78 | }); 79 | 80 | ValidatorBuilder.registerHelper('minLength', function(minLength, message) { 81 | this.using(checkMinLength(minLength), message); 82 | }); 83 | 84 | ValidatorBuilder.registerHelper('maxLength', function(maxLength, message) { 85 | this.using(checkMaxLength(maxLength), message); 86 | }); 87 | } 88 | -------------------------------------------------------------------------------- /docs/Custom Helpers.md: -------------------------------------------------------------------------------- 1 | > [Wiki](Home) ▸ **Custom Helpers** 2 | 3 | Helpers are named shortcuts to common validations or conditions. 4 | 5 | ### Basic Helpers 6 | 7 | Let's say you want a validation to check that a value is a URL: 8 | 9 | ```js 10 | LGTM.helpers.register('url', function(message) { 11 | this.using(function(value) { 12 | return /^https?:/.test(value); 13 | }, message); 14 | }); 15 | ``` 16 | 17 | Now you can use your custom helper as a validation when building a validator: 18 | 19 | ```js 20 | LGTM.validator() 21 | .validates('homepage') 22 | .url("Please enter a valid URL.") 23 | .build(); 24 | ``` 25 | 26 | Obviously this validator is a bit naïve, but you can customize it to your 27 | needs. 28 | 29 | 30 | ### Configurable Helpers 31 | 32 | You can take whatever arguments you want in your helper and use them in the 33 | helper function. For example: 34 | 35 | ```js 36 | LGTM.helpers.register('between', function(min, max, message) { 37 | this.using(function(value) { 38 | return min <= value && value <= max; 39 | }, message); 40 | }); 41 | 42 | LGTM.validator() 43 | .validates('rating') 44 | .between(1, 5, "Please rate between 1-5.") 45 | .build(); 46 | ``` 47 | 48 | 49 | ### Overriding Built-in Helpers 50 | 51 | If one of the built-in helpers isn't to your liking you can simply override it: 52 | 53 | ```js 54 | LGTM.validations.register('email', function(message) { 55 | this.using(myAwesomeEmailChecker, message); 56 | }); 57 | ``` 58 | 59 | ### How it Works 60 | 61 | The basic validation function all validation helpers use is [using()](ValidatorBuilder#wiki-using). You use 62 | `using()` yourself when building your validators for anything a built-in 63 | validation cannot express, which is probably often. You can make validations 64 | conditional by preceding the call to `using()` with a call to [when()](ValidatorBuilder#wiki-when). Doing 65 | so will act as a condition for all subsequent validations for the same 66 | attribute. Let's break down one of the examples from the README: 67 | 68 | ```js 69 | var validator = 70 | LGTM.validator() 71 | .validates('firstName') // set current attribute = firstName 72 | .required("You must enter a first name.") // add validation for firstName 73 | .validates('lastName') // set current attribute = lastName 74 | .when(=> lastNameRequired) // conditionally run subsequent validations 75 | .required("You must enter a last name.") // add (conditional) validation for lastName 76 | .validates('age') // set current attribute = age 77 | .optional() // conditionally run subsequent validations 78 | .using((age) => age > 18, "You must be over 18.") // add (conditional) validation for age 79 | .build(); // returns an object with validate() method 80 | ``` 81 | -------------------------------------------------------------------------------- /docs/ObjectValidator.md: -------------------------------------------------------------------------------- 1 | > [Wiki](Home) ▸ **API Reference** ▸ **ObjectValidator** 2 | 3 | # validator.validate(object, [attrs...], [callback(err, result)]) 4 | 5 | Runs validations for the given `attrs` on `object` and any attributes that 6 | depend on them. By default all attributes are validated. When validation is 7 | complete `callback` will be called with a validation result object with two 8 | keys: "valid" and "errors": 9 | 10 | * `valid` - will be true if no validations failed, false otherwise 11 | * `errors` - is an object with keys for all validated attributes whose values are arrays of error messages, empty for all attributes that passed validation 12 | 13 | 14 | If an exception occurred while validating then the `err` argument to `callback` 15 | will contain the thrown exception. Otherwise it will be null. If no `callback` 16 | is given a promise will be returned which will resolve to the validation result 17 | shown above or, if an exception occurred, will be rejected with the thrown 18 | exception. 19 | 20 | # validator.attributes() 21 | 22 | Returns an array of attribute names used directly or indirectly by this 23 | validator. A directly used attribute is one that has at least one validation 24 | against it. An indirectly used attribute is one that does not have any 25 | validations run against it but another attribute validation depends on its 26 | value. 27 | 28 | ```js 29 | LGTM.validator() 30 | .validates('street1') 31 | .when('mobile', (mobile) => mobile) 32 | .required("Enter a street address!") 33 | .build().attributes(); 34 | // => ["street1", "mobile"] 35 | ``` 36 | 37 | This method is primarily provided to allow better integration with JavaScript 38 | frameworks supporting observers and binding. 39 | 40 | # validator.addValidation(attr, fn(value, attr, object), message) 41 | 42 | *This method is internal.* 43 | 44 | Registers a validation for `attr` with a validation function and corresponding 45 | error message. `fn` must be a function that returns either true or false or a 46 | promise that resolves to true or false. This function receives as arguments the 47 | current value of the attribute on the object, the attribute name being 48 | validated, and the object being validated (i.e. the object passed to 49 | [validator.validate()](ObjectValidator#wiki-validate)). 50 | 51 | # validator.addDependentsFor(parent, [dependent, …]) 52 | 53 | *This method is internal.* 54 | 55 | Tells the validator that all the specified dependent attributes should all be 56 | re-validated when the parent attribute is validated. This is useful only in 57 | conjunction with partial validations (i.e. when specific attributes are passed 58 | to [validator.validate()](ObjectValidator#wiki-validate)). 59 | -------------------------------------------------------------------------------- /src/lgtm/validation.js: -------------------------------------------------------------------------------- 1 | import { getProperties, all } from './utils'; 2 | 3 | export default class Validation { 4 | _attr = null; 5 | _conditions = []; 6 | _subvalidations = []; 7 | _dependencies = []; 8 | 9 | constructor(attr) { 10 | this._attr = attr; 11 | } 12 | 13 | when(...dependencies /*, predicate */) { 14 | const predicate = dependencies.pop(); 15 | 16 | if (dependencies.length === 0) { 17 | dependencies = [this._attr]; 18 | } 19 | 20 | this._conditions.push({ 21 | predicate, 22 | dependencies 23 | }); 24 | 25 | return this; 26 | } 27 | 28 | and(...args) { 29 | return this.when(...args); 30 | } 31 | 32 | using(...dependencies /*, predicate, message */) { 33 | const message = dependencies.pop(); 34 | const predicate = dependencies.pop(); 35 | 36 | if (typeof message === 'undefined') { 37 | throw new Error(`expected a message but got: ${message}`); 38 | } 39 | 40 | if (typeof message === 'function' && typeof predicate === 'undefined') { 41 | throw new Error( 42 | 'missing expected argument `message` after predicate function' 43 | ); 44 | } 45 | 46 | if (dependencies.length === 0) { 47 | dependencies = [this._attr]; 48 | } 49 | 50 | function validation(value, attr, object) { 51 | const properties = getProperties(object, dependencies); 52 | return predicate(...properties, attr, object); 53 | } 54 | 55 | const conditions = this._conditions.slice(); 56 | 57 | function validationWithConditions(value, attr, object) { 58 | return all( 59 | conditions.map(({ predicate, dependencies }) => { 60 | const properties = getProperties(object, dependencies); 61 | return predicate(...properties, attr, object); 62 | }) 63 | ).then(results => { 64 | for (let i = 0; i < results.length; i += 1) { 65 | // a condition resolved to a falsy value; return as valid 66 | if (!results[i]) { 67 | return true; 68 | } 69 | } 70 | 71 | // all conditions resolved to truthy values; continue with validation 72 | return validation(value, attr, object); 73 | }); 74 | } 75 | 76 | this._subvalidations.push({ 77 | dependencies, 78 | validation: conditions ? validationWithConditions : validation, 79 | message 80 | }); 81 | 82 | return this; 83 | } 84 | 85 | addToValidator(validator) { 86 | this.dependencies().forEach(dependency => { 87 | validator.addDependentsFor(dependency, this._attr); 88 | }); 89 | 90 | this._subvalidations.forEach(subvalidation => { 91 | validator.addValidation( 92 | this._attr, 93 | subvalidation.validation, 94 | subvalidation.message 95 | ); 96 | }); 97 | } 98 | 99 | dependencies() { 100 | const dependencies = []; 101 | 102 | this._conditions.forEach(condition => { 103 | condition.dependencies.forEach(dependency => { 104 | dependencies.push(dependency); 105 | }); 106 | }); 107 | 108 | this._subvalidations.forEach(subvalidation => { 109 | subvalidation.dependencies.forEach(dependency => { 110 | dependencies.push(dependency); 111 | }); 112 | }); 113 | 114 | return dependencies; 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /test/helpers/core_test.js: -------------------------------------------------------------------------------- 1 | import { 2 | checkEmail, 3 | checkMaxLength, 4 | checkMinLength, 5 | present 6 | } from '../../src/lgtm/helpers/core'; 7 | import { ok, throws } from 'assert'; 8 | 9 | describe('helpers.core', () => { 10 | it('present', () => { 11 | ok(present(0), 'returns true for numbers'); 12 | ok(present([0]), 'returns true for arrays'); 13 | ok(present({}), 'returns true for objects'); 14 | ok(present('HEY!'), 'returns true for non-empty strings'); 15 | ok(present(new Date()), 'returns true for dates'); 16 | ok(!present(''), 'returns false for empty strings'); 17 | ok(!present(' '), 'returns false for whitespace strings'); 18 | ok(!present(null), 'returns false for null'); 19 | ok(!present(undefined), 'returns false for undefined'); 20 | }); 21 | 22 | it('checkEmail', () => { 23 | ok(checkEmail()('test@squareup.com'), 'returns true for correct email'); 24 | ok(!checkEmail()('paypal'), 'returns false for missing @'); 25 | ok( 26 | !checkEmail()('anything@paypal'), 27 | 'returns false for missing . in domain part' 28 | ); 29 | ok(!checkEmail()('!$23@screwedup'), 'returns false for invalid characters'); 30 | ok(!checkEmail()(''), 'returns false for empty string'); 31 | ok( 32 | checkEmail()('mañana@squareup.com'), 33 | 'returns true for emails with characters in extended ASCII range' 34 | ); 35 | ok( 36 | !checkEmail({ strictCharacters: true })('mañana@squareup.com'), 37 | 'returns false for emails with characters in extended ASCII range when strictCharacters == true' 38 | ); 39 | ok( 40 | checkEmail()('github' + '+'.repeat(235) + '@squareup.com'), 41 | 'returns true for email with length of 254 characters' 42 | ); 43 | ok( 44 | checkEmail()('github' + '+'.repeat(235) + '@squareup.com'), 45 | 'returns true for email with length of 254 characters' 46 | ); 47 | ok( 48 | !checkEmail()('github' + '+'.repeat(236) + '@squareup.com'), 49 | 'returns false for email with length greater than 254 characters' 50 | ); 51 | }); 52 | 53 | it('checkMinLength', () => { 54 | ok( 55 | checkMinLength(5)('12345'), 56 | 'returns true for 5-characters long strength calling with 5' 57 | ); 58 | ok( 59 | !checkMinLength(6)('12345'), 60 | 'returns false for 5-characters long strength calling with 6' 61 | ); 62 | ok(!checkMinLength(5)(''), 'returns false for empty string'); 63 | ok(!checkMinLength(5)(undefined), 'returns false for undefined'); 64 | ok(!checkMinLength(5)(null), 'returns false for null'); 65 | 66 | throws( 67 | () => checkMinLength()('something'), 68 | 'not specifying a min length throws an error' 69 | ); 70 | }); 71 | 72 | it('checkMaxLength', () => { 73 | ok( 74 | checkMaxLength(5)('12345'), 75 | 'returns true for 5-characters long strength calling with 5' 76 | ); 77 | ok(checkMaxLength(5)(''), 'returns true for empty string'); 78 | ok( 79 | !checkMaxLength(4)('12345'), 80 | 'returns false for 5-characters long strength calling with 4' 81 | ); 82 | ok(!checkMaxLength(5)(undefined), 'returns false for undefined'); 83 | ok(!checkMaxLength(5)(null), 'returns false for null'); 84 | 85 | throws( 86 | () => checkMaxLength()('something'), 87 | 'not specifying a max length throws an error' 88 | ); 89 | }); 90 | }); 91 | -------------------------------------------------------------------------------- /src/lgtm.js: -------------------------------------------------------------------------------- 1 | import ObjectValidator from './lgtm/object_validator'; 2 | import Validation from './lgtm/validation'; 3 | import ValidatorBuilder from './lgtm/validator_builder'; 4 | import config from './lgtm/config'; 5 | import { get } from './lgtm/utils'; 6 | import { 7 | present, 8 | checkEmail, 9 | checkMinLength, 10 | checkMaxLength, 11 | register as core_register 12 | } from './lgtm/helpers/core'; 13 | 14 | core_register(); 15 | 16 | function validator(...validations) { 17 | return new ValidatorBuilder(...validations); 18 | } 19 | 20 | function validates(attr) { 21 | return new Validation(attr); 22 | } 23 | 24 | function register() { 25 | ValidatorBuilder.registerHelper(...arguments); 26 | } 27 | 28 | function unregister() { 29 | ValidatorBuilder.unregisterHelper(...arguments); 30 | } 31 | 32 | let helpers = { 33 | core: { 34 | present, 35 | checkEmail, 36 | checkMinLength, 37 | checkMaxLength, 38 | register: core_register 39 | }, 40 | register, 41 | unregister 42 | }; 43 | 44 | function configure(key, value) { 45 | config[key] = value; 46 | } 47 | 48 | configure('defer', () => { 49 | let Promise = config['Promise']; 50 | let resolve; 51 | let reject; 52 | let promise = new Promise((res, rej) => { 53 | resolve = res; 54 | reject = rej; 55 | }); 56 | 57 | if (!resolve || !reject) { 58 | throw new Error('Configured promise does not behave as expected'); 59 | } 60 | 61 | return { promise, resolve, reject }; 62 | }); 63 | 64 | function PromiseProxy(callback) { 65 | let Promise = getPromise(); 66 | return new Promise(callback); 67 | } 68 | 69 | PromiseProxy.all = (...args) => getPromise().all(...args); 70 | 71 | PromiseProxy.race = (...args) => getPromise().race(...args); 72 | 73 | PromiseProxy.resolve = (...args) => getPromise().resolve(...args); 74 | 75 | PromiseProxy.reject = (...args) => getPromise().reject(...args); 76 | 77 | function getPromise() { 78 | let warn = config['warn']; 79 | 80 | /* global RSVP, require */ 81 | if (typeof RSVP !== 'undefined') { 82 | configure('Promise', RSVP.Promise); 83 | warn( 84 | `Implicitly using RSVP.Promise. This will be removed in LGTM 2.0. ` + 85 | `Instead, use 'LGTM.configure("Promise", RSVP.Promise)' to ` + 86 | `continue using RSVP promises.` 87 | ); 88 | return RSVP.Promise; 89 | } 90 | 91 | if (typeof require === 'function') { 92 | try { 93 | let { Promise } = require('rsvp'); 94 | configure('Promise', Promise); 95 | warn( 96 | `Implicitly using require("rsvp").Promise. This will be removed in LGTM 2.0. ` + 97 | `Instead, use 'LGTM.configure("Promise", require("rsvp").Promise)' to ` + 98 | `continue using RSVP promises.` 99 | ); 100 | return Promise; 101 | } catch (err) { 102 | // Ignore errors, just try built-in Promise or fail. 103 | } 104 | } 105 | 106 | if (typeof Promise === 'function') { 107 | configure('Promise', Promise); 108 | return Promise; 109 | } 110 | 111 | throw new Error( 112 | `'Promise' could not be found. Configure LGTM with your promise library using ` + 113 | `e.g. 'LGTM.configure("Promise", RSVP.Promise)'.` 114 | ); 115 | } 116 | 117 | /* global console */ 118 | configure('Promise', PromiseProxy); 119 | configure('warn', console.warn.bind(console)); // eslint-disable-line no-console 120 | configure('get', (object, property) => { 121 | let warn = config['warn']; 122 | 123 | configure('get', get); 124 | warn( 125 | `Implicitly using 'get' implementation that uses a 'get' method when available. ` + 126 | `This will be removed in LGTM 2.0. Instead, use e.g. 'LGTM.configure("get", Ember.get)' ` + 127 | `if you rely on this behavior.` 128 | ); 129 | return get(object, property); 130 | }); 131 | 132 | export { configure, validator, validates, helpers, ObjectValidator }; 133 | -------------------------------------------------------------------------------- /src/lgtm/object_validator.js: -------------------------------------------------------------------------------- 1 | import config from './config'; 2 | import { all, resolve, contains, keys, uniq } from './utils'; 3 | 4 | export default class ObjectValidator { 5 | _validations = {}; 6 | _dependencies = {}; 7 | 8 | constructor(...validations) { 9 | validations.forEach(validation => validation.addToValidator(this)); 10 | } 11 | 12 | addValidation(attr, fn, message) { 13 | let list = this._validations[attr]; 14 | 15 | if (!list) { 16 | list = this._validations[attr] = []; 17 | } 18 | 19 | list.push([fn, message]); 20 | } 21 | 22 | // e.g. spouseName (dependentAttribute) depends on maritalStatus (parentAttribute) 23 | addDependentsFor(parentAttribute, ...dependentAttributes) { 24 | let dependentsForParent = this._dependencies[parentAttribute]; 25 | 26 | if (!dependentsForParent) { 27 | dependentsForParent = this._dependencies[parentAttribute] = []; 28 | } 29 | 30 | for (let i = 0; i < dependentAttributes.length; i++) { 31 | let attr = dependentAttributes[i]; 32 | if (!contains(dependentsForParent, attr)) { 33 | dependentsForParent.push(attr); 34 | } 35 | } 36 | } 37 | 38 | attributes() { 39 | return uniq(keys(this._validations).concat(keys(this._dependencies))); 40 | } 41 | 42 | validate(object, ...attributes) { 43 | let callback = null; 44 | 45 | if (typeof attributes[attributes.length - 1] !== 'string') { 46 | callback = attributes.pop(); 47 | } 48 | 49 | if (attributes.length === 0) { 50 | attributes = keys(this._validations); 51 | } 52 | 53 | let validationPromises = []; 54 | let alreadyValidating = attributes.slice(); 55 | for (let i = 0; i < attributes.length; i++) { 56 | let attr = attributes[i]; 57 | validationPromises = validationPromises.concat( 58 | this._validateAttribute(object, attr, alreadyValidating) 59 | ); 60 | } 61 | 62 | let promise = all(validationPromises).then( 63 | results => { 64 | results = this._collectResults(results); 65 | if (callback) { 66 | callback(null, results); 67 | } 68 | return results; 69 | }, 70 | err => { 71 | if (callback) { 72 | callback(err); 73 | } else { 74 | throw err; 75 | } 76 | } 77 | ); 78 | 79 | if (!callback) { 80 | return promise; 81 | } 82 | } 83 | 84 | _validateAttribute(object, attr, alreadyValidating) { 85 | let value = config.get(object, attr); 86 | let validations = this._validations[attr]; 87 | let results = []; 88 | 89 | if (validations) { 90 | validations.forEach(function(pair) { 91 | let fn = pair[0]; 92 | let message = pair[1]; 93 | 94 | let promise = resolve() 95 | .then(() => fn(value, attr, object)) 96 | .then(isValid => [attr, isValid ? null : message]); 97 | 98 | results.push(promise); 99 | }); 100 | } else if (contains(this.attributes(), attr)) { 101 | results.push([attr, null]); 102 | } 103 | 104 | let dependents = this._getDependentsFor(attr); 105 | for (let i = 0; i < dependents.length; i++) { 106 | let dependent = dependents[i]; 107 | if (alreadyValidating.indexOf(dependent) < 0) { 108 | alreadyValidating.push(dependent); 109 | results = results.concat( 110 | this._validateAttribute(object, dependent, alreadyValidating) 111 | ); 112 | } 113 | } 114 | 115 | return results; 116 | } 117 | 118 | _collectResults(results) { 119 | let result = { 120 | valid: true, 121 | errors: {} 122 | }; 123 | 124 | for (let i = 0; i < results.length; i++) { 125 | if (!results[i]) { 126 | continue; 127 | } 128 | 129 | let attr = results[i][0]; 130 | let message = results[i][1]; 131 | let messages = result.errors[attr]; 132 | 133 | if (!messages) { 134 | messages = result.errors[attr] = []; 135 | } 136 | 137 | if (message) { 138 | messages.push(message); 139 | result.valid = false; 140 | } 141 | } 142 | 143 | return result; 144 | } 145 | 146 | // e.g. getDependents("maritalStatus") # => ["spouseName"] 147 | _getDependentsFor(parentAttribute) { 148 | return (this._dependencies[parentAttribute] || []).slice(); 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /docs/ValidatorBuilder.md: -------------------------------------------------------------------------------- 1 | > [Wiki](Home) ▸ **API Reference** ▸ **ValidatorBuilder** 2 | 3 | # LGTM.validator() 4 | 5 | Creates a new `ValidatorBuilder` which can be used to build an 6 | [ObjectValidator](ObjectValidator). This object uses the builder pattern and 7 | the method calls are intended to be chained. The result is intended to read 8 | more or less as a sentence -- a description of what the validator will do. 9 | 10 | # builder.validates(attr) 11 | 12 | This method sets the current attribute for subsequent calls to `using()` and 13 | `when()` and **must** be called before calls to either of those methods. 14 | 15 | # builder.using([attr, …], fn(value[, value, …], attr, object), message) 16 | 17 | This method adds a validation to the underlying `ObjectValidator` for the 18 | current attribute wrapped by the current conditions if any exist. This method 19 | may be called multiple times to add multiple validations for the current 20 | attribute. By default `fn` will be passed the value of the attribute to be 21 | validated, the name of the attribute, and the object being validated: 22 | 23 | ```js 24 | LGTM.validator() 25 | .validates('name') 26 | .using(function(value, attr, object) { 27 | // value === person.name 28 | // attr === "name" 29 | // object === person 30 | }, "OH NO!") 31 | .build() 32 | .validate(person); 33 | ``` 34 | 35 | If you want the value of different attributes just pass the list you want to 36 | `using()` one at a time: 37 | 38 | ```js 39 | LGTM.validator() 40 | .validates('name') 41 | .using('name', 'age', function(name, age, attr, object) { 42 | // name === person.name 43 | // age === person.age 44 | // attr === "name" 45 | // object === person 46 | }, "OH NO!") 47 | .build() 48 | .validate(person); 49 | ``` 50 | 51 | `fn` must return either true or false or a promise that resolves to true or 52 | false. `message` may be anything you want, but is generally an error message 53 | string you intend to present to the user. If the validation added by this call 54 | fails, `message` will be included in the validation results. 55 | 56 | # builder.when([attr, …], fn) 57 | 58 | Use this to make subsequent calls to `using()` conditional. This method adds a 59 | condition to any previously added since the last call to `validates()`, 60 | modifying the behavior of subsequent calls to `using()`. All `when()` 61 | conditions are AND-ed together and must all return true to continue with 62 | validation. Consider using `and()`, an alias for `when()`, for subsequent 63 | conditions to make this clearer in your code. Like with `using()`, `when()` by 64 | default will give you the value to validate, the name of the attribute being 65 | validated, and the object being validated: 66 | 67 | ```js 68 | LGTM.validator() 69 | .validates('name') 70 | .when(function(value, attr, object) { 71 | // value === person.name 72 | // attr === "name" 73 | // object === person 74 | }) 75 | .required("OH NO!") 76 | .build() 77 | .validate(person); 78 | ``` 79 | 80 | Also like with `using()` you can ask for a specific set of attributes by naming 81 | them as arguments before `fn`: 82 | 83 | ```js 84 | LGTM.validator() 85 | .validates('name') 86 | .when('name', 'age', function(name, age, attr, object) { 87 | // name === person.name 88 | // age === person.age 89 | // attr === "name" 90 | // object === person 91 | }) 92 | .required("OH NO!") 93 | .build() 94 | .validate(person); 95 | ``` 96 | 97 | `fn` must return either true or false or a promise that resolves to true or 98 | false. If the result of `fn()` is false (or resolves to false) then the 99 | validations chained after this call will not be called. 100 | 101 | # builder.and() 102 | 103 | An alias for [`when()`](#wiki-when) to improve the readability of chained 104 | method calls. 105 | 106 | # builder.build() 107 | 108 | Returns the built [`ObjectValidator`](ObjectValidator) ready to validate 109 | objects. *You must remember to call this function at the end of the chain!* 110 | 111 | ### Helpers 112 | 113 | Helpers provide shortcuts to commonly-used validations and conditions. All 114 | registered helpers are automatically available on `ValidatorBuilder` instances. 115 | 116 | #### Core 117 | 118 | # builder.required(message) 119 | 120 | Adds a validation for the current attribute that will fail if the value of the 121 | validated attribute is absent (i.e. `null`, `undefined`, or an all-whitespace 122 | string). 123 | 124 | # builder.optional() 125 | 126 | Sets the condition for the current attribute's subsequent validations such that 127 | they will not be used unless the value to validate is present (i.e. not `null`, 128 | `undefined`, or an all-whitespace string). 129 | 130 | # builder.email(message[, options]) 131 | 132 | Adds a validation for the current attribute that will fail if the value of the 133 | validated attribute is not an email address. This validation is meant to be a 134 | good default but may allow email addresses you don't want. Remember that you 135 | can always override any built-in helper (see [Custom Helpers](Custom-Helpers)). 136 | 137 | If you want to disallow special characters (such as 'ñ'), pass the `options` 138 | argument with `strictCharacters: true`. 139 | 140 | # builder.minLength(length, message) 141 | 142 | Adds a validation for the current attribute that will fail if the length of the 143 | value is less than the given `length`. This works for anything that has a 144 | `.length` property, such as strings and arrays. 145 | 146 | # builder.maxLength(length, message) 147 | 148 | See [Custom Helpers](Custom-Helpers) for information on writing your own helpers. 149 | -------------------------------------------------------------------------------- /test/object_validator_test.js: -------------------------------------------------------------------------------- 1 | import resolve from './support/resolve'; 2 | import { ObjectValidator, helpers } from './lgtm'; 3 | import { deepEqual, fail, strictEqual } from 'assert'; 4 | 5 | let { present } = helpers.core; 6 | 7 | let object; 8 | let validator; 9 | 10 | describe('ObjectValidator', function() { 11 | beforeEach(() => { 12 | object = {}; 13 | validator = new ObjectValidator(); 14 | }); 15 | 16 | it('calls back when given a callback', done => { 17 | let returnValue = validator.validate(object, (err, result) => { 18 | strictEqual(result.valid, true); 19 | done(); 20 | }); 21 | strictEqual(returnValue, undefined); 22 | }); 23 | 24 | it('returns a promise when no callback is given', () => { 25 | let returnValue = validator.validate(object); 26 | return returnValue.then(result => strictEqual(result.valid, true)); 27 | }); 28 | 29 | it('can validate a specific list of attributes', () => { 30 | validator.addValidation('firstName', present, 'Missing first name!'); 31 | validator.addValidation('lastName', present, 'Missing last name!'); 32 | 33 | return validator.validate(object).then(result => { 34 | deepEqual(result, { 35 | valid: false, 36 | errors: { 37 | firstName: ['Missing first name!'], 38 | lastName: ['Missing last name!'] 39 | } 40 | }); 41 | 42 | return validator.validate(object, 'firstName').then(result => { 43 | deepEqual(result, { 44 | valid: false, 45 | errors: { 46 | firstName: ['Missing first name!'] 47 | } 48 | }); 49 | }); 50 | }); 51 | }); 52 | 53 | it('returns a hash of empty error arrays when valid', () => { 54 | validator.addValidation('firstName', present, 'Missing first name!'); 55 | validator.addValidation('lastName', present, 'Missing last name!'); 56 | 57 | return validator 58 | .validate({ firstName: 'Bah', lastName: 'Humbug' }) 59 | .then(result => { 60 | deepEqual(result, { 61 | valid: true, 62 | errors: { 63 | firstName: [], 64 | lastName: [] 65 | } 66 | }); 67 | }); 68 | }); 69 | 70 | it('passes the validation function the value, key, and object being validated', () => { 71 | object.firstName = 'Han'; 72 | 73 | validator.addValidation('firstName', function(value, key, obj) { 74 | strictEqual(arguments.length, 3, 'passes three arguments'); 75 | strictEqual(value, 'Han', '1st argument is value'); 76 | strictEqual(key, 'firstName', '2nd argument is key'); 77 | strictEqual(obj, object, '3rd argument is object'); 78 | }); 79 | 80 | return validator.validate(object); 81 | }); 82 | 83 | it('validates as valid when validating attributes with no registered validations', () => { 84 | return validator.validate(object, 'iDoNotExist').then(result => { 85 | deepEqual(result, { valid: true, errors: {} }); 86 | }); 87 | }); 88 | 89 | it('allows registering dependencies between attributes', () => { 90 | // always invalid, easy to test 91 | validator.addValidation( 92 | 'spouseName', 93 | () => false, 94 | 'No name is good enough.' 95 | ); 96 | validator.addDependentsFor('maritalStatus', 'spouseName'); 97 | 98 | return validator.validate(object, 'maritalStatus').then(result => { 99 | deepEqual(result, { 100 | valid: false, 101 | errors: { 102 | maritalStatus: [], 103 | spouseName: ['No name is good enough.'] 104 | } 105 | }); 106 | }); 107 | }); 108 | 109 | it('can provide a list of all attributes it is interested in', () => { 110 | validator.addValidation('street1', () => false, 'Whatever.'); 111 | validator.addValidation('street2', () => false, 'Whatever.'); 112 | validator.addDependentsFor('mobile', 'street1', 'street2'); 113 | 114 | deepEqual(validator.attributes().sort(), ['mobile', 'street1', 'street2']); 115 | }); 116 | 117 | it('passes exceptions thrown by validations as the first argument to the callback', () => { 118 | validator.addValidation('firstName', () => { 119 | throw new Error('OH NO!'); 120 | }); 121 | 122 | return validator.validate(object, (err, result) => { 123 | strictEqual(err.message, 'OH NO!', 'passes the thrown error through'); 124 | strictEqual(result, undefined); 125 | }); 126 | }); 127 | 128 | it('passes exceptions through as a rejected promise', () => { 129 | validator.addValidation('firstName', () => { 130 | throw new Error('OH NO!'); 131 | }); 132 | 133 | return validator.validate(object).then( 134 | () => { 135 | fail('this function should not have been called'); 136 | }, 137 | err => { 138 | strictEqual(err.message, 'OH NO!', 'passes the thrown error through'); 139 | } 140 | ); 141 | }); 142 | 143 | context('with validations that return immediately', () => { 144 | beforeEach(() => { 145 | validator.addValidation( 146 | 'firstName', 147 | firstName => firstName === 'Han', 148 | `Sorry, your first name isn't Han.` 149 | ); 150 | validator.addValidation( 151 | 'lastName', 152 | lastName => lastName === 'Solo', 153 | `Sorry, your last name isn't Solo.` 154 | ); 155 | }); 156 | 157 | itValidatesAsExpected(); 158 | }); 159 | 160 | context('with validations that return eventually', function() { 161 | beforeEach(() => { 162 | validator.addValidation( 163 | 'firstName', 164 | firstName => resolve(firstName === 'Han'), 165 | `Sorry, your first name isn't Han.` 166 | ); 167 | validator.addValidation( 168 | 'lastName', 169 | lastName => resolve(lastName === 'Solo'), 170 | `Sorry, your last name isn't Solo.` 171 | ); 172 | }); 173 | 174 | itValidatesAsExpected(); 175 | }); 176 | }); 177 | 178 | function itValidatesAsExpected() { 179 | it('resolves the promise correctly', () => { 180 | return validator.validate(object); 181 | }); 182 | 183 | it('yields the validation results correctly', () => { 184 | object.lastName = 'Solo'; 185 | return validator.validate(object).then(result => { 186 | deepEqual(result, { 187 | valid: false, 188 | errors: { 189 | firstName: [`Sorry, your first name isn't Han.`], 190 | lastName: [] 191 | } 192 | }); 193 | }); 194 | }); 195 | } 196 | -------------------------------------------------------------------------------- /test/validator_test.js: -------------------------------------------------------------------------------- 1 | import resolve from './support/resolve'; 2 | import { validator as buildValidator, ObjectValidator } from './lgtm'; 3 | import { deepEqual, ok, strictEqual } from 'assert'; 4 | 5 | let validator; 6 | 7 | describe('validator', () => { 8 | context('with a basic `required` validation', () => { 9 | beforeEach(() => { 10 | validator = buildValidator() 11 | .validates('name') 12 | .required('You must provide a name.') 13 | .build(); 14 | }); 15 | 16 | it('provides an easy way to build a validator', () => { 17 | return validator.validate({}).then(result => { 18 | ok(!result.valid); 19 | deepEqual(result.errors, { name: ['You must provide a name.'] }); 20 | }); 21 | }); 22 | 23 | it('returns an ObjectValidator', () => { 24 | ok(validator instanceof ObjectValidator); 25 | }); 26 | }); 27 | 28 | describe('#paramCoreValidators', () => { 29 | beforeEach(() => { 30 | validator = buildValidator() 31 | .validates('theString') 32 | .minLength(5, 'too short') 33 | .build(); 34 | }); 35 | 36 | it('performs validation with specified param in mind', () => { 37 | return validator.validate({ theString: '1234' }).then(result => { 38 | deepEqual(result, { 39 | valid: false, 40 | errors: { 41 | theString: ['too short'] 42 | } 43 | }); 44 | }); 45 | }); 46 | }); 47 | 48 | describe('#using', () => { 49 | beforeEach(() => { 50 | validator = buildValidator() 51 | .validates('password') 52 | .using( 53 | 'password', 54 | 'passwordConfirmation', 55 | (password, passwordConfirmation) => password === passwordConfirmation, 56 | 'Passwords must match.' 57 | ) 58 | .build(); 59 | }); 60 | 61 | it('passes declared dependencies', () => { 62 | return validator 63 | .validate({ password: 'abc123', passwordConfirmation: 'abc123' }) 64 | .then(result => { 65 | deepEqual( 66 | result, 67 | { 68 | valid: true, 69 | errors: { 70 | password: [] 71 | } 72 | }, 73 | 'dependent values are passed in' 74 | ); 75 | }); 76 | }); 77 | 78 | it('causes dependent attributes to be validated, even when not specified explicitly', () => { 79 | // we're leaving out "password" but it gets validated anyway because it 80 | // depends on "passwordConfirmation" 81 | return validator 82 | .validate({ password: 'abc123' }, 'passwordConfirmation') 83 | .then(result => { 84 | deepEqual(result, { 85 | valid: false, 86 | errors: { 87 | password: ['Passwords must match.'], 88 | passwordConfirmation: [] 89 | } 90 | }); 91 | 92 | return validator 93 | .validate( 94 | { password: 'abc123', passwordConfirmation: 'abc123' }, 95 | 'passwordConfirmation' 96 | ) 97 | .then(result => { 98 | deepEqual( 99 | result, 100 | { 101 | valid: true, 102 | errors: { 103 | password: [], 104 | passwordConfirmation: [] 105 | } 106 | }, 107 | 'returns empty error messages for dependent attributes as well' 108 | ); 109 | }); 110 | }); 111 | }); 112 | }); 113 | 114 | describe('validator#when', () => { 115 | let object; 116 | let validator; 117 | 118 | beforeEach(() => { 119 | object = {}; 120 | validator = buildValidator() 121 | .validates('age') 122 | .when(age => age % 2 === 0) 123 | .using(age => age > 12, 'You must be at least 13 years old.') 124 | .validates('name') 125 | .required('You must provide a name.') 126 | .build(); 127 | }); 128 | 129 | it('allows conditionally running validations', () => { 130 | object.age = 10; // even numbered ages are validated 131 | 132 | return validator.validate(object).then(result => { 133 | deepEqual( 134 | result, 135 | { 136 | valid: false, 137 | errors: { 138 | name: ['You must provide a name.'], 139 | age: ['You must be at least 13 years old.'] 140 | } 141 | }, 142 | 'validations matching their when clause are run' 143 | ); 144 | 145 | object.age = 7; // odd numbered ages aren't validated 146 | 147 | return validator.validate(object).then(result => { 148 | deepEqual( 149 | result, 150 | { 151 | valid: false, 152 | errors: { 153 | name: ['You must provide a name.'], 154 | age: [] 155 | } 156 | }, 157 | 'validations not matching their clause are not run' 158 | ); 159 | }); 160 | }); 161 | }); 162 | 163 | it('allows conditionals that return promises', () => { 164 | validator = buildValidator() 165 | .validates('name') 166 | .when(name => resolve(name.length % 2 !== 0)) 167 | .using(name => name === 'Han', 'Your name is not Han!') 168 | .build(); 169 | 170 | object.name = 'Brian'; // odd length names are validated 171 | 172 | return validator.validate(object).then(result => { 173 | deepEqual(result, { 174 | valid: false, 175 | errors: { 176 | name: ['Your name is not Han!'] 177 | } 178 | }); 179 | 180 | object.name = 'Fred'; // even length names are not validated 181 | 182 | return validator.validate(object).then(result => { 183 | deepEqual( 184 | result, 185 | { 186 | valid: true, 187 | errors: { 188 | name: [] 189 | } 190 | }, 191 | 'promise conditions are respected' 192 | ); 193 | }); 194 | }); 195 | }); 196 | 197 | it('passes declared dependencies', () => { 198 | let object = { 199 | name: 'Brian', 200 | age: 30 201 | }; 202 | 203 | let v = buildValidator() 204 | .validates('name') 205 | .when('name', 'age', 'unset', (name, age, unset, key, obj) => { 206 | strictEqual(name, 'Brian'); 207 | strictEqual(age, 30); 208 | strictEqual(unset, undefined); 209 | strictEqual(key, 'name'); 210 | strictEqual(obj, object); 211 | return false; 212 | }) 213 | .required('You must enter a name.') 214 | .build(); 215 | 216 | return v.validate(object); 217 | }); 218 | 219 | it('causes dependent attributes to be validated, even when not specified explicitly', () => { 220 | let v = buildValidator() 221 | .validates('name') 222 | .when('age', () => true) 223 | .required('You must enter a name.') 224 | .build(); 225 | 226 | // we leave out "name" but it is validated anyway because it depends on "age" 227 | return v.validate({}, 'age').then(result => { 228 | deepEqual(result, { 229 | valid: false, 230 | errors: { 231 | age: [], 232 | name: ['You must enter a name.'] 233 | } 234 | }); 235 | 236 | let v = buildValidator() 237 | .validates('name') 238 | .when('age', () => true) 239 | .required('You must enter a name.') 240 | .validates('age') 241 | .when('isBorn', isBorn => isBorn) 242 | .required('You must have an age if you have been born.') 243 | .build(); 244 | 245 | // we leave out "name" and "age" but they are validated anyway because they 246 | // both depend on "isBorn", either directly or transitively 247 | return v.validate({ isBorn: true }, 'isBorn').then(result => { 248 | deepEqual(result, { 249 | valid: false, 250 | errors: { 251 | isBorn: [], 252 | name: ['You must enter a name.'], 253 | age: ['You must have an age if you have been born.'] 254 | } 255 | }); 256 | 257 | return v 258 | .validate( 259 | { isBorn: true, name: 'Winnie the Pooh', age: 10 }, 260 | 'isBorn' 261 | ) 262 | .then(result => { 263 | deepEqual( 264 | result, 265 | { 266 | valid: true, 267 | errors: { 268 | isBorn: [], 269 | name: [], 270 | age: [] 271 | } 272 | }, 273 | 'returns empty error messages for dependent attributes as well' 274 | ); 275 | }); 276 | }); 277 | }); 278 | }); 279 | 280 | it('used with #using specifying attributes in both', () => { 281 | let v = buildValidator() 282 | .validates('passwordConfirmation') 283 | .when('password', password => password && password.length > 0) 284 | .using( 285 | 'password', 286 | 'passwordConfirmation', 287 | (password, passwordConfirmation) => password === passwordConfirmation, 288 | 'Passwords must match!' 289 | ) 290 | .build(); 291 | 292 | return v.validate({ password: 'letmein' }, 'password').then(result => { 293 | deepEqual( 294 | result, 295 | { 296 | valid: false, 297 | errors: { 298 | password: [], 299 | passwordConfirmation: ['Passwords must match!'] 300 | } 301 | }, 302 | 'returns the correct results for all attributes' 303 | ); 304 | }); 305 | }); 306 | 307 | it('is used by #optional to prevent subsequent validations from firing when a value is absent', () => { 308 | let v = buildValidator() 309 | .validates('email') 310 | .optional() 311 | .email('That is no email!') 312 | .build(); 313 | 314 | return v.validate({ email: ' ' }).then(result => { 315 | deepEqual( 316 | result, 317 | { 318 | valid: true, 319 | errors: { 320 | email: [] 321 | } 322 | }, 323 | 'accepts missing values as valid' 324 | ); 325 | }); 326 | }); 327 | 328 | it('may be used multiple times', () => { 329 | let shouldValidate; 330 | let v = buildValidator() 331 | .validates('email') 332 | .optional() // this is a .when() call internally 333 | .when(email => shouldValidate) // eslint-disable-line no-unused-vars 334 | .email('That is no email!', { strictCharacters: true }) 335 | .build(); 336 | 337 | // start off with the first .when() returning false, the second true 338 | shouldValidate = true; 339 | return v.validate({ email: '' }).then(result => { 340 | deepEqual( 341 | result, 342 | { 343 | valid: true, 344 | errors: { 345 | email: [] 346 | } 347 | }, 348 | 'subsequent .when() calls do not clobber previous ones' 349 | ); 350 | 351 | // now make the first .when() return true, the second false 352 | shouldValidate = false; 353 | return v.validate({ email: 'I am not an email' }).then(result => { 354 | deepEqual( 355 | result, 356 | { 357 | valid: true, 358 | errors: { 359 | email: [] 360 | } 361 | }, 362 | 'does not validate if any .when() call returns falsy' 363 | ); 364 | 365 | // now they should both return true, triggering validation 366 | shouldValidate = true; 367 | return v.validate({ email: 'mañana@squareup.com' }).then(result => { 368 | deepEqual( 369 | result, 370 | { 371 | valid: false, 372 | errors: { 373 | email: ['That is no email!'] 374 | } 375 | }, 376 | 'validates as normal when all .when() calls return truthy' 377 | ); 378 | }); 379 | }); 380 | }); 381 | }); 382 | 383 | it('only affects .using() calls after it in the chain', () => { 384 | let v = buildValidator() 385 | .validates('password') 386 | .using(password => password === 'zanzabar', 'Nope!') 387 | .when(() => false) 388 | .build(); 389 | 390 | return v.validate({ email: '' }).then(result => { 391 | deepEqual( 392 | result, 393 | { 394 | valid: false, 395 | errors: { 396 | password: ['Nope!'] 397 | } 398 | }, 399 | 'validates without any conditions added after the .using() call' 400 | ); 401 | }); 402 | }); 403 | }); 404 | 405 | describe('#and', () => { 406 | it('is an alias for #when', () => { 407 | let v = buildValidator() 408 | .validates('name') 409 | .when(() => true) 410 | .and(() => false) 411 | .required('You must enter a name!') 412 | .build(); 413 | 414 | return v.validate({ name: null }).then(result => { 415 | deepEqual( 416 | result, 417 | { 418 | valid: true, 419 | errors: { 420 | name: [] 421 | } 422 | }, 423 | 'skips validating when .and() callback returns false' 424 | ); 425 | }); 426 | }); 427 | }); 428 | }); 429 | -------------------------------------------------------------------------------- /test/validates_test.js: -------------------------------------------------------------------------------- 1 | import resolve from './support/resolve'; 2 | import { 3 | validator as buildValidator, 4 | validates, 5 | ObjectValidator 6 | } from './lgtm'; 7 | import { deepEqual, ok, strictEqual } from 'assert'; 8 | 9 | let validator; 10 | 11 | describe('validates', () => { 12 | context('with a basic `required` validation', () => { 13 | beforeEach(() => { 14 | validator = buildValidator( 15 | validates('name').required('You must provide a name.') 16 | ).build(); 17 | }); 18 | 19 | it('provides an easy way to build a validator', () => { 20 | return validator.validate({}).then(result => { 21 | ok(!result.valid); 22 | deepEqual(result.errors, { name: ['You must provide a name.'] }); 23 | }); 24 | }); 25 | 26 | it('returns an ObjectValidator', () => { 27 | ok(validator instanceof ObjectValidator); 28 | }); 29 | }); 30 | 31 | describe('#paramCoreValidators', () => { 32 | beforeEach(() => { 33 | validator = buildValidator( 34 | validates('theString').minLength(5, 'too short') 35 | ).build(); 36 | }); 37 | 38 | it('performs validation with specified param in mind', () => { 39 | return validator.validate({ theString: '1234' }).then(result => { 40 | deepEqual(result, { 41 | valid: false, 42 | errors: { 43 | theString: ['too short'] 44 | } 45 | }); 46 | }); 47 | }); 48 | }); 49 | 50 | describe('#using', () => { 51 | beforeEach(() => { 52 | validator = buildValidator( 53 | validates('password').using( 54 | 'password', 55 | 'passwordConfirmation', 56 | (password, passwordConfirmation) => password === passwordConfirmation, 57 | 'Passwords must match.' 58 | ) 59 | ).build(); 60 | }); 61 | 62 | it('passes declared dependencies', () => { 63 | return validator 64 | .validate({ password: 'abc123', passwordConfirmation: 'abc123' }) 65 | .then(result => { 66 | deepEqual( 67 | result, 68 | { 69 | valid: true, 70 | errors: { 71 | password: [] 72 | } 73 | }, 74 | 'dependent values are passed in' 75 | ); 76 | }); 77 | }); 78 | 79 | it('causes dependent attributes to be validated, even when not specified explicitly', () => { 80 | // we're leaving out "password" but it gets validated anyway because it 81 | // depends on "passwordConfirmation" 82 | return validator 83 | .validate({ password: 'abc123' }, 'passwordConfirmation') 84 | .then(result => { 85 | deepEqual(result, { 86 | valid: false, 87 | errors: { 88 | password: ['Passwords must match.'], 89 | passwordConfirmation: [] 90 | } 91 | }); 92 | 93 | return validator 94 | .validate( 95 | { password: 'abc123', passwordConfirmation: 'abc123' }, 96 | 'passwordConfirmation' 97 | ) 98 | .then(result => { 99 | deepEqual( 100 | result, 101 | { 102 | valid: true, 103 | errors: { 104 | password: [], 105 | passwordConfirmation: [] 106 | } 107 | }, 108 | 'returns empty error messages for dependent attributes as well' 109 | ); 110 | }); 111 | }); 112 | }); 113 | }); 114 | 115 | describe('validator#when', () => { 116 | let object; 117 | let validator; 118 | 119 | beforeEach(() => { 120 | object = {}; 121 | validator = buildValidator( 122 | validates('age') 123 | .when(age => age % 2 === 0) 124 | .using(age => age > 12, 'You must be at least 13 years old.'), 125 | validates('name').required('You must provide a name.') 126 | ).build(); 127 | }); 128 | 129 | it('allows conditionally running validations', () => { 130 | object.age = 10; // even numbered ages are validated 131 | 132 | return validator.validate(object).then(result => { 133 | deepEqual( 134 | result, 135 | { 136 | valid: false, 137 | errors: { 138 | name: ['You must provide a name.'], 139 | age: ['You must be at least 13 years old.'] 140 | } 141 | }, 142 | 'validations matching their when clause are run' 143 | ); 144 | 145 | object.age = 7; // odd numbered ages aren't validated 146 | 147 | return validator.validate(object).then(result => { 148 | deepEqual( 149 | result, 150 | { 151 | valid: false, 152 | errors: { 153 | name: ['You must provide a name.'], 154 | age: [] 155 | } 156 | }, 157 | 'validations not matching their clause are not run' 158 | ); 159 | }); 160 | }); 161 | }); 162 | 163 | it('allows conditionals that return promises', () => { 164 | validator = buildValidator( 165 | validates('name') 166 | .when(name => resolve(name.length % 2 !== 0)) 167 | .using(name => name === 'Han', 'Your name is not Han!') 168 | ).build(); 169 | 170 | object.name = 'Brian'; // odd length names are validated 171 | 172 | return validator.validate(object).then(result => { 173 | deepEqual(result, { 174 | valid: false, 175 | errors: { 176 | name: ['Your name is not Han!'] 177 | } 178 | }); 179 | 180 | object.name = 'Fred'; // even length names are not validated 181 | 182 | return validator.validate(object).then(result => { 183 | deepEqual( 184 | result, 185 | { 186 | valid: true, 187 | errors: { 188 | name: [] 189 | } 190 | }, 191 | 'promise conditions are respected' 192 | ); 193 | }); 194 | }); 195 | }); 196 | 197 | it('passes declared dependencies', () => { 198 | let object = { 199 | name: 'Brian', 200 | age: 30 201 | }; 202 | 203 | let v = buildValidator( 204 | validates('name') 205 | .when('name', 'age', 'unset', (name, age, unset, key, obj) => { 206 | strictEqual(name, 'Brian'); 207 | strictEqual(age, 30); 208 | strictEqual(unset, undefined); 209 | strictEqual(key, 'name'); 210 | strictEqual(obj, object); 211 | return false; 212 | }) 213 | .required('You must enter a name.') 214 | ).build(); 215 | 216 | return v.validate(object); 217 | }); 218 | 219 | it('causes dependent attributes to be validated, even when not specified explicitly', () => { 220 | let v = buildValidator( 221 | validates('name') 222 | .when('age', () => true) 223 | .required('You must enter a name.') 224 | ).build(); 225 | 226 | // we leave out "name" but it is validated anyway because it depends on "age" 227 | return v.validate({}, 'age').then(result => { 228 | deepEqual(result, { 229 | valid: false, 230 | errors: { 231 | age: [], 232 | name: ['You must enter a name.'] 233 | } 234 | }); 235 | 236 | let v = buildValidator( 237 | validates('name') 238 | .when('age', () => true) 239 | .required('You must enter a name.'), 240 | validates('age') 241 | .when('isBorn', isBorn => isBorn) 242 | .required('You must have an age if you have been born.') 243 | ).build(); 244 | 245 | // we leave out "name" and "age" but they are validated anyway because they 246 | // both depend on "isBorn", either directly or transitively 247 | return v.validate({ isBorn: true }, 'isBorn').then(result => { 248 | deepEqual(result, { 249 | valid: false, 250 | errors: { 251 | isBorn: [], 252 | name: ['You must enter a name.'], 253 | age: ['You must have an age if you have been born.'] 254 | } 255 | }); 256 | 257 | return v 258 | .validate( 259 | { isBorn: true, name: 'Winnie the Pooh', age: 10 }, 260 | 'isBorn' 261 | ) 262 | .then(result => { 263 | deepEqual( 264 | result, 265 | { 266 | valid: true, 267 | errors: { 268 | isBorn: [], 269 | name: [], 270 | age: [] 271 | } 272 | }, 273 | 'returns empty error messages for dependent attributes as well' 274 | ); 275 | }); 276 | }); 277 | }); 278 | }); 279 | 280 | it('used with #using specifying attributes in both', () => { 281 | let v = buildValidator( 282 | validates('passwordConfirmation') 283 | .when('password', password => password && password.length > 0) 284 | .using( 285 | 'password', 286 | 'passwordConfirmation', 287 | (password, passwordConfirmation) => 288 | password === passwordConfirmation, 289 | 'Passwords must match!' 290 | ) 291 | ).build(); 292 | 293 | return v.validate({ password: 'letmein' }, 'password').then(result => { 294 | deepEqual( 295 | result, 296 | { 297 | valid: false, 298 | errors: { 299 | password: [], 300 | passwordConfirmation: ['Passwords must match!'] 301 | } 302 | }, 303 | 'returns the correct results for all attributes' 304 | ); 305 | }); 306 | }); 307 | 308 | it('is used by #optional to prevent subsequent validations from firing when a value is absent', () => { 309 | let v = buildValidator( 310 | validates('email') 311 | .optional() 312 | .email('That is no email!') 313 | ).build(); 314 | 315 | return v.validate({ email: ' ' }).then(result => { 316 | deepEqual( 317 | result, 318 | { 319 | valid: true, 320 | errors: { 321 | email: [] 322 | } 323 | }, 324 | 'accepts missing values as valid' 325 | ); 326 | }); 327 | }); 328 | 329 | it('may be used multiple times', () => { 330 | let shouldValidate; 331 | let v = buildValidator( 332 | validates('email') 333 | .optional() // this is a .when() call internally 334 | .when(email => shouldValidate) // eslint-disable-line no-unused-vars 335 | .email('That is no email!', { strictCharacters: true }) 336 | ).build(); 337 | 338 | // start off with the first .when() returning false, the second true 339 | shouldValidate = true; 340 | return v.validate({ email: '' }).then(result => { 341 | deepEqual( 342 | result, 343 | { 344 | valid: true, 345 | errors: { 346 | email: [] 347 | } 348 | }, 349 | 'subsequent .when() calls do not clobber previous ones' 350 | ); 351 | 352 | // now make the first .when() return true, the second false 353 | shouldValidate = false; 354 | return v.validate({ email: 'I am not an email' }).then(result => { 355 | deepEqual( 356 | result, 357 | { 358 | valid: true, 359 | errors: { 360 | email: [] 361 | } 362 | }, 363 | 'does not validate if any .when() call returns falsy' 364 | ); 365 | 366 | // now they should both return true, triggering validation 367 | shouldValidate = true; 368 | return v.validate({ email: 'mañana@squareup.com' }).then(result => { 369 | deepEqual( 370 | result, 371 | { 372 | valid: false, 373 | errors: { 374 | email: ['That is no email!'] 375 | } 376 | }, 377 | 'validates as normal when all .when() calls return truthy' 378 | ); 379 | }); 380 | }); 381 | }); 382 | }); 383 | 384 | it('only affects .using() calls after it in the chain', () => { 385 | let v = buildValidator( 386 | validates('password') 387 | .using(password => password === 'zanzabar', 'Nope!') 388 | .when(() => false) 389 | ).build(); 390 | 391 | return v.validate({ email: '' }).then(result => { 392 | deepEqual( 393 | result, 394 | { 395 | valid: false, 396 | errors: { 397 | password: ['Nope!'] 398 | } 399 | }, 400 | 'validates without any conditions added after the .using() call' 401 | ); 402 | }); 403 | }); 404 | }); 405 | 406 | describe('#and', () => { 407 | it('is an alias for #when', () => { 408 | let v = buildValidator( 409 | validates('name') 410 | .when(() => true) 411 | .and(() => false) 412 | .required('You must enter a name!') 413 | ).build(); 414 | 415 | return v.validate({ name: null }).then(result => { 416 | deepEqual( 417 | result, 418 | { 419 | valid: true, 420 | errors: { 421 | name: [] 422 | } 423 | }, 424 | 'skips validating when .and() callback returns false' 425 | ); 426 | }); 427 | }); 428 | }); 429 | }); 430 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.1": 6 | version "7.10.1" 7 | resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" 8 | integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== 9 | dependencies: 10 | "@babel/highlight" "^7.10.1" 11 | 12 | "@babel/compat-data@^7.10.1": 13 | version "7.10.1" 14 | resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db" 15 | integrity sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw== 16 | dependencies: 17 | browserslist "^4.12.0" 18 | invariant "^2.2.4" 19 | semver "^5.5.0" 20 | 21 | "@babel/core@^7.10.2": 22 | version "7.10.2" 23 | resolved "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a" 24 | integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ== 25 | dependencies: 26 | "@babel/code-frame" "^7.10.1" 27 | "@babel/generator" "^7.10.2" 28 | "@babel/helper-module-transforms" "^7.10.1" 29 | "@babel/helpers" "^7.10.1" 30 | "@babel/parser" "^7.10.2" 31 | "@babel/template" "^7.10.1" 32 | "@babel/traverse" "^7.10.1" 33 | "@babel/types" "^7.10.2" 34 | convert-source-map "^1.7.0" 35 | debug "^4.1.0" 36 | gensync "^1.0.0-beta.1" 37 | json5 "^2.1.2" 38 | lodash "^4.17.13" 39 | resolve "^1.3.2" 40 | semver "^5.4.1" 41 | source-map "^0.5.0" 42 | 43 | "@babel/generator@^7.10.1", "@babel/generator@^7.10.2": 44 | version "7.10.2" 45 | resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9" 46 | integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA== 47 | dependencies: 48 | "@babel/types" "^7.10.2" 49 | jsesc "^2.5.1" 50 | lodash "^4.17.13" 51 | source-map "^0.5.0" 52 | 53 | "@babel/helper-annotate-as-pure@^7.10.1": 54 | version "7.10.1" 55 | resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" 56 | integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw== 57 | dependencies: 58 | "@babel/types" "^7.10.1" 59 | 60 | "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": 61 | version "7.10.1" 62 | resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059" 63 | integrity sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw== 64 | dependencies: 65 | "@babel/helper-explode-assignable-expression" "^7.10.1" 66 | "@babel/types" "^7.10.1" 67 | 68 | "@babel/helper-compilation-targets@^7.10.2": 69 | version "7.10.2" 70 | resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285" 71 | integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA== 72 | dependencies: 73 | "@babel/compat-data" "^7.10.1" 74 | browserslist "^4.12.0" 75 | invariant "^2.2.4" 76 | levenary "^1.1.1" 77 | semver "^5.5.0" 78 | 79 | "@babel/helper-create-class-features-plugin@^7.10.1": 80 | version "7.10.2" 81 | resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz#7474295770f217dbcf288bf7572eb213db46ee67" 82 | integrity sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ== 83 | dependencies: 84 | "@babel/helper-function-name" "^7.10.1" 85 | "@babel/helper-member-expression-to-functions" "^7.10.1" 86 | "@babel/helper-optimise-call-expression" "^7.10.1" 87 | "@babel/helper-plugin-utils" "^7.10.1" 88 | "@babel/helper-replace-supers" "^7.10.1" 89 | "@babel/helper-split-export-declaration" "^7.10.1" 90 | 91 | "@babel/helper-create-regexp-features-plugin@^7.10.1", "@babel/helper-create-regexp-features-plugin@^7.8.3": 92 | version "7.10.1" 93 | resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd" 94 | integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA== 95 | dependencies: 96 | "@babel/helper-annotate-as-pure" "^7.10.1" 97 | "@babel/helper-regex" "^7.10.1" 98 | regexpu-core "^4.7.0" 99 | 100 | "@babel/helper-define-map@^7.10.1": 101 | version "7.10.1" 102 | resolved "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d" 103 | integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg== 104 | dependencies: 105 | "@babel/helper-function-name" "^7.10.1" 106 | "@babel/types" "^7.10.1" 107 | lodash "^4.17.13" 108 | 109 | "@babel/helper-explode-assignable-expression@^7.10.1": 110 | version "7.10.1" 111 | resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz#e9d76305ee1162ca467357ae25df94f179af2b7e" 112 | integrity sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg== 113 | dependencies: 114 | "@babel/traverse" "^7.10.1" 115 | "@babel/types" "^7.10.1" 116 | 117 | "@babel/helper-function-name@^7.10.1": 118 | version "7.10.1" 119 | resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4" 120 | integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ== 121 | dependencies: 122 | "@babel/helper-get-function-arity" "^7.10.1" 123 | "@babel/template" "^7.10.1" 124 | "@babel/types" "^7.10.1" 125 | 126 | "@babel/helper-get-function-arity@^7.10.1": 127 | version "7.10.1" 128 | resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d" 129 | integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw== 130 | dependencies: 131 | "@babel/types" "^7.10.1" 132 | 133 | "@babel/helper-hoist-variables@^7.10.1": 134 | version "7.10.1" 135 | resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz#7e77c82e5dcae1ebf123174c385aaadbf787d077" 136 | integrity sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg== 137 | dependencies: 138 | "@babel/types" "^7.10.1" 139 | 140 | "@babel/helper-member-expression-to-functions@^7.10.1": 141 | version "7.10.1" 142 | resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15" 143 | integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g== 144 | dependencies: 145 | "@babel/types" "^7.10.1" 146 | 147 | "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.1": 148 | version "7.10.1" 149 | resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" 150 | integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== 151 | dependencies: 152 | "@babel/types" "^7.10.1" 153 | 154 | "@babel/helper-module-transforms@^7.10.1": 155 | version "7.10.1" 156 | resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" 157 | integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== 158 | dependencies: 159 | "@babel/helper-module-imports" "^7.10.1" 160 | "@babel/helper-replace-supers" "^7.10.1" 161 | "@babel/helper-simple-access" "^7.10.1" 162 | "@babel/helper-split-export-declaration" "^7.10.1" 163 | "@babel/template" "^7.10.1" 164 | "@babel/types" "^7.10.1" 165 | lodash "^4.17.13" 166 | 167 | "@babel/helper-optimise-call-expression@^7.10.1": 168 | version "7.10.1" 169 | resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543" 170 | integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg== 171 | dependencies: 172 | "@babel/types" "^7.10.1" 173 | 174 | "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.8.0": 175 | version "7.10.1" 176 | resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" 177 | integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== 178 | 179 | "@babel/helper-regex@^7.10.1": 180 | version "7.10.1" 181 | resolved "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" 182 | integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g== 183 | dependencies: 184 | lodash "^4.17.13" 185 | 186 | "@babel/helper-remap-async-to-generator@^7.10.1": 187 | version "7.10.1" 188 | resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz#bad6aaa4ff39ce8d4b82ccaae0bfe0f7dbb5f432" 189 | integrity sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A== 190 | dependencies: 191 | "@babel/helper-annotate-as-pure" "^7.10.1" 192 | "@babel/helper-wrap-function" "^7.10.1" 193 | "@babel/template" "^7.10.1" 194 | "@babel/traverse" "^7.10.1" 195 | "@babel/types" "^7.10.1" 196 | 197 | "@babel/helper-replace-supers@^7.10.1": 198 | version "7.10.1" 199 | resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" 200 | integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== 201 | dependencies: 202 | "@babel/helper-member-expression-to-functions" "^7.10.1" 203 | "@babel/helper-optimise-call-expression" "^7.10.1" 204 | "@babel/traverse" "^7.10.1" 205 | "@babel/types" "^7.10.1" 206 | 207 | "@babel/helper-simple-access@^7.10.1": 208 | version "7.10.1" 209 | resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" 210 | integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== 211 | dependencies: 212 | "@babel/template" "^7.10.1" 213 | "@babel/types" "^7.10.1" 214 | 215 | "@babel/helper-split-export-declaration@^7.10.1": 216 | version "7.10.1" 217 | resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" 218 | integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== 219 | dependencies: 220 | "@babel/types" "^7.10.1" 221 | 222 | "@babel/helper-validator-identifier@^7.10.1": 223 | version "7.10.1" 224 | resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" 225 | integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== 226 | 227 | "@babel/helper-wrap-function@^7.10.1": 228 | version "7.10.1" 229 | resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9" 230 | integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ== 231 | dependencies: 232 | "@babel/helper-function-name" "^7.10.1" 233 | "@babel/template" "^7.10.1" 234 | "@babel/traverse" "^7.10.1" 235 | "@babel/types" "^7.10.1" 236 | 237 | "@babel/helpers@^7.10.1": 238 | version "7.10.1" 239 | resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" 240 | integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== 241 | dependencies: 242 | "@babel/template" "^7.10.1" 243 | "@babel/traverse" "^7.10.1" 244 | "@babel/types" "^7.10.1" 245 | 246 | "@babel/highlight@^7.10.1": 247 | version "7.10.1" 248 | resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" 249 | integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg== 250 | dependencies: 251 | "@babel/helper-validator-identifier" "^7.10.1" 252 | chalk "^2.0.0" 253 | js-tokens "^4.0.0" 254 | 255 | "@babel/parser@^7.10.1", "@babel/parser@^7.10.2", "@babel/parser@^7.7.0": 256 | version "7.10.2" 257 | resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0" 258 | integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ== 259 | 260 | "@babel/plugin-external-helpers@^7.10.1": 261 | version "7.10.1" 262 | resolved "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.10.1.tgz#9ba69a8011a163c3c73dce162df1e6737c4e8dcf" 263 | integrity sha512-xFXc/Ts/gsgCrkh3waZbVdkzmhtnlw1L972gx96pmj8hXvloHnPTDgZ07vTDve9ilpe9TcrIMWLU7rg6FqnAWA== 264 | dependencies: 265 | "@babel/helper-plugin-utils" "^7.10.1" 266 | 267 | "@babel/plugin-proposal-async-generator-functions@^7.10.1": 268 | version "7.10.1" 269 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz#6911af5ba2e615c4ff3c497fe2f47b35bf6d7e55" 270 | integrity sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw== 271 | dependencies: 272 | "@babel/helper-plugin-utils" "^7.10.1" 273 | "@babel/helper-remap-async-to-generator" "^7.10.1" 274 | "@babel/plugin-syntax-async-generators" "^7.8.0" 275 | 276 | "@babel/plugin-proposal-class-properties@^7.10.1": 277 | version "7.10.1" 278 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" 279 | integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw== 280 | dependencies: 281 | "@babel/helper-create-class-features-plugin" "^7.10.1" 282 | "@babel/helper-plugin-utils" "^7.10.1" 283 | 284 | "@babel/plugin-proposal-dynamic-import@^7.10.1": 285 | version "7.10.1" 286 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0" 287 | integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA== 288 | dependencies: 289 | "@babel/helper-plugin-utils" "^7.10.1" 290 | "@babel/plugin-syntax-dynamic-import" "^7.8.0" 291 | 292 | "@babel/plugin-proposal-json-strings@^7.10.1": 293 | version "7.10.1" 294 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09" 295 | integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg== 296 | dependencies: 297 | "@babel/helper-plugin-utils" "^7.10.1" 298 | "@babel/plugin-syntax-json-strings" "^7.8.0" 299 | 300 | "@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1": 301 | version "7.10.1" 302 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78" 303 | integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA== 304 | dependencies: 305 | "@babel/helper-plugin-utils" "^7.10.1" 306 | "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" 307 | 308 | "@babel/plugin-proposal-numeric-separator@^7.10.1": 309 | version "7.10.1" 310 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123" 311 | integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA== 312 | dependencies: 313 | "@babel/helper-plugin-utils" "^7.10.1" 314 | "@babel/plugin-syntax-numeric-separator" "^7.10.1" 315 | 316 | "@babel/plugin-proposal-object-rest-spread@^7.10.1": 317 | version "7.10.1" 318 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6" 319 | integrity sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ== 320 | dependencies: 321 | "@babel/helper-plugin-utils" "^7.10.1" 322 | "@babel/plugin-syntax-object-rest-spread" "^7.8.0" 323 | "@babel/plugin-transform-parameters" "^7.10.1" 324 | 325 | "@babel/plugin-proposal-optional-catch-binding@^7.10.1": 326 | version "7.10.1" 327 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2" 328 | integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA== 329 | dependencies: 330 | "@babel/helper-plugin-utils" "^7.10.1" 331 | "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" 332 | 333 | "@babel/plugin-proposal-optional-chaining@^7.10.1": 334 | version "7.10.1" 335 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz#15f5d6d22708629451a91be28f8facc55b0e818c" 336 | integrity sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA== 337 | dependencies: 338 | "@babel/helper-plugin-utils" "^7.10.1" 339 | "@babel/plugin-syntax-optional-chaining" "^7.8.0" 340 | 341 | "@babel/plugin-proposal-private-methods@^7.10.1": 342 | version "7.10.1" 343 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598" 344 | integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg== 345 | dependencies: 346 | "@babel/helper-create-class-features-plugin" "^7.10.1" 347 | "@babel/helper-plugin-utils" "^7.10.1" 348 | 349 | "@babel/plugin-proposal-unicode-property-regex@^7.10.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": 350 | version "7.10.1" 351 | resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f" 352 | integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ== 353 | dependencies: 354 | "@babel/helper-create-regexp-features-plugin" "^7.10.1" 355 | "@babel/helper-plugin-utils" "^7.10.1" 356 | 357 | "@babel/plugin-syntax-async-generators@^7.8.0": 358 | version "7.8.4" 359 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" 360 | integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== 361 | dependencies: 362 | "@babel/helper-plugin-utils" "^7.8.0" 363 | 364 | "@babel/plugin-syntax-class-properties@^7.10.1": 365 | version "7.10.1" 366 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" 367 | integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== 368 | dependencies: 369 | "@babel/helper-plugin-utils" "^7.10.1" 370 | 371 | "@babel/plugin-syntax-dynamic-import@^7.8.0": 372 | version "7.8.3" 373 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" 374 | integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== 375 | dependencies: 376 | "@babel/helper-plugin-utils" "^7.8.0" 377 | 378 | "@babel/plugin-syntax-json-strings@^7.8.0": 379 | version "7.8.3" 380 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" 381 | integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== 382 | dependencies: 383 | "@babel/helper-plugin-utils" "^7.8.0" 384 | 385 | "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": 386 | version "7.8.3" 387 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" 388 | integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== 389 | dependencies: 390 | "@babel/helper-plugin-utils" "^7.8.0" 391 | 392 | "@babel/plugin-syntax-numeric-separator@^7.10.1": 393 | version "7.10.1" 394 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" 395 | integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== 396 | dependencies: 397 | "@babel/helper-plugin-utils" "^7.10.1" 398 | 399 | "@babel/plugin-syntax-object-rest-spread@^7.8.0": 400 | version "7.8.3" 401 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" 402 | integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== 403 | dependencies: 404 | "@babel/helper-plugin-utils" "^7.8.0" 405 | 406 | "@babel/plugin-syntax-optional-catch-binding@^7.8.0": 407 | version "7.8.3" 408 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" 409 | integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== 410 | dependencies: 411 | "@babel/helper-plugin-utils" "^7.8.0" 412 | 413 | "@babel/plugin-syntax-optional-chaining@^7.8.0": 414 | version "7.8.3" 415 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" 416 | integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== 417 | dependencies: 418 | "@babel/helper-plugin-utils" "^7.8.0" 419 | 420 | "@babel/plugin-syntax-top-level-await@^7.10.1": 421 | version "7.10.1" 422 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362" 423 | integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ== 424 | dependencies: 425 | "@babel/helper-plugin-utils" "^7.10.1" 426 | 427 | "@babel/plugin-transform-arrow-functions@^7.10.1": 428 | version "7.10.1" 429 | resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b" 430 | integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA== 431 | dependencies: 432 | "@babel/helper-plugin-utils" "^7.10.1" 433 | 434 | "@babel/plugin-transform-async-to-generator@^7.10.1": 435 | version "7.10.1" 436 | resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062" 437 | integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg== 438 | dependencies: 439 | "@babel/helper-module-imports" "^7.10.1" 440 | "@babel/helper-plugin-utils" "^7.10.1" 441 | "@babel/helper-remap-async-to-generator" "^7.10.1" 442 | 443 | "@babel/plugin-transform-block-scoped-functions@^7.10.1": 444 | version "7.10.1" 445 | resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d" 446 | integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q== 447 | dependencies: 448 | "@babel/helper-plugin-utils" "^7.10.1" 449 | 450 | "@babel/plugin-transform-block-scoping@^7.10.1": 451 | version "7.10.1" 452 | resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" 453 | integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== 454 | dependencies: 455 | "@babel/helper-plugin-utils" "^7.10.1" 456 | lodash "^4.17.13" 457 | 458 | "@babel/plugin-transform-classes@^7.10.1": 459 | version "7.10.1" 460 | resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f" 461 | integrity sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ== 462 | dependencies: 463 | "@babel/helper-annotate-as-pure" "^7.10.1" 464 | "@babel/helper-define-map" "^7.10.1" 465 | "@babel/helper-function-name" "^7.10.1" 466 | "@babel/helper-optimise-call-expression" "^7.10.1" 467 | "@babel/helper-plugin-utils" "^7.10.1" 468 | "@babel/helper-replace-supers" "^7.10.1" 469 | "@babel/helper-split-export-declaration" "^7.10.1" 470 | globals "^11.1.0" 471 | 472 | "@babel/plugin-transform-computed-properties@^7.10.1": 473 | version "7.10.1" 474 | resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz#59aa399064429d64dce5cf76ef9b90b7245ebd07" 475 | integrity sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ== 476 | dependencies: 477 | "@babel/helper-plugin-utils" "^7.10.1" 478 | 479 | "@babel/plugin-transform-destructuring@^7.10.1": 480 | version "7.10.1" 481 | resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" 482 | integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== 483 | dependencies: 484 | "@babel/helper-plugin-utils" "^7.10.1" 485 | 486 | "@babel/plugin-transform-dotall-regex@^7.10.1", "@babel/plugin-transform-dotall-regex@^7.4.4": 487 | version "7.10.1" 488 | resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee" 489 | integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA== 490 | dependencies: 491 | "@babel/helper-create-regexp-features-plugin" "^7.10.1" 492 | "@babel/helper-plugin-utils" "^7.10.1" 493 | 494 | "@babel/plugin-transform-duplicate-keys@^7.10.1": 495 | version "7.10.1" 496 | resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9" 497 | integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA== 498 | dependencies: 499 | "@babel/helper-plugin-utils" "^7.10.1" 500 | 501 | "@babel/plugin-transform-exponentiation-operator@^7.10.1": 502 | version "7.10.1" 503 | resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3" 504 | integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA== 505 | dependencies: 506 | "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1" 507 | "@babel/helper-plugin-utils" "^7.10.1" 508 | 509 | "@babel/plugin-transform-for-of@^7.10.1": 510 | version "7.10.1" 511 | resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5" 512 | integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w== 513 | dependencies: 514 | "@babel/helper-plugin-utils" "^7.10.1" 515 | 516 | "@babel/plugin-transform-function-name@^7.10.1": 517 | version "7.10.1" 518 | resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d" 519 | integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw== 520 | dependencies: 521 | "@babel/helper-function-name" "^7.10.1" 522 | "@babel/helper-plugin-utils" "^7.10.1" 523 | 524 | "@babel/plugin-transform-literals@^7.10.1": 525 | version "7.10.1" 526 | resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a" 527 | integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw== 528 | dependencies: 529 | "@babel/helper-plugin-utils" "^7.10.1" 530 | 531 | "@babel/plugin-transform-member-expression-literals@^7.10.1": 532 | version "7.10.1" 533 | resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39" 534 | integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA== 535 | dependencies: 536 | "@babel/helper-plugin-utils" "^7.10.1" 537 | 538 | "@babel/plugin-transform-modules-amd@^7.10.1": 539 | version "7.10.1" 540 | resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a" 541 | integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw== 542 | dependencies: 543 | "@babel/helper-module-transforms" "^7.10.1" 544 | "@babel/helper-plugin-utils" "^7.10.1" 545 | babel-plugin-dynamic-import-node "^2.3.3" 546 | 547 | "@babel/plugin-transform-modules-commonjs@^7.10.1": 548 | version "7.10.1" 549 | resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301" 550 | integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg== 551 | dependencies: 552 | "@babel/helper-module-transforms" "^7.10.1" 553 | "@babel/helper-plugin-utils" "^7.10.1" 554 | "@babel/helper-simple-access" "^7.10.1" 555 | babel-plugin-dynamic-import-node "^2.3.3" 556 | 557 | "@babel/plugin-transform-modules-systemjs@^7.10.1": 558 | version "7.10.1" 559 | resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz#9962e4b0ac6aaf2e20431ada3d8ec72082cbffb6" 560 | integrity sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA== 561 | dependencies: 562 | "@babel/helper-hoist-variables" "^7.10.1" 563 | "@babel/helper-module-transforms" "^7.10.1" 564 | "@babel/helper-plugin-utils" "^7.10.1" 565 | babel-plugin-dynamic-import-node "^2.3.3" 566 | 567 | "@babel/plugin-transform-modules-umd@^7.10.1": 568 | version "7.10.1" 569 | resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595" 570 | integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA== 571 | dependencies: 572 | "@babel/helper-module-transforms" "^7.10.1" 573 | "@babel/helper-plugin-utils" "^7.10.1" 574 | 575 | "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": 576 | version "7.8.3" 577 | resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" 578 | integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== 579 | dependencies: 580 | "@babel/helper-create-regexp-features-plugin" "^7.8.3" 581 | 582 | "@babel/plugin-transform-new-target@^7.10.1": 583 | version "7.10.1" 584 | resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324" 585 | integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw== 586 | dependencies: 587 | "@babel/helper-plugin-utils" "^7.10.1" 588 | 589 | "@babel/plugin-transform-object-super@^7.10.1": 590 | version "7.10.1" 591 | resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde" 592 | integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw== 593 | dependencies: 594 | "@babel/helper-plugin-utils" "^7.10.1" 595 | "@babel/helper-replace-supers" "^7.10.1" 596 | 597 | "@babel/plugin-transform-parameters@^7.10.1": 598 | version "7.10.1" 599 | resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd" 600 | integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg== 601 | dependencies: 602 | "@babel/helper-get-function-arity" "^7.10.1" 603 | "@babel/helper-plugin-utils" "^7.10.1" 604 | 605 | "@babel/plugin-transform-property-literals@^7.10.1": 606 | version "7.10.1" 607 | resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d" 608 | integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA== 609 | dependencies: 610 | "@babel/helper-plugin-utils" "^7.10.1" 611 | 612 | "@babel/plugin-transform-regenerator@^7.10.1": 613 | version "7.10.1" 614 | resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490" 615 | integrity sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw== 616 | dependencies: 617 | regenerator-transform "^0.14.2" 618 | 619 | "@babel/plugin-transform-reserved-words@^7.10.1": 620 | version "7.10.1" 621 | resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86" 622 | integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ== 623 | dependencies: 624 | "@babel/helper-plugin-utils" "^7.10.1" 625 | 626 | "@babel/plugin-transform-shorthand-properties@^7.10.1": 627 | version "7.10.1" 628 | resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3" 629 | integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g== 630 | dependencies: 631 | "@babel/helper-plugin-utils" "^7.10.1" 632 | 633 | "@babel/plugin-transform-spread@^7.10.1": 634 | version "7.10.1" 635 | resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8" 636 | integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw== 637 | dependencies: 638 | "@babel/helper-plugin-utils" "^7.10.1" 639 | 640 | "@babel/plugin-transform-sticky-regex@^7.10.1": 641 | version "7.10.1" 642 | resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00" 643 | integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA== 644 | dependencies: 645 | "@babel/helper-plugin-utils" "^7.10.1" 646 | "@babel/helper-regex" "^7.10.1" 647 | 648 | "@babel/plugin-transform-template-literals@^7.10.1": 649 | version "7.10.1" 650 | resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz#914c7b7f4752c570ea00553b4284dad8070e8628" 651 | integrity sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg== 652 | dependencies: 653 | "@babel/helper-annotate-as-pure" "^7.10.1" 654 | "@babel/helper-plugin-utils" "^7.10.1" 655 | 656 | "@babel/plugin-transform-typeof-symbol@^7.10.1": 657 | version "7.10.1" 658 | resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e" 659 | integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g== 660 | dependencies: 661 | "@babel/helper-plugin-utils" "^7.10.1" 662 | 663 | "@babel/plugin-transform-unicode-escapes@^7.10.1": 664 | version "7.10.1" 665 | resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940" 666 | integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw== 667 | dependencies: 668 | "@babel/helper-plugin-utils" "^7.10.1" 669 | 670 | "@babel/plugin-transform-unicode-regex@^7.10.1": 671 | version "7.10.1" 672 | resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f" 673 | integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw== 674 | dependencies: 675 | "@babel/helper-create-regexp-features-plugin" "^7.10.1" 676 | "@babel/helper-plugin-utils" "^7.10.1" 677 | 678 | "@babel/preset-env@^7.10.2": 679 | version "7.10.2" 680 | resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz#715930f2cf8573b0928005ee562bed52fb65fdfb" 681 | integrity sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA== 682 | dependencies: 683 | "@babel/compat-data" "^7.10.1" 684 | "@babel/helper-compilation-targets" "^7.10.2" 685 | "@babel/helper-module-imports" "^7.10.1" 686 | "@babel/helper-plugin-utils" "^7.10.1" 687 | "@babel/plugin-proposal-async-generator-functions" "^7.10.1" 688 | "@babel/plugin-proposal-class-properties" "^7.10.1" 689 | "@babel/plugin-proposal-dynamic-import" "^7.10.1" 690 | "@babel/plugin-proposal-json-strings" "^7.10.1" 691 | "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" 692 | "@babel/plugin-proposal-numeric-separator" "^7.10.1" 693 | "@babel/plugin-proposal-object-rest-spread" "^7.10.1" 694 | "@babel/plugin-proposal-optional-catch-binding" "^7.10.1" 695 | "@babel/plugin-proposal-optional-chaining" "^7.10.1" 696 | "@babel/plugin-proposal-private-methods" "^7.10.1" 697 | "@babel/plugin-proposal-unicode-property-regex" "^7.10.1" 698 | "@babel/plugin-syntax-async-generators" "^7.8.0" 699 | "@babel/plugin-syntax-class-properties" "^7.10.1" 700 | "@babel/plugin-syntax-dynamic-import" "^7.8.0" 701 | "@babel/plugin-syntax-json-strings" "^7.8.0" 702 | "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" 703 | "@babel/plugin-syntax-numeric-separator" "^7.10.1" 704 | "@babel/plugin-syntax-object-rest-spread" "^7.8.0" 705 | "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" 706 | "@babel/plugin-syntax-optional-chaining" "^7.8.0" 707 | "@babel/plugin-syntax-top-level-await" "^7.10.1" 708 | "@babel/plugin-transform-arrow-functions" "^7.10.1" 709 | "@babel/plugin-transform-async-to-generator" "^7.10.1" 710 | "@babel/plugin-transform-block-scoped-functions" "^7.10.1" 711 | "@babel/plugin-transform-block-scoping" "^7.10.1" 712 | "@babel/plugin-transform-classes" "^7.10.1" 713 | "@babel/plugin-transform-computed-properties" "^7.10.1" 714 | "@babel/plugin-transform-destructuring" "^7.10.1" 715 | "@babel/plugin-transform-dotall-regex" "^7.10.1" 716 | "@babel/plugin-transform-duplicate-keys" "^7.10.1" 717 | "@babel/plugin-transform-exponentiation-operator" "^7.10.1" 718 | "@babel/plugin-transform-for-of" "^7.10.1" 719 | "@babel/plugin-transform-function-name" "^7.10.1" 720 | "@babel/plugin-transform-literals" "^7.10.1" 721 | "@babel/plugin-transform-member-expression-literals" "^7.10.1" 722 | "@babel/plugin-transform-modules-amd" "^7.10.1" 723 | "@babel/plugin-transform-modules-commonjs" "^7.10.1" 724 | "@babel/plugin-transform-modules-systemjs" "^7.10.1" 725 | "@babel/plugin-transform-modules-umd" "^7.10.1" 726 | "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" 727 | "@babel/plugin-transform-new-target" "^7.10.1" 728 | "@babel/plugin-transform-object-super" "^7.10.1" 729 | "@babel/plugin-transform-parameters" "^7.10.1" 730 | "@babel/plugin-transform-property-literals" "^7.10.1" 731 | "@babel/plugin-transform-regenerator" "^7.10.1" 732 | "@babel/plugin-transform-reserved-words" "^7.10.1" 733 | "@babel/plugin-transform-shorthand-properties" "^7.10.1" 734 | "@babel/plugin-transform-spread" "^7.10.1" 735 | "@babel/plugin-transform-sticky-regex" "^7.10.1" 736 | "@babel/plugin-transform-template-literals" "^7.10.1" 737 | "@babel/plugin-transform-typeof-symbol" "^7.10.1" 738 | "@babel/plugin-transform-unicode-escapes" "^7.10.1" 739 | "@babel/plugin-transform-unicode-regex" "^7.10.1" 740 | "@babel/preset-modules" "^0.1.3" 741 | "@babel/types" "^7.10.2" 742 | browserslist "^4.12.0" 743 | core-js-compat "^3.6.2" 744 | invariant "^2.2.2" 745 | levenary "^1.1.1" 746 | semver "^5.5.0" 747 | 748 | "@babel/preset-modules@^0.1.3": 749 | version "0.1.3" 750 | resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" 751 | integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== 752 | dependencies: 753 | "@babel/helper-plugin-utils" "^7.0.0" 754 | "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" 755 | "@babel/plugin-transform-dotall-regex" "^7.4.4" 756 | "@babel/types" "^7.4.4" 757 | esutils "^2.0.2" 758 | 759 | "@babel/register@^7.10.1": 760 | version "7.10.1" 761 | resolved "https://registry.npmjs.org/@babel/register/-/register-7.10.1.tgz#b6567c5cb5049f44bbf8c35d6ff68ca3c43238ed" 762 | integrity sha512-sl96+kB3IA2B9EzpwwBmYadOT14vw3KaXOknGDbJaZCOj52GDA4Tivudq9doCJcB+bEIKCEARZYwRgBBsCGXyg== 763 | dependencies: 764 | find-cache-dir "^2.0.0" 765 | lodash "^4.17.13" 766 | make-dir "^2.1.0" 767 | pirates "^4.0.0" 768 | source-map-support "^0.5.16" 769 | 770 | "@babel/runtime@^7.8.4": 771 | version "7.10.2" 772 | resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" 773 | integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== 774 | dependencies: 775 | regenerator-runtime "^0.13.4" 776 | 777 | "@babel/template@^7.10.1": 778 | version "7.10.1" 779 | resolved "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811" 780 | integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig== 781 | dependencies: 782 | "@babel/code-frame" "^7.10.1" 783 | "@babel/parser" "^7.10.1" 784 | "@babel/types" "^7.10.1" 785 | 786 | "@babel/traverse@^7.10.1", "@babel/traverse@^7.7.0": 787 | version "7.10.1" 788 | resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" 789 | integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== 790 | dependencies: 791 | "@babel/code-frame" "^7.10.1" 792 | "@babel/generator" "^7.10.1" 793 | "@babel/helper-function-name" "^7.10.1" 794 | "@babel/helper-split-export-declaration" "^7.10.1" 795 | "@babel/parser" "^7.10.1" 796 | "@babel/types" "^7.10.1" 797 | debug "^4.1.0" 798 | globals "^11.1.0" 799 | lodash "^4.17.13" 800 | 801 | "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.4.4", "@babel/types@^7.7.0": 802 | version "7.10.2" 803 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" 804 | integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng== 805 | dependencies: 806 | "@babel/helper-validator-identifier" "^7.10.1" 807 | lodash "^4.17.13" 808 | to-fast-properties "^2.0.0" 809 | 810 | "@types/estree@*": 811 | version "0.0.44" 812 | resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21" 813 | integrity sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g== 814 | 815 | "@types/node@*": 816 | version "14.0.13" 817 | resolved "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz#ee1128e881b874c371374c1f72201893616417c9" 818 | integrity sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA== 819 | 820 | acorn-jsx@^5.0.0: 821 | version "5.2.0" 822 | resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" 823 | integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== 824 | 825 | acorn@^6.0.7: 826 | version "6.4.1" 827 | resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" 828 | integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== 829 | 830 | acorn@^7.1.0: 831 | version "7.3.1" 832 | resolved "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" 833 | integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== 834 | 835 | ajv@^6.10.2, ajv@^6.9.1: 836 | version "6.12.6" 837 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 838 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 839 | dependencies: 840 | fast-deep-equal "^3.1.1" 841 | fast-json-stable-stringify "^2.0.0" 842 | json-schema-traverse "^0.4.1" 843 | uri-js "^4.2.2" 844 | 845 | ansi-colors@3.2.3: 846 | version "3.2.3" 847 | resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" 848 | integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== 849 | 850 | ansi-escapes@^3.2.0: 851 | version "3.2.0" 852 | resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" 853 | integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== 854 | 855 | ansi-regex@^3.0.0: 856 | version "3.0.0" 857 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 858 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 859 | 860 | ansi-regex@^4.1.0: 861 | version "4.1.0" 862 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 863 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 864 | 865 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 866 | version "3.2.1" 867 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 868 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 869 | dependencies: 870 | color-convert "^1.9.0" 871 | 872 | argparse@^1.0.7: 873 | version "1.0.10" 874 | resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 875 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 876 | dependencies: 877 | sprintf-js "~1.0.2" 878 | 879 | astral-regex@^1.0.0: 880 | version "1.0.0" 881 | resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 882 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 883 | 884 | babel-eslint@^10.1.0: 885 | version "10.1.0" 886 | resolved "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" 887 | integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== 888 | dependencies: 889 | "@babel/code-frame" "^7.0.0" 890 | "@babel/parser" "^7.7.0" 891 | "@babel/traverse" "^7.7.0" 892 | "@babel/types" "^7.7.0" 893 | eslint-visitor-keys "^1.0.0" 894 | resolve "^1.12.0" 895 | 896 | babel-plugin-dynamic-import-node@^2.3.3: 897 | version "2.3.3" 898 | resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" 899 | integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== 900 | dependencies: 901 | object.assign "^4.1.0" 902 | 903 | balanced-match@^1.0.0: 904 | version "1.0.0" 905 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 906 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 907 | 908 | brace-expansion@^1.1.7: 909 | version "1.1.11" 910 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 911 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 912 | dependencies: 913 | balanced-match "^1.0.0" 914 | concat-map "0.0.1" 915 | 916 | browser-stdout@1.3.1: 917 | version "1.3.1" 918 | resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 919 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 920 | 921 | browserslist@^4.12.0, browserslist@^4.8.5: 922 | version "4.16.6" 923 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" 924 | integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== 925 | dependencies: 926 | caniuse-lite "^1.0.30001219" 927 | colorette "^1.2.2" 928 | electron-to-chromium "^1.3.723" 929 | escalade "^3.1.1" 930 | node-releases "^1.1.71" 931 | 932 | buffer-from@^1.0.0: 933 | version "1.1.1" 934 | resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 935 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 936 | 937 | callsites@^3.0.0: 938 | version "3.1.0" 939 | resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 940 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 941 | 942 | camelcase@^5.0.0: 943 | version "5.3.1" 944 | resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 945 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 946 | 947 | caniuse-lite@^1.0.30001219: 948 | version "1.0.30001228" 949 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" 950 | integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== 951 | 952 | chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: 953 | version "2.4.2" 954 | resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 955 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 956 | dependencies: 957 | ansi-styles "^3.2.1" 958 | escape-string-regexp "^1.0.5" 959 | supports-color "^5.3.0" 960 | 961 | chardet@^0.7.0: 962 | version "0.7.0" 963 | resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 964 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 965 | 966 | cli-cursor@^2.1.0: 967 | version "2.1.0" 968 | resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 969 | integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= 970 | dependencies: 971 | restore-cursor "^2.0.0" 972 | 973 | cli-width@^2.0.0: 974 | version "2.2.1" 975 | resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" 976 | integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== 977 | 978 | cliui@^5.0.0: 979 | version "5.0.0" 980 | resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 981 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 982 | dependencies: 983 | string-width "^3.1.0" 984 | strip-ansi "^5.2.0" 985 | wrap-ansi "^5.1.0" 986 | 987 | color-convert@^1.9.0: 988 | version "1.9.3" 989 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 990 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 991 | dependencies: 992 | color-name "1.1.3" 993 | 994 | color-name@1.1.3: 995 | version "1.1.3" 996 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 997 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 998 | 999 | colorette@^1.2.2: 1000 | version "1.2.2" 1001 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" 1002 | integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== 1003 | 1004 | commander@~2.20.3: 1005 | version "2.20.3" 1006 | resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 1007 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 1008 | 1009 | commondir@^1.0.1: 1010 | version "1.0.1" 1011 | resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 1012 | integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= 1013 | 1014 | concat-map@0.0.1: 1015 | version "0.0.1" 1016 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 1017 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 1018 | 1019 | convert-source-map@^1.7.0: 1020 | version "1.7.0" 1021 | resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" 1022 | integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== 1023 | dependencies: 1024 | safe-buffer "~5.1.1" 1025 | 1026 | core-js-compat@^3.6.2: 1027 | version "3.6.5" 1028 | resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" 1029 | integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== 1030 | dependencies: 1031 | browserslist "^4.8.5" 1032 | semver "7.0.0" 1033 | 1034 | cross-spawn@^6.0.5: 1035 | version "6.0.5" 1036 | resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 1037 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 1038 | dependencies: 1039 | nice-try "^1.0.4" 1040 | path-key "^2.0.1" 1041 | semver "^5.5.0" 1042 | shebang-command "^1.2.0" 1043 | which "^1.2.9" 1044 | 1045 | debug@3.2.6: 1046 | version "3.2.6" 1047 | resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 1048 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 1049 | dependencies: 1050 | ms "^2.1.1" 1051 | 1052 | debug@^4.0.1, debug@^4.1.0: 1053 | version "4.1.1" 1054 | resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 1055 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 1056 | dependencies: 1057 | ms "^2.1.1" 1058 | 1059 | decamelize@^1.2.0: 1060 | version "1.2.0" 1061 | resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 1062 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 1063 | 1064 | deep-is@~0.1.3: 1065 | version "0.1.3" 1066 | resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 1067 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 1068 | 1069 | define-properties@^1.1.2, define-properties@^1.1.3: 1070 | version "1.1.3" 1071 | resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 1072 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 1073 | dependencies: 1074 | object-keys "^1.0.12" 1075 | 1076 | diff@3.5.0: 1077 | version "3.5.0" 1078 | resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 1079 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 1080 | 1081 | doctrine@^3.0.0: 1082 | version "3.0.0" 1083 | resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 1084 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 1085 | dependencies: 1086 | esutils "^2.0.2" 1087 | 1088 | duplexer@^0.1.1: 1089 | version "0.1.1" 1090 | resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" 1091 | integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= 1092 | 1093 | electron-to-chromium@^1.3.723: 1094 | version "1.3.736" 1095 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.736.tgz#f632d900a1f788dab22fec9c62ec5c9c8f0c4052" 1096 | integrity sha512-DY8dA7gR51MSo66DqitEQoUMQ0Z+A2DSXFi7tK304bdTVqczCAfUuyQw6Wdg8hIoo5zIxkU1L24RQtUce1Ioig== 1097 | 1098 | emoji-regex@^7.0.1: 1099 | version "7.0.3" 1100 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 1101 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 1102 | 1103 | es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: 1104 | version "1.17.5" 1105 | resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" 1106 | integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== 1107 | dependencies: 1108 | es-to-primitive "^1.2.1" 1109 | function-bind "^1.1.1" 1110 | has "^1.0.3" 1111 | has-symbols "^1.0.1" 1112 | is-callable "^1.1.5" 1113 | is-regex "^1.0.5" 1114 | object-inspect "^1.7.0" 1115 | object-keys "^1.1.1" 1116 | object.assign "^4.1.0" 1117 | string.prototype.trimleft "^2.1.1" 1118 | string.prototype.trimright "^2.1.1" 1119 | 1120 | es-to-primitive@^1.2.1: 1121 | version "1.2.1" 1122 | resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 1123 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 1124 | dependencies: 1125 | is-callable "^1.1.4" 1126 | is-date-object "^1.0.1" 1127 | is-symbol "^1.0.2" 1128 | 1129 | escalade@^3.1.1: 1130 | version "3.1.1" 1131 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 1132 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 1133 | 1134 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 1135 | version "1.0.5" 1136 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1137 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 1138 | 1139 | eslint-config-prettier@^6.11.0: 1140 | version "6.11.0" 1141 | resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" 1142 | integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== 1143 | dependencies: 1144 | get-stdin "^6.0.0" 1145 | 1146 | eslint-plugin-prettier@^3.1.3: 1147 | version "3.1.3" 1148 | resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz#ae116a0fc0e598fdae48743a4430903de5b4e6ca" 1149 | integrity sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ== 1150 | dependencies: 1151 | prettier-linter-helpers "^1.0.0" 1152 | 1153 | eslint-scope@^4.0.3: 1154 | version "4.0.3" 1155 | resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" 1156 | integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== 1157 | dependencies: 1158 | esrecurse "^4.1.0" 1159 | estraverse "^4.1.1" 1160 | 1161 | eslint-utils@^1.3.1: 1162 | version "1.4.3" 1163 | resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" 1164 | integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== 1165 | dependencies: 1166 | eslint-visitor-keys "^1.1.0" 1167 | 1168 | eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: 1169 | version "1.2.0" 1170 | resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz#74415ac884874495f78ec2a97349525344c981fa" 1171 | integrity sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ== 1172 | 1173 | eslint@^5: 1174 | version "5.16.0" 1175 | resolved "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" 1176 | integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== 1177 | dependencies: 1178 | "@babel/code-frame" "^7.0.0" 1179 | ajv "^6.9.1" 1180 | chalk "^2.1.0" 1181 | cross-spawn "^6.0.5" 1182 | debug "^4.0.1" 1183 | doctrine "^3.0.0" 1184 | eslint-scope "^4.0.3" 1185 | eslint-utils "^1.3.1" 1186 | eslint-visitor-keys "^1.0.0" 1187 | espree "^5.0.1" 1188 | esquery "^1.0.1" 1189 | esutils "^2.0.2" 1190 | file-entry-cache "^5.0.1" 1191 | functional-red-black-tree "^1.0.1" 1192 | glob "^7.1.2" 1193 | globals "^11.7.0" 1194 | ignore "^4.0.6" 1195 | import-fresh "^3.0.0" 1196 | imurmurhash "^0.1.4" 1197 | inquirer "^6.2.2" 1198 | js-yaml "^3.13.0" 1199 | json-stable-stringify-without-jsonify "^1.0.1" 1200 | levn "^0.3.0" 1201 | lodash "^4.17.11" 1202 | minimatch "^3.0.4" 1203 | mkdirp "^0.5.1" 1204 | natural-compare "^1.4.0" 1205 | optionator "^0.8.2" 1206 | path-is-inside "^1.0.2" 1207 | progress "^2.0.0" 1208 | regexpp "^2.0.1" 1209 | semver "^5.5.1" 1210 | strip-ansi "^4.0.0" 1211 | strip-json-comments "^2.0.1" 1212 | table "^5.2.3" 1213 | text-table "^0.2.0" 1214 | 1215 | espree@^5.0.1: 1216 | version "5.0.1" 1217 | resolved "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" 1218 | integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== 1219 | dependencies: 1220 | acorn "^6.0.7" 1221 | acorn-jsx "^5.0.0" 1222 | eslint-visitor-keys "^1.0.0" 1223 | 1224 | esprima@^4.0.0: 1225 | version "4.0.1" 1226 | resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 1227 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 1228 | 1229 | esquery@^1.0.1: 1230 | version "1.3.1" 1231 | resolved "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" 1232 | integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== 1233 | dependencies: 1234 | estraverse "^5.1.0" 1235 | 1236 | esrecurse@^4.1.0: 1237 | version "4.2.1" 1238 | resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 1239 | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 1240 | dependencies: 1241 | estraverse "^4.1.0" 1242 | 1243 | estraverse@^4.1.0, estraverse@^4.1.1: 1244 | version "4.3.0" 1245 | resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 1246 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 1247 | 1248 | estraverse@^5.1.0: 1249 | version "5.1.0" 1250 | resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" 1251 | integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== 1252 | 1253 | estree-walker@^0.6.1: 1254 | version "0.6.1" 1255 | resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" 1256 | integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== 1257 | 1258 | esutils@^2.0.2: 1259 | version "2.0.3" 1260 | resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 1261 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 1262 | 1263 | external-editor@^3.0.3: 1264 | version "3.1.0" 1265 | resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 1266 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 1267 | dependencies: 1268 | chardet "^0.7.0" 1269 | iconv-lite "^0.4.24" 1270 | tmp "^0.0.33" 1271 | 1272 | fast-deep-equal@^3.1.1: 1273 | version "3.1.3" 1274 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1275 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1276 | 1277 | fast-diff@^1.1.2: 1278 | version "1.2.0" 1279 | resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" 1280 | integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== 1281 | 1282 | fast-json-stable-stringify@^2.0.0: 1283 | version "2.1.0" 1284 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1285 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1286 | 1287 | fast-levenshtein@~2.0.6: 1288 | version "2.0.6" 1289 | resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1290 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 1291 | 1292 | figures@^2.0.0: 1293 | version "2.0.0" 1294 | resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 1295 | integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= 1296 | dependencies: 1297 | escape-string-regexp "^1.0.5" 1298 | 1299 | file-entry-cache@^5.0.1: 1300 | version "5.0.1" 1301 | resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" 1302 | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 1303 | dependencies: 1304 | flat-cache "^2.0.1" 1305 | 1306 | file-size@^1.0.0: 1307 | version "1.0.0" 1308 | resolved "https://registry.npmjs.org/file-size/-/file-size-1.0.0.tgz#3338267d5d206bbf60f4df60c19d7ed3813a4657" 1309 | integrity sha1-MzgmfV0ga79g9N9gwZ1+04E6Rlc= 1310 | 1311 | find-cache-dir@^2.0.0: 1312 | version "2.1.0" 1313 | resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" 1314 | integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== 1315 | dependencies: 1316 | commondir "^1.0.1" 1317 | make-dir "^2.0.0" 1318 | pkg-dir "^3.0.0" 1319 | 1320 | find-up@3.0.0, find-up@^3.0.0: 1321 | version "3.0.0" 1322 | resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 1323 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 1324 | dependencies: 1325 | locate-path "^3.0.0" 1326 | 1327 | flat-cache@^2.0.1: 1328 | version "2.0.1" 1329 | resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" 1330 | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 1331 | dependencies: 1332 | flatted "^2.0.0" 1333 | rimraf "2.6.3" 1334 | write "1.0.3" 1335 | 1336 | flat@^4.1.0: 1337 | version "4.1.0" 1338 | resolved "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 1339 | integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== 1340 | dependencies: 1341 | is-buffer "~2.0.3" 1342 | 1343 | flatted@^2.0.0: 1344 | version "2.0.2" 1345 | resolved "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" 1346 | integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== 1347 | 1348 | fs.realpath@^1.0.0: 1349 | version "1.0.0" 1350 | resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1351 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1352 | 1353 | function-bind@^1.1.1: 1354 | version "1.1.1" 1355 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1356 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1357 | 1358 | functional-red-black-tree@^1.0.1: 1359 | version "1.0.1" 1360 | resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 1361 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 1362 | 1363 | gensync@^1.0.0-beta.1: 1364 | version "1.0.0-beta.1" 1365 | resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" 1366 | integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== 1367 | 1368 | get-caller-file@^2.0.1: 1369 | version "2.0.5" 1370 | resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1371 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1372 | 1373 | get-stdin@^6.0.0: 1374 | version "6.0.0" 1375 | resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 1376 | integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== 1377 | 1378 | glob@7.1.3: 1379 | version "7.1.3" 1380 | resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 1381 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 1382 | dependencies: 1383 | fs.realpath "^1.0.0" 1384 | inflight "^1.0.4" 1385 | inherits "2" 1386 | minimatch "^3.0.4" 1387 | once "^1.3.0" 1388 | path-is-absolute "^1.0.0" 1389 | 1390 | glob@^7.1.2, glob@^7.1.3: 1391 | version "7.1.6" 1392 | resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 1393 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 1394 | dependencies: 1395 | fs.realpath "^1.0.0" 1396 | inflight "^1.0.4" 1397 | inherits "2" 1398 | minimatch "^3.0.4" 1399 | once "^1.3.0" 1400 | path-is-absolute "^1.0.0" 1401 | 1402 | globals@^11.1.0, globals@^11.7.0: 1403 | version "11.12.0" 1404 | resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 1405 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1406 | 1407 | growl@1.10.5: 1408 | version "1.10.5" 1409 | resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 1410 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 1411 | 1412 | gzip-size@^5.1.1: 1413 | version "5.1.1" 1414 | resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" 1415 | integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== 1416 | dependencies: 1417 | duplexer "^0.1.1" 1418 | pify "^4.0.1" 1419 | 1420 | has-flag@^3.0.0: 1421 | version "3.0.0" 1422 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1423 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 1424 | 1425 | has-symbols@^1.0.0, has-symbols@^1.0.1: 1426 | version "1.0.1" 1427 | resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 1428 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 1429 | 1430 | has@^1.0.3: 1431 | version "1.0.3" 1432 | resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1433 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1434 | dependencies: 1435 | function-bind "^1.1.1" 1436 | 1437 | he@1.2.0: 1438 | version "1.2.0" 1439 | resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 1440 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 1441 | 1442 | iconv-lite@^0.4.24: 1443 | version "0.4.24" 1444 | resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1445 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1446 | dependencies: 1447 | safer-buffer ">= 2.1.2 < 3" 1448 | 1449 | ignore@^4.0.6: 1450 | version "4.0.6" 1451 | resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 1452 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 1453 | 1454 | import-fresh@^3.0.0: 1455 | version "3.2.1" 1456 | resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" 1457 | integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== 1458 | dependencies: 1459 | parent-module "^1.0.0" 1460 | resolve-from "^4.0.0" 1461 | 1462 | imurmurhash@^0.1.4: 1463 | version "0.1.4" 1464 | resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1465 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1466 | 1467 | inflight@^1.0.4: 1468 | version "1.0.6" 1469 | resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1470 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1471 | dependencies: 1472 | once "^1.3.0" 1473 | wrappy "1" 1474 | 1475 | inherits@2: 1476 | version "2.0.4" 1477 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1478 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1479 | 1480 | inquirer@^6.2.2: 1481 | version "6.5.2" 1482 | resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" 1483 | integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== 1484 | dependencies: 1485 | ansi-escapes "^3.2.0" 1486 | chalk "^2.4.2" 1487 | cli-cursor "^2.1.0" 1488 | cli-width "^2.0.0" 1489 | external-editor "^3.0.3" 1490 | figures "^2.0.0" 1491 | lodash "^4.17.12" 1492 | mute-stream "0.0.7" 1493 | run-async "^2.2.0" 1494 | rxjs "^6.4.0" 1495 | string-width "^2.1.0" 1496 | strip-ansi "^5.1.0" 1497 | through "^2.3.6" 1498 | 1499 | invariant@^2.2.2, invariant@^2.2.4: 1500 | version "2.2.4" 1501 | resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 1502 | integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== 1503 | dependencies: 1504 | loose-envify "^1.0.0" 1505 | 1506 | is-buffer@~2.0.3: 1507 | version "2.0.4" 1508 | resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" 1509 | integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== 1510 | 1511 | is-callable@^1.1.4, is-callable@^1.1.5: 1512 | version "1.2.0" 1513 | resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" 1514 | integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== 1515 | 1516 | is-date-object@^1.0.1: 1517 | version "1.0.2" 1518 | resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 1519 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 1520 | 1521 | is-fullwidth-code-point@^2.0.0: 1522 | version "2.0.0" 1523 | resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1524 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1525 | 1526 | is-regex@^1.0.5: 1527 | version "1.1.0" 1528 | resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" 1529 | integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== 1530 | dependencies: 1531 | has-symbols "^1.0.1" 1532 | 1533 | is-symbol@^1.0.2: 1534 | version "1.0.3" 1535 | resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 1536 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 1537 | dependencies: 1538 | has-symbols "^1.0.1" 1539 | 1540 | isexe@^2.0.0: 1541 | version "2.0.0" 1542 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1543 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1544 | 1545 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1546 | version "4.0.0" 1547 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1548 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1549 | 1550 | js-yaml@3.13.1: 1551 | version "3.13.1" 1552 | resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 1553 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1554 | dependencies: 1555 | argparse "^1.0.7" 1556 | esprima "^4.0.0" 1557 | 1558 | js-yaml@^3.13.0: 1559 | version "3.14.0" 1560 | resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" 1561 | integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== 1562 | dependencies: 1563 | argparse "^1.0.7" 1564 | esprima "^4.0.0" 1565 | 1566 | jsesc@^2.5.1: 1567 | version "2.5.2" 1568 | resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 1569 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 1570 | 1571 | jsesc@~0.5.0: 1572 | version "0.5.0" 1573 | resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1574 | integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= 1575 | 1576 | json-schema-traverse@^0.4.1: 1577 | version "0.4.1" 1578 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1579 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1580 | 1581 | json-stable-stringify-without-jsonify@^1.0.1: 1582 | version "1.0.1" 1583 | resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1584 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1585 | 1586 | json5@^2.1.2: 1587 | version "2.1.3" 1588 | resolved "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" 1589 | integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== 1590 | dependencies: 1591 | minimist "^1.2.5" 1592 | 1593 | leven@^3.1.0: 1594 | version "3.1.0" 1595 | resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" 1596 | integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== 1597 | 1598 | levenary@^1.1.1: 1599 | version "1.1.1" 1600 | resolved "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" 1601 | integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== 1602 | dependencies: 1603 | leven "^3.1.0" 1604 | 1605 | levn@^0.3.0, levn@~0.3.0: 1606 | version "0.3.0" 1607 | resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1608 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 1609 | dependencies: 1610 | prelude-ls "~1.1.2" 1611 | type-check "~0.3.2" 1612 | 1613 | locate-path@^3.0.0: 1614 | version "3.0.0" 1615 | resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1616 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1617 | dependencies: 1618 | p-locate "^3.0.0" 1619 | path-exists "^3.0.0" 1620 | 1621 | lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: 1622 | version "4.17.21" 1623 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1624 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1625 | 1626 | log-symbols@2.2.0: 1627 | version "2.2.0" 1628 | resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" 1629 | integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== 1630 | dependencies: 1631 | chalk "^2.0.1" 1632 | 1633 | loose-envify@^1.0.0: 1634 | version "1.4.0" 1635 | resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1636 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1637 | dependencies: 1638 | js-tokens "^3.0.0 || ^4.0.0" 1639 | 1640 | make-dir@^2.0.0, make-dir@^2.1.0: 1641 | version "2.1.0" 1642 | resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" 1643 | integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== 1644 | dependencies: 1645 | pify "^4.0.1" 1646 | semver "^5.6.0" 1647 | 1648 | mimic-fn@^1.0.0: 1649 | version "1.2.0" 1650 | resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 1651 | integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== 1652 | 1653 | minimatch@3.0.4, minimatch@^3.0.4: 1654 | version "3.0.4" 1655 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1656 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1657 | dependencies: 1658 | brace-expansion "^1.1.7" 1659 | 1660 | minimist@^1.2.5: 1661 | version "1.2.5" 1662 | resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1663 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1664 | 1665 | mkdirp@0.5.4: 1666 | version "0.5.4" 1667 | resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" 1668 | integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== 1669 | dependencies: 1670 | minimist "^1.2.5" 1671 | 1672 | mkdirp@^0.5.1: 1673 | version "0.5.5" 1674 | resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1675 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1676 | dependencies: 1677 | minimist "^1.2.5" 1678 | 1679 | mocha@^6: 1680 | version "6.2.3" 1681 | resolved "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz#e648432181d8b99393410212664450a4c1e31912" 1682 | integrity sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg== 1683 | dependencies: 1684 | ansi-colors "3.2.3" 1685 | browser-stdout "1.3.1" 1686 | debug "3.2.6" 1687 | diff "3.5.0" 1688 | escape-string-regexp "1.0.5" 1689 | find-up "3.0.0" 1690 | glob "7.1.3" 1691 | growl "1.10.5" 1692 | he "1.2.0" 1693 | js-yaml "3.13.1" 1694 | log-symbols "2.2.0" 1695 | minimatch "3.0.4" 1696 | mkdirp "0.5.4" 1697 | ms "2.1.1" 1698 | node-environment-flags "1.0.5" 1699 | object.assign "4.1.0" 1700 | strip-json-comments "2.0.1" 1701 | supports-color "6.0.0" 1702 | which "1.3.1" 1703 | wide-align "1.1.3" 1704 | yargs "13.3.2" 1705 | yargs-parser "13.1.2" 1706 | yargs-unparser "1.6.0" 1707 | 1708 | ms@2.1.1: 1709 | version "2.1.1" 1710 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1711 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1712 | 1713 | ms@^2.1.1: 1714 | version "2.1.2" 1715 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1716 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1717 | 1718 | mute-stream@0.0.7: 1719 | version "0.0.7" 1720 | resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 1721 | integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= 1722 | 1723 | natural-compare@^1.4.0: 1724 | version "1.4.0" 1725 | resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1726 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1727 | 1728 | nice-try@^1.0.4: 1729 | version "1.0.5" 1730 | resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1731 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1732 | 1733 | node-environment-flags@1.0.5: 1734 | version "1.0.5" 1735 | resolved "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" 1736 | integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== 1737 | dependencies: 1738 | object.getownpropertydescriptors "^2.0.3" 1739 | semver "^5.7.0" 1740 | 1741 | node-modules-regexp@^1.0.0: 1742 | version "1.0.0" 1743 | resolved "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" 1744 | integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= 1745 | 1746 | node-releases@^1.1.71: 1747 | version "1.1.72" 1748 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" 1749 | integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== 1750 | 1751 | object-inspect@^1.7.0: 1752 | version "1.7.0" 1753 | resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 1754 | integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== 1755 | 1756 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 1757 | version "1.1.1" 1758 | resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1759 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1760 | 1761 | object.assign@4.1.0, object.assign@^4.1.0: 1762 | version "4.1.0" 1763 | resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1764 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1765 | dependencies: 1766 | define-properties "^1.1.2" 1767 | function-bind "^1.1.1" 1768 | has-symbols "^1.0.0" 1769 | object-keys "^1.0.11" 1770 | 1771 | object.getownpropertydescriptors@^2.0.3: 1772 | version "2.1.0" 1773 | resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" 1774 | integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== 1775 | dependencies: 1776 | define-properties "^1.1.3" 1777 | es-abstract "^1.17.0-next.1" 1778 | 1779 | once@^1.3.0: 1780 | version "1.4.0" 1781 | resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1782 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1783 | dependencies: 1784 | wrappy "1" 1785 | 1786 | onetime@^2.0.0: 1787 | version "2.0.1" 1788 | resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1789 | integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= 1790 | dependencies: 1791 | mimic-fn "^1.0.0" 1792 | 1793 | optionator@^0.8.2: 1794 | version "0.8.3" 1795 | resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 1796 | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 1797 | dependencies: 1798 | deep-is "~0.1.3" 1799 | fast-levenshtein "~2.0.6" 1800 | levn "~0.3.0" 1801 | prelude-ls "~1.1.2" 1802 | type-check "~0.3.2" 1803 | word-wrap "~1.2.3" 1804 | 1805 | os-tmpdir@~1.0.2: 1806 | version "1.0.2" 1807 | resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1808 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1809 | 1810 | p-limit@^2.0.0: 1811 | version "2.3.0" 1812 | resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1813 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1814 | dependencies: 1815 | p-try "^2.0.0" 1816 | 1817 | p-locate@^3.0.0: 1818 | version "3.0.0" 1819 | resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1820 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1821 | dependencies: 1822 | p-limit "^2.0.0" 1823 | 1824 | p-try@^2.0.0: 1825 | version "2.2.0" 1826 | resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1827 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1828 | 1829 | parent-module@^1.0.0: 1830 | version "1.0.1" 1831 | resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1832 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1833 | dependencies: 1834 | callsites "^3.0.0" 1835 | 1836 | path-exists@^3.0.0: 1837 | version "3.0.0" 1838 | resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1839 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1840 | 1841 | path-is-absolute@^1.0.0: 1842 | version "1.0.1" 1843 | resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1844 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1845 | 1846 | path-is-inside@^1.0.2: 1847 | version "1.0.2" 1848 | resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1849 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 1850 | 1851 | path-key@^2.0.1: 1852 | version "2.0.1" 1853 | resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1854 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1855 | 1856 | path-parse@^1.0.6: 1857 | version "1.0.7" 1858 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1859 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1860 | 1861 | pify@^4.0.1: 1862 | version "4.0.1" 1863 | resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" 1864 | integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== 1865 | 1866 | pirates@^4.0.0: 1867 | version "4.0.1" 1868 | resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" 1869 | integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== 1870 | dependencies: 1871 | node-modules-regexp "^1.0.0" 1872 | 1873 | pkg-dir@^3.0.0: 1874 | version "3.0.0" 1875 | resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" 1876 | integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== 1877 | dependencies: 1878 | find-up "^3.0.0" 1879 | 1880 | prelude-ls@~1.1.2: 1881 | version "1.1.2" 1882 | resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1883 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 1884 | 1885 | prettier-linter-helpers@^1.0.0: 1886 | version "1.0.0" 1887 | resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" 1888 | integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== 1889 | dependencies: 1890 | fast-diff "^1.1.2" 1891 | 1892 | prettier@^1.19.1: 1893 | version "1.19.1" 1894 | resolved "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" 1895 | integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== 1896 | 1897 | private@^0.1.8: 1898 | version "0.1.8" 1899 | resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 1900 | integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== 1901 | 1902 | progress@^2.0.0: 1903 | version "2.0.3" 1904 | resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1905 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1906 | 1907 | punycode@^2.1.0: 1908 | version "2.1.1" 1909 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1910 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1911 | 1912 | regenerate-unicode-properties@^8.2.0: 1913 | version "8.2.0" 1914 | resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" 1915 | integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== 1916 | dependencies: 1917 | regenerate "^1.4.0" 1918 | 1919 | regenerate@^1.4.0: 1920 | version "1.4.1" 1921 | resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" 1922 | integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== 1923 | 1924 | regenerator-runtime@^0.13.4: 1925 | version "0.13.5" 1926 | resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" 1927 | integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== 1928 | 1929 | regenerator-transform@^0.14.2: 1930 | version "0.14.4" 1931 | resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" 1932 | integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== 1933 | dependencies: 1934 | "@babel/runtime" "^7.8.4" 1935 | private "^0.1.8" 1936 | 1937 | regexpp@^2.0.1: 1938 | version "2.0.1" 1939 | resolved "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 1940 | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 1941 | 1942 | regexpu-core@^4.7.0: 1943 | version "4.7.0" 1944 | resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" 1945 | integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== 1946 | dependencies: 1947 | regenerate "^1.4.0" 1948 | regenerate-unicode-properties "^8.2.0" 1949 | regjsgen "^0.5.1" 1950 | regjsparser "^0.6.4" 1951 | unicode-match-property-ecmascript "^1.0.4" 1952 | unicode-match-property-value-ecmascript "^1.2.0" 1953 | 1954 | regjsgen@^0.5.1: 1955 | version "0.5.2" 1956 | resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" 1957 | integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== 1958 | 1959 | regjsparser@^0.6.4: 1960 | version "0.6.4" 1961 | resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" 1962 | integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== 1963 | dependencies: 1964 | jsesc "~0.5.0" 1965 | 1966 | require-directory@^2.1.1: 1967 | version "2.1.1" 1968 | resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1969 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1970 | 1971 | require-main-filename@^2.0.0: 1972 | version "2.0.0" 1973 | resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1974 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1975 | 1976 | resolve-from@^4.0.0: 1977 | version "4.0.0" 1978 | resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1979 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1980 | 1981 | resolve@^1.12.0, resolve@^1.3.2: 1982 | version "1.17.0" 1983 | resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 1984 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 1985 | dependencies: 1986 | path-parse "^1.0.6" 1987 | 1988 | restore-cursor@^2.0.0: 1989 | version "2.0.0" 1990 | resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1991 | integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= 1992 | dependencies: 1993 | onetime "^2.0.0" 1994 | signal-exit "^3.0.2" 1995 | 1996 | rimraf@2.6.3: 1997 | version "2.6.3" 1998 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1999 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 2000 | dependencies: 2001 | glob "^7.1.3" 2002 | 2003 | rollup-plugin-babel@^4.4.0: 2004 | version "4.4.0" 2005 | resolved "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" 2006 | integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw== 2007 | dependencies: 2008 | "@babel/helper-module-imports" "^7.0.0" 2009 | rollup-pluginutils "^2.8.1" 2010 | 2011 | rollup-pluginutils@^2.8.1: 2012 | version "2.8.2" 2013 | resolved "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" 2014 | integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== 2015 | dependencies: 2016 | estree-walker "^0.6.1" 2017 | 2018 | rollup@^1: 2019 | version "1.32.1" 2020 | resolved "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" 2021 | integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== 2022 | dependencies: 2023 | "@types/estree" "*" 2024 | "@types/node" "*" 2025 | acorn "^7.1.0" 2026 | 2027 | run-async@^2.2.0: 2028 | version "2.4.1" 2029 | resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" 2030 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== 2031 | 2032 | rxjs@^6.4.0: 2033 | version "6.5.5" 2034 | resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" 2035 | integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== 2036 | dependencies: 2037 | tslib "^1.9.0" 2038 | 2039 | safe-buffer@~5.1.1: 2040 | version "5.1.2" 2041 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 2042 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 2043 | 2044 | "safer-buffer@>= 2.1.2 < 3": 2045 | version "2.1.2" 2046 | resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2047 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2048 | 2049 | semver@7.0.0: 2050 | version "7.0.0" 2051 | resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" 2052 | integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== 2053 | 2054 | semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: 2055 | version "5.7.1" 2056 | resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 2057 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 2058 | 2059 | set-blocking@^2.0.0: 2060 | version "2.0.0" 2061 | resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2062 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 2063 | 2064 | shebang-command@^1.2.0: 2065 | version "1.2.0" 2066 | resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2067 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 2068 | dependencies: 2069 | shebang-regex "^1.0.0" 2070 | 2071 | shebang-regex@^1.0.0: 2072 | version "1.0.0" 2073 | resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2074 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 2075 | 2076 | signal-exit@^3.0.2: 2077 | version "3.0.3" 2078 | resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 2079 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 2080 | 2081 | slice-ansi@^2.1.0: 2082 | version "2.1.0" 2083 | resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" 2084 | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 2085 | dependencies: 2086 | ansi-styles "^3.2.0" 2087 | astral-regex "^1.0.0" 2088 | is-fullwidth-code-point "^2.0.0" 2089 | 2090 | source-map-support@^0.5.16: 2091 | version "0.5.19" 2092 | resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 2093 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 2094 | dependencies: 2095 | buffer-from "^1.0.0" 2096 | source-map "^0.6.0" 2097 | 2098 | source-map@^0.5.0: 2099 | version "0.5.7" 2100 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2101 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 2102 | 2103 | source-map@^0.6.0: 2104 | version "0.6.1" 2105 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2106 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 2107 | 2108 | sprintf-js@~1.0.2: 2109 | version "1.0.3" 2110 | resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2111 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 2112 | 2113 | "string-width@^1.0.2 || 2", string-width@^2.1.0: 2114 | version "2.1.1" 2115 | resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2116 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 2117 | dependencies: 2118 | is-fullwidth-code-point "^2.0.0" 2119 | strip-ansi "^4.0.0" 2120 | 2121 | string-width@^3.0.0, string-width@^3.1.0: 2122 | version "3.1.0" 2123 | resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 2124 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 2125 | dependencies: 2126 | emoji-regex "^7.0.1" 2127 | is-fullwidth-code-point "^2.0.0" 2128 | strip-ansi "^5.1.0" 2129 | 2130 | string.prototype.trimend@^1.0.0: 2131 | version "1.0.1" 2132 | resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 2133 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== 2134 | dependencies: 2135 | define-properties "^1.1.3" 2136 | es-abstract "^1.17.5" 2137 | 2138 | string.prototype.trimleft@^2.1.1: 2139 | version "2.1.2" 2140 | resolved "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" 2141 | integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== 2142 | dependencies: 2143 | define-properties "^1.1.3" 2144 | es-abstract "^1.17.5" 2145 | string.prototype.trimstart "^1.0.0" 2146 | 2147 | string.prototype.trimright@^2.1.1: 2148 | version "2.1.2" 2149 | resolved "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" 2150 | integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== 2151 | dependencies: 2152 | define-properties "^1.1.3" 2153 | es-abstract "^1.17.5" 2154 | string.prototype.trimend "^1.0.0" 2155 | 2156 | string.prototype.trimstart@^1.0.0: 2157 | version "1.0.1" 2158 | resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 2159 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== 2160 | dependencies: 2161 | define-properties "^1.1.3" 2162 | es-abstract "^1.17.5" 2163 | 2164 | strip-ansi@^4.0.0: 2165 | version "4.0.0" 2166 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2167 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 2168 | dependencies: 2169 | ansi-regex "^3.0.0" 2170 | 2171 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 2172 | version "5.2.0" 2173 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 2174 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 2175 | dependencies: 2176 | ansi-regex "^4.1.0" 2177 | 2178 | strip-json-comments@2.0.1, strip-json-comments@^2.0.1: 2179 | version "2.0.1" 2180 | resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2181 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2182 | 2183 | supports-color@6.0.0: 2184 | version "6.0.0" 2185 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" 2186 | integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== 2187 | dependencies: 2188 | has-flag "^3.0.0" 2189 | 2190 | supports-color@^5.3.0: 2191 | version "5.5.0" 2192 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2193 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2194 | dependencies: 2195 | has-flag "^3.0.0" 2196 | 2197 | table@^5.2.3: 2198 | version "5.4.6" 2199 | resolved "https://registry.npmjs.org/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" 2200 | integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== 2201 | dependencies: 2202 | ajv "^6.10.2" 2203 | lodash "^4.17.14" 2204 | slice-ansi "^2.1.0" 2205 | string-width "^3.0.0" 2206 | 2207 | text-table@^0.2.0: 2208 | version "0.2.0" 2209 | resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2210 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 2211 | 2212 | through@^2.3.6: 2213 | version "2.3.8" 2214 | resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2215 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 2216 | 2217 | tmp@^0.0.33: 2218 | version "0.0.33" 2219 | resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 2220 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 2221 | dependencies: 2222 | os-tmpdir "~1.0.2" 2223 | 2224 | to-fast-properties@^2.0.0: 2225 | version "2.0.0" 2226 | resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 2227 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 2228 | 2229 | tslib@^1.9.0: 2230 | version "1.13.0" 2231 | resolved "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" 2232 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 2233 | 2234 | type-check@~0.3.2: 2235 | version "0.3.2" 2236 | resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2237 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 2238 | dependencies: 2239 | prelude-ls "~1.1.2" 2240 | 2241 | uglify-js@^3.9.4: 2242 | version "3.9.4" 2243 | resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.4.tgz#867402377e043c1fc7b102253a22b64e5862401b" 2244 | integrity sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA== 2245 | dependencies: 2246 | commander "~2.20.3" 2247 | 2248 | unicode-canonical-property-names-ecmascript@^1.0.4: 2249 | version "1.0.4" 2250 | resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" 2251 | integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== 2252 | 2253 | unicode-match-property-ecmascript@^1.0.4: 2254 | version "1.0.4" 2255 | resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" 2256 | integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== 2257 | dependencies: 2258 | unicode-canonical-property-names-ecmascript "^1.0.4" 2259 | unicode-property-aliases-ecmascript "^1.0.4" 2260 | 2261 | unicode-match-property-value-ecmascript@^1.2.0: 2262 | version "1.2.0" 2263 | resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" 2264 | integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== 2265 | 2266 | unicode-property-aliases-ecmascript@^1.0.4: 2267 | version "1.1.0" 2268 | resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" 2269 | integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== 2270 | 2271 | uri-js@^4.2.2: 2272 | version "4.4.1" 2273 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2274 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2275 | dependencies: 2276 | punycode "^2.1.0" 2277 | 2278 | which-module@^2.0.0: 2279 | version "2.0.0" 2280 | resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 2281 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 2282 | 2283 | which@1.3.1, which@^1.2.9: 2284 | version "1.3.1" 2285 | resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2286 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2287 | dependencies: 2288 | isexe "^2.0.0" 2289 | 2290 | wide-align@1.1.3: 2291 | version "1.1.3" 2292 | resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 2293 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 2294 | dependencies: 2295 | string-width "^1.0.2 || 2" 2296 | 2297 | word-wrap@~1.2.3: 2298 | version "1.2.3" 2299 | resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 2300 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 2301 | 2302 | wrap-ansi@^5.1.0: 2303 | version "5.1.0" 2304 | resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 2305 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 2306 | dependencies: 2307 | ansi-styles "^3.2.0" 2308 | string-width "^3.0.0" 2309 | strip-ansi "^5.0.0" 2310 | 2311 | wrappy@1: 2312 | version "1.0.2" 2313 | resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2314 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2315 | 2316 | write@1.0.3: 2317 | version "1.0.3" 2318 | resolved "https://registry.npmjs.org/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" 2319 | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 2320 | dependencies: 2321 | mkdirp "^0.5.1" 2322 | 2323 | y18n@^4.0.0: 2324 | version "4.0.1" 2325 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" 2326 | integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== 2327 | 2328 | yargs-parser@13.1.2, yargs-parser@^13.1.2: 2329 | version "13.1.2" 2330 | resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 2331 | integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== 2332 | dependencies: 2333 | camelcase "^5.0.0" 2334 | decamelize "^1.2.0" 2335 | 2336 | yargs-unparser@1.6.0: 2337 | version "1.6.0" 2338 | resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" 2339 | integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== 2340 | dependencies: 2341 | flat "^4.1.0" 2342 | lodash "^4.17.15" 2343 | yargs "^13.3.0" 2344 | 2345 | yargs@13.3.2, yargs@^13.3.0: 2346 | version "13.3.2" 2347 | resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 2348 | integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== 2349 | dependencies: 2350 | cliui "^5.0.0" 2351 | find-up "^3.0.0" 2352 | get-caller-file "^2.0.1" 2353 | require-directory "^2.1.1" 2354 | require-main-filename "^2.0.0" 2355 | set-blocking "^2.0.0" 2356 | string-width "^3.0.0" 2357 | which-module "^2.0.0" 2358 | y18n "^4.0.0" 2359 | yargs-parser "^13.1.2" 2360 | --------------------------------------------------------------------------------