From 3f527c1185c866a03a33d3ac10d0ef4c32d1f050 Mon Sep 17 00:00:00 2001 From: Talysson de Oliveira Cassiano Date: Tue, 31 Mar 2020 17:09:11 -0300 Subject: [PATCH] Structure 2 (#130) * Bump major to alpha * Move Node version to 10 * Replace Object.assign with spread * Replace every var with let or const * Migrate tests that run on Node to use Jest * Update Node version on Travis * Base on Node 8 instead of 10 * Change linter to accept jest tests * Update joi without considering cases where lazy schema is needed * Handle dynamic types validations with link + shared API * Begin to refactor to a new internal structure * Rename descriptors concept to definitions * Implement initialization * Implement coercion for non-array types * Adjust tests to coercion without considering nested * Implement coercion for array types * Allow to subclass structures and inherit attributes * Implement strict mode (missing validation) * Implement validation to new core (#102) * Implement validation * Implement serialization (#101) * Implement validation for nested types * Implement clone to the new core (#103) * Implement clone to the new core * Make linter happy * Increase coverage * Refactors Descriptors to be a function instead of a class * Improve function naming for better debugging * Ensure that when reusing an attribute, it uses the new schema * Reformat according to prettier * Upgrade browser build (#105) * Webpack setup and begin to setup tests * Add electron to dev dependencies * Improve Webpack output during tests * Add browser tests to Travis * Remove unecessary dependencies * Update readme about browser and support * Separate travis lifecycles * Attempt to avoid hanging electron test * Update coveralls * Move to lerna (#106) * Move current code to packages * Share prettier config * Add coveralls to root package * Fix Coveralls script * Add coverage to root package * Create jest structure (#107) * Begin to implement assertions * Migrate boolean validation assertions to use jest-structure * Assert no expected for valid/invalid matchers * Assert attribute path is passed * Add package to automatically add assertions to jest * Begin to write tests * Add tests for validating error messages * Reorganize and begin to write toHaveInvalidAttributes * Implement toHaveInvalidAttributes and cover with tests * Rename auto.js to extend-expect.js * Refactor checking of path presence and usage hint * Refactor and remove hint from validity check of toHaveInvalidAttributes * Remove hint from validity check of toHaveInvalidAttribute * Refactor checking of attribute validity * Refactor usage error and remove hint for non-usage-related errors * Replace usage of assertValid with expect().toBeValid() * Replace validitationMatchers with jest-structure in array specs * Migrate whole structure spec to use jest-structure * Rename validity assertions to contain 'structure' in the name * Fix coverage script * Add tests for when using arrayContaining with jest-structure * Add readme * Allow defaulting when null and not nullable (#108) * Fallback to default when value is null and not nullable * Update changelog * Update docs about nullable attributes * Refactor name of dynamic default instance variable * Update changelog (#109) * Allow to pass custom identifier for dynamic types (#111) * Allow to pass custom identifier for dynamic types * Improve documentation wording * Improve changelog wording * Apply suggestions from code review Co-Authored-By: Leonardo Negreiros de Oliveira * Update docs/schema-concept/circular-references-and-dynamic-types.md Co-Authored-By: Leonardo Negreiros de Oliveira * Allow to declare custom setter and getter (#112) * Allow to use custom setters and getters to attributes * Add docs about custom getters and setters * Allow to inherit custom accessors * reduce function complexity * Add docs about custom accessors and inheritance * update joi (#114) * Add alpha patch (#115) * Make versioning consistent (#116) * Update dependencies node and generate build (#117) * Update dependencies and Node * Generate build * Remove Node 8 from Travis build * Make linter happy * Add missing symlinks (#118) * Invert symlinks (#119) * Invert symlinks * Bump alpha patch * Gix Gitbook refs (#120) * Gix Gitbook refs * New organization * Remove introduction duplicate link * Prepare to release new alpha * Gitbook testing docs (#124) * Add testing to docs and prettify md files * Fix formatting * Publish only src folder for jest-structure (#125) * Update Joi links (#126) * Allow to disable coercion (#127) * Update paths and messages of errors in docs (#128) * Improve docs (#129) * Improve docs * Improve verbiage * Update build * Bump version to 2.0.0 * Point links to master docs * Update changelog and add migration guide * Point CodeClimate to use eslint 6 * Use normal quotes where needed Co-authored-by: Leonardo Negreiros de Oliveira --- .babelrc | 3 - .codeclimate.yml | 10 +- .eslintrc | 18 +- .gitbook.yaml | 2 +- .nvmrc | 1 + .prettierignore | 4 +- .prettierrc => .prettierrc.json | 0 .travis.yml | 29 +- CHANGELOG.md | 111 +- README.md | 75 +- benchmark/benchmark.js | 2 +- benchmark/coercion.bm.js | 4 +- benchmark/instantiation.bm.js | 6 +- benchmark/updating.bm.js | 2 +- benchmark/validation.bm.js | 2 +- contributing.md | 6 +- dist/structure.js | 1369 -- docs/SUMMARY.md | 11 +- docs/battlecry-generators.md | 11 + docs/cloning.md | 2 +- docs/coercion/README.md | 16 +- docs/coercion/arrays-and-array-subclasses.md | 39 +- docs/coercion/disabling-coercion.md | 85 + docs/coercion/generic-coercion.md | 11 +- docs/coercion/observations.md | 23 - docs/coercion/primitive-type-coercion.md | 10 +- docs/coercion/recursive-coercion.md | 16 +- docs/custom-setters-and-getters.md | 86 + docs/migrating-from-v1.md | 105 + docs/schema-concept/README.md | 7 +- .../circular-references-and-dynamic-types.md | 142 +- docs/schema-concept/nullable-attributes.md | 124 +- ...hand-and-complete-attribute-definition.md} | 73 +- docs/serialization.md | 2 +- docs/strict-mode.md | 43 +- docs/support.md | 11 + docs/testing.md | 142 + docs/validation/README.md | 26 +- docs/validation/attribute-reference.md | 11 +- docs/validation/nested-validations.md | 22 +- docs/validation/string-validations.md | 32 +- docs/validation/validate-raw-data.md | 18 +- lerna.json | 6 + package.json | 83 +- packages/jest-structure/.eslintrc.js | 3 + packages/jest-structure/.gitignore | 1 + packages/jest-structure/.prettierrc.js | 1 + packages/jest-structure/README.md | 162 + packages/jest-structure/extend-expect.js | 1 + packages/jest-structure/index.js | 6 + packages/jest-structure/license.md | 21 + packages/jest-structure/package.json | 24 + .../src/assertions/toBeInvalidStructure.js | 7 + .../src/assertions/toBeValidStructure.js | 7 + .../src/assertions/toHaveInvalidAttribute.js | 68 + .../src/assertions/toHaveInvalidAttributes.js | 61 + .../jest-structure/src/lib/attributePath.js | 20 + packages/jest-structure/src/lib/errors.js | 16 + packages/jest-structure/src/lib/sorting.js | 41 + .../src/lib/validityAssertion.js | 16 + .../__snapshots__/jest-structure.test.js.snap | 358 + .../test/jest-structure.test.js | 616 + packages/structure/.eslintrc.js | 3 + packages/structure/.gitignore | 1 + packages/structure/.prettierignore | 1 + packages/structure/.prettierrc.js | 1 + packages/structure/README.md | 61 + packages/structure/dist/structure.js | 1 + packages/structure/license.md | 21 + packages/structure/package.json | 59 + packages/structure/src/attributes/index.js | 8 + packages/structure/src/attributesDecorator.js | 33 + .../structure/src}/cloning/index.js | 12 +- packages/structure/src/coercion/coercion.js | 34 + .../structure/src/coercion/coercions/array.js | 48 + .../src/coercion/coercions}/boolean.js | 0 .../structure/src/coercion/coercions}/date.js | 0 .../src/coercion/coercions/generic.js | 10 + .../src/coercion/coercions}/number.js | 0 .../src/coercion/coercions}/string.js | 0 packages/structure/src/coercion/index.js | 34 + packages/structure/src/descriptors/index.js | 176 + .../src}/errors/DefaultValidationError.js | 0 .../structure/src}/errors/index.js | 9 +- packages/structure/src/index.js | 1 + .../structure/src/initialization/index.js | 18 + .../AttributeDefinition.js | 158 + .../src/schema/AttributeDefinitions/index.js | 36 + packages/structure/src/schema/index.js | 109 + packages/structure/src/serialization/index.js | 42 + .../structure/src}/strictMode/index.js | 11 +- {src => packages/structure/src}/symbols.js | 3 +- .../structure/src/validation/forAttribute.js | 23 + .../structure/src/validation/forSchema.js | 48 + packages/structure/src/validation/index.js | 2 + .../src/validation/validations/array.js | 26 + .../src/validation/validations/boolean.js | 15 + .../src/validation/validations}/date.js | 10 +- .../src/validation/validations/nested.js | 64 + .../src/validation/validations}/number.js | 17 +- .../src/validation/validations}/string.js | 12 +- .../src/validation/validations/utils.js | 81 + .../test}/fixtures/BooksCollection.js | 0 .../test}/fixtures/BrokenCircularBook.js | 1 + .../structure/test}/fixtures/CircularBook.js | 0 .../fixtures/CircularBookCustomIdentifier.js | 21 + .../structure/test}/fixtures/CircularUser.js | 0 .../fixtures/CircularUserCustomIdentifier.js | 25 + packages/structure/test/jest.browser.js | 8 + packages/structure/test/jest.node.js | 3 + packages/structure/test/support/setup.js | 3 + .../instanceAndUpdate.spec.js.snap | 3 + .../test/unit/coercion/array.spec.js | 219 + .../test}/unit/coercion/arraySubclass.spec.js | 43 +- .../test}/unit/coercion/boolean.spec.js | 23 +- .../test/unit/coercion/coercion.spec.js | 112 + .../test}/unit/coercion/date.spec.js | 15 +- .../test}/unit/coercion/number.spec.js | 31 +- .../test}/unit/coercion/pojo.spec.js | 15 +- .../test}/unit/coercion/string.spec.js | 51 +- .../test}/unit/coercion/structure.spec.js | 93 +- .../test}/unit/coercion/typeCoercion.spec.js | 5 +- .../test/unit/creatingStructureClass.spec.js | 152 + .../unit/featureSwitches/coercion.spec.js | 171 + .../test/unit/instanceAndUpdate.spec.js | 721 + .../test}/unit/serialization/array.spec.js | 21 +- .../jsonStringifyCompatibility.spec.js | 5 +- .../serialization/nestedStructure.spec.js | 37 +- .../unit/serialization/structure.spec.js | 35 +- .../unit/subclassingStructureClass.spec.js | 118 +- .../test}/unit/validation/array.spec.js | 164 +- .../test}/unit/validation/boolean.spec.js | 52 +- .../test}/unit/validation/date.spec.js | 104 +- .../test}/unit/validation/nestedPojo.spec.js | 48 +- .../unit/validation/nestedStructure.spec.js | 425 + .../test}/unit/validation/number.spec.js | 219 +- .../unit/validation/staticMethod.spec.js | 121 +- .../test}/unit/validation/string.spec.js | 204 +- .../unit/validation/structureSubclass.spec.js | 34 +- packages/structure/test/webpack.pretest.js | 13 + packages/structure/webpack.config.js | 41 + src/attributes/decorator.js | 79 - src/attributes/descriptors.js | 51 - src/attributes/index.js | 1 - src/coercion/array.js | 53 - src/coercion/coercion.js | 33 - src/coercion/generic.js | 12 - src/coercion/index.js | 30 - src/index.js | 3 - src/initialization/index.js | 4 - src/initialization/initialization.js | 38 - src/initialization/initializationOrder.js | 30 - src/initialization/initialize.js | 5 - src/schema/index.js | 3 - src/schema/normalization.js | 30 - src/serialization/descriptor.js | 7 - src/serialization/index.js | 3 - src/serialization/serialize.js | 64 - src/typeDescriptor/index.js | 91 - src/typeResolver.js | 7 - src/validation/array.js | 25 - src/validation/boolean.js | 17 - src/validation/descriptors.js | 44 - src/validation/index.js | 65 - src/validation/nested.js | 50 - src/validation/utils.js | 86 - test/browserSetup.js | 6 - test/karma.conf.js | 43 - test/mocha.opts | 2 - test/support/validationMatchers.js | 17 - test/unit/coercion/array.spec.js | 172 - test/unit/coercion/coercion.spec.js | 140 - test/unit/creatingStructureClass.spec.js | 124 - test/unit/instanceAndUpdate.spec.js | 578 - test/unit/schema/normalization.spec.js | 89 - test/unit/validation/nestedStructure.spec.js | 338 - webpack.config.js | 25 - yarn.lock | 11532 ++++++++++++---- 178 files changed, 15349 insertions(+), 7322 deletions(-) delete mode 100644 .babelrc create mode 100644 .nvmrc rename .prettierrc => .prettierrc.json (100%) delete mode 100644 dist/structure.js create mode 100644 docs/battlecry-generators.md create mode 100644 docs/coercion/disabling-coercion.md delete mode 100644 docs/coercion/observations.md create mode 100644 docs/custom-setters-and-getters.md create mode 100644 docs/migrating-from-v1.md rename docs/schema-concept/{shorthand-and-complete-type-descriptor.md => shorthand-and-complete-attribute-definition.md} (62%) create mode 100644 docs/support.md create mode 100644 docs/testing.md create mode 100644 lerna.json create mode 100644 packages/jest-structure/.eslintrc.js create mode 100644 packages/jest-structure/.gitignore create mode 100644 packages/jest-structure/.prettierrc.js create mode 100644 packages/jest-structure/README.md create mode 100644 packages/jest-structure/extend-expect.js create mode 100644 packages/jest-structure/index.js create mode 100644 packages/jest-structure/license.md create mode 100644 packages/jest-structure/package.json create mode 100644 packages/jest-structure/src/assertions/toBeInvalidStructure.js create mode 100644 packages/jest-structure/src/assertions/toBeValidStructure.js create mode 100644 packages/jest-structure/src/assertions/toHaveInvalidAttribute.js create mode 100644 packages/jest-structure/src/assertions/toHaveInvalidAttributes.js create mode 100644 packages/jest-structure/src/lib/attributePath.js create mode 100644 packages/jest-structure/src/lib/errors.js create mode 100644 packages/jest-structure/src/lib/sorting.js create mode 100644 packages/jest-structure/src/lib/validityAssertion.js create mode 100644 packages/jest-structure/test/__snapshots__/jest-structure.test.js.snap create mode 100644 packages/jest-structure/test/jest-structure.test.js create mode 100644 packages/structure/.eslintrc.js create mode 100644 packages/structure/.gitignore create mode 100644 packages/structure/.prettierignore create mode 100644 packages/structure/.prettierrc.js create mode 100644 packages/structure/README.md create mode 100644 packages/structure/dist/structure.js create mode 100644 packages/structure/license.md create mode 100644 packages/structure/package.json create mode 100644 packages/structure/src/attributes/index.js create mode 100644 packages/structure/src/attributesDecorator.js rename {src => packages/structure/src}/cloning/index.js (53%) create mode 100644 packages/structure/src/coercion/coercion.js create mode 100644 packages/structure/src/coercion/coercions/array.js rename {src/coercion => packages/structure/src/coercion/coercions}/boolean.js (100%) rename {src/coercion => packages/structure/src/coercion/coercions}/date.js (100%) create mode 100644 packages/structure/src/coercion/coercions/generic.js rename {src/coercion => packages/structure/src/coercion/coercions}/number.js (100%) rename {src/coercion => packages/structure/src/coercion/coercions}/string.js (100%) create mode 100644 packages/structure/src/coercion/index.js create mode 100644 packages/structure/src/descriptors/index.js rename {src => packages/structure/src}/errors/DefaultValidationError.js (100%) rename {src => packages/structure/src}/errors/index.js (67%) create mode 100644 packages/structure/src/index.js create mode 100644 packages/structure/src/initialization/index.js create mode 100644 packages/structure/src/schema/AttributeDefinitions/AttributeDefinition.js create mode 100644 packages/structure/src/schema/AttributeDefinitions/index.js create mode 100644 packages/structure/src/schema/index.js create mode 100644 packages/structure/src/serialization/index.js rename {src => packages/structure/src}/strictMode/index.js (55%) rename {src => packages/structure/src}/symbols.js (55%) create mode 100644 packages/structure/src/validation/forAttribute.js create mode 100644 packages/structure/src/validation/forSchema.js create mode 100644 packages/structure/src/validation/index.js create mode 100644 packages/structure/src/validation/validations/array.js create mode 100644 packages/structure/src/validation/validations/boolean.js rename {src/validation => packages/structure/src/validation/validations}/date.js (56%) create mode 100644 packages/structure/src/validation/validations/nested.js rename {src/validation => packages/structure/src/validation/validations}/number.js (56%) rename {src/validation => packages/structure/src/validation/validations}/string.js (67%) create mode 100644 packages/structure/src/validation/validations/utils.js rename {test => packages/structure/test}/fixtures/BooksCollection.js (100%) rename {test => packages/structure/test}/fixtures/BrokenCircularBook.js (87%) rename {test => packages/structure/test}/fixtures/CircularBook.js (100%) create mode 100644 packages/structure/test/fixtures/CircularBookCustomIdentifier.js rename {test => packages/structure/test}/fixtures/CircularUser.js (100%) create mode 100644 packages/structure/test/fixtures/CircularUserCustomIdentifier.js create mode 100644 packages/structure/test/jest.browser.js create mode 100644 packages/structure/test/jest.node.js create mode 100644 packages/structure/test/support/setup.js create mode 100644 packages/structure/test/unit/__snapshots__/instanceAndUpdate.spec.js.snap create mode 100644 packages/structure/test/unit/coercion/array.spec.js rename {test => packages/structure/test}/unit/coercion/arraySubclass.spec.js (69%) rename {test => packages/structure/test}/unit/coercion/boolean.spec.js (76%) create mode 100644 packages/structure/test/unit/coercion/coercion.spec.js rename {test => packages/structure/test}/unit/coercion/date.spec.js (72%) rename {test => packages/structure/test}/unit/coercion/number.spec.js (73%) rename {test => packages/structure/test}/unit/coercion/pojo.spec.js (72%) rename {test => packages/structure/test}/unit/coercion/string.spec.js (69%) rename {test => packages/structure/test}/unit/coercion/structure.spec.js (54%) rename {test => packages/structure/test}/unit/coercion/typeCoercion.spec.js (76%) create mode 100644 packages/structure/test/unit/creatingStructureClass.spec.js create mode 100644 packages/structure/test/unit/featureSwitches/coercion.spec.js create mode 100644 packages/structure/test/unit/instanceAndUpdate.spec.js rename {test => packages/structure/test}/unit/serialization/array.spec.js (70%) rename test/unit/serialization/jsonStringifyCompatibility.js => packages/structure/test/unit/serialization/jsonStringifyCompatibility.spec.js (74%) rename {test => packages/structure/test}/unit/serialization/nestedStructure.spec.js (78%) rename {test => packages/structure/test}/unit/serialization/structure.spec.js (69%) rename {test => packages/structure/test}/unit/subclassingStructureClass.spec.js (62%) rename {test => packages/structure/test}/unit/validation/array.spec.js (64%) rename {test => packages/structure/test}/unit/validation/boolean.spec.js (73%) rename {test => packages/structure/test}/unit/validation/date.spec.js (69%) rename {test => packages/structure/test}/unit/validation/nestedPojo.spec.js (74%) create mode 100644 packages/structure/test/unit/validation/nestedStructure.spec.js rename {test => packages/structure/test}/unit/validation/number.spec.js (65%) rename {test => packages/structure/test}/unit/validation/staticMethod.spec.js (54%) rename {test => packages/structure/test}/unit/validation/string.spec.js (65%) rename {test => packages/structure/test}/unit/validation/structureSubclass.spec.js (70%) create mode 100644 packages/structure/test/webpack.pretest.js create mode 100644 packages/structure/webpack.config.js delete mode 100644 src/attributes/decorator.js delete mode 100644 src/attributes/descriptors.js delete mode 100644 src/attributes/index.js delete mode 100644 src/coercion/array.js delete mode 100644 src/coercion/coercion.js delete mode 100644 src/coercion/generic.js delete mode 100644 src/coercion/index.js delete mode 100644 src/index.js delete mode 100644 src/initialization/index.js delete mode 100644 src/initialization/initialization.js delete mode 100644 src/initialization/initializationOrder.js delete mode 100644 src/initialization/initialize.js delete mode 100644 src/schema/index.js delete mode 100644 src/schema/normalization.js delete mode 100644 src/serialization/descriptor.js delete mode 100644 src/serialization/index.js delete mode 100644 src/serialization/serialize.js delete mode 100644 src/typeDescriptor/index.js delete mode 100644 src/typeResolver.js delete mode 100644 src/validation/array.js delete mode 100644 src/validation/boolean.js delete mode 100644 src/validation/descriptors.js delete mode 100644 src/validation/index.js delete mode 100644 src/validation/nested.js delete mode 100644 src/validation/utils.js delete mode 100644 test/browserSetup.js delete mode 100644 test/karma.conf.js delete mode 100644 test/mocha.opts delete mode 100644 test/support/validationMatchers.js delete mode 100644 test/unit/coercion/array.spec.js delete mode 100644 test/unit/coercion/coercion.spec.js delete mode 100644 test/unit/creatingStructureClass.spec.js delete mode 100644 test/unit/instanceAndUpdate.spec.js delete mode 100644 test/unit/schema/normalization.spec.js delete mode 100644 test/unit/validation/nestedStructure.spec.js delete mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index c13c5f6..0000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["es2015"] -} diff --git a/.codeclimate.yml b/.codeclimate.yml index d1340de..dbafdc1 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -1,13 +1,13 @@ engines: eslint: enabled: true - channel: "eslint-3" + channel: 'eslint-6' ratings: paths: - - src/** + - packages/structure/src/** exclude_paths: -- benchmark/**/* -- dist/**/* -- test/**/* + - benchmark/**/* + - packages/structure/dist/**/* + - packages/structure/test/**/* diff --git a/.eslintrc b/.eslintrc index 05e6851..1798144 100644 --- a/.eslintrc +++ b/.eslintrc @@ -2,10 +2,13 @@ "env": { "node": true, "es6": true, - "mocha": true + "jest/globals": true + }, + "extends": ["eslint:recommended", "plugin:jest/recommended", "prettier"], + "plugins": ["jest"], + "parserOptions": { + "ecmaVersion": 2018 }, - "extends": ["eslint:recommended", "prettier"], - "plugins": ["mocha"], "rules": { "comma-spacing": ["error", { "before": false, "after": true }], "complexity": ["error", 4], @@ -16,8 +19,13 @@ "always", { "avoidQuotes": true, "avoidExplicitReturnArrows": true } ], - "mocha/no-exclusive-tests": "error", - "mocha/no-skipped-tests": "error", + "jest/no-disabled-tests": "warn", + "jest/no-focused-tests": "error", + "jest/no-identical-title": "error", + "jest/prefer-to-have-length": "warn", + "jest/valid-expect": "error", + "jest/no-test-callback": "off", + "jest/no-try-expect": "off", "quotes": ["error", "single", { "avoidEscape": true }], "semi": ["error", "always"] } diff --git a/.gitbook.yaml b/.gitbook.yaml index 18385c2..3f25a87 100644 --- a/.gitbook.yaml +++ b/.gitbook.yaml @@ -1,3 +1,3 @@ structure: - readme: README.md + readme: packages/structure/README.md summary: docs/SUMMARY.md diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..db24ab9 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +10.13.0 diff --git a/.prettierignore b/.prettierignore index 49fa49a..1521c8b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1 @@ -/dist -/README.md -/CHANGELOG.md +dist diff --git a/.prettierrc b/.prettierrc.json similarity index 100% rename from .prettierrc rename to .prettierrc.json diff --git a/.travis.yml b/.travis.yml index f58dad5..cd00e68 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,25 @@ language: node_js node_js: - - "node" - - "6.1" - - "6.0" - - "8.0" + - '10' + - '11' + - '12' + - 'node' + +addons: + apt: + packages: + - xvfb + +install: + - yarn + - export DISPLAY=':99.0' + - Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & + +before_script: + - yarn test:browser:build + script: - - npm run lint - - npm test - - npm run coveralls + - yarn lint + - yarn test + - yarn test:browser:run + - yarn coveralls diff --git a/CHANGELOG.md b/CHANGELOG.md index 5430142..e3c62f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,40 +1,129 @@ +## 2.0.0 - 2020-03-31 + +Refactors: + +- The whole part of schemas and attribute definitions was refactored +- Tests are now run by Jest (and Electron for browser tests) +- Prettier was added +- Move to mono-repo + +Enhancements + +- Implement jest-structure assertions +- It's possible to set custom getters e setters directly in the structure class +- Allows to disable coercion + +Breaking changes: + +- Joi is updated to v16 + - Attribute path in validation _errors_ is an array instead of a string + - Attribute path in validation _messages_ contains the whole path joined by '.' + - The name used for the dynamic import should aways be the same as the name of its type or else a custom identifier must be used +- Non-nullable attributes with value null will use default value the same way undefined does +- Structure classes now have two methods to generically set and get the value of the attributes, `.get(attributeName)` and `.set(attributeName, attributeValue)` +- Minimum Node version is now 10 + +Docs: + +- Rename the term `type descriptor` to `attribute definition` in the docs and in the code +- Reorganize and add more specific pages to docs + +## 2.0.0-alpha.4 - 2020-03-21 + +- Publish only src folder for jest-structure + +## 2.0.0-alpha.3 - 2020-03-20 + +- Reorganize md files + +## 2.0.0-alpha.2 - 2020-03-19 + +- Invert symlinks + +## 2.0.0-alpha.1 - 2020-03-19 + +- Add symlinks to md files to packages/structure + +## 2.0.0-alpha.0 - 2020-03-19 + +Refactors: + +- The whole part of schemas and attribute definitions was refactored +- Tests are now run by Jest (and Electron for browser tests) +- Prettier was added +- Move to mono-repo + +Enhancements + +- Implement jest-structure assertions +- It's possible to set custom getters e setters directly in the structure class + +Breaking changes: + +- Joi is updated to v16 + - Attribute path in validation _errors_ is an array instead of a string + - Attribute path in validation _messages_ contains the whole path joined by '.' + - The name used for the dynamic import should aways be the same as the name of its type or else a custom identifier must be used +- Non-nullable attributes with value null will use default value the same way undefined does +- Structure classes now have two methods to generically set and get the value of the attributes, `.get(attributeName)` and `.set(attributeName, attributeValue)` +- Minimum Node version is now 10 + ## 1.8.0 - 2019-09-16 + Enhancements: -* Add `unique` validation to arrays + +- Add `unique` validation to arrays ## 1.7.0 - 2019-09-14 + Enhancements: -* Add method to clone structures + +- Add method to clone structures ## 1.6.0 - 2019-08-27 + Enhancements: -* Allow custom error class to static mode + +- Allow custom error class to static mode ## 1.5.0 - 2019-07-08 + Enhancements: -* Add `buildStrict` static method + +- Add `buildStrict` static method ## 1.4.0 - 2019-03-26 + Enhancements: -* Add `nullable` option + +- Add `nullable` option ## 1.3.2 - 2019-03-22 + Fix: -* The actual instance is passed to the dynamic defaults + +- The actual instance is passed to the dynamic defaults ## 1.3.0 - 2018-03-23 + Enhancements: -* When using default function to initialize attributes you can now refer to another attribute values to compose value + +- When using default function to initialize attributes you can now refer to another attribute values to compose value ## 1.2.0 - 2017-02-01 + Features: -* Allow circular reference on type definitions ([@talyssonoc](https://github.com/talyssonoc/structure/pull/30)) + +- Allow circular reference on type definitions ([@talyssonoc](https://github.com/talyssonoc/structure/pull/30)) Enhancements: -* Make validation faster ([@talyssonoc](https://github.com/talyssonoc/structure/pull/28)) + +- Make validation faster ([@talyssonoc](https://github.com/talyssonoc/structure/pull/28)) Dependencies update: -* Update joi from 9.2.0 to 10.2.0 ([@talyssonoc](https://github.com/talyssonoc/structure/pull/26)) + +- Update joi from 9.2.0 to 10.2.0 ([@talyssonoc](https://github.com/talyssonoc/structure/pull/26)) ## 1.1.0 - 2017-01-17 -* Added static method `validate()` to structures ([@talyssonoc](https://github.com/talyssonoc/structure/pull/25)) + +- Added static method `validate()` to structures ([@talyssonoc](https://github.com/talyssonoc/structure/pull/25)) diff --git a/README.md b/README.md index 0ecb4d9..be0ab64 100644 --- a/README.md +++ b/README.md @@ -2,33 +2,16 @@ ## A simple schema/attributes library built on top of modern JavaScript -[![npm](https://img.shields.io/npm/v/structure.svg?style=flat)](https://www.npmjs.com/package/structure) [![Build Status](https://travis-ci.org/talyssonoc/structure.svg?branch=master)](https://travis-ci.org/talyssonoc/structure) [![Coverage Status](https://coveralls.io/repos/github/talyssonoc/structure/badge.svg?branch=master)](https://coveralls.io/github/talyssonoc/structure?branch=master) [![Code Climate](https://codeclimate.com/github/talyssonoc/structure/badges/gpa.svg)](https://codeclimate.com/github/talyssonoc/structure) [![JS.ORG](https://img.shields.io/badge/js.org-structure-ffb400.svg?style=flat)](https://js.org/) ---- -Structure provides a simple interface which allows you to add attributes to your ES6 classes based on a schema, with validations and type coercion. +Structure provides a simple interface which allows you to add attributes to your classes based on a schema, with validations and type coercion. -## Use cases +## Packages -You can use Structure for a lot of different cases, including: +- [Structure](packages/structure) +- [jest-structure](packages/jest-structure) -- Domain entities and value objects -- Model business rules -- Validation and coercion of request data -- Map pure objects and JSON to your application classes -- Add attributes to classes that you can't change the class hierarchy +## [Documentation](https://structure.js.org/) -Structure was inspired by Ruby's [Virtus](https://github.com/solnic/virtus). - -What Structure is __not__: - -- It's not a database abstraction -- It's not a MVC framework (but it can be used to domain entities) -- It's not an attempt to simulate classic inheritance in JavaScript - -## Getting started - -`npm install --save structure` - -## Usage +## Example Structure usage For each attribute on your schema, a getter and a setter will be created into the given class. It'll also auto-assign those attributes passed to the constructor. @@ -39,53 +22,25 @@ const User = attributes({ name: String, age: { type: Number, - default: 18 + default: 18, }, - birthday: Date -})(class User { - greet() { - return `Hello ${this.name}`; + birthday: Date, +})( + class User { + greet() { + return `Hello ${this.name}`; + } } -}); - -/* The attributes "wraps" the Class, still providing access to its methods: */ +); const user = new User({ - name: 'John Foo' + name: 'John Foo', }); user.name; // 'John Foo' user.greet(); // 'Hello John Foo' ``` -## Support and compatibility - -Structure is built on top of modern JavaScript, using new features like [Proxy](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy), [Reflect](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Reflect) and [Symbol](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Symbol). That being so, there are some things regarding compatibility you should consider when using Structure. - -### Node - -Node only implemented all the used features on version 6, so for using Structure for a backend application you'll need Node 6 or later. - -### Browser - -Not all major browsers implemented the used features so you'll need to transpile the code for using it. For browser usage we have the [UMD version](https://github.com/talyssonoc/structure/blob/master/dist/structure.js) bundled with Webpack. We don't bundle Structure with its dependencies so you'll have to provide it with your module bundler. It's recommended to replace joi with [joi-browser](https://www.npmjs.com/package/joi-browser) when using it on the front-end, here's how we run our test suite on the browser regarding [bundling](https://github.com/talyssonoc/structure/blob/master/test/karma.conf.js#L3-L11) and [polyfill of features](https://github.com/talyssonoc/structure/blob/master/test/browserSetup.js#L1-L2). - -Be aware that not the whole test suite will pass on browsers, there are some cases that can't be simulated through polyfilling, like extending Array or having a non-structure class extending a structure class. You can setup the project on your computer and run npm run test:browser to see how it'll work. - -Right now 95.5% of the tests will pass on Chrome 55, and 95% will pass on Firefox 45. We intend to make it support older versions using polyfills in the next releases. - -## BattleCry generators - -There are configurable [BattleCry](https://github.com/pedsmoreira/battlecry) generators ready to be downloaded and help scaffolding schema: - -```sh -npm install -g battlecry -cry download generator talyssonoc/structure -cry g schema user name age:int:required cars:string[] favoriteBook:book friends:user[]:default :updateAge -``` - -Run `cry --help` to check more info about the generators available; - ## [Contributing](contributing.md) ## [LICENSE](license.md) diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js index 29bcc0c..e5ad779 100644 --- a/benchmark/benchmark.js +++ b/benchmark/benchmark.js @@ -2,7 +2,7 @@ const Benchmark = require('benchmark'); const suites = require('./suites'); suites.forEach((suiteData) => { - var suite = new Benchmark.Suite(suiteData.name); + let suite = new Benchmark.Suite(suiteData.name); suite = suiteData.cases.reduce((s, c) => { return s.add(c.name, c.fn); diff --git a/benchmark/coercion.bm.js b/benchmark/coercion.bm.js index 8e708be..0a8183d 100644 --- a/benchmark/coercion.bm.js +++ b/benchmark/coercion.bm.js @@ -1,4 +1,4 @@ -const { attributes } = require('../src'); +const { attributes } = require('../packages/structure/src'); const Book = attributes({ year: Number @@ -26,7 +26,7 @@ const User = attributes({ } })(class User { }); -const CircularUser = require('../test/fixtures/CircularUser'); +const CircularUser = require('../packages/structure/test/fixtures/CircularUser'); exports.name = 'Coercion'; diff --git a/benchmark/instantiation.bm.js b/benchmark/instantiation.bm.js index 6183386..5e85422 100644 --- a/benchmark/instantiation.bm.js +++ b/benchmark/instantiation.bm.js @@ -1,4 +1,4 @@ -const { attributes } = require('../src'); +const { attributes } = require('../packages/structure/src'); const User = attributes({ name: String, @@ -17,8 +17,8 @@ const Product = attributes({ } })(class Product { }); -const CircularUser = require('../test/fixtures/CircularUser'); -const CircularBook = require('../test/fixtures/CircularBook'); +const CircularUser = require('../packages/structure/test/fixtures/CircularUser'); +const CircularBook = require('../packages/structure/test/fixtures/CircularBook'); exports.name = 'Instantiation'; diff --git a/benchmark/updating.bm.js b/benchmark/updating.bm.js index 5c84313..2c7a9bf 100644 --- a/benchmark/updating.bm.js +++ b/benchmark/updating.bm.js @@ -1,4 +1,4 @@ -const { attributes } = require('../src'); +const { attributes } = require('../packages/structure/src'); const Book = attributes({ name: String diff --git a/benchmark/validation.bm.js b/benchmark/validation.bm.js index f5b4845..c29d057 100644 --- a/benchmark/validation.bm.js +++ b/benchmark/validation.bm.js @@ -1,4 +1,4 @@ -const { attributes } = require('../src'); +const { attributes } = require('../packages/structure/src'); const Order = attributes({ createdAt: Date, diff --git a/contributing.md b/contributing.md index 51f092a..d415506 100644 --- a/contributing.md +++ b/contributing.md @@ -4,11 +4,11 @@ Contributions are always welcome! When contributing to Structure we ask you to f ## Code of conduct -In short: _Be nice_. Pay attention to the fact that Structure is free software, don't be rude with the contributors or with people with doubts and we'll be more than glad on helping you. Destructive criticism and demanding will be ignored. +In short: _Be nice_. Pay attention to the fact that Structure is free software, don't be rude with the contributors or with people with questions and we'll be more than glad to help you. Destructive criticism and demanding will be ignored. ## Opening issues -When opening an issue be descriptive about the bug or the feature suggestion, don't simply paste the error message on the issue title or description. Also, __provide code to simulate the bug__, we need to know the exact circumstances in which the bug occurs. Again, follow our [code of conduct](#code-of-conduct). +When opening an issue be descriptive about the bug or the feature suggestion, don't simply paste the error message on the issue title or description. Also, **provide code to simulate the bug**, we need to know the exact circumstances in which the bug occurs. Again, follow our [code of conduct](#code-of-conduct). ## Pull requests @@ -22,4 +22,4 @@ When opening a pull request to Structure, follow this steps: 6. Open the pull request; 7. Write a complete description about the bug or the feature the pull request is about. -Be aware that we keep __100% of code coverage__, any change that makes the code coverage less than 100% covered will be requested to write more tests. +Be aware that we keep **100% of code coverage**, any change that makes the code coverage less than 100% covered will be requested to write more tests. diff --git a/dist/structure.js b/dist/structure.js deleted file mode 100644 index f2d3b18..0000000 --- a/dist/structure.js +++ /dev/null @@ -1,1369 +0,0 @@ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(require("joi"), require("lodash")); - else if(typeof define === 'function' && define.amd) - define("Structure", ["joi", "lodash"], factory); - else if(typeof exports === 'object') - exports["Structure"] = factory(require("joi"), require("lodash")); - else - root["Structure"] = factory(root["joi"], root["_"]); -})(this, function(__WEBPACK_EXTERNAL_MODULE_7__, __WEBPACK_EXTERNAL_MODULE_9__) { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; - -/******/ // The require function -/******/ function __webpack_require__(moduleId) { - -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; - -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; - -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - -/******/ // Flag the module as loaded -/******/ module.loaded = true; - -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } - - -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; - -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; - -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; - -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - module.exports = __webpack_require__(1); - - -/***/ }, -/* 1 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports = { - attributes: __webpack_require__(2) - }; - -/***/ }, -/* 2 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports = __webpack_require__(3); - -/***/ }, -/* 3 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - - var Schema = __webpack_require__(4); - var Serialization = __webpack_require__(33); - var Validation = __webpack_require__(6); - var Initialization = __webpack_require__(18); - var StrictMode = __webpack_require__(36); - var Errors = __webpack_require__(23); - - var _require = __webpack_require__(15), - SCHEMA = _require.SCHEMA; - - var _require2 = __webpack_require__(38), - attributeDescriptorFor = _require2.attributeDescriptorFor, - attributesDescriptorFor = _require2.attributesDescriptorFor; - - var Cloning = __webpack_require__(39); - - var define = Object.defineProperty; - - function attributesDecorator(schema) { - var schemaOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - if ((typeof schemaOptions === 'undefined' ? 'undefined' : _typeof(schemaOptions)) !== 'object') { - throw Errors.classAsSecondParam(schemaOptions); - } - - return function decorator(Class) { - var WrapperClass = new Proxy(Class, { - construct: function construct(target, constructorArgs, newTarget) { - var instance = Reflect.construct(target, constructorArgs, newTarget); - var passedAttributes = Object.assign({}, constructorArgs[0]); - - Initialization.initialize(schema, passedAttributes, instance); - - return instance; - } - }); - - if (WrapperClass[SCHEMA]) { - schema = Object.assign({}, WrapperClass[SCHEMA], schema); - } - - schema = Schema.normalize(schema, schemaOptions); - - define(WrapperClass, SCHEMA, { - value: schema - }); - - define(WrapperClass, 'validate', Validation.staticDescriptorFor(schema)); - - define(WrapperClass.prototype, SCHEMA, { - value: schema - }); - - define(WrapperClass.prototype, 'attributes', attributesDescriptorFor(schema)); - - define(WrapperClass.prototype, 'validate', Validation.descriptorFor(schema)); - - define(WrapperClass.prototype, 'toJSON', Serialization.descriptor); - - define(WrapperClass, 'buildStrict', StrictMode.buildStrictDescriptorFor(WrapperClass, schemaOptions)); - - define(WrapperClass.prototype, 'clone', Cloning.buildCloneDescriptorFor(WrapperClass)); - - Object.keys(schema).forEach(function (attr) { - define(WrapperClass.prototype, attr, attributeDescriptorFor(attr, schema)); - }); - - return WrapperClass; - }; - } - - module.exports = attributesDecorator; - -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports = { - normalize: __webpack_require__(5) - }; - -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var Validation = __webpack_require__(6); - var Initialization = __webpack_require__(18); - var TypeDescriptor = __webpack_require__(22); - - var _require = __webpack_require__(15), - VALIDATE = _require.VALIDATE, - INITIALIZE = _require.INITIALIZE; - - module.exports = function normalizeSchema(rawSchema, schemaOptions) { - var schema = Object.create(null); - - Object.keys(rawSchema).forEach(function (attributeName) { - schema[attributeName] = TypeDescriptor.normalize(schemaOptions, rawSchema[attributeName], attributeName); - }); - - var schemaValidation = Validation.forSchema(schema); - - Object.defineProperty(schema, VALIDATE, { - value: schemaValidation - }); - - var initialization = Initialization.forSchema(schema); - - Object.defineProperty(schema, INITIALIZE, { - value: initialization - }); - - return schema; - }; - -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var joi = __webpack_require__(7); - - var validations = [__webpack_require__(8), __webpack_require__(11), __webpack_require__(12), __webpack_require__(13)]; - - var nestedValidation = __webpack_require__(14); - var arrayValidation = __webpack_require__(16); - - var _require = __webpack_require__(17), - validationDescriptorForSchema = _require.validationDescriptorForSchema, - staticValidationDescriptorForSchema = _require.staticValidationDescriptorForSchema; - - exports.descriptorFor = validationDescriptorForSchema; - exports.staticDescriptorFor = staticValidationDescriptorForSchema; - - exports.forAttribute = function validationForAttribute(typeDescriptor) { - if (typeDescriptor.itemType !== undefined) { - return arrayValidation(typeDescriptor, typeDescriptor.itemType); - } - - var validation = validations.find(function (v) { - return v.type === typeDescriptor.type; - }); - - if (!validation) { - return nestedValidation(typeDescriptor); - } - - return validation.createJoiSchema(typeDescriptor); - }; - - var mapDetail = function mapDetail(_ref) { - var message = _ref.message, - path = _ref.path; - return { message: message, path: path }; - }; - - var validatorOptions = { - abortEarly: false, - convert: false, - allowUnknown: false - }; - - exports.forSchema = function validationForSchema(schema) { - var schemaValidation = {}; - - Object.keys(schema).forEach(function (attributeName) { - schemaValidation[attributeName] = schema[attributeName].validation; - }); - - var joiValidation = joi.object().keys(schemaValidation); - - return { - validate: function validate(structure) { - var validationErrors; - - var _joiValidation$valida = joiValidation.validate(structure, validatorOptions), - error = _joiValidation$valida.error; - - if (error) { - validationErrors = error.details.map(mapDetail); - } - - return validationErrors; - } - }; - }; - -/***/ }, -/* 7 */ -/***/ function(module, exports) { - - module.exports = __WEBPACK_EXTERNAL_MODULE_7__; - -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var joi = __webpack_require__(7); - - var _require = __webpack_require__(9), - isPlainObject = _require.isPlainObject; - - var _require2 = __webpack_require__(10), - mapToJoi = _require2.mapToJoi, - equalOption = _require2.equalOption; - - module.exports = { - type: String, - joiMappings: [['minLength', 'min', true], ['maxLength', 'max', true], ['exactLength', 'length', true], ['regex', 'regex', true], ['alphanumeric', 'alphanum'], ['lowerCase', 'lowercase'], ['upperCase', 'uppercase'], ['email', 'email'], ['guid', 'guid', isPlainObject]], - createJoiSchema: function createJoiSchema(typeDescriptor) { - var joiSchema = joi.string(); - - if (typeDescriptor.empty) { - joiSchema = joiSchema.allow(''); - } - - joiSchema = equalOption(typeDescriptor, { initial: joiSchema }); - - return mapToJoi(typeDescriptor, { - initial: joiSchema, - mappings: this.joiMappings - }); - } - }; - -/***/ }, -/* 9 */ -/***/ function(module, exports) { - - module.exports = __WEBPACK_EXTERNAL_MODULE_9__; - -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var joi = __webpack_require__(7); - - var _require = __webpack_require__(9), - isPlainObject = _require.isPlainObject, - isFunction = _require.isFunction; - - exports.mapToJoi = function mapToJoi(typeDescriptor, _ref) { - var initial = _ref.initial, - mappings = _ref.mappings; - - var joiSchema = mappings.reduce(function (joiSchema, _ref2) { - var _ref3 = _slicedToArray(_ref2, 3), - optionName = _ref3[0], - joiMethod = _ref3[1], - passValueToJoi = _ref3[2]; - - var attributeDescriptor = typeDescriptor[optionName]; - if (attributeDescriptor === undefined) { - return joiSchema; - } - - if (shouldPassValueToJoi(passValueToJoi, attributeDescriptor)) { - return joiSchema[joiMethod](attributeDescriptor); - } - - return joiSchema[joiMethod](); - }, initial); - - joiSchema = requiredOption(typeDescriptor, { initial: joiSchema }); - - return joiSchema; - }; - - function shouldPassValueToJoi(passValueToJoi, attributeDescriptor) { - return passValueToJoi && (!isFunction(passValueToJoi) || passValueToJoi(attributeDescriptor)); - } - - function mapValueOrReference(valueOrReference) { - if (isPlainObject(valueOrReference)) { - return joi.ref(valueOrReference.attr); - } - - return valueOrReference; - } - - exports.mapToJoiWithReference = function mapToJoiWithReference(typeDescriptor, _ref4) { - var initial = _ref4.initial, - mappings = _ref4.mappings; - - return mappings.reduce(function (joiSchema, _ref5) { - var _ref6 = _slicedToArray(_ref5, 2), - optionName = _ref6[0], - joiMethod = _ref6[1]; - - var attributeDescriptor = typeDescriptor[optionName]; - - if (attributeDescriptor === undefined) { - return joiSchema; - } - - attributeDescriptor = mapValueOrReference(attributeDescriptor); - - return joiSchema[joiMethod](attributeDescriptor); - }, initial); - }; - - exports.equalOption = function equalOption(typeDescriptor, _ref7) { - var initial = _ref7.initial; - - var possibilities = typeDescriptor.equal; - - if (possibilities === undefined) { - return initial; - } - - if (Array.isArray(possibilities)) { - possibilities = possibilities.map(mapValueOrReference); - } else { - possibilities = mapValueOrReference(possibilities); - } - - return initial.equal(possibilities); - }; - - function requiredOption(typeDescriptor, _ref8) { - var initial = _ref8.initial; - - if (typeDescriptor.nullable) { - initial = initial.allow(null); - } - - if (typeDescriptor.required) { - initial = initial.required(); - } - - return initial; - } - - exports.requiredOption = requiredOption; - -/***/ }, -/* 11 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var joi = __webpack_require__(7); - - var _require = __webpack_require__(10), - mapToJoi = _require.mapToJoi, - mapToJoiWithReference = _require.mapToJoiWithReference, - equalOption = _require.equalOption; - - module.exports = { - type: Number, - joiMappings: [['integer', 'integer'], ['precision', 'precision', true], ['multiple', 'multiple', true], ['positive', 'positive', true], ['negative', 'negative', true]], - valueOrRefOptions: [['min', 'min'], ['greater', 'greater'], ['max', 'max'], ['less', 'less']], - createJoiSchema: function createJoiSchema(typeDescriptor) { - var joiSchema = mapToJoiWithReference(typeDescriptor, { - initial: joi.number(), - mappings: this.valueOrRefOptions - }); - - joiSchema = equalOption(typeDescriptor, { initial: joiSchema }); - - return mapToJoi(typeDescriptor, { - initial: joiSchema, - mappings: this.joiMappings - }); - } - }; - -/***/ }, -/* 12 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var joi = __webpack_require__(7); - - var _require = __webpack_require__(10), - mapToJoi = _require.mapToJoi, - equalOption = _require.equalOption; - - module.exports = { - type: Boolean, - joiMappings: [], - createJoiSchema: function createJoiSchema(typeDescriptor) { - var joiSchema = joi.boolean(); - - joiSchema = equalOption(typeDescriptor, { initial: joiSchema }); - - return mapToJoi(typeDescriptor, { - initial: joiSchema, - mappings: this.joiMappings - }); - } - }; - -/***/ }, -/* 13 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var joi = __webpack_require__(7); - - var _require = __webpack_require__(10), - mapToJoi = _require.mapToJoi, - mapToJoiWithReference = _require.mapToJoiWithReference, - equalOption = _require.equalOption; - - module.exports = { - type: Date, - joiMappings: [], - valueOrRefOptions: [['min', 'min'], ['max', 'max']], - createJoiSchema: function createJoiSchema(typeDescriptor) { - var joiSchema = mapToJoiWithReference(typeDescriptor, { - initial: joi.date(), - mappings: this.valueOrRefOptions - }); - - joiSchema = equalOption(typeDescriptor, { initial: joiSchema }); - - return mapToJoi(typeDescriptor, { - initial: joiSchema, - mappings: this.joiMappings - }); - } - }; - -/***/ }, -/* 14 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var joi = __webpack_require__(7); - - var _require = __webpack_require__(15), - SCHEMA = _require.SCHEMA; - - var _require2 = __webpack_require__(10), - requiredOption = _require2.requiredOption; - - module.exports = function nestedValidation(typeDescriptor) { - if (typeDescriptor.dynamicType) { - return validationToDynamicType(typeDescriptor); - } - - var typeSchema = typeDescriptor.type[SCHEMA]; - var joiSchema = getNestedValidations(typeSchema); - - joiSchema = requiredOption(typeDescriptor, { - initial: joiSchema - }); - - return joiSchema; - }; - - function validationToDynamicType(typeDescriptor) { - var joiSchema = joi.lazy(function () { - var typeSchema = typeDescriptor.getType()[SCHEMA]; - - return getNestedValidations(typeSchema); - }); - - joiSchema = requiredOption(typeDescriptor, { - initial: joiSchema - }); - - return joiSchema; - } - - function getNestedValidations(typeSchema) { - var joiSchema = joi.object(); - - if (typeSchema) { - var nestedValidations = Object.keys(typeSchema).reduce(function (validations, v) { - validations[v] = typeSchema[v].validation; - return validations; - }, {}); - - joiSchema = joiSchema.keys(nestedValidations); - } - - return joiSchema; - } - -/***/ }, -/* 15 */ -/***/ function(module, exports) { - - 'use strict'; - - module.exports = { - SCHEMA: Symbol('schema'), - ATTRIBUTES: Symbol('attributes'), - VALIDATE: Symbol('validate'), - INITIALIZE: Symbol('initialize') - }; - -/***/ }, -/* 16 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var joi = __webpack_require__(7); - - var _require = __webpack_require__(10), - mapToJoi = _require.mapToJoi; - - var joiMappings = [['minLength', 'min', true], ['maxLength', 'max', true], ['exactLength', 'length', true], ['unique', 'unique']]; - - module.exports = function arrayValidation(typeDescriptor, itemTypeDescriptor) { - var joiSchema = joi.array().items(itemTypeDescriptor.validation); - var canBeSparse = typeDescriptor.sparse === undefined || typeDescriptor.sparse; - - joiSchema = joiSchema.sparse(canBeSparse); - - joiSchema = mapToJoi(typeDescriptor, { - initial: joiSchema, - mappings: joiMappings - }); - - return joiSchema; - }; - -/***/ }, -/* 17 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(15), - SCHEMA = _require.SCHEMA, - VALIDATE = _require.VALIDATE; - - exports.validationDescriptorForSchema = function validationDescriptorForSchema(schema) { - var validation = schema[VALIDATE]; - - return { - value: function validate() { - var serializedStructure = this.toJSON(); - - return validateData(validation, serializedStructure); - } - }; - }; - - exports.staticValidationDescriptorForSchema = function staticValidationDescriptorForSchema(schema) { - var validation = schema[VALIDATE]; - - return { - value: function validate(data) { - if (data[SCHEMA]) { - data = data.toJSON(); - } - - return validateData(validation, data); - } - }; - }; - - function validateData(validation, data) { - var errors = validation.validate(data); - - if (errors) { - return { - valid: false, - errors: errors - }; - } - - return { valid: true }; - } - -/***/ }, -/* 18 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports = { - forSchema: __webpack_require__(19), - initialize: __webpack_require__(21) - }; - -/***/ }, -/* 19 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _require = __webpack_require__(15), - ATTRIBUTES = _require.ATTRIBUTES; - - var initializationOrderFor = __webpack_require__(20); - - function initializedValue(attrPassedValue, attrInitializer, attrDescriptor, instance) { - if (attrPassedValue !== undefined) { - return attrPassedValue; - } - - return attrInitializer(attrDescriptor, instance); - } - - module.exports = function forSchema(schema) { - var initializationOrder = initializationOrderFor(schema); - - return { - initialize: function initialize(attributes, instance) { - instance[ATTRIBUTES] = Object.create(null); - - for (var i = 0; i < initializationOrder.length; i++) { - var _initializationOrder$ = _slicedToArray(initializationOrder[i], 2), - attrName = _initializationOrder$[0], - attrInitializer = _initializationOrder$[1]; - - var attrDescriptor = schema[attrName]; - var attrPassedValue = attributes[attrName]; - - instance[attrName] = initializedValue(attrPassedValue, attrInitializer, attrDescriptor, instance); - } - } - }; - }; - -/***/ }, -/* 20 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(9), - isFunction = _require.isFunction; - - function isStaticInitialization(attrDescriptor) { - return !isFunction(attrDescriptor.default); - } - - function staticInitialization(attrDescriptor) { - return attrDescriptor.default; - } - - function derivedInitialization(attrDescriptor, instance) { - return attrDescriptor.default(instance); - } - - module.exports = function initializationOrderFor(schema) { - var staticInitializations = []; - var derivedInitializations = []; - - for (var attrName in schema) { - var attributeDescriptor = schema[attrName]; - - if (isStaticInitialization(attributeDescriptor)) { - staticInitializations.push([attrName, staticInitialization]); - } else { - derivedInitializations.push([attrName, derivedInitialization]); - } - } - - return [].concat(staticInitializations, derivedInitializations); - }; - -/***/ }, -/* 21 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(15), - INITIALIZE = _require.INITIALIZE; - - module.exports = function initialize(schema, attributes, instance) { - schema[INITIALIZE].initialize(attributes, instance); - }; - -/***/ }, -/* 22 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(9), - isObject = _require.isObject, - isFunction = _require.isFunction, - isString = _require.isString; - - var Errors = __webpack_require__(23); - var Coercion = __webpack_require__(24); - var Validation = __webpack_require__(6); - - function normalizeTypeDescriptor(schemaOptions, typeDescriptor, attributeName) { - if (isShorthandTypeDescriptor(typeDescriptor)) { - typeDescriptor = convertToCompleteTypeDescriptor(typeDescriptor); - } - - validateTypeDescriptor(typeDescriptor, attributeName); - - return normalizeCompleteTypeDescriptor(schemaOptions, typeDescriptor, attributeName); - } - - function normalizeCompleteTypeDescriptor(schemaOptions, typeDescriptor, attributeName) { - if (isDynamicTypeDescriptor(typeDescriptor)) { - typeDescriptor = addDynamicTypeGetter(schemaOptions, typeDescriptor, attributeName); - } - - if (isArrayType(typeDescriptor)) { - typeDescriptor.itemType = normalizeTypeDescriptor(schemaOptions, typeDescriptor.itemType, 'itemType'); - } - - return createNormalizedTypeDescriptor(typeDescriptor); - } - - function createNormalizedTypeDescriptor(typeDescriptor) { - return Object.assign({}, typeDescriptor, { - coerce: Coercion.for(typeDescriptor, typeDescriptor.itemType), - validation: Validation.forAttribute(typeDescriptor) - }); - } - - function validateTypeDescriptor(typeDescriptor, attributeName) { - if (!isObject(typeDescriptor.type) && !isDynamicTypeDescriptor(typeDescriptor)) { - throw Errors.invalidType(attributeName); - } - } - - function isDynamicTypeDescriptor(typeDescriptor) { - return isString(typeDescriptor.type); - } - - function addDynamicTypeGetter(schemaOptions, typeDescriptor, attributeName) { - if (!hasDynamicType(schemaOptions, typeDescriptor)) { - throw Errors.missingDynamicType(attributeName); - } - - typeDescriptor.getType = schemaOptions.dynamics[typeDescriptor.type]; - typeDescriptor.dynamicType = true; - - return typeDescriptor; - } - - function isShorthandTypeDescriptor(typeDescriptor) { - return isFunction(typeDescriptor) || isString(typeDescriptor); - } - - function convertToCompleteTypeDescriptor(typeDescriptor) { - return { type: typeDescriptor }; - } - - function hasDynamicType(schemaOptions, typeDescriptor) { - return schemaOptions.dynamics && schemaOptions.dynamics[typeDescriptor.type]; - } - - function isArrayType(typeDescriptor) { - return typeDescriptor.itemType != null; - } - - exports.normalize = normalizeTypeDescriptor; - -/***/ }, -/* 23 */ -/***/ function(module, exports) { - - 'use strict'; - - exports.classAsSecondParam = function (ErroneousPassedClass) { - return new Error('You passed the structure class as the second parameter of attributes(). The expected usage is `attributes(schema)(' + (ErroneousPassedClass.name || 'StructureClass') + ')`.'); - }; - - exports.nonObjectAttributes = function () { - return new TypeError("#attributes can't be set to a non-object."); - }; - - exports.arrayOrIterable = function () { - return new TypeError('Value must be iterable or array-like.'); - }; - - exports.missingDynamicType = function (attributeName) { - return new Error('Missing dynamic type for attribute: ' + attributeName + '.'); - }; - - exports.invalidType = function (attributeName) { - return new TypeError('Attribute type must be a constructor or the name of a dynamic type: ' + attributeName + '.'); - }; - - exports.invalidAttributes = function (errors, StructureValidationError) { - return new StructureValidationError(errors); - }; - -/***/ }, -/* 24 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var arrayCoercionFor = __webpack_require__(25); - var genericCoercionFor = __webpack_require__(27); - var Coercion = __webpack_require__(28); - - var types = [__webpack_require__(29), __webpack_require__(30), __webpack_require__(31), __webpack_require__(32)]; - - exports.for = function coercionFor(typeDescriptor, itemTypeDescriptor) { - if (itemTypeDescriptor) { - return arrayCoercionFor(typeDescriptor, itemTypeDescriptor); - } - - var coercion = getCoercion(typeDescriptor); - - return Coercion.execute(coercion, typeDescriptor); - }; - - function getCoercion(typeDescriptor) { - var coercion = types.find(function (c) { - return c.type === typeDescriptor.type; - }); - - if (coercion) { - return coercion; - } - - return genericCoercionFor; - } - -/***/ }, -/* 25 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - - var Errors = __webpack_require__(23); - var getType = __webpack_require__(26); - - module.exports = function arrayCoercionFor(typeDescriptor, itemTypeDescriptor) { - return function coerceArray(rawValue) { - if (rawValue === undefined) { - return; - } - - validateIfIterable(rawValue); - - var items = extractItems(rawValue); - - var instance = createInstance(typeDescriptor); - - return fillInstance(instance, items, itemTypeDescriptor); - }; - }; - - function validateIfIterable(value) { - if (!isIterable(value)) { - throw Errors.arrayOrIterable(); - } - } - - function isIterable(value) { - return value != null && (value.length != null || value[Symbol.iterator]); - } - - function extractItems(iterable) { - if (!Array.isArray(iterable) && iterable[Symbol.iterator]) { - return Array.apply(undefined, _toConsumableArray(iterable)); - } - - return iterable; - } - - function createInstance(typeDescriptor) { - var type = getType(typeDescriptor); - return new type(); - } - - function fillInstance(instance, items, itemTypeDescriptor) { - for (var i = 0; i < items.length; i++) { - instance.push(coerceItem(itemTypeDescriptor, items[i])); - } - - return instance; - } - - function coerceItem(itemTypeDescriptor, item) { - return itemTypeDescriptor.coerce(item); - } - -/***/ }, -/* 26 */ -/***/ function(module, exports) { - - "use strict"; - - module.exports = function getAttributeType(typeDescriptor) { - if (typeDescriptor.dynamicType) { - return typeDescriptor.getType(); - } - - return typeDescriptor.type; - }; - -/***/ }, -/* 27 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var getType = __webpack_require__(26); - - module.exports = { - isCoerced: function isCoerced(value, typeDescriptor) { - return value instanceof getType(typeDescriptor); - }, - coerce: function coerce(value, typeDescriptor) { - var type = getType(typeDescriptor); - - return new type(value); - } - }; - -/***/ }, -/* 28 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(9), - isFunction = _require.isFunction, - curryRight = _require.curryRight; - - exports.execute = curryRight(function (value, coercion, typeDescriptor) { - if (value === undefined) { - return; - } - - if (value === null) { - return getNullableValue(coercion, typeDescriptor); - } - - if (coercion.isCoerced(value, typeDescriptor)) { - return value; - } - - return coercion.coerce(value, typeDescriptor); - }); - - function getNullableValue(coercion, typeDescriptor) { - return needsNullableInitialization(typeDescriptor) ? getNullValue(coercion) : null; - } - - function needsNullableInitialization(typeDescriptor) { - return !typeDescriptor.required && !typeDescriptor.nullable; - } - - function getNullValue(coercion) { - return isFunction(coercion.nullValue) ? coercion.nullValue() : coercion.nullValue; - } - -/***/ }, -/* 29 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(9), - isString = _require.isString; - - module.exports = { - type: String, - isCoerced: isString, - nullValue: '', - coerce: function coerce(value) { - return this.type(value); - } - }; - -/***/ }, -/* 30 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(9), - isNumber = _require.isNumber; - - module.exports = { - type: Number, - isCoerced: isNumber, - nullValue: 0, - coerce: function coerce(value) { - return this.type(value); - } - }; - -/***/ }, -/* 31 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(9), - isBoolean = _require.isBoolean; - - module.exports = { - type: Boolean, - isCoerced: isBoolean, - nullValue: false, - coerce: function coerce(value) { - return this.type(value); - } - }; - -/***/ }, -/* 32 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(9), - isDate = _require.isDate; - - module.exports = { - type: Date, - isCoerced: isDate, - nullValue: function nullValue() { - return new Date(null); - }, - coerce: function coerce(value) { - return new this.type(value); - } - }; - -/***/ }, -/* 33 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports = { - descriptor: __webpack_require__(34) - }; - -/***/ }, -/* 34 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var serialize = __webpack_require__(35); - - module.exports = { - value: function toJSON() { - return serialize(this); - } - }; - -/***/ }, -/* 35 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(15), - SCHEMA = _require.SCHEMA; - - var getType = __webpack_require__(26); - - function serialize(structure) { - if (structure == null) { - return structure; - } - - var schema = structure[SCHEMA]; - - return serializeStructure(structure, schema); - } - - function getTypeSchema(typeDescriptor) { - return getType(typeDescriptor)[SCHEMA]; - } - - function serializeStructure(structure, schema) { - var serializedStructure = Object.create(null); - - for (var attrName in schema) { - var attribute = structure[attrName]; - - if (isPresent(attribute) || isNullable(attribute, schema, attrName)) { - serializedStructure[attrName] = serializeAttribute(attribute, attrName, schema); - } - } - - return serializedStructure; - } - - function isPresent(attribute) { - return attribute != null; - } - - function isNullable(attribute, schema, attrName) { - return attribute !== undefined && schema[attrName].nullable; - } - - function serializeAttribute(attribute, attrName, schema) { - if (isArrayType(schema, attrName)) { - return attribute.map(serialize); - } - - if (isNestedSchema(schema, attrName)) { - return serialize(attribute); - } - - return attribute; - } - - function isArrayType(schema, attrName) { - return schema[attrName].itemType && getTypeSchema(schema[attrName].itemType); - } - - function isNestedSchema(schema, attrName) { - return getTypeSchema(schema[attrName]); - } - - module.exports = serialize; - -/***/ }, -/* 36 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var Errors = __webpack_require__(23); - var DefaultValidationError = __webpack_require__(37); - - exports.buildStrictDescriptorFor = function buildStrictDescriptorFor(StructureClass, schemaOptions) { - var StructureValidationError = schemaOptions.strictValidationErrorClass || DefaultValidationError; - - return { - value: function buildStrict(constructorArgs) { - var instance = new StructureClass(constructorArgs); - - var _instance$validate = instance.validate(), - valid = _instance$validate.valid, - errors = _instance$validate.errors; - - if (!valid) { - throw Errors.invalidAttributes(errors, StructureValidationError); - } - - return instance; - } - }; - }; - -/***/ }, -/* 37 */ -/***/ function(module, exports) { - - 'use strict'; - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var DefautValidationError = function (_Error) { - _inherits(DefautValidationError, _Error); - - function DefautValidationError(errors) { - _classCallCheck(this, DefautValidationError); - - var _this = _possibleConstructorReturn(this, (DefautValidationError.__proto__ || Object.getPrototypeOf(DefautValidationError)).call(this, 'Invalid Attributes')); - - _this.details = errors; - return _this; - } - - return DefautValidationError; - }(Error); - - module.exports = DefautValidationError; - -/***/ }, -/* 38 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _require = __webpack_require__(9), - isObject = _require.isObject; - - var Errors = __webpack_require__(23); - - var _require2 = __webpack_require__(15), - ATTRIBUTES = _require2.ATTRIBUTES; - - exports.attributeDescriptorFor = function attributeDescriptorFor(attributeName, schema) { - return { - enumerable: true, - - get: function get() { - return this.attributes[attributeName]; - }, - set: function set(value) { - this.attributes[attributeName] = schema[attributeName].coerce(value); - } - }; - }; - - exports.attributesDescriptorFor = function attributesDescriptorFor(schema) { - return { - get: function get() { - return this[ATTRIBUTES]; - }, - set: function set(newAttributes) { - if (!isObject(newAttributes)) { - throw Errors.nonObjectAttributes(); - } - - var attributes = coerceAttributes(newAttributes, schema); - - Object.defineProperty(this, ATTRIBUTES, { - configurable: true, - value: attributes - }); - } - }; - }; - - function coerceAttributes(newAttributes, schema) { - var attributes = Object.create(null); - - for (var attrName in schema) { - attributes[attrName] = schema[attrName].coerce(newAttributes[attrName]); - } - - return attributes; - } - -/***/ }, -/* 39 */ -/***/ function(module, exports) { - - "use strict"; - - exports.buildCloneDescriptorFor = function buildCloneDescriptorFor(StructureClass) { - return { - configurable: true, - value: function clone() { - var overwrites = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var strict = options.strict; - - - var newAttributes = Object.assign({}, this.attributes, overwrites); - - var cloneInstance = void 0; - - if (strict) { - cloneInstance = StructureClass.buildStrict(newAttributes); - } else { - cloneInstance = new StructureClass(newAttributes); - } - - return cloneInstance; - } - }; - }; - -/***/ } -/******/ ]) -}); -; \ No newline at end of file diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 3a0915e..c41644d 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -1,16 +1,16 @@ # Table of contents -- [Introduction](../README.md) - [Schema concept](schema-concept/README.md) - - [Shorthand and complete type descriptor](schema-concept/shorthand-and-complete-type-descriptor.md) + - [Shorthand and complete attribute definition](schema-concept/shorthand-and-complete-attribute-definition.md) - [Circular reference](schema-concept/circular-references-and-dynamic-types.md) - [Nullable attributes](schema-concept/nullable-attributes.md) +- [Custom setters and getters](custom-setters-and-getters.md) - [Coercion](coercion/README.md) - [Primitive type coercion](coercion/primitive-type-coercion.md) - [Arrays coercion](coercion/arrays-and-array-subclasses.md) - [Generic coercion](coercion/generic-coercion.md) - [Recursive coercion](coercion/recursive-coercion.md) - - [Observations](coercion/observations.md) + - [Disabling coercion](coercion/disabling-coercion.md) - [Validation](validation/README.md) - [String validations](validation/string-validations.md) - [Number validations](validation/number-validations.md) @@ -23,6 +23,11 @@ - [Strict mode](strict-mode.md) - [Cloning an instance](cloning.md) - [Serialization](serialization.md) +- [Testing](testing.md) +- [Battlecry generators](battlecry-generators.md) +- [Migrating from v1](migrating-from-v1.md) +- [Support and compatibility](support.md) +- [Changelog](../CHANGELOG.md) - [Contributing](../contributing.md) - [License](../license.md) - [GitHub](https://github.com/talyssonoc/structure) diff --git a/docs/battlecry-generators.md b/docs/battlecry-generators.md new file mode 100644 index 0000000..a512de0 --- /dev/null +++ b/docs/battlecry-generators.md @@ -0,0 +1,11 @@ +# BattleCry generators + +There are configurable [BattleCry](https://github.com/pedsmoreira/battlecry) generators ready to be downloaded and help scaffolding schema: + +```sh +npm install -g battlecry +cry download generator talyssonoc/structure +cry g schema user name age:int:required cars:string[] favoriteBook:book friends:user[]:default :updateAge +``` + +Run `cry --help` to check more info about the generators available; diff --git a/docs/cloning.md b/docs/cloning.md index 6a81cb9..52256a6 100644 --- a/docs/cloning.md +++ b/docs/cloning.md @@ -73,6 +73,6 @@ const clonedUser = user.clone( // Error: Invalid Attributes // details: [ -// { message: '"name" is required', path: 'name' } +// { message: '"name" is required', path: ['name'] } // ] ``` diff --git a/docs/coercion/README.md b/docs/coercion/README.md index 478c057..8d3156a 100644 --- a/docs/coercion/README.md +++ b/docs/coercion/README.md @@ -1,9 +1,15 @@ # Coercion -Structure does type coercion based on the declared [schema](../schema-concept/README.md). It's important to note that it __never__ coerces the following scenarios: +Structure does type coercion based on the declared [schema](../schema-concept/README.md), let's break it into 3 categories: -- `undefined`; -- `null` when `nullable` option is enabled; -- value is already of the declared type (except for arrays, we'll talk more about this soon). +- [Primitive type coercion](primitive-type-coercion.md) +- [Arrays coercion](arrays-and-array-subclasses.md) +- [Generic coercion](generic-coercion.md) + +## Observations -Let's break the coercion into 3 categories. +Structure **never** coerces the following scenarios: + +- value is `undefined`; +- value is `null` when `nullable` option is enabled; +- value is already of the declared type (except for arrays, we'll talk more about this soon). diff --git a/docs/coercion/arrays-and-array-subclasses.md b/docs/coercion/arrays-and-array-subclasses.md index 29dbd19..ef8a2ae 100644 --- a/docs/coercion/arrays-and-array-subclasses.md +++ b/docs/coercion/arrays-and-array-subclasses.md @@ -1,28 +1,51 @@ # Arrays and Array subclasses -It's also possible to coerce values to `Array` or some other class that extends `Array`. On these circumstances Structure will use the `itemType` value of the type descriptor on the schema to coerce the items as well. Note that, when coercing arrays, it'll always create a new instance of the type and then push each item of the passed value to the new instance: +It's also possible to coerce values to `Array` or some other class that extends `Array`. On these circumstances Structure will use the `itemType` value of the attribute definition on the schema to coerce the items as well. Note that, when coercing arrays, it'll always create a new instance of the type and then push each item of the passed value to the new instance: ```javascript -class BooksCollection extends Array { } +class BooksCollection extends Array {} const Library = attributes({ books: { type: BooksCollection, - itemType: String + itemType: String, }, users: { type: Array, - itemType: String - } -})(class Library { }); + itemType: String, + }, +})(class Library {}); const libraryOne = new Library({ books: ['Brave New World'], - users: ['John', 'Jane'] + users: ['John', 1], }); libraryOne.books; // BooksCollection ['Brave New World'] => coerced the array to BooksCollection -libraryOne.users; // ['John', 'Jane'] => new instance of Array +libraryOne.users; // ['John', '1'] => new instance of Array with coerced items ``` The passed raw value have to be non-null and have a `length` attribute or implement the `Symbol.iterator` method, otherwise it'll fail to coerce and throw a `TypeError`. + +## Observations + +Structure only does array **items** coercion during instantiation, so mutating an array (using push, for example) won't coerce the new item: + +```javascript +const Library = attributes({ + books: { + type: Array, + itemType: String, + }, +})(class Library {}); + +const library = new Library({ + books: [1984], +}); + +library.books; // ['1984'] => coerced number to string + +library.books.push(42); + +library.books; // ['1984', 42] => new item was not coerced +``` diff --git a/docs/coercion/disabling-coercion.md b/docs/coercion/disabling-coercion.md new file mode 100644 index 0000000..1b56c99 --- /dev/null +++ b/docs/coercion/disabling-coercion.md @@ -0,0 +1,85 @@ +# Disabling coercion + +You can disable coercion for a whole structure or for attributes individually using the `coercion` option in the schema and attribute options, respectively. Notice that it will cause validation to fail when the passed value is not of the expected value: + +## Disabling for the whole structure + +```js +const User = attributes( + { + name: String, + age: Number, + }, + { + coercion: false, + } +)(class User {}); + +const user = new User({ name: 123, age: '42' }); + +user.name; // 123 +user.age; // '42' + +const { valid, errors } = user.validate(); + +valid; // false +errors; /* +[ + { message: '"name" must be a string', path: ['name'] }, + { message: '"age" must be a number', path: ['age'] } +] +*/ +``` + +## Disabling for specific attributes + +```js +const User = attributes({ + name: { type: String, coercion: false }, + age: Number, +})(class User {}); + +const user = new User({ name: 123, age: '42' }); + +user.name; // 123 +user.age; // 42 + +const { valid, errors } = user.validate(); + +valid; // false +errors; /* +[ + { message: '"name" must be a string', path: ['name'] } +] +*/ +``` + +## Overwritting structure option with attribute option + +If you define the `coercion` option both for the structure _and_ for an attribute, the structure one will apply for the whole schema except the specific attributes that overwrite it: + +```js +const User = attributes( + { + name: { type: String, coercion: true }, + age: Number, + }, + { + coercion: false, + } +)(class User {}); + +const user = new User({ name: 123, age: '42' }); + +user.name; // '123' +user.age; // '42' + +const { valid, errors } = user.validate(); + +valid; // false +errors; /* +[ + { message: '"age" must be a number', path: ['age'] } +] +*/ +``` diff --git a/docs/coercion/generic-coercion.md b/docs/coercion/generic-coercion.md index 5470598..6966172 100644 --- a/docs/coercion/generic-coercion.md +++ b/docs/coercion/generic-coercion.md @@ -11,21 +11,20 @@ class Location { } const User = attributes({ - location: Location -})(class User { }); + location: Location, +})(class User {}); const userOne = new User({ - location: new Location({ x: 1, y: 2 }) + location: new Location({ x: 1, y: 2 }), }); userOne.location; // Location { x: 1, y: 2 } => no coercion was done - const userTwo = new User({ - location: { x: 3, y: 4 } + location: { x: 3, y: 4 }, }); userTwo.location; // Location { x: 3, y: 4 } => coerced plain object to Location ``` -Coercion to `Date` type enters in this same category, so if you have an attribute of the type `Date`, it'll use `new Date()` to coerce it. For more info about how this coercion works check the cases for `value` and `dateString` parameters on [Date documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date). +Coercion to `Date` type enters in this same category, so if you have an attribute of the type `Date`, it'll use `new Date()` to coerce it. For more info about how this coercion works check the cases for `value` and `dateString` parameters on [Date documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date). diff --git a/docs/coercion/observations.md b/docs/coercion/observations.md deleted file mode 100644 index 19558ea..0000000 --- a/docs/coercion/observations.md +++ /dev/null @@ -1,23 +0,0 @@ -# Observations - -__Important: Structure only does coercion during object creation, so mutating an array (using push, for example) won't coerce the new item:__ - -```javascript -const Library = attributes({ - books: { - type: Array, - itemType: String - } -})(class Library { }); - -const library = new Library({ - books: [1984] -}); - -library.books; // ['1984'] => coerced number to string - -library.books.push(42); - -library.books; // ['1984', 42] => new item was not coerced - -``` diff --git a/docs/coercion/primitive-type-coercion.md b/docs/coercion/primitive-type-coercion.md index 49bdfa4..5e9f907 100644 --- a/docs/coercion/primitive-type-coercion.md +++ b/docs/coercion/primitive-type-coercion.md @@ -2,19 +2,19 @@ It's said to be primitive type coercion when it tries to coerce values to `String`, `Number` or `Boolean` types. -For those types we basically use the type as a function (without using `new`), with a subtle difference: When coercing `null` to `String`, it'll coerce to empty string instead of the string `'null'`. For example: +For those types we basically use the type as a function (without using `new`), with a subtle difference: When coercing `null` to `String`, it'll coerce to empty string instead of the string `'null'` (unless when the attribute is [nullable](../schema-concept/nullable-attributes.md)). For example: ```js const User = attributes({ name: String, age: Number, - isAdmin: Boolean -})(class User { }); + isAdmin: Boolean, +})(class User {}); const userOne = new User({ name: 'Foo Bar', age: 50, - isAdmin: true + isAdmin: true, }); userOne.name; // 'Foo Bar' => no coercion was done @@ -24,7 +24,7 @@ userOne.isAdmin; // true => no coercion was done const userTwo = new User({ name: null, age: '100', - isAdmin: undefined + isAdmin: undefined, }); userTwo.name; // '' => coerced `null` to empty string diff --git a/docs/coercion/recursive-coercion.md b/docs/coercion/recursive-coercion.md index 8da25b7..6b9ef47 100644 --- a/docs/coercion/recursive-coercion.md +++ b/docs/coercion/recursive-coercion.md @@ -3,25 +3,23 @@ Structure also does recursive coercion so, if your declared type is Array or other Structure, the items/attributes of the raw value will be coerced as well: ```javascript -class BooksCollection extends Array { } +class BooksCollection extends Array {} const Book = attributes({ - name: String -})(class Book { }); + name: String, +})(class Book {}); const User = attributes({ favoriteBook: Book, books: { type: BooksCollection, - itemType: Book - } -})(class User { }); + itemType: Book, + }, +})(class User {}); const user = new User({ favoriteBook: { name: 'The Silmarillion' }, - books: [ - { name: '1984' } - ] + books: [{ name: '1984' }], }); user.favoriteBook; // Book { name: 'The Silmarillion' } => coerced plain object to Book diff --git a/docs/custom-setters-and-getters.md b/docs/custom-setters-and-getters.md new file mode 100644 index 0000000..ccf237b --- /dev/null +++ b/docs/custom-setters-and-getters.md @@ -0,0 +1,86 @@ +# Custom setters and getters + +Sometimes it may be necessary to have custom setters and/or getters for some attributes. Structure allows you to do that using native JavaScript setters and getters. It will even support coercion. + +It's important to notice that you **should not** try to access the attribute directly inside its getter or to set it directly inside its setter because it will cause infinite recursion, this is default JavaScript behavior. To access an attribute value inside its getter you should use `this.get(attributeName)`, and to set the value of an attribute a setter you should use `this.set(attributeName, attributeValue)`: + +```js +const User = attributes({ + firstName: String, + lastName: String, + age: Number, +})( + class User { + get firstName() { + return `-> ${this.get('firstName')}`; + } + + set lastName(newLastname) { + return this.set('lastName', `Mac${newLastName}`); + } + + get age() { + // do NOT do that. Instead, use this.get and this.set inside getters and setters + return this.age * 1000; + } + + // this is NOT an attribute, just a normal getter + get fullName() { + return `${this.firstName} ${this.lastName}`; + } + } +); + +const user = new User({ firstName: 'Connor', lastName: 'Leod' }); + +user.firstName; // -> Connor +user.lastName; // MacLeod +user.fullName; // -> Connor MacLeod +``` + +## Inheritance + +Custom setters and getters are also inherited, be your superclass a pure JavaScript class or another structure: + +```js +class Person { + // If Person was a structure instead of a pure class, that would work too + get name() { + return 'The person'; + } +} + +const User = attributes({ + name: String, +})(class User extends Person {}); + +const user = new User({ name: 'Will not be used' }); + +user.name; // -> The person +``` + +**Important** + +JavaScript nativelly won't let you inherit only one of the accessors (the getter or the setter) if you define the other accessor in a subclass: + +```js +class Person { + get name() { + return 'Person'; + } +} + +class User extends Person { + set name(newName) { + this._name = newName; + } +} + +const user = new Person(); +user.name = 'The user'; +user.name; // -> The user +``` + +It happens because _once you define one of the accessors in a subclass_, all the accessors for the same attribute inherited from the superclass will be ignored. + +While it's a weird behavior, Structure will follow the same functionality so the Structure classes inheritance work the same way of pure JavaScript classes, avoiding inconsistencies. diff --git a/docs/migrating-from-v1.md b/docs/migrating-from-v1.md new file mode 100644 index 0000000..4cbb91e --- /dev/null +++ b/docs/migrating-from-v1.md @@ -0,0 +1,105 @@ +# Migrating from v1 to v2 + +Migrating an app that uses Structure v1 to use Structure v2 requires some changes in the way validation errors are expected to be returned, default fallback of null values and upgrading Node (if you use a version lower than v10.13.0) + +## Validation errors + +In v1, validations used to be like this: + +```js +const Book = attributes({ + name: { + type: String, + required: true, + }, +})(class Book {}); + +const User = attributes({ + initials: { + type: String, + minLength: 2, + }, + favoriteBook: Book, + books: { + type: Array, + itemType: Book, + }, +})(class User {}); + +const user = new User({ + initials: 'A', + favoriteBook: new Book(), + books: [new Book()], +}); + +const { valid, errors } = user.validate(); + +valid; // false +errors; /* +[ + { message: '"initials" length must be at least 2 characters long', path: 'initials' }, + { message: '"name" is required', path: 'favoriteBook.name' }, + { message: '"name" is required', path: 'books.0.name' } +] +*/ +``` + +Notice that the message used to contain only the name of the attribute (so if it's nested it will only show the attribute name of the nested structure) and the path is a string that use a dot `.` to represent that it's a nested attribute. + +If your app relies on the content of the message or the path, you'll have to consider that it's now returned like this: + +```js +const Book = attributes({ + name: { + type: String, + required: true, + }, +})(class Book {}); + +const User = attributes({ + initials: { + type: String, + minLength: 2, + }, + favoriteBook: Book, + books: { + type: Array, + itemType: Book, + }, +})(class User {}); + +const user = new User({ + initials: 'A', + favoriteBook: new Book(), + books: [new Book()], +}); + +const { valid, errors } = user.validate(); + +valid; // false +errors; /* +[ + { message: '"initials" length must be at least 2 characters long', path: ['initials'] }, + { message: '"favoriteBook.name" is required', path: ['favoriteBook', 'name'] }, + { message: '"books[0].name" is required', path: ['books', 0, 'name'] } +] +*/ +``` + +In v2 the message contains the whole path for the attribute (using dot `.` to represent it's a nested attribute) and the path is not an array. + +So if your apps relies in the content of the message you'll probably have to do some parsing of this message now. And if it relies in the path to be a string, you can use [`path.join('.')`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join). + +## Nullability and defaults + +Since v2 now allows having nullable attributes, non-nullable attributes will fallback to the [default](schema-concept/shorthand-and-complete-attribute-definition.md#default) the same way it happens with attributes with `undefined` value since v1. + +## New public methods + +Structure v2 also adds two new instance methods to the structures: `instance.get(attrName)` and `instance.set(attrName, attrValue)`. They are **not** replacing the normal getters and setters, which are still there, they are just alternatives for the case you use a [custom setter and/or getter](custom-setters-and-getters.md) + +So if any of your structures declare methods with these names you'll have to change it or it's gonna break. + +## Upgrade Node + +The minimum Node LTS supported by Structure is now v10.13.0 which is the lowest active [LTS](https://nodejs.org/en/about/releases/). diff --git a/docs/schema-concept/README.md b/docs/schema-concept/README.md index 2189176..13320d1 100644 --- a/docs/schema-concept/README.md +++ b/docs/schema-concept/README.md @@ -1,11 +1,12 @@ # Schema Concept + The schema is an object responsible to map the attributes Structure should handle, it is the parameter of the `attributes` function. ```js attributes({ name: String, - age: Number -})(class User { }); + age: Number, +})(class User {}); ``` -There are two ways to declare an attribute of the schema, the __shorthand type descriptor__ and the __complete type descriptor__. +There are two ways to declare an attribute of the schema, the **shorthand attribute definition** and the **complete attribute definition**. diff --git a/docs/schema-concept/circular-references-and-dynamic-types.md b/docs/schema-concept/circular-references-and-dynamic-types.md index 4475759..b707c37 100644 --- a/docs/schema-concept/circular-references-and-dynamic-types.md +++ b/docs/schema-concept/circular-references-and-dynamic-types.md @@ -2,48 +2,124 @@ Sometimes we may need to have a type reference itself in its attributes, or have two types that reference eachother in separate files, it can be a complication because it's not possible to do this using the type definitions like we did before. For cases like this we can use a feature called "dynamic types". -When using dynamic types you can pass a string instead of the type itself in the type definition, and pass an object as the _second_ parameter of the `attributes` function with an object with a key called `dynamics`. This key will have functions named after the dynamic attribute types, that will be called when the given type is used, like this: - +When using dynamic types you can pass a string instead of the type itself in the type definition, this string will contain the type **identifier**, and then pass an object as the _second_ parameter of the `attributes` function with a key `dynamics` where the concrete type for each identifier is declared: ```javascript /* * User.js -*/ -const User = attributes({ - name: String, - friends: { - type: Array, - itemType: 'User' // << dynamic type name - }, - favoriteBook: { - type: 'Book', // << dynamic type name - required: true + */ +const User = attributes( + { + name: String, + friends: { + type: Array, + itemType: 'User', // << dynamic type with inferred identifier + }, + favoriteBook: { + type: 'BookStructure', // << dynamic type with custom identifier + required: true, + }, + books: { + type: 'BooksCollection', // << dynamic type with inferred identifier + itemType: String, + }, }, - books: { - type: 'BooksCollection', // << dynamic type name - itemType: String + { + dynamics: { + /* dynamic types */ + User: () => User, + BookStructure: () => require('./Book'), + BooksCollection: () => require('./BooksCollection'), + }, } -}, { - dynamics: { // << dynamic types values - User: () => User, - Book: () => require('./Book'), - BooksCollection: () => require('./BooksCollection') - } -})(class User { }); +)(class User {}); /* * Book.js -*/ -const Book = attributes({ - name: String, - owner: 'User', // << dynamic type name - nextBook: 'Book' // << dynamic type name -}, { - dynamics: { // << dynamic types values - User: () => require('./User'), - Book: () => Book + */ +const Book = attributes( + { + name: String, + owner: 'User', // << dynamic type with inferred identifier + nextBook: 'BookStructure', // << dynamic type with custom identifier + }, + { + identifier: 'BookStructure', // << custom identifier + dynamics: { + /* dynamic types */ + User: () => require('./User'), + BookStructure: () => Book, + }, + } +)(class Book {}); +``` + +## Dynamic type identifier + +The type's identifier has to be same everywhere it's used, and can be defined in two ways: + +### Inferred identifier + +The identifier can be inferred based on the class that is wrapped by the `attributes` function. In backend scenarios this will be the most common case: + +```js +const User = attributes( + { + name: String, + bestFriend: 'User', // [A] type with inferred identifier + }, + { + dynamics: { + User: () => User, // [B] inferred identifier concrete type + }, + } +)( + class User { + // ^ the name of this class is the identifier + // so if we change this name to UserEntity, we'll have to change + // both [A] and [B] to use the string 'UserEntity' instead of 'User' } -})(class Book { }); +); ``` -Notice that the _name_ of the type has to be the same name of the key inside the `dynamics` object. Also, it's important that the require be done __inside__ the function when the dynamic type also references the current type (in the example above, the type `User` has an attribute of the type `Book`, and the type `Book` has an attribute of the type `User`). +### Custom identifier + +If for some reason you can't rely on the class name, be it because you're using a compiler that strips class names or creates a dynamic one, you can explicitly set an indentifier. + +To do that, in the second argument of the `attributes` function (e.g. the options) you should add a `identifier` key and set it to be the string with the type's identifier and then use that custom value everywhere this type is dynamically needed: + +```js +const User = attributes( + { + name: String, + bestFriend: 'UserEntity', // << type with custom identifier + }, + { + identifier: 'UserEntity', // << custom identifier + dynamics: { + UserEntity: () => User, // << custom identifier concrete type + }, + } +)(class User {}); +``` + +### Concrete type definition inside `dynamics` + +For the cases where the dynamic type is in a different file, it's important to call the `require` **inside** the function that returns the dynamic type, **not** in the top level of your file: + +```js +const Book = attributes( + { + name: String, + owner: 'User', + nextBook: 'BookStructure', + }, + { + identifier: 'BookStructure', + dynamics: { + User: () => require('./User'), // << like this + BookStructure: () => Book, + }, + } +)(class Book {}); +``` diff --git a/docs/schema-concept/nullable-attributes.md b/docs/schema-concept/nullable-attributes.md index e78ab63..660da2b 100644 --- a/docs/schema-concept/nullable-attributes.md +++ b/docs/schema-concept/nullable-attributes.md @@ -1,105 +1,159 @@ # Nullable attributes -You can change the way an attribute is treated when the value `null` is assigned to it by using the `nullable` option with the value `true`, this would affect the way the attribute is coerced, validated and serialized. +You can change the way an attribute is treated when the value `null` is assigned to it by using the `nullable` option with the value `true`, this would affect the way the attribute is defaulted, coerced, validated and serialized. -If you do not set the `nullable` option for an attribute it will default to `false` and make your attribute __not nullable__. +If you do not set the `nullable` option it will default to `false` and automatically make your attribute **non-nullable**. + +## Nullability and `default` option + +Non-nullable attributes with the value `null` will fallback to the value set as default the same way `undefined` does. But if the attribute is nullable, it will **only** fallback to the default if its value is `undefined`. + +```javascript +const User = attributes({ + name: { + // automatically non-nullable + type: String, + default: 'Some string', + }, + nickname: { + type: String, + nullable: false, + default: 'Some other string', + }, +})(class User {}); + +const userA = new User({ name: null, nickname: null }); +userA.attributes; // { name: 'Some string', nickname: null } + +const userB = new User({ name: null, nickname: undefined }); +userB.attributes; // { name: 'Some string', nickname: 'Some other string' } +``` + +## Coercion + +Non-nullable values will fallback to their null-equivalent values. More details about it can be found at the [coercion](coercion/README.md) section. Nullable attributes will remain `null` as described in the section above. ```javascript /* * User.js -*/ + */ const User = attributes({ name: { type: String, - empty: true + nullable: true, + }, + nickname: { + // automatically non-nullable + type: String, + empty: true, }, - age: Number, - active: Boolean, - createdAt: Date -})(class User { }); + age: Number, // << automatically non-nullable + active: Boolean, // << automatically non-nullable + createdAt: Date, // << automatically non-nullable +})(class User {}); const user = new User({ name: null, + nickname: null, age: null, active: null, - createdAt: null + createdAt: null, }); -user.attributes; // { name: '', age: 0, active: false, createdAt: 1970-01-01T00:00:00.000Z } -user.validate() // { valid: true } +// Only non-nullable values are coerced to their null-equivalent values +user.attributes; // { name: null, nickname: '', age: 0, active: false, createdAt: 1970-01-01T00:00:00.000Z } +user.validate(); // { valid: true } ``` ### Nullable optional attributes -When you set an optional attribute to be __nullable__ you are choosing not to assign a default value for it when instantiating your structure passing `null` as the value of this attribute, so the actual value will be `null` and will be considered valid. +When you set an optional attribute to be **nullable** you are choosing not to assign a default value for it when instantiating your structure passing `null` as the value of this attribute, so the actual value will be `null` and will be considered valid. ```javascript /* * User.js -*/ + */ const User = attributes({ name: { type: String, - nullable: true - } -})(class User { }); + nullable: true, + }, +})(class User {}); const user = new User({ - name: null + name: null, }); user.attributes; // { name: null } -user.validate() // { valid: true } +user.validate(); // { valid: true } ``` ### Nullable required attributes -We consider that when an attribute is __required__ there should be some value assigned to it even if it's `undefined`, `null` or any other value. It means that coercion will never assign a __default__ value to __required__ attributes even if __nullable__ option is __false__. +We consider that when an attribute is **required** there should be some value assigned to it even if it's `undefined`, `null` or any other value. It means that coercion will never assign a **default** value to **required** attributes even if **nullable** option is **false**. ```javascript /* * User.js -*/ + */ const User = attributes({ name: { type: String, required: true, - nullable: false // non-nullable required attribute - } -})(class User { }); + nullable: false, // non-nullable required attribute + }, +})(class User {}); const user = new User({ - name: null + name: null, }); user.attributes; // { name: null } -user.validate() // { valid: false } +user.validate(); // { valid: false } ``` -But notice that you can choose to allow __null__ values on __required__ attributes which will cause the validation to return __true__. +But notice that you can choose to allow **null** values on **required** attributes which will cause the validation to return **true**. ```javascript /* * User.js -*/ + */ const User = attributes({ name: { type: String, required: true, - nullable: true - } -})(class User { }); + nullable: true, + }, +})(class User {}); const user = new User({ - name: null + name: null, }); user.attributes; // { name: null } -user.validate() // { valid: true } +user.validate(); // { valid: true } ``` -**Important:** +## Nullability and serialization + +Usually an attribute with the value **undefined** or **null** is not included when you serialize your structure. But when it is **nullable** and its value is `null`, this attribute is going to be returned in your serialized schema. + +```javascript +const User = attributes({ + name: { + type: String, + nullable: false, + }, + nickname: { + type: String, + nullable: true, + }, +})(class User {}); + +const user = new User({ name: undefined, nickname: null }); +user.toJSON(); // { nickname: null } +``` -- Notice that by not using the `nullable` option the __default__ value for __String__ is an empty string, which means that you need to accept empty strings to make your schema valid. +**Important:** -- Notice that usually an attribute with the value __undefined__ or __null__ is not included when you serialize your structure, but when it is __nullable__ this attribute is going to be returned in your serialized schema. +- Notice that by not using the `nullable` option the **default** value for **String** is an empty string, which means that you need to accept empty strings to make your schema valid. diff --git a/docs/schema-concept/shorthand-and-complete-type-descriptor.md b/docs/schema-concept/shorthand-and-complete-attribute-definition.md similarity index 62% rename from docs/schema-concept/shorthand-and-complete-type-descriptor.md rename to docs/schema-concept/shorthand-and-complete-attribute-definition.md index 337de08..1667a00 100644 --- a/docs/schema-concept/shorthand-and-complete-type-descriptor.md +++ b/docs/schema-concept/shorthand-and-complete-attribute-definition.md @@ -1,45 +1,52 @@ -# Shorthand type descriptor +# Shorthand attribute definition + The shorthand is a pair of `propertyName: Type` key/value like this: ```js const User = attributes({ name: String, - brithday: Date -})(class User { - generateRandomBook() { - return '...'; + brithday: Date, +})( + class User { + generateRandomBook() { + return '...'; + } } -}); +); ``` -# Complete type descriptor -The complete descriptor allows you to declare additional info for the attribute. -__For Array types it's required to use the complete type descriptor because you must specify the `itemType`__. +# Complete attribute definition + +The complete definition allows you to declare additional info for the attribute. +**For Array types it's required to use the complete attribute definition because you _must_ specify the `itemType`**. ```js const User = attributes({ name: { type: String, - default: 'Anonymous' + default: 'Anonymous', }, cars: { type: Array, itemType: String, - default: ['Golf', 'Polo'] + default: ['Golf', 'Polo'], }, book: { type: String, - default: (instance) => instance.generateRandomBook() - } -})(class User { - generateRandomBook() { - return '...'; + default: (instance) => instance.generateRandomBook(), + }, +})( + class User { + generateRandomBook() { + return '...'; + } } -}); +); ``` ## default -The __default__ of an attribute will be used if no value was provided for the specific attribute at construction time. + +The **default** of an attribute will be used if no value was provided for the specific attribute at construction time. You can also use a function which receives the instance as a parameter in order to provide the default. The operation must be synchronous and the function will called after all the other attributes are already assigned, thus, you can use the other attributes of your class to compose a default value. @@ -48,17 +55,19 @@ thus, you can use the other attributes of your class to compose a default value. const User = attributes({ name: { type: String, - default: 'Anonymous' // static default value + default: 'Anonymous', // static default value }, greeting: { type: String, - default: (instance) => instance.greeting() // dynamic default value - } -})(class User { - greeting() { - return `Hello ${this.name}`; + default: (instance) => instance.greeting(), // dynamic default value + }, +})( + class User { + greeting() { + return `Hello ${this.name}`; + } } -}); +); ``` Please note that initializing an attribute with undefined will make it fallback to the default value while instantiating the structure, but it will not fallback when assigning the attribute after the structure is already constructed. @@ -67,9 +76,9 @@ Please note that initializing an attribute with undefined will make it fallback const User = attributes({ name: { type: String, - default: 'Anonymous' // static default value - } -})(class User { }); + default: 'Anonymous', // static default value + }, +})(class User {}); const firstUser = new User({ name: undefined }); firstUser.name; // 'Anonymous' => fallbacks to default value @@ -81,12 +90,14 @@ secondUser.name; // undefined => does not fallback to default value ``` ## itemType -The __itemType__ of an attribute is used to validate and coerce the type of each item from the attribute, like when the attribute type is `Array` or some class that extends `Array`. -* Please refer to [Validation](../validation/README.md) in order to check a bit more on validation properties. +The **itemType** of an attribute is used to validate and coerce the type of each item from the attribute, like when the attribute type is `Array` or some class that extends `Array`. + +- Please refer to [Validation](../validation/README.md) in order to check a bit more on validation properties. # Type concept -Each attribute needs a __type__ definition, that's how Structure validates and coerces the attribute's value. It can be divided into three categories (as in right now): + +Each attribute needs a **type** definition, that's how Structure validates and coerces the attribute's value. It can be divided into three categories (as in right now): - Primitives (Number, String, Boolean) - Classes (Date, Object, regular Classes and Structure classes as well) diff --git a/docs/serialization.md b/docs/serialization.md index 8061c35..a5e2503 100644 --- a/docs/serialization.md +++ b/docs/serialization.md @@ -6,7 +6,7 @@ It's possible to obtain a serialized object of a Structure using the method `toJ - Be aware that `toJSON()` will return an object, not the JSON in form of a string like `JSON.stringify()` does - Refer to the [Date#toJSON](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON) specification to see how dates will be serialized by `JSON.stringify` -- Refer to [Dealing with nullable attributes](schema-concept/nullable-attributes.md) to check how `nullables` are going to be returned on __Serialization__ +- Refer to [Dealing with nullable attributes](schema-concept/nullable-attributes.md#nullability-and-serialization) to check how `nullables` are going to be returned on **Serialization** ```javascript const Book = attributes({ diff --git a/docs/strict-mode.md b/docs/strict-mode.md index 2851a0b..701f32e 100644 --- a/docs/strict-mode.md +++ b/docs/strict-mode.md @@ -5,21 +5,21 @@ To instantiate a structure that automatically throws an error if that is invalid ```js const { attributes } = require('structure'); const User = attributes({ - name: { - type: String, - required: true - }, - age: Number + name: { + type: String, + required: true, + }, + age: Number, })(class User {}); -var user = User.buildStrict({ - age: 'Twenty' +const user = User.buildStrict({ + age: 'Twenty', }); // Error: Invalid Attributes // details: [ -// { message: '"name" is required', path: 'name' }, -// { message: '"age" must be a number', path: 'age' } +// { message: '"name" is required', path: ['name'] }, +// { message: '"age" must be a number', path: ['age'] } // ] ``` @@ -40,24 +40,27 @@ class InvalidBookError extends Error { } } -const Book = attributes({ +const Book = attributes( + { name: { type: String, - required: true + required: true, }, - year: Number -}, { - strictValidationErrorClass: InvalidBookError -})(class Book {}); + year: Number, + }, + { + strictValidationErrorClass: InvalidBookError, + } +)(class Book {}); -var book = Book.buildStrict({ - year: 'Twenty' +const book = Book.buildStrict({ + year: 'Twenty', }); // InvalidBookError: Wait, this book is not right // code: 'INVALID_BOOK' -// details: [ -// { message: '"name" is required', path: 'name' }, -// { message: '"year" must be a number', path: 'year' } +// errors: [ +// { message: '"name" is required', path: ['name'] }, +// { message: '"year" must be a number', path: ['year'] } // ] ``` diff --git a/docs/support.md b/docs/support.md new file mode 100644 index 0000000..3a4475c --- /dev/null +++ b/docs/support.md @@ -0,0 +1,11 @@ +# Support and compatibility + +Structure is built on top of modern JavaScript, using new features like [Proxy](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy), [Reflect](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Reflect) and [Symbol](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Symbol). That being so, there are some things regarding compatibility you should consider when using Structure. + +## Node + +Node has only implemented all the used features at version 10, so to use Structure for a backend application you'll need Node 10 or later. + +## Browser + +We have a UMD version for usage in browsers. Right now the tests are ran both in Node (using the original code) and in Electron (using the UMD version) and the whole test suite passes for both cases. Since we use modern JavaScript features inside the lib (like [Proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy)), older browsers may not support it. Polyfilling them may be an option but it's not oficially supported. diff --git a/docs/testing.md b/docs/testing.md new file mode 100644 index 0000000..acfa40f --- /dev/null +++ b/docs/testing.md @@ -0,0 +1,142 @@ +# Testing + +If you use Jest, Structure has a Jest extension called [`jest-structure`](https://www.npmjs.com/package/jest-structure) that provides assertions to make it easy to test intances. + +## Installation + +jest-structure is available in npm, so you can install it with npm or yarn as a development dependency: + +```sh +npm install --save-dev jest-structure + +# or + +yarn --dev add jest-structure +``` + +## Setup + +After installing, you need to tell Jest to use jest-structure, this can be done in two ways: + +By importing and manually adding it to Jest: + +```js +import jestStructure from 'jest-structure'; + +expect.extend(jestStructure); +``` + +Or by allowing jest-structure to add itself to Jest matchers: + +```js +import 'jest-structure/extend-expect'; +``` + +Both ways can be done in a [setup file](https://jestjs.io/docs/en/configuration#setupfilesafterenv-array) or directly at the top of your test file + +## Matchers + +### `toBeValidStructure()` + +This matcher passes if the structure is _valid_: + +```js +const User = attributes({ + name: { type: String, required: true }, +})(class User {}); + +const validUser = new User({ name: 'Me' }); + +expect(validUser).toBeValidStructure(); // passes + +const invalidUser = new User(); + +expect(invalidUser).toBeValidStructure(); // fails +``` + +### `toBeInvalidStructure()` + +This matcher passes if the structure is _invalid_: + +```js +const User = attributes({ + name: { type: String, required: true }, +})(class User {}); + +const invalidUser = new User(); + +expect(invalidUser).toBeInvalidStructure(); // passes + +const validUser = new User({ name: 'Me' }); + +expect(validUser).toBeInvalidStructure(); // fails +``` + +## `toHaveInvalidAttribute(path, messages)` + +This matcher allows you to assert that a _single attribute_ of the structure is invalid, optionally passing the array of error messages for that attribute: + +```js +const User = attributes({ + name: { type: String, required: true }, + age: { type: Number, required: true }, +})(class User {}); + +const user = new User({ age: 42 }); + +// passes, because name is invalid +expect(user).toHaveInvalidAttribute(['name']); + +// fails, because age is valid +expect(user).toHaveInvalidAttribute(['age']); + +// passes, because name is invalid with this message +expect(user).toHaveInvalidAttribute(['name'], ['"name" is required']); + +// fails, because name is invalid but not with this message +expect(user).toHaveInvalidAttribute(['name'], ['"name" is not cool']); + +// passes. Notice that you can even use arrayContaining to check for a subset of the errros +expect(user).toHaveInvalidAttribute(['name'], expect.arrayContaining(['"name" is required'])); + +// passes. And stringContaining can be used as well +expect(user).toHaveInvalidAttribute(['name'], [expect.stringContaining('required')]); +``` + +## `toHaveInvalidAttributes([ { path, messages } ])` + +This matcher allows you to assert that _multiple attributes_ of the structure are invalid, optionally passing the array of error messages for each attribute: + +```js +const User = attributes({ + name: { type: String, required: true }, + age: { type: Number, required: true }, +})(class User {}); + +const user = new User({ age: 42 }); + +// passes, because name is invalid +expect(user).toHaveInvalidAttributes([{ path: ['name'] }]); + +// fails, because age is valid +expect(user).toHaveInvalidAttributes([{ path: ['age'] }]); + +// fails, because name is invalid but age is valid +expect(user).toHaveInvalidAttributes([{ path: ['name'] }, { path: ['age'] }]); + +// passes, because name is invalid with this message +expect(user).toHaveInvalidAttributes([{ path: ['name'], messages: ['"name" is required'] }]); + +// fails, because name is invalid but not with this message +expect(user).toHaveInvalidAttributes([{ path: ['name'], messages: ['"name" is not cool'] }]); + +// passes. Notice that you can even use arrayContaining to check for a subset of the errros +expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: expect.arrayContaining(['"name" is required']) }, +]); + +// passes. And stringContaining can be used as well +expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: [expect.stringContaining('required')] }, +]); +``` diff --git a/docs/validation/README.md b/docs/validation/README.md index 014d00a..cd451ee 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -2,22 +2,22 @@ A `validate()` method will be added to the prototype of structures, this method will validate the structure based on its schema. The method will return an object with the property `valid` (with the value `true` if it's valid, and `false` if invalid). If `valid` is `false` the returned object will also have a property `errors`, with an array of validation errors. -Validations require you to use the complete type descriptor: +Validations require you to use the complete attribute definition: ```javascript const User = attributes({ name: { type: String, - minLength: 10 + minLength: 10, }, age: { type: Number, - required: true - } -})(class User { }); + required: true, + }, +})(class User {}); const user = new User({ - name: 'John' + name: 'John', }); const { valid, errors } = user.validate(); @@ -25,14 +25,14 @@ const { valid, errors } = user.validate(); valid; // false errors; /* [ - { message: '"name" length must be at least 10 characters long', path: 'name' }, - { message: '"age" is required', path: 'age' } + { message: '"name" length must be at least 10 characters long', path: ['name'] }, + { message: '"age" is required', path: ['age'] } ] */ const validUser = new User({ -  name: 'This is my name', - age: 25 + name: 'This is my name', + age: 25, }); const validation = validUser.validate(); @@ -41,10 +41,10 @@ validation.valid; // true validation.errors; // undefined, because `valid` is true ``` -Structure has a set of built-in validations built on top of the awesome [joi](https://www.npmjs.com/package/joi) package: +Structure has a set of built-in validations built on top of the awesome [joi](https://www.npmjs.com/package/@hapi/joi) package: **Observations** -Validations marked with __*__ accept a value, an [attribute reference](attribute-reference.md), or an array of values and attribute references mixed. +Validations marked with **\*** accept a value, an [attribute reference](attribute-reference.md), or an array of values and attribute references mixed. -Validations marked with __**__ accept a value or an [attribute reference](attribute-reference.md). +Validations marked with **\*\*** accept a value or an [attribute reference](attribute-reference.md). diff --git a/docs/validation/attribute-reference.md b/docs/validation/attribute-reference.md index e7bd5d2..c8d9161 100644 --- a/docs/validation/attribute-reference.md +++ b/docs/validation/attribute-reference.md @@ -8,14 +8,14 @@ const User = attributes({ password: String, passwordConfirmation: { type: String, - equal: { attr: 'password' } - } -})(class User { }); + equal: { attr: 'password' }, + }, +})(class User {}); const user = new User({ name: 'Gandalf', password: 'safestpasswordever', - passwordConfirmation: 'notthatsafetho' + passwordConfirmation: 'notthatsafetho', }); const { valid, errors } = user.validate(); @@ -24,9 +24,8 @@ valid; // false errors; /* [ { message: '"passwordConfirmation" must be one of [ref:password]', - path: 'passwordConfirmation' + path: ['passwordConfirmation'] } ] */ - ``` diff --git a/docs/validation/nested-validations.md b/docs/validation/nested-validations.md index 01d0607..9d45ae0 100644 --- a/docs/validation/nested-validations.md +++ b/docs/validation/nested-validations.md @@ -6,26 +6,26 @@ Structure will validate nested values, including array items validations and nes const Book = attributes({ name: { type: String, - required: true - } -})(class Book { }); + required: true, + }, +})(class Book {}); const User = attributes({ initials: { type: String, - minLength: 2 + minLength: 2, }, favoriteBook: Book, books: { type: Array, - itemType: Book - } -})(class User { }); + itemType: Book, + }, +})(class User {}); const user = new User({ initials: 'A', favoriteBook: new Book(), - books: [new Book()] + books: [new Book()], }); const { valid, errors } = user.validate(); @@ -33,9 +33,9 @@ const { valid, errors } = user.validate(); valid; // false errors; /* [ - { message: '"initials" length must be at least 2 characters long', path: 'initials' }, - { message: '"name" is required', path: 'favoriteBook.name' }, - { message: '"name" is required', path: 'books.0.name' } + { message: '"initials" length must be at least 2 characters long', path: ['initials'] }, + { message: '"favoriteBook.name" is required', path: ['favoriteBook', 'name'] }, + { message: '"books[0].name" is required', path: ['books', 0, 'name'] } ] */ ``` diff --git a/docs/validation/string-validations.md b/docs/validation/string-validations.md index cea3a78..e57fd6c 100644 --- a/docs/validation/string-validations.md +++ b/docs/validation/string-validations.md @@ -2,53 +2,55 @@ - `required`: can't be undefined (default: `false`) - `empty`: accepts empty string (default: `false`) -- `equal`: __*__ equal to passed value +- `equal`: **\*** equal to passed value - `minLength`: can't be shorter than passed value - `maxLength`: can't be longer than passed value -- `exactLength`: length must be exactly the passed value +- `exactLength`: length must be exactly the passed value - `regex`: matches the passed regex - `alphanumeric`: composed only by alphabetical and numeric characters - `lowerCase`: all characters must be lower cased - `upperCase`: all characters must be upper cased - `email`: is a valid email (default: `false`) - `nullable`: accepts null (default: `false`) -- `guid`: is a valid guid. You can pass a boolean or the [options object accepted by Joi](https://github.com/hapijs/joi/blob/v10.2.0/API.md#stringguid---aliases-uuid) (default: `false`) +- `guid`: is a valid guid. You can pass a boolean or the [options object accepted by Joi](https://hapi.dev/module/joi/api/?v=16.1.8#stringguid---aliases-uuid) (default: `false`) ```javascript const User = attributes({ id: { type: String, - guid: true + guid: true, }, token: { type: String, guid: { - version: ['uuidv4'] - } + version: ['uuidv4'], + }, }, initials: { type: String, upperCase: true, - maxLength: 4 + maxLength: 4, }, gender: { type: String, - nullable: true + nullable: true, }, password: String, passwordConfirmation: { type: String, - equal: { attr: 'password' } + equal: { attr: 'password' }, }, greet: { type: String, required: true, - equal: ['Mr', 'Ms', 'Mrs', 'Miss', { attr: 'greetDesc' }] + equal: ['Mr', 'Ms', 'Mrs', 'Miss', { attr: 'greetDesc' }], }, - greetDesc: String -})(class User { - getFullGreet() { - return `${this.greet} ${this.initials}`; + greetDesc: String, +})( + class User { + getFullGreet() { + return `${this.greet} ${this.initials}`; + } } -}); +); ``` diff --git a/docs/validation/validate-raw-data.md b/docs/validation/validate-raw-data.md index 53f5313..e51b6a9 100644 --- a/docs/validation/validate-raw-data.md +++ b/docs/validation/validate-raw-data.md @@ -6,17 +6,17 @@ In addition to the _instance_ `validate()` method, Structure also adds a _static const User = attributes({ name: { type: String, - minLength: 10 + minLength: 10, }, age: { type: Number, - required: true - } -})(class User { }); + required: true, + }, +})(class User {}); // Using a raw object const rawData = { - name: 'John' + name: 'John', }; const { valid, errors } = User.validate(rawData); @@ -24,14 +24,14 @@ const { valid, errors } = User.validate(rawData); valid; // false errors; /* [ - { message: '"name" length must be at least 10 characters long', path: 'name' }, - { message: '"age" is required', path: 'age' } + { message: '"name" length must be at least 10 characters long', path: ['name'] }, + { message: '"age" is required', path: ['age'] } ] */ // Using a structure instance const user = new User({ - name: 'Some long name' + name: 'Some long name', }); const validation = User.validate(user); @@ -39,7 +39,7 @@ const validation = User.validate(user); validation.valid; // false validation.errors; /* [ - { message: '"age" is required', path: 'age' } + { message: '"age" is required', path: ['age'] } ] */ ``` diff --git a/lerna.json b/lerna.json new file mode 100644 index 0000000..7ad1a7c --- /dev/null +++ b/lerna.json @@ -0,0 +1,6 @@ +{ + "packages": ["packages/*"], + "version": "2.0.0", + "npmClient": "yarn", + "useWorkspaces": true +} diff --git a/package.json b/package.json index cd57185..a207c84 100644 --- a/package.json +++ b/package.json @@ -1,73 +1,28 @@ { - "name": "structure", - "version": "1.8.0", - "description": "A simple schema/attributes library built on top of modern JavaScript", - "main": "src/index.js", - "browser": "dist/structure.js", - "files": [ - "dist", - "src" - ], - "engines": { - "node": ">=6" - }, - "homepage": "https://structure.js.org/", - "repository": "https://github.com/talyssonoc/structure", - "bugs": "https://github.com/talyssonoc/structure/issues", - "author": "Talysson ", - "contributors": [ - "Fernando ", - "Wender Freese " - ], - "publishConfig": { - "registry": "https://registry.npmjs.org/" - }, "license": "MIT", - "keywords": [ - "entity", - "model", - "domain" + "private": true, + "workspaces": [ + "packages/*" ], "scripts": { - "test": "mocha", - "test:browser": "karma start test/karma.conf.js", - "build": "webpack", - "coverage": "istanbul cover --report html --report lcov node_modules/mocha/bin/_mocha", - "lint": "eslint {src,test,benchmark}/**/*.js", - "benchmark": "node benchmark/benchmark.js", - "prepublish": "npm run build", - "coveralls": "npm run coverage && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage", - "format": "prettier --write {src,test}/**/*.js" - }, - "dependencies": { - "joi": "^10.2.0", - "lodash": "^4.16.4" + "build": "lerna run build --stream", + "test": "lerna run test --stream -- --colors", + "test:browser:build": "lerna run test:browser:build --stream -- --colors", + "test:browser:run": "lerna run test:browser:run --stream -- --colors", + "test:browser": "lerna run test:browser --stream -- --colors", + "coverage": "lerna run coverage --stream -- --colors", + "coveralls": "lerna run coveralls --stream", + "lint": "lerna run lint --stream", + "format": "lerna run format --stream", + "benchmark": "node benchmark/benchmark.js" }, "devDependencies": { - "babel": "^6.5.2", - "babel-core": "^6.18.2", - "babel-loader": "^6.2.8", - "babel-polyfill": "^6.16.0", - "babel-preset-es2015": "^6.18.0", "benchmark": "^2.1.2", - "chai": "^4.1.2", - "coveralls": "^2.11.15", - "eslint": "^4.19.1", - "eslint-config-prettier": "^6.1.0", - "eslint-plugin-mocha": "^5.0.0", - "istanbul": "^0.4.5", - "joi-browser": "^10.0.6", - "karma": "^1.3.0", - "karma-chrome-launcher": "^2.0.0", - "karma-firefox-launcher": "^1.0.0", - "karma-mocha": "^1.3.0", - "karma-mocha-reporter": "^2.2.1", - "karma-sourcemap-loader": "^0.3.7", - "karma-webpack": "^2.0.1", - "mocha": "^3.1.0", - "prettier": "^1.18.2", - "proxy-polyfill": "^0.1.6", - "sinon": "^7.2.4", - "webpack": "^1.13.3" + "eslint": "^6.4.0", + "eslint-config-prettier": "^6.3.0", + "eslint-plugin-jest": "^23.8.2", + "jest": "^25.1.0", + "lerna": "^3.18.1", + "prettier": "^1.18.2" } } diff --git a/packages/jest-structure/.eslintrc.js b/packages/jest-structure/.eslintrc.js new file mode 100644 index 0000000..b7b711a --- /dev/null +++ b/packages/jest-structure/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: [require.resolve('../../.eslintrc')], +}; diff --git a/packages/jest-structure/.gitignore b/packages/jest-structure/.gitignore new file mode 100644 index 0000000..6bd5bd7 --- /dev/null +++ b/packages/jest-structure/.gitignore @@ -0,0 +1 @@ +distTest/ diff --git a/packages/jest-structure/.prettierrc.js b/packages/jest-structure/.prettierrc.js new file mode 100644 index 0000000..f004026 --- /dev/null +++ b/packages/jest-structure/.prettierrc.js @@ -0,0 +1 @@ +module.exports = require('../../.prettierrc.json'); diff --git a/packages/jest-structure/README.md b/packages/jest-structure/README.md new file mode 100644 index 0000000..6bdad70 --- /dev/null +++ b/packages/jest-structure/README.md @@ -0,0 +1,162 @@ +# jest-structure + +Custom [Jest](https://www.npmjs.com/package/jest) matchers to test [Structure](https://www.npmjs.com/package/structure) instances. + +## Example usage + +```js +expect(user).toBeValidStructure(); + +expect(user).toBeInvalidStructure(); + +expect(user).toHaveInvalidAttribute(['name']); + +expect(user).toHaveInvalidAttribute(['name'], ['"name" is required']); + +expect(user).toHaveInvalidAttribute(['name'], expect.arrayContaining(['"name" is required'])); + +expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: expect.arrayContaining(['"name" is required']) }, + { + path: ['age'], + messages: ['"age" must be larger than or equal to 2', '"age" must be a positive number'], + }, +]); +``` + +## Installation + +jest-structure is available in npm, so you can install it with npm or yarn as a development dependency: + +```sh +npm install --save-dev jest-structure + +# or + +yarn --dev add jest-structure +``` + +## Setup + +After installing, you need to tell Jest to use jest-structure, this can be done in two ways: + +1. By importing and manually adding it to Jest (in a [setup file](https://jestjs.io/docs/en/configuration#setupfilesafterenv-array) or directly in the top of your test file): + +```js +import jestStructure from 'jest-structure'; + +expect.extend(jestStructure); +``` + +2. By allowing jest-structure to add itself to Jest matchers: + +```js +import 'jest-structure/extend-expect'; +``` + +## Matchers + +### `toBeValidStructure()` + +This matcher passes if the structure is _valid_: + +```js +const User = attributes({ + name: { type: String, required: true }, +})(class User {}); + +const validUser = new User({ name: 'Me' }); + +expect(validUser).toBeValidStructure(); // passes + +const invalidUser = new User(); + +expect(invalidUser).toBeValidStructure(); // fails +``` + +### `toBeInvalidStructure()` + +This matcher passes if the structure is _invalid_: + +```js +const User = attributes({ + name: { type: String, required: true }, +})(class User {}); + +const invalidUser = new User(); + +expect(invalidUser).toBeInvalidStructure(); // passes + +const validUser = new User({ name: 'Me' }); + +expect(validUser).toBeInvalidStructure(); // fails +``` + +### `toHaveInvalidAttribute(path, messages)` + +This matcher allows you to assert that a _single attribute_ of the structure is invalid, optionally passing the array of error messages for that attribute: + +```js +const User = attributes({ + name: { type: String, required: true }, + age: { type: Number, required: true }, +})(class User {}); + +const user = new User({ age: 42 }); + +// passes, because name is invalid +expect(user).toHaveInvalidAttribute(['name']); + +// fails, because age is valid +expect(user).toHaveInvalidAttribute(['age']); + +// passes, because name is invalid with this message +expect(user).toHaveInvalidAttribute(['name'], ['"name" is required']); + +// fails, because name is invalid but not with this message +expect(user).toHaveInvalidAttribute(['name'], ['"name" is not cool']); + +// passes. Notice that you can even use arrayContaining to check for a subset of the errros +expect(user).toHaveInvalidAttribute(['name'], expect.arrayContaining(['"name" is required'])); + +// passes. And stringContaining can be used as well +expect(user).toHaveInvalidAttribute(['name'], [expect.stringContaining('required')]); +``` + +### `toHaveInvalidAttributes([ { path, messages } ])` + +This matcher allows you to assert that _multiple attributes_ of the structure are invalid, optionally passing the array of error messages for each attribute: + +```js +const User = attributes({ + name: { type: String, required: true }, + age: { type: Number, required: true }, +})(class User {}); + +const user = new User({ age: 42 }); + +// passes, because name is invalid +expect(user).toHaveInvalidAttributes([{ path: ['name'] }]); + +// fails, because age is valid +expect(user).toHaveInvalidAttributes([{ path: ['age'] }]); + +// fails, because name is invalid but age is valid +expect(user).toHaveInvalidAttributes([{ path: ['name'] }, { path: ['age'] }]); + +// passes, because name is invalid with this message +expect(user).toHaveInvalidAttributes([{ path: ['name'], messages: ['"name" is required'] }]); + +// fails, because name is invalid but not with this message +expect(user).toHaveInvalidAttributes([{ path: ['name'], messages: ['"name" is not cool'] }]); + +// passes. Notice that you can even use arrayContaining to check for a subset of the errros +expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: expect.arrayContaining(['"name" is required']) }, +]); + +// passes. And stringContaining can be used as well +expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: [expect.stringContaining('required')] }, +]); +``` diff --git a/packages/jest-structure/extend-expect.js b/packages/jest-structure/extend-expect.js new file mode 100644 index 0000000..3bd76a6 --- /dev/null +++ b/packages/jest-structure/extend-expect.js @@ -0,0 +1 @@ +expect.extend(require('./')); diff --git a/packages/jest-structure/index.js b/packages/jest-structure/index.js new file mode 100644 index 0000000..6583013 --- /dev/null +++ b/packages/jest-structure/index.js @@ -0,0 +1,6 @@ +module.exports = { + toBeValidStructure: require('./src/assertions/toBeValidStructure'), + toBeInvalidStructure: require('./src/assertions/toBeInvalidStructure'), + toHaveInvalidAttribute: require('./src/assertions/toHaveInvalidAttribute'), + toHaveInvalidAttributes: require('./src/assertions/toHaveInvalidAttributes'), +}; diff --git a/packages/jest-structure/license.md b/packages/jest-structure/license.md new file mode 100644 index 0000000..ae4d6d0 --- /dev/null +++ b/packages/jest-structure/license.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 jest-tructure + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/jest-structure/package.json b/packages/jest-structure/package.json new file mode 100644 index 0000000..488e7d7 --- /dev/null +++ b/packages/jest-structure/package.json @@ -0,0 +1,24 @@ +{ + "name": "jest-structure", + "version": "2.0.0", + "description": "Jest assertions to use with Structure", + "main": "index.js", + "author": "Talysson ", + "license": "MIT", + "scripts": { + "test": "jest" + }, + "files": [ + "src" + ], + "engines": { + "node": ">=10.13.0" + }, + "devDependencies": { + "structure": "2.0.0" + }, + "peerDependencies": { + "jest": "^25.1.0" + }, + "dependencies": {} +} diff --git a/packages/jest-structure/src/assertions/toBeInvalidStructure.js b/packages/jest-structure/src/assertions/toBeInvalidStructure.js new file mode 100644 index 0000000..824bbbf --- /dev/null +++ b/packages/jest-structure/src/assertions/toBeInvalidStructure.js @@ -0,0 +1,7 @@ +const createValidityAssertion = require('../lib/validityAssertion'); + +module.exports = createValidityAssertion({ + pass: (valid) => !valid, + passName: 'invalid', + failName: 'valid', +}); diff --git a/packages/jest-structure/src/assertions/toBeValidStructure.js b/packages/jest-structure/src/assertions/toBeValidStructure.js new file mode 100644 index 0000000..be2db4b --- /dev/null +++ b/packages/jest-structure/src/assertions/toBeValidStructure.js @@ -0,0 +1,7 @@ +const createValidityAssertion = require('../lib/validityAssertion'); + +module.exports = createValidityAssertion({ + pass: (valid) => valid, + passName: 'valid', + failName: 'invalid', +}); diff --git a/packages/jest-structure/src/assertions/toHaveInvalidAttribute.js b/packages/jest-structure/src/assertions/toHaveInvalidAttribute.js new file mode 100644 index 0000000..ae24438 --- /dev/null +++ b/packages/jest-structure/src/assertions/toHaveInvalidAttribute.js @@ -0,0 +1,68 @@ +const { sortMessagesByExpected } = require('../lib/sorting'); +const { isValidPath } = require('../lib/attributePath'); +const { failInvalidUsage, failNoNegative, failWrongValidity } = require('../lib/errors'); +const matcherName = 'toHaveInvalidAttribute'; +const exampleName = 'structure'; +const attributePathHint = 'attributePath'; +const errorMessagesHint = '[errorMessages]'; + +module.exports = function toHaveInvalidAttribute(structure, attributePath, expectedErrorMessages) { + if (this.isNot) { + return failNoNegative(matcherName); + } + + if (!isValidPath(attributePath)) { + return failInvalidUsage( + matcherName, + usageHint(this), + 'must not be called without the attribute path' + ); + } + + const { valid, errors } = structure.validate(); + + if (valid) { + return failWrongValidity({ + pass: false, + passName: 'invalid', + failName: 'valid', + context: this, + }); + } + + const attributeErrors = errors.filter((error) => this.equals(error.path, attributePath)); + + const joinedAttributeName = attributePath.join('.'); + + if (isExpectedAttributeValid(expectedErrorMessages, attributeErrors)) { + return { + pass: Boolean(attributeErrors.length), + message: () => + `Expected: ${joinedAttributeName} to be ${this.utils.EXPECTED_COLOR('invalid')}\n` + + `Received: ${joinedAttributeName} is ${this.utils.RECEIVED_COLOR('valid')}`, + }; + } + + const validationErrorMessages = attributeErrors.map((error) => error.message); + const errorMessages = sortMessagesByExpected(validationErrorMessages, expectedErrorMessages); + + return { + pass: this.equals(errorMessages, expectedErrorMessages), + message: () => + this.utils.printDiffOrStringify( + expectedErrorMessages, + errorMessages, + `Expected ${joinedAttributeName} error messages`, + `Received ${joinedAttributeName} error messages`, + this.expand + ), + }; +}; + +const usageHint = (context) => + context.utils.matcherHint(matcherName, exampleName, attributePathHint, { + secondArgument: errorMessagesHint, + }); + +const isExpectedAttributeValid = (expectedErrorMessages, attributeErrors) => + !(expectedErrorMessages && attributeErrors.length); diff --git a/packages/jest-structure/src/assertions/toHaveInvalidAttributes.js b/packages/jest-structure/src/assertions/toHaveInvalidAttributes.js new file mode 100644 index 0000000..e149ecf --- /dev/null +++ b/packages/jest-structure/src/assertions/toHaveInvalidAttributes.js @@ -0,0 +1,61 @@ +const { sortErrorsByExpected } = require('../lib/sorting'); +const { areExpectedErrorsPathsValid } = require('../lib/attributePath'); +const { failInvalidUsage, failNoNegative, failWrongValidity } = require('../lib/errors'); +const matcherName = 'toHaveInvalidAttributes'; +const exampleName = 'structure'; +const expectedErrorsHint = '[{ path (required), messages (optional) }]'; + +module.exports = function toHaveInvalidAttributes(structure, expectedErrors) { + if (this.isNot) { + return failNoNegative(matcherName); + } + + if (!areExpectedErrorsPresent(expectedErrors)) { + return failInvalidUsage( + matcherName, + usageHint(this), + 'must not be called without the expected errros' + ); + } + + const { valid, errors } = structure.validate(); + + if (valid) { + return failWrongValidity({ + pass: false, + passName: 'invalid', + failName: 'valid', + context: this, + }); + } + + if (!areExpectedErrorsPathsValid(expectedErrors)) { + return failNoPath(this); + } + + const errorsForComparison = sortErrorsByExpected(errors, expectedErrors, this); + + return { + pass: this.equals(errorsForComparison, expectedErrors), + message: () => + this.utils.printDiffOrStringify( + expectedErrors, + errorsForComparison, + 'Expected errors', + 'Received errors', + this.expand + ), + }; +}; + +const areExpectedErrorsPresent = (expectedErrors) => expectedErrors && expectedErrors.length; + +const usageHint = (context) => + context.utils.matcherHint(matcherName, exampleName, expectedErrorsHint); + +const failNoPath = (context) => ({ + pass: false, + message: () => + `${matcherName} must not be called without the attribute paths\n` + + `Example: ${usageHint(context)}`, +}); diff --git a/packages/jest-structure/src/lib/attributePath.js b/packages/jest-structure/src/lib/attributePath.js new file mode 100644 index 0000000..7836b6b --- /dev/null +++ b/packages/jest-structure/src/lib/attributePath.js @@ -0,0 +1,20 @@ +const isValidPath = (path) => Boolean(path && path.length); + +const areExpectedErrorsPathsValid = (expectedErrors) => expectedErrors.every(errorHasPath); +const errorHasPath = (error) => isValidPath(error.path); + +const groupByPath = (errors, context) => + errors.reduce((grouped, error) => { + const group = grouped.find((group) => context.equals(group.path, error.path)); + + if (group) { + group.messages.push(error.message); + return grouped; + } + + const newGroup = { path: error.path, messages: [error.message] }; + + return [...grouped, newGroup]; + }, []); + +module.exports = { isValidPath, areExpectedErrorsPathsValid, groupByPath }; diff --git a/packages/jest-structure/src/lib/errors.js b/packages/jest-structure/src/lib/errors.js new file mode 100644 index 0000000..6f069b2 --- /dev/null +++ b/packages/jest-structure/src/lib/errors.js @@ -0,0 +1,16 @@ +module.exports = { + failNoNegative: (matcherName) => ({ + pass: true, // it has to be true because it's using .not + message: () => `${matcherName} must not be used with .not`, + }), + failWrongValidity: ({ pass, passName, failName, context }) => ({ + pass, + message: () => + `Expected: to be ${context.utils.EXPECTED_COLOR(context.isNot ? failName : passName)}\n` + + `Received: is ${context.utils.RECEIVED_COLOR(context.isNot ? passName : failName)}`, + }), + failInvalidUsage: (matcherName, usageHint, message) => ({ + pass: false, + message: () => `${matcherName} ${message}\n` + `Example: ${usageHint}`, + }), +}; diff --git a/packages/jest-structure/src/lib/sorting.js b/packages/jest-structure/src/lib/sorting.js new file mode 100644 index 0000000..dc861dc --- /dev/null +++ b/packages/jest-structure/src/lib/sorting.js @@ -0,0 +1,41 @@ +const { groupByPath } = require('./attributePath'); + +function sortMessagesByExpected(errorMessages, expectedErrorMessages) { + expectedErrorMessages = expectedErrorMessages.sample || expectedErrorMessages; + + const equalMessages = expectedErrorMessages.filter((message) => errorMessages.includes(message)); + const differentMessages = errorMessages.filter( + (message) => !expectedErrorMessages.includes(message) + ); + + return [...equalMessages, ...differentMessages]; +} + +function sortErrorsByExpected(errors, expectedErrors, context) { + const groupedErrors = groupByPath(errors, context); + + const equalErrors = expectedErrors + .filter((error) => + groupedErrors.find((groupedError) => context.equals(groupedError.path, error.path)) + ) + .map((expectedError) => { + const error = groupedErrors.find((error) => context.equals(expectedError.path, error.path)); + + if (expectedError.messages) { + return { + ...error, + messages: sortMessagesByExpected(error.messages, expectedError.messages), + }; + } + + return { path: error.path }; + }); + + const differentErrors = groupedErrors.filter( + (groupedError) => !expectedErrors.find((error) => context.equals(groupedError.path, error.path)) + ); + + return [...equalErrors, ...differentErrors]; +} + +module.exports = { sortErrorsByExpected, sortMessagesByExpected }; diff --git a/packages/jest-structure/src/lib/validityAssertion.js b/packages/jest-structure/src/lib/validityAssertion.js new file mode 100644 index 0000000..c4fe034 --- /dev/null +++ b/packages/jest-structure/src/lib/validityAssertion.js @@ -0,0 +1,16 @@ +const { failWrongValidity } = require('../lib/errors'); + +module.exports = function createValidityAssertion({ pass, passName, failName }) { + return function(structure, expected) { + this.utils.ensureNoExpected(expected); + + const { valid } = structure.validate(); + + return failWrongValidity({ + pass: pass(valid), + passName, + failName, + context: this, + }); + }; +}; diff --git a/packages/jest-structure/test/__snapshots__/jest-structure.test.js.snap b/packages/jest-structure/test/__snapshots__/jest-structure.test.js.snap new file mode 100644 index 0000000..1c51452 --- /dev/null +++ b/packages/jest-structure/test/__snapshots__/jest-structure.test.js.snap @@ -0,0 +1,358 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`jest-structure toBeInvalid .not fails for invalid structures 1`] = ` +"Expected: to be valid +Received: is invalid" +`; + +exports[`jest-structure toBeInvalid fails for valid structures 1`] = ` +"Expected: to be invalid +Received: is valid" +`; + +exports[`jest-structure toBeValid .not fails for valid structures 1`] = ` +"Expected: to be invalid +Received: is valid" +`; + +exports[`jest-structure toBeValid fails for invalid structures 1`] = ` +"Expected: to be valid +Received: is invalid" +`; + +exports[`jest-structure toHaveInvalidAttribute can not be called with empty attribute path 1`] = ` +"toHaveInvalidAttribute must not be called without the attribute path +Example: expect(structure).toHaveInvalidAttribute(attributePath, [errorMessages])" +`; + +exports[`jest-structure toHaveInvalidAttribute can not be called without attribute path 1`] = ` +"toHaveInvalidAttribute must not be called without the attribute path +Example: expect(structure).toHaveInvalidAttribute(attributePath, [errorMessages])" +`; + +exports[`jest-structure toHaveInvalidAttribute can not be used with .not 1`] = `"toHaveInvalidAttribute must not be used with .not"`; + +exports[`jest-structure toHaveInvalidAttribute when attribute path and error messages are passed fails for valid structures 1`] = ` +"Expected: to be invalid +Received: is valid" +`; + +exports[`jest-structure toHaveInvalidAttribute when attribute path and error messages are passed when the attribute is not the invalid one fails 1`] = ` +"Expected: age to be invalid +Received: age is valid" +`; + +exports[`jest-structure toHaveInvalidAttribute when attribute path and error messages are passed when the attribute is the only one invalid when the expected errors are a subset of the actual errors fails 1`] = ` +"- Expected name error messages - 0 ++ Received name error messages + 1 + + Array [ + \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", ++ \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", + ]" +`; + +exports[`jest-structure toHaveInvalidAttribute when attribute path and error messages are passed when the attribute is the only one invalid when the expected errors are a superset of the actual errors fails 1`] = ` +"- Expected name error messages - 1 ++ Received name error messages + 0 + + Array [ + \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", +- \\"\\\\\\"name\\\\\\" is not from this planet\\", + \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", + ]" +`; + +exports[`jest-structure toHaveInvalidAttribute when attribute path and error messages are passed when the attribute is the only one invalid when using arrayContaining when arrayContaining has an intersection with the errors + other different errors fails 1`] = ` +"Expected name error messages: ArrayContaining [\\"\\\\\\"name\\\\\\" is not from this planet\\", \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\"] +Received name error messages: [\\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\"]" +`; + +exports[`jest-structure toHaveInvalidAttribute when attribute path and error messages are passed when the attribute is the only one invalid when using arrayContaining when arrayContaining is a superset of the errors fails 1`] = ` +"Expected name error messages: ArrayContaining [\\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", \\"\\\\\\"name\\\\\\" is not from this planet\\", \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\"] +Received name error messages: [\\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\"]" +`; + +exports[`jest-structure toHaveInvalidAttribute when only attribute path is passed fails for valid structures 1`] = ` +"Expected: to be invalid +Received: is valid" +`; + +exports[`jest-structure toHaveInvalidAttribute when only attribute path is passed when the attribute is not the invalid one fails 1`] = ` +"Expected: name to be invalid +Received: name is valid" +`; + +exports[`jest-structure toHaveInvalidAttributes can not be called with empty array of expected errors 1`] = ` +"toHaveInvalidAttributes must not be called without the expected errros +Example: expect(structure).toHaveInvalidAttributes([{ path (required), messages (optional) }])" +`; + +exports[`jest-structure toHaveInvalidAttributes can not be called with no path 1`] = ` +"toHaveInvalidAttributes must not be called without the attribute paths +Example: expect(structure).toHaveInvalidAttributes([{ path (required), messages (optional) }])" +`; + +exports[`jest-structure toHaveInvalidAttributes can not be called without the array of expected errors 1`] = ` +"toHaveInvalidAttributes must not be called without the expected errros +Example: expect(structure).toHaveInvalidAttributes([{ path (required), messages (optional) }])" +`; + +exports[`jest-structure toHaveInvalidAttributes can not be used with .not 1`] = `"toHaveInvalidAttributes must not be used with .not"`; + +exports[`jest-structure toHaveInvalidAttributes when messages are passed only for some fails for valid structures 1`] = ` +"Expected: to be invalid +Received: is valid" +`; + +exports[`jest-structure toHaveInvalidAttributes when messages are passed only for some when attribute is invalid but messages array is empty fails 1`] = ` +"- Expected errors - 1 ++ Received errors + 4 + +@@ -1,8 +1,11 @@ + Array [ + Object { +- \\"messages\\": Array [], ++ \\"messages\\": Array [ ++ \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", ++ \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", ++ ], + \\"path\\": Array [ + \\"name\\", + ], + }, + Object {" +`; + +exports[`jest-structure toHaveInvalidAttributes when messages are passed only for some when there are missing attributes and messages fails 1`] = ` +"- Expected errors - 0 ++ Received errors + 10 + + Array [ + Object { + \\"messages\\": Array [ + \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", ++ \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", + ], + \\"path\\": Array [ + \\"name\\", + ], + }, + Object { + \\"path\\": Array [ + \\"age\\", ++ ], ++ }, ++ Object { ++ \\"messages\\": Array [ ++ \\"\\\\\\"favoriteBook.name\\\\\\" is required\\", ++ ], ++ \\"path\\": Array [ ++ \\"favoriteBook\\", ++ \\"name\\", + ], + }, + ]" +`; + +exports[`jest-structure toHaveInvalidAttributes when messages are passed only for some when there are missing attributes fails 1`] = ` +"- Expected errors - 0 ++ Received errors + 8 + +@@ -2,6 +2,14 @@ + Object { + \\"path\\": Array [ + \\"name\\", + ], + }, ++ Object { ++ \\"messages\\": Array [ ++ \\"\\\\\\"age\\\\\\" must be a positive number\\", ++ ], ++ \\"path\\": Array [ ++ \\"age\\", ++ ], ++ }, + ]" +`; + +exports[`jest-structure toHaveInvalidAttributes when messages are passed only for some when there are missing messages fails 1`] = ` +"- Expected errors - 0 ++ Received errors + 1 + +@@ -1,9 +1,10 @@ + Array [ + Object { + \\"messages\\": Array [ + \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", ++ \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", + ], + \\"path\\": Array [ + \\"name\\", + ], + }," +`; + +exports[`jest-structure toHaveInvalidAttributes when only paths are passed fails for valid structures 1`] = ` +"Expected: to be invalid +Received: is valid" +`; + +exports[`jest-structure toHaveInvalidAttributes when only paths are passed when none of the passed attributes are invalid fails 1`] = ` +"- Expected errors - 1 ++ Received errors + 5 + + Array [ + Object { ++ \\"messages\\": Array [ ++ \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", ++ \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", ++ ], + \\"path\\": Array [ +- \\"age\\", ++ \\"name\\", + ], + }, + ]" +`; + +exports[`jest-structure toHaveInvalidAttributes when only paths are passed when only some of the passed attributes are invalid fails 1`] = ` +"- Expected errors - 5 ++ Received errors + 0 + + Array [ + Object { + \\"path\\": Array [ +- \\"age\\", +- ], +- }, +- Object { +- \\"path\\": Array [ + \\"name\\", + ], + }, + ]" +`; + +exports[`jest-structure toHaveInvalidAttributes when paths and messages are passed fails for valid structures 1`] = ` +"Expected: to be invalid +Received: is valid" +`; + +exports[`jest-structure toHaveInvalidAttributes when paths and messages are passed when attribute is invalid but messages array is empty fails 1`] = ` +"- Expected errors - 1 ++ Received errors + 4 + + Array [ + Object { +- \\"messages\\": Array [], ++ \\"messages\\": Array [ ++ \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", ++ \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", ++ ], + \\"path\\": Array [ + \\"name\\", + ], + }, + ]" +`; + +exports[`jest-structure toHaveInvalidAttributes when paths and messages are passed when there are missing attributes and messages fails 1`] = ` +"- Expected errors - 0 ++ Received errors + 9 + + Array [ + Object { + \\"messages\\": Array [ + \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", ++ \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", + ], + \\"path\\": Array [ + \\"name\\", ++ ], ++ }, ++ Object { ++ \\"messages\\": Array [ ++ \\"\\\\\\"age\\\\\\" must be a positive number\\", ++ ], ++ \\"path\\": Array [ ++ \\"age\\", + ], + }, + ]" +`; + +exports[`jest-structure toHaveInvalidAttributes when paths and messages are passed when there are missing attributes fails 1`] = ` +"- Expected errors - 0 ++ Received errors + 8 + +@@ -5,6 +5,14 @@ + ], + \\"path\\": Array [ + \\"name\\", + ], + }, ++ Object { ++ \\"messages\\": Array [ ++ \\"\\\\\\"age\\\\\\" must be a positive number\\", ++ ], ++ \\"path\\": Array [ ++ \\"age\\", ++ ], ++ }, + ]" +`; + +exports[`jest-structure toHaveInvalidAttributes when paths and messages are passed when there are missing messages fails 1`] = ` +"- Expected errors - 0 ++ Received errors + 1 + +@@ -1,9 +1,10 @@ + Array [ + Object { + \\"messages\\": Array [ + \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", ++ \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", + ], + \\"path\\": Array [ + \\"name\\", + ], + }," +`; + +exports[`jest-structure toHaveInvalidAttributes when using arrayContaining when arrayContaining has an intersection with the errors + other different errors fails 1`] = ` +"- Expected errors - 2 ++ Received errors + 2 + +@@ -1,10 +1,10 @@ + Array [ + Object { +- \\"messages\\": ArrayContaining [ +- \\"\\\\\\"name\\\\\\" is not from this planet\\", ++ \\"messages\\": Array [ + \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", ++ \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", + ], + \\"path\\": Array [ + \\"name\\", + ], + }," +`; + +exports[`jest-structure toHaveInvalidAttributes when using arrayContaining when arrayContaining is a superset of the errors fails 1`] = ` +"- Expected errors - 2 ++ Received errors + 1 + +@@ -1,10 +1,9 @@ + Array [ + Object { +- \\"messages\\": ArrayContaining [ ++ \\"messages\\": Array [ + \\"\\\\\\"name\\\\\\" must only contain alpha-numeric characters\\", +- \\"\\\\\\"name\\\\\\" is not from this planet\\", + \\"\\\\\\"name\\\\\\" length must be at least 2 characters long\\", + ], + \\"path\\": Array [ + \\"name\\", + ]," +`; diff --git a/packages/jest-structure/test/jest-structure.test.js b/packages/jest-structure/test/jest-structure.test.js new file mode 100644 index 0000000..4ca3aa2 --- /dev/null +++ b/packages/jest-structure/test/jest-structure.test.js @@ -0,0 +1,616 @@ +const { attributes } = require('structure'); +require('../extend-expect'); + +describe('jest-structure', () => { + let User; + + beforeEach(() => { + const Book = attributes({ + name: { + type: String, + required: true, + }, + })(class Book {}); + + User = attributes({ + name: { + type: String, + required: true, + minLength: 2, + alphanumeric: true, + }, + age: { + type: Number, + required: true, + positive: true, + }, + favoriteBook: Book, + })(class User {}); + }); + + describe('toBeValid', () => { + it('suceeds for valid structures', () => { + const user = new User({ name: 'abc', age: 42 }); + + expect(user).toBeValidStructure(); + }); + + it('fails for invalid structures', () => { + const user = new User(); + + expect(() => { + expect(user).toBeValidStructure(); + }).toThrowErrorMatchingSnapshot(); + }); + + describe('.not', () => { + it('succeeds for invalid structures', () => { + const user = new User(); + + expect(user).not.toBeValidStructure(); + }); + + it('fails for valid structures', () => { + const user = new User({ name: 'abc', age: 42 }); + + expect(() => { + expect(user).not.toBeValidStructure(); + }).toThrowErrorMatchingSnapshot(); + }); + }); + }); + + describe('toBeInvalid', () => { + it('suceeds for invalid structures', () => { + const user = new User(); + + expect(user).toBeInvalidStructure(); + }); + + it('fails for valid structures', () => { + const user = new User({ name: 'abc', age: 42 }); + + expect(() => { + expect(user).toBeInvalidStructure(); + }).toThrowErrorMatchingSnapshot(); + }); + + describe('.not', () => { + it('succeeds for valid structures', () => { + const user = new User({ name: 'abc', age: 42 }); + + expect(user).not.toBeInvalidStructure(); + }); + + it('fails for invalid structures', () => { + const user = new User(); + + expect(() => { + expect(user).not.toBeInvalidStructure(); + }).toThrowErrorMatchingSnapshot(); + }); + }); + }); + + describe('toHaveInvalidAttribute', () => { + it('can not be used with .not', () => { + const user = new User(); + + expect(() => { + expect(user).not.toHaveInvalidAttribute(['name']); + }).toThrowErrorMatchingSnapshot(); + }); + + it('can not be called without attribute path', () => { + const user = new User(); + + expect(() => { + expect(user).toHaveInvalidAttribute(); + }).toThrowErrorMatchingSnapshot(); + }); + + it('can not be called with empty attribute path', () => { + const user = new User(); + + expect(() => { + expect(user).toHaveInvalidAttribute([]); + }).toThrowErrorMatchingSnapshot(); + }); + + describe('when only attribute path is passed', () => { + it('fails for valid structures', () => { + const user = new User({ name: 'abc', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttribute(['name']); + }).toThrowErrorMatchingSnapshot(); + }); + + describe('when the attribute is the only one invalid', () => { + it('succeeds ', () => { + const user = new User({ age: 42 }); + + expect(user).toHaveInvalidAttribute(['name']); + }); + }); + + describe('when the attribute is not the only one invalid', () => { + it('succeeds ', () => { + const user = new User({}); + + expect(user).toHaveInvalidAttribute(['name']); + }); + }); + + describe('when the attribute is not the invalid one', () => { + it('fails ', () => { + const user = new User({ name: 'abc' }); + + expect(() => { + expect(user).toHaveInvalidAttribute(['name']); + }).toThrowErrorMatchingSnapshot(); + }); + }); + }); + + describe('when attribute path and error messages are passed', () => { + it('fails for valid structures', () => { + const user = new User({ name: 'abc', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttribute(['name'], ['nope']); + }).toThrowErrorMatchingSnapshot(); + }); + + describe('when the attribute is the only one invalid', () => { + describe('when the errors are passed the same order returned by validate()', () => { + it('succeeds', () => { + const user = new User({ name: '$', age: 42 }); + + expect(user).toHaveInvalidAttribute( + ['name'], + [ + '"name" length must be at least 2 characters long', + '"name" must only contain alpha-numeric characters', + ] + ); + }); + }); + + describe('when the errors are passed in an order different from the returned by validate()', () => { + it('succeeds', () => { + const user = new User({ name: '$', age: 42 }); + + expect(user).toHaveInvalidAttribute( + ['name'], + [ + '"name" must only contain alpha-numeric characters', + '"name" length must be at least 2 characters long', + ] + ); + }); + }); + + describe('when the expected errors are a subset of the actual errors', () => { + it('fails', () => { + const user = new User({ name: '$', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttribute( + ['name'], + ['"name" length must be at least 2 characters long'] + ); + }).toThrowErrorMatchingSnapshot(); + }); + }); + + describe('when the expected errors are a superset of the actual errors', () => { + it('fails', () => { + const user = new User({ name: '$', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttribute( + ['name'], + [ + '"name" must only contain alpha-numeric characters', + '"name" is not from this planet', + '"name" length must be at least 2 characters long', + ] + ); + }).toThrowErrorMatchingSnapshot(); + }); + }); + + describe('when using arrayContaining', () => { + describe('when arrayContaining is a subset of the errors', () => { + it('succeeds', () => { + const user = new User({ name: '$', age: 42 }); + + expect(user).toHaveInvalidAttribute( + ['name'], + expect.arrayContaining(['"name" length must be at least 2 characters long']) + ); + }); + }); + + describe('when arrayContaining is a superset of the errors', () => { + it('fails', () => { + const user = new User({ name: '$', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttribute( + ['name'], + expect.arrayContaining([ + '"name" must only contain alpha-numeric characters', + '"name" is not from this planet', + '"name" length must be at least 2 characters long', + ]) + ); + }).toThrowErrorMatchingSnapshot(); + }); + }); + + describe('when arrayContaining has an intersection with the errors + other different errors', () => { + it('fails', () => { + const user = new User({ name: '$', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttribute( + ['name'], + expect.arrayContaining([ + '"name" is not from this planet', + '"name" length must be at least 2 characters long', + ]) + ); + }).toThrowErrorMatchingSnapshot(); + }); + }); + }); + }); + + describe('when the attribute is not the only one invalid', () => { + it('succeeds ', () => { + const user = new User({}); + + expect(user).toHaveInvalidAttribute(['name'], ['"name" is required']); + }); + }); + + describe('when the attribute is not the invalid one', () => { + it('fails ', () => { + const user = new User({ age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttribute(['age'], ['"age" is wrong']); + }).toThrowErrorMatchingSnapshot(); + }); + }); + }); + }); + + describe('toHaveInvalidAttributes', () => { + it('can not be used with .not', () => { + const user = new User(); + + expect(() => { + expect(user).not.toHaveInvalidAttributes([]); + }).toThrowErrorMatchingSnapshot(); + }); + + it('can not be called without the array of expected errors', () => { + const user = new User(); + + expect(() => { + expect(user).toHaveInvalidAttributes(); + }).toThrowErrorMatchingSnapshot(); + }); + + it('can not be called with empty array of expected errors', () => { + const user = new User(); + + expect(() => { + expect(user).toHaveInvalidAttributes([]); + }).toThrowErrorMatchingSnapshot(); + }); + + it('can not be called with no path', () => { + const user = new User({ name: '$', age: -42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([{ path: [] }, { path: ['age'] }]); + }).toThrowErrorMatchingSnapshot(); + }); + + describe('when only paths are passed', () => { + it('fails for valid structures', () => { + const user = new User({ name: 'abc', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([{ path: ['name'] }]); + }).toThrowErrorMatchingSnapshot(); + }); + + describe('when all the passed attributes are invalid', () => { + describe('when attributes are passed in the same order returned by validate', () => { + it('succeeds', () => { + const user = new User({ name: '$', age: -42 }); + + expect(user).toHaveInvalidAttributes([{ path: ['name'] }, { path: ['age'] }]); + }); + }); + + describe('when attributes are passed in an order different from the returned by validate', () => { + it('succeeds', () => { + const user = new User({ name: '$', age: -42 }); + + expect(user).toHaveInvalidAttributes([{ path: ['age'] }, { path: ['name'] }]); + }); + }); + }); + + describe('when only some of the passed attributes are invalid', () => { + it('fails', () => { + const user = new User({ name: '$', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([{ path: ['age'] }, { path: ['name'] }]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + + describe('when none of the passed attributes are invalid', () => { + it('fails', () => { + const user = new User({ name: '$', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([{ path: ['age'] }]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + }); + + describe('when paths and messages are passed', () => { + it('fails for valid structures', () => { + const user = new User({ name: 'abc', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: ['something wrong is not right'] }, + ]); + }).toThrowErrorMatchingSnapshot(); + }); + + describe('when attribute is invalid and messages are right', () => { + describe('when messages are passed in the same order returned by validate', () => { + it('succeeds', () => { + const user = new User({ name: '$', age: 42 }); + + expect(user).toHaveInvalidAttributes([ + { + path: ['name'], + messages: [ + '"name" length must be at least 2 characters long', + '"name" must only contain alpha-numeric characters', + ], + }, + ]); + }); + }); + + describe('when messages are passed in a order different from the returned by validate', () => { + it('succeeds', () => { + const user = new User({ name: '$', age: 42 }); + + expect(user).toHaveInvalidAttributes([ + { + path: ['name'], + messages: [ + '"name" must only contain alpha-numeric characters', + '"name" length must be at least 2 characters long', + ], + }, + ]); + }); + }); + }); + + describe('when attribute is invalid but messages array is empty', () => { + it('fails', () => { + const user = new User({ name: '$', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([{ path: ['name'], messages: [] }]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + + describe('when there are missing attributes', () => { + it('fails', () => { + const user = new User({ name: 'A', age: -42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: ['"name" length must be at least 2 characters long'] }, + ]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + + describe('when there are missing messages', () => { + it('fails', () => { + const user = new User({ name: '$', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: ['"name" length must be at least 2 characters long'] }, + ]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + + describe('when there are missing attributes and messages', () => { + it('fails', () => { + const user = new User({ name: '$', age: -42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: ['"name" length must be at least 2 characters long'] }, + ]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + }); + + describe('when messages are passed only for some', () => { + it('fails for valid structures', () => { + const user = new User({ name: 'abc', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: ['something wrong is not right'] }, + { path: ['age'] }, + ]); + }).toThrowErrorMatchingSnapshot(); + }); + + describe('when attribute is invalid and messages are right', () => { + describe('when messages are passed in the same order returned by validate', () => { + it('succeeds', () => { + const user = new User({ name: '$', age: -42 }); + + expect(user).toHaveInvalidAttributes([ + { + path: ['name'], + messages: [ + '"name" length must be at least 2 characters long', + '"name" must only contain alpha-numeric characters', + ], + }, + { path: ['age'] }, + ]); + }); + }); + + describe('when messages are passed in a order different from the returned by validate', () => { + it('succeeds', () => { + const user = new User({ name: '$', age: -42 }); + + expect(user).toHaveInvalidAttributes([ + { + path: ['name'], + messages: [ + '"name" must only contain alpha-numeric characters', + '"name" length must be at least 2 characters long', + ], + }, + { path: ['age'] }, + ]); + }); + }); + }); + + describe('when attribute is invalid but messages array is empty', () => { + it('fails', () => { + const user = new User({ name: '$', age: -42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: [] }, + { path: ['age'] }, + ]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + + describe('when there are missing attributes', () => { + it('fails', () => { + const user = new User({ name: 'A', age: -42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([{ path: ['name'] }]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + + describe('when there are missing messages', () => { + it('fails', () => { + const user = new User({ name: '$', age: -42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: ['"name" length must be at least 2 characters long'] }, + { path: ['age'] }, + ]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + + describe('when there are missing attributes and messages', () => { + it('fails', () => { + const user = new User({ name: '$', age: -42, favoriteBook: {} }); + + expect(() => { + expect(user).toHaveInvalidAttributes([ + { path: ['name'], messages: ['"name" length must be at least 2 characters long'] }, + { path: ['age'] }, + ]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + }); + + describe('when using arrayContaining', () => { + describe('when arrayContaining is a subset of the errors', () => { + it('succeeds', () => { + const user = new User({ name: '$', age: 42 }); + + expect(user).toHaveInvalidAttributes([ + { + path: ['name'], + messages: expect.arrayContaining([ + '"name" length must be at least 2 characters long', + ]), + }, + ]); + }); + }); + + describe('when arrayContaining is a superset of the errors', () => { + it('fails', () => { + const user = new User({ name: '$', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([ + { + path: ['name'], + messages: expect.arrayContaining([ + '"name" must only contain alpha-numeric characters', + '"name" is not from this planet', + '"name" length must be at least 2 characters long', + ]), + }, + ]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + + describe('when arrayContaining has an intersection with the errors + other different errors', () => { + it('fails', () => { + const user = new User({ name: '$', age: 42 }); + + expect(() => { + expect(user).toHaveInvalidAttributes([ + { + path: ['name'], + messages: expect.arrayContaining([ + '"name" is not from this planet', + '"name" length must be at least 2 characters long', + ]), + }, + ]); + }).toThrowErrorMatchingSnapshot(); + }); + }); + }); + }); +}); diff --git a/packages/structure/.eslintrc.js b/packages/structure/.eslintrc.js new file mode 100644 index 0000000..b7b711a --- /dev/null +++ b/packages/structure/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: [require.resolve('../../.eslintrc')], +}; diff --git a/packages/structure/.gitignore b/packages/structure/.gitignore new file mode 100644 index 0000000..6bd5bd7 --- /dev/null +++ b/packages/structure/.gitignore @@ -0,0 +1 @@ +distTest/ diff --git a/packages/structure/.prettierignore b/packages/structure/.prettierignore new file mode 100644 index 0000000..1521c8b --- /dev/null +++ b/packages/structure/.prettierignore @@ -0,0 +1 @@ +dist diff --git a/packages/structure/.prettierrc.js b/packages/structure/.prettierrc.js new file mode 100644 index 0000000..f004026 --- /dev/null +++ b/packages/structure/.prettierrc.js @@ -0,0 +1 @@ +module.exports = require('../../.prettierrc.json'); diff --git a/packages/structure/README.md b/packages/structure/README.md new file mode 100644 index 0000000..02eefbe --- /dev/null +++ b/packages/structure/README.md @@ -0,0 +1,61 @@ +# + +## A simple schema/attributes library built on top of modern JavaScript + +## [![npm](https://img.shields.io/npm/v/structure.svg?style=flat)](https://www.npmjs.com/package/structure) [![Build Status](https://travis-ci.org/talyssonoc/structure.svg?branch=master)](https://travis-ci.org/talyssonoc/structure) [![Coverage Status](https://coveralls.io/repos/github/talyssonoc/structure/badge.svg?branch=master)](https://coveralls.io/github/talyssonoc/structure?branch=master) [![Code Climate](https://codeclimate.com/github/talyssonoc/structure/badges/gpa.svg)](https://codeclimate.com/github/talyssonoc/structure) [![JS.ORG](https://img.shields.io/badge/js.org-structure-ffb400.svg?style=flat)](https://js.org/) + +Structure provides a simple interface which allows you to add attributes to your ES6 classes based on a schema, with validations and type coercion. + +## Use cases + +You can use Structure for a lot of different cases, including: + +- Domain entities and value objects +- Model business rules +- Validation and coercion of request data +- Map pure objects and JSON to your application classes +- Add attributes to classes that you can't change the class hierarchy + +What Structure is **not**: + +- It's not a database abstraction +- It's not a Model of a MVC framework +- It's not an attempt to simulate classic inheritance in JavaScript + +## [Documentation](https://structure.js.org/) + +## Example usage + +For each attribute on your schema, a getter and a setter will be created into the given class. It'll also auto-assign those attributes passed to the constructor. + +```js +const { attributes } = require('structure'); + +const User = attributes({ + name: String, + age: { + type: Number, + default: 18, + }, + birthday: Date, +})( + class User { + greet() { + return `Hello ${this.name}`; + } + } +); + +/* The attributes "wraps" the Class, still providing access to its methods: */ + +const user = new User({ + name: 'John Foo', +}); + +user.name; // 'John Foo' +user.greet(); // 'Hello John Foo' +``` + +## [Contributing](../../contributing.md) + +## [LICENSE](../../license.md) diff --git a/packages/structure/dist/structure.js b/packages/structure/dist/structure.js new file mode 100644 index 0000000..cf07170 --- /dev/null +++ b/packages/structure/dist/structure.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("lodash"),require("@hapi/joi")):"function"==typeof define&&define.amd?define("Structure",["lodash","joi"],e):"object"==typeof exports?exports.Structure=e(require("lodash"),require("@hapi/joi")):t.Structure=e(t._,t.joi)}(window,(function(t,e){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=8)}([function(e,n){e.exports=t},function(t,n){t.exports=e},function(t,e){t.exports={SCHEMA:Symbol("schema"),ATTRIBUTES:Symbol("attributes"),DEFAULT_ACCESSOR:Symbol("defaultAccessor")}},function(t,e,n){function r(t){return function(t){if(Array.isArray(t)){for(var e=0,n=new Array(t.length);e1&&void 0!==arguments[1]?arguments[1]:{};if("object"!==r(e))throw u.classAsSecondParam(e);return function(n){var r=i.for({wrappedClass:n,attributeDefinitions:t,options:e}),u=new Proxy(n,{construct:function(t,e,n){var i=Reflect.construct(t,e,n),o=Object.assign({},e[0]);return r.initializeInstance(i,{attributes:o})}});return o.addTo(r,u),u}}},function(t,e,n){function r(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.strict,i=Object.assign({},this.attributes,{},e);return r?t.buildStrict(i):new t(i)}}}}])})); \ No newline at end of file diff --git a/packages/structure/license.md b/packages/structure/license.md new file mode 100644 index 0000000..5d85a75 --- /dev/null +++ b/packages/structure/license.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Structure + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/structure/package.json b/packages/structure/package.json new file mode 100644 index 0000000..8e4590b --- /dev/null +++ b/packages/structure/package.json @@ -0,0 +1,59 @@ +{ + "name": "structure", + "version": "2.0.0", + "description": "A simple schema/attributes library built on top of modern JavaScript", + "main": "src/index.js", + "browser": "dist/structure.js", + "files": [ + "dist", + "src" + ], + "engines": { + "node": ">=10.13.0" + }, + "homepage": "https://structure.js.org/", + "repository": "https://github.com/talyssonoc/structure", + "bugs": "https://github.com/talyssonoc/structure/issues", + "author": "Talysson ", + "contributors": [ + "Fernando ", + "Wender Freese " + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "license": "MIT", + "keywords": [ + "entity", + "model", + "domain" + ], + "scripts": { + "test": "jest --config=test/jest.node.js", + "test:browser:build": "webpack --config test/webpack.pretest.js", + "test:browser:run": "jest --config=test/jest.browser.js", + "test:browser": "yarn run test:browser:build && yarn run test:browser:run", + "coverage": "yarn test --coverage", + "build": "webpack", + "prepublish": "yarn run build", + "coveralls": "yarn run coverage --coverageReporters=text-lcov | coveralls", + "lint": "eslint {src,test}/**/*.js", + "format": "prettier --write {src,test}/**/*.js" + }, + "dependencies": { + "@hapi/joi": "^16.1.8", + "lodash": "^4.16.4" + }, + "devDependencies": { + "@babel/core": "^7.6.4", + "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/preset-env": "^7.6.3", + "@jest-runner/electron": "^2.0.2", + "babel-loader": "^8.0.6", + "coveralls": "^3.0.7", + "electron": "^8.1.1", + "jest-structure": "2.0.0", + "webpack": "^4.41.2", + "webpack-cli": "^3.3.9" + } +} diff --git a/packages/structure/src/attributes/index.js b/packages/structure/src/attributes/index.js new file mode 100644 index 0000000..c5619ec --- /dev/null +++ b/packages/structure/src/attributes/index.js @@ -0,0 +1,8 @@ +const { ATTRIBUTES } = require('../symbols'); + +exports.setInInstance = function setAttributesInInstance(instance, attributes) { + Object.defineProperty(instance, ATTRIBUTES, { + configurable: true, + value: attributes, + }); +}; diff --git a/packages/structure/src/attributesDecorator.js b/packages/structure/src/attributesDecorator.js new file mode 100644 index 0000000..f48204d --- /dev/null +++ b/packages/structure/src/attributesDecorator.js @@ -0,0 +1,33 @@ +const Schema = require('./schema'); +const Descriptors = require('./descriptors'); +const Errors = require('./errors'); + +module.exports = function attributes(attributeDefinitions, options = {}) { + if (typeof options !== 'object') { + throw Errors.classAsSecondParam(options); + } + + return function decorator(Class) { + const schema = Schema.for({ + wrappedClass: Class, + attributeDefinitions, + options, + }); + + const StructureClass = new Proxy(Class, { + construct(wrappedClass, constructorArgs, proxy) { + const instance = Reflect.construct(wrappedClass, constructorArgs, proxy); + + const passedAttributes = { ...constructorArgs[0] }; + + return schema.initializeInstance(instance, { + attributes: passedAttributes, + }); + }, + }); + + Descriptors.addTo(schema, StructureClass); + + return StructureClass; + }; +}; diff --git a/src/cloning/index.js b/packages/structure/src/cloning/index.js similarity index 53% rename from src/cloning/index.js rename to packages/structure/src/cloning/index.js index 891ede3..ad13c3f 100644 --- a/src/cloning/index.js +++ b/packages/structure/src/cloning/index.js @@ -1,12 +1,12 @@ -exports.buildCloneDescriptorFor = function buildCloneDescriptorFor( - StructureClass -) { +exports.for = function cloneFor(StructureClass) { return { - configurable: true, - value: function clone(overwrites = {}, options = {}) { + clone(overwrites = {}, options = {}) { const { strict } = options; - const newAttributes = Object.assign({}, this.attributes, overwrites); + const newAttributes = { + ...this.attributes, + ...overwrites, + }; let cloneInstance; diff --git a/packages/structure/src/coercion/coercion.js b/packages/structure/src/coercion/coercion.js new file mode 100644 index 0000000..e9d433f --- /dev/null +++ b/packages/structure/src/coercion/coercion.js @@ -0,0 +1,34 @@ +const { isFunction } = require('lodash'); + +exports.create = function createCoercionFor(coercion, attributeDefinition) { + return { + coerce(value) { + if (value === undefined) { + return; + } + + if (value === null) { + return getNullableValue(coercion, attributeDefinition); + } + + if (coercion.isCoerced(value, attributeDefinition)) { + return value; + } + + return coercion.coerce(value, attributeDefinition); + }, + }; +}; + +exports.disabled = { + coerce: (value) => value, +}; + +const getNullableValue = (coercion, attributeDefinition) => + needsNullableInitialization(attributeDefinition) ? getNullValue(coercion) : null; + +const needsNullableInitialization = (attributeDefinition) => + !attributeDefinition.options.required && !attributeDefinition.options.nullable; + +const getNullValue = (coercion) => + isFunction(coercion.nullValue) ? coercion.nullValue() : coercion.nullValue; diff --git a/packages/structure/src/coercion/coercions/array.js b/packages/structure/src/coercion/coercions/array.js new file mode 100644 index 0000000..69e7aff --- /dev/null +++ b/packages/structure/src/coercion/coercions/array.js @@ -0,0 +1,48 @@ +const Errors = require('../../errors'); + +module.exports = { + isCoerced: () => false, // always tries to coerce array types + nullValue() { + throw Errors.arrayOrIterable(); + }, + coerce(rawValue, attributeDefinition) { + assertIterable(rawValue); + + const items = extractItems(rawValue); + + const instance = createInstance(attributeDefinition); + + return fillInstance(instance, items, attributeDefinition); + }, +}; + +function assertIterable(value) { + if (!isIterable(value)) { + throw Errors.arrayOrIterable(); + } +} + +function isIterable(value) { + return value !== undefined && (value.length != null || value[Symbol.iterator]); +} + +function extractItems(iterable) { + if (!Array.isArray(iterable) && iterable[Symbol.iterator]) { + return Array(...iterable); + } + + return iterable; +} + +function createInstance(attributeDefinition) { + const type = attributeDefinition.resolveType(); + return new type(); +} + +function fillInstance(instance, items, attributeDefinition) { + for (let i = 0; i < items.length; i++) { + instance.push(attributeDefinition.itemTypeDefinition.coerce(items[i])); + } + + return instance; +} diff --git a/src/coercion/boolean.js b/packages/structure/src/coercion/coercions/boolean.js similarity index 100% rename from src/coercion/boolean.js rename to packages/structure/src/coercion/coercions/boolean.js diff --git a/src/coercion/date.js b/packages/structure/src/coercion/coercions/date.js similarity index 100% rename from src/coercion/date.js rename to packages/structure/src/coercion/coercions/date.js diff --git a/packages/structure/src/coercion/coercions/generic.js b/packages/structure/src/coercion/coercions/generic.js new file mode 100644 index 0000000..ef93bd8 --- /dev/null +++ b/packages/structure/src/coercion/coercions/generic.js @@ -0,0 +1,10 @@ +module.exports = { + isCoerced(value, attributeDefinition) { + return value instanceof attributeDefinition.resolveType(); + }, + coerce(value, attributeDefinition) { + const type = attributeDefinition.resolveType(); + + return new type(value); + }, +}; diff --git a/src/coercion/number.js b/packages/structure/src/coercion/coercions/number.js similarity index 100% rename from src/coercion/number.js rename to packages/structure/src/coercion/coercions/number.js diff --git a/src/coercion/string.js b/packages/structure/src/coercion/coercions/string.js similarity index 100% rename from src/coercion/string.js rename to packages/structure/src/coercion/coercions/string.js diff --git a/packages/structure/src/coercion/index.js b/packages/structure/src/coercion/index.js new file mode 100644 index 0000000..9d54813 --- /dev/null +++ b/packages/structure/src/coercion/index.js @@ -0,0 +1,34 @@ +const arrayCoercion = require('./coercions/array'); +const genericCoercionFor = require('./coercions/generic'); +const Coercion = require('./coercion'); + +const types = [ + require('./coercions/string'), + require('./coercions/number'), + require('./coercions/boolean'), + require('./coercions/date'), +]; + +exports.for = function coercionFor(attributeDefinition) { + if (!attributeDefinition.options.coercion) { + return Coercion.disabled; + } + + const coercion = getCoercion(attributeDefinition); + + return Coercion.create(coercion, attributeDefinition); +}; + +function getCoercion(attributeDefinition) { + if (attributeDefinition.isArrayType) { + return arrayCoercion; + } + + const coercion = types.find((c) => c.type === attributeDefinition.options.type); + + if (coercion) { + return coercion; + } + + return genericCoercionFor; +} diff --git a/packages/structure/src/descriptors/index.js b/packages/structure/src/descriptors/index.js new file mode 100644 index 0000000..fe16de7 --- /dev/null +++ b/packages/structure/src/descriptors/index.js @@ -0,0 +1,176 @@ +const { isObject } = require('lodash'); +const { SCHEMA, ATTRIBUTES, DEFAULT_ACCESSOR } = require('../symbols'); +const Errors = require('../errors'); +const StrictMode = require('../strictMode'); +const Cloning = require('../cloning'); +const Attributes = require('../attributes'); +const { defineProperty, defineProperties } = Object; + +exports.addTo = function addDescriptorsTo(schema, StructureClass) { + setSchema(); + setBuildStrict(); + setAttributesGetterAndSetter(); + setGenericAttributeGetterAndSetter(); + setEachAttributeGetterAndSetter(); + setValidation(); + setSerialization(); + setCloning(); + + function setSchema() { + defineProperty(StructureClass, SCHEMA, { + value: schema, + }); + + defineProperty(StructureClass.prototype, SCHEMA, { + value: schema, + }); + } + + function setBuildStrict() { + const strictMode = StrictMode.for(schema, StructureClass); + + defineProperty(StructureClass, 'buildStrict', { + value: strictMode.buildStrict, + }); + } + + function setAttributesGetterAndSetter() { + defineProperty(StructureClass.prototype, 'attributes', { + get() { + return this[ATTRIBUTES]; + }, + + set(newAttributes) { + if (!isObject(newAttributes)) { + throw Errors.nonObjectAttributes(); + } + + const coercedAttributes = schema.coerce(newAttributes); + + Attributes.setInInstance(this, coercedAttributes); + }, + }); + } + + function setGenericAttributeGetterAndSetter() { + defineProperties(StructureClass.prototype, { + get: { + value: function get(attributeName) { + return this.attributes[attributeName]; + }, + }, + set: { + value: function set(attributeName, attributeValue) { + const attributeDefinition = schema.attributeDefinitions[attributeName]; + + if (!attributeDefinition) { + throw Errors.inexistentAttribute(attributeName); + } + + const coercedValue = attributeDefinition.coerce(attributeValue); + this.attributes[attributeName] = coercedValue; + }, + }, + }); + } + + function setEachAttributeGetterAndSetter() { + schema.attributeDefinitions.forEach((attrDefinition) => { + defineProperty( + StructureClass.prototype, + attrDefinition.name, + attributeDescriptorFor(attrDefinition) + ); + }); + } + + function attributeDescriptorFor(attrDefinition) { + const { name } = attrDefinition; + + const attributeDescriptor = findAttributeDescriptor(name); + + if (isDefaultAccessor(attributeDescriptor.get)) { + attributeDescriptor.get = defaultGetterFor(name); + } + + if (isDefaultAccessor(attributeDescriptor.set)) { + attributeDescriptor.set = defaultSetterFor(name); + } + + return attributeDescriptor; + } + + function setValidation() { + defineProperty(StructureClass, 'validate', { + value: function validate(attributes) { + return schema.validateAttributes(attributes); + }, + }); + + defineProperty(StructureClass.prototype, 'validate', { + value: function validate() { + return schema.validateInstance(this); + }, + }); + } + + function setSerialization() { + defineProperty(StructureClass.prototype, 'toJSON', { + value: function toJSON() { + return schema.serialize(this); + }, + }); + } + + function setCloning() { + const cloning = Cloning.for(StructureClass); + + defineProperty(StructureClass.prototype, 'clone', { + value: cloning.clone, + }); + } + + function defaultGetterFor(name) { + function get() { + return this.get(name); + } + + get[DEFAULT_ACCESSOR] = true; + + return get; + } + + function defaultSetterFor(name) { + function set(value) { + this.set(name, value); + } + + set[DEFAULT_ACCESSOR] = true; + + return set; + } + + function isDefaultAccessor(accessor) { + return !accessor || accessor[DEFAULT_ACCESSOR]; + } + + function findAttributeDescriptor(propertyName) { + let proto = StructureClass.prototype; + + while (proto !== Object.prototype) { + const attributeDescriptor = Object.getOwnPropertyDescriptor(proto, propertyName); + + if (attributeDescriptor) { + return { + ...attributeDescriptor, + enumerable: false, + configurable: true, + }; + } + + proto = proto.__proto__; + } + + return {}; + } +}; diff --git a/src/errors/DefaultValidationError.js b/packages/structure/src/errors/DefaultValidationError.js similarity index 100% rename from src/errors/DefaultValidationError.js rename to packages/structure/src/errors/DefaultValidationError.js diff --git a/src/errors/index.js b/packages/structure/src/errors/index.js similarity index 67% rename from src/errors/index.js rename to packages/structure/src/errors/index.js index 48408af..e0d86e9 100644 --- a/src/errors/index.js +++ b/packages/structure/src/errors/index.js @@ -4,11 +4,9 @@ exports.classAsSecondParam = (ErroneousPassedClass) => 'StructureClass'})\`.` ); -exports.nonObjectAttributes = () => - new TypeError("#attributes can't be set to a non-object."); +exports.nonObjectAttributes = () => new TypeError("#attributes can't be set to a non-object."); -exports.arrayOrIterable = () => - new TypeError('Value must be iterable or array-like.'); +exports.arrayOrIterable = () => new TypeError('Value must be iterable or array-like.'); exports.missingDynamicType = (attributeName) => new Error(`Missing dynamic type for attribute: ${attributeName}.`); @@ -20,3 +18,6 @@ exports.invalidType = (attributeName) => exports.invalidAttributes = (errors, StructureValidationError) => new StructureValidationError(errors); + +exports.inexistentAttribute = (attributeName) => + new Error(`${attributeName} is not an attribute of this structure`); diff --git a/packages/structure/src/index.js b/packages/structure/src/index.js new file mode 100644 index 0000000..8e21a6c --- /dev/null +++ b/packages/structure/src/index.js @@ -0,0 +1 @@ +exports.attributes = require('./attributesDecorator'); diff --git a/packages/structure/src/initialization/index.js b/packages/structure/src/initialization/index.js new file mode 100644 index 0000000..0191b14 --- /dev/null +++ b/packages/structure/src/initialization/index.js @@ -0,0 +1,18 @@ +const Attributes = require('../attributes'); + +exports.for = function initializationForSchema(schema) { + return { + initialize(instance, { attributes }) { + Attributes.setInInstance(instance, Object.create(null)); + + for (let attrDefinition of schema.attributeDefinitions) { + const attrPassedValue = attributes[attrDefinition.name]; + + // will coerce through setters + instance[attrDefinition.name] = attrDefinition.initialize(instance, attrPassedValue); + } + + return instance; + }, + }; +}; diff --git a/packages/structure/src/schema/AttributeDefinitions/AttributeDefinition.js b/packages/structure/src/schema/AttributeDefinitions/AttributeDefinition.js new file mode 100644 index 0000000..2a98e9c --- /dev/null +++ b/packages/structure/src/schema/AttributeDefinitions/AttributeDefinition.js @@ -0,0 +1,158 @@ +const { isFunction, isString, isUndefined } = require('lodash'); +const Coercion = require('../../coercion'); +const Validation = require('../../validation'); +const Errors = require('../../errors'); +const { SCHEMA } = require('../../symbols'); + +class AttributeDefinition { + static for(name, options, schema) { + if (options.__isAttributeDefinition) { + return new this({ + name, + options: options.options, + schema, + }); + } + + options = makeComplete(options); + + this.assertValidType(name, options); + this.assertDynamicExists(name, options, schema); + + return new this({ + name, + options, + schema, + }); + } + + static compare(definitionA, definitionB) { + if (definitionA.isDynamicDefault === definitionB.isDynamicDefault) { + return 0; + } + + if (definitionA.isDynamicDefault) { + return 1; + } + + return -1; + } + + static assertDynamicExists(name, options, schema) { + if (!hasDynamicType(options)) { + return; + } + + if (!schema.hasDynamicTypeFor(options.type)) { + throw Errors.missingDynamicType(name); + } + } + + static assertValidType(name, options) { + if (hasDynamicType(options) || hasStaticType(options)) { + return; + } + + throw Errors.invalidType(name); + } + + constructor({ name, options, schema }) { + // used to extend schemas when subclassing structures + this.__isAttributeDefinition = true; + + this.name = name; + options = this.options = applyDefaultOptions(options, schema); + this.hasDefault = 'default' in options; + this.isDynamicDefault = isFunction(options.default); + this.hasDynamicType = hasDynamicType(options); + this.schema = schema; + + if (options.itemType) { + this.isArrayType = true; + this.itemTypeDefinition = AttributeDefinition.for('item', options.itemType, schema); + } + + this.coercion = Coercion.for(this); + this.validation = Validation.forAttribute(this); + } + + resolveType() { + if (this.hasDynamicType) { + return this.schema.dynamicTypeFor(this.options.type); + } + + return this.options.type; + } + + get isNestedSchema() { + return Boolean(this.resolveType()[SCHEMA]); + } + + get itemsAreStructures() { + return this.isArrayType && this.itemTypeDefinition.isNestedSchema; + } + + coerce(newValue) { + return this.coercion.coerce(newValue); + } + + shouldSerialize(attributeValue) { + return this.isValuePresent(attributeValue) || this.isValueNullable(attributeValue); + } + + isValuePresent(attributeValue) { + return attributeValue != null; + } + + isValueNullable(attributeValue) { + return attributeValue !== undefined && this.options.nullable; + } + + initialize(instance, attributeValue) { + if (this.shouldInitializeToDefault(attributeValue)) { + return this.defaultValueFor(instance); + } + + return attributeValue; + } + + defaultValueFor(instance) { + if (this.isDynamicDefault) { + return this.options.default(instance); + } + + return this.options.default; + } + + shouldInitializeToDefault(attributeValue) { + const isUndefined = attributeValue === undefined; + const isDefaultableNull = !this.options.nullable && attributeValue === null; + + return this.hasDefault && (isUndefined || isDefaultableNull); + } +} + +const makeComplete = (options) => { + if (!isShorthand(options)) { + return options; + } + + return { type: options }; +}; + +const applyDefaultOptions = (options, schema) => { + return { + ...options, + coercion: inheritOptionFromSchema(options.coercion, schema.options.coercion), + }; +}; + +const inheritOptionFromSchema = (option, schemaOption) => + !isUndefined(option) ? option : schemaOption; + +const isShorthand = (options) => isFunction(options) || isString(options); + +const hasStaticType = (options) => isFunction(options.type); +const hasDynamicType = (options) => isString(options.type); + +module.exports = AttributeDefinition; diff --git a/packages/structure/src/schema/AttributeDefinitions/index.js b/packages/structure/src/schema/AttributeDefinitions/index.js new file mode 100644 index 0000000..6e632ca --- /dev/null +++ b/packages/structure/src/schema/AttributeDefinitions/index.js @@ -0,0 +1,36 @@ +const AttributeDefinition = require('./AttributeDefinition'); + +class AttributeDefinitions extends Array { + static for(attributeDefinitions, { schema }) { + attributeDefinitions = Object.keys(attributeDefinitions).map((attributeName) => ({ + name: attributeName, + options: attributeDefinitions[attributeName], + })); + + return new this(attributeDefinitions, { schema }); + } + + constructor(attributeDefinitions, { schema }) { + attributeDefinitions = attributeDefinitions + .map(({ name, options }) => AttributeDefinition.for(name, options, schema)) + .sort(AttributeDefinition.compare); + + super(...attributeDefinitions); + + for (let attributeDefinition of attributeDefinitions) { + this[attributeDefinition.name] = attributeDefinition; + } + } + + byKey() { + return this.reduce( + (attributeDefinitions, attrDefinition) => ({ + ...attributeDefinitions, + [attrDefinition.name]: this[attrDefinition.name], + }), + {} + ); + } +} + +module.exports = AttributeDefinitions; diff --git a/packages/structure/src/schema/index.js b/packages/structure/src/schema/index.js new file mode 100644 index 0000000..7817fb7 --- /dev/null +++ b/packages/structure/src/schema/index.js @@ -0,0 +1,109 @@ +const AttributeDefinitions = require('./AttributeDefinitions'); +const Initialization = require('../initialization'); +const Validation = require('../validation'); +const Serialization = require('../serialization'); +const { SCHEMA } = require('../symbols'); + +class Schema { + static for({ attributeDefinitions, wrappedClass, options }) { + const parentSchema = wrappedClass[SCHEMA]; + + if (parentSchema) { + return this.extend(parentSchema, { + attributeDefinitions, + wrappedClass, + options, + }); + } + + return new this({ + attributeDefinitions, + wrappedClass, + options, + }); + } + + static extend(parentSchema, { attributeDefinitions, wrappedClass, options }) { + const parentAttributes = parentSchema.attributeDefinitions.byKey(); + + attributeDefinitions = { + ...parentAttributes, + ...attributeDefinitions, + }; + + options = { + ...parentSchema.options, + ...options, + dynamics: { + ...parentSchema.dynamics, + ...options.dynamics, + }, + }; + + return new this({ + attributeDefinitions, + wrappedClass, + options, + }); + } + + constructor({ attributeDefinitions, wrappedClass, options }) { + this.options = applyDefaultOptions(options); + this.attributeDefinitions = AttributeDefinitions.for(attributeDefinitions, { schema: this }); + this.wrappedClass = wrappedClass; + this.identifier = options.identifier || wrappedClass.name; + + this.initialization = Initialization.for(this); + this.validation = Validation.for(this); + this.serialize = Serialization.serialize; + } + + initializeInstance(instance, { attributes }) { + return this.initialization.initialize(instance, { attributes }); + } + + hasDynamicTypeFor(typeIdentifier) { + return Boolean(this.options.dynamics[typeIdentifier]); + } + + dynamicTypeFor(typeIdentifier) { + return this.options.dynamics[typeIdentifier](); + } + + validateAttributes(attributes) { + if (attributes[SCHEMA]) { + attributes = attributes.toJSON(); + } + + return this.validation.validate(attributes); + } + + validateInstance(instance) { + const attributes = instance.toJSON(); + + return this.validation.validate(attributes); + } + + coerce(newAttributes) { + const attributes = Object.create(null); + + for (const attributeDefinition of this.attributeDefinitions) { + const { name } = attributeDefinition; + const value = newAttributes[name]; + attributes[name] = attributeDefinition.coerce(value); + } + + return attributes; + } +} + +const defaultOptions = { + coercion: true, +}; + +const applyDefaultOptions = (options) => ({ + ...defaultOptions, + ...options, +}); + +module.exports = Schema; diff --git a/packages/structure/src/serialization/index.js b/packages/structure/src/serialization/index.js new file mode 100644 index 0000000..f192e27 --- /dev/null +++ b/packages/structure/src/serialization/index.js @@ -0,0 +1,42 @@ +const { SCHEMA } = require('../symbols'); + +function serialize(structure) { + if (structure == null) { + return structure; + } + + return serializeStructure(structure); +} + +function serializeStructure(structure) { + const schema = structure[SCHEMA]; + + const serializedStructure = Object.create(null); + + for (let attributeDefinition of schema.attributeDefinitions) { + let attributeValue = structure[attributeDefinition.name]; + + if (attributeDefinition.shouldSerialize(attributeValue)) { + serializedStructure[attributeDefinition.name] = serializeAttribute( + attributeValue, + attributeDefinition + ); + } + } + + return serializedStructure; +} + +function serializeAttribute(attributeValue, attributeDefinition) { + if (attributeDefinition.itemsAreStructures) { + return attributeValue.map(serialize); + } + + if (attributeDefinition.isNestedSchema) { + return serialize(attributeValue); + } + + return attributeValue; +} + +exports.serialize = serialize; diff --git a/src/strictMode/index.js b/packages/structure/src/strictMode/index.js similarity index 55% rename from src/strictMode/index.js rename to packages/structure/src/strictMode/index.js index 6aaf4f1..d2139cb 100644 --- a/src/strictMode/index.js +++ b/packages/structure/src/strictMode/index.js @@ -1,16 +1,13 @@ const Errors = require('../errors'); const DefaultValidationError = require('../errors/DefaultValidationError'); -exports.buildStrictDescriptorFor = function buildStrictDescriptorFor( - StructureClass, - schemaOptions -) { +exports.for = function strictModeFor(schema, StructureClass) { const StructureValidationError = - schemaOptions.strictValidationErrorClass || DefaultValidationError; + schema.options.strictValidationErrorClass || DefaultValidationError; return { - value: function buildStrict(constructorArgs) { - const instance = new StructureClass(constructorArgs); + buildStrict(...constructorArgs) { + const instance = new StructureClass(...constructorArgs); const { valid, errors } = instance.validate(); diff --git a/src/symbols.js b/packages/structure/src/symbols.js similarity index 55% rename from src/symbols.js rename to packages/structure/src/symbols.js index 596c2e3..f690dcf 100644 --- a/src/symbols.js +++ b/packages/structure/src/symbols.js @@ -1,6 +1,5 @@ module.exports = { SCHEMA: Symbol('schema'), ATTRIBUTES: Symbol('attributes'), - VALIDATE: Symbol('validate'), - INITIALIZE: Symbol('initialize'), + DEFAULT_ACCESSOR: Symbol('defaultAccessor'), }; diff --git a/packages/structure/src/validation/forAttribute.js b/packages/structure/src/validation/forAttribute.js new file mode 100644 index 0000000..2332f24 --- /dev/null +++ b/packages/structure/src/validation/forAttribute.js @@ -0,0 +1,23 @@ +const validations = [ + require('./validations/string'), + require('./validations/number'), + require('./validations/boolean'), + require('./validations/date'), +]; + +const NestedValidation = require('./validations/nested'); +const arrayValidation = require('./validations/array'); + +module.exports = function validationForAttribute(attributeDefinition) { + if (attributeDefinition.isArrayType) { + return arrayValidation(attributeDefinition); + } + + const validation = validations.find((v) => v.type === attributeDefinition.options.type); + + if (!validation) { + return NestedValidation.forType(attributeDefinition); + } + + return validation.createJoiSchema(attributeDefinition); +}; diff --git a/packages/structure/src/validation/forSchema.js b/packages/structure/src/validation/forSchema.js new file mode 100644 index 0000000..2e5695f --- /dev/null +++ b/packages/structure/src/validation/forSchema.js @@ -0,0 +1,48 @@ +const joi = require('@hapi/joi'); +const NestedValidation = require('./validations/nested'); + +const validatorOptions = { + abortEarly: false, + convert: false, + allowUnknown: false, +}; + +module.exports = function validationForSchema(schema) { + const schemaValidation = schema.attributeDefinitions.reduce( + (schemaValidation, attributeDefinition) => ({ + ...schemaValidation, + [attributeDefinition.name]: attributeDefinition.validation, + }), + {} + ); + + const joiValidation = joi + .object() + .keys(schemaValidation) + .id(schema.identifier); + + return { + joiValidation, + validate(data) { + const validationWithDynamicLinks = NestedValidation.resolveDynamicLinks({ + schema, + joiValidation, + }); + + const { error } = validationWithDynamicLinks.validate(data, validatorOptions); + + if (error) { + const errors = error.details.map(mapDetail); + + return { + valid: false, + errors, + }; + } + + return { valid: true }; + }, + }; +}; + +const mapDetail = ({ message, path }) => ({ message, path }); diff --git a/packages/structure/src/validation/index.js b/packages/structure/src/validation/index.js new file mode 100644 index 0000000..f270b1c --- /dev/null +++ b/packages/structure/src/validation/index.js @@ -0,0 +1,2 @@ +exports.for = require('./forSchema.js'); +exports.forAttribute = require('./forAttribute'); diff --git a/packages/structure/src/validation/validations/array.js b/packages/structure/src/validation/validations/array.js new file mode 100644 index 0000000..48bbf5f --- /dev/null +++ b/packages/structure/src/validation/validations/array.js @@ -0,0 +1,26 @@ +const joi = require('@hapi/joi'); +const { mapToJoi } = require('./utils'); + +const joiMappings = [ + ['minLength', 'min', true], + ['maxLength', 'max', true], + ['exactLength', 'length', true], + ['unique', 'unique'], +]; + +module.exports = function arrayValidation(attributeDefinition) { + let joiSchema = joi.array().items(attributeDefinition.itemTypeDefinition.validation); + + const { sparse } = attributeDefinition.options; + + const canBeSparse = sparse === undefined || sparse; + + joiSchema = joiSchema.sparse(canBeSparse); + + joiSchema = mapToJoi(attributeDefinition, { + initial: joiSchema, + mappings: joiMappings, + }); + + return joiSchema; +}; diff --git a/packages/structure/src/validation/validations/boolean.js b/packages/structure/src/validation/validations/boolean.js new file mode 100644 index 0000000..d0ea433 --- /dev/null +++ b/packages/structure/src/validation/validations/boolean.js @@ -0,0 +1,15 @@ +const joi = require('@hapi/joi'); +const { mapToJoi, equalOption } = require('./utils'); + +module.exports = { + type: Boolean, + joiMappings: [], + createJoiSchema(attributeDefinition) { + let joiSchema = equalOption(attributeDefinition, { initial: joi.boolean() }); + + return mapToJoi(attributeDefinition, { + initial: joiSchema, + mappings: this.joiMappings, + }); + }, +}; diff --git a/src/validation/date.js b/packages/structure/src/validation/validations/date.js similarity index 56% rename from src/validation/date.js rename to packages/structure/src/validation/validations/date.js index c35a48a..511d59b 100644 --- a/src/validation/date.js +++ b/packages/structure/src/validation/validations/date.js @@ -1,19 +1,19 @@ -const joi = require('joi'); +const joi = require('@hapi/joi'); const { mapToJoi, mapToJoiWithReference, equalOption } = require('./utils'); module.exports = { type: Date, joiMappings: [], valueOrRefOptions: [['min', 'min'], ['max', 'max']], - createJoiSchema(typeDescriptor) { - var joiSchema = mapToJoiWithReference(typeDescriptor, { + createJoiSchema(attributeDefinition) { + let joiSchema = mapToJoiWithReference(attributeDefinition, { initial: joi.date(), mappings: this.valueOrRefOptions, }); - joiSchema = equalOption(typeDescriptor, { initial: joiSchema }); + joiSchema = equalOption(attributeDefinition, { initial: joiSchema }); - return mapToJoi(typeDescriptor, { + return mapToJoi(attributeDefinition, { initial: joiSchema, mappings: this.joiMappings, }); diff --git a/packages/structure/src/validation/validations/nested.js b/packages/structure/src/validation/validations/nested.js new file mode 100644 index 0000000..52c6c31 --- /dev/null +++ b/packages/structure/src/validation/validations/nested.js @@ -0,0 +1,64 @@ +const joi = require('@hapi/joi'); +const { SCHEMA } = require('../../symbols'); +const { requiredOption } = require('./utils'); + +exports.forType = function nestedValidationForType(attributeDefinition) { + if (attributeDefinition.hasDynamicType) { + return validationToDynamicType(attributeDefinition); + } + + const typeSchema = attributeDefinition.resolveType()[SCHEMA]; + let joiSchema = getNestedValidations(typeSchema); + + joiSchema = requiredOption(attributeDefinition, { + initial: joiSchema, + }); + + return joiSchema; +}; + +function validationToDynamicType(attributeDefinition) { + let joiSchema = joi.link(`#${attributeDefinition.options.type}`); + + joiSchema = requiredOption(attributeDefinition, { + initial: joiSchema, + }); + + return joiSchema; +} + +function getNestedValidations(typeSchema) { + let joiSchema = joi.object(); + + if (typeSchema) { + const nestedValidations = typeSchema.attributeDefinitions.reduce( + (validations, attributeDefinition) => ({ + ...validations, + [attributeDefinition.name]: attributeDefinition.validation, + }), + {} + ); + + joiSchema = joiSchema.keys(nestedValidations); + } + + return joiSchema; +} + +exports.resolveDynamicLinks = function resolveDynamicLinks({ schema, joiValidation }) { + return schema.attributeDefinitions.reduce((joiValidation, attributeDefinition) => { + if (!attributeDefinition.hasDynamicType) { + return joiValidation; + } + + const type = attributeDefinition.resolveType(); + + if (!type[SCHEMA]) { + return joiValidation; + } + + const attributeValidation = type[SCHEMA].validation; + + return joiValidation.shared(attributeValidation.joiValidation); + }, joiValidation); +}; diff --git a/src/validation/number.js b/packages/structure/src/validation/validations/number.js similarity index 56% rename from src/validation/number.js rename to packages/structure/src/validation/validations/number.js index 7671414..65cfac5 100644 --- a/src/validation/number.js +++ b/packages/structure/src/validation/validations/number.js @@ -1,4 +1,4 @@ -const joi = require('joi'); +const joi = require('@hapi/joi'); const { mapToJoi, mapToJoiWithReference, equalOption } = require('./utils'); module.exports = { @@ -10,21 +10,16 @@ module.exports = { ['positive', 'positive', true], ['negative', 'negative', true], ], - valueOrRefOptions: [ - ['min', 'min'], - ['greater', 'greater'], - ['max', 'max'], - ['less', 'less'], - ], - createJoiSchema(typeDescriptor) { - var joiSchema = mapToJoiWithReference(typeDescriptor, { + valueOrRefOptions: [['min', 'min'], ['greater', 'greater'], ['max', 'max'], ['less', 'less']], + createJoiSchema(attributeDefinition) { + let joiSchema = mapToJoiWithReference(attributeDefinition, { initial: joi.number(), mappings: this.valueOrRefOptions, }); - joiSchema = equalOption(typeDescriptor, { initial: joiSchema }); + joiSchema = equalOption(attributeDefinition, { initial: joiSchema }); - return mapToJoi(typeDescriptor, { + return mapToJoi(attributeDefinition, { initial: joiSchema, mappings: this.joiMappings, }); diff --git a/src/validation/string.js b/packages/structure/src/validation/validations/string.js similarity index 67% rename from src/validation/string.js rename to packages/structure/src/validation/validations/string.js index dd87e47..eaf4512 100644 --- a/src/validation/string.js +++ b/packages/structure/src/validation/validations/string.js @@ -1,4 +1,4 @@ -const joi = require('joi'); +const joi = require('@hapi/joi'); const { isPlainObject } = require('lodash'); const { mapToJoi, equalOption } = require('./utils'); @@ -15,16 +15,16 @@ module.exports = { ['email', 'email'], ['guid', 'guid', isPlainObject], ], - createJoiSchema(typeDescriptor) { - var joiSchema = joi.string(); + createJoiSchema(attributeDefinition) { + let joiSchema = joi.string(); - if (typeDescriptor.empty) { + if (attributeDefinition.options.empty) { joiSchema = joiSchema.allow(''); } - joiSchema = equalOption(typeDescriptor, { initial: joiSchema }); + joiSchema = equalOption(attributeDefinition, { initial: joiSchema }); - return mapToJoi(typeDescriptor, { + return mapToJoi(attributeDefinition, { initial: joiSchema, mappings: this.joiMappings, }); diff --git a/packages/structure/src/validation/validations/utils.js b/packages/structure/src/validation/validations/utils.js new file mode 100644 index 0000000..ceab72b --- /dev/null +++ b/packages/structure/src/validation/validations/utils.js @@ -0,0 +1,81 @@ +const joi = require('@hapi/joi'); +const { isPlainObject, isFunction } = require('lodash'); + +exports.mapToJoi = function mapToJoi(attributeDefinition, { initial, mappings }) { + let joiSchema = mappings.reduce((joiSchema, [optionName, joiMethod, passValueToJoi]) => { + const optionValue = attributeDefinition.options[optionName]; + + if (optionValue === undefined) { + return joiSchema; + } + + if (shouldPassValueToJoi(passValueToJoi, optionValue)) { + return joiSchema[joiMethod](optionValue); + } + + return joiSchema[joiMethod](); + }, initial); + + joiSchema = requiredOption(attributeDefinition, { initial: joiSchema }); + + return joiSchema; +}; + +function shouldPassValueToJoi(passValueToJoi, optionValue) { + return passValueToJoi && (!isFunction(passValueToJoi) || passValueToJoi(optionValue)); +} + +function mapValueOrReference(valueOrReference) { + if (isPlainObject(valueOrReference)) { + return joi.ref(valueOrReference.attr); + } + + return valueOrReference; +} + +exports.mapToJoiWithReference = function mapToJoiWithReference( + attributeDefinition, + { initial, mappings } +) { + return mappings.reduce((joiSchema, [optionName, joiMethod]) => { + let optionValue = attributeDefinition.options[optionName]; + + if (optionValue === undefined) { + return joiSchema; + } + + optionValue = mapValueOrReference(optionValue); + + return joiSchema[joiMethod](optionValue); + }, initial); +}; + +exports.equalOption = function equalOption(attributeDefinition, { initial }) { + let possibilities = attributeDefinition.options.equal; + + if (possibilities === undefined) { + return initial; + } + + if (!Array.isArray(possibilities)) { + possibilities = [possibilities]; + } + + possibilities = possibilities.map(mapValueOrReference); + + return initial.equal(...possibilities); +}; + +function requiredOption(attributeDefinition, { initial }) { + if (attributeDefinition.options.nullable) { + initial = initial.allow(null); + } + + if (attributeDefinition.options.required) { + initial = initial.required(); + } + + return initial; +} + +exports.requiredOption = requiredOption; diff --git a/test/fixtures/BooksCollection.js b/packages/structure/test/fixtures/BooksCollection.js similarity index 100% rename from test/fixtures/BooksCollection.js rename to packages/structure/test/fixtures/BooksCollection.js diff --git a/test/fixtures/BrokenCircularBook.js b/packages/structure/test/fixtures/BrokenCircularBook.js similarity index 87% rename from test/fixtures/BrokenCircularBook.js rename to packages/structure/test/fixtures/BrokenCircularBook.js index 03f7680..96b94a3 100644 --- a/test/fixtures/BrokenCircularBook.js +++ b/packages/structure/test/fixtures/BrokenCircularBook.js @@ -10,4 +10,5 @@ const Book = attributes( } )(class Book {}); +/* istanbul ignore next */ module.exports = Book; diff --git a/test/fixtures/CircularBook.js b/packages/structure/test/fixtures/CircularBook.js similarity index 100% rename from test/fixtures/CircularBook.js rename to packages/structure/test/fixtures/CircularBook.js diff --git a/packages/structure/test/fixtures/CircularBookCustomIdentifier.js b/packages/structure/test/fixtures/CircularBookCustomIdentifier.js new file mode 100644 index 0000000..1ba110e --- /dev/null +++ b/packages/structure/test/fixtures/CircularBookCustomIdentifier.js @@ -0,0 +1,21 @@ +const { attributes } = require('../../src'); + +const Book = attributes( + { + name: String, + owner: 'UserEntity', + nextBook: 'BookEntity', + pages: { + type: Number, + }, + }, + { + identifier: 'BookEntity', + dynamics: { + UserEntity: () => require('./CircularUserCustomIdentifier'), + BookEntity: () => Book, + }, + } +)(class Book {}); + +module.exports = Book; diff --git a/test/fixtures/CircularUser.js b/packages/structure/test/fixtures/CircularUser.js similarity index 100% rename from test/fixtures/CircularUser.js rename to packages/structure/test/fixtures/CircularUser.js diff --git a/packages/structure/test/fixtures/CircularUserCustomIdentifier.js b/packages/structure/test/fixtures/CircularUserCustomIdentifier.js new file mode 100644 index 0000000..240298e --- /dev/null +++ b/packages/structure/test/fixtures/CircularUserCustomIdentifier.js @@ -0,0 +1,25 @@ +const { attributes } = require('../../src'); + +const User = attributes( + { + name: String, + friends: { + type: Array, + itemType: 'UserEntity', + }, + favoriteBook: { + type: 'BookEntity', + required: true, + nullable: true, + }, + }, + { + identifier: 'UserEntity', + dynamics: { + UserEntity: () => User, + BookEntity: () => require('./CircularBookCustomIdentifier'), + }, + } +)(class User {}); + +module.exports = User; diff --git a/packages/structure/test/jest.browser.js b/packages/structure/test/jest.browser.js new file mode 100644 index 0000000..195d2d9 --- /dev/null +++ b/packages/structure/test/jest.browser.js @@ -0,0 +1,8 @@ +module.exports = { + runner: '@jest-runner/electron', + testEnvironment: '@jest-runner/electron/environment', + setupFilesAfterEnv: ['/support/setup.js'], + moduleNameMapper: { + src$: '/../distTest/structure.js', + }, +}; diff --git a/packages/structure/test/jest.node.js b/packages/structure/test/jest.node.js new file mode 100644 index 0000000..886ca5c --- /dev/null +++ b/packages/structure/test/jest.node.js @@ -0,0 +1,3 @@ +module.exports = { + setupFilesAfterEnv: ['/support/setup.js'], +}; diff --git a/packages/structure/test/support/setup.js b/packages/structure/test/support/setup.js new file mode 100644 index 0000000..3d8fddb --- /dev/null +++ b/packages/structure/test/support/setup.js @@ -0,0 +1,3 @@ +const jestStructure = require('jest-structure'); + +expect.extend(jestStructure); diff --git a/packages/structure/test/unit/__snapshots__/instanceAndUpdate.spec.js.snap b/packages/structure/test/unit/__snapshots__/instanceAndUpdate.spec.js.snap new file mode 100644 index 0000000..2ac31fd --- /dev/null +++ b/packages/structure/test/unit/__snapshots__/instanceAndUpdate.spec.js.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`instantiating a structure custom setters and getters when tries to set an attribute that does not exist fails and throws an error 1`] = `"NOPE is not an attribute of this structure"`; diff --git a/packages/structure/test/unit/coercion/array.spec.js b/packages/structure/test/unit/coercion/array.spec.js new file mode 100644 index 0000000..64a3328 --- /dev/null +++ b/packages/structure/test/unit/coercion/array.spec.js @@ -0,0 +1,219 @@ +const { attributes } = require('../../../src'); + +describe('type coercion', () => { + describe('Array', () => { + let Seat; + let User; + + beforeEach(() => { + User = attributes({ + books: { + type: Array, + itemType: String, + }, + })(class User {}); + }); + + it('does not coerces undefined', () => { + const user = new User({ + books: undefined, + }); + + expect(user.books).toBeUndefined(); + }); + + describe('when raw value is already an array', () => { + it('coerces items', () => { + const user = new User({ + books: ['The Lord of The Rings', 1984, true], + }); + + expect(user.books).toEqual(['The Lord of The Rings', '1984', 'true']); + }); + + it('does not coerce items that are of the expected type', () => { + const book = new String('A Game of Thrones'); + + const user = new User({ + books: [book], + }); + + expect(user.books).toEqual([new String('A Game of Thrones')]); + expect(user.books[0]).toBe(book); + }); + }); + + describe('when raw value is a string', () => { + it('uses each character as an item', () => { + const user = new User({ + books: 'ABC', + }); + + expect(user.books).toEqual(['A', 'B', 'C']); + }); + + it('coerces empty string to empty array', () => { + const user = new User({ + books: '', + }); + + expect(user.books).toEqual([]); + }); + + it('does nested coercing when expected item type is not String', () => { + const Library = attributes({ + bookIds: { + type: Array, + itemType: Number, + }, + })(class Library {}); + + const library = new Library({ + bookIds: '123', + }); + + expect(library.bookIds).toEqual([1, 2, 3]); + }); + }); + + describe('when raw value is an array-like', () => { + it('loops using #length property', () => { + const user = new User({ + books: { 0: 'Stonehenge', 1: 1984, length: 2 }, + }); + + expect(user.books).toEqual(['Stonehenge', '1984']); + }); + }); + + describe('when raw value implements Symbol.iterator', () => { + it('converts to array then uses each index', () => { + const books = { + *[Symbol.iterator]() { + for (let i = 0; i < 3; i++) { + yield i; + } + }, + }; + + const user = new User({ books }); + + expect(user.books).toEqual(['0', '1', '2']); + }); + }); + + describe('when raw value is a not iterable', () => { + describe('when it is not null', () => { + it('throws an error', () => { + expect(() => { + new User({ + books: 123, + }); + }).toThrow(/^Value must be iterable or array-like\.$/); + }); + }); + + describe('when it is null', () => { + describe('when array is nullable', () => { + let User; + + beforeEach(() => { + User = attributes({ + books: { + type: Array, + itemType: String, + nullable: true, + }, + })(class User {}); + }); + + it('keeps as null', () => { + const user = new User({ + books: null, + }); + + expect(user.books).toBeNull(); + }); + }); + + describe('when array is not nullable', () => { + let User; + + beforeEach(() => { + User = attributes({ + books: { + type: Array, + itemType: String, + nullable: false, + }, + })(class User {}); + }); + + it('throws an error', () => { + expect(() => { + new User({ + books: null, + }); + }).toThrow(/^Value must be iterable or array-like\.$/); + }); + }); + }); + }); + + describe('when raw value is a single numeric array', () => { + beforeEach(() => { + Seat = attributes({ + seats: { + type: Array, + itemType: Number, + }, + })(class Seat {}); + }); + + it('return the correct array', () => { + const seat = new Seat({ + seats: [1], + }); + + expect(seat.seats).toEqual([1]); + }); + }); + + describe('Array from dynamic type', () => { + let CircularUser; + let BooksCollection; + + beforeEach(() => { + CircularUser = require('../../fixtures/CircularUser'); + BooksCollection = require('../../fixtures/BooksCollection'); + }); + + it('coerces collection', () => { + const user = new CircularUser({ + books: ['Dragons of Ether', 'The Dark Tower'], + }); + + expect(user.books).toBeInstanceOf(BooksCollection); + }); + + it('coerces items', () => { + const user = new CircularUser({ + books: ['The Lord of The Rings', 1984, true], + }); + + expect(user.books).toEqual(['The Lord of The Rings', '1984', 'true']); + }); + + it('does not coerce items that are of the expected type', () => { + const book = new String('A Game of Thrones'); + + const user = new CircularUser({ + books: [book], + }); + + expect(user.books).toEqual([new String('A Game of Thrones')]); + expect(user.books[0]).toBe(book); + }); + }); + }); +}); diff --git a/test/unit/coercion/arraySubclass.spec.js b/packages/structure/test/unit/coercion/arraySubclass.spec.js similarity index 69% rename from test/unit/coercion/arraySubclass.spec.js rename to packages/structure/test/unit/coercion/arraySubclass.spec.js index c5e8426..eb88eb5 100644 --- a/test/unit/coercion/arraySubclass.spec.js +++ b/packages/structure/test/unit/coercion/arraySubclass.spec.js @@ -1,10 +1,9 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('type coercion', () => { describe('Array subclass', () => { - var Collection; - var User; + let Collection; + let User; beforeEach(() => { Collection = class Collection extends Array {}; @@ -22,16 +21,16 @@ describe('type coercion', () => { books: undefined, }); - expect(user.books).to.be.undefined; + expect(user.books).toBeUndefined(); }); - context('when raw value is already an array', () => { + describe('when raw value is already an array', () => { it('coerces items', () => { const user = new User({ books: ['The Lord of The Rings', 1984, true], }); - expect(user.books).to.eql(['The Lord of The Rings', '1984', 'true']); + expect(user.books).toEqual(['The Lord of The Rings', '1984', 'true']); }); it('coerces value to instance of array subclass', () => { @@ -39,7 +38,7 @@ describe('type coercion', () => { books: ['The Lord of The Rings', 1984, true], }); - expect(user.books).to.be.instanceOf(Collection); + expect(user.books).toBeInstanceOf(Collection); }); it('does not coerce items that are of the expected type', () => { @@ -49,18 +48,18 @@ describe('type coercion', () => { books: [book], }); - expect(user.books).to.eql([new String('A Game of Thrones')]); - expect(user.books[0]).to.equal(book); + expect(user.books).toEqual([new String('A Game of Thrones')]); + expect(user.books[0]).toBe(book); }); }); - context('when raw value is a string', () => { + describe('when raw value is a string', () => { it('uses each character as an item', () => { const user = new User({ books: 'ABC', }); - expect(user.books).to.eql(['A', 'B', 'C']); + expect(user.books).toEqual(['A', 'B', 'C']); }); it('coerces empty string to empty array', () => { @@ -68,7 +67,7 @@ describe('type coercion', () => { books: '', }); - expect(user.books).to.eql([]); + expect(user.books).toEqual([]); }); it('does nested coercing when expected item type is not String', () => { @@ -83,7 +82,7 @@ describe('type coercion', () => { bookIds: '123', }); - expect(library.bookIds).to.eql([1, 2, 3]); + expect(library.bookIds).toEqual([1, 2, 3]); }); it('coerces value to instance of array subclass', () => { @@ -91,17 +90,17 @@ describe('type coercion', () => { books: 'ABC', }); - expect(user.books).to.be.instanceOf(Collection); + expect(user.books).toBeInstanceOf(Collection); }); }); - context('when raw value is an array-like', () => { + describe('when raw value is an array-like', () => { it('loops using #length property', () => { const user = new User({ books: { 0: 'Stonehenge', 1: 1984, length: 2 }, }); - expect(user.books).to.eql(['Stonehenge', '1984']); + expect(user.books).toEqual(['Stonehenge', '1984']); }); it('coerces value to instance of array subclass', () => { @@ -109,11 +108,11 @@ describe('type coercion', () => { books: { 0: 'Stonehenge', 1: 1984, length: 2 }, }); - expect(user.books).to.be.instanceOf(Collection); + expect(user.books).toBeInstanceOf(Collection); }); }); - context('when raw value implements Symbol.iterator', () => { + describe('when raw value implements Symbol.iterator', () => { const books = { *[Symbol.iterator]() { for (let i = 0; i < 3; i++) { @@ -125,23 +124,23 @@ describe('type coercion', () => { it('converts to array then uses each index', () => { const user = new User({ books }); - expect(user.books).to.eql(['0', '1', '2']); + expect(user.books).toEqual(['0', '1', '2']); }); it('coerces value to instance of array subclass', () => { const user = new User({ books }); - expect(user.books).to.be.instanceOf(Collection); + expect(user.books).toBeInstanceOf(Collection); }); }); - context('when raw value is a not iterable', () => { + describe('when raw value is a not iterable', () => { it('throws an error', () => { expect(() => { new User({ books: 123, }); - }).to.throw(TypeError, /^Value must be iterable or array-like\.$/); + }).toThrow(/^Value must be iterable or array-like\.$/); }); }); }); diff --git a/test/unit/coercion/boolean.spec.js b/packages/structure/test/unit/coercion/boolean.spec.js similarity index 76% rename from test/unit/coercion/boolean.spec.js rename to packages/structure/test/unit/coercion/boolean.spec.js index 89c7e47..b8f8b88 100644 --- a/test/unit/coercion/boolean.spec.js +++ b/packages/structure/test/unit/coercion/boolean.spec.js @@ -1,9 +1,8 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('type coercion', () => { describe('Boolean', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -20,7 +19,7 @@ describe('type coercion', () => { isAdmin: undefined, }); - expect(user.isAdmin).to.be.undefined; + expect(user.isAdmin).toBeUndefined(); }); it('does not coerces null when nullable', () => { @@ -28,7 +27,7 @@ describe('type coercion', () => { hasAccepted: null, }); - expect(user.hasAccepted).to.be.null; + expect(user.hasAccepted).toBeNull(); }); it('coerces string to boolean', () => { @@ -36,7 +35,7 @@ describe('type coercion', () => { isAdmin: '10', }); - expect(user.isAdmin).to.equal(true); + expect(user.isAdmin).toBe(true); }); it('coerces empty string to false', () => { @@ -44,7 +43,7 @@ describe('type coercion', () => { isAdmin: '', }); - expect(user.isAdmin).to.equal(false); + expect(user.isAdmin).toBe(false); }); it('coerces null to false', () => { @@ -52,7 +51,7 @@ describe('type coercion', () => { isAdmin: null, }); - expect(user.isAdmin).to.be.false; + expect(user.isAdmin).toBe(false); }); it('coerces positive number to true', () => { @@ -60,7 +59,7 @@ describe('type coercion', () => { isAdmin: 1, }); - expect(user.isAdmin).to.be.true; + expect(user.isAdmin).toBe(true); }); it('coerces negative number to true', () => { @@ -68,7 +67,7 @@ describe('type coercion', () => { isAdmin: -1, }); - expect(user.isAdmin).to.be.true; + expect(user.isAdmin).toBe(true); }); it('coerces zero to false', () => { @@ -76,7 +75,7 @@ describe('type coercion', () => { isAdmin: 0, }); - expect(user.isAdmin).to.be.false; + expect(user.isAdmin).toBe(false); }); it('coerces date to true', () => { @@ -86,7 +85,7 @@ describe('type coercion', () => { isAdmin: date, }); - expect(user.isAdmin).to.be.true; + expect(user.isAdmin).toBe(true); }); it('coerces object to true', () => { @@ -94,7 +93,7 @@ describe('type coercion', () => { isAdmin: {}, }); - expect(user.isAdmin).to.be.true; + expect(user.isAdmin).toBe(true); }); }); }); diff --git a/packages/structure/test/unit/coercion/coercion.spec.js b/packages/structure/test/unit/coercion/coercion.spec.js new file mode 100644 index 0000000..63ad935 --- /dev/null +++ b/packages/structure/test/unit/coercion/coercion.spec.js @@ -0,0 +1,112 @@ +const Coercion = require('../../../src/coercion/coercion'); +const CoercionNumber = require('../../../src/coercion/coercions/number'); +const CoercionDate = require('../../../src/coercion/coercions/date'); + +describe('Coercion', () => { + describe('.create', () => { + let value, coercion, attributeDefinition; + + describe('when value is undefined', () => { + beforeEach(() => { + value = undefined; + coercion = null; + attributeDefinition = null; + }); + + it('returns undefined', () => { + const executionResponse = Coercion.create(coercion, attributeDefinition).coerce(value); + + expect(executionResponse).toBeUndefined(); + }); + }); + + describe('when value is null', () => { + beforeEach(() => (value = null)); + + describe('and attribute is nullable', () => { + beforeEach(() => { + coercion = CoercionNumber; + attributeDefinition = { options: { nullable: true } }; + }); + + it('returns null', () => { + const executionResponse = Coercion.create(coercion, attributeDefinition).coerce(value); + + expect(executionResponse).toBeNull(); + }); + }); + + describe('and attribute is not nullable', () => { + beforeEach(() => { + coercion = CoercionNumber; + attributeDefinition = { options: { nullable: false } }; + }); + + it('returns default value present on Coercion object', () => { + const executionResponse = Coercion.create(coercion, attributeDefinition).coerce(value); + + expect(executionResponse).toBe(0); + }); + }); + + describe('and default attribute is a dynamic value', () => { + beforeEach(() => { + coercion = CoercionDate; + attributeDefinition = { options: { nullable: false } }; + }); + + it('returns default value present on Coercion object', () => { + const executionResponse = Coercion.create(coercion, attributeDefinition).coerce(value); + + expect(executionResponse).toEqual(new Date('1970-01-01T00:00:00Z')); + }); + + it('creates a new object instance for default value', () => { + const executionResponse = Coercion.create(coercion, attributeDefinition).coerce(value); + + expect(executionResponse).not.toBe(coercion.nullValue()); + }); + }); + }); + + describe('when value is already coerced to correct type', () => { + let spy; + + beforeEach(() => { + value = 42; + coercion = CoercionNumber; + attributeDefinition = null; + + spy = jest.spyOn(CoercionNumber, 'coerce'); + }); + + afterEach(() => spy.mockRestore()); + + it('returns default value present on Coercion object', () => { + const executionResponse = Coercion.create(coercion, attributeDefinition).coerce(value); + + expect(executionResponse).toBe(42); + }); + + it('does not invoke #coerce function', () => { + Coercion.create(value, coercion, attributeDefinition); + + expect(spy).not.toHaveBeenCalled(); + }); + }); + + describe('when value is not coerced to correct type', () => { + beforeEach(() => { + value = '1008'; + coercion = CoercionNumber; + attributeDefinition = null; + }); + + it('returns default value present on Coercion object', () => { + const executionResponse = Coercion.create(coercion, attributeDefinition).coerce(value); + + expect(executionResponse).toBe(1008); + }); + }); + }); +}); diff --git a/test/unit/coercion/date.spec.js b/packages/structure/test/unit/coercion/date.spec.js similarity index 72% rename from test/unit/coercion/date.spec.js rename to packages/structure/test/unit/coercion/date.spec.js index e34027a..85d394b 100644 --- a/test/unit/coercion/date.spec.js +++ b/packages/structure/test/unit/coercion/date.spec.js @@ -1,9 +1,8 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('type coercion', () => { describe('Date', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -20,8 +19,8 @@ describe('type coercion', () => { const user = new User({ birth }); - expect(user.birth).to.not.equal(new Date(birth.toString())); - expect(user.birth).to.eql(birth); + expect(user.birth).not.toEqual(new Date(birth.toString())); + expect(user.birth).toBe(birth); }); it('does not coerces undefined', () => { @@ -29,7 +28,7 @@ describe('type coercion', () => { birth: undefined, }); - expect(user.birth).to.be.undefined; + expect(user.birth).toBeUndefined(); }); it('does not coerces null when nullable', () => { @@ -37,7 +36,7 @@ describe('type coercion', () => { death: null, }); - expect(user.death).to.be.null; + expect(user.death).toBeNull(); }); it('coerces string to date', () => { @@ -45,7 +44,7 @@ describe('type coercion', () => { birth: 'Feb 3, 1892', }); - expect(user.birth).to.eql(new Date('Feb 3, 1892')); + expect(user.birth).toEqual(new Date('Feb 3, 1892')); }); it('coerces null to first date on Unix time', () => { @@ -53,7 +52,7 @@ describe('type coercion', () => { birth: null, }); - expect(user.birth).to.eql(new Date('1970-01-01T00:00:00Z')); + expect(user.birth).toEqual(new Date('1970-01-01T00:00:00Z')); }); }); }); diff --git a/test/unit/coercion/number.spec.js b/packages/structure/test/unit/coercion/number.spec.js similarity index 73% rename from test/unit/coercion/number.spec.js rename to packages/structure/test/unit/coercion/number.spec.js index af5e28c..00b6f36 100644 --- a/test/unit/coercion/number.spec.js +++ b/packages/structure/test/unit/coercion/number.spec.js @@ -1,9 +1,8 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('type coercion', () => { describe('Number', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -20,9 +19,9 @@ describe('type coercion', () => { const user = new User({ age }); - expect(user.age).to.not.equal(42); - expect(user.age).to.not.equal(new Number(42)); - expect(user.age).to.eql(age); + expect(user.age).not.toBe(42); + expect(user.age).not.toBe(new Number(42)); + expect(user.age).toBe(age); }); it('does not coerces undefined', () => { @@ -30,7 +29,7 @@ describe('type coercion', () => { age: undefined, }); - expect(user.age).to.be.undefined; + expect(user.age).toBeUndefined(); }); it('does not coerce null when nullable', () => { @@ -38,7 +37,7 @@ describe('type coercion', () => { earnings: null, }); - expect(user.earnings).to.be.null; + expect(user.earnings).toBeNull(); }); it('coerces string to number', () => { @@ -46,7 +45,7 @@ describe('type coercion', () => { age: '10', }); - expect(user.age).to.equal(10); + expect(user.age).toBe(10); }); it('coerces null to zero', () => { @@ -54,7 +53,7 @@ describe('type coercion', () => { age: null, }); - expect(user.age).to.equal(0); + expect(user.age).toBe(0); }); it('coerces true to one', () => { @@ -62,7 +61,7 @@ describe('type coercion', () => { age: true, }); - expect(user.age).to.equal(1); + expect(user.age).toBe(1); }); it('coerces false to zero', () => { @@ -70,7 +69,7 @@ describe('type coercion', () => { age: false, }); - expect(user.age).to.equal(0); + expect(user.age).toBe(0); }); it('coerces date to number', () => { @@ -80,11 +79,11 @@ describe('type coercion', () => { age: date, }); - expect(user.age).to.equal(date.valueOf()); + expect(user.age).toBe(date.valueOf()); }); describe('coercing an object to number', () => { - context('when the object does not implement #valueOf()', () => { + describe('when the object does not implement #valueOf()', () => { it('coerces object to NaN', () => { const objectWithoutValueOf = { data: 42 }; @@ -92,11 +91,11 @@ describe('type coercion', () => { age: objectWithoutValueOf, }); - expect(Number.isNaN(user.age)).to.be.true; + expect(Number.isNaN(user.age)).toBe(true); }); }); - context('when the object implements #valueOf()', () => { + describe('when the object implements #valueOf()', () => { it('coerces object to value returned by #valueOf()', () => { const objectWithValueOf = { data: '42', @@ -109,7 +108,7 @@ describe('type coercion', () => { age: objectWithValueOf, }); - expect(user.age).to.equal(42); + expect(user.age).toBe(42); }); }); }); diff --git a/test/unit/coercion/pojo.spec.js b/packages/structure/test/unit/coercion/pojo.spec.js similarity index 72% rename from test/unit/coercion/pojo.spec.js rename to packages/structure/test/unit/coercion/pojo.spec.js index c4e0b2e..27d1a2e 100644 --- a/test/unit/coercion/pojo.spec.js +++ b/packages/structure/test/unit/coercion/pojo.spec.js @@ -1,10 +1,9 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('type coercion', () => { describe('POJO class', () => { - var User; - var Location; + let User; + let Location; beforeEach(() => { Location = class Location { @@ -24,7 +23,7 @@ describe('type coercion', () => { const user = new User({ location }); - expect(user.location).to.equal(location); + expect(user.location).toBe(location); }); it('instantiates class with raw value', () => { @@ -32,9 +31,9 @@ describe('type coercion', () => { location: { x: 1, y: 2 }, }); - expect(user.location).to.be.instanceOf(Location); - expect(user.location.x).to.equal(1); - expect(user.location.y).to.equal(2); + expect(user.location).toBeInstanceOf(Location); + expect(user.location.x).toBe(1); + expect(user.location.y).toBe(2); }); it('does not coerce undefined', () => { @@ -42,7 +41,7 @@ describe('type coercion', () => { location: undefined, }); - expect(user.location).to.be.undefined; + expect(user.location).toBeUndefined(); }); }); }); diff --git a/test/unit/coercion/string.spec.js b/packages/structure/test/unit/coercion/string.spec.js similarity index 69% rename from test/unit/coercion/string.spec.js rename to packages/structure/test/unit/coercion/string.spec.js index c3b0e97..bb75321 100644 --- a/test/unit/coercion/string.spec.js +++ b/packages/structure/test/unit/coercion/string.spec.js @@ -1,9 +1,8 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('type coercion', () => { describe('String', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -15,15 +14,15 @@ describe('type coercion', () => { })(class User {}); }); - context('when not nullable', () => { + describe('when not nullable', () => { it('does not coerce if value is already a string', () => { const name = new String('Some name'); const user = new User({ name }); - expect(user.name).to.not.equal('Some name'); - expect(user.name).to.not.equal(new String('Some name')); - expect(user.name).to.eql(name); + expect(user.name).not.toBe('Some name'); + expect(user.name).not.toBe(new String('Some name')); + expect(user.name).toBe(name); }); it('does not coerces undefined', () => { @@ -31,7 +30,7 @@ describe('type coercion', () => { name: undefined, }); - expect(user.name).to.be.undefined; + expect(user.name).toBeUndefined(); }); it('coerces integer to string', () => { @@ -39,7 +38,7 @@ describe('type coercion', () => { name: 10, }); - expect(user.name).to.equal('10'); + expect(user.name).toEqual('10'); }); it('coerces float to string', () => { @@ -47,7 +46,7 @@ describe('type coercion', () => { name: 10.42, }); - expect(user.name).to.equal('10.42'); + expect(user.name).toEqual('10.42'); }); it('coerces null to empty string', () => { @@ -55,7 +54,7 @@ describe('type coercion', () => { name: null, }); - expect(user.name).to.equal(''); + expect(user.name).toBe(''); }); it('coerces boolean to string', () => { @@ -63,7 +62,7 @@ describe('type coercion', () => { name: false, }); - expect(user.name).to.equal('false'); + expect(user.name).toEqual('false'); }); it('coerces date to string', () => { @@ -73,19 +72,19 @@ describe('type coercion', () => { name: date, }); - expect(user.name).to.equal(date.toString()); + expect(user.name).toEqual(date.toString()); }); }); - context('when nullable', () => { + describe('when nullable', () => { it('does not coerce if value is already a string', () => { const fatherName = new String('Some name'); const user = new User({ fatherName }); - expect(user.fatherName).to.not.equal('Some name'); - expect(user.fatherName).to.not.equal(new String('Some name')); - expect(user.fatherName).to.eql(fatherName); + expect(user.fatherName).not.toBe('Some name'); + expect(user.fatherName).not.toBe(new String('Some name')); + expect(user.fatherName).toBe(fatherName); }); it('does not coerces undefined', () => { @@ -93,7 +92,7 @@ describe('type coercion', () => { fatherName: undefined, }); - expect(user.fatherName).to.be.undefined; + expect(user.fatherName).toBeUndefined(); }); it('does not coerces null', () => { @@ -101,7 +100,7 @@ describe('type coercion', () => { fatherName: null, }); - expect(user.fatherName).to.be.null; + expect(user.fatherName).toBeNull(); }); it('coerces integer to string', () => { @@ -109,7 +108,7 @@ describe('type coercion', () => { fatherName: 10, }); - expect(user.fatherName).to.equal('10'); + expect(user.fatherName).toEqual('10'); }); it('coerces float to string', () => { @@ -117,7 +116,7 @@ describe('type coercion', () => { fatherName: 10.42, }); - expect(user.fatherName).to.equal('10.42'); + expect(user.fatherName).toEqual('10.42'); }); it('coerces boolean to string', () => { @@ -125,7 +124,7 @@ describe('type coercion', () => { fatherName: false, }); - expect(user.fatherName).to.equal('false'); + expect(user.fatherName).toEqual('false'); }); it('coerces date to string', () => { @@ -135,12 +134,12 @@ describe('type coercion', () => { fatherName: date, }); - expect(user.fatherName).to.equal(date.toString()); + expect(user.fatherName).toEqual(date.toString()); }); }); describe('coercing an object to string', () => { - context('when the object does not implement #toString()', () => { + describe('when the object does not implement #toString()', () => { it('coerces object to object tag string', () => { const objectWithoutToString = { data: 42 }; @@ -148,11 +147,11 @@ describe('type coercion', () => { name: objectWithoutToString, }); - expect(user.name).to.equal('[object Object]'); + expect(user.name).toEqual('[object Object]'); }); }); - context('when the object implements #toString()', () => { + describe('when the object implements #toString()', () => { it('coerces object to value returned from #toString()', () => { const objectWithToString = { data: 42, @@ -165,7 +164,7 @@ describe('type coercion', () => { name: objectWithToString, }); - expect(user.name).to.equal('42'); + expect(user.name).toEqual('42'); }); }); }); diff --git a/test/unit/coercion/structure.spec.js b/packages/structure/test/unit/coercion/structure.spec.js similarity index 54% rename from test/unit/coercion/structure.spec.js rename to packages/structure/test/unit/coercion/structure.spec.js index 9c54721..ac4d60a 100644 --- a/test/unit/coercion/structure.spec.js +++ b/packages/structure/test/unit/coercion/structure.spec.js @@ -1,10 +1,9 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('type coercion', () => { describe('Structure class', () => { - var Location; - var User; + let Location; + let User; beforeEach(() => { Location = attributes({ @@ -21,8 +20,8 @@ describe('type coercion', () => { })(class User {}); }); - context('when raw value is an instance of class', () => { - var location, user; + describe('when raw value is an instance of class', () => { + let location, user; beforeEach(() => { location = new Location({ x: 1, y: 2 }); @@ -30,12 +29,12 @@ describe('type coercion', () => { }); it('does not coerce', () => { - expect(user.location).to.equal(location); + expect(user.location).toBe(location); }); }); - context('when attributes is already in correct type', () => { - var user; + describe('when attributes is already in correct type', () => { + let user; beforeEach(() => { user = new User({ @@ -44,14 +43,14 @@ describe('type coercion', () => { }); it('does not coerce', () => { - expect(user.location).to.be.instanceOf(Location); - expect(user.location.x).to.equal(1); - expect(user.location.y).to.equal(2); + expect(user.location).toBeInstanceOf(Location); + expect(user.location.x).toBe(1); + expect(user.location.y).toBe(2); }); }); - context('when attributes in a different type', () => { - var user; + describe('when attributes in a different type', () => { + let user; beforeEach(() => { user = new User({ @@ -60,54 +59,54 @@ describe('type coercion', () => { }); it('coerces to correct type', () => { - expect(user.location).to.be.instanceOf(Location); - expect(user.location.x).to.equal(1); - expect(user.location.y).to.equal(2); + expect(user.location).toBeInstanceOf(Location); + expect(user.location.x).toBe(1); + expect(user.location.y).toBe(2); }); }); - context('when value is undefined', () => { - var user; + describe('when value is undefined', () => { + let user; beforeEach(() => (user = new User({ location: undefined }))); it('does not coerce', () => { - expect(user.location).to.be.undefined; + expect(user.location).toBeUndefined(); }); }); - context('when value is null', () => { - var user; + describe('when value is null', () => { + let user; - context('and attribute is nullable', () => { + describe('and attribute is nullable', () => { beforeEach(() => (user = new User({ destination: null }))); it('assigns null', () => { - expect(user.destination).to.be.null; + expect(user.destination).toBeNull(); }); }); - context('and attribute is not nullable', () => { + describe('and attribute is not nullable', () => { beforeEach(() => (user = new User({ location: null }))); it('assigns undefined', () => { - expect(user.location).to.be.undefined; + expect(user.location).toBeUndefined(); }); }); }); }); describe('Structure class with dynamic attribute types', () => { - var CircularUser; - var CircularBook; + let CircularUser; + let CircularBook; beforeEach(() => { CircularUser = require('../../fixtures/CircularUser'); CircularBook = require('../../fixtures/CircularBook'); }); - context('when there are not allowed nullable attributes', () => { - var userOne, userTwo; + describe('when there are not allowed nullable attributes', () => { + let userOne, userTwo; beforeEach(() => { userOne = new CircularUser({ @@ -128,14 +127,14 @@ describe('type coercion', () => { }); it('creates instance properly', () => { - expect(userOne).to.be.instanceOf(CircularUser); - expect(userOne.favoriteBook).to.be.instanceOf(CircularBook); - expect(userOne.favoriteBook.owner).to.be.instanceOf(CircularUser); - expect(userOne.nextBook).to.be.undefined; - - expect(userTwo).to.be.instanceOf(CircularUser); - expect(userTwo.friends[0]).to.be.instanceOf(CircularUser); - expect(userTwo.nextBook).to.be.undefined; + expect(userOne).toBeInstanceOf(CircularUser); + expect(userOne.favoriteBook).toBeInstanceOf(CircularBook); + expect(userOne.favoriteBook.owner).toBeInstanceOf(CircularUser); + expect(userOne.nextBook).toBeUndefined(); + + expect(userTwo).toBeInstanceOf(CircularUser); + expect(userTwo.friends[0]).toBeInstanceOf(CircularUser); + expect(userTwo.nextBook).toBeUndefined(); }); it('coerces when updating the value', () => { @@ -151,15 +150,15 @@ describe('type coercion', () => { owner: { name: 'New name' }, }; - expect(user.favoriteBook).to.be.instanceOf(CircularBook); - expect(user.favoriteBook.name).to.equal('The World of Ice & Fire'); - expect(user.favoriteBook.owner).to.be.instanceOf(CircularUser); - expect(user.favoriteBook.owner.name).to.equal('New name'); + expect(user.favoriteBook).toBeInstanceOf(CircularBook); + expect(user.favoriteBook.name).toBe('The World of Ice & Fire'); + expect(user.favoriteBook.owner).toBeInstanceOf(CircularUser); + expect(user.favoriteBook.owner.name).toBe('New name'); }); }); - context('when there are allowed nullable attributes', () => { - var userOne, userTwo; + describe('when there are allowed nullable attributes', () => { + let userOne, userTwo; beforeEach(() => { userOne = new CircularUser({ friends: [], favoriteBook: null }); @@ -167,11 +166,11 @@ describe('type coercion', () => { }); it('creates instance properly', () => { - expect(userOne).to.be.instanceOf(CircularUser); - expect(userOne.favoriteBook).to.be.null; + expect(userOne).toBeInstanceOf(CircularUser); + expect(userOne.favoriteBook).toBeNull(); - expect(userTwo).to.be.instanceOf(CircularUser); - expect(userTwo.favoriteBook).to.be.null; + expect(userTwo).toBeInstanceOf(CircularUser); + expect(userTwo.favoriteBook).toBeNull(); }); }); }); diff --git a/test/unit/coercion/typeCoercion.spec.js b/packages/structure/test/unit/coercion/typeCoercion.spec.js similarity index 76% rename from test/unit/coercion/typeCoercion.spec.js rename to packages/structure/test/unit/coercion/typeCoercion.spec.js index 5bb3cb5..27f5cff 100644 --- a/test/unit/coercion/typeCoercion.spec.js +++ b/packages/structure/test/unit/coercion/typeCoercion.spec.js @@ -1,8 +1,7 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('type coercion', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -15,6 +14,6 @@ describe('type coercion', () => { user.name = 42; - expect(user.name).to.equal('42'); + expect(user.name).toBe('42'); }); }); diff --git a/packages/structure/test/unit/creatingStructureClass.spec.js b/packages/structure/test/unit/creatingStructureClass.spec.js new file mode 100644 index 0000000..df5db4e --- /dev/null +++ b/packages/structure/test/unit/creatingStructureClass.spec.js @@ -0,0 +1,152 @@ +const { attributes } = require('../../src'); + +describe('creating a structure class', () => { + describe('structure class is passed as the second parameter', () => { + describe('when structure class has a name', () => { + it('throws with a message with structure class name', () => { + expect(() => { + attributes({}, class User {}); + }).toThrow(/^You passed the structure class.*\(User\)`\./); + }); + }); + + describe('when structure class is anonymous', () => { + it('throws with a message with generic structure name', () => { + // It's like this because Babel gives the name _class + // to anonymous classes and do function auto-naming, + // breaking browser tests + const anonymousClass = (() => function() {})(); + + expect(() => { + attributes({}, anonymousClass); + }).toThrow(/^You passed the structure class.*\(StructureClass\)`\./); + }); + }); + }); + + describe('using class static methods and properties', () => { + let User; + + beforeEach(() => { + class RawUser { + static staticMethod() { + return 'I am on a static method'; + } + } + + RawUser.staticProperty = 'I am a static property'; + + User = attributes({ + name: String, + })(RawUser); + }); + + it('has access to static methods and properties', () => { + expect(User.staticMethod()).toBe('I am on a static method'); + expect(User.staticProperty).toBe('I am a static property'); + }); + }); + + describe('using default values for attributes', () => { + describe('when the provided default value is a function', () => { + let User; + + beforeEach(() => { + User = attributes({ + age: { type: Number, default: () => 18 }, + })(class User {}); + }); + + it('defines the attribute with the default value executing the function', () => { + const user = new User(); + + expect(user.age).toBe(18); + }); + }); + + describe('when the function default value uses another class attribute', () => { + let User; + + beforeEach(() => { + User = attributes({ + name: String, + surname: String, + fullname: { + type: String, + default: (self) => `${self.name} ${self.surname}`, + }, + })(class User {}); + }); + + it('defines the attribute with the default value executing the function', () => { + const user = new User({ name: 'Jack', surname: 'Sparrow' }); + + expect(user.fullname).toBe('Jack Sparrow'); + }); + }); + + describe('when the provided default value is a property', () => { + let User; + + beforeEach(() => { + User = attributes({ + age: { type: Number, default: 18 }, + })(class User {}); + }); + + it('defines the attribute with the default value of the property', () => { + const user = new User(); + + expect(user.age).toBe(18); + }); + }); + }); + + describe('when type is not valid', () => { + describe('when shorthand notation is not a constructor nor a dynamic type name', () => { + it('throws an error', () => { + expect(() => { + attributes({ + name: true, + })(class User {}); + }).toThrow(/^Attribute type must be a constructor or the name of a dynamic type: name\.$/); + }); + }); + + describe('when complete notation is not a constructor nor a dynamic type name', () => { + it('throws an error', () => { + expect(() => { + attributes({ + name: { type: true }, + })(class User {}); + }).toThrow(/^Attribute type must be a constructor or the name of a dynamic type: name\.$/); + }); + }); + }); + + describe('when using dynamic attribute types', () => { + it('allows to use dynamic values', () => { + expect(() => { + require('../fixtures/CircularUser'); + require('../fixtures/CircularBook'); + }).not.toThrow(); + }); + + describe('when using custom identifiers', () => { + it('allows to use dynamic types', () => { + expect(() => { + require('../fixtures/CircularUserCustomIdentifier'); + require('../fixtures/CircularBookCustomIdentifier'); + }).not.toThrow(); + }); + }); + + describe('when some dynamic type is missing value', () => { + it('breaks', () => { + expect(() => { + require('../fixtures/BrokenCircularBook'); + }).toThrow('Missing dynamic type for attribute: owner'); + }); + }); + }); +}); diff --git a/packages/structure/test/unit/featureSwitches/coercion.spec.js b/packages/structure/test/unit/featureSwitches/coercion.spec.js new file mode 100644 index 0000000..26bf849 --- /dev/null +++ b/packages/structure/test/unit/featureSwitches/coercion.spec.js @@ -0,0 +1,171 @@ +const { attributes } = require('../../../src'); + +describe('coercion feature switch', () => { + describe('when using for the whole structure', () => { + describe('explicitly enabled', () => { + let User; + + beforeEach(() => { + User = attributes( + { + name: String, + }, + { + coercion: true, + } + )(class User {}); + }); + + it('coerces attribute', () => { + const user = new User({ name: 42 }); + + expect(user.name).toEqual('42'); + }); + }); + + describe('enabled by default', () => { + let User; + + beforeEach(() => { + User = attributes({ + name: String, + })(class User {}); + }); + + it('coerces attribute', () => { + const user = new User({ name: 42 }); + + expect(user.name).toEqual('42'); + }); + }); + + describe('disabled', () => { + let User; + + beforeEach(() => { + User = attributes( + { + name: String, + }, + { + coercion: false, + } + )(class User {}); + }); + + it('does not coerce attribute', () => { + const user = new User({ name: 42 }); + + expect(user.name).toEqual(42); + }); + + it('fails validation because of wrong type', () => { + const user = new User({ name: 42 }); + + expect(user).toHaveInvalidAttribute(['name'], ['"name" must be a string']); + }); + }); + }); + + describe('when using for a single attribute', () => { + describe('enabled', () => { + let User; + + beforeEach(() => { + User = attributes({ + name: { type: String, coercion: true }, + age: Number, + })(class User {}); + }); + + it('coerces attribute', () => { + const user = new User({ name: 42 }); + + expect(user.name).toEqual('42'); + }); + }); + + describe('disabled', () => { + let User; + + beforeEach(() => { + User = attributes({ + name: { type: String, coercion: false }, + age: Number, + })(class User {}); + }); + + it('does not coerce attribute', () => { + const user = new User({ name: 42 }); + + expect(user.name).toEqual(42); + }); + + it('fails validation because of wrong type', () => { + const user = new User({ name: 42 }); + + expect(user).toHaveInvalidAttribute(['name'], ['"name" must be a string']); + }); + }); + + describe('overrides the schema', () => { + describe('schema: disabled, attribute: enabled', () => { + let User; + + beforeEach(() => { + User = attributes( + { + name: { type: String, coercion: true }, + age: Number, + }, + { + coercion: false, + } + )(class User {}); + }); + + it('coerces the attribute but not the others', () => { + const user = new User({ name: 42, age: '1' }); + + expect(user.name).toEqual('42'); + expect(user.age).toEqual('1'); + }); + + it('fails validation because of wrong type of other attributes', () => { + const user = new User({ name: 42, age: '1' }); + + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be a number']); + }); + }); + + describe('schema: enabled, attribute: disabled', () => { + let User; + + beforeEach(() => { + User = attributes( + { + name: { type: String, coercion: false }, + age: Number, + }, + { + coercion: true, + } + )(class User {}); + }); + + it('does not coerce the attribute but coerces the others', () => { + const user = new User({ name: 42, age: '1' }); + + expect(user.name).toEqual(42); + expect(user.age).toEqual(1); + }); + + it('fails validation because of wrong type', () => { + const user = new User({ name: 42, age: '1' }); + + expect(user).toHaveInvalidAttribute(['name'], ['"name" must be a string']); + }); + }); + }); + }); +}); diff --git a/packages/structure/test/unit/instanceAndUpdate.spec.js b/packages/structure/test/unit/instanceAndUpdate.spec.js new file mode 100644 index 0000000..ab5c2cf --- /dev/null +++ b/packages/structure/test/unit/instanceAndUpdate.spec.js @@ -0,0 +1,721 @@ +const { attributes } = require('../../src'); + +describe('instantiating a structure', () => { + let User; + + beforeEach(() => { + User = attributes({ + name: { + type: String, + default: 'Name', + }, + password: { + type: String, + required: true, + }, + nickname: { + type: String, + default: (instance) => instance.name, + }, + uuid: { + type: String, + default: (instance) => instance.getUuid(), + }, + attrWithCustomSetter: String, + attrWithCustomGetter: String, + attrWithCustomSetterAndGetter: String, + attrUsingMethodUsingAttr: { + type: String, + default: (instance) => instance.someMethod(), + }, + nullableWithoutDefault: { + type: String, + nullable: true, + }, + nullableWithDefault: { + type: String, + default: 'The Default', + nullable: true, + }, + })( + class User { + constructor() { + this.userInstanceStuff = 'Stuff value'; + } + + userMethod() { + return 'I am a user'; + } + + getUuid() { + return 10; + } + + someMethod() { + return `Method => ${this.name}`; + } + + set attrWithCustomSetter(value) { + this.set('attrWithCustomSetter', value); + } + + get attrWithCustomGetter() { + return this.get('attrWithCustomGetter'); + } + + set attrWithCustomSetterAndGetter(value) { + this.set('attrWithCustomSetterAndGetter', `${value}...`); + } + + get attrWithCustomSetterAndGetter() { + return `-> ${this.get('attrWithCustomSetterAndGetter')}`; + } + } + ); + }); + + it('has access to instance methods', () => { + const user = new User(); + + expect(user.userMethod()).toEqual('I am a user'); + }); + + it('has access to instance attributes created on constructor', () => { + const user = new User(); + + expect(user.userInstanceStuff).toEqual('Stuff value'); + }); + + it('has attributes passed to constructor assigned to the object', () => { + const user = new User({ + password: 'My password', + }); + + expect(user.password).toEqual('My password'); + }); + + it('does not mutate the attributes object passed to the constructor', () => { + const attributesObject = {}; + + new User(attributesObject); + + expect(Object.keys(attributesObject)).toHaveLength(0); + }); + + it('ignores invalid attributes passed to constructor', () => { + const user = new User({ + invalid: 'I will be ignored', + }); + + expect(user.invalid).toBeUndefined(); + }); + + it('reflects instance attributes to #attributes', () => { + const user = new User({ + password: 'The password', + }); + + expect(user.password).toEqual('The password'); + expect(user.attributes.password).toEqual('The password'); + }); + + describe('attributes initialization', () => { + describe('default value', () => { + describe('when attribute is non-nullable and has static default', () => { + describe('when passed value is undefined', () => { + it('defaults to the static value', () => { + const user = new User(); + + expect(user.name).toEqual('Name'); + }); + }); + + describe('when passed value is null', () => { + it('defaults to the static value', () => { + const user = new User({ name: null }); + + expect(user.name).toEqual('Name'); + }); + }); + }); + + describe('when attribute is non-nullable and default value is a function', () => { + describe('when passed value is undefined', () => { + it('calls the function using the instance of the object as parameter and perform coercion', () => { + const user = new User(); + + expect(user.uuid).toEqual('10'); + }); + }); + + describe('when passed value is null', () => { + it('calls the function using the instance of the object as parameter and perform coercion', () => { + const user = new User({ uuid: null }); + + expect(user.uuid).toEqual('10'); + }); + }); + }); + + describe('when attribute dynamic default uses a static defaultable attribute', () => { + describe('when static defaultable attribute uses default value', () => { + it('allows to access the value of that attribute', () => { + const user = new User(); + + expect(user.nickname).toEqual('Name'); + }); + }); + + describe('when static defaultable attribute has a value passed to it', () => { + it('allows to access the value of that attribute', () => { + const user = new User({ name: 'This is my name' }); + + expect(user.nickname).toEqual('This is my name'); + }); + }); + + describe('when dynamic default uses a method that uses an attribute with default', () => { + it('generates the default value properly', () => { + const user = new User(); + + expect(user.attrUsingMethodUsingAttr).toEqual('Method => Name'); + }); + }); + }); + + describe('when attribute is nullable and has a default', () => { + describe('when passed value is undefined', () => { + it('uses default', () => { + const user = new User({}); + + expect(user.nullableWithDefault).toEqual('The Default'); + }); + }); + + describe('when passed value is null', () => { + it('leaves it as null', () => { + const user = new User({ nullableWithDefault: null }); + + expect(user.nullableWithDefault).toBeNull(); + }); + }); + }); + + describe('when attribute is nullable and has no default', () => { + describe('when passed value is undefined', () => { + it('leaves it as undefined', () => { + const user = new User({}); + + expect(user.nullableWithoutDefault).toEqual(undefined); + }); + }); + + describe('when passed value is null', () => { + it('leaves it as null', () => { + const user = new User({ nullableWithoutDefault: null }); + + expect(user.nullableWithoutDefault).toBeNull(); + }); + }); + }); + + it('overwrites default value with passed value', () => { + const user = new User({ name: 'Not the default' }); + + expect(user.name).toEqual('Not the default'); + }); + }); + + describe('instantiating a structure with buildStrict', () => { + describe('when object is invalid', () => { + describe('when using default error class', () => { + it('throws a default error', (done) => { + let errorDetails = [ + { + message: '"password" is required', + path: ['password'], + }, + ]; + + try { + User.buildStrict(); + } catch (error) { + expect(error).toHaveProperty('details', errorDetails); + done(); + } + }); + }); + + describe('when using custom error class', () => { + let UserWithCustomError; + let InvalidUser; + + beforeEach(() => { + InvalidUser = class InvalidUser extends Error { + constructor(errors) { + super('There is something wrong with this user'); + this.errors = errors; + } + }; + + UserWithCustomError = attributes( + { + name: { + type: String, + minLength: 3, + }, + }, + { + strictValidationErrorClass: InvalidUser, + } + )(class UserWithCustomError {}); + }); + + it('throws a custom error', () => { + expect(() => { + UserWithCustomError.buildStrict({ + name: 'JJ', + }); + }).toThrow('There is something wrong with this user'); + }); + }); + }); + + describe('when object is valid', () => { + it('return an intance', () => { + const user = User.buildStrict({ + password: 'My password', + }); + + expect(user.password).toEqual('My password'); + }); + }); + }); + }); + + describe('custom setters and getters', () => { + describe('when attribute that has a custom setter is set', () => { + it('calls custom setter', () => { + const user = new User({ attrWithCustomSetter: 'abc' }); + + expect(user.attrWithCustomSetter).toBe('abc'); + }); + + it('does coercion to the set value', () => { + const user = new User({ attrWithCustomSetter: 42 }); + + expect(user.attrWithCustomSetter).toBe('42'); + }); + }); + + describe('when attribute that has a custom getter is requested', () => { + it('calls custom getter', () => { + const user = new User({ attrWithCustomGetter: 'abc' }); + + expect(user.attrWithCustomGetter).toBe('abc'); + }); + }); + + describe('when attribute has custom setter and getter', () => { + it('calls setter when setting', () => { + const user = new User({ attrWithCustomSetterAndGetter: 'a' }); + + expect(user.attributes.attrWithCustomSetterAndGetter).toEqual('a...'); + }); + + it('calls getter when getting', () => { + const user = new User({ attrWithCustomSetterAndGetter: 'a' }); + + expect(user.attrWithCustomSetterAndGetter).toEqual('-> a...'); + }); + }); + + describe('when tries to set an attribute that does not exist', () => { + it('fails and throws an error', () => { + const User = attributes({ + name: String, + })( + class User { + set name(value) { + this.set('NOPE', `> ${value}`); + } + } + ); + + expect(() => { + new User({ name: 'hmm...' }); + }).toThrowErrorMatchingSnapshot(); + }); + }); + }); +}); + +describe('instantiating a structure with dynamic attribute types', () => { + let CircularUser; + let CircularBook; + + beforeEach(() => { + CircularUser = require('../fixtures/CircularUser'); + CircularBook = require('../fixtures/CircularBook'); + }); + + it('creates instance properly', () => { + const userOne = new CircularUser({ + name: 'Circular user one', + friends: [], + favoriteBook: new CircularBook({ + name: 'Brave new world', + owner: new CircularUser(), + }), + }); + + const userTwo = new CircularUser({ + name: 'Circular user two', + friends: [userOne], + }); + + expect(userOne).toBeInstanceOf(CircularUser); + expect(userOne.favoriteBook).toBeInstanceOf(CircularBook); + expect(userOne.favoriteBook.owner).toBeInstanceOf(CircularUser); + expect(userTwo).toBeInstanceOf(CircularUser); + expect(userTwo.friends[0]).toBeInstanceOf(CircularUser); + }); + + describe('with buildStrict', () => { + describe('when object is invalid', () => { + it('throw an error', (done) => { + let errorDetails = [ + { + message: '"favoriteBook.pages" must be a number', + path: ['favoriteBook', 'pages'], + }, + ]; + + try { + CircularUser.buildStrict({ + name: 'Circular user one', + friends: [], + favoriteBook: new CircularBook({ + name: 'Brave new world', + pages: 'twenty', + }), + }); + } catch (error) { + expect(error).toHaveProperty('details', errorDetails); + done(); + } + }); + }); + }); +}); + +describe('updating an instance', () => { + let User; + + beforeEach(() => { + User = attributes({ + name: String, + age: Number, + nickname: String, + })( + class User { + set nickname(newNickname) { + this.set('nickname', `> ${newNickname} <`); + } + } + ); + }); + + it('updates instance attribute value when assigned a new value', () => { + const user = new User({ + name: 'My name', + }); + + user.name = 'New name'; + + expect(user.name).toEqual('New name'); + }); + + it('reflects new value assigned to attribute on #attributes', () => { + const user = new User({ + name: 'My name', + }); + + user.name = 'New name'; + + expect(user.attributes.name).toEqual('New name'); + }); + + it('reflects and coerces new values assigned to #attributes on instance attribute', () => { + const user = new User({ + name: 'My name', + }); + + user.attributes = { + name: 'New name', + age: '123', + }; + + expect(user.name).toBe('New name'); + expect(user.age).toBe(123); + }); + + it('does not throw if no attributes are passed when instantiating', () => { + expect(() => { + new User(); + }).not.toThrow(Error); + }); + + it('throws if value assigned to #attributes is not an object', () => { + const user = new User({ + name: 'My name', + }); + + expect(() => { + user.attributes = null; + }).toThrow(/^#attributes can't be set to a non-object\.$/); + }); + + it('uses custom setter', () => { + const user = new User({}); + + user.nickname = 'ABC'; + + expect(user.nickname).toBe('> ABC <'); + }); +}); + +describe('updating a structure with dynamic attribute types', () => { + let CircularUser; + let CircularBook; + + beforeEach(() => { + CircularUser = require('../fixtures/CircularUser'); + CircularBook = require('../fixtures/CircularBook'); + }); + + it('updates instance attribute when assigned a new value', () => { + const user = new CircularUser({ + favoriteBook: new CircularBook({ + name: 'Brave new world', + owner: new CircularUser(), + }), + }); + + user.favoriteBook = new CircularBook({ + name: '1984', + owner: user, + }); + + expect(user.favoriteBook).toBeInstanceOf(CircularBook); + expect(user.favoriteBook.owner).toBeInstanceOf(CircularUser); + expect(user.favoriteBook.owner).toBe(user); + }); +}); + +describe('cloning an instance', () => { + let User; + let Book; + + beforeEach(() => { + Book = attributes({ + name: { + type: String, + required: true, + }, + })(class Book {}); + + User = attributes({ + name: { + type: String, + required: true, + }, + age: Number, + favoriteBook: Book, + })(class User {}); + }); + + describe('when nothing is overwritten', () => { + describe('when not passing overwrite object', () => { + it('makes a shallow clone', () => { + const user = new User({ + name: 'Me', + favoriteBook: { + name: 'The Silmarillion', + }, + }); + + const userClone = user.clone(); + + expect(userClone.name).toEqual('Me'); + expect(userClone.favoriteBook).toBe(user.favoriteBook); + }); + }); + + describe('when passing overwrite object', () => { + it('makes a shallow clone', () => { + const user = new User({ + name: 'Me', + favoriteBook: { + name: 'The Silmarillion', + }, + }); + + const userClone = user.clone({}); + + expect(userClone.name).toEqual('Me'); + expect(userClone.favoriteBook).toBe(user.favoriteBook); + }); + }); + }); + + describe('when overwritting attributes', () => { + describe('when overwritting a primitive type attribute', () => { + it('overwrites it, leaving other attributes untouched', () => { + const user = new User({ + name: 'Me', + favoriteBook: { + name: 'The Silmarillion', + }, + }); + + const userClone = user.clone({ + name: 'Myself', + }); + + expect(userClone.name).toEqual('Myself'); + expect(userClone.favoriteBook).toBe(user.favoriteBook); + }); + + describe('when overwritten attribute needs coercion', () => { + it('coerces attribute', () => { + const user = new User({ + name: 'Me', + age: 42, + favoriteBook: { + name: 'The Silmarillion', + }, + }); + + const userClone = user.clone({ + age: '123', + }); + + expect(userClone.age).toEqual(123); + }); + }); + }); + + describe('when overwritting a nested structure', () => { + describe('when passing a new instance of the nested structure', () => { + it('overwrites it, leaving other attributes untouched', () => { + const user = new User({ + name: 'Me', + favoriteBook: { + name: 'The Silmarillion', + }, + }); + + const userClone = user.clone({ + favoriteBook: new Book({ name: 'The Lord of the Rings' }), + }); + + expect(userClone.name).toEqual('Me'); + expect(userClone.favoriteBook).not.toBe(user.favoriteBook); + expect(userClone.favoriteBook.name).toEqual('The Lord of the Rings'); + }); + }); + + describe('when passing the attributes of the nested structure', () => { + it('coerces attribute to a new nested structure, overwrites it, and leave other attributes untouched', () => { + const user = new User({ + name: 'Me', + favoriteBook: { + name: 'The Silmarillion', + }, + }); + + const userClone = user.clone({ + favoriteBook: { name: 'The Lord of the Rings' }, + }); + + expect(userClone.name).toEqual('Me'); + expect(userClone.favoriteBook).not.toBe(user.favoriteBook); + expect(userClone.favoriteBook.name).toEqual('The Lord of the Rings'); + }); + }); + }); + }); + + describe('strict mode', () => { + describe('when overwritten attributes are valid', () => { + it('clones normally', () => { + const user = new User({ + name: 'Me', + favoriteBook: { + name: 'The Silmarillion', + }, + }); + + const userClone = user.clone({ name: 'Me' }, { strict: true }); + + expect(userClone.name).toEqual('Me'); + expect(userClone.favoriteBook).toBe(user.favoriteBook); + }); + }); + + describe('when overwritten attributes are invalid', () => { + describe('when primitive attribute is invalid', () => { + it('throws an error', (done) => { + const user = new User({ + name: 'Me', + favoriteBook: { + name: 'The Silmarillion', + }, + }); + + let errorDetails = [ + { + message: '"name" is required', + path: ['name'], + }, + ]; + + try { + user.clone({ name: null }, { strict: true }); + } catch (error) { + expect(error).toHaveProperty('details', errorDetails); + done(); + } + }); + }); + + describe('when nested attribute is invalid', () => { + describe('when passing a the attributes of the nested attribute', () => { + it('throws an error', (done) => { + const user = new User({ + name: 'Me', + favoriteBook: { + name: 'The Silmarillion', + }, + }); + + let errorDetails = [ + { + message: '"favoriteBook.name" is required', + path: ['favoriteBook', 'name'], + }, + ]; + + try { + user.clone({ favoriteBook: {} }, { strict: true }); + } catch (error) { + expect(error).toHaveProperty('details', errorDetails); + done(); + } + }); + }); + }); + }); + }); +}); diff --git a/test/unit/serialization/array.spec.js b/packages/structure/test/unit/serialization/array.spec.js similarity index 70% rename from test/unit/serialization/array.spec.js rename to packages/structure/test/unit/serialization/array.spec.js index c4a40a1..766b32b 100644 --- a/test/unit/serialization/array.spec.js +++ b/packages/structure/test/unit/serialization/array.spec.js @@ -1,10 +1,9 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('serialization', () => { describe('Array', () => { - var Book; - var User; + let Book; + let User; beforeEach(() => { Book = attributes({ @@ -20,21 +19,21 @@ describe('serialization', () => { })(class User {}); }); - context('when all data is present', () => { + describe('when all data is present', () => { it('include all data defined on schema', () => { const user = new User({ name: 'Something', books: [new Book({ name: 'The Hobbit' })], }); - expect(user.toJSON()).to.eql({ + expect(user.toJSON()).toEqual({ name: 'Something', books: [{ name: 'The Hobbit' }], }); }); }); - context('when some item is undefined', () => { + describe('when some item is undefined', () => { it('does not set a key for missing attribute', () => { const user = new User({ name: 'Some name', @@ -47,16 +46,10 @@ describe('serialization', () => { const serializedUser = user.toJSON(); - expect(serializedUser).to.eql({ + expect(serializedUser).toEqual({ name: 'Some name', - books: [ - { name: 'The Silmarillion' }, - undefined, - { name: 'The Lord of the Rings' }, - ], + books: [{ name: 'The Silmarillion' }, undefined, { name: 'The Lord of the Rings' }], }); - - expect(serializedUser).to.have.all.keys(['name', 'books']); }); }); }); diff --git a/test/unit/serialization/jsonStringifyCompatibility.js b/packages/structure/test/unit/serialization/jsonStringifyCompatibility.spec.js similarity index 74% rename from test/unit/serialization/jsonStringifyCompatibility.js rename to packages/structure/test/unit/serialization/jsonStringifyCompatibility.spec.js index cd54a36..a295489 100644 --- a/test/unit/serialization/jsonStringifyCompatibility.js +++ b/packages/structure/test/unit/serialization/jsonStringifyCompatibility.spec.js @@ -1,8 +1,7 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('JSON.stringify compatibility', () => { - context('when the structure is serialized with JSON.stringify', () => { + describe('when the structure is serialized with JSON.stringify', () => { it('calls .toJSON() method', () => { const Location = attributes({ x: Number, @@ -22,7 +21,7 @@ describe('JSON.stringify compatibility', () => { }), }); - expect(JSON.parse(JSON.stringify(user))).to.eql(user.toJSON()); + expect(JSON.parse(JSON.stringify(user))).toEqual(user.toJSON()); }); }); }); diff --git a/test/unit/serialization/nestedStructure.spec.js b/packages/structure/test/unit/serialization/nestedStructure.spec.js similarity index 78% rename from test/unit/serialization/nestedStructure.spec.js rename to packages/structure/test/unit/serialization/nestedStructure.spec.js index 061a43c..8b97ee9 100644 --- a/test/unit/serialization/nestedStructure.spec.js +++ b/packages/structure/test/unit/serialization/nestedStructure.spec.js @@ -1,10 +1,9 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('serialization', () => { describe('Nested structure', () => { - var Location; - var User; + let Location; + let User; beforeEach(() => { Location = attributes({ @@ -18,7 +17,7 @@ describe('serialization', () => { })(class User {}); }); - context('when all data is present', () => { + describe('when all data is present', () => { it('include all data defined on schema', () => { const location = new Location({ longitude: 123, @@ -30,7 +29,7 @@ describe('serialization', () => { location, }); - expect(user.toJSON()).to.eql({ + expect(user.toJSON()).toEqual({ name: 'Something', location: { longitude: 123, @@ -40,7 +39,7 @@ describe('serialization', () => { }); }); - context('when nested structure is missing', () => { + describe('when nested structure is missing', () => { it('does not set a key for missing structure', () => { const user = new User({ name: 'Some name', @@ -48,15 +47,13 @@ describe('serialization', () => { const serializedUser = user.toJSON(); - expect(serializedUser).to.eql({ + expect(serializedUser).toEqual({ name: 'Some name', }); - - expect(serializedUser).to.have.all.keys(['name']); }); }); - context('when some attribute on nested structure is missing', () => { + describe('when some attribute on nested structure is missing', () => { it('does not set a key for missing nested attribute', () => { const location = new Location({ longitude: 123, @@ -69,28 +66,26 @@ describe('serialization', () => { const serializedUser = user.toJSON(); - expect(serializedUser).to.eql({ + expect(serializedUser).toEqual({ name: 'Name', location: { longitude: 123, }, }); - - expect(serializedUser.location).to.have.all.keys(['longitude']); }); }); }); describe('Nested structure with dynamic attribute types', () => { - var CircularUser; - var CircularBook; + let CircularUser; + let CircularBook; beforeEach(() => { CircularUser = require('../../fixtures/CircularUser'); CircularBook = require('../../fixtures/CircularBook'); }); - context('when all data is present', () => { + describe('when all data is present', () => { it('include all data defined on schema', () => { const user = new CircularUser({ name: 'Something', @@ -107,7 +102,7 @@ describe('serialization', () => { favoriteBook: new CircularBook({ name: 'The Book' }), }); - expect(user.toJSON()).to.eql({ + expect(user.toJSON()).toEqual({ name: 'Something', friends: [ { @@ -124,26 +119,26 @@ describe('serialization', () => { }); }); - context('when nested structure is missing', () => { + describe('when nested structure is missing', () => { it('does not set a key for missing structure', () => { const user = new CircularUser({ name: 'Something', }); - expect(user.toJSON()).to.eql({ + expect(user.toJSON()).toEqual({ name: 'Something', }); }); }); - context('when some attribute on nested structure is missing', () => { + describe('when some attribute on nested structure is missing', () => { it('does not set a key for missing nested attribute', () => { const user = new CircularUser({ name: 'Something', favoriteBook: new CircularBook({}), }); - expect(user.toJSON()).to.eql({ + expect(user.toJSON()).toEqual({ name: 'Something', favoriteBook: {}, }); diff --git a/test/unit/serialization/structure.spec.js b/packages/structure/test/unit/serialization/structure.spec.js similarity index 69% rename from test/unit/serialization/structure.spec.js rename to packages/structure/test/unit/serialization/structure.spec.js index 8b3d69e..2546338 100644 --- a/test/unit/serialization/structure.spec.js +++ b/packages/structure/test/unit/serialization/structure.spec.js @@ -1,9 +1,8 @@ -const { expect } = require('chai'); const { attributes } = require('../../../src'); describe('serialization', () => { describe('Structure', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -12,21 +11,21 @@ describe('serialization', () => { })(class User {}); }); - context('when all data is present', () => { + describe('when all data is present', () => { it('include all data defined on schema', () => { const user = new User({ name: 'Something', age: 42, }); - expect(user.toJSON()).to.eql({ + expect(user.toJSON()).toEqual({ name: 'Something', age: 42, }); }); }); - context('when some attribute is missing', () => { + describe('when some attribute is missing', () => { it('does not set a key for missing attribute', () => { const user = new User({ name: 'Some name', @@ -35,18 +34,16 @@ describe('serialization', () => { const serializedUser = user.toJSON(); - expect(serializedUser).to.eql({ + expect(serializedUser).toEqual({ name: 'Some name', }); - - expect(serializedUser).to.have.all.keys(['name']); }); }); - context("when attribute's value is null", () => { - var City; + describe("when attribute's value is null", () => { + let City; - context('and is not nullable', () => { + describe('and is not nullable', () => { beforeEach(() => { City = attributes({ name: String })(class City {}); }); @@ -58,12 +55,11 @@ describe('serialization', () => { const serializedCity = city.toJSON(); - expect(serializedCity).to.have.all.keys(['name']); - expect(serializedCity).to.eql({ name: '' }); + expect(serializedCity).toEqual({ name: '' }); }); }); - context('and is nullable', () => { + describe('and is nullable', () => { beforeEach(() => { City = attributes({ name: { @@ -78,14 +74,13 @@ describe('serialization', () => { const serializedCity = city.toJSON(); - expect(serializedCity).to.have.all.keys(['name']); - expect(serializedCity).to.eql({ name: null }); + expect(serializedCity).toEqual({ name: null }); }); }); - context('and is a nullable relationship', () => { - var Country; - var City; + describe('and is a nullable relationship', () => { + let Country; + let City; beforeEach(() => { Country = attributes({ name: String })(class Country {}); @@ -103,7 +98,7 @@ describe('serialization', () => { const serializedCity = city.toJSON(); - expect(serializedCity.country).to.be.null; + expect(serializedCity.country).toBeNull(); }); }); }); diff --git a/test/unit/subclassingStructureClass.spec.js b/packages/structure/test/unit/subclassingStructureClass.spec.js similarity index 62% rename from test/unit/subclassingStructureClass.spec.js rename to packages/structure/test/unit/subclassingStructureClass.spec.js index 4e2f77a..a406697 100644 --- a/test/unit/subclassingStructureClass.spec.js +++ b/packages/structure/test/unit/subclassingStructureClass.spec.js @@ -1,9 +1,8 @@ -const { expect } = require('chai'); const { attributes } = require('../../src'); describe('subclassing a structure with a POJO class', () => { - var User; - var Admin; + let User; + let Admin; beforeEach(() => { User = attributes({ @@ -39,8 +38,8 @@ describe('subclassing a structure with a POJO class', () => { name: 'The Admin', }); - expect(admin).to.be.instanceOf(Admin); - expect(admin).to.be.instanceOf(User); + expect(admin).toBeInstanceOf(Admin); + expect(admin).toBeInstanceOf(User); }); it('has access to class and superclass methods', () => { @@ -48,8 +47,8 @@ describe('subclassing a structure with a POJO class', () => { name: 'Me', }); - expect(admin.userMethod()).to.equal('I am a user'); - expect(admin.adminMethod()).to.equal('I am an admin'); + expect(admin.userMethod()).toBe('I am a user'); + expect(admin.adminMethod()).toBe('I am an admin'); }); it('has access to class and superclass properties', () => { @@ -61,9 +60,9 @@ describe('subclassing a structure with a POJO class', () => { 'Admin Value' ); - expect(admin.userStuff).to.equal('User Stuff'); - expect(admin.userValue).to.equal('User Value'); - expect(admin.adminValue).to.equal('Admin Value'); + expect(admin.userStuff).toBe('User Stuff'); + expect(admin.userValue).toBe('User Value'); + expect(admin.adminValue).toBe('Admin Value'); }); it('has attributes passed to constructor assigned to the object', () => { @@ -71,7 +70,7 @@ describe('subclassing a structure with a POJO class', () => { name: 'Me', }); - expect(admin.name).to.equal('Me'); + expect(admin.name).toBe('Me'); }); it('ignores invalid attributes passed to constructor', () => { @@ -80,7 +79,7 @@ describe('subclassing a structure with a POJO class', () => { invalid: 'I will be ignored', }); - expect(admin.invalid).to.be.undefined; + expect(admin.invalid).toBeUndefined(); }); it('reflects instance attributes to #attributes', () => { @@ -88,8 +87,8 @@ describe('subclassing a structure with a POJO class', () => { name: 'Self', }); - expect(admin.name).to.equal('Self'); - expect(admin.attributes.name).to.equal('Self'); + expect(admin.name).toBe('Self'); + expect(admin.attributes.name).toBe('Self'); }); }); @@ -101,7 +100,7 @@ describe('subclassing a structure with a POJO class', () => { admin.name = 'New name'; - expect(admin.name).to.equal('New name'); + expect(admin.name).toBe('New name'); }); it('reflects new value assigned to attribute on #attributes', () => { @@ -111,7 +110,7 @@ describe('subclassing a structure with a POJO class', () => { admin.name = 'New name'; - expect(admin.attributes.name).to.equal('New name'); + expect(admin.attributes.name).toBe('New name'); }); it('reflects new value assigned to #attributes on instance attribute', () => { @@ -121,12 +120,12 @@ describe('subclassing a structure with a POJO class', () => { admin.attributes.name = 'New name'; - expect(admin.name).to.equal('New name'); + expect(admin.name).toBe('New name'); }); }); describe('using subclass static methods and properties', () => { - var AdminStructure; + let AdminStructure; beforeEach(() => { class RawUser { @@ -151,17 +150,17 @@ describe('subclassing a structure with a POJO class', () => { }); it('has access to static methods and properties', () => { - expect(AdminStructure.staticMethod()).to.equal('I am on a static method'); - expect(AdminStructure.staticProperty).to.equal('I am a static property'); - expect(AdminStructure.staticAdminMethod()).to.equal('I am also on a static method'); - expect(AdminStructure.staticAdminProperty).to.equal('I am also a static property'); + expect(AdminStructure.staticMethod()).toBe('I am on a static method'); + expect(AdminStructure.staticProperty).toBe('I am a static property'); + expect(AdminStructure.staticAdminMethod()).toBe('I am also on a static method'); + expect(AdminStructure.staticAdminProperty).toBe('I am also a static property'); }); }); }); describe('subclassing a structure with another structure', () => { - var Admin; - var User; + let Admin; + let User; beforeEach(() => { User = attributes({ @@ -170,7 +169,14 @@ describe('subclassing a structure with another structure', () => { type: String, default: () => 123, }, - })(class User {}); + age: Number, + })( + class User { + set age(newAge) { + this.set('age', Math.abs(newAge)); + } + } + ); Admin = attributes({ level: Number, @@ -187,8 +193,8 @@ describe('subclassing a structure with another structure', () => { level: 3, }); - expect(admin.name).to.equal('The admin'); - expect(admin.level).to.equal(3); + expect(admin.name).toBe('The admin'); + expect(admin.level).toBe(3); }); it('is instance of class and superclass', () => { @@ -196,48 +202,62 @@ describe('subclassing a structure with another structure', () => { name: 'The Admin', }); - expect(admin).to.be.instanceOf(Admin); - expect(admin).to.be.instanceOf(User); + expect(admin).toBeInstanceOf(Admin); + expect(admin).toBeInstanceOf(User); }); - context('default value', () => { - context('when subclass uses an attribute from superclass to generate a default value', () => { - context('when superclass uses default', () => { + describe('default value', () => { + describe('when subclass uses an attribute from superclass to generate a default value', () => { + describe('when superclass uses default', () => { it('allows to access it properly', () => { const admin = new Admin(); - expect(admin.identifier).to.equal('Admin-123'); + expect(admin.identifier).toBe('Admin-123'); }); }); - context('when a value is passed to superclass defaultable attribute', () => { + describe('when a value is passed to superclass defaultable attribute', () => { it('allows to access it properly', () => { const admin = new Admin({ uuid: '321' }); - expect(admin.identifier).to.equal('Admin-321'); + expect(admin.identifier).toBe('Admin-321'); }); }); }); }); + + describe('custom accessor in parent class', () => { + it("won't override the custom accessor from the superclass with the default one from the subclass", () => { + const admin = new Admin({ age: -1 }); + + expect(admin.age).toEqual(1); + }); + }); }); describe('subclassing a POJO class with a structure', () => { let Employee; let Writer; let Reviewer; + let SuperEmployee; beforeEach(() => { Employee = class Employee { getType() { return this.type.toUpperCase(); } + + get company() { + return 'ACME'; + } }; Writer = attributes({ type: String })(class Writer extends Employee {}); Reviewer = attributes({ type: String })(class Reviewer extends Employee {}); + SuperEmployee = attributes({ company: String })(class SuperEmployee extends Employee {}); }); - context('when structure attribute is a structure which extends a POJO', () => { + describe('when structure attribute is a structure which extends a POJO', () => { let Sector; beforeEach(() => { @@ -253,15 +273,15 @@ describe('subclassing a POJO class with a structure', () => { const reviewer = new Reviewer({ type: 'reviewer' }); const reviewingSector = new Sector({ leader: reviewer }); - expect(writingSector.leader).to.be.instanceof(Writer); - expect(writingSector.leader.getType()).to.equal('WRITER'); + expect(writingSector.leader).toBeInstanceOf(Writer); + expect(writingSector.leader.getType()).toBe('WRITER'); - expect(reviewingSector.leader).to.be.instanceof(Reviewer); - expect(reviewingSector.leader.getType()).to.equal('REVIEWER'); + expect(reviewingSector.leader).toBeInstanceOf(Reviewer); + expect(reviewingSector.leader.getType()).toBe('REVIEWER'); }); }); - context('when a structure attribute is an array of structures which extends a POJO', () => { + describe('when a structure attribute is an array of structures which extends a POJO', () => { let Company; beforeEach(() => { @@ -281,11 +301,19 @@ describe('subclassing a POJO class with a structure', () => { employees: [writer, reviewer], }); - expect(company.employees[0]).to.be.instanceof(Writer); - expect(company.employees[0].getType()).to.equal('WRITER'); + expect(company.employees[0]).toBeInstanceOf(Writer); + expect(company.employees[0].getType()).toBe('WRITER'); + + expect(company.employees[1]).toBeInstanceOf(Reviewer); + expect(company.employees[1].getType()).toBe('REVIEWER'); + }); + }); + + describe('custom accessor in parent class', () => { + it("won't override the custom accessor from the superclass with the default one from the subclass", () => { + const superEmployee = new SuperEmployee({ company: 'Monster Inc.' }); - expect(company.employees[1]).to.be.instanceof(Reviewer); - expect(company.employees[1].getType()).to.equal('REVIEWER'); + expect(superEmployee.company).toEqual('ACME'); }); }); }); diff --git a/test/unit/validation/array.spec.js b/packages/structure/test/unit/validation/array.spec.js similarity index 64% rename from test/unit/validation/array.spec.js rename to packages/structure/test/unit/validation/array.spec.js index 611bf9f..21338f1 100644 --- a/test/unit/validation/array.spec.js +++ b/packages/structure/test/unit/validation/array.spec.js @@ -1,13 +1,9 @@ const { attributes } = require('../../../src'); -const { - assertValid, - assertInvalid, -} = require('../../support/validationMatchers'); describe('validation', () => { describe('Array', () => { describe('no validation', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -18,29 +14,29 @@ describe('validation', () => { })(class User {}); }); - context('when value is present', () => { + describe('when value is present', () => { it('is valid', () => { const user = new User({ books: [], }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid', () => { const user = new User({ books: undefined, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); describe('required', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -52,29 +48,29 @@ describe('validation', () => { })(class User {}); }); - context('when value is present', () => { + describe('when value is present', () => { it('is valid', () => { const user = new User({ books: [], }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is not valid and has errors set', () => { const user = new User({ books: undefined, }); - assertInvalid(user, 'books'); + expect(user).toHaveInvalidAttribute(['books'], ['"books" is required']); }); }); }); describe('not required', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -86,28 +82,28 @@ describe('validation', () => { })(class User {}); }); - context('when value is present', () => { + describe('when value is present', () => { it('is valid', () => { const user = new User(); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid', () => { const user = new User({ books: undefined, }); - assertValid(user, 'books'); + expect(user).toBeValidStructure(); }); }); }); describe('sparse array', () => { - context('when array can not be sparse', () => { - var User; + describe('when array can not be sparse', () => { + let User; beforeEach(() => { User = attributes({ @@ -119,29 +115,32 @@ describe('validation', () => { })(class User {}); }); - context('when all items are defined', () => { + describe('when all items are defined', () => { it('is valid', () => { const user = new User({ books: ['Poetic Edda', 'Prose Edda'], }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when some item is undefined', () => { + describe('when some item is undefined', () => { it('is not valid and has errors set', () => { const user = new User({ books: ['The Lusiads', undefined], }); - assertInvalid(user, 'books.1'); + expect(user).toHaveInvalidAttribute( + ['books', 1], + ['"books[1]" must not be a sparse array item'] + ); }); }); }); - context('when array can be sparse', () => { - var User; + describe('when array can be sparse', () => { + let User; beforeEach(() => { User = attributes({ @@ -153,31 +152,31 @@ describe('validation', () => { })(class User {}); }); - context('when all items are defined', () => { + describe('when all items are defined', () => { it('is valid', () => { const user = new User({ books: ['Poetic Edda', 'Prose Edda'], }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when some item is undefined', () => { + describe('when some item is undefined', () => { it('is valid', () => { const user = new User({ books: ['The Lusiads', undefined], }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); }); describe('nested validation', () => { - var Book; - var User; + let Book; + let User; beforeEach(() => { Book = attributes({ @@ -196,7 +195,7 @@ describe('validation', () => { })(class User {}); }); - context('when nested value is present', () => { + describe('when nested value is present', () => { it('is valid', () => { const user = new User({ books: [ @@ -205,32 +204,32 @@ describe('validation', () => { ], }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when nested value is not present', () => { + describe('when nested value is not present', () => { it('is not valid and has errors set', () => { const user = new User({ - books: [ - new Book({ name: 'The Hobbit' }), - new Book({ name: undefined }), - ], + books: [new Book({ name: 'The Hobbit' }), new Book({ name: undefined })], }); - assertInvalid(user, 'books.1.name'); + expect(user).toHaveInvalidAttribute( + ['books', 1, 'name'], + ['"books[1].name" is required'] + ); }); }); }); describe('nested validation with dynamic attribute types', () => { - var CircularUser; + let CircularUser; beforeEach(() => { CircularUser = require('../../fixtures/CircularUser'); }); - context('when nested value is present', () => { + describe('when nested value is present', () => { it('is valid', () => { const user = new CircularUser({ friends: [ @@ -241,11 +240,11 @@ describe('validation', () => { favoriteBook: {}, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when nested value is not present', () => { + describe('when nested value is not present', () => { it('is not valid and has errors set', () => { const user = new CircularUser({ friends: [ @@ -257,13 +256,16 @@ describe('validation', () => { favoriteBook: {}, }); - assertInvalid(user, 'friends.1.favoriteBook'); + expect(user).toHaveInvalidAttribute( + ['friends', 1, 'favoriteBook'], + ['"friends[1].favoriteBook" is required'] + ); }); }); }); describe('minLength', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -275,29 +277,29 @@ describe('validation', () => { })(class User {}); }); - context('when array has minimum length', () => { + describe('when array has minimum length', () => { it('is valid', () => { const user = new User({ books: ['The Name of the Wind', "The Wise Man's Fear"], }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when array has minimum length', () => { + describe('when array does not have minimum length', () => { it('is not valid and has errors set', () => { const user = new User({ books: ['1984'], }); - assertInvalid(user, 'books'); + expect(user).toHaveInvalidAttribute(['books'], ['"books" must contain at least 2 items']); }); }); }); describe('maxLength', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -309,29 +311,32 @@ describe('validation', () => { })(class User {}); }); - context('when array has less than maximum length', () => { + describe('when array has less than maximum length', () => { it('is valid', () => { const user = new User({ books: ['The Name of the Wind'], }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when array has more than maximum length', () => { + describe('when array has more than maximum length', () => { it('is not valid and has errors set', () => { const user = new User({ books: ['1984', 'The Game of Thrones', 'Dragons of Ether'], }); - assertInvalid(user, 'books'); + expect(user).toHaveInvalidAttribute( + ['books'], + ['"books" must contain less than or equal to 2 items'] + ); }); }); }); describe('exactLength', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -343,74 +348,67 @@ describe('validation', () => { })(class User {}); }); - context('when array has exactly the expected length', () => { + describe('when array has exactly the expected length', () => { it('is valid', () => { const user = new User({ books: ['The Gunslinger', 'The Drawing of the Three'], }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when array has less than exact length', () => { + describe('when array has less than exact length', () => { it('is not valid and has errors set', () => { const user = new User({ books: ['The Wastelands'], }); - assertInvalid(user, 'books'); + expect(user).toHaveInvalidAttribute(['books'], ['"books" must contain 2 items']); }); }); - context('when array has more than exact length', () => { + describe('when array has more than exact length', () => { it('is not valid and has errors set', () => { const user = new User({ - books: [ - 'Wizard and Glass', - 'The Wind Through the Keyhole', - 'Wolves of the Calla', - ], + books: ['Wizard and Glass', 'The Wind Through the Keyhole', 'Wolves of the Calla'], }); - assertInvalid(user, 'books'); + expect(user).toHaveInvalidAttribute(['books'], ['"books" must contain 2 items']); }); }); }); describe('unique', () => { - var User; + let User; beforeEach(() => { User = attributes({ books: { type: Array, itemType: String, - unique: true - } + unique: true, + }, })(class User {}); }); - context('when array is unique', () => { + describe('when array is unique', () => { it('is valid', () => { const user = new User({ - books: [ - 'The Gunslinger', - 'The Drawing of the Three' - ] + books: ['The Gunslinger', 'The Drawing of the Three'], }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when array is not unique', () => { + describe('when array is not unique', () => { it('is not valid and has errors set', () => { const user = new User({ - books: [ - 'The Wastelands', - 'The Wastelands' - ] + books: ['The Wastelands', 'The Wastelands'], }); - assertInvalid(user, 'books.1'); + expect(user).toHaveInvalidAttribute( + ['books', 1], + ['"books[1]" contains a duplicate value'] + ); }); }); }); diff --git a/test/unit/validation/boolean.spec.js b/packages/structure/test/unit/validation/boolean.spec.js similarity index 73% rename from test/unit/validation/boolean.spec.js rename to packages/structure/test/unit/validation/boolean.spec.js index b6144e9..e0652ab 100644 --- a/test/unit/validation/boolean.spec.js +++ b/packages/structure/test/unit/validation/boolean.spec.js @@ -1,13 +1,9 @@ const { attributes } = require('../../../src'); -const { - assertValid, - assertInvalid, -} = require('../../support/validationMatchers'); describe('validation', () => { describe('Boolean', () => { describe('no validation', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -21,23 +17,23 @@ describe('validation', () => { })(class User {}); }); - context('when value is present', () => { + describe('when value is present', () => { it('is valid', () => { const user = new User({ isAdmin: true, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid with undefined', () => { const user = new User({ isAdmin: undefined, }); - assertValid(user); + expect(user).toBeValidStructure(); }); it('is valid with null when nullable', () => { @@ -45,15 +41,15 @@ describe('validation', () => { hasAccepted: null, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); describe('required', () => { - var User; + let User; - context('when value is present', () => { + describe('when value is present', () => { beforeEach(() => { User = attributes({ isAdmin: { @@ -68,11 +64,11 @@ describe('validation', () => { isAdmin: true, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { beforeEach(() => { User = attributes({ isAdmin: { @@ -87,12 +83,12 @@ describe('validation', () => { isAdmin: undefined, }); - assertInvalid(user, 'isAdmin'); + expect(user).toHaveInvalidAttribute(['isAdmin'], ['"isAdmin" is required']); }); }); - context('when value is null', () => { - context('and attribute is nullable', () => { + describe('when value is null', () => { + describe('and attribute is nullable', () => { beforeEach(() => { User = attributes({ isAdmin: { @@ -106,11 +102,11 @@ describe('validation', () => { it('is valid', () => { const user = new User({ isAdmin: null }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('and attribute is not nullable', () => { + describe('and attribute is not nullable', () => { beforeEach(() => { User = attributes({ isAdmin: { @@ -124,14 +120,14 @@ describe('validation', () => { it('is not valid and has errors set', () => { const user = new User({ isAdmin: null }); - assertInvalid(user, 'isAdmin'); + expect(user).toHaveInvalidAttribute(['isAdmin'], ['"isAdmin" is required']); }); }); }); }); describe('not required', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -142,17 +138,17 @@ describe('validation', () => { })(class User {}); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid', () => { const user = new User(); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); describe('equal', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -163,23 +159,23 @@ describe('validation', () => { })(class User {}); }); - context('when value is equal', () => { + describe('when value is equal', () => { it('is valid', () => { const user = new User({ isAdmin: true, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is different', () => { + describe('when value is different', () => { it('is not valid and has errors set', () => { const user = new User({ isAdmin: false, }); - assertInvalid(user, 'isAdmin'); + expect(user).toHaveInvalidAttribute(['isAdmin'], ['"isAdmin" must be [true]']); }); }); }); diff --git a/test/unit/validation/date.spec.js b/packages/structure/test/unit/validation/date.spec.js similarity index 69% rename from test/unit/validation/date.spec.js rename to packages/structure/test/unit/validation/date.spec.js index ca17da9..998c044 100644 --- a/test/unit/validation/date.spec.js +++ b/packages/structure/test/unit/validation/date.spec.js @@ -1,13 +1,9 @@ const { attributes } = require('../../../src'); -const { - assertValid, - assertInvalid, -} = require('../../support/validationMatchers'); describe('validation', () => { describe('Date', () => { describe('no validation', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -21,23 +17,23 @@ describe('validation', () => { })(class User {}); }); - context('when value is present', () => { + describe('when value is present', () => { it('is valid', () => { const user = new User({ birth: new Date(), }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid with undefined', () => { const user = new User({ birth: undefined, }); - assertValid(user); + expect(user).toBeValidStructure(); }); it('is valid with null when nullable', () => { @@ -45,15 +41,15 @@ describe('validation', () => { death: null, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); describe('required', () => { - var User; + let User; - context('when value is present', () => { + describe('when value is present', () => { beforeEach(() => { User = attributes({ birth: { @@ -68,11 +64,11 @@ describe('validation', () => { birth: new Date(), }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { beforeEach(() => { User = attributes({ birth: { @@ -87,12 +83,12 @@ describe('validation', () => { birth: undefined, }); - assertInvalid(user, 'birth'); + expect(user).toHaveInvalidAttribute(['birth'], ['"birth" is required']); }); }); - context('when value is null', () => { - context('and attribute is nullable', () => { + describe('when value is null', () => { + describe('and attribute is nullable', () => { beforeEach(() => { User = attributes({ birth: { @@ -106,11 +102,11 @@ describe('validation', () => { it('is valid', () => { const user = new User({ birth: null }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('and attribute is not nullable', () => { + describe('and attribute is not nullable', () => { beforeEach(() => { User = attributes({ birth: { @@ -124,14 +120,14 @@ describe('validation', () => { it('is not valid and has errors set', () => { const user = new User({ birth: null }); - assertInvalid(user, 'birth'); + expect(user).toHaveInvalidAttribute(['birth'], ['"birth" is required']); }); }); }); }); describe('not required', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -142,18 +138,18 @@ describe('validation', () => { })(class User {}); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid', () => { const user = new User(); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); describe('equal', () => { - var now; - var User; + let now; + let User; beforeEach(() => { now = new Date(); @@ -166,7 +162,7 @@ describe('validation', () => { })(class User {}); }); - context('when value is equal', () => { + describe('when value is equal', () => { it('is valid', () => { const nowCopy = new Date(now.toISOString()); @@ -174,11 +170,11 @@ describe('validation', () => { birth: nowCopy, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is different', () => { + describe('when value is different', () => { it('is not valid and has errors set', () => { const otherTime = new Date(10); @@ -186,17 +182,20 @@ describe('validation', () => { birth: otherTime, }); - assertInvalid(user, 'birth'); + expect(user).toHaveInvalidAttribute( + ['birth'], + [expect.stringContaining('"birth" must be')] + ); }); }); }); describe('max', () => { describe('when using a value', () => { - var User; - var now; + let User; + let now; - before(() => { + beforeAll(() => { now = new Date(); }); @@ -209,7 +208,7 @@ describe('validation', () => { })(class User {}); }); - context('when date is before max', () => { + describe('when date is before max', () => { it('is valid', () => { const before = new Date(10); @@ -217,11 +216,11 @@ describe('validation', () => { birth: before, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when date is after max', () => { + describe('when date is after max', () => { it('is not valid and has errors set', () => { const after = new Date(); @@ -229,16 +228,19 @@ describe('validation', () => { birth: after, }); - assertInvalid(user, 'birth'); + expect(user).toHaveInvalidAttribute( + ['birth'], + [expect.stringContaining('"birth" must be less than or equal to')] + ); }); }); }); describe('when using a reference', () => { - var now; - var User; + let now; + let User; - before(() => { + beforeAll(() => { now = new Date(); }); @@ -254,7 +256,7 @@ describe('validation', () => { })(class User {}); }); - context('when date is before max', () => { + describe('when date is before max', () => { it('is valid', () => { const before = new Date(10); @@ -263,11 +265,11 @@ describe('validation', () => { updatedAt: now, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when date is after max', () => { + describe('when date is after max', () => { it('is not valid and has errors set', () => { const after = new Date(); @@ -276,14 +278,17 @@ describe('validation', () => { updatedAt: now, }); - assertInvalid(user, 'createdAt'); + expect(user).toHaveInvalidAttribute( + ['createdAt'], + ['"createdAt" must be less than or equal to "ref:updatedAt"'] + ); }); }); }); }); describe('min', () => { - var User; + let User; beforeEach(() => { const now = new Date(); @@ -296,7 +301,7 @@ describe('validation', () => { })(class User {}); }); - context('when date is after min', () => { + describe('when date is after min', () => { it('is valid', () => { const after = new Date(); @@ -304,11 +309,11 @@ describe('validation', () => { birth: after, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when date is before min', () => { + describe('when date is before min', () => { it('is not valid and has errors set', () => { const before = new Date(10); @@ -316,7 +321,10 @@ describe('validation', () => { birth: before, }); - assertInvalid(user, 'birth'); + expect(user).toHaveInvalidAttribute( + ['birth'], + [expect.stringContaining('"birth" must be larger than or equal to')] + ); }); }); }); diff --git a/test/unit/validation/nestedPojo.spec.js b/packages/structure/test/unit/validation/nestedPojo.spec.js similarity index 74% rename from test/unit/validation/nestedPojo.spec.js rename to packages/structure/test/unit/validation/nestedPojo.spec.js index c4d3a8e..af00759 100644 --- a/test/unit/validation/nestedPojo.spec.js +++ b/packages/structure/test/unit/validation/nestedPojo.spec.js @@ -1,14 +1,10 @@ const { attributes } = require('../../../src'); -const { - assertValid, - assertInvalid, -} = require('../../support/validationMatchers'); describe('validation', () => { describe('Nested with POJO class', () => { describe('no validation', () => { - var Location; - var User; + let Location; + let User; beforeEach(() => { Location = class Location {}; @@ -24,23 +20,23 @@ describe('validation', () => { })(class User {}); }); - context('when value is present', () => { + describe('when value is present', () => { it('is valid', () => { const user = new User({ lastLocation: new Location(), }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid with undefined', () => { const user = new User({ lastLocation: undefined, }); - assertValid(user); + expect(user).toBeValidStructure(); }); it('is valid with null when nullable', () => { @@ -48,18 +44,18 @@ describe('validation', () => { nextLocation: null, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); describe('required', () => { - var Location; - var User; + let Location; + let User; beforeEach(() => (Location = class Location {})); - context('when value is present', () => { + describe('when value is present', () => { beforeEach(() => { User = attributes({ lastLocation: { @@ -74,11 +70,11 @@ describe('validation', () => { lastLocation: new Location(), }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { beforeEach(() => { User = attributes({ lastLocation: { @@ -93,12 +89,12 @@ describe('validation', () => { lastLocation: undefined, }); - assertInvalid(user, 'lastLocation'); + expect(user).toHaveInvalidAttribute(['lastLocation'], ['"lastLocation" is required']); }); }); - context('when value is null', () => { - context('and attribute is nullable', () => { + describe('when value is null', () => { + describe('and attribute is nullable', () => { beforeEach(() => { User = attributes({ lastLocation: { @@ -112,11 +108,11 @@ describe('validation', () => { it('is valid', () => { const user = new User({ lastLocation: null }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('and attribute is not nullable', () => { + describe('and attribute is not nullable', () => { beforeEach(() => { User = attributes({ lastLocation: { @@ -130,15 +126,15 @@ describe('validation', () => { it('is not valid and has errors set', () => { const user = new User({ lastLocation: null }); - assertInvalid(user, 'lastLocation'); + expect(user).toHaveInvalidAttribute(['lastLocation'], ['"lastLocation" is required']); }); }); }); }); describe('not required', () => { - var Location; - var User; + let Location; + let User; beforeEach(() => { Location = class Location {}; @@ -151,11 +147,11 @@ describe('validation', () => { })(class User {}); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid', () => { const user = new User(); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); diff --git a/packages/structure/test/unit/validation/nestedStructure.spec.js b/packages/structure/test/unit/validation/nestedStructure.spec.js new file mode 100644 index 0000000..681fce1 --- /dev/null +++ b/packages/structure/test/unit/validation/nestedStructure.spec.js @@ -0,0 +1,425 @@ +const { attributes } = require('../../../src'); + +describe('validation', () => { + describe('Nested with structure class', () => { + describe('no validation', () => { + let Location; + let User; + + beforeEach(() => { + Location = attributes({ + x: { + type: Number, + }, + y: { + type: Number, + }, + })(class Location {}); + + User = attributes({ + lastLocation: { + type: Location, + }, + })(class User {}); + }); + + describe('when value is present', () => { + it('is valid', () => { + const user = new User({ + lastLocation: new Location(), + }); + + expect(user).toBeValidStructure(); + }); + }); + + describe('when value is not present', () => { + it('is valid', () => { + const user = new User({ + lastLocation: undefined, + }); + + expect(user).toBeValidStructure(); + }); + }); + }); + + describe('required', () => { + let Location; + let User; + + beforeEach(() => { + Location = attributes({ + x: { type: Number }, + y: { type: Number }, + })(class Location {}); + }); + + describe('when value is present', () => { + beforeEach(() => { + User = attributes({ + lastLocation: { + type: Location, + required: true, + }, + })(class User {}); + }); + + it('is valid', () => { + const user = new User({ + lastLocation: new Location(), + }); + + expect(user).toBeValidStructure(); + }); + }); + + describe('when value is not present', () => { + beforeEach(() => { + User = attributes({ + lastLocation: { + type: Location, + required: true, + }, + })(class User {}); + }); + + it('is not valid and has errors set', () => { + const user = new User({ + lastLocation: undefined, + }); + + expect(user).toHaveInvalidAttribute(['lastLocation'], ['"lastLocation" is required']); + }); + }); + + describe('when value is null', () => { + describe('and attribute is nullable', () => { + beforeEach(() => { + User = attributes({ + lastLocation: { + type: Location, + required: true, + nullable: true, + }, + })(class User {}); + }); + + it('is valid', () => { + const user = new User({ lastLocation: null }); + + expect(user).toBeValidStructure(); + }); + }); + + describe('and attribute is not nullable', () => { + beforeEach(() => { + User = attributes({ + lastLocation: { + type: Location, + required: true, + nullable: false, + }, + })(class User {}); + }); + + it('is not valid and has errors set', () => { + const user = new User({ lastLocation: null }); + + expect(user).toHaveInvalidAttribute(['lastLocation'], ['"lastLocation" is required']); + }); + }); + }); + }); + + describe('not required', () => { + let Location; + let User; + + beforeEach(() => { + Location = attributes({ + x: { + type: Number, + }, + y: { + type: Number, + }, + })(class Location {}); + + User = attributes({ + lastLocation: { + type: Location, + required: false, + }, + })(class User {}); + }); + + describe('when value is not present', () => { + it('is valid', () => { + const user = new User(); + + expect(user).toBeValidStructure(); + }); + }); + }); + + describe('nested required', () => { + let Location; + let User; + + describe('when nested value is present', () => { + beforeEach(() => { + Location = attributes({ + x: { type: Number, required: true }, + y: { type: Number, required: true }, + })(class Location {}); + + User = attributes({ + lastLocation: { type: Location, required: true }, + })(class User {}); + }); + + it('is valid', () => { + const user = new User({ + lastLocation: new Location({ x: 1, y: 2 }), + }); + + expect(user).toBeValidStructure(); + }); + }); + + describe('when nested value is not present', () => { + beforeEach(() => { + Location = attributes({ + x: { type: Number, required: true }, + y: { type: Number, required: true }, + })(class Location {}); + + User = attributes({ + lastLocation: { type: Location, required: true }, + })(class User {}); + }); + + it('is not valid and has errors set', () => { + const user = new User({ + lastLocation: new Location({ x: 1, y: undefined }), + }); + + expect(user).toHaveInvalidAttribute( + ['lastLocation', 'y'], + ['"lastLocation.y" is required'] + ); + }); + }); + + describe('when nested value is null', () => { + describe('and attribute is nullable', () => { + beforeEach(() => { + Location = attributes({ + x: { type: Number, required: true }, + y: { type: Number, required: true, nullable: true }, + })(class Location {}); + + User = attributes({ + lastLocation: { type: Location, required: true }, + })(class User {}); + }); + + it('is valid', () => { + const user = new User({ + lastLocation: new Location({ x: 1, y: null }), + }); + + expect(user).toBeValidStructure(); + }); + }); + + describe('and attribute is not nullable', () => { + beforeEach(() => { + Location = attributes({ + x: { type: Number, required: true }, + y: { type: Number, required: true, nullable: false }, + })(class Location {}); + + User = attributes({ + lastLocation: { type: Location, required: true }, + })(class User {}); + }); + + it('is not valid and has errors set', () => { + const user = new User({ + lastLocation: new Location({ x: 1, y: null }), + }); + + expect(user).toHaveInvalidAttribute( + ['lastLocation', 'y'], + ['"lastLocation.y" is required'] + ); + }); + }); + }); + }); + }); + + describe('Nested with structure class with dynamic attribute types', () => { + describe('when using inferred identifiers', () => { + let CircularUser; + let CircularBook; + + beforeEach(() => { + CircularUser = require('../../fixtures/CircularUser'); + CircularBook = require('../../fixtures/CircularBook'); + }); + + describe('no validation', () => { + describe('when value is present', () => { + it('is valid', () => { + const user = new CircularUser({ + friends: [], + favoriteBook: {}, + }); + + expect(user).toBeValidStructure(); + }); + }); + + describe('when value is not present', () => { + it('is valid', () => { + const user = new CircularUser({ + favoriteBook: {}, + }); + + expect(user).toBeValidStructure(); + }); + }); + }); + + describe('required', () => { + describe('when value is present', () => { + it('is valid', () => { + const user = new CircularUser({ + favoriteBook: {}, + }); + + expect(user).toBeValidStructure(); + }); + }); + + describe('when value is not present', () => { + it('is invalid', () => { + const user = new CircularUser(); + + expect(user).toHaveInvalidAttribute(['favoriteBook'], ['"favoriteBook" is required']); + }); + }); + }); + + describe('nested required', () => { + describe('when value is present', () => { + it('is valid', () => { + const book = new CircularBook({ + owner: { + favoriteBook: new CircularBook(), + }, + }); + + expect(book).toBeValidStructure(); + }); + }); + + describe('when value is not present', () => { + it('is invalid', () => { + const book = new CircularBook({ + owner: new CircularUser(), + }); + + expect(book).toHaveInvalidAttribute( + ['owner', 'favoriteBook'], + ['"owner.favoriteBook" is required'] + ); + }); + }); + }); + }); + + describe('when using custom identifiers', () => { + let CircularUser; + let CircularBook; + + beforeEach(() => { + CircularUser = require('../../fixtures/CircularUserCustomIdentifier'); + CircularBook = require('../../fixtures/CircularBookCustomIdentifier'); + }); + + describe('no validation', () => { + describe('when value is present', () => { + it('is valid', () => { + const user = new CircularUser({ + friends: [], + favoriteBook: {}, + }); + + expect(user).toBeValidStructure(); + }); + }); + + describe('when value is not present', () => { + it('is valid', () => { + const user = new CircularUser({ + favoriteBook: {}, + }); + + expect(user).toBeValidStructure(); + }); + }); + }); + + describe('required', () => { + describe('when value is present', () => { + it('is valid', () => { + const user = new CircularUser({ + favoriteBook: {}, + }); + + expect(user).toBeValidStructure(); + }); + }); + + describe('when value is not present', () => { + it('is invalid', () => { + const user = new CircularUser(); + + expect(user).toHaveInvalidAttribute(['favoriteBook'], ['"favoriteBook" is required']); + }); + }); + }); + + describe('nested required', () => { + describe('when value is present', () => { + it('is valid', () => { + const book = new CircularBook({ + owner: { + favoriteBook: new CircularBook(), + }, + }); + + expect(book).toBeValidStructure(); + }); + }); + + describe('when value is not present', () => { + it('is invalid', () => { + const book = new CircularBook({ + owner: new CircularUser(), + }); + + expect(book).toHaveInvalidAttribute( + ['owner', 'favoriteBook'], + ['"owner.favoriteBook" is required'] + ); + }); + }); + }); + }); + }); +}); diff --git a/test/unit/validation/number.spec.js b/packages/structure/test/unit/validation/number.spec.js similarity index 65% rename from test/unit/validation/number.spec.js rename to packages/structure/test/unit/validation/number.spec.js index 4b9ed1e..5adba0e 100644 --- a/test/unit/validation/number.spec.js +++ b/packages/structure/test/unit/validation/number.spec.js @@ -1,13 +1,9 @@ const { attributes } = require('../../../src'); -const { - assertValid, - assertInvalid, -} = require('../../support/validationMatchers'); describe('validation', () => { describe('Number', () => { describe('no validation', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -21,23 +17,23 @@ describe('validation', () => { })(class User {}); }); - context('when value is present', () => { + describe('when value is present', () => { it('is valid', () => { const user = new User({ age: 42, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid with undefined', () => { const user = new User({ age: undefined, }); - assertValid(user); + expect(user).toBeValidStructure(); }); it('is valid with null when nullable', () => { @@ -45,15 +41,15 @@ describe('validation', () => { earnings: null, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); describe('required', () => { - var User; + let User; - context('when value is present', () => { + describe('when value is present', () => { beforeEach(() => { User = attributes({ age: { @@ -68,11 +64,11 @@ describe('validation', () => { age: 42, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { beforeEach(() => { User = attributes({ age: { @@ -87,12 +83,12 @@ describe('validation', () => { age: undefined, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" is required']); }); }); - context('when value is null', () => { - context('and attribute is nullable', () => { + describe('when value is null', () => { + describe('and attribute is nullable', () => { beforeEach(() => { User = attributes({ age: { @@ -106,11 +102,11 @@ describe('validation', () => { it('is valid', () => { const user = new User({ age: null }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('and attribute is not nullable', () => { + describe('and attribute is not nullable', () => { beforeEach(() => { User = attributes({ age: { @@ -124,14 +120,14 @@ describe('validation', () => { it('is not valid and has errors set', () => { const user = new User({ age: null }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" is required']); }); }); }); }); describe('not required', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -142,18 +138,18 @@ describe('validation', () => { })(class User {}); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid', () => { const user = new User(); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); describe('equal', () => { describe('when using a value', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -164,29 +160,29 @@ describe('validation', () => { })(class User {}); }); - context('when value is equal', () => { + describe('when value is equal', () => { it('is valid', () => { const user = new User({ age: 2, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is different', () => { + describe('when value is different', () => { it('is not valid and has errors set', () => { const user = new User({ age: 1, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be [2]']); }); }); }); describe('when using a mixed array os possibilities', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -200,42 +196,45 @@ describe('validation', () => { })(class User {}); }); - context('when value is equal to referenced attribute', () => { + describe('when value is equal to referenced attribute', () => { it('is valid', () => { const user = new User({ startAge: 2, currentAge: 2, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is equal to one of the value possibilities', () => { + describe('when value is equal to one of the value possibilities', () => { it('is valid', () => { const user = new User({ startAge: 2, currentAge: 3, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is different from all possibilities', () => { + describe('when value is different from all possibilities', () => { it('is not valid and has errors set', () => { const user = new User({ startAge: 1, currentAge: 2, }); - assertInvalid(user, 'currentAge'); + expect(user).toHaveInvalidAttribute( + ['currentAge'], + ['"currentAge" must be one of [3, ref:startAge]'] + ); }); }); }); describe('when using a reference', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -249,25 +248,28 @@ describe('validation', () => { })(class User {}); }); - context('when value is equal to referenced attribute', () => { + describe('when value is equal to referenced attribute', () => { it('is valid', () => { const user = new User({ startAge: 2, currentAge: 2, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is different', () => { + describe('when value is different', () => { it('is not valid and has errors set', () => { const user = new User({ startAge: 1, currentAge: 2, }); - assertInvalid(user, 'currentAge'); + expect(user).toHaveInvalidAttribute( + ['currentAge'], + ['"currentAge" must be [ref:startAge]'] + ); }); }); }); @@ -275,7 +277,7 @@ describe('validation', () => { describe('min', () => { describe('when using a number', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -286,39 +288,42 @@ describe('validation', () => { })(class User {}); }); - context('when value is equal to min', () => { + describe('when value is equal to min', () => { it('is valid', () => { const user = new User({ age: 2, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is greater than min', () => { + describe('when value is greater than min', () => { it('is valid', () => { const user = new User({ age: 3, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is less than min', () => { + describe('when value is less than min', () => { it('is not valid and has errors set', () => { const user = new User({ age: 1, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute( + ['age'], + ['"age" must be larger than or equal to 2'] + ); }); }); }); describe('when using a reference to another attribute', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -332,43 +337,46 @@ describe('validation', () => { })(class User {}); }); - context('when value is equal to referenced attribute', () => { + describe('when value is equal to referenced attribute', () => { it('is valid', () => { const user = new User({ startAge: 2, currentAge: 2, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is greater than referenced attribute', () => { + describe('when value is greater than referenced attribute', () => { it('is valid', () => { const user = new User({ startAge: 2, currentAge: 3, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is less than referenced attribute', () => { + describe('when value is less than referenced attribute', () => { it('is not valid and has errors set', () => { const user = new User({ startAge: 3, currentAge: 2, }); - assertInvalid(user, 'currentAge'); + expect(user).toHaveInvalidAttribute( + ['currentAge'], + ['"currentAge" must be larger than or equal to ref:startAge'] + ); }); }); }); }); describe('greater', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -379,39 +387,39 @@ describe('validation', () => { })(class User {}); }); - context('when value is equal to greater', () => { + describe('when value is equal to greater', () => { it('is not valid and has errors set', () => { const user = new User({ age: 2, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be greater than 2']); }); }); - context('when value is greater than greater', () => { + describe('when value is greater than greater', () => { it('is valid', () => { const user = new User({ age: 3, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is less than greater', () => { + describe('when value is less than greater', () => { it('is not valid and has errors set', () => { const user = new User({ age: 1, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be greater than 2']); }); }); }); describe('max', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -422,39 +430,39 @@ describe('validation', () => { })(class User {}); }); - context('when value is equal to max', () => { + describe('when value is equal to max', () => { it('is valid', () => { const user = new User({ age: 2, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is less than max', () => { + describe('when value is less than max', () => { it('is valid', () => { const user = new User({ age: 1, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is greater than max', () => { + describe('when value is greater than max', () => { it('is not valid and has errors set', () => { const user = new User({ age: 3, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be less than or equal to 2']); }); }); }); describe('less', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -465,39 +473,39 @@ describe('validation', () => { })(class User {}); }); - context('when value is equal to less', () => { + describe('when value is equal to less', () => { it('is not valid and has errors set', () => { const user = new User({ age: 2, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be less than 2']); }); }); - context('when value is less than less', () => { + describe('when value is less than less', () => { it('is valid', () => { const user = new User({ age: 1, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is greater than less', () => { + describe('when value is greater than less', () => { it('is not valid and has errors set', () => { const user = new User({ age: 3, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be less than 2']); }); }); }); describe('integer', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -508,29 +516,29 @@ describe('validation', () => { })(class User {}); }); - context('when value is an integer', () => { + describe('when value is an integer', () => { it('is valid', () => { const user = new User({ age: 42, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not an integer', () => { + describe('when value is not an integer', () => { it('is not valid and has errors set', () => { const user = new User({ age: 4.2, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be an integer']); }); }); }); describe('precision', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -541,29 +549,32 @@ describe('validation', () => { })(class User {}); }); - context('when value has less than precision decimal places', () => { + describe('when value has less than precision decimal places', () => { it('is valid', () => { const user = new User({ age: 4.2, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value has more than precision decimal places', () => { + describe('when value has more than precision decimal places', () => { it('is not valid and has errors set', () => { const user = new User({ age: 0.042, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute( + ['age'], + ['"age" must have no more than 2 decimal places'] + ); }); }); }); describe('multiple', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -574,29 +585,29 @@ describe('validation', () => { })(class User {}); }); - context('when value is multiple of given value', () => { + describe('when value is multiple of given value', () => { it('is valid', () => { const user = new User({ age: 6, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not multiple of given value', () => { + describe('when value is not multiple of given value', () => { it('is not valid and has errors set', () => { const user = new User({ age: 7, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be a multiple of 3']); }); }); }); describe('positive', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -607,39 +618,39 @@ describe('validation', () => { })(class User {}); }); - context('when value is positive', () => { + describe('when value is positive', () => { it('is valid', () => { const user = new User({ age: 1, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is zero', () => { + describe('when value is zero', () => { it('is not valid and has errors set', () => { const user = new User({ age: 0, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be a positive number']); }); }); - context('when value is negative', () => { + describe('when value is negative', () => { it('is not valid and has errors set', () => { const user = new User({ age: -1, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be a positive number']); }); }); }); describe('negative', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -650,33 +661,33 @@ describe('validation', () => { })(class User {}); }); - context('when value is negative', () => { + describe('when value is negative', () => { it('is valid', () => { const user = new User({ age: -1, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is zero', () => { + describe('when value is zero', () => { it('is not valid and has errors set', () => { const user = new User({ age: 0, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be a negative number']); }); }); - context('when value is positive', () => { + describe('when value is positive', () => { it('is not valid and has errors set', () => { const user = new User({ age: 1, }); - assertInvalid(user, 'age'); + expect(user).toHaveInvalidAttribute(['age'], ['"age" must be a negative number']); }); }); }); diff --git a/test/unit/validation/staticMethod.spec.js b/packages/structure/test/unit/validation/staticMethod.spec.js similarity index 54% rename from test/unit/validation/staticMethod.spec.js rename to packages/structure/test/unit/validation/staticMethod.spec.js index 4d5f3e8..911dbb5 100644 --- a/test/unit/validation/staticMethod.spec.js +++ b/packages/structure/test/unit/validation/staticMethod.spec.js @@ -1,12 +1,11 @@ const { attributes } = require('../../../src'); -const { expect } = require('chai'); describe('validation', () => { describe('Using structure static method', () => { - var User; - var Book; + let User; + let Book; - before(() => { + beforeAll(() => { Book = attributes({ name: { type: String, @@ -29,56 +28,56 @@ describe('validation', () => { })(class User {}); }); - context('when required attributes are present', () => { + describe('when required attributes are present', () => { it('returns valid as true and no errors', () => { const { valid, errors } = User.validate({ name: 'The name', age: 25, }); - expect(valid).to.be.true; - expect(errors).to.be.undefined; + expect(valid).toBe(true); + expect(errors).toBeUndefined(); }); }); - context('when required attributes are absent', () => { + describe('when required attributes are absent', () => { it('returns valid as false and array of errors', () => { const { valid, errors } = User.validate({ age: 10, }); - expect(valid).to.be.false; - expect(errors).to.be.instanceOf(Array); - expect(errors).to.have.lengthOf(2); - expect(errors[0].path).to.equal('name'); - expect(errors[1].path).to.equal('age'); + expect(valid).toBe(false); + expect(errors).toBeInstanceOf(Array); + expect(errors).toHaveLength(2); + expect(errors[0].path).toEqual(['name']); + expect(errors[1].path).toEqual(['age']); }); }); - context('when required attributes are null', () => { - context('and attributes is nullable', () => { + describe('when required attributes are null', () => { + describe('and attributes is nullable', () => { it('is valid', () => { const { valid, errors } = Book.validate({ name: null }); - expect(valid).to.be.true; - expect(errors).to.be.undefined; + expect(valid).toBe(true); + expect(errors).toBeUndefined(); }); }); - context('and attributes is not nullable', () => { + describe('and attributes is not nullable', () => { it('is not valid and has errors set', () => { const { valid, errors } = User.validate({ name: null }); - expect(valid).to.be.false; - expect(errors).to.be.instanceOf(Array); - expect(errors).to.have.lengthOf(1); - expect(errors[0].path).to.equal('name'); + expect(valid).toBe(false); + expect(errors).toBeInstanceOf(Array); + expect(errors).toHaveLength(1); + expect(errors[0].path).toEqual(['name']); }); }); }); - context('when there is nested validation', () => { - context('and required attributes are present', () => { + describe('when there is nested validation', () => { + describe('and required attributes are present', () => { it('returns valid as true and no errors', () => { const { valid, errors } = User.validate({ name: 'some name', @@ -88,12 +87,12 @@ describe('validation', () => { }, }); - expect(valid).to.be.true; - expect(errors).to.be.undefined; + expect(valid).toBe(true); + expect(errors).toBeUndefined(); }); }); - context('and required attributes are absent', () => { + describe('and required attributes are absent', () => { it('returns valid as false and an array of errors', () => { const { valid, errors } = User.validate({ name: 'some name', @@ -101,14 +100,14 @@ describe('validation', () => { favoriteBook: {}, }); - expect(valid).to.be.false; - expect(errors).to.be.instanceOf(Array); - expect(errors).to.have.lengthOf(1); - expect(errors[0].path).to.equal('favoriteBook.name'); + expect(valid).toBe(false); + expect(errors).toBeInstanceOf(Array); + expect(errors).toHaveLength(1); + expect(errors[0].path).toEqual(['favoriteBook', 'name']); }); }); - context('and nullable attributes receive null value', () => { + describe('and nullable attributes receive null value', () => { it('returns valid as true and no errors', () => { const { valid, errors } = User.validate({ name: 'some name', @@ -116,15 +115,15 @@ describe('validation', () => { favoriteBook: { name: null }, }); - expect(valid).to.be.true; - expect(errors).to.be.undefined; + expect(valid).toBe(true); + expect(errors).toBeUndefined(); }); }); - context('and non nullable attributes receive null value', () => { - var Test; + describe('and non nullable attributes receive null value', () => { + let Test; - before(() => { + beforeAll(() => { Test = attributes({ user: User })(class Test {}); }); @@ -133,16 +132,16 @@ describe('validation', () => { user: { name: null }, }); - expect(valid).to.be.false; - expect(errors).to.be.instanceOf(Array); - expect(errors).to.have.lengthOf(1); - expect(errors[0].path).to.equal('user.name'); + expect(valid).toBe(false); + expect(errors).toBeInstanceOf(Array); + expect(errors).toHaveLength(1); + expect(errors[0].path).toEqual(['user', 'name']); }); }); }); - context('when passed data is a structure', () => { - context('when required attributes are present and valid', () => { + describe('when passed data is a structure', () => { + describe('when required attributes are present and valid', () => { it('returns valid as true and no errors', () => { const user = new User({ name: 'Something', @@ -151,12 +150,12 @@ describe('validation', () => { const { valid, errors } = User.validate(user); - expect(valid).to.be.true; - expect(errors).to.be.undefined; + expect(valid).toBe(true); + expect(errors).toBeUndefined(); }); }); - context('when required attributes are absent or invalid', () => { + describe('when required attributes are absent or invalid', () => { it('returns valid as false and array of errors', () => { const user = new User({ age: 10, @@ -164,15 +163,15 @@ describe('validation', () => { const { valid, errors } = User.validate(user); - expect(valid).to.be.false; - expect(errors).to.be.instanceOf(Array); - expect(errors).to.have.lengthOf(2); - expect(errors[0].path).to.equal('name'); - expect(errors[1].path).to.equal('age'); + expect(valid).toBe(false); + expect(errors).toBeInstanceOf(Array); + expect(errors).toHaveLength(2); + expect(errors[0].path).toEqual(['name']); + expect(errors[1].path).toEqual(['age']); }); }); - context('and nullable attributes receive null value', () => { + describe('and nullable attributes receive null value', () => { it('returns valid as true and no errors', () => { const user = new User({ name: 'Something', @@ -182,15 +181,15 @@ describe('validation', () => { const { valid, errors } = User.validate(user); - expect(valid).to.be.true; - expect(errors).to.be.undefined; + expect(valid).toBe(true); + expect(errors).toBeUndefined(); }); }); - context('and non nullable attributes receive null value', () => { - var Test; + describe('and non nullable attributes receive null value', () => { + let Test; - before(() => { + beforeAll(() => { Test = attributes({ user: User })(class Test {}); }); @@ -201,10 +200,10 @@ describe('validation', () => { const { valid, errors } = Test.validate(test); - expect(valid).to.be.false; - expect(errors).to.be.instanceOf(Array); - expect(errors).to.have.lengthOf(1); - expect(errors[0].path).to.equal('user.name'); + expect(valid).toBe(false); + expect(errors).toBeInstanceOf(Array); + expect(errors).toHaveLength(1); + expect(errors[0].path).toEqual(['user', 'name']); }); }); }); diff --git a/test/unit/validation/string.spec.js b/packages/structure/test/unit/validation/string.spec.js similarity index 65% rename from test/unit/validation/string.spec.js rename to packages/structure/test/unit/validation/string.spec.js index 5f23e7f..ce6b5fc 100644 --- a/test/unit/validation/string.spec.js +++ b/packages/structure/test/unit/validation/string.spec.js @@ -1,13 +1,9 @@ const { attributes } = require('../../../src'); -const { - assertValid, - assertInvalid, -} = require('../../support/validationMatchers'); describe('validation', () => { describe('String', () => { describe('no validation', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -21,23 +17,23 @@ describe('validation', () => { })(class User {}); }); - context('when value is present', () => { + describe('when value is present', () => { it('is valid', () => { const user = new User({ name: 'Some name', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid with undefined', () => { const user = new User({ name: undefined, }); - assertValid(user); + expect(user).toBeValidStructure(); }); it('is valid with null when nullable', () => { @@ -45,15 +41,15 @@ describe('validation', () => { fatherName: null, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); describe('required', () => { - var User; + let User; - context('when value is present', () => { + describe('when value is present', () => { beforeEach(() => { User = attributes({ name: { @@ -68,11 +64,11 @@ describe('validation', () => { name: 'Some name', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not present', () => { + describe('when value is not present', () => { beforeEach(() => { User = attributes({ name: { @@ -87,12 +83,12 @@ describe('validation', () => { name: undefined, }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute(['name'], ['"name" is required']); }); }); - context('when value is null', () => { - context('and attribute is nullable', () => { + describe('when value is null', () => { + describe('and attribute is nullable', () => { beforeEach(() => { User = attributes({ name: { @@ -106,11 +102,11 @@ describe('validation', () => { it('is valid', () => { const user = new User({ name: null }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('and attribute is not nullable', () => { + describe('and attribute is not nullable', () => { beforeEach(() => { User = attributes({ name: { @@ -124,14 +120,14 @@ describe('validation', () => { it('is not valid and has errors set', () => { const user = new User({ name: null }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute(['name'], ['"name" is required']); }); }); }); }); describe('not required', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -142,19 +138,19 @@ describe('validation', () => { })(class User {}); }); - context('when value is not present', () => { + describe('when value is not present', () => { it('is valid', () => { const user = new User({ name: undefined, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); describe('equal', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -165,30 +161,30 @@ describe('validation', () => { })(class User {}); }); - context('when value is equal', () => { + describe('when value is equal', () => { it('is valid', () => { const user = new User({ name: 'Something', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is different', () => { + describe('when value is different', () => { it('is not valid and has errors set', () => { const user = new User({ name: 'Another thing', }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute(['name'], ['"name" must be [Something]']); }); }); }); describe('empty', () => { describe('empty: true', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -199,29 +195,29 @@ describe('validation', () => { })(class User {}); }); - context('when value is not empty', () => { + describe('when value is not empty', () => { it('is valid', () => { const user = new User({ name: 'Some name', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is empty', () => { + describe('when value is empty', () => { it('is valid', () => { const user = new User({ name: '', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); }); describe('empty: false', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -232,30 +228,30 @@ describe('validation', () => { })(class User {}); }); - context('when value is not empty', () => { + describe('when value is not empty', () => { it('is valid', () => { const user = new User({ name: 'Some name', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is empty', () => { + describe('when value is empty', () => { it('is not valid and has errors set', () => { const user = new User({ name: '', }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute(['name'], ['"name" is not allowed to be empty']); }); }); }); }); describe('minLength', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -266,29 +262,32 @@ describe('validation', () => { })(class User {}); }); - context('when value has minimum length', () => { + describe('when value has minimum length', () => { it('is valid', () => { const user = new User({ name: 'Some name', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is shorter than minimum length', () => { + describe('when value is shorter than minimum length', () => { it('is not valid and has errors set', () => { const user = new User({ name: 'Hi', }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute( + ['name'], + ['"name" length must be at least 3 characters long'] + ); }); }); }); describe('maxLength', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -299,29 +298,32 @@ describe('validation', () => { })(class User {}); }); - context('when value has maximum length', () => { + describe('when value has maximum length', () => { it('is valid', () => { const user = new User({ name: 'Some', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is longer than maximum length', () => { + describe('when value is longer than maximum length', () => { it('is not valid and has errors set', () => { const user = new User({ name: 'Some name', }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute( + ['name'], + ['"name" length must be less than or equal to 4 characters long'] + ); }); }); }); describe('exactLength', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -332,39 +334,45 @@ describe('validation', () => { })(class User {}); }); - context('when value has exact length', () => { + describe('when value has exact length', () => { it('is valid', () => { const user = new User({ name: 'Some', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is longer than exact length', () => { + describe('when value is longer than exact length', () => { it('is not valid and has errors set', () => { const user = new User({ name: 'Some name', }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute( + ['name'], + ['"name" length must be 4 characters long'] + ); }); }); - context('when value is shorter than exact length', () => { + describe('when value is shorter than exact length', () => { it('is not valid and has errors set', () => { const user = new User({ name: 'Hi', }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute( + ['name'], + ['"name" length must be 4 characters long'] + ); }); }); }); describe('regex', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -375,29 +383,32 @@ describe('validation', () => { })(class User {}); }); - context('when value matches the regex', () => { + describe('when value matches the regex', () => { it('is valid', () => { const user = new User({ name: 'A1', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value does not match the regex', () => { + describe('when value does not match the regex', () => { it('is not valid and has errors set', () => { const user = new User({ name: 'Something', }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute( + ['name'], + ['"name" with value "Something" fails to match the required pattern: /\\w\\d/'] + ); }); }); }); describe('alphanumeric', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -408,29 +419,32 @@ describe('validation', () => { })(class User {}); }); - context('when value is alphanumeric', () => { + describe('when value is alphanumeric', () => { it('is valid', () => { const user = new User({ name: 'A1B2', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not alphanumeric', () => { + describe('when value is not alphanumeric', () => { it('is not valid and has errors set', () => { const user = new User({ name: 'No alphanumeric $ string', }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute( + ['name'], + ['"name" must only contain alpha-numeric characters'] + ); }); }); }); describe('lowerCase', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -441,29 +455,32 @@ describe('validation', () => { })(class User {}); }); - context('when value is lower cased', () => { + describe('when value is lower cased', () => { it('is valid', () => { const user = new User({ name: 'abc', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value has some upper case character', () => { + describe('when value has some upper case character', () => { it('is not valid and has errors set', () => { const user = new User({ name: 'Abc', }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute( + ['name'], + ['"name" must only contain lowercase characters'] + ); }); }); }); describe('upperCase', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -474,29 +491,32 @@ describe('validation', () => { })(class User {}); }); - context('when value is upper cased', () => { + describe('when value is upper cased', () => { it('is valid', () => { const user = new User({ name: 'ABC', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value has some lower case character', () => { + describe('when value has some lower case character', () => { it('is not valid and has errors set', () => { const user = new User({ name: 'Abc', }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute( + ['name'], + ['"name" must only contain uppercase characters'] + ); }); }); }); describe('email', () => { - var User; + let User; beforeEach(() => { User = attributes({ @@ -507,30 +527,30 @@ describe('validation', () => { })(class User {}); }); - context('when value is a valid email', () => { + describe('when value is a valid email', () => { it('is valid', () => { const user = new User({ name: 'name@host.com', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is shorter than minimum length', () => { + describe('when value is shorter than minimum length', () => { it('is not valid and has errors set', () => { const user = new User({ name: 'Not a valid email', }); - assertInvalid(user, 'name'); + expect(user).toHaveInvalidAttribute(['name'], ['"name" must be a valid email']); }); }); }); describe('guid', () => { - context('when validating as a generic guid', () => { - var User; + describe('when validating as a generic guid', () => { + let User; beforeEach(() => { User = attributes({ @@ -541,29 +561,29 @@ describe('validation', () => { })(class User {}); }); - context('when value is a valid guid', () => { + describe('when value is a valid guid', () => { it('is valid', () => { const user = new User({ id: '759535af-3314-4ace-81b9-a519c29d0e17', }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not a valid guid', () => { + describe('when value is not a valid guid', () => { it('is not valid and has errors set', () => { const user = new User({ id: 'Not a valid guid', }); - assertInvalid(user, 'id'); + expect(user).toHaveInvalidAttribute(['id'], ['"id" must be a valid GUID']); }); }); }); - context('when validating a specific guid version', () => { - var User; + describe('when validating a specific guid version', () => { + let User; beforeEach(() => { User = attributes({ @@ -576,7 +596,7 @@ describe('validation', () => { })(class User {}); }); - context('when value is a valid guid', () => { + describe('when value is a valid guid', () => { it('is valid', () => { const uuidv4 = 'f35e1cf1-4ac9-4fbb-9c06-151dc8ff9107'; @@ -584,11 +604,11 @@ describe('validation', () => { id: uuidv4, }); - assertValid(user); + expect(user).toBeValidStructure(); }); }); - context('when value is not a valid guid', () => { + describe('when value is not a valid guid', () => { it('is not valid and has errors set', () => { const uuidv1 = 'c130564e-36d9-11e9-b210-d663bd873d93'; @@ -596,7 +616,7 @@ describe('validation', () => { id: uuidv1, }); - assertInvalid(user, 'id'); + expect(user).toHaveInvalidAttribute(['id'], ['"id" must be a valid GUID']); }); }); }); diff --git a/test/unit/validation/structureSubclass.spec.js b/packages/structure/test/unit/validation/structureSubclass.spec.js similarity index 70% rename from test/unit/validation/structureSubclass.spec.js rename to packages/structure/test/unit/validation/structureSubclass.spec.js index a70aa43..6fd02ea 100644 --- a/test/unit/validation/structureSubclass.spec.js +++ b/packages/structure/test/unit/validation/structureSubclass.spec.js @@ -1,13 +1,9 @@ const { attributes } = require('../../../src'); -const { - assertValid, - assertInvalid, -} = require('../../support/validationMatchers'); describe('validation', () => { describe('structure subclass', () => { - var Admin; - var User; + let Admin; + let User; beforeEach(() => { User = attributes({ @@ -25,42 +21,42 @@ describe('validation', () => { })(class Admin extends User {}); }); - context('with invalid superclass schema', () => { + describe('with invalid superclass schema', () => { it('is invalid', () => { const admin = new Admin({ level: 3, }); - assertInvalid(admin, 'name'); + expect(admin).toHaveInvalidAttribute(['name'], ['"name" is required']); }); }); - context('with invalid subclass schema', () => { + describe('with invalid subclass schema', () => { it('is invalid', () => { const admin = new Admin({ name: 'The admin', }); - assertInvalid(admin, 'level'); + expect(admin).toHaveInvalidAttribute(['level'], ['"level" is required']); }); }); - context('with valid superclass and subclass schema', () => { + describe('with valid superclass and subclass schema', () => { it('is valid', () => { const admin = new Admin({ name: 'The admin', level: 3, }); - assertValid(admin); + expect(admin).toBeValidStructure(); }); }); - context('with nullable attributes on superclass', () => { - var Vehicle; - var Car; + describe('with nullable attributes on superclass', () => { + let Vehicle; + let Car; - context('when nullable is true', () => { + describe('when nullable is true', () => { beforeEach(() => { Vehicle = attributes({ name: { @@ -78,11 +74,11 @@ describe('validation', () => { it('is valid', () => { const car = new Car({ name: null }); - assertValid(car); + expect(car).toBeValidStructure(); }); }); - context('when nullable is false', () => { + describe('when nullable is false', () => { beforeEach(() => { Vehicle = attributes({ name: { @@ -100,7 +96,7 @@ describe('validation', () => { it('is not valid and has errors set', () => { const car = new Car({ name: null }); - assertInvalid(car, 'name'); + expect(car).toHaveInvalidAttribute(['name'], ['"name" is required']); }); }); }); diff --git a/packages/structure/test/webpack.pretest.js b/packages/structure/test/webpack.pretest.js new file mode 100644 index 0000000..186dd66 --- /dev/null +++ b/packages/structure/test/webpack.pretest.js @@ -0,0 +1,13 @@ +const path = require('path'); +const webpackConfig = require('../webpack.config'); + +Object.assign(webpackConfig, { + mode: 'development', + devtool: 'inline-source-map', + output: { + ...webpackConfig.output, + path: path.join(__dirname, '..', 'distTest'), + }, +}); + +module.exports = webpackConfig; diff --git a/packages/structure/webpack.config.js b/packages/structure/webpack.config.js new file mode 100644 index 0000000..39e6e11 --- /dev/null +++ b/packages/structure/webpack.config.js @@ -0,0 +1,41 @@ +const path = require('path'); + +module.exports = { + mode: 'production', + entry: [path.join(__dirname, 'src/index.js')], + output: { + filename: './structure.js', + library: 'Structure', + libraryTarget: 'umd', + umdNamedDefine: true, + }, + externals: { + '@hapi/joi': { + root: 'joi', + commonjs: '@hapi/joi', + commonjs2: '@hapi/joi', + amd: 'joi', + }, + lodash: { + root: '_', + commonjs: 'lodash', + commonjs2: 'lodash', + amd: 'lodash', + }, + }, + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'], + plugins: [ + ['@babel/plugin-proposal-object-rest-spread', { loose: true, useBuiltIns: true }], + ], + }, + }, + ], + }, +}; diff --git a/src/attributes/decorator.js b/src/attributes/decorator.js deleted file mode 100644 index 1151053..0000000 --- a/src/attributes/decorator.js +++ /dev/null @@ -1,79 +0,0 @@ -const Schema = require('../schema'); -const Serialization = require('../serialization'); -const Validation = require('../validation'); -const Initialization = require('../initialization'); -const StrictMode = require('../strictMode'); -const Errors = require('../errors'); -const { SCHEMA } = require('../symbols'); -const { - attributeDescriptorFor, - attributesDescriptorFor, -} = require('./descriptors'); -const Cloning = require('../cloning'); - -const define = Object.defineProperty; - -function attributesDecorator(schema, schemaOptions = {}) { - if (typeof schemaOptions !== 'object') { - throw Errors.classAsSecondParam(schemaOptions); - } - - return function decorator(Class) { - const WrapperClass = new Proxy(Class, { - construct(target, constructorArgs, newTarget) { - const instance = Reflect.construct(target, constructorArgs, newTarget); - const passedAttributes = Object.assign({}, constructorArgs[0]); - - Initialization.initialize(schema, passedAttributes, instance); - - return instance; - }, - }); - - if (WrapperClass[SCHEMA]) { - schema = Object.assign({}, WrapperClass[SCHEMA], schema); - } - - schema = Schema.normalize(schema, schemaOptions); - - define(WrapperClass, SCHEMA, { - value: schema, - }); - - define(WrapperClass, 'validate', Validation.staticDescriptorFor(schema)); - - define(WrapperClass.prototype, SCHEMA, { - value: schema, - }); - - define(WrapperClass.prototype, 'attributes', attributesDescriptorFor( - schema - )); - - define(WrapperClass.prototype, 'validate', Validation.descriptorFor( - schema - )); - - define(WrapperClass.prototype, 'toJSON', Serialization.descriptor); - - define(WrapperClass, 'buildStrict', StrictMode.buildStrictDescriptorFor( - WrapperClass, - schemaOptions - )); - - define(WrapperClass.prototype, 'clone', Cloning.buildCloneDescriptorFor( - WrapperClass - )); - - Object.keys(schema).forEach((attr) => { - define(WrapperClass.prototype, attr, attributeDescriptorFor( - attr, - schema - )); - }); - - return WrapperClass; - }; -} - -module.exports = attributesDecorator; diff --git a/src/attributes/descriptors.js b/src/attributes/descriptors.js deleted file mode 100644 index 75685d9..0000000 --- a/src/attributes/descriptors.js +++ /dev/null @@ -1,51 +0,0 @@ -const { isObject } = require('lodash'); -const Errors = require('../errors'); -const { ATTRIBUTES } = require('../symbols'); - -exports.attributeDescriptorFor = function attributeDescriptorFor( - attributeName, - schema -) { - return { - enumerable: true, - - get() { - return this.attributes[attributeName]; - }, - - set(value) { - this.attributes[attributeName] = schema[attributeName].coerce(value); - }, - }; -}; - -exports.attributesDescriptorFor = function attributesDescriptorFor(schema) { - return { - get() { - return this[ATTRIBUTES]; - }, - - set(newAttributes) { - if (!isObject(newAttributes)) { - throw Errors.nonObjectAttributes(); - } - - const attributes = coerceAttributes(newAttributes, schema); - - Object.defineProperty(this, ATTRIBUTES, { - configurable: true, - value: attributes, - }); - }, - }; -}; - -function coerceAttributes(newAttributes, schema) { - const attributes = Object.create(null); - - for (let attrName in schema) { - attributes[attrName] = schema[attrName].coerce(newAttributes[attrName]); - } - - return attributes; -} diff --git a/src/attributes/index.js b/src/attributes/index.js deleted file mode 100644 index 89a6f28..0000000 --- a/src/attributes/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./decorator'); diff --git a/src/coercion/array.js b/src/coercion/array.js deleted file mode 100644 index a843bf2..0000000 --- a/src/coercion/array.js +++ /dev/null @@ -1,53 +0,0 @@ -const Errors = require('../errors'); -const getType = require('../typeResolver'); - -module.exports = function arrayCoercionFor(typeDescriptor, itemTypeDescriptor) { - return function coerceArray(rawValue) { - if (rawValue === undefined) { - return; - } - - validateIfIterable(rawValue); - - const items = extractItems(rawValue); - - const instance = createInstance(typeDescriptor); - - return fillInstance(instance, items, itemTypeDescriptor); - }; -}; - -function validateIfIterable(value) { - if (!isIterable(value)) { - throw Errors.arrayOrIterable(); - } -} - -function isIterable(value) { - return value != null && (value.length != null || value[Symbol.iterator]); -} - -function extractItems(iterable) { - if (!Array.isArray(iterable) && iterable[Symbol.iterator]) { - return Array(...iterable); - } - - return iterable; -} - -function createInstance(typeDescriptor) { - const type = getType(typeDescriptor); - return new type(); -} - -function fillInstance(instance, items, itemTypeDescriptor) { - for (let i = 0; i < items.length; i++) { - instance.push(coerceItem(itemTypeDescriptor, items[i])); - } - - return instance; -} - -function coerceItem(itemTypeDescriptor, item) { - return itemTypeDescriptor.coerce(item); -} diff --git a/src/coercion/coercion.js b/src/coercion/coercion.js deleted file mode 100644 index dc6d809..0000000 --- a/src/coercion/coercion.js +++ /dev/null @@ -1,33 +0,0 @@ -const { isFunction, curryRight } = require('lodash'); - -exports.execute = curryRight(function(value, coercion, typeDescriptor) { - if (value === undefined) { - return; - } - - if (value === null) { - return getNullableValue(coercion, typeDescriptor); - } - - if (coercion.isCoerced(value, typeDescriptor)) { - return value; - } - - return coercion.coerce(value, typeDescriptor); -}); - -function getNullableValue(coercion, typeDescriptor) { - return needsNullableInitialization(typeDescriptor) - ? getNullValue(coercion) - : null; -} - -function needsNullableInitialization(typeDescriptor) { - return !typeDescriptor.required && !typeDescriptor.nullable; -} - -function getNullValue(coercion) { - return isFunction(coercion.nullValue) - ? coercion.nullValue() - : coercion.nullValue; -} diff --git a/src/coercion/generic.js b/src/coercion/generic.js deleted file mode 100644 index 4f028a3..0000000 --- a/src/coercion/generic.js +++ /dev/null @@ -1,12 +0,0 @@ -const getType = require('../typeResolver'); - -module.exports = { - isCoerced(value, typeDescriptor) { - return value instanceof getType(typeDescriptor); - }, - coerce(value, typeDescriptor) { - const type = getType(typeDescriptor); - - return new type(value); - }, -}; diff --git a/src/coercion/index.js b/src/coercion/index.js deleted file mode 100644 index 41662cb..0000000 --- a/src/coercion/index.js +++ /dev/null @@ -1,30 +0,0 @@ -const arrayCoercionFor = require('./array'); -const genericCoercionFor = require('./generic'); -const Coercion = require('./coercion'); - -const types = [ - require('./string'), - require('./number'), - require('./boolean'), - require('./date'), -]; - -exports.for = function coercionFor(typeDescriptor, itemTypeDescriptor) { - if (itemTypeDescriptor) { - return arrayCoercionFor(typeDescriptor, itemTypeDescriptor); - } - - const coercion = getCoercion(typeDescriptor); - - return Coercion.execute(coercion, typeDescriptor); -}; - -function getCoercion(typeDescriptor) { - const coercion = types.find((c) => c.type === typeDescriptor.type); - - if (coercion) { - return coercion; - } - - return genericCoercionFor; -} diff --git a/src/index.js b/src/index.js deleted file mode 100644 index d316a05..0000000 --- a/src/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - attributes: require('./attributes'), -}; diff --git a/src/initialization/index.js b/src/initialization/index.js deleted file mode 100644 index 8b280dd..0000000 --- a/src/initialization/index.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - forSchema: require('./initialization'), - initialize: require('./initialize'), -}; diff --git a/src/initialization/initialization.js b/src/initialization/initialization.js deleted file mode 100644 index f337904..0000000 --- a/src/initialization/initialization.js +++ /dev/null @@ -1,38 +0,0 @@ -const { ATTRIBUTES } = require('../symbols'); -const initializationOrderFor = require('./initializationOrder'); - -function initializedValue( - attrPassedValue, - attrInitializer, - attrDescriptor, - instance -) { - if (attrPassedValue !== undefined) { - return attrPassedValue; - } - - return attrInitializer(attrDescriptor, instance); -} - -module.exports = function forSchema(schema) { - const initializationOrder = initializationOrderFor(schema); - - return { - initialize(attributes, instance) { - instance[ATTRIBUTES] = Object.create(null); - - for (let i = 0; i < initializationOrder.length; i++) { - const [attrName, attrInitializer] = initializationOrder[i]; - const attrDescriptor = schema[attrName]; - const attrPassedValue = attributes[attrName]; - - instance[attrName] = initializedValue( - attrPassedValue, - attrInitializer, - attrDescriptor, - instance - ); - } - }, - }; -}; diff --git a/src/initialization/initializationOrder.js b/src/initialization/initializationOrder.js deleted file mode 100644 index 1325595..0000000 --- a/src/initialization/initializationOrder.js +++ /dev/null @@ -1,30 +0,0 @@ -const { isFunction } = require('lodash'); - -function isStaticInitialization(attrDescriptor) { - return !isFunction(attrDescriptor.default); -} - -function staticInitialization(attrDescriptor) { - return attrDescriptor.default; -} - -function derivedInitialization(attrDescriptor, instance) { - return attrDescriptor.default(instance); -} - -module.exports = function initializationOrderFor(schema) { - const staticInitializations = []; - const derivedInitializations = []; - - for (let attrName in schema) { - const attributeDescriptor = schema[attrName]; - - if (isStaticInitialization(attributeDescriptor)) { - staticInitializations.push([attrName, staticInitialization]); - } else { - derivedInitializations.push([attrName, derivedInitialization]); - } - } - - return [...staticInitializations, ...derivedInitializations]; -}; diff --git a/src/initialization/initialize.js b/src/initialization/initialize.js deleted file mode 100644 index 0aa0845..0000000 --- a/src/initialization/initialize.js +++ /dev/null @@ -1,5 +0,0 @@ -const { INITIALIZE } = require('../symbols'); - -module.exports = function initialize(schema, attributes, instance) { - schema[INITIALIZE].initialize(attributes, instance); -}; diff --git a/src/schema/index.js b/src/schema/index.js deleted file mode 100644 index 8e892b3..0000000 --- a/src/schema/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - normalize: require('./normalization'), -}; diff --git a/src/schema/normalization.js b/src/schema/normalization.js deleted file mode 100644 index 37d7703..0000000 --- a/src/schema/normalization.js +++ /dev/null @@ -1,30 +0,0 @@ -const Validation = require('../validation'); -const Initialization = require('../initialization'); -const TypeDescriptor = require('../typeDescriptor'); -const { VALIDATE, INITIALIZE } = require('../symbols'); - -module.exports = function normalizeSchema(rawSchema, schemaOptions) { - const schema = Object.create(null); - - Object.keys(rawSchema).forEach((attributeName) => { - schema[attributeName] = TypeDescriptor.normalize( - schemaOptions, - rawSchema[attributeName], - attributeName - ); - }); - - const schemaValidation = Validation.forSchema(schema); - - Object.defineProperty(schema, VALIDATE, { - value: schemaValidation, - }); - - const initialization = Initialization.forSchema(schema); - - Object.defineProperty(schema, INITIALIZE, { - value: initialization, - }); - - return schema; -}; diff --git a/src/serialization/descriptor.js b/src/serialization/descriptor.js deleted file mode 100644 index 5cbaefb..0000000 --- a/src/serialization/descriptor.js +++ /dev/null @@ -1,7 +0,0 @@ -const serialize = require('./serialize'); - -module.exports = { - value: function toJSON() { - return serialize(this); - }, -}; diff --git a/src/serialization/index.js b/src/serialization/index.js deleted file mode 100644 index e41b561..0000000 --- a/src/serialization/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - descriptor: require('./descriptor'), -}; diff --git a/src/serialization/serialize.js b/src/serialization/serialize.js deleted file mode 100644 index a042cdc..0000000 --- a/src/serialization/serialize.js +++ /dev/null @@ -1,64 +0,0 @@ -const { SCHEMA } = require('../symbols'); -const getType = require('../typeResolver'); - -function serialize(structure) { - if (structure == null) { - return structure; - } - - const schema = structure[SCHEMA]; - - return serializeStructure(structure, schema); -} - -function getTypeSchema(typeDescriptor) { - return getType(typeDescriptor)[SCHEMA]; -} - -function serializeStructure(structure, schema) { - const serializedStructure = Object.create(null); - - for (let attrName in schema) { - let attribute = structure[attrName]; - - if (isPresent(attribute) || isNullable(attribute, schema, attrName)) { - serializedStructure[attrName] = serializeAttribute( - attribute, - attrName, - schema - ); - } - } - - return serializedStructure; -} - -function isPresent(attribute) { - return attribute != null; -} - -function isNullable(attribute, schema, attrName) { - return attribute !== undefined && schema[attrName].nullable; -} - -function serializeAttribute(attribute, attrName, schema) { - if (isArrayType(schema, attrName)) { - return attribute.map(serialize); - } - - if (isNestedSchema(schema, attrName)) { - return serialize(attribute); - } - - return attribute; -} - -function isArrayType(schema, attrName) { - return schema[attrName].itemType && getTypeSchema(schema[attrName].itemType); -} - -function isNestedSchema(schema, attrName) { - return getTypeSchema(schema[attrName]); -} - -module.exports = serialize; diff --git a/src/typeDescriptor/index.js b/src/typeDescriptor/index.js deleted file mode 100644 index 9163d74..0000000 --- a/src/typeDescriptor/index.js +++ /dev/null @@ -1,91 +0,0 @@ -const { isObject, isFunction, isString } = require('lodash'); -const Errors = require('../errors'); -const Coercion = require('../coercion'); -const Validation = require('../validation'); - -function normalizeTypeDescriptor(schemaOptions, typeDescriptor, attributeName) { - if (isShorthandTypeDescriptor(typeDescriptor)) { - typeDescriptor = convertToCompleteTypeDescriptor(typeDescriptor); - } - - validateTypeDescriptor(typeDescriptor, attributeName); - - return normalizeCompleteTypeDescriptor( - schemaOptions, - typeDescriptor, - attributeName - ); -} - -function normalizeCompleteTypeDescriptor( - schemaOptions, - typeDescriptor, - attributeName -) { - if (isDynamicTypeDescriptor(typeDescriptor)) { - typeDescriptor = addDynamicTypeGetter( - schemaOptions, - typeDescriptor, - attributeName - ); - } - - if (isArrayType(typeDescriptor)) { - typeDescriptor.itemType = normalizeTypeDescriptor( - schemaOptions, - typeDescriptor.itemType, - 'itemType' - ); - } - - return createNormalizedTypeDescriptor(typeDescriptor); -} - -function createNormalizedTypeDescriptor(typeDescriptor) { - return Object.assign({}, typeDescriptor, { - coerce: Coercion.for(typeDescriptor, typeDescriptor.itemType), - validation: Validation.forAttribute(typeDescriptor), - }); -} - -function validateTypeDescriptor(typeDescriptor, attributeName) { - if ( - !isObject(typeDescriptor.type) && - !isDynamicTypeDescriptor(typeDescriptor) - ) { - throw Errors.invalidType(attributeName); - } -} - -function isDynamicTypeDescriptor(typeDescriptor) { - return isString(typeDescriptor.type); -} - -function addDynamicTypeGetter(schemaOptions, typeDescriptor, attributeName) { - if (!hasDynamicType(schemaOptions, typeDescriptor)) { - throw Errors.missingDynamicType(attributeName); - } - - typeDescriptor.getType = schemaOptions.dynamics[typeDescriptor.type]; - typeDescriptor.dynamicType = true; - - return typeDescriptor; -} - -function isShorthandTypeDescriptor(typeDescriptor) { - return isFunction(typeDescriptor) || isString(typeDescriptor); -} - -function convertToCompleteTypeDescriptor(typeDescriptor) { - return { type: typeDescriptor }; -} - -function hasDynamicType(schemaOptions, typeDescriptor) { - return schemaOptions.dynamics && schemaOptions.dynamics[typeDescriptor.type]; -} - -function isArrayType(typeDescriptor) { - return typeDescriptor.itemType != null; -} - -exports.normalize = normalizeTypeDescriptor; diff --git a/src/typeResolver.js b/src/typeResolver.js deleted file mode 100644 index 97246b1..0000000 --- a/src/typeResolver.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = function getAttributeType(typeDescriptor) { - if (typeDescriptor.dynamicType) { - return typeDescriptor.getType(); - } - - return typeDescriptor.type; -}; diff --git a/src/validation/array.js b/src/validation/array.js deleted file mode 100644 index e5600b6..0000000 --- a/src/validation/array.js +++ /dev/null @@ -1,25 +0,0 @@ -const joi = require('joi'); -const { mapToJoi } = require('./utils'); - -const joiMappings = [ - ['minLength', 'min', true], - ['maxLength', 'max', true], - ['exactLength', 'length', true], - ['unique', 'unique'] - -]; - -module.exports = function arrayValidation(typeDescriptor, itemTypeDescriptor) { - var joiSchema = joi.array().items(itemTypeDescriptor.validation); - const canBeSparse = - typeDescriptor.sparse === undefined || typeDescriptor.sparse; - - joiSchema = joiSchema.sparse(canBeSparse); - - joiSchema = mapToJoi(typeDescriptor, { - initial: joiSchema, - mappings: joiMappings, - }); - - return joiSchema; -}; diff --git a/src/validation/boolean.js b/src/validation/boolean.js deleted file mode 100644 index 58147ef..0000000 --- a/src/validation/boolean.js +++ /dev/null @@ -1,17 +0,0 @@ -const joi = require('joi'); -const { mapToJoi, equalOption } = require('./utils'); - -module.exports = { - type: Boolean, - joiMappings: [], - createJoiSchema(typeDescriptor) { - var joiSchema = joi.boolean(); - - joiSchema = equalOption(typeDescriptor, { initial: joiSchema }); - - return mapToJoi(typeDescriptor, { - initial: joiSchema, - mappings: this.joiMappings, - }); - }, -}; diff --git a/src/validation/descriptors.js b/src/validation/descriptors.js deleted file mode 100644 index 6aa1fbd..0000000 --- a/src/validation/descriptors.js +++ /dev/null @@ -1,44 +0,0 @@ -const { SCHEMA, VALIDATE } = require('../symbols'); - -exports.validationDescriptorForSchema = function validationDescriptorForSchema( - schema -) { - const validation = schema[VALIDATE]; - - return { - value: function validate() { - const serializedStructure = this.toJSON(); - - return validateData(validation, serializedStructure); - }, - }; -}; - -exports.staticValidationDescriptorForSchema = function staticValidationDescriptorForSchema( - schema -) { - const validation = schema[VALIDATE]; - - return { - value: function validate(data) { - if (data[SCHEMA]) { - data = data.toJSON(); - } - - return validateData(validation, data); - }, - }; -}; - -function validateData(validation, data) { - const errors = validation.validate(data); - - if (errors) { - return { - valid: false, - errors, - }; - } - - return { valid: true }; -} diff --git a/src/validation/index.js b/src/validation/index.js deleted file mode 100644 index 8aae48a..0000000 --- a/src/validation/index.js +++ /dev/null @@ -1,65 +0,0 @@ -const joi = require('joi'); - -const validations = [ - require('./string'), - require('./number'), - require('./boolean'), - require('./date'), -]; - -const nestedValidation = require('./nested'); -const arrayValidation = require('./array'); - -const { - validationDescriptorForSchema, - staticValidationDescriptorForSchema, -} = require('./descriptors'); - -exports.descriptorFor = validationDescriptorForSchema; -exports.staticDescriptorFor = staticValidationDescriptorForSchema; - -exports.forAttribute = function validationForAttribute(typeDescriptor) { - if (typeDescriptor.itemType !== undefined) { - return arrayValidation(typeDescriptor, typeDescriptor.itemType); - } - - const validation = validations.find((v) => v.type === typeDescriptor.type); - - if (!validation) { - return nestedValidation(typeDescriptor); - } - - return validation.createJoiSchema(typeDescriptor); -}; - -const mapDetail = ({ message, path }) => ({ message, path }); - -const validatorOptions = { - abortEarly: false, - convert: false, - allowUnknown: false, -}; - -exports.forSchema = function validationForSchema(schema) { - const schemaValidation = {}; - - Object.keys(schema).forEach((attributeName) => { - schemaValidation[attributeName] = schema[attributeName].validation; - }); - - const joiValidation = joi.object().keys(schemaValidation); - - return { - validate(structure) { - var validationErrors; - - const { error } = joiValidation.validate(structure, validatorOptions); - - if (error) { - validationErrors = error.details.map(mapDetail); - } - - return validationErrors; - }, - }; -}; diff --git a/src/validation/nested.js b/src/validation/nested.js deleted file mode 100644 index 3634331..0000000 --- a/src/validation/nested.js +++ /dev/null @@ -1,50 +0,0 @@ -const joi = require('joi'); -const { SCHEMA } = require('../symbols'); -const { requiredOption } = require('./utils'); - -module.exports = function nestedValidation(typeDescriptor) { - if (typeDescriptor.dynamicType) { - return validationToDynamicType(typeDescriptor); - } - - const typeSchema = typeDescriptor.type[SCHEMA]; - var joiSchema = getNestedValidations(typeSchema); - - joiSchema = requiredOption(typeDescriptor, { - initial: joiSchema, - }); - - return joiSchema; -}; - -function validationToDynamicType(typeDescriptor) { - var joiSchema = joi.lazy(() => { - const typeSchema = typeDescriptor.getType()[SCHEMA]; - - return getNestedValidations(typeSchema); - }); - - joiSchema = requiredOption(typeDescriptor, { - initial: joiSchema, - }); - - return joiSchema; -} - -function getNestedValidations(typeSchema) { - var joiSchema = joi.object(); - - if (typeSchema) { - const nestedValidations = Object.keys(typeSchema).reduce( - (validations, v) => { - validations[v] = typeSchema[v].validation; - return validations; - }, - {} - ); - - joiSchema = joiSchema.keys(nestedValidations); - } - - return joiSchema; -} diff --git a/src/validation/utils.js b/src/validation/utils.js deleted file mode 100644 index 1c0cad6..0000000 --- a/src/validation/utils.js +++ /dev/null @@ -1,86 +0,0 @@ -const joi = require('joi'); -const { isPlainObject, isFunction } = require('lodash'); - -exports.mapToJoi = function mapToJoi(typeDescriptor, { initial, mappings }) { - let joiSchema = mappings.reduce( - (joiSchema, [optionName, joiMethod, passValueToJoi]) => { - const attributeDescriptor = typeDescriptor[optionName]; - if (attributeDescriptor === undefined) { - return joiSchema; - } - - if (shouldPassValueToJoi(passValueToJoi, attributeDescriptor)) { - return joiSchema[joiMethod](attributeDescriptor); - } - - return joiSchema[joiMethod](); - }, - initial - ); - - joiSchema = requiredOption(typeDescriptor, { initial: joiSchema }); - - return joiSchema; -}; - -function shouldPassValueToJoi(passValueToJoi, attributeDescriptor) { - return ( - passValueToJoi && - (!isFunction(passValueToJoi) || passValueToJoi(attributeDescriptor)) - ); -} - -function mapValueOrReference(valueOrReference) { - if (isPlainObject(valueOrReference)) { - return joi.ref(valueOrReference.attr); - } - - return valueOrReference; -} - -exports.mapToJoiWithReference = function mapToJoiWithReference( - typeDescriptor, - { initial, mappings } -) { - return mappings.reduce((joiSchema, [optionName, joiMethod]) => { - var attributeDescriptor = typeDescriptor[optionName]; - - if (attributeDescriptor === undefined) { - return joiSchema; - } - - attributeDescriptor = mapValueOrReference(attributeDescriptor); - - return joiSchema[joiMethod](attributeDescriptor); - }, initial); -}; - -exports.equalOption = function equalOption(typeDescriptor, { initial }) { - var possibilities = typeDescriptor.equal; - - if (possibilities === undefined) { - return initial; - } - - if (Array.isArray(possibilities)) { - possibilities = possibilities.map(mapValueOrReference); - } else { - possibilities = mapValueOrReference(possibilities); - } - - return initial.equal(possibilities); -}; - -function requiredOption(typeDescriptor, { initial }) { - if (typeDescriptor.nullable) { - initial = initial.allow(null); - } - - if (typeDescriptor.required) { - initial = initial.required(); - } - - return initial; -} - -exports.requiredOption = requiredOption; diff --git a/test/browserSetup.js b/test/browserSetup.js deleted file mode 100644 index d45d723..0000000 --- a/test/browserSetup.js +++ /dev/null @@ -1,6 +0,0 @@ -require('babel-polyfill'); -require('babel!proxy-polyfill'); - -const tests = require.context('./unit', true, /\.spec\.js$/); - -tests.keys().forEach(tests); diff --git a/test/karma.conf.js b/test/karma.conf.js deleted file mode 100644 index 4fe0f26..0000000 --- a/test/karma.conf.js +++ /dev/null @@ -1,43 +0,0 @@ -const webpackConfig = require('../webpack.config'); - -Object.assign(webpackConfig, { - externals: {}, - resolve: { - alias: { - joi: 'joi-browser', - }, - }, - devtool: 'inline-source-map', -}); - -module.exports = function(config) { - config.set({ - frameworks: ['mocha'], - browsers: ['Chrome'], - // browsers: ['Firefox'], - reporters: ['mocha'], - singleRun: true, - - files: ['browserSetup.js'], - - preprocessors: { - 'browserSetup.js': ['webpack', 'sourcemap'], - }, - - mochaReporter: { - showDiff: true, - }, - - webpack: webpackConfig, - - webpackMiddleware: { - noInfo: true, - }, - - beforeMiddleware: ['webpackBlocker'], - - phantomjsLauncher: { - exitOnResourceError: true, - }, - }); -}; diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index 6147678..0000000 --- a/test/mocha.opts +++ /dev/null @@ -1,2 +0,0 @@ -test/unit ---recursive diff --git a/test/support/validationMatchers.js b/test/support/validationMatchers.js deleted file mode 100644 index 766e758..0000000 --- a/test/support/validationMatchers.js +++ /dev/null @@ -1,17 +0,0 @@ -const { expect } = require('chai'); - -exports.assertValid = function assertValid(structure) { - const { valid, errors } = structure.validate(); - - expect(valid).to.be.true; - expect(errors).to.be.undefined; -}; - -exports.assertInvalid = function assertInvalid(structure, path) { - const { valid, errors } = structure.validate(); - - expect(valid).to.be.false; - expect(errors).to.be.instanceOf(Array); - expect(errors).to.have.lengthOf(1); - expect(errors[0].path).to.equal(path); -}; diff --git a/test/unit/coercion/array.spec.js b/test/unit/coercion/array.spec.js deleted file mode 100644 index 330c3d5..0000000 --- a/test/unit/coercion/array.spec.js +++ /dev/null @@ -1,172 +0,0 @@ -const { expect } = require('chai'); -const { attributes } = require('../../../src'); - -describe('type coercion', () => { - describe('Array', () => { - var Seat; - var User; - - beforeEach(() => { - User = attributes({ - books: { - type: Array, - itemType: String, - }, - })(class User {}); - }); - - it('does not coerces undefined', () => { - const user = new User({ - books: undefined, - }); - - expect(user.books).to.be.undefined; - }); - - context('when raw value is already an array', () => { - it('coerces items', () => { - const user = new User({ - books: ['The Lord of The Rings', 1984, true], - }); - - expect(user.books).to.eql(['The Lord of The Rings', '1984', 'true']); - }); - - it('does not coerce items that are of the expected type', () => { - const book = new String('A Game of Thrones'); - - const user = new User({ - books: [book], - }); - - expect(user.books).to.eql([new String('A Game of Thrones')]); - expect(user.books[0]).to.equal(book); - }); - }); - - context('when raw value is a string', () => { - it('uses each character as an item', () => { - const user = new User({ - books: 'ABC', - }); - - expect(user.books).to.eql(['A', 'B', 'C']); - }); - - it('coerces empty string to empty array', () => { - const user = new User({ - books: '', - }); - - expect(user.books).to.eql([]); - }); - - it('does nested coercing when expected item type is not String', () => { - const Library = attributes({ - bookIds: { - type: Array, - itemType: Number, - }, - })(class Library {}); - - const library = new Library({ - bookIds: '123', - }); - - expect(library.bookIds).to.eql([1, 2, 3]); - }); - }); - - context('when raw value is an array-like', () => { - it('loops using #length property', () => { - const user = new User({ - books: { 0: 'Stonehenge', 1: 1984, length: 2 }, - }); - - expect(user.books).to.eql(['Stonehenge', '1984']); - }); - }); - - context('when raw value implements Symbol.iterator', () => { - it('converts to array then uses each index', () => { - const books = { - *[Symbol.iterator]() { - for (let i = 0; i < 3; i++) { - yield i; - } - }, - }; - - const user = new User({ books }); - - expect(user.books).to.eql(['0', '1', '2']); - }); - }); - - context('when raw value is a not iterable', () => { - it('throws an error', () => { - expect(() => { - new User({ - books: 123, - }); - }).to.throw(TypeError, /^Value must be iterable or array-like\.$/); - }); - }); - - context('when raw value is a single numeric array', () => { - beforeEach(() => { - Seat = attributes({ - seats: { - type: Array, - itemType: Number, - }, - })(class Seat {}); - }); - - it('return the correct array', () => { - const seat = new Seat({ - seats: [1], - }); - - expect(seat.seats).to.eql([1]); - }); - }); - }); - - describe('Array from dynamic type', () => { - var CircularUser; - var BooksCollection; - - beforeEach(() => { - CircularUser = require('../../fixtures/CircularUser'); - BooksCollection = require('../../fixtures/BooksCollection'); - }); - - it('coerces collection', () => { - const user = new CircularUser({ - books: ['Dragons of Ether', 'The Dark Tower'], - }); - - expect(user.books).to.be.instanceOf(BooksCollection); - }); - - it('coerces items', () => { - const user = new CircularUser({ - books: ['The Lord of The Rings', 1984, true], - }); - - expect(user.books).to.eql(['The Lord of The Rings', '1984', 'true']); - }); - - it('does not coerce items that are of the expected type', () => { - const book = new String('A Game of Thrones'); - - const user = new CircularUser({ - books: [book], - }); - - expect(user.books).to.eql([new String('A Game of Thrones')]); - expect(user.books[0]).to.equal(book); - }); - }); -}); diff --git a/test/unit/coercion/coercion.spec.js b/test/unit/coercion/coercion.spec.js deleted file mode 100644 index 52bd8b5..0000000 --- a/test/unit/coercion/coercion.spec.js +++ /dev/null @@ -1,140 +0,0 @@ -const { expect } = require('chai'); -const { spy } = require('sinon'); -const Coercion = require('../../../src/coercion/coercion'); -const CoercionNumber = require('../../../src/coercion/number'); -const CoercionDate = require('../../../src/coercion/date'); - -describe('Coercion', () => { - describe('.execute', () => { - let value, coercion, typeDescriptor; - - context('when value is undefined', () => { - beforeEach(() => { - value = undefined; - coercion = null; - typeDescriptor = null; - }); - - it('returns undefined', () => { - const executionResponse = Coercion.execute( - value, - coercion, - typeDescriptor - ); - - expect(executionResponse).to.be.undefined; - }); - }); - - context('when value is null', () => { - beforeEach(() => (value = null)); - - context('and attribute is nullable', () => { - beforeEach(() => { - coercion = CoercionNumber; - typeDescriptor = { nullable: true }; - }); - - it('returns null', () => { - const executionResponse = Coercion.execute( - value, - coercion, - typeDescriptor - ); - - expect(executionResponse).to.be.null; - }); - }); - - context('and attribute is not nullable', () => { - beforeEach(() => { - coercion = CoercionNumber; - typeDescriptor = { nullable: false }; - }); - - it('returns default value present on Coercion object', () => { - const executionResponse = Coercion.execute( - value, - coercion, - typeDescriptor - ); - - expect(executionResponse).to.be.eq(0); - }); - }); - - context('and default attribute is a dynamic value', () => { - beforeEach(() => { - coercion = CoercionDate; - typeDescriptor = { nullable: false }; - }); - - it('returns default value present on Coercion object', () => { - const executionResponse = Coercion.execute( - value, - coercion, - typeDescriptor - ); - - expect(executionResponse).to.be.eql(new Date('1970-01-01T00:00:00Z')); - }); - - it('creates a new object instance for default value', () => { - const executionResponse = Coercion.execute( - value, - coercion, - typeDescriptor - ); - - expect(executionResponse).not.to.be.eq(coercion.nullValue()); - }); - }); - }); - - context('when value is already coerced to correct type', () => { - beforeEach(() => { - value = 42; - coercion = CoercionNumber; - typeDescriptor = null; - - spy(CoercionNumber, 'coerce'); - }); - - afterEach(() => CoercionNumber.coerce.restore()); - - it('returns default value present on Coercion object', () => { - const executionResponse = Coercion.execute( - value, - coercion, - typeDescriptor - ); - - expect(executionResponse).to.be.eq(42); - }); - - it('does not invoke #coerce function', () => { - Coercion.execute(value, coercion, typeDescriptor); - - expect(coercion.coerce.called).to.be.false; - }); - }); - - context('when value is not coerced to correct type', () => { - beforeEach(() => { - value = '1008'; - coercion = CoercionNumber; - typeDescriptor = null; - }); - - it('returns default value present on Coercion object', () => { - const executionResponse = Coercion.execute( - value, - coercion, - typeDescriptor - ); - - expect(executionResponse).to.be.eq(1008); - }); - }); - }); -}); diff --git a/test/unit/creatingStructureClass.spec.js b/test/unit/creatingStructureClass.spec.js deleted file mode 100644 index ee8fcc9..0000000 --- a/test/unit/creatingStructureClass.spec.js +++ /dev/null @@ -1,124 +0,0 @@ -const { expect } = require('chai'); -const { attributes } = require('../../src'); - -describe('creating a structure class', () => { - describe('structure class is passed as the second parameter', () => { - context('when structure class has a name', () => { - it('throws with a message with structure class name', () => { - expect(() => { - attributes({}, class User {}); - }).to.throw(Error, /^You passed the structure class.*\(User\)`\./); - }); - }); - - context('when structure class is anonymous', () => { - it('throws with a message with generic structure name', () => { - // It's like this because Babel gives the name _class - // to anonymous classes and do function auto-naming, - // breaking browser tests - const anonymousClass = (() => function() {})(); - - expect(() => { - attributes({}, anonymousClass); - }).to.throw( - Error, - /^You passed the structure class.*\(StructureClass\)`\./ - ); - }); - }); - }); - - describe('using class static methods and properties', () => { - var User; - - beforeEach(() => { - class RawUser { - static staticMethod() { - return 'I am on a static method'; - } - } - - RawUser.staticProperty = 'I am a static property'; - - User = attributes({ - name: String, - })(RawUser); - }); - - it('has access to static methods and properties', () => { - expect(User.staticMethod()).to.equal('I am on a static method'); - expect(User.staticProperty).to.equal('I am a static property'); - }); - }); - - describe('using default values for attributes', () => { - context('when the provided default value is a function', () => { - var User; - - beforeEach(() => { - User = attributes({ - age: { type: Number, default: () => 18 }, - })(class User {}); - }); - - it('defines the attribute with the default value executing the function', () => { - const user = new User(); - - expect(user.age).to.equal(18); - }); - }); - - context( - 'when the function default value uses another class attribute', - () => { - var User; - - beforeEach(() => { - User = attributes({ - name: String, - surname: String, - fullname: { - type: String, - default: (self) => `${self.name} ${self.surname}`, - }, - })(class User {}); - }); - - it('defines the attribute with the default value executing the function', () => { - const user = new User({ name: 'Jack', surname: 'Sparrow' }); - - expect(user.fullname).to.equal('Jack Sparrow'); - }); - } - ); - - context('when the provided default value is a property', () => { - var User; - - beforeEach(() => { - User = attributes({ - age: { type: Number, default: 18 }, - })(class User {}); - }); - - it('defines the attribute with the default value of the property', () => { - const user = new User(); - - expect(user.age).to.equal(18); - }); - }); - }); - - describe('when using dynamic attribute types', () => { - it('allows to use dynamic values without breaking', () => { - require('../fixtures/CircularUser'); - require('../fixtures/CircularBook'); - }); - - it('breaks if there is no value for dynamic type', () => { - expect(() => { - require('../fixtures/BrokenCircularBook'); - }).to.throw(Error, 'Missing dynamic type for attribute: owner'); - }); - }); -}); diff --git a/test/unit/instanceAndUpdate.spec.js b/test/unit/instanceAndUpdate.spec.js deleted file mode 100644 index 95c9a83..0000000 --- a/test/unit/instanceAndUpdate.spec.js +++ /dev/null @@ -1,578 +0,0 @@ -const { expect } = require('chai'); -const { attributes } = require('../../src'); - -describe('instantiating a structure', () => { - var User; - - beforeEach(() => { - User = attributes({ - name: { - type: String, - default: 'Name', - }, - password: { - type: String, - required: true, - }, - nickname: { - type: String, - default: (instance) => instance.name, - }, - uuid: { - type: String, - default: (instance) => instance.getUuid(), - }, - attrUsingMethodUsingAttr: { - type: String, - default: (instance) => instance.someMethod(), - }, - })( - class User { - constructor() { - this.userInstanceStuff = 'Stuff value'; - } - - userMethod() { - return 'I am a user'; - } - - getUuid() { - return 10; - } - - someMethod() { - return `Method => ${this.name}`; - } - } - ); - }); - - it('has access to instance methods', () => { - const user = new User(); - - expect(user.userMethod()).to.equal('I am a user'); - }); - - it('has access to instance attributes created on constructor', () => { - const user = new User(); - - expect(user.userInstanceStuff).to.equal('Stuff value'); - }); - - it('has attributes passed to constructor assigned to the object', () => { - const user = new User({ - password: 'My password', - }); - - expect(user.password).to.equal('My password'); - }); - - it('does not mutate the attributes object passed to the constructor', () => { - const attributesObject = {}; - - new User(attributesObject); - - expect(attributesObject).to.be.empty; - }); - - it('ignores invalid attributes passed to constructor', () => { - const user = new User({ - invalid: 'I will be ignored', - }); - - expect(user.invalid).to.be.undefined; - }); - - it('reflects instance attributes to #attributes', () => { - const user = new User({ - password: 'The password', - }); - - expect(user.password).to.equal('The password'); - expect(user.attributes.password).to.equal('The password'); - }); - - describe('attributes initialization', () => { - describe('default value', () => { - context('when attribute default value is a static value', () => { - it('defaults to the static value', () => { - const user = new User(); - - expect(user.name).to.equal('Name'); - }); - }); - - context('when attribute default value is a function', () => { - it('calls the function using the instance of the object as parameter and perform coercion', () => { - const user = new User(); - - expect(user.uuid).to.equal('10'); - }); - }); - - context( - 'when attribute dynamic default uses a static defaultable attribute', - () => { - context( - 'when static defaultable attribute uses default value', - () => { - it('allows to access the value of that attribute', () => { - const user = new User(); - - expect(user.nickname).to.equal('Name'); - }); - } - ); - - context( - 'when static defaultable attribute has a value passed to it', - () => { - it('allows to access the value of that attribute', () => { - const user = new User({ name: 'This is my name' }); - - expect(user.nickname).to.equal('This is my name'); - }); - } - ); - - context( - 'when dynamic default uses a method that uses an attribute with default', - () => { - it('generates the default value properly', () => { - const user = new User(); - - expect(user.attrUsingMethodUsingAttr).to.equal( - 'Method => Name' - ); - }); - } - ); - } - ); - - it('overwrites default value with passed value', () => { - const user = new User({ name: 'Not the default' }); - - expect(user.name).to.equal('Not the default'); - }); - }); - - describe('instantiating a structure with buildStrict', () => { - context('when object is invalid', () => { - context('when using default error class', () => { - it('throws a default error', () => { - let errorDetails = [ - { - message: '"password" is required', - path: 'password', - }, - ]; - - expect(() => { - User.buildStrict(); - }) - .to.throw(Error, 'Invalid Attributes') - .with.property('details') - .that.deep.equals(errorDetails); - }); - }); - - context('when using custom error class', () => { - var UserWithCustomError; - var InvalidUser; - - beforeEach(() => { - InvalidUser = class InvalidUser extends Error { - constructor(errors) { - super('There is something wrong with this user'); - this.errors = errors; - } - }; - - UserWithCustomError = attributes( - { - name: { - type: String, - minLength: 3, - }, - }, - { - strictValidationErrorClass: InvalidUser, - } - )(class UserWithCustomError {}); - }); - - it('throws a custom error', () => { - expect(() => { - UserWithCustomError.buildStrict({ - name: 'JJ', - }); - }).to.throw(InvalidUser, 'There is something wrong with this user'); - }); - }); - }); - - context('when object is valid', () => { - it('return an intance', () => { - const user = User.buildStrict({ - password: 'My password', - }); - - expect(user.password).to.equal('My password'); - }); - }); - }); - }); -}); - -describe('instantiating a structure with dynamic attribute types', () => { - var CircularUser; - var CircularBook; - - beforeEach(() => { - CircularUser = require('../fixtures/CircularUser'); - CircularBook = require('../fixtures/CircularBook'); - }); - - it('creates instance properly', () => { - const userOne = new CircularUser({ - name: 'Circular user one', - friends: [], - favoriteBook: new CircularBook({ - name: 'Brave new world', - owner: new CircularUser(), - }), - }); - - const userTwo = new CircularUser({ - name: 'Circular user two', - friends: [userOne], - }); - - expect(userOne).to.be.instanceOf(CircularUser); - expect(userOne.favoriteBook).to.be.instanceOf(CircularBook); - expect(userOne.favoriteBook.owner).to.be.instanceOf(CircularUser); - expect(userTwo).to.be.instanceOf(CircularUser); - expect(userTwo.friends[0]).to.be.instanceOf(CircularUser); - }); - - describe('with buildStrict', () => { - context('when object is invalid', () => { - it('throw an error', () => { - let errorDetails = [ - { - message: '"pages" must be a number', - path: 'favoriteBook.pages', - }, - ]; - - expect(() => { - CircularUser.buildStrict({ - name: 'Circular user one', - friends: [], - favoriteBook: new CircularBook({ - name: 'Brave new world', - pages: 'twenty', - }), - }); - }) - .to.throw(Error, 'Invalid Attributes') - .with.property('details') - .that.deep.equals(errorDetails); - }); - }); - }); -}); - -describe('updating an instance', () => { - var User; - - beforeEach(() => { - User = attributes({ - name: String, - })(class User {}); - }); - - it('updates instance attribute value when assigned a new value', () => { - const user = new User({ - name: 'My name', - }); - - user.name = 'New name'; - - expect(user.name).to.equal('New name'); - }); - - it('reflects new value assigned to attribute on #attributes', () => { - const user = new User({ - name: 'My name', - }); - - user.name = 'New name'; - - expect(user.attributes.name).to.equal('New name'); - }); - - it('reflects new value assigned to #attributes on instance attribute', () => { - const user = new User({ - name: 'My name', - }); - - user.attributes = { - name: 'New name', - }; - - expect(user.name).to.equal('New name'); - }); - - it('does not throw if no attributes are passed when instantiating', () => { - expect(() => { - new User(); - }).to.not.throw(Error); - }); - - it('throws if value assigned to #attributes is not an object', () => { - const user = new User({ - name: 'My name', - }); - - expect(() => { - user.attributes = null; - }).to.throw(TypeError, /^#attributes can't be set to a non-object\.$/); - }); -}); - -describe('updating a structure with dynamic attribute types', () => { - var CircularUser; - var CircularBook; - - beforeEach(() => { - CircularUser = require('../fixtures/CircularUser'); - CircularBook = require('../fixtures/CircularBook'); - }); - - it('updates instance attribute when assigned a new value', () => { - const user = new CircularUser({ - favoriteBook: new CircularBook({ - name: 'Brave new world', - owner: new CircularUser(), - }), - }); - - user.favoriteBook = new CircularBook({ - name: '1984', - owner: user, - }); - - expect(user.favoriteBook).to.be.instanceOf(CircularBook); - expect(user.favoriteBook.owner).to.be.instanceOf(CircularUser); - expect(user.favoriteBook.owner).to.equal(user); - }); -}); - -describe('cloning an instance', () => { - let User; - let Book; - - beforeEach(() => { - Book = attributes({ - name: { - type: String, - required: true, - }, - })(class Book {}); - - User = attributes({ - name: { - type: String, - required: true, - }, - age: Number, - favoriteBook: Book, - })(class User {}); - }); - - context('when nothing is overwritten', () => { - context('when not passing overwrite object', () => { - it('makes a shallow clone', () => { - const user = new User({ - name: 'Me', - favoriteBook: { - name: 'The Silmarillion', - }, - }); - - const userClone = user.clone(); - - expect(userClone.name).to.equal('Me'); - expect(userClone.favoriteBook).to.equal(user.favoriteBook); - }); - }); - - context('when passing overwrite object', () => { - it('makes a shallow clone', () => { - const user = new User({ - name: 'Me', - favoriteBook: { - name: 'The Silmarillion', - }, - }); - - const userClone = user.clone({}); - - expect(userClone.name).to.equal('Me'); - expect(userClone.favoriteBook).to.equal(user.favoriteBook); - }); - }); - }); - - context('when overwritting attributes', () => { - context('when overwritting a primitive type attribute', () => { - it('overwrites it, leaving other attributes untouched', () => { - const user = new User({ - name: 'Me', - favoriteBook: { - name: 'The Silmarillion', - }, - }); - - const userClone = user.clone({ - name: 'Myself', - }); - - expect(userClone.name).to.equal('Myself'); - expect(userClone.favoriteBook).to.equal(user.favoriteBook); - }); - - context('when overwritten attribute needs coercion', () => { - it('coerces attribute', () => { - const user = new User({ - name: 'Me', - age: 42, - favoriteBook: { - name: 'The Silmarillion', - }, - }); - - const userClone = user.clone({ - age: '123', - }); - - expect(userClone.age).to.equal(123); - }); - }); - }); - - context('when overwritting a nested structure', () => { - context('when passing a new instance of the nested structure', () => { - it('overwrites it, leaving other attributes untouched', () => { - const user = new User({ - name: 'Me', - favoriteBook: { - name: 'The Silmarillion', - }, - }); - - const userClone = user.clone({ - favoriteBook: new Book({ name: 'The Lord of the Rings' }), - }); - - expect(userClone.name).to.equal('Me'); - expect(userClone.favoriteBook).not.to.equal(user.favoriteBook); - expect(userClone.favoriteBook.name).to.equal('The Lord of the Rings'); - }); - }); - - context('when passing the attributes of the nested structure', () => { - it('coerces attribute to a new nested structure, overwrites it, and leave other attributes untouched', () => { - const user = new User({ - name: 'Me', - favoriteBook: { - name: 'The Silmarillion', - }, - }); - - const userClone = user.clone({ - favoriteBook: { name: 'The Lord of the Rings' }, - }); - - expect(userClone.name).to.equal('Me'); - expect(userClone.favoriteBook).not.to.equal(user.favoriteBook); - expect(userClone.favoriteBook.name).to.equal('The Lord of the Rings'); - }); - }); - }); - }); - - context('strict mode', () => { - context('when overwritten attributes are valid', () => { - it('clones normally', () => { - const user = new User({ - name: 'Me', - favoriteBook: { - name: 'The Silmarillion', - }, - }); - - const userClone = user.clone({ name: 'Me' }, { strict: true }); - - expect(userClone.name).to.equal('Me'); - expect(userClone.favoriteBook).to.equal(user.favoriteBook); - }); - }); - - context('when overwritten attributes are invalid', () => { - context('when primitive attribute is invalid', () => { - it('throws an error', () => { - const user = new User({ - name: 'Me', - favoriteBook: { - name: 'The Silmarillion', - }, - }); - - let errorDetails = [ - { - message: '"name" is required', - path: 'name', - }, - ]; - - expect(() => { - user.clone({ name: null }, { strict: true }); - }) - .to.throw(Error, 'Invalid Attributes') - .with.property('details') - .that.deep.equals(errorDetails); - }); - }); - - context('when nested attribute is invalid', () => { - context('when passing a the attributes of the nested attribute', () => { - it('throws an error', () => { - const user = new User({ - name: 'Me', - favoriteBook: { - name: 'The Silmarillion', - }, - }); - - let errorDetails = [ - { - message: '"name" is required', - path: 'favoriteBook.name', - }, - ]; - - expect(() => { - user.clone({ favoriteBook: {} }, { strict: true }); - }) - .to.throw(Error, 'Invalid Attributes') - .with.property('details') - .that.deep.equals(errorDetails); - }); - }); - }); - }); - }); -}); diff --git a/test/unit/schema/normalization.spec.js b/test/unit/schema/normalization.spec.js deleted file mode 100644 index 383dccd..0000000 --- a/test/unit/schema/normalization.spec.js +++ /dev/null @@ -1,89 +0,0 @@ -const { expect } = require('chai'); -const { normalize } = require('../../../src/schema'); - -describe('schema normalization', () => { - context('when passed attribute is the type itself', () => { - it('normalizes to an object with the type field being equal to the passed type', () => { - const schema = { - name: String, - }; - - expect(normalize(schema).name.type).to.equal(String); - }); - }); - - context('when passed attribute is an object', () => { - context('when attribute object has the field type', () => { - it('normalizes to an object with the type field being equal to the passed type', () => { - const schema = { - name: { type: String }, - }; - - expect(normalize(schema).name.type).to.equal(String); - }); - }); - }); - - context('when it is not possible to normalize the attribute', () => { - context('when attribute type is not an object nor a constructor', () => { - it('throws an error', () => { - const schema = { name: true }; - - expect(() => { - normalize(schema); - }).to.throw( - TypeError, - /^Attribute type must be a constructor or the name of a dynamic type: name\.$/ - ); - }); - }); - - context( - 'when attribute descriptor is complete but #type is not a constructor', - () => { - it('throws an error', () => { - const schema = { - name: { - type: true, - }, - }; - - expect(() => { - normalize(schema); - }).to.throw( - TypeError, - /^Attribute type must be a constructor or the name of a dynamic type: name\.$/ - ); - }); - } - ); - }); - - context('when attribute has itemType', () => { - context('when itemType is an object with type attribute', () => { - it('does not change the itemType object', () => { - const schema = { - name: { - type: Array, - itemType: { type: String }, - }, - }; - - expect(normalize(schema).name.itemType.type).to.eql(String); - }); - }); - - context('when itemType is a constructor', () => { - it('normalizes itemType to an object with type field being equal to passed constructor', () => { - const schema = { - name: { - type: Array, - itemType: String, - }, - }; - - expect(normalize(schema).name.itemType.type).to.eql(String); - }); - }); - }); -}); diff --git a/test/unit/validation/nestedStructure.spec.js b/test/unit/validation/nestedStructure.spec.js deleted file mode 100644 index 315ddef..0000000 --- a/test/unit/validation/nestedStructure.spec.js +++ /dev/null @@ -1,338 +0,0 @@ -const { attributes } = require('../../../src'); -const { - assertValid, - assertInvalid, -} = require('../../support/validationMatchers'); - -describe('validation', () => { - describe('Nested with structure class', () => { - describe('no validation', () => { - var Location; - var User; - - beforeEach(() => { - Location = attributes({ - x: { - type: Number, - }, - y: { - type: Number, - }, - })(class Location {}); - - User = attributes({ - lastLocation: { - type: Location, - }, - })(class User {}); - }); - - context('when value is present', () => { - it('is valid', () => { - const user = new User({ - lastLocation: new Location(), - }); - - assertValid(user); - }); - }); - - context('when value is not present', () => { - it('is valid', () => { - const user = new User({ - lastLocation: undefined, - }); - - assertValid(user); - }); - }); - }); - - describe('required', () => { - var Location; - var User; - - beforeEach(() => { - Location = attributes({ - x: { type: Number }, - y: { type: Number }, - })(class Location {}); - }); - - context('when value is present', () => { - beforeEach(() => { - User = attributes({ - lastLocation: { - type: Location, - required: true, - }, - })(class User {}); - }); - - it('is valid', () => { - const user = new User({ - lastLocation: new Location(), - }); - - assertValid(user); - }); - }); - - context('when value is not present', () => { - beforeEach(() => { - User = attributes({ - lastLocation: { - type: Location, - required: true, - }, - })(class User {}); - }); - - it('is not valid and has errors set', () => { - const user = new User({ - lastLocation: undefined, - }); - - assertInvalid(user, 'lastLocation'); - }); - }); - - context('when value is null', () => { - context('and attribute is nullable', () => { - beforeEach(() => { - User = attributes({ - lastLocation: { - type: Location, - required: true, - nullable: true, - }, - })(class User {}); - }); - - it('is valid', () => { - const user = new User({ lastLocation: null }); - - assertValid(user); - }); - }); - - context('and attribute is not nullable', () => { - beforeEach(() => { - User = attributes({ - lastLocation: { - type: Location, - required: true, - nullable: false, - }, - })(class User {}); - }); - - it('is not valid and has errors set', () => { - const user = new User({ lastLocation: null }); - - assertInvalid(user, 'lastLocation'); - }); - }); - }); - }); - - describe('not required', () => { - var Location; - var User; - - beforeEach(() => { - Location = attributes({ - x: { - type: Number, - }, - y: { - type: Number, - }, - })(class Location {}); - - User = attributes({ - lastLocation: { - type: Location, - required: false, - }, - })(class User {}); - }); - - context('when value is not present', () => { - it('is valid', () => { - const user = new User(); - - assertValid(user); - }); - }); - }); - - describe('nested required', () => { - var Location; - var User; - - context('when nested value is present', () => { - beforeEach(() => { - Location = attributes({ - x: { type: Number, required: true }, - y: { type: Number, required: true }, - })(class Location {}); - - User = attributes({ - lastLocation: { type: Location, required: true }, - })(class User {}); - }); - - it('is valid', () => { - const user = new User({ - lastLocation: new Location({ x: 1, y: 2 }), - }); - - assertValid(user); - }); - }); - - context('when nested value is not present', () => { - beforeEach(() => { - Location = attributes({ - x: { type: Number, required: true }, - y: { type: Number, required: true }, - })(class Location {}); - - User = attributes({ - lastLocation: { type: Location, required: true }, - })(class User {}); - }); - - it('is not valid and has errors set', () => { - const user = new User({ - lastLocation: new Location({ x: 1, y: undefined }), - }); - - assertInvalid(user, 'lastLocation.y'); - }); - }); - - context('when nested value is null', () => { - context('and attribute is nullable', () => { - beforeEach(() => { - Location = attributes({ - x: { type: Number, required: true }, - y: { type: Number, required: true, nullable: true }, - })(class Location {}); - - User = attributes({ - lastLocation: { type: Location, required: true }, - })(class User {}); - }); - - it('is valid', () => { - const user = new User({ - lastLocation: new Location({ x: 1, y: null }), - }); - - assertValid(user); - }); - }); - - context('and attribute is not nullable', () => { - beforeEach(() => { - Location = attributes({ - x: { type: Number, required: true }, - y: { type: Number, required: true, nullable: false }, - })(class Location {}); - - User = attributes({ - lastLocation: { type: Location, required: true }, - })(class User {}); - }); - - it('is not valid and has errors set', () => { - const user = new User({ - lastLocation: new Location({ x: 1, y: null }), - }); - - assertInvalid(user, 'lastLocation.y'); - }); - }); - }); - }); - }); - - describe('Nested with structure class with dynamic attribute types', () => { - var CircularUser; - var CircularBook; - - beforeEach(() => { - CircularUser = require('../../fixtures/CircularUser'); - CircularBook = require('../../fixtures/CircularBook'); - }); - - describe('no validation', () => { - context('when value is present', () => { - it('is valid', () => { - const user = new CircularUser({ - friends: [], - favoriteBook: {}, - }); - - assertValid(user); - }); - }); - - context('when value is not present', () => { - it('is valid', () => { - const user = new CircularUser({ - favoriteBook: {}, - }); - - assertValid(user); - }); - }); - }); - - describe('required', () => { - context('when value is present', () => { - it('is valid', () => { - const user = new CircularUser({ - favoriteBook: {}, - }); - - assertValid(user); - }); - }); - - context('when value is not present', () => { - it('is invalid', () => { - const user = new CircularUser(); - - assertInvalid(user, 'favoriteBook'); - }); - }); - }); - - describe('nested required', () => { - context('when value is present', () => { - it('is valid', () => { - const book = new CircularBook({ - owner: { - favoriteBook: new CircularBook(), - }, - }); - - assertValid(book); - }); - }); - - context('when value is not present', () => { - it('is invalid', () => { - const book = new CircularBook({ - owner: new CircularUser(), - }); - - assertInvalid(book, 'owner.favoriteBook'); - }); - }); - }); - }); -}); diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 589b374..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,25 +0,0 @@ -const path = require('path'); - -module.exports = { - entry: [path.join(__dirname, 'src/index.js')], - output: { - filename: path.join(__dirname, 'dist/structure.js'), - library: 'Structure', - libraryTarget: 'umd', - umdNamedDefine: true - }, - externals: { - joi: 'joi', - lodash: { - root: '_', - commonjs: 'lodash', - commonjs2: 'lodash', - amd: 'lodash' - } - }, - module: { - loaders: [ - { test: /\.js$/, exclude: /node_modules/, loader: 'babel' } - ] - } -}; diff --git a/yarn.lock b/yarn.lock index 4cff476..551b379 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,1582 +2,4695 @@ # yarn lockfile v1 -"@sinonjs/commons@^1.0.2", "@sinonjs/commons@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.3.0.tgz#50a2754016b6f30a994ceda6d9a0a8c36adda849" - dependencies: - type-detect "4.0.8" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/compat-data@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.6.tgz#7eeaa0dfa17e50c7d9c0832515eee09b56f04e35" + integrity sha512-CurCIKPTkS25Mb8mz267vU95vy+TyUpnctEX2lV33xWNmHAfjruztgiPBbXZRh3xZZy1CYvGx6XfxyTVS+sk7Q== + dependencies: + browserslist "^4.8.5" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.6.4", "@babel/core@^7.7.5": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.7.tgz#b69017d221ccdeb203145ae9da269d72cf102f3b" + integrity sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.7" + "@babel/helpers" "^7.8.4" + "@babel/parser" "^7.8.7" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" -"@sinonjs/formatio@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.1.0.tgz#6ac9d1eb1821984d84c4996726e45d1646d8cce5" +"@babel/generator@^7.4.0", "@babel/generator@^7.8.6", "@babel/generator@^7.8.7": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.8.tgz#cdcd58caab730834cee9eeadb729e833b625da3e" + integrity sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg== dependencies: - "@sinonjs/samsam" "^2 || ^3" + "@babel/types" "^7.8.7" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" -"@sinonjs/samsam@^2 || ^3", "@sinonjs/samsam@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.1.1.tgz#8e2eceb2353f6626e2867352e3def951d3366240" +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-call-delegate@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz#28a279c2e6c622a6233da548127f980751324cab" + integrity sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.7" + +"@babel/helper-compilation-targets@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" + integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== + dependencies: + "@babel/compat-data" "^7.8.6" + browserslist "^4.9.1" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.8.3": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" + integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== + dependencies: + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" + integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-transforms@^7.8.3": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz#6a13b5eecadc35692047073a64e42977b97654a4" + integrity sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.8.6" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-wrap-function@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" + integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.4" + "@babel/types" "^7.8.3" + +"@babel/highlight@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" + integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== dependencies: - "@sinonjs/commons" "^1.0.2" - array-from "^2.1.1" - lodash "^4.17.11" - -"@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" -abbrev@1, abbrev@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" +"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.4.3", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.8.7": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.8.tgz#4c3b7ce36db37e0629be1f0d50a571d2f86f6cd4" + integrity sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA== -accepts@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== dependencies: - mime-types "~2.1.11" - negotiator "0.6.1" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" +"@babel/plugin-proposal-class-properties@^7.1.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" + integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== dependencies: - acorn "^3.0.4" - -acorn@^3.0.0, acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.5.0: - version "5.5.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -after@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - -ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -ansi-escapes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" + integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== dependencies: - color-convert "^1.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" -anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== dependencies: - arrify "^1.0.0" - micromatch "^2.1.5" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -aproba@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" +"@babel/plugin-proposal-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" + integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" -are-we-there-yet@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" +"@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== dependencies: - delegates "^1.0.0" - readable-stream "^2.0.0 || ^1.1.13" + "@babel/helper-create-regexp-features-plugin" "^7.8.8" + "@babel/helper-plugin-utils" "^7.8.3" -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: - sprintf-js "~1.0.2" + "@babel/helper-plugin-utils" "^7.8.0" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" +"@babel/plugin-syntax-bigint@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: - arr-flatten "^1.0.1" + "@babel/helper-plugin-utils" "^7.8.0" -arr-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -array-from@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" +"@babel/plugin-syntax-flow@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" + integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: - array-uniq "^1.0.1" + "@babel/helper-plugin-utils" "^7.8.0" -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -arraybuffer.slice@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" +"@babel/plugin-syntax-typescript@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" + integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" -assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== dependencies: - util "0.10.3" + "@babel/helper-plugin-utils" "^7.8.3" -assertion-error@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +"@babel/plugin-transform-classes@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz#77534447a477cbe5995ae4aee3e39fbc8090c46d" + integrity sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" -async@1.x, async@^1.3.0, async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" -async@^0.9.0, async@~0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" +"@babel/plugin-transform-destructuring@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" + integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" +"@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" + integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -aws4@^1.2.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" +"@babel/plugin-transform-flow-strip-types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz#da705a655466b2a9b36046b57bf0cbcd53551bd4" + integrity sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-flow" "^7.8.3" -babel-code-frame@^6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.20.0.tgz#b968f839090f9a8bc6d41938fb96cb84f7387b26" +"@babel/plugin-transform-for-of@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz#a051bd1b402c61af97a27ff51b468321c7c2a085" + integrity sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw== dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^2.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -babel-code-frame@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.18.0, babel-core@^6.18.2: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.21.0.tgz#75525480c21c803f826ef3867d22c19f080a3724" - dependencies: - babel-code-frame "^6.20.0" - babel-generator "^6.21.0" - babel-helpers "^6.16.0" - babel-messages "^6.8.0" - babel-register "^6.18.0" - babel-runtime "^6.20.0" - babel-template "^6.16.0" - babel-traverse "^6.21.0" - babel-types "^6.21.0" - babylon "^6.11.0" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.5.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-is-absolute "^1.0.0" - private "^0.1.6" - slash "^1.0.0" - source-map "^0.5.0" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -babel-generator@^6.21.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.21.0.tgz#605f1269c489a1c75deeca7ea16d43d4656c8494" +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== dependencies: - babel-messages "^6.8.0" - babel-runtime "^6.20.0" - babel-types "^6.21.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" + "@babel/helper-plugin-utils" "^7.8.3" -babel-helper-call-delegate@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + "@babel/helper-plugin-utils" "^7.8.3" -babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" +"@babel/plugin-transform-modules-amd@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" + integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== dependencies: - babel-helper-function-name "^6.18.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" -babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" +"@babel/plugin-transform-modules-commonjs@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" + integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== dependencies: - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" -babel-helper-get-function-arity@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" +"@babel/plugin-transform-modules-systemjs@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" + integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" -babel-helper-hoist-variables@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" +"@babel/plugin-transform-modules-umd@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" + integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -babel-helper-optimise-call-expression@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + "@babel/helper-create-regexp-features-plugin" "^7.8.3" -babel-helper-regex@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== dependencies: - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" + "@babel/helper-plugin-utils" "^7.8.3" -babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.8.7": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.8.tgz#0381de466c85d5404565243660c4496459525daf" + integrity sha512-hC4Ld/Ulpf1psQciWWwdnUspQoQco2bMzSrwU6TmzRlvoYQe4rQFy9vnCZDTlVeCQj0JPfL+1RX0V8hCJvkgBA== + dependencies: + "@babel/helper-call-delegate" "^7.8.7" + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" + integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typescript@^7.8.3": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.7.tgz#48bccff331108a7b3a28c3a4adc89e036dc3efda" + integrity sha512-7O0UsPQVNKqpHeHLpfvOG4uXmlw+MOxYvUv6Otc9uH5SYMIxvF6eBdjkWvC3f9G+VXe0RsNExyAQBeTRug/wqQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-typescript" "^7.8.3" + +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.6.3": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.7.tgz#1fc7d89c7f75d2d70c2b6768de6c2e049b3cb9db" + integrity sha512-BYftCVOdAYJk5ASsznKAUl53EMhfBbr8CJ1X+AJLfGPscQkwJFiaV/Wn9DPH/7fzm2v6iRYJKYHSqyynTGw0nw== + dependencies: + "@babel/compat-data" "^7.8.6" + "@babel/helper-compilation-targets" "^7.8.7" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.8.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.8.6" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.8.6" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.8.3" + "@babel/plugin-transform-modules-commonjs" "^7.8.3" + "@babel/plugin-transform-modules-systemjs" "^7.8.3" + "@babel/plugin-transform-modules-umd" "^7.8.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.8.7" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/types" "^7.8.7" + browserslist "^4.8.5" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-flow@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.8.3.tgz#52af74c6a4e80d889bd9436e8e278d0fecac6e18" + integrity sha512-iCXFk+T4demnq+dNLLvlGOgvYF6sPZ/hS1EmswugOqh1Ysp2vuiqJzpgsnp5rW8+6dLJT/0CXDzye28ZH6BAfQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-flow-strip-types" "^7.8.3" + +"@babel/preset-typescript@^7.1.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz#90af8690121beecd9a75d0cc26c6be39d1595d13" + integrity sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-typescript" "^7.8.3" + +"@babel/register@^7.0.0": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.8.6.tgz#a1066aa6168a73a70c35ef28cc5865ccc087ea69" + integrity sha512-7IDO93fuRsbyml7bAafBQb3RcBGlCpU4hh5wADA2LJEEcYk92WkwFZ0pHyIi2fb5Auoz1714abETdZKCOxN0CQ== + dependencies: + find-cache-dir "^2.0.0" + lodash "^4.17.13" + make-dir "^2.1.0" + pirates "^4.0.0" + source-map-support "^0.5.16" + +"@babel/runtime@^7.8.4": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.7.tgz#8fefce9802db54881ba59f90bb28719b4996324d" + integrity sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.4.0", "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4", "@babel/traverse@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.6.tgz#acfe0c64e1cd991b3e32eae813a6eb564954b5ff" + integrity sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.6" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.7.tgz#1fc9729e1acbb2337d5b6977a63979b4819f5d1d" + integrity sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw== dependencies: - babel-helper-optimise-call-expression "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -babel-helpers@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== dependencies: - babel-runtime "^6.0.0" - babel-template "^6.16.0" + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@electron/get@^1.0.1": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.9.0.tgz#7fa6e61d7ff50fb82a8a41f437af7de3b97aa9a5" + integrity sha512-OBIKtF6ttIJotDXe4KJMUyTBO4xMii+mFjlA8R4CORuD4HvCUaCK3lPjhdTRCvuEv6gzWNbAvd9DNBv0v780lw== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + sanitize-filename "^1.6.2" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^2.0.2" + global-tunnel-ng "^2.7.1" -babel-loader@^6.2.8: - version "6.2.10" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.2.10.tgz#adefc2b242320cd5d15e65b31cea0e8b1b02d4b0" +"@evocateur/libnpmaccess@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845" + integrity sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg== dependencies: - find-cache-dir "^0.1.1" - loader-utils "^0.2.11" + "@evocateur/npm-registry-fetch" "^4.0.0" + aproba "^2.0.0" + figgy-pudding "^3.5.1" + get-stream "^4.0.0" + npm-package-arg "^6.1.0" + +"@evocateur/libnpmpublish@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz#55df09d2dca136afba9c88c759ca272198db9f1a" + integrity sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg== + dependencies: + "@evocateur/npm-registry-fetch" "^4.0.0" + aproba "^2.0.0" + figgy-pudding "^3.5.1" + get-stream "^4.0.0" + lodash.clonedeep "^4.5.0" + normalize-package-data "^2.4.0" + npm-package-arg "^6.1.0" + semver "^5.5.1" + ssri "^6.0.1" + +"@evocateur/npm-registry-fetch@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz#8c4c38766d8d32d3200fcb0a83f064b57365ed66" + integrity sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g== + dependencies: + JSONStream "^1.3.4" + bluebird "^3.5.1" + figgy-pudding "^3.4.1" + lru-cache "^5.1.1" + make-fetch-happen "^5.0.0" + npm-package-arg "^6.1.0" + safe-buffer "^5.1.2" + +"@evocateur/pacote@^9.6.3": + version "9.6.5" + resolved "https://registry.yarnpkg.com/@evocateur/pacote/-/pacote-9.6.5.tgz#33de32ba210b6f17c20ebab4d497efc6755f4ae5" + integrity sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w== + dependencies: + "@evocateur/npm-registry-fetch" "^4.0.0" + bluebird "^3.5.3" + cacache "^12.0.3" + chownr "^1.1.2" + figgy-pudding "^3.5.1" + get-stream "^4.1.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + make-fetch-happen "^5.0.0" + minimatch "^3.0.4" + minipass "^2.3.5" + mississippi "^3.0.0" mkdirp "^0.5.1" - object-assign "^4.0.1" + normalize-package-data "^2.5.0" + npm-package-arg "^6.1.0" + npm-packlist "^1.4.4" + npm-pick-manifest "^3.0.0" + osenv "^0.1.5" + promise-inflight "^1.0.1" + promise-retry "^1.1.1" + protoduck "^5.0.1" + rimraf "^2.6.3" + safe-buffer "^5.2.0" + semver "^5.7.0" + ssri "^6.0.1" + tar "^4.4.10" + unique-filename "^1.1.1" + which "^1.3.1" + +"@hapi/address@^2.1.2": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/formula@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-1.2.0.tgz#994649c7fea1a90b91a0a1e6d983523f680e10cd" + integrity sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA== + +"@hapi/hoek@^8.2.4", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + +"@hapi/joi@^16.1.8": + version "16.1.8" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-16.1.8.tgz#84c1f126269489871ad4e2decc786e0adef06839" + integrity sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg== + dependencies: + "@hapi/address" "^2.1.2" + "@hapi/formula" "^1.2.0" + "@hapi/hoek" "^8.2.4" + "@hapi/pinpoint" "^1.0.2" + "@hapi/topo" "^3.1.3" + +"@hapi/pinpoint@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-1.0.2.tgz#025b7a36dbbf4d35bf1acd071c26b20ef41e0d13" + integrity sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ== -babel-messages@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" +"@hapi/topo@^3.1.3": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== dependencies: - babel-runtime "^6.0.0" + "@hapi/hoek" "^8.3.0" -babel-plugin-check-es2015-constants@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" + integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg== dependencies: - babel-runtime "^6.0.0" + camelcase "^5.3.1" + find-up "^4.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" -babel-plugin-transform-es2015-arrow-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" - dependencies: - babel-runtime "^6.0.0" +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-block-scoping@^6.18.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.21.0.tgz#e840687f922e70fb2c42bb13501838c174a115ed" - dependencies: - babel-runtime "^6.20.0" - babel-template "^6.15.0" - babel-traverse "^6.21.0" - babel-types "^6.21.0" - lodash "^4.2.0" - -babel-plugin-transform-es2015-classes@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" - dependencies: - babel-helper-define-map "^6.18.0" - babel-helper-function-name "^6.18.0" - babel-helper-optimise-call-expression "^6.18.0" - babel-helper-replace-supers "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-template "^6.14.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-computed-properties@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" +"@jest-runner/core@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@jest-runner/core/-/core-2.0.0.tgz#444d0351d0872c0981ee4e87252ccb408cf27543" + integrity sha512-EEc+W5t1hj0uNga8aoEkrBhLnrXS7JBxTabkTz+29VrUxBjCfgKSas+lLaqS+bnqIknRHoKrhZ3N6PIXungDdw== dependencies: - babel-helper-define-map "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" + jest-message-util "^24.0.0" + node-ipc "^9.1.1" -babel-plugin-transform-es2015-destructuring@^6.18.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" +"@jest-runner/electron@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@jest-runner/electron/-/electron-2.0.3.tgz#2bb62f9a43ca3e9efd1af1bb781c69eecf413346" + integrity sha512-DKGwxriQsYGIqNWRIMdS0vm/pGH/kLk2tpZ+UdF+jtHSPfVayzrMocM3apdJodnKKYdFAW+0N9/cbBJseLgI1Q== + dependencies: + "@jest-runner/core" "^2.0.0" + "@jest-runner/rpc" "^2.0.0" + jest-haste-map "^24.0.0" + jest-mock "^24.0.0" + jest-runner "^24.0.0" + jest-runtime "^24.0.0" + jest-util "^24.0.0" + throat "^4.1.0" + +"@jest-runner/rpc@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@jest-runner/rpc/-/rpc-2.0.0.tgz#aebbd8a1fae96b37acfb28da8ce9b1ab9a90dfc0" + integrity sha512-EP1ljCKb0Z3hWlDgFv5MW0PTogs5MOh8EFb5lsS/UP72R6fM4cYlE3GT3xYaGjZS8vawCgSqF475TRK8noDAFA== + dependencies: + "@jest-runner/core" "^2.0.0" + glob "^7.1.3" + jscodeshift "^0.6.3" + node-ipc "^9.1.1" + prettier "^1.14.2" + uuid "^3.3.2" + yargs "^12.0.1" + +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/console@^25.1.0": + version "25.1.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.1.0.tgz#1fc765d44a1e11aec5029c08e798246bd37075ab" + integrity sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA== + dependencies: + "@jest/source-map" "^25.1.0" + chalk "^3.0.0" + jest-util "^25.1.0" + slash "^3.0.0" + +"@jest/core@^25.1.0": + version "25.1.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.1.0.tgz#3d4634fc3348bb2d7532915d67781cdac0869e47" + integrity sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig== + dependencies: + "@jest/console" "^25.1.0" + "@jest/reporters" "^25.1.0" + "@jest/test-result" "^25.1.0" + "@jest/transform" "^25.1.0" + "@jest/types" "^25.1.0" + ansi-escapes "^4.2.1" + chalk "^3.0.0" + exit "^0.1.2" + graceful-fs "^4.2.3" + jest-changed-files "^25.1.0" + jest-config "^25.1.0" + jest-haste-map "^25.1.0" + jest-message-util "^25.1.0" + jest-regex-util "^25.1.0" + jest-resolve "^25.1.0" + jest-resolve-dependencies "^25.1.0" + jest-runner "^25.1.0" + jest-runtime "^25.1.0" + jest-snapshot "^25.1.0" + jest-util "^25.1.0" + jest-validate "^25.1.0" + jest-watcher "^25.1.0" + micromatch "^4.0.2" + p-each-series "^2.1.0" + realpath-native "^1.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/environment@^25.1.0": + version "25.1.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.1.0.tgz#4a97f64770c9d075f5d2b662b5169207f0a3f787" + integrity sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg== + dependencies: + "@jest/fake-timers" "^25.1.0" + "@jest/types" "^25.1.0" + jest-mock "^25.1.0" + +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^25.1.0": + version "25.1.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.1.0.tgz#a1e0eff51ffdbb13ee81f35b52e0c1c11a350ce8" + integrity sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ== + dependencies: + "@jest/types" "^25.1.0" + jest-message-util "^25.1.0" + jest-mock "^25.1.0" + jest-util "^25.1.0" + lolex "^5.0.0" + +"@jest/reporters@^25.1.0": + version "25.1.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.1.0.tgz#9178ecf136c48f125674ac328f82ddea46e482b0" + integrity sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^25.1.0" + "@jest/environment" "^25.1.0" + "@jest/test-result" "^25.1.0" + "@jest/transform" "^25.1.0" + "@jest/types" "^25.1.0" + chalk "^3.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.0" + jest-haste-map "^25.1.0" + jest-resolve "^25.1.0" + jest-runtime "^25.1.0" + jest-util "^25.1.0" + jest-worker "^25.1.0" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^3.1.0" + terminal-link "^2.0.0" + v8-to-istanbul "^4.0.1" + optionalDependencies: + node-notifier "^6.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/source-map@^25.1.0": + version "25.1.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.1.0.tgz#b012e6c469ccdbc379413f5c1b1ffb7ba7034fb0" + integrity sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.3" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-result@^25.1.0": + version "25.1.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.1.0.tgz#847af2972c1df9822a8200457e64be4ff62821f7" + integrity sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg== + dependencies: + "@jest/console" "^25.1.0" + "@jest/transform" "^25.1.0" + "@jest/types" "^25.1.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/test-sequencer@^25.1.0": + version "25.1.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz#4df47208542f0065f356fcdb80026e3c042851ab" + integrity sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw== + dependencies: + "@jest/test-result" "^25.1.0" + jest-haste-map "^25.1.0" + jest-runner "^25.1.0" + jest-runtime "^25.1.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/transform@^25.1.0": + version "25.1.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.1.0.tgz#221f354f512b4628d88ce776d5b9e601028ea9da" + integrity sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^25.1.0" + babel-plugin-istanbul "^6.0.0" + chalk "^3.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.3" + jest-haste-map "^25.1.0" + jest-regex-util "^25.1.0" + jest-util "^25.1.0" + micromatch "^4.0.2" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@jest/types@^25.1.0": + version "25.1.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.1.0.tgz#b26831916f0d7c381e11dbb5e103a72aed1b4395" + integrity sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + +"@lerna/add@3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.20.0.tgz#bea7edf36fc93fb72ec34cb9ba854c48d4abf309" + integrity sha512-AnH1oRIEEg/VDa3SjYq4x1/UglEAvrZuV0WssHUMN81RTZgQk3we+Mv3qZNddrZ/fBcZu2IAdN/EQ3+ie2JxKQ== + dependencies: + "@evocateur/pacote" "^9.6.3" + "@lerna/bootstrap" "3.20.0" + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.20.0" + "@lerna/npm-conf" "3.16.0" + "@lerna/validation-error" "3.13.0" + dedent "^0.7.0" + npm-package-arg "^6.1.0" + p-map "^2.1.0" + semver "^6.2.0" + +"@lerna/bootstrap@3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.20.0.tgz#635d71046830f208e851ab429a63da1747589e37" + integrity sha512-Wylullx3uthKE7r4izo09qeRGL20Y5yONlQEjPCfnbxCC2Elu+QcPu4RC6kqKQ7b+g7pdC3OOgcHZjngrwr5XQ== + dependencies: + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.20.0" + "@lerna/has-npm-version" "3.16.5" + "@lerna/npm-install" "3.16.5" + "@lerna/package-graph" "3.18.5" + "@lerna/pulse-till-done" "3.13.0" + "@lerna/rimraf-dir" "3.16.5" + "@lerna/run-lifecycle" "3.16.2" + "@lerna/run-topologically" "3.18.5" + "@lerna/symlink-binary" "3.17.0" + "@lerna/symlink-dependencies" "3.17.0" + "@lerna/validation-error" "3.13.0" + dedent "^0.7.0" + get-port "^4.2.0" + multimatch "^3.0.0" + npm-package-arg "^6.1.0" + npmlog "^4.1.2" + p-finally "^1.0.0" + p-map "^2.1.0" + p-map-series "^1.0.0" + p-waterfall "^1.0.0" + read-package-tree "^5.1.6" + semver "^6.2.0" + +"@lerna/changed@3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.20.0.tgz#66b97ebd6c8f8d207152ee524a0791846a9097ae" + integrity sha512-+hzMFSldbRPulZ0vbKk6RD9f36gaH3Osjx34wrrZ62VB4pKmjyuS/rxVYkCA3viPLHoiIw2F8zHM5BdYoDSbjw== + dependencies: + "@lerna/collect-updates" "3.20.0" + "@lerna/command" "3.18.5" + "@lerna/listable" "3.18.5" + "@lerna/output" "3.13.0" + +"@lerna/check-working-tree@3.16.5": + version "3.16.5" + resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz#b4f8ae61bb4523561dfb9f8f8d874dd46bb44baa" + integrity sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ== + dependencies: + "@lerna/collect-uncommitted" "3.16.5" + "@lerna/describe-ref" "3.16.5" + "@lerna/validation-error" "3.13.0" + +"@lerna/child-process@3.16.5": + version "3.16.5" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-3.16.5.tgz#38fa3c18064aa4ac0754ad80114776a7b36a69b2" + integrity sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg== + dependencies: + chalk "^2.3.1" + execa "^1.0.0" + strong-log-transformer "^2.0.0" + +"@lerna/clean@3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.20.0.tgz#ba777e373ddeae63e57860df75d47a9e5264c5b2" + integrity sha512-9ZdYrrjQvR5wNXmHfDsfjWjp0foOkCwKe3hrckTzkAeQA1ibyz5llGwz5e1AeFrV12e2/OLajVqYfe+qdkZUgg== + dependencies: + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.20.0" + "@lerna/prompt" "3.18.5" + "@lerna/pulse-till-done" "3.13.0" + "@lerna/rimraf-dir" "3.16.5" + p-map "^2.1.0" + p-map-series "^1.0.0" + p-waterfall "^1.0.0" + +"@lerna/cli@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-3.18.5.tgz#c90c461542fcd35b6d5b015a290fb0dbfb41d242" + integrity sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA== + dependencies: + "@lerna/global-options" "3.13.0" + dedent "^0.7.0" + npmlog "^4.1.2" + yargs "^14.2.2" + +"@lerna/collect-uncommitted@3.16.5": + version "3.16.5" + resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz#a494d61aac31cdc7aec4bbe52c96550274132e63" + integrity sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg== + dependencies: + "@lerna/child-process" "3.16.5" + chalk "^2.3.1" + figgy-pudding "^3.5.1" + npmlog "^4.1.2" + +"@lerna/collect-updates@3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-3.20.0.tgz#62f9d76ba21a25b7d9fbf31c02de88744a564bd1" + integrity sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q== + dependencies: + "@lerna/child-process" "3.16.5" + "@lerna/describe-ref" "3.16.5" + minimatch "^3.0.4" + npmlog "^4.1.2" + slash "^2.0.0" + +"@lerna/command@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.18.5.tgz#14c6d2454adbfd365f8027201523e6c289cd3cd9" + integrity sha512-36EnqR59yaTU4HrR1C9XDFti2jRx0BgpIUBeWn129LZZB8kAB3ov1/dJNa1KcNRKp91DncoKHLY99FZ6zTNpMQ== + dependencies: + "@lerna/child-process" "3.16.5" + "@lerna/package-graph" "3.18.5" + "@lerna/project" "3.18.0" + "@lerna/validation-error" "3.13.0" + "@lerna/write-log-file" "3.13.0" + clone-deep "^4.0.1" + dedent "^0.7.0" + execa "^1.0.0" + is-ci "^2.0.0" + npmlog "^4.1.2" + +"@lerna/conventional-commits@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.18.5.tgz#08efd2e5b45acfaf3f151a53a3ec7ecade58a7bc" + integrity sha512-qcvXIEJ3qSgalxXnQ7Yxp5H9Ta5TVyai6vEor6AAEHc20WiO7UIdbLDCxBtiiHMdGdpH85dTYlsoYUwsCJu3HQ== + dependencies: + "@lerna/validation-error" "3.13.0" + conventional-changelog-angular "^5.0.3" + conventional-changelog-core "^3.1.6" + conventional-recommended-bump "^5.0.0" + fs-extra "^8.1.0" + get-stream "^4.0.0" + lodash.template "^4.5.0" + npm-package-arg "^6.1.0" + npmlog "^4.1.2" + pify "^4.0.1" + semver "^6.2.0" + +"@lerna/create-symlink@3.16.2": + version "3.16.2" + resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-3.16.2.tgz#412cb8e59a72f5a7d9463e4e4721ad2070149967" + integrity sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw== + dependencies: + "@zkochan/cmd-shim" "^3.1.0" + fs-extra "^8.1.0" + npmlog "^4.1.2" + +"@lerna/create@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.18.5.tgz#11ac539f069248eaf7bc4c42e237784330f4fc47" + integrity sha512-cHpjocbpKmLopCuZFI7cKEM3E/QY8y+yC7VtZ4FQRSaLU8D8i2xXtXmYaP1GOlVNavji0iwoXjuNpnRMInIr2g== + dependencies: + "@evocateur/pacote" "^9.6.3" + "@lerna/child-process" "3.16.5" + "@lerna/command" "3.18.5" + "@lerna/npm-conf" "3.16.0" + "@lerna/validation-error" "3.13.0" + camelcase "^5.0.0" + dedent "^0.7.0" + fs-extra "^8.1.0" + globby "^9.2.0" + init-package-json "^1.10.3" + npm-package-arg "^6.1.0" + p-reduce "^1.0.0" + pify "^4.0.1" + semver "^6.2.0" + slash "^2.0.0" + validate-npm-package-license "^3.0.3" + validate-npm-package-name "^3.0.0" + whatwg-url "^7.0.0" + +"@lerna/describe-ref@3.16.5": + version "3.16.5" + resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-3.16.5.tgz#a338c25aaed837d3dc70b8a72c447c5c66346ac0" + integrity sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw== + dependencies: + "@lerna/child-process" "3.16.5" + npmlog "^4.1.2" + +"@lerna/diff@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.18.5.tgz#e9e2cb882f84d5b84f0487c612137305f07accbc" + integrity sha512-u90lGs+B8DRA9Z/2xX4YaS3h9X6GbypmGV6ITzx9+1Ga12UWGTVlKaCXBgONMBjzJDzAQOK8qPTwLA57SeBLgA== + dependencies: + "@lerna/child-process" "3.16.5" + "@lerna/command" "3.18.5" + "@lerna/validation-error" "3.13.0" + npmlog "^4.1.2" + +"@lerna/exec@3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.20.0.tgz#29f0c01aee2340eb46f90706731fef2062a49639" + integrity sha512-pS1mmC7kzV668rHLWuv31ClngqeXjeHC8kJuM+W2D6IpUVMGQHLcCTYLudFgQsuKGVpl0DGNYG+sjLhAPiiu6A== + dependencies: + "@lerna/child-process" "3.16.5" + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.20.0" + "@lerna/profiler" "3.20.0" + "@lerna/run-topologically" "3.18.5" + "@lerna/validation-error" "3.13.0" + p-map "^2.1.0" + +"@lerna/filter-options@3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-3.20.0.tgz#0f0f5d5a4783856eece4204708cc902cbc8af59b" + integrity sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g== + dependencies: + "@lerna/collect-updates" "3.20.0" + "@lerna/filter-packages" "3.18.0" + dedent "^0.7.0" + figgy-pudding "^3.5.1" + npmlog "^4.1.2" + +"@lerna/filter-packages@3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-3.18.0.tgz#6a7a376d285208db03a82958cfb8172e179b4e70" + integrity sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ== + dependencies: + "@lerna/validation-error" "3.13.0" + multimatch "^3.0.0" + npmlog "^4.1.2" + +"@lerna/get-npm-exec-opts@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz#d1b552cb0088199fc3e7e126f914e39a08df9ea5" + integrity sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw== + dependencies: + npmlog "^4.1.2" + +"@lerna/get-packed@3.16.0": + version "3.16.0" + resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-3.16.0.tgz#1b316b706dcee86c7baa55e50b087959447852ff" + integrity sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw== + dependencies: + fs-extra "^8.1.0" + ssri "^6.0.1" + tar "^4.4.8" + +"@lerna/github-client@3.16.5": + version "3.16.5" + resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-3.16.5.tgz#2eb0235c3bf7a7e5d92d73e09b3761ab21f35c2e" + integrity sha512-rHQdn8Dv/CJrO3VouOP66zAcJzrHsm+wFuZ4uGAai2At2NkgKH+tpNhQy2H1PSC0Ezj9LxvdaHYrUzULqVK5Hw== + dependencies: + "@lerna/child-process" "3.16.5" + "@octokit/plugin-enterprise-rest" "^3.6.1" + "@octokit/rest" "^16.28.4" + git-url-parse "^11.1.2" + npmlog "^4.1.2" + +"@lerna/gitlab-client@3.15.0": + version "3.15.0" + resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz#91f4ec8c697b5ac57f7f25bd50fe659d24aa96a6" + integrity sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q== + dependencies: + node-fetch "^2.5.0" + npmlog "^4.1.2" + whatwg-url "^7.0.0" + +"@lerna/global-options@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-3.13.0.tgz#217662290db06ad9cf2c49d8e3100ee28eaebae1" + integrity sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ== + +"@lerna/has-npm-version@3.16.5": + version "3.16.5" + resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz#ab83956f211d8923ea6afe9b979b38cc73b15326" + integrity sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q== + dependencies: + "@lerna/child-process" "3.16.5" + semver "^6.2.0" + +"@lerna/import@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.18.5.tgz#a9c7d8601870729851293c10abd18b3707f7ba5e" + integrity sha512-PH0WVLEgp+ORyNKbGGwUcrueW89K3Iuk/DDCz8mFyG2IG09l/jOF0vzckEyGyz6PO5CMcz4TI1al/qnp3FrahQ== + dependencies: + "@lerna/child-process" "3.16.5" + "@lerna/command" "3.18.5" + "@lerna/prompt" "3.18.5" + "@lerna/pulse-till-done" "3.13.0" + "@lerna/validation-error" "3.13.0" + dedent "^0.7.0" + fs-extra "^8.1.0" + p-map-series "^1.0.0" + +"@lerna/info@3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@lerna/info/-/info-3.20.0.tgz#3a5212f3029f2bc6255f9533bdf4bcb120ef329a" + integrity sha512-Rsz+KQF9mczbGUbPTrtOed1N0C+cA08Qz0eX/oI+NNjvsryZIju/o7uedG4I3P55MBiAioNrJI88fHH3eTgYug== + dependencies: + "@lerna/command" "3.18.5" + "@lerna/output" "3.13.0" + envinfo "^7.3.1" + +"@lerna/init@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.18.5.tgz#86dd0b2b3290755a96975069b5cb007f775df9f5" + integrity sha512-oCwipWrha98EcJAHm8AGd2YFFLNI7AW9AWi0/LbClj1+XY9ah+uifXIgYGfTk63LbgophDd8936ZEpHMxBsbAg== + dependencies: + "@lerna/child-process" "3.16.5" + "@lerna/command" "3.18.5" + fs-extra "^8.1.0" + p-map "^2.1.0" + write-json-file "^3.2.0" + +"@lerna/link@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.18.5.tgz#f24347e4f0b71d54575bd37cfa1794bc8ee91b18" + integrity sha512-xTN3vktJpkT7Nqc3QkZRtHO4bT5NvuLMtKNIBDkks0HpGxC9PRyyqwOoCoh1yOGbrWIuDezhfMg3Qow+6I69IQ== + dependencies: + "@lerna/command" "3.18.5" + "@lerna/package-graph" "3.18.5" + "@lerna/symlink-dependencies" "3.17.0" + p-map "^2.1.0" + slash "^2.0.0" + +"@lerna/list@3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.20.0.tgz#7e67cc29c5cf661cfd097e8a7c2d3dcce7a81029" + integrity sha512-fXTicPrfioVnRzknyPawmYIVkzDRBaQqk9spejS1S3O1DOidkihK0xxNkr8HCVC0L22w6f92g83qWDp2BYRUbg== + dependencies: + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.20.0" + "@lerna/listable" "3.18.5" + "@lerna/output" "3.13.0" + +"@lerna/listable@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-3.18.5.tgz#e82798405b5ed8fc51843c8ef1e7a0e497388a1a" + integrity sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg== + dependencies: + "@lerna/query-graph" "3.18.5" + chalk "^2.3.1" + columnify "^1.5.4" + +"@lerna/log-packed@3.16.0": + version "3.16.0" + resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-3.16.0.tgz#f83991041ee77b2495634e14470b42259fd2bc16" + integrity sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ== + dependencies: + byte-size "^5.0.1" + columnify "^1.5.4" + has-unicode "^2.0.1" + npmlog "^4.1.2" + +"@lerna/npm-conf@3.16.0": + version "3.16.0" + resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-3.16.0.tgz#1c10a89ae2f6c2ee96962557738685300d376827" + integrity sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA== + dependencies: + config-chain "^1.1.11" + pify "^4.0.1" + +"@lerna/npm-dist-tag@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz#9ef9abb7c104077b31f6fab22cc73b314d54ac55" + integrity sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ== + dependencies: + "@evocateur/npm-registry-fetch" "^4.0.0" + "@lerna/otplease" "3.18.5" + figgy-pudding "^3.5.1" + npm-package-arg "^6.1.0" + npmlog "^4.1.2" + +"@lerna/npm-install@3.16.5": + version "3.16.5" + resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-3.16.5.tgz#d6bfdc16f81285da66515ae47924d6e278d637d3" + integrity sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg== + dependencies: + "@lerna/child-process" "3.16.5" + "@lerna/get-npm-exec-opts" "3.13.0" + fs-extra "^8.1.0" + npm-package-arg "^6.1.0" + npmlog "^4.1.2" + signal-exit "^3.0.2" + write-pkg "^3.1.0" + +"@lerna/npm-publish@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.18.5.tgz#240e4039959fd9816b49c5b07421e11b5cb000af" + integrity sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg== + dependencies: + "@evocateur/libnpmpublish" "^1.2.2" + "@lerna/otplease" "3.18.5" + "@lerna/run-lifecycle" "3.16.2" + figgy-pudding "^3.5.1" + fs-extra "^8.1.0" + npm-package-arg "^6.1.0" + npmlog "^4.1.2" + pify "^4.0.1" + read-package-json "^2.0.13" + +"@lerna/npm-run-script@3.16.5": + version "3.16.5" + resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz#9c2ec82453a26c0b46edc0bb7c15816c821f5c15" + integrity sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ== + dependencies: + "@lerna/child-process" "3.16.5" + "@lerna/get-npm-exec-opts" "3.13.0" + npmlog "^4.1.2" + +"@lerna/otplease@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-3.18.5.tgz#b77b8e760b40abad9f7658d988f3ea77d4fd0231" + integrity sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog== + dependencies: + "@lerna/prompt" "3.18.5" + figgy-pudding "^3.5.1" + +"@lerna/output@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@lerna/output/-/output-3.13.0.tgz#3ded7cc908b27a9872228a630d950aedae7a4989" + integrity sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg== + dependencies: + npmlog "^4.1.2" + +"@lerna/pack-directory@3.16.4": + version "3.16.4" + resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-3.16.4.tgz#3eae5f91bdf5acfe0384510ed53faddc4c074693" + integrity sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng== + dependencies: + "@lerna/get-packed" "3.16.0" + "@lerna/package" "3.16.0" + "@lerna/run-lifecycle" "3.16.2" + figgy-pudding "^3.5.1" + npm-packlist "^1.4.4" + npmlog "^4.1.2" + tar "^4.4.10" + temp-write "^3.4.0" + +"@lerna/package-graph@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-3.18.5.tgz#c740e2ea3578d059e551633e950690831b941f6b" + integrity sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA== + dependencies: + "@lerna/prerelease-id-from-version" "3.16.0" + "@lerna/validation-error" "3.13.0" + npm-package-arg "^6.1.0" + npmlog "^4.1.2" + semver "^6.2.0" + +"@lerna/package@3.16.0": + version "3.16.0" + resolved "https://registry.yarnpkg.com/@lerna/package/-/package-3.16.0.tgz#7e0a46e4697ed8b8a9c14d59c7f890e0d38ba13c" + integrity sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw== + dependencies: + load-json-file "^5.3.0" + npm-package-arg "^6.1.0" + write-pkg "^3.1.0" + +"@lerna/prerelease-id-from-version@3.16.0": + version "3.16.0" + resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz#b24bfa789f5e1baab914d7b08baae9b7bd7d83a1" + integrity sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA== + dependencies: + semver "^6.2.0" + +"@lerna/profiler@3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-3.20.0.tgz#0f6dc236f4ea8f9ea5f358c6703305a4f32ad051" + integrity sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg== + dependencies: + figgy-pudding "^3.5.1" + fs-extra "^8.1.0" + npmlog "^4.1.2" + upath "^1.2.0" + +"@lerna/project@3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@lerna/project/-/project-3.18.0.tgz#56feee01daeb42c03cbdf0ed8a2a10cbce32f670" + integrity sha512-+LDwvdAp0BurOAWmeHE3uuticsq9hNxBI0+FMHiIai8jrygpJGahaQrBYWpwbshbQyVLeQgx3+YJdW2TbEdFWA== + dependencies: + "@lerna/package" "3.16.0" + "@lerna/validation-error" "3.13.0" + cosmiconfig "^5.1.0" + dedent "^0.7.0" + dot-prop "^4.2.0" + glob-parent "^5.0.0" + globby "^9.2.0" + load-json-file "^5.3.0" + npmlog "^4.1.2" + p-map "^2.1.0" + resolve-from "^4.0.0" + write-json-file "^3.2.0" + +"@lerna/prompt@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-3.18.5.tgz#628cd545f225887d060491ab95df899cfc5218a1" + integrity sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ== + dependencies: + inquirer "^6.2.0" + npmlog "^4.1.2" + +"@lerna/publish@3.20.2": + version "3.20.2" + resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.20.2.tgz#a45d29813099b3249657ea913d0dc3f8ebc5cc2e" + integrity sha512-N7Y6PdhJ+tYQPdI1tZum8W25cDlTp4D6brvRacKZusweWexxaopbV8RprBaKexkEX/KIbncuADq7qjDBdQHzaA== + dependencies: + "@evocateur/libnpmaccess" "^3.1.2" + "@evocateur/npm-registry-fetch" "^4.0.0" + "@evocateur/pacote" "^9.6.3" + "@lerna/check-working-tree" "3.16.5" + "@lerna/child-process" "3.16.5" + "@lerna/collect-updates" "3.20.0" + "@lerna/command" "3.18.5" + "@lerna/describe-ref" "3.16.5" + "@lerna/log-packed" "3.16.0" + "@lerna/npm-conf" "3.16.0" + "@lerna/npm-dist-tag" "3.18.5" + "@lerna/npm-publish" "3.18.5" + "@lerna/otplease" "3.18.5" + "@lerna/output" "3.13.0" + "@lerna/pack-directory" "3.16.4" + "@lerna/prerelease-id-from-version" "3.16.0" + "@lerna/prompt" "3.18.5" + "@lerna/pulse-till-done" "3.13.0" + "@lerna/run-lifecycle" "3.16.2" + "@lerna/run-topologically" "3.18.5" + "@lerna/validation-error" "3.13.0" + "@lerna/version" "3.20.2" + figgy-pudding "^3.5.1" + fs-extra "^8.1.0" + npm-package-arg "^6.1.0" + npmlog "^4.1.2" + p-finally "^1.0.0" + p-map "^2.1.0" + p-pipe "^1.2.0" + semver "^6.2.0" + +"@lerna/pulse-till-done@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz#c8e9ce5bafaf10d930a67d7ed0ccb5d958fe0110" + integrity sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA== + dependencies: + npmlog "^4.1.2" + +"@lerna/query-graph@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-3.18.5.tgz#df4830bb5155273003bf35e8dda1c32d0927bd86" + integrity sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA== + dependencies: + "@lerna/package-graph" "3.18.5" + figgy-pudding "^3.5.1" + +"@lerna/resolve-symlink@3.16.0": + version "3.16.0" + resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz#37fc7095fabdbcf317c26eb74e0d0bde8efd2386" + integrity sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ== + dependencies: + fs-extra "^8.1.0" + npmlog "^4.1.2" + read-cmd-shim "^1.0.1" + +"@lerna/rimraf-dir@3.16.5": + version "3.16.5" + resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz#04316ab5ffd2909657aaf388ea502cb8c2f20a09" + integrity sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA== + dependencies: + "@lerna/child-process" "3.16.5" + npmlog "^4.1.2" + path-exists "^3.0.0" + rimraf "^2.6.2" + +"@lerna/run-lifecycle@3.16.2": + version "3.16.2" + resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz#67b288f8ea964db9ea4fb1fbc7715d5bbb0bce00" + integrity sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A== + dependencies: + "@lerna/npm-conf" "3.16.0" + figgy-pudding "^3.5.1" + npm-lifecycle "^3.1.2" + npmlog "^4.1.2" + +"@lerna/run-topologically@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-3.18.5.tgz#3cd639da20e967d7672cb88db0f756b92f2fdfc3" + integrity sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg== + dependencies: + "@lerna/query-graph" "3.18.5" + figgy-pudding "^3.5.1" + p-queue "^4.0.0" + +"@lerna/run@3.20.0": + version "3.20.0" + resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.20.0.tgz#a479f7c42bdf9ebabb3a1e5a2bdebb7a8d201151" + integrity sha512-9U3AqeaCeB7KsGS9oyKNp62s9vYoULg/B4cqXTKZkc+OKL6QOEjYHYVSBcMK9lUXrMjCjDIuDSX3PnTCPxQ2Dw== + dependencies: + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.20.0" + "@lerna/npm-run-script" "3.16.5" + "@lerna/output" "3.13.0" + "@lerna/profiler" "3.20.0" + "@lerna/run-topologically" "3.18.5" + "@lerna/timer" "3.13.0" + "@lerna/validation-error" "3.13.0" + p-map "^2.1.0" + +"@lerna/symlink-binary@3.17.0": + version "3.17.0" + resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz#8f8031b309863814883d3f009877f82e38aef45a" + integrity sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ== + dependencies: + "@lerna/create-symlink" "3.16.2" + "@lerna/package" "3.16.0" + fs-extra "^8.1.0" + p-map "^2.1.0" + +"@lerna/symlink-dependencies@3.17.0": + version "3.17.0" + resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz#48d6360e985865a0e56cd8b51b308a526308784a" + integrity sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q== + dependencies: + "@lerna/create-symlink" "3.16.2" + "@lerna/resolve-symlink" "3.16.0" + "@lerna/symlink-binary" "3.17.0" + fs-extra "^8.1.0" + p-finally "^1.0.0" + p-map "^2.1.0" + p-map-series "^1.0.0" + +"@lerna/timer@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-3.13.0.tgz#bcd0904551db16e08364d6c18e5e2160fc870781" + integrity sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw== + +"@lerna/validation-error@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-3.13.0.tgz#c86b8f07c5ab9539f775bd8a54976e926f3759c3" + integrity sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA== + dependencies: + npmlog "^4.1.2" + +"@lerna/version@3.20.2": + version "3.20.2" + resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.20.2.tgz#3709141c0f537741d9bc10cb24f56897bcb30428" + integrity sha512-ckBJMaBWc+xJen0cMyCE7W67QXLLrc0ELvigPIn8p609qkfNM0L0CF803MKxjVOldJAjw84b8ucNWZLvJagP/Q== + dependencies: + "@lerna/check-working-tree" "3.16.5" + "@lerna/child-process" "3.16.5" + "@lerna/collect-updates" "3.20.0" + "@lerna/command" "3.18.5" + "@lerna/conventional-commits" "3.18.5" + "@lerna/github-client" "3.16.5" + "@lerna/gitlab-client" "3.15.0" + "@lerna/output" "3.13.0" + "@lerna/prerelease-id-from-version" "3.16.0" + "@lerna/prompt" "3.18.5" + "@lerna/run-lifecycle" "3.16.2" + "@lerna/run-topologically" "3.18.5" + "@lerna/validation-error" "3.13.0" + chalk "^2.3.1" + dedent "^0.7.0" + load-json-file "^5.3.0" + minimatch "^3.0.4" + npmlog "^4.1.2" + p-map "^2.1.0" + p-pipe "^1.2.0" + p-reduce "^1.0.0" + p-waterfall "^1.0.0" + semver "^6.2.0" + slash "^2.0.0" + temp-write "^3.4.0" + write-json-file "^3.2.0" + +"@lerna/write-log-file@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-3.13.0.tgz#b78d9e4cfc1349a8be64d91324c4c8199e822a26" + integrity sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A== + dependencies: + npmlog "^4.1.2" + write-file-atomic "^2.3.0" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== dependencies: - babel-runtime "^6.9.0" + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" -babel-plugin-transform-es2015-duplicate-keys@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.8.0" +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -babel-plugin-transform-es2015-for-of@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" +"@octokit/auth-token@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.0.tgz#b64178975218b99e4dfe948253f0673cbbb59d9f" + integrity sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg== dependencies: - babel-runtime "^6.0.0" + "@octokit/types" "^2.0.0" -babel-plugin-transform-es2015-function-name@^6.9.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" +"@octokit/endpoint@^5.5.0": + version "5.5.3" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.5.3.tgz#0397d1baaca687a4c8454ba424a627699d97c978" + integrity sha512-EzKwkwcxeegYYah5ukEeAI/gYRLv2Y9U5PpIsseGSFDk+G3RbipQGBs8GuYS1TLCtQaqoO66+aQGtITPalxsNQ== dependencies: - babel-helper-function-name "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.9.0" + "@octokit/types" "^2.0.0" + is-plain-object "^3.0.0" + universal-user-agent "^5.0.0" -babel-plugin-transform-es2015-literals@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" - dependencies: - babel-runtime "^6.0.0" +"@octokit/plugin-enterprise-rest@^3.6.1": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-3.6.2.tgz#74de25bef21e0182b4fa03a8678cd00a4e67e561" + integrity sha512-3wF5eueS5OHQYuAEudkpN+xVeUsg8vYEMMenEzLphUZ7PRZ8OJtDcsreL3ad9zxXmBbaFWzLmFcdob5CLyZftA== -babel-plugin-transform-es2015-modules-amd@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" +"@octokit/plugin-paginate-rest@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz#004170acf8c2be535aba26727867d692f7b488fc" + integrity sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q== dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" + "@octokit/types" "^2.0.1" -babel-plugin-transform-es2015-modules-commonjs@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" - dependencies: - babel-plugin-transform-strict-mode "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-types "^6.18.0" +"@octokit/plugin-request-log@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e" + integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw== -babel-plugin-transform-es2015-modules-systemjs@^6.18.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz#50438136eba74527efa00a5b0fefaf1dc4071da6" +"@octokit/plugin-rest-endpoint-methods@2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz#3288ecf5481f68c494dd0602fc15407a59faf61e" + integrity sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ== dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.11.6" - babel-template "^6.14.0" + "@octokit/types" "^2.0.1" + deprecation "^2.3.1" -babel-plugin-transform-es2015-modules-umd@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" +"@octokit/request-error@^1.0.1", "@octokit/request-error@^1.0.2": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.1.tgz#ede0714c773f32347576c25649dc013ae6b31801" + integrity sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA== + dependencies: + "@octokit/types" "^2.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.2.0": + version "5.3.2" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.3.2.tgz#1ca8b90a407772a1ee1ab758e7e0aced213b9883" + integrity sha512-7NPJpg19wVQy1cs2xqXjjRq/RmtSomja/VSWnptfYwuBxLdbYh2UjhGi0Wx7B1v5Iw5GKhfFDQL7jM7SSp7K2g== + dependencies: + "@octokit/endpoint" "^5.5.0" + "@octokit/request-error" "^1.0.1" + "@octokit/types" "^2.0.0" + deprecation "^2.0.0" + is-plain-object "^3.0.0" + node-fetch "^2.3.0" + once "^1.4.0" + universal-user-agent "^5.0.0" + +"@octokit/rest@^16.28.4": + version "16.43.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.1.tgz#3b11e7d1b1ac2bbeeb23b08a17df0b20947eda6b" + integrity sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw== + dependencies: + "@octokit/auth-token" "^2.4.0" + "@octokit/plugin-paginate-rest" "^1.1.1" + "@octokit/plugin-request-log" "^1.0.0" + "@octokit/plugin-rest-endpoint-methods" "2.4.0" + "@octokit/request" "^5.2.0" + "@octokit/request-error" "^1.0.2" + atob-lite "^2.0.0" + before-after-hook "^2.0.0" + btoa-lite "^1.0.0" + deprecation "^2.0.0" + lodash.get "^4.4.2" + lodash.set "^4.3.2" + lodash.uniq "^4.5.0" + octokit-pagination-methods "^1.1.0" + once "^1.4.0" + universal-user-agent "^4.0.0" + +"@octokit/types@^2.0.0", "@octokit/types@^2.0.1": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.5.0.tgz#f1bbd147e662ae2c79717d518aac686e58257773" + integrity sha512-KEnLwOfdXzxPNL34fj508bhi9Z9cStyN7qY1kOfVahmqtAfrWw6Oq3P4R+dtsg0lYtZdWBpUrS/Ixmd5YILSww== dependencies: - babel-plugin-transform-es2015-modules-amd "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" + "@types/node" ">= 8" -babel-plugin-transform-es2015-object-super@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" - dependencies: - babel-helper-replace-supers "^6.8.0" - babel-runtime "^6.0.0" +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -babel-plugin-transform-es2015-parameters@^6.18.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.21.0.tgz#46a655e6864ef984091448cdf024d87b60b2a7d8" +"@sinonjs/commons@^1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.1.tgz#da5fd19a5f71177a53778073978873964f49acf1" + integrity sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ== dependencies: - babel-helper-call-delegate "^6.18.0" - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.9.0" - babel-template "^6.16.0" - babel-traverse "^6.21.0" - babel-types "^6.21.0" + type-detect "4.0.8" -babel-plugin-transform-es2015-shorthand-properties@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + defer-to-connect "^1.0.1" -babel-plugin-transform-es2015-spread@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" +"@types/babel__core@^7.1.0": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" + integrity sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg== dependencies: - babel-runtime "^6.0.0" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" -babel-plugin-transform-es2015-sticky-regex@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" +"@types/babel__generator@*": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - babel-types "^6.8.0" + "@babel/types" "^7.0.0" -babel-plugin-transform-es2015-template-literals@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-unicode-regex@^6.3.13: - version "6.11.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" - dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-regenerator@^6.16.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.21.0.tgz#75d0c7e7f84f379358f508451c68a2c5fa5a9703" - dependencies: - regenerator-transform "0.9.8" - -babel-plugin-transform-strict-mode@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-polyfill@^6.16.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.20.0.tgz#de4a371006139e20990aac0be367d398331204e7" - dependencies: - babel-runtime "^6.20.0" - core-js "^2.4.0" - regenerator-runtime "^0.10.0" - -babel-preset-es2015@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz#b8c70df84ec948c43dcf2bf770e988eb7da88312" - dependencies: - babel-plugin-check-es2015-constants "^6.3.13" - babel-plugin-transform-es2015-arrow-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoping "^6.18.0" - babel-plugin-transform-es2015-classes "^6.18.0" - babel-plugin-transform-es2015-computed-properties "^6.3.13" - babel-plugin-transform-es2015-destructuring "^6.18.0" - babel-plugin-transform-es2015-duplicate-keys "^6.6.0" - babel-plugin-transform-es2015-for-of "^6.18.0" - babel-plugin-transform-es2015-function-name "^6.9.0" - babel-plugin-transform-es2015-literals "^6.3.13" - babel-plugin-transform-es2015-modules-amd "^6.18.0" - babel-plugin-transform-es2015-modules-commonjs "^6.18.0" - babel-plugin-transform-es2015-modules-systemjs "^6.18.0" - babel-plugin-transform-es2015-modules-umd "^6.18.0" - babel-plugin-transform-es2015-object-super "^6.3.13" - babel-plugin-transform-es2015-parameters "^6.18.0" - babel-plugin-transform-es2015-shorthand-properties "^6.18.0" - babel-plugin-transform-es2015-spread "^6.3.13" - babel-plugin-transform-es2015-sticky-regex "^6.3.13" - babel-plugin-transform-es2015-template-literals "^6.6.0" - babel-plugin-transform-es2015-typeof-symbol "^6.18.0" - babel-plugin-transform-es2015-unicode-regex "^6.3.13" - babel-plugin-transform-regenerator "^6.16.0" - -babel-register@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" - dependencies: - babel-core "^6.18.0" - babel-runtime "^6.11.6" - core-js "^2.4.0" - home-or-tmp "^2.0.0" - lodash "^4.2.0" - mkdirp "^0.5.1" - source-map-support "^0.4.2" - -babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.9.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.20.0.tgz#87300bdcf4cd770f09bf0048c64204e17806d16f" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.10.0" - -babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" - dependencies: - babel-runtime "^6.9.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" - babylon "^6.11.0" - lodash "^4.2.0" - -babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.21.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.21.0.tgz#69c6365804f1a4f69eb1213f85b00a818b8c21ad" - dependencies: - babel-code-frame "^6.20.0" - babel-messages "^6.8.0" - babel-runtime "^6.20.0" - babel-types "^6.21.0" - babylon "^6.11.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" -babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.21.0, babel-types@^6.8.0, babel-types@^6.9.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.21.0.tgz#314b92168891ef6d3806b7f7a917fdf87c11a4b2" +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.9.tgz#be82fab304b141c3eee81a4ce3b034d0eba1590a" + integrity sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw== dependencies: - babel-runtime "^6.20.0" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" + "@babel/types" "^7.3.0" -babel@^6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/babel/-/babel-6.5.2.tgz#59140607438270920047ff56f02b2d8630c2d129" +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -babylon@^6.11.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e" +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" -base64-arraybuffer@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" -base64-js@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" +"@types/json-schema@^7.0.3": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" + integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== -base64id@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -bcrypt-pbkdf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" - dependencies: - tweetnacl "^0.14.3" +"@types/node@*", "@types/node@>= 8": + version "13.9.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349" + integrity sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg== -benchmark@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.3.tgz#e10e40e4d53d0e1c9d77a834fde593994dca7f0c" - dependencies: - lodash "^4.17.3" - platform "^1.3.3" +"@types/node@^12.0.12": + version "12.12.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.30.tgz#3501e6f09b954de9c404671cefdbcc5d9d7c45f6" + integrity sha512-sz9MF/zk6qVr3pAnM0BSQvYIBK44tS75QC5N+VbWSE4DjCV/pJ+UzCW/F+vVnl7TkOPcuwQureKNtSSwjBTaMg== -better-assert@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs-parser@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + +"@types/yargs@^13.0.0": + version "13.0.8" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.8.tgz#a38c22def2f1c2068f8971acb3ea734eb3c64a99" + integrity sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^15.0.0": + version "15.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.4.tgz#7e5d0f8ca25e9d5849f2ea443cf7c402decd8299" + integrity sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/experimental-utils@^2.5.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz#a5cb2ed89fedf8b59638dc83484eb0c8c35e1143" + integrity sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.24.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/typescript-estree@2.24.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz#38bbc8bb479790d2f324797ffbcdb346d897c62a" + integrity sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^6.3.0" + tsutils "^3.17.1" + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== dependencies: - callsite "1.0.0" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" -big.js@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== -binary-extensions@^1.0.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== -bl@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== dependencies: - readable-stream "~2.0.5" + "@webassemblyjs/wast-printer" "1.8.5" -blob@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== dependencies: - inherits "~2.0.0" + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" -bluebird@^3.3.0: - version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== -body-parser@^1.12.4: - version "1.16.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.16.0.tgz#924a5e472c6229fb9d69b85a20d5f2532dec788b" +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== dependencies: - bytes "2.4.0" - content-type "~1.0.2" - debug "2.6.0" - depd "~1.1.0" - http-errors "~1.5.1" - iconv-lite "0.4.15" - on-finished "~2.3.0" - qs "6.2.1" - raw-body "~2.2.0" - type-is "~1.6.14" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== dependencies: - hoek "2.x.x" + "@xtuc/ieee754" "^1.2.0" -brace-expansion@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== dependencies: - balanced-match "^0.4.1" - concat-map "0.0.1" + "@xtuc/long" "4.2.2" -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== -braces@^0.1.2: - version "0.1.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== dependencies: - expand-range "^0.1.0" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" -braces@^1.8.2: +"@webassemblyjs/wasm-opt@1.8.5": version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" -browser-stdout@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" -browserify-aes@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-0.4.0.tgz#067149b668df31c4b58533e02d01e806d8608e2c" +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== dependencies: - inherits "^2.0.1" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" -browserify-zlib@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== dependencies: - pako "~0.2.0" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" -buffer-from@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== -buffer-shims@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -buffer@^4.9.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" +"@zkochan/cmd-shim@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e" + integrity sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" + is-windows "^1.0.0" + mkdirp-promise "^5.0.1" + mz "^2.5.0" -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" +JSONStream@^1.0.4, JSONStream@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" -bytes@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-globals@^4.1.0, acorn-globals@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== dependencies: - callsites "^0.2.0" + acorn "^6.0.1" + acorn-walk "^6.0.1" -callsite@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" +acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" +acorn@^6.0.1, acorn@^6.2.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" +acorn@^7.1.0, acorn@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== -chai@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" +agent-base@4, agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== dependencies: - assertion-error "^1.0.1" - check-error "^1.0.1" - deep-eql "^3.0.0" - get-func-name "^2.0.0" - pathval "^1.0.0" - type-detect "^4.0.0" + es6-promisify "^5.0.0" -chalk@1.1.3, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" +agent-base@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" + es6-promisify "^5.0.0" -chalk@^2.0.0, chalk@^2.1.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" +agentkeepalive@^3.4.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" + integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + humanize-ms "^1.2.1" -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -check-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -chokidar@^1.0.0, chokidar@^1.4.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +aproba@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-differ@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" + integrity sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w== + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + +array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types@0.11.7: + version "0.11.7" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.7.tgz#f318bf44e339db6a320be0009ded64ec1471f46c" + integrity sha512-2mP3TwtkY/aTv5X3ZsMpNAbOnyoC/aMJwJSoaELPkHId0nSQgFcnU4dRW3isxiz7+zBexk0ym3WNVjMiQBnJSw== + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob-lite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" + integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-jest@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.1.0.tgz#206093ac380a4b78c4404a05b3277391278f80fb" + integrity sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg== + dependencies: + "@jest/transform" "^25.1.0" + "@jest/types" "^25.1.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^25.1.0" + chalk "^3.0.0" + slash "^3.0.0" + +babel-loader@^8.0.6: + version "8.0.6" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" + integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== + dependencies: + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + pify "^4.0.1" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-istanbul@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^4.0.0" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-plugin-jest-hoist@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz#fb62d7b3b53eb36c97d1bc7fec2072f9bd115981" + integrity sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + +babel-preset-jest@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz#d0aebfebb2177a21cde710996fce8486d34f1d33" + integrity sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ== + dependencies: + "@babel/plugin-syntax-bigint" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^25.1.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +before-after-hook@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" + integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== + +benchmark@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" + integrity sha1-CfPeMckWQl1JjMLuVloOvzwqVik= + dependencies: + lodash "^4.17.4" + platform "^1.3.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +boolean@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.1.tgz#35ecf2b4a2ee191b0b44986f14eb5f052a5cbb4f" + integrity sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.8.3, browserslist@^4.8.5, browserslist@^4.9.1: + version "4.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== + dependencies: + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.378" + node-releases "^1.1.52" + pkg-up "^3.1.0" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +byline@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= + +byte-size@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191" + integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== + +cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001035: + version "1.0.30001035" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" + integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^2.0.2: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1, chownr@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" + safe-buffer "^5.0.1" -circular-json@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" -clone@^1.0.2: +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collect-v8-coverage@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz#150ee634ac3650b71d9c985eb7f608942334feb1" + integrity sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - color-name "^1.1.1" + color-name "1.1.3" -color-name@^1.1.1: +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -colors@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -combine-lists@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" +colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +columnify@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" + integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs= dependencies: - lodash "^4.5.0" + strip-ansi "^3.0.0" + wcwidth "^1.0.0" -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" -commander@2.9.0, commander@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - dependencies: - graceful-readlink ">= 1.0.0" +commander@^2.20.0, commander@~2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - -component-emitter@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" - -component-emitter@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" +compare-func@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" + integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= + dependencies: + array-ify "^1.0.0" + dot-prop "^3.0.0" -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.6.0: +concat-stream@1.6.2, concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" -connect@^3.3.5: - version "3.5.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.5.0.tgz#b357525a0b4c1f50599cd983e1d9efeea9677198" +concat-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + +config-chain@^1.1.11: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== dependencies: - debug "~2.2.0" - finalhandler "0.5.0" - parseurl "~1.3.1" - utils-merge "1.0.0" + ini "^1.3.4" + proto-list "~1.2.1" console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -content-type@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" +conventional-changelog-angular@^5.0.3: + version "5.0.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz#269540c624553aded809c29a3508fdc2b544c059" + integrity sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA== + dependencies: + compare-func "^1.3.1" + q "^1.5.1" -convert-source-map@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" +conventional-changelog-core@^3.1.6: + version "3.2.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz#b31410856f431c847086a7dcb4d2ca184a7d88fb" + integrity sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ== + dependencies: + conventional-changelog-writer "^4.0.6" + conventional-commits-parser "^3.0.3" + dateformat "^3.0.0" + get-pkg-repo "^1.0.0" + git-raw-commits "2.0.0" + git-remote-origin-url "^2.0.0" + git-semver-tags "^2.0.3" + lodash "^4.2.1" + normalize-package-data "^2.3.5" + q "^1.5.1" + read-pkg "^3.0.0" + read-pkg-up "^3.0.0" + through2 "^3.0.0" + +conventional-changelog-preset-loader@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz#580fa8ab02cef22c24294d25e52d7ccd247a9a6a" + integrity sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ== + +conventional-changelog-writer@^4.0.6: + version "4.0.11" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz#9f56d2122d20c96eb48baae0bf1deffaed1edba4" + integrity sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw== + dependencies: + compare-func "^1.3.1" + conventional-commits-filter "^2.0.2" + dateformat "^3.0.0" + handlebars "^4.4.0" + json-stringify-safe "^5.0.1" + lodash "^4.17.15" + meow "^5.0.0" + semver "^6.0.0" + split "^1.0.0" + through2 "^3.0.0" + +conventional-commits-filter@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz#f122f89fbcd5bb81e2af2fcac0254d062d1039c1" + integrity sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ== + dependencies: + lodash.ismatch "^4.4.0" + modify-values "^1.0.0" + +conventional-commits-parser@^3.0.3: + version "3.0.8" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz#23310a9bda6c93c874224375e72b09fb275fe710" + integrity sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^5.0.0" + split2 "^2.0.0" + through2 "^3.0.0" + trim-off-newlines "^1.0.0" + +conventional-recommended-bump@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz#5af63903947b6e089e77767601cb592cabb106ba" + integrity sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ== + dependencies: + concat-stream "^2.0.0" + conventional-changelog-preset-loader "^2.1.1" + conventional-commits-filter "^2.0.2" + conventional-commits-parser "^3.0.3" + git-raw-commits "2.0.0" + git-semver-tags "^2.0.3" + meow "^4.0.0" + q "^1.5.1" + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" -core-js@^2.2.0, core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" + integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + dependencies: + browserslist "^4.8.3" + semver "7.0.0" + +core-js@^3.6.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" + integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -coveralls@^2.11.15: - version "2.11.15" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.11.15.tgz#37d3474369d66c14f33fa73a9d25cee6e099fca0" +cosmiconfig@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== dependencies: - js-yaml "3.6.1" - lcov-parse "0.0.10" - log-driver "1.2.5" - minimist "1.2.0" - request "2.75.0" + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" -cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" +coveralls@^3.0.7: + version "3.0.9" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.9.tgz#8cfc5a5525f84884e2948a0bf0f1c0e90aac0420" + integrity sha512-nNBg3B1+4iDox5A5zqHKzUTiwl2ey4k2o0NEcVZYvl+GOSJdKBj4AJGKLv6h3SvWch7tABHePAQOSZWM9E2hMg== + dependencies: + js-yaml "^3.13.1" + lcov-parse "^1.0.0" + log-driver "^1.2.7" + minimist "^1.2.0" + request "^2.88.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: - lru-cache "^4.0.1" + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" shebang-command "^1.2.0" which "^1.2.9" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssom@^0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== dependencies: - boom "2.x.x" + cssom "0.3.x" -crypto-browserify@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.3.0.tgz#b9fc75bb4a0ed61dcf1cd5dae96eb30c9c3e506c" +cssstyle@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992" + integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA== + dependencies: + cssom "~0.3.6" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: - browserify-aes "0.4.0" - pbkdf2-compat "2.0.1" - ripemd160 "0.2.0" - sha.js "2.2.6" + array-find-index "^1.0.1" -custom-event@~1.0.0: +cyclist@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +dargs@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" + integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= + dependencies: + number-is-nan "^1.0.0" dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - -debug@2.2.0, debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" +data-urls@^1.0.0, data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== dependencies: - ms "0.7.1" + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" -debug@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" - dependencies: - ms "0.7.2" +dateformat@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@2.6.0, debug@^2.1.1, debug@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: - ms "0.7.2" + ms "2.0.0" -debug@^3.1.0: +debug@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -decamelize@^1.0.0: +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= + +decamelize-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -deep-eql@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= dependencies: - type-detect "^4.0.0" + mimic-response "^1.0.0" -deep-extend@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" + clone "^1.0.2" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: - repeating "^2.0.0" - -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" -diff@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -diff@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= -doctrine@^2.1.0: +detect-newline@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +dezalgo@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= dependencies: - esutils "^2.0.2" + asap "^2.0.0" + wrappy "1" -dom-serialize@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + +diff-sequences@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.1.0.tgz#fd29a46f1c913fd66c22645dc75bffbe43051f32" + integrity sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" + esutils "^2.0.2" domain-browser@^1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -ecc-jsbn@~0.1.1: +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= + dependencies: + is-obj "^1.0.0" + +dot-prop@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +easy-stack@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.0.tgz#12c91b3085a37f0baa336e9486eac4bf94e3e788" + integrity sha1-EskbMIWjfwuqM26UhurEv5Tj54g= + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" +electron-to-chromium@^1.3.378: + version "1.3.379" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.379.tgz#81dc5e82a3e72bbb830d93e15bc35eda2bbc910e" + integrity sha512-NK9DBBYEBb5f9D7zXI0hiE941gq3wkBeQmXs1ingigA/jnTg5mhwY2Z5egwA+ZI8OLGKCx0h1Cl8/xeuIBuLlg== + +electron@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/electron/-/electron-8.1.1.tgz#737a5af03c7b4af60b49dff7bfe1203fcbd5bf89" + integrity sha512-t+5zzFo7VOgckJc9YpImHJkpqeWxwpmEjywWbAa4IT5MULS7h1XU52H9gMswK/y8xc5lBNwxLhJSty/15+gi1A== + dependencies: + "@electron/get" "^1.0.1" + "@types/node" "^12.0.12" + extract-zip "^1.0.3" + +elliptic@^6.0.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -engine.io-client@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.2.tgz#c38767547f2a7d184f5752f6f0ad501006703766" - dependencies: - component-emitter "1.2.1" - component-inherit "0.0.3" - debug "2.3.3" - engine.io-parser "1.3.2" - has-cors "1.1.0" - indexof "0.0.1" - parsejson "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" - ws "1.1.1" - xmlhttprequest-ssl "1.5.3" - yeast "0.1.2" - -engine.io-parser@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" - dependencies: - after "0.8.2" - arraybuffer.slice "0.0.6" - base64-arraybuffer "0.1.5" - blob "0.0.4" - has-binary "0.1.7" - wtf-8 "1.0.0" - -engine.io@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.2.tgz#6b59be730b348c0125b0a4589de1c355abcf7a7e" - dependencies: - accepts "1.3.3" - base64id "1.0.0" - cookie "0.3.1" - debug "2.3.3" - engine.io-parser "1.3.2" - ws "1.1.1" - -enhanced-resolve@~0.9.0: - version "0.9.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== dependencies: graceful-fs "^4.1.2" - memory-fs "^0.2.0" - tapable "^0.1.8" + memory-fs "^0.5.0" + tapable "^1.0.0" -ent@~2.2.0: +env-paths@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== -errno@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" +envinfo@^7.3.1: + version "7.5.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.5.0.tgz#91410bb6db262fb4f1409bd506e9ff57e91023f4" + integrity sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ== + +err-code@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: + version "1.17.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" + integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= dependencies: - prr "~0.0.0" + es6-promise "^4.0.3" -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@1.8.x: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" +escodegen@^1.11.1, escodegen@^1.9.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" + integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" + esprima "^4.0.1" + estraverse "^4.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: - source-map "~0.2.0" + source-map "~0.6.1" -eslint-config-prettier@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.1.0.tgz#e6f678ba367fbd1273998d5510f76f004e9dce7b" - integrity sha512-k9fny9sPjIBQ2ftFTesJV21Rg4R/7a7t7LCtZVrYQiHEp8Nnuk3EGaDmsKSAnsPj0BYcgB2zxzHa2NTkIxcOLg== +eslint-config-prettier@^6.3.0: + version "6.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz#7b15e303bf9c956875c948f6b21500e48ded6a7f" + integrity sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg== dependencies: get-stdin "^6.0.0" -eslint-plugin-mocha@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-5.0.0.tgz#43946a7ecaf39039eb3ee20635ebd4cc19baf6dd" +eslint-plugin-jest@^23.8.2: + version "23.8.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz#6f28b41c67ef635f803ebd9e168f6b73858eb8d4" + integrity sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg== dependencies: - ramda "^0.25.0" + "@typescript-eslint/experimental-utils" "^2.5.0" -eslint-scope@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@^4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" +eslint@^6.4.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.4" - esquery "^1.0.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" esutils "^2.0.2" - file-entry-cache "^2.0.0" + file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" + lodash "^4.17.14" + minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" + optionator "^0.8.3" progress "^2.0.0" - regexpp "^1.0.1" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" - -espree@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" -esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" +esquery@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" + integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: - estraverse "~4.1.0" - object-assign "^4.0.1" - -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - -estraverse@^4.0.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + estraverse "^4.1.0" -estraverse@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" +event-pubsub@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e" + integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ== -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +eventemitter3@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== -expand-braces@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" - dependencies: - array-slice "^0.2.3" - array-unique "^0.2.1" - braces "^0.1.2" +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: - is-posix-bracket "^0.1.0" + md5.js "^1.3.4" + safe-buffer "^5.1.1" -expand-range@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +expect@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-25.1.0.tgz#7e8d7b06a53f7d66ec927278db3304254ee683ee" + integrity sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g== + dependencies: + "@jest/types" "^25.1.0" + ansi-styles "^4.0.0" + jest-get-type "^25.1.0" + jest-matcher-utils "^25.1.0" + jest-message-util "^25.1.0" + jest-regex-util "^25.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: - is-number "^0.1.1" - repeat-string "^0.2.2" + is-extendable "^0.1.0" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: - fill-range "^2.1.0" + assign-symbols "^1.0.0" + is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" + chardet "^0.7.0" + iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-zip@^1.0.3: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= + dependencies: + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" + yauzl "2.4.1" -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.4: +fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= + dependencies: + pend "~1.2.0" + +figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" + escape-string-regexp "^1.0.5" -filename-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" -finalhandler@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: - debug "~2.2.0" - escape-html "~1.0.3" - on-finished "~2.3.0" - statuses "~1.3.0" - unpipe "~1.0.0" + to-regex-range "^5.0.1" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" +find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== dependencies: commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" + make-dir "^2.0.0" + pkg-dir "^3.0.0" find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" -flat-cache@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" + locate-path "^2.0.0" -for-in@^0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" -for-own@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +findup-sync@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +flow-parser@0.*: + version "0.121.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.121.0.tgz#9f9898eaec91a9f7c323e9e992d81ab5c58e618f" + integrity sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== dependencies: - for-in "^0.1.5" + inherits "^2.0.3" + readable-stream "^2.3.6" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.0.0.tgz#6f0aebadcc5da16c13e1ecc11137d85f9b883b25" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.11" - -form-data@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.5" + combined-stream "^1.0.6" mime-types "^2.1.12" -fs-access@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: - null-check "^1.0.0" + map-cache "^0.2.2" -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" -fsevents@^1.0.0: - version "1.0.17" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.17.tgz#8537f3f12272678765b4fd6528c0f1f66f8f4558" +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.29" + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" -fstream-ignore@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" + minipass "^2.6.0" -fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: +fs-write-stream-atomic@^1.0.8: version "1.0.10" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= dependencies: graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gauge@~2.7.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.2.tgz#15cecc31b02d05345a5d6b0e171cdb3ad2307774" +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -1586,2024 +4699,5575 @@ gauge@~2.7.1: signal-exit "^3.0.0" string-width "^1.0.1" strip-ansi "^3.0.1" - supports-color "^0.2.0" wide-align "^1.1.0" -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" +genfun@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" + integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-pkg-repo@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" + integrity sha1-xztInAbYDMVTbCyFP54FIyBWly0= dependencies: - is-property "^1.0.0" + hosted-git-info "^2.1.4" + meow "^3.3.0" + normalize-package-data "^2.3.0" + parse-github-repo-url "^1.3.0" + through2 "^2.0.0" -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" +get-port@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" + integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" +git-raw-commits@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.0.tgz#d92addf74440c14bcc5c83ecce3fb7f8a79118b5" + integrity sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg== + dependencies: + dargs "^4.0.1" + lodash.template "^4.0.2" + meow "^4.0.0" + split2 "^2.0.0" + through2 "^2.0.0" + +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= + dependencies: + gitconfiglocal "^1.0.0" + pify "^2.3.0" + +git-semver-tags@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-2.0.3.tgz#48988a718acf593800f99622a952a77c405bfa34" + integrity sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA== + dependencies: + meow "^4.0.0" + semver "^6.0.0" + +git-up@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0" + integrity sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw== + dependencies: + is-ssh "^1.3.0" + parse-url "^5.0.0" + +git-url-parse@^11.1.2: + version "11.1.2" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.1.2.tgz#aff1a897c36cc93699270587bea3dbcbbb95de67" + integrity sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ== + dependencies: + git-up "^4.0.0" + +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= + dependencies: + ini "^1.3.2" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-agent@^2.0.2: + version "2.1.8" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.8.tgz#99d153662b2c04cbc1199ffbc081a3aa656ac50f" + integrity sha512-VpBe/rhY6Rw2VDOTszAMNambg+4Qv8j0yiTNDYEXXXxkUNGWLHp8A3ztK4YDBbFNcWF4rgsec6/5gPyryya/+A== + dependencies: + boolean "^3.0.0" + core-js "^3.6.4" + es6-error "^4.1.1" + matcher "^2.1.0" + roarr "^2.15.2" + semver "^7.1.2" + serialize-error "^5.0.0" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +global-tunnel-ng@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" + integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== + dependencies: + encodeurl "^1.0.2" + lodash "^4.17.10" + npm-conf "^1.1.3" + tunnel "^0.0.6" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globalthis@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" + integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== + dependencies: + define-properties "^1.1.3" + +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +handlebars@^4.4.0: + version "4.7.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.3.tgz#8ece2797826886cf8082d1726ff21d2a022550ee" + integrity sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-unicode@^2.0.0, has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" + is-number "^3.0.0" + kind-of "^4.0.0" -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - is-glob "^2.0.0" + function-bind "^1.1.1" -glob@7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.0.1" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" + inherits "^2.0.3" + minimalistic-assert "^1.0.1" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" -globals@^11.0.1: - version "11.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.4.0.tgz#b85c793349561c16076a3c13549238a27945f1bc" +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" -globals@^9.0.0: - version "9.14.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" +hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" + whatwg-encoding "^1.0.1" -graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +html-escaper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" + integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" +http-cache-semantics@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== -growl@1.9.2: - version "1.9.2" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== -handlebars@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" - optionalDependencies: - uglify-js "^2.6" + agent-base "4" + debug "3.1.0" -har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -has-binary@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" +https-proxy-agent@^2.2.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== dependencies: - isarray "0.0.1" + agent-base "^4.3.0" + debug "^3.1.0" -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" -hoek@4.x.x: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.1.0.tgz#4a4557460f69842ed463aa00628cc26d2683afa7" +ignore@^4.0.3, ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -home-or-tmp@^2.0.0: +import-fresh@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" + caller-path "^2.0.0" + resolve-from "^3.0.0" -http-errors@~1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== dependencies: - inherits "2.0.3" - setprototypeof "1.0.2" - statuses ">= 1.3.1 < 2" + parent-module "^1.0.0" + resolve-from "^4.0.0" -http-proxy@^1.13.0: - version "1.16.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" +import-local@2.0.0, import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" - -iconv-lite@0.4.15: - version "0.4.15" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" - -iconv-lite@^0.4.17: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - -ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" - -ignore@^3.3.3: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" +ini@^1.3.2, ini@^1.3.4, ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" +init-package-json@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" + integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw== dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + +inquirer@^6.2.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^2.0.4" + external-editor "^3.0.3" figures "^2.0.0" - lodash "^4.3.0" + lodash "^4.17.12" mute-stream "0.0.7" run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" + rxjs "^6.4.0" string-width "^2.1.0" - strip-ansi "^4.0.0" + strip-ansi "^5.1.0" through "^2.3.6" -interpret@^0.6.4: - version "0.6.6" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" +inquirer@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" -invariant@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" +interpret@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" -is-buffer@^1.0.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" -is-dotfile@^1.0.0: +is-date-object@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: - is-primitive "^2.0.0" + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-my-json-valid@^2.12.4: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" + is-extglob "^2.1.0" -is-number@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" -is-number@^2.0.2, is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "http://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" +is-plain-object@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" + integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== + dependencies: + isobject "^4.0.0" is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" +is-ssh@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.1.tgz#f349a8cadd24e65298037a522cf7520f2e81a0f3" + integrity sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg== + dependencies: + protocols "^1.1.0" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= dependencies: - tryit "^1.0.1" + text-extensions "^1.0.0" -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" + integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isbinaryfile@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" - -isemail@2.x.x: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isemail/-/isemail-2.2.1.tgz#0353d3d9a62951080c262c2aa0a42b8ea8e9e2a6" - -isexe@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isobject@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - -items@2.x.x: - version "2.1.1" - resolved "https://registry.yarnpkg.com/items/-/items-2.1.1.tgz#8bd16d9c83b19529de5aea321acaada78364a198" +istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== -joi-browser@^10.0.6: - version "10.0.6" - resolved "https://registry.yarnpkg.com/joi-browser/-/joi-browser-10.0.6.tgz#2079c3fd845a886fc7ec5ce7c3f57422fbbdaa05" +istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-instrument@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz#61f13ac2c96cfefb076fe7131156cc05907874e6" + integrity sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg== + dependencies: + "@babel/core" "^7.7.5" + "@babel/parser" "^7.7.5" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" -joi@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-10.2.0.tgz#2c9dba08240d453e58145667f0d5006de527e328" +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== dependencies: - hoek "4.x.x" - isemail "2.x.x" - items "2.x.x" - topo "2.x.x" + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" -js-tokens@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" +istanbul-reports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.0.tgz#d4d16d035db99581b6194e119bbf36c963c5eb70" + integrity sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.1.0.tgz#73dae9a7d9949fdfa5c278438ce8f2ff3ec78131" + integrity sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA== + dependencies: + "@jest/types" "^25.1.0" + execa "^3.2.0" + throat "^5.0.0" + +jest-cli@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.1.0.tgz#75f0b09cf6c4f39360906bf78d580be1048e4372" + integrity sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg== + dependencies: + "@jest/core" "^25.1.0" + "@jest/test-result" "^25.1.0" + "@jest/types" "^25.1.0" + chalk "^3.0.0" + exit "^0.1.2" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^25.1.0" + jest-util "^25.1.0" + jest-validate "^25.1.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^15.0.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-config@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.1.0.tgz#d114e4778c045d3ef239452213b7ad3ec1cbea90" + integrity sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^25.1.0" + "@jest/types" "^25.1.0" + babel-jest "^25.1.0" + chalk "^3.0.0" + glob "^7.1.1" + jest-environment-jsdom "^25.1.0" + jest-environment-node "^25.1.0" + jest-get-type "^25.1.0" + jest-jasmine2 "^25.1.0" + jest-regex-util "^25.1.0" + jest-resolve "^25.1.0" + jest-util "^25.1.0" + jest-validate "^25.1.0" + micromatch "^4.0.2" + pretty-format "^25.1.0" + realpath-native "^1.1.0" + +jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-diff@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.1.0.tgz#58b827e63edea1bc80c1de952b80cec9ac50e1ad" + integrity sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw== + dependencies: + chalk "^3.0.0" + diff-sequences "^25.1.0" + jest-get-type "^25.1.0" + pretty-format "^25.1.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + +jest-docblock@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.1.0.tgz#0f44bea3d6ca6dfc38373d465b347c8818eccb64" + integrity sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA== + dependencies: + detect-newline "^3.0.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-each@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.1.0.tgz#a6b260992bdf451c2d64a0ccbb3ac25e9b44c26a" + integrity sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A== + dependencies: + "@jest/types" "^25.1.0" + chalk "^3.0.0" + jest-get-type "^25.1.0" + jest-util "^25.1.0" + pretty-format "^25.1.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-jsdom@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz#6777ab8b3e90fd076801efd3bff8e98694ab43c3" + integrity sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ== + dependencies: + "@jest/environment" "^25.1.0" + "@jest/fake-timers" "^25.1.0" + "@jest/types" "^25.1.0" + jest-mock "^25.1.0" + jest-util "^25.1.0" + jsdom "^15.1.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-environment-node@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.1.0.tgz#797bd89b378cf0bd794dc8e3dca6ef21126776db" + integrity sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw== + dependencies: + "@jest/environment" "^25.1.0" + "@jest/fake-timers" "^25.1.0" + "@jest/types" "^25.1.0" + jest-mock "^25.1.0" + jest-util "^25.1.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-get-type@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.1.0.tgz#1cfe5fc34f148dc3a8a3b7275f6b9ce9e2e8a876" + integrity sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw== + +jest-haste-map@^24.0.0, jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-haste-map@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.1.0.tgz#ae12163d284f19906260aa51fd405b5b2e5a4ad3" + integrity sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw== + dependencies: + "@jest/types" "^25.1.0" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.3" + jest-serializer "^25.1.0" + jest-util "^25.1.0" + jest-worker "^25.1.0" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-jasmine2@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz#681b59158a430f08d5d0c1cce4f01353e4b48137" + integrity sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^25.1.0" + "@jest/source-map" "^25.1.0" + "@jest/test-result" "^25.1.0" + "@jest/types" "^25.1.0" + chalk "^3.0.0" + co "^4.6.0" + expect "^25.1.0" + is-generator-fn "^2.0.0" + jest-each "^25.1.0" + jest-matcher-utils "^25.1.0" + jest-message-util "^25.1.0" + jest-runtime "^25.1.0" + jest-snapshot "^25.1.0" + jest-util "^25.1.0" + pretty-format "^25.1.0" + throat "^5.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-leak-detector@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz#ed6872d15aa1c72c0732d01bd073dacc7c38b5c6" + integrity sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w== + dependencies: + jest-get-type "^25.1.0" + pretty-format "^25.1.0" + +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz#fa5996c45c7193a3c24e73066fc14acdee020220" + integrity sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ== + dependencies: + chalk "^3.0.0" + jest-diff "^25.1.0" + jest-get-type "^25.1.0" + pretty-format "^25.1.0" + +jest-message-util@^24.0.0, jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-message-util@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.1.0.tgz#702a9a5cb05c144b9aa73f06e17faa219389845e" + integrity sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^25.1.0" + "@jest/types" "^25.1.0" + "@types/stack-utils" "^1.0.1" + chalk "^3.0.0" + micromatch "^4.0.2" + slash "^3.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.0.0, jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + +jest-mock@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.1.0.tgz#411d549e1b326b7350b2e97303a64715c28615fd" + integrity sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag== + dependencies: + "@jest/types" "^25.1.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-regex-util@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.1.0.tgz#efaf75914267741838e01de24da07b2192d16d87" + integrity sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w== + +jest-resolve-dependencies@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz#8a1789ec64eb6aaa77fd579a1066a783437e70d2" + integrity sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw== + dependencies: + "@jest/types" "^25.1.0" + jest-regex-util "^25.1.0" + jest-snapshot "^25.1.0" + +jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-resolve@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.1.0.tgz#23d8b6a4892362baf2662877c66aa241fa2eaea3" + integrity sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ== + dependencies: + "@jest/types" "^25.1.0" + browser-resolve "^1.11.3" + chalk "^3.0.0" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.0.0, jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runner@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.1.0.tgz#fef433a4d42c89ab0a6b6b268e4a4fbe6b26e812" + integrity sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w== + dependencies: + "@jest/console" "^25.1.0" + "@jest/environment" "^25.1.0" + "@jest/test-result" "^25.1.0" + "@jest/types" "^25.1.0" + chalk "^3.0.0" + exit "^0.1.2" + graceful-fs "^4.2.3" + jest-config "^25.1.0" + jest-docblock "^25.1.0" + jest-haste-map "^25.1.0" + jest-jasmine2 "^25.1.0" + jest-leak-detector "^25.1.0" + jest-message-util "^25.1.0" + jest-resolve "^25.1.0" + jest-runtime "^25.1.0" + jest-util "^25.1.0" + jest-worker "^25.1.0" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runtime@^24.0.0, jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-runtime@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.1.0.tgz#02683218f2f95aad0f2ec1c9cdb28c1dc0ec0314" + integrity sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA== + dependencies: + "@jest/console" "^25.1.0" + "@jest/environment" "^25.1.0" + "@jest/source-map" "^25.1.0" + "@jest/test-result" "^25.1.0" + "@jest/transform" "^25.1.0" + "@jest/types" "^25.1.0" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.3" + jest-config "^25.1.0" + jest-haste-map "^25.1.0" + jest-message-util "^25.1.0" + jest-mock "^25.1.0" + jest-regex-util "^25.1.0" + jest-resolve "^25.1.0" + jest-snapshot "^25.1.0" + jest-util "^25.1.0" + jest-validate "^25.1.0" + realpath-native "^1.1.0" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.0.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-serializer@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.1.0.tgz#73096ba90e07d19dec4a0c1dd89c355e2f129e5d" + integrity sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-snapshot@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.1.0.tgz#d5880bd4b31faea100454608e15f8d77b9d221d9" + integrity sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^25.1.0" + chalk "^3.0.0" + expect "^25.1.0" + jest-diff "^25.1.0" + jest-get-type "^25.1.0" + jest-matcher-utils "^25.1.0" + jest-message-util "^25.1.0" + jest-resolve "^25.1.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^25.1.0" + semver "^7.1.1" + +jest-util@^24.0.0, jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" +jest-util@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.1.0.tgz#7bc56f7b2abd534910e9fa252692f50624c897d9" + integrity sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw== + dependencies: + "@jest/types" "^25.1.0" + chalk "^3.0.0" + is-ci "^2.0.0" + mkdirp "^0.5.1" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-validate@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.1.0.tgz#1469fa19f627bb0a9a98e289f3e9ab6a668c732a" + integrity sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA== + dependencies: + "@jest/types" "^25.1.0" + camelcase "^5.3.1" + chalk "^3.0.0" + jest-get-type "^25.1.0" + leven "^3.1.0" + pretty-format "^25.1.0" + +jest-watcher@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.1.0.tgz#97cb4a937f676f64c9fad2d07b824c56808e9806" + integrity sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig== + dependencies: + "@jest/test-result" "^25.1.0" + "@jest/types" "^25.1.0" + ansi-escapes "^4.2.1" + chalk "^3.0.0" + jest-util "^25.1.0" + string-length "^3.1.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest-worker@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" + integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-25.1.0.tgz#b85ef1ddba2fdb00d295deebbd13567106d35be9" + integrity sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w== + dependencies: + "@jest/core" "^25.1.0" + import-local "^3.0.2" + jest-cli "^25.1.0" + +js-message@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.5.tgz#2300d24b1af08e89dd095bc1a4c9c9cfcb892d15" + integrity sha1-IwDSSxrwjondCVvBpMnJz8uJLRU= -js-yaml@3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" +js-queue@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/js-queue/-/js-queue-2.0.0.tgz#362213cf860f468f0125fc6c96abc1742531f948" + integrity sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug= dependencies: - argparse "^1.0.7" - esprima "^2.6.0" + easy-stack "^1.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.x, js-yaml@^3.9.1: - version "3.11.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" jsbn@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jscodeshift@^0.6.3: + version "0.6.4" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.6.4.tgz#e19ab86214edac86a75c4557fc88b3937d558a8e" + integrity sha512-+NF/tlNbc2WEhXUuc4WEJLsJumF84tnaMUZW2hyJw3jThKKRvsPX4sPJVgO1lPE28z0gNL+gwniLG9d8mYvQCQ== + dependencies: + "@babel/core" "^7.1.6" + "@babel/parser" "^7.1.6" + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/preset-env" "^7.1.6" + "@babel/preset-flow" "^7.0.0" + "@babel/preset-typescript" "^7.1.0" + "@babel/register" "^7.0.0" + babel-core "^7.0.0-bridge.0" + colors "^1.1.2" + flow-parser "0.*" + graceful-fs "^4.1.11" + micromatch "^3.1.10" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.16.1" + temp "^0.8.1" + write-file-atomic "^2.3.0" + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsdom@^15.1.1: + version "15.2.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" + integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== + dependencies: + abab "^2.0.0" + acorn "^7.1.0" + acorn-globals "^4.3.2" + array-equal "^1.0.0" + cssom "^0.4.1" + cssstyle "^2.0.0" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.1" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.2.0" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.7" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^7.0.0" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +json5@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" + integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== + dependencies: + minimist "^1.2.5" -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" -jsprim@^1.2.2: +jsonparse@^1.2.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: - extsprintf "1.0.2" + assert-plus "1.0.0" + extsprintf "1.3.0" json-schema "0.2.3" - verror "1.3.6" + verror "1.10.0" -just-extend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -karma-chrome-launcher@^2.0.0: +lcid@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.0.0.tgz#c2790c5a32b15577d0fff5a4d5a2703b3b439c25" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== dependencies: - fs-access "^1.0.0" - which "^1.2.1" + invert-kv "^2.0.0" -karma-firefox-launcher@^1.0.0: +lcov-parse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.0.0.tgz#e08af3ce42e39860c2952ea7b7eaa64d63508bdc" + resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0" + integrity sha1-6w1GtUER68VhrLTECO+TY73I9+A= -karma-mocha-reporter@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/karma-mocha-reporter/-/karma-mocha-reporter-2.2.1.tgz#8508b2f0925433a6417f0c528e53fcb411745758" +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +lerna@^3.18.1: + version "3.20.2" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.20.2.tgz#abf84e73055fe84ee21b46e64baf37b496c24864" + integrity sha512-bjdL7hPLpU3Y8CBnw/1ys3ynQMUjiK6l9iDWnEGwFtDy48Xh5JboR9ZJwmKGCz9A/sarVVIGwf1tlRNKUG9etA== + dependencies: + "@lerna/add" "3.20.0" + "@lerna/bootstrap" "3.20.0" + "@lerna/changed" "3.20.0" + "@lerna/clean" "3.20.0" + "@lerna/cli" "3.18.5" + "@lerna/create" "3.18.5" + "@lerna/diff" "3.18.5" + "@lerna/exec" "3.20.0" + "@lerna/import" "3.18.5" + "@lerna/info" "3.20.0" + "@lerna/init" "3.18.5" + "@lerna/link" "3.18.5" + "@lerna/list" "3.20.0" + "@lerna/publish" "3.20.2" + "@lerna/run" "3.20.0" + "@lerna/version" "3.20.2" + import-local "^2.0.0" + npmlog "^4.1.2" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== dependencies: - chalk "1.1.3" + leven "^3.1.0" -karma-mocha@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-1.3.0.tgz#eeaac7ffc0e201eb63c467440d2b69c7cf3778bf" +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: - minimist "1.2.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" -karma-sourcemap-loader@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8" +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" -karma-webpack@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.1.tgz#271ac955685b9bd99365ef010ffc5655eac28ef6" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= dependencies: - async "~0.9.0" - loader-utils "^0.2.5" - lodash "^3.8.0" - source-map "^0.1.41" - webpack-dev-middleware "^1.0.11" - -karma@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/karma/-/karma-1.4.0.tgz#bf5edbccabb8579cb68ae699871f3e79608ec94b" - dependencies: - bluebird "^3.3.0" - body-parser "^1.12.4" - chokidar "^1.4.1" - colors "^1.1.0" - combine-lists "^1.0.0" - connect "^3.3.5" - core-js "^2.2.0" - di "^0.0.1" - dom-serialize "^2.2.0" - expand-braces "^0.1.1" - glob "^7.1.1" graceful-fs "^4.1.2" - http-proxy "^1.13.0" - isbinaryfile "^3.0.0" - lodash "^3.8.0" - log4js "^0.6.31" - mime "^1.3.4" - minimatch "^3.0.0" - optimist "^0.6.1" - qjobs "^1.1.4" - range-parser "^1.2.0" - rimraf "^2.3.3" - safe-buffer "^5.0.1" - socket.io "1.7.2" - source-map "^0.5.3" - tmp "0.0.28" - useragent "^2.1.10" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" -kind-of@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" +load-json-file@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" + integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== dependencies: - is-buffer "^1.0.2" + graceful-fs "^4.1.15" + parse-json "^4.0.0" + pify "^4.0.1" + strip-bom "^3.0.0" + type-fest "^0.3.0" -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -lcov-parse@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" +loader-utils@^1.0.2, loader-utils@^1.2.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" -loader-utils@^0.2.11, loader-utils@^0.2.5: - version "0.2.16" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" + p-locate "^2.0.0" + path-exists "^3.0.0" -lodash._baseassign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" + p-locate "^3.0.0" + path-exists "^3.0.0" -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" -lodash._basecreate@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.ismatch@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" + integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= + +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.0.2, lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" +lodash@^4.16.4, lodash@^4.17.10, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.2.1: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash.create@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" - dependencies: - lodash._baseassign "^3.0.0" - lodash._basecreate "^3.0.0" - lodash._isiterateecall "^3.0.0" +log-driver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" + integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" +lolex@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" + integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== + dependencies: + "@sinonjs/commons" "^1.7.0" -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lodash@^3.8.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lodash@^4.16.4, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" -lodash@^4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" +macos-release@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" + integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== -log-driver@1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" -log4js@^0.6.31: - version "0.6.38" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: - readable-stream "~1.0.2" - semver "~4.3.3" + pify "^4.0.1" + semver "^5.6.0" -lolex@^2.3.2: - version "2.7.5" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" +make-dir@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" + integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + dependencies: + semver "^6.0.0" + +make-fetch-happen@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd" + integrity sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag== + dependencies: + agentkeepalive "^3.4.1" + cacache "^12.0.0" + http-cache-semantics "^3.8.1" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + node-fetch-npm "^2.0.2" + promise-retry "^1.1.1" + socks-proxy-agent "^4.0.0" + ssri "^6.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== -lolex@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-3.1.0.tgz#1a7feb2fefd75b3e3a7f79f0e110d9476e294434" +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" -longest@^1.0.1: +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= -loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= -lru-cache@2.2.x: - version "2.2.4" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" -lru-cache@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" +matcher@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-2.1.0.tgz#64e1041c15b993e23b786f93320a7474bf833c28" + integrity sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ== dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" + escape-string-regexp "^2.0.0" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" -memory-fs@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" -memory-fs@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" +memory-fs@^0.4.0, memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= dependencies: errno "^0.1.3" readable-stream "^2.0.1" -memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== dependencies: errno "^0.1.3" readable-stream "^2.0.1" -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" -mime-db@~1.26.0: - version "1.26.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" +meow@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" + integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist "^1.1.3" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + +meow@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" -mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: - version "2.1.14" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee" +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: - mime-db "~1.26.0" + bn.js "^4.0.0" + brorand "^1.0.1" -mime@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0, mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -"minimatch@2 || 3", minimatch@^3.0.4: +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.0, minimatch@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== dependencies: - brace-expansion "^1.0.0" + arrify "^1.0.1" + is-plain-obj "^1.1.0" -minimist@0.0.8, minimist@~0.0.1: +minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.2.0, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp-promise@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" + integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= + dependencies: + mkdirp "*" + +mkdirp@*: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.3.tgz#4cf2e30ad45959dddea53ad97d518b6c8205e1ea" + integrity sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g== -mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" -mocha@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" - dependencies: - browser-stdout "1.3.0" - commander "2.9.0" - debug "2.2.0" - diff "1.4.0" - escape-string-regexp "1.0.5" - glob "7.0.5" - growl "1.9.2" - json3 "3.3.2" - lodash.create "3.1.1" - mkdirp "0.5.1" - supports-color "3.1.2" +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" + integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== + dependencies: + minimist "^1.2.5" -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" +modify-values@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.0.0, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multimatch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b" + integrity sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA== + dependencies: + array-differ "^2.0.3" + array-union "^1.0.2" + arrify "^1.0.1" + minimatch "^3.0.4" mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.3.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.0.tgz#aa8f1e34531d807e9e27755b234b4a6ec0c152a8" +mute-stream@0.0.8, mute-stream@~0.0.4: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +mz@^2.5.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.4.10: - version "1.4.10" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.10.tgz#ae46a09a26436fae91a38a60919356ae6db143b6" +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU= dependencies: - "@sinonjs/formatio" "^3.1.0" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - lolex "^2.3.2" - path-to-regexp "^1.7.0" + minimatch "^3.0.2" -node-libs-browser@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-0.7.0.tgz#3e272c0819e308935e26674408d7af0e1491b83b" +node-fetch-npm@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.3.tgz#efae4aacb0500444e449a51fc1467397775ebc38" + integrity sha512-DgwoKEsqLnFZtk3ap7GWBHcHwnUhsNmQqEDcdjfQ8GofLEFJ081NAd4Uin3R7RFZBWVJCwHISw1oaEqPgSLloA== + dependencies: + encoding "^0.1.11" + json-parse-better-errors "^1.0.0" + safe-buffer "^5.1.1" + +node-fetch@^2.3.0, node-fetch@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + +node-gyp@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.0.tgz#8e31260a7af4a2e2f994b0673d4e0b3866156332" + integrity sha512-OUTryc5bt/P8zVgNUmC6xdXiDJxLMAW8cF5tLQOT9E5sOQj+UeQxnnPy74K3CLCa/SOjjBlbuzDLR8ANwA+wmw== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.1.2" + request "^2.88.0" + rimraf "^2.6.3" + semver "^5.7.1" + tar "^4.4.12" + which "^1.3.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-ipc@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.1.1.tgz#4e245ed6938e65100e595ebc5dc34b16e8dd5d69" + integrity sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w== + dependencies: + event-pubsub "4.3.0" + js-message "1.0.5" + js-queue "2.0.0" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" - browserify-zlib "^0.1.4" - buffer "^4.9.0" + browserify-zlib "^0.2.0" + buffer "^4.3.0" console-browserify "^1.1.0" constants-browserify "^1.0.0" - crypto-browserify "3.3.0" + crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "0.0.1" - os-browserify "^0.2.0" - path-browserify "0.0.0" - process "^0.11.0" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" - readable-stream "^2.0.5" + readable-stream "^2.3.3" stream-browserify "^2.0.1" - stream-http "^2.3.1" - string_decoder "^0.10.25" - timers-browserify "^2.0.2" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-pre-gyp@^0.6.29: - version "0.6.32" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" - dependencies: - mkdirp "~0.5.1" - nopt "~3.0.6" - npmlog "^4.0.1" - rc "~1.1.6" - request "^2.79.0" - rimraf "~2.5.4" - semver "~5.3.0" - tar "~2.2.1" - tar-pack "~3.3.0" - -node-uuid@~1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12" + integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw== + dependencies: + growly "^1.3.0" + is-wsl "^2.1.1" + semver "^6.3.0" + shellwords "^0.1.1" + which "^1.3.1" + +node-releases@^1.1.52: + version "1.1.52" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" + integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== + dependencies: + semver "^6.3.0" -nopt@3.x, nopt@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== dependencies: abbrev "1" + osenv "^0.1.4" -normalize-path@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" +normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" -npmlog@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-conf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + +npm-lifecycle@^3.1.2: + version "3.1.4" + resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.4.tgz#de6975c7d8df65f5150db110b57cce498b0b604c" + integrity sha512-tgs1PaucZwkxECGKhC/stbEgFyc3TGh2TJcg2CDr6jbvQRdteHNhmMeljRzpe4wgFAXQADoy1cSqqi7mtiAa5A== + dependencies: + byline "^5.0.0" + graceful-fs "^4.1.15" + node-gyp "^5.0.2" + resolve-from "^4.0.0" + slide "^1.1.6" + uid-number "0.0.6" + umask "^1.1.0" + which "^1.3.1" + +npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" + integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== + dependencies: + hosted-git-info "^2.7.1" + osenv "^0.1.5" + semver "^5.6.0" + validate-npm-package-name "^3.0.0" + +npm-packlist@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + +npm-pick-manifest@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7" + integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw== + dependencies: + figgy-pudding "^3.5.1" + npm-package-arg "^6.0.0" + semver "^5.4.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" - gauge "~2.7.1" + gauge "~2.7.3" set-blocking "~2.0.0" -null-check@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +nwsapi@^2.0.7, nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -object-assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" -object-component@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: - ee-first "1.1.1" + isobject "^3.0.1" + +octokit-pagination-methods@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" + integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== -once@1.x, once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" -optimist@^0.6.1, optimist@~0.6.0: +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" +optionator@^0.8.1, optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" - fast-levenshtein "~2.0.4" + fast-levenshtein "~2.0.6" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" - wordwrap "~1.0.0" + word-wrap "~1.2.3" -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - -os-browserify@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: +os-locale@^3.0.0, os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-name@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + dependencies: + macos-release "^2.2.0" + windows-release "^3.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4, osenv@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" + integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" + p-try "^1.0.0" -parsejson@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== dependencies: - better-assert "~1.0.0" + p-try "^2.0.0" -parseqs@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: - better-assert "~1.0.0" + p-limit "^1.1.0" -parseuri@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: - better-assert "~1.0.0" + p-limit "^2.0.0" -parseurl@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" +p-map-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" + integrity sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco= + dependencies: + p-reduce "^1.0.0" + +p-map@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-pipe@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" + integrity sha1-SxoROZoRUgpneQ7loMHViB1r7+k= + +p-queue@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-4.0.0.tgz#ed0eee8798927ed6f2c2f5f5b77fdb2061a5d346" + integrity sha512-3cRXXn3/O0o3+eVmUroJPSj/esxoEFIm0ZOno/T+NzG/VZgPOqQ8WKmlNqubSEpZmCIngEy34unkHGg83ZIBmg== + dependencies: + eventemitter3 "^3.1.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +p-waterfall@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-1.0.0.tgz#7ed94b3ceb3332782353af6aae11aa9fc235bb00" + integrity sha1-ftlLPOszMngjU69qrhGqn8I1uwA= + dependencies: + p-reduce "^1.0.0" + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-github-repo-url@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" + integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parse-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.1.tgz#0ec769704949778cb3b8eda5e994c32073a1adff" + integrity sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA== + dependencies: + is-ssh "^1.3.0" + protocols "^1.4.0" + +parse-url@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.1.tgz#99c4084fc11be14141efa41b3d117a96fcb9527f" + integrity sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg== + dependencies: + is-ssh "^1.3.0" + normalize-url "^3.3.0" + parse-path "^4.0.0" + protocols "^1.4.0" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - dependencies: - isarray "0.0.1" +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -pathval@^1.0.0: +path-type@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" -pbkdf2-compat@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.5: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== -pify@^2.0.0: +pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" +pirates@^4.0.0, pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== dependencies: - find-up "^1.0.0" + node-modules-regexp "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" platform@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.3.tgz#646c77011899870b6a0903e75e997e8e51da7461" + version "1.3.5" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" + integrity sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q== -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +prettier@^1.14.2, prettier@^1.18.2: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.1.0.tgz#ed869bdaec1356fc5ae45de045e2c8ec7b07b0c8" + integrity sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ== + dependencies: + "@jest/types" "^25.1.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + +private@^0.1.8, private@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== -prettier@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -private@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +progress@^2.0.0, progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -process@^0.11.0: - version "0.11.9" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" +promise-retry@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= + dependencies: + err-code "^1.0.0" + retry "^0.10.0" -proxy-polyfill@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/proxy-polyfill/-/proxy-polyfill-0.1.6.tgz#ef41ec6c66f534db15db36c54493a62d184b364e" +prompts@^2.0.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.4" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= + dependencies: + read "1" -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +protocols@^1.1.0, protocols@^1.4.0: + version "1.4.7" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32" + integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== + +protoduck@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" + integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg== + dependencies: + genfun "^5.0.0" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.2.4, punycode@^1.4.1: +punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -qjobs@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.2.1, qs@~6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" +q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@~6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= -ramda@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" -randomatic@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" + randombytes "^2.0.5" + safe-buffer "^5.1.0" -range-parser@^1.0.3, range-parser@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" +react-is@^16.12.0, react-is@^16.8.4: + version "16.13.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.0.tgz#0f37c3613c34fe6b37cd7f763a0d6293ab15c527" + integrity sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA== -raw-body@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" +read-cmd-shim@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16" + integrity sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA== dependencies: - bytes "2.4.0" - iconv-lite "0.4.15" - unpipe "1.0.0" + graceful-fs "^4.1.2" -rc@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" +"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13: + version "2.1.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1" + integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A== dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~1.0.4" + glob "^7.1.1" + json-parse-better-errors "^1.0.1" + normalize-package-data "^2.0.0" + npm-normalize-package-bin "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" -"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0, readable-stream@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" +read-package-tree@^5.1.6: + version "5.3.1" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636" + integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw== dependencies: - buffer-shims "^1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + util-promisify "^2.1.0" -readable-stream@~1.0.2: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" + find-up "^1.0.0" + read-pkg "^1.0.0" -readable-stream@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" -readable-stream@~2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" +read@1, read@~1.0.1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + dependencies: + mute-stream "~0.0.4" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: - buffer-shims "^1.0.0" core-util-is "~1.0.0" - inherits "~2.0.1" + inherits "~2.0.3" isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" +"readable-stream@2 || 3", readable-stream@^3.0.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdir-scoped-modules@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" + integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" graceful-fs "^4.1.2" - minimatch "^3.0.2" + once "^1.3.0" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" -regenerate@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +recast@^0.16.1: + version "0.16.2" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.16.2.tgz#3796ebad5fe49ed85473b479cd6df554ad725dc2" + integrity sha512-O/7qXi51DPjRVdbrpNzoBQH5dnAPQNbfoOFyRiUwreTMJfIHYOEBzwuH+c0+/BTSJ3CQyKs6ILSWXhESH6Op3A== + dependencies: + ast-types "0.11.7" + esprima "~4.0.0" + private "~0.1.5" + source-map "~0.6.1" -regenerator-runtime@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" -regenerator-transform@0.9.8: - version "0.9.8" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" + indent-string "^3.0.0" + strip-indent "^2.0.0" -regex-cache@^0.4.2: - version "0.4.3" - resolved "http://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== dependencies: - is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" + regenerate "^1.4.0" -regexpp@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.0.1.tgz#d857c3a741dce075c2848dcb019a0a975b190d43" +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + "@babel/runtime" "^7.8.4" + private "^0.1.8" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== dependencies: jsesc "~0.5.0" -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= -repeat-string@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" -request@2.75.0: - version "2.75.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - bl "~1.1.2" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.0.0" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - node-uuid "~1.4.7" - oauth-sign "~0.8.1" - qs "~6.2.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - -request@^2.79.0: - version "2.79.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.5, request-promise-native@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0, request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - qs "~6.3.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - uuid "^3.0.0" - -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" + resolve-from "^3.0.0" -requires-port@1.x.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" -resolve-from@^1.0.0: +resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve@1.1.x: +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.10.0, resolve@^1.3.2: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: - align-text "^0.1.1" + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@~2.5.1, rimraf@~2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" +rimraf@2.6.3, rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: - glob "^7.0.5" + glob "^7.1.3" -ripemd160@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" +rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +roarr@^2.15.2: + version "2.15.2" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.2.tgz#34f6229ae3c8c12167c4ae60f58fe75e79a1e394" + integrity sha512-jmaDhK9CO4YbQAV8zzCnq9vjAqeO489MS5ehZ+rXmFiPFFE6B+S9KYO6prjmLJ5A0zY3QxVlQdrIya7E/azz/Q== + dependencies: + boolean "^3.0.0" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== dependencies: is-promise "^2.1.0" -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= dependencies: - rx-lite "*" + aproba "^1.1.1" -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" +rxjs@^6.4.0, rxjs@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" -safe-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== -semver@^5.3.0, semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sanitize-filename@^1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.1.1, semver@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" + integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA== + +serialize-error@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-5.0.0.tgz#a7ebbcdb03a5d71a6ed8461ffe0fc1a1afed62ac" + integrity sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA== + dependencies: + type-fest "^0.8.0" -semver@~4.3.3: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== -set-blocking@~2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= -setprototypeof@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" -sha.js@2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@^7.2.4: - version "7.2.4" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.2.4.tgz#d834b9a38d8533b4ca3274a9a9ffa8e54c95d10c" - dependencies: - "@sinonjs/commons" "^1.3.0" - "@sinonjs/formatio" "^3.1.0" - "@sinonjs/samsam" "^3.1.1" - diff "^3.5.0" - lolex "^3.1.0" - nise "^1.4.10" - supports-color "^5.5.0" +sisteransi@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" +slide@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + +smart-buffer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: - hoek "2.x.x" + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" -socket.io-adapter@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" - dependencies: - debug "2.3.3" - socket.io-parser "2.3.1" - -socket.io-client@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.2.tgz#39fdb0c3dd450e321b7e40cfd83612ec533dd644" - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "1.2.1" - debug "2.3.3" - engine.io-client "1.8.2" - has-binary "0.1.7" - indexof "0.0.1" - object-component "0.0.3" - parseuri "0.0.5" - socket.io-parser "2.3.1" - to-array "0.1.4" - -socket.io-parser@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" - dependencies: - component-emitter "1.1.2" - debug "2.2.0" - isarray "0.0.1" - json3 "3.3.2" - -socket.io@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.2.tgz#83bbbdf2e79263b378900da403e7843e05dc3b71" - dependencies: - debug "2.3.3" - engine.io "1.8.2" - has-binary "0.1.7" - object-assign "4.1.0" - socket.io-adapter "0.5.0" - socket.io-client "1.7.2" - socket.io-parser "2.3.1" - -source-list-map@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" -source-map-support@^0.4.2: - version "0.4.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.10.tgz#d7b19038040a14c0837a18e630a196453952b378" +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socks-proxy-agent@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" + integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== dependencies: - source-map "^0.5.3" + agent-base "~4.2.1" + socks "~2.3.2" -source-map@^0.1.41: - version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" +socks@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" + integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== dependencies: - amdefine ">=0.0.4" + ip "1.1.5" + smart-buffer "^4.1.0" -source-map@^0.4.4, source-map@~0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= dependencies: - amdefine ">=0.0.4" + is-plain-obj "^1.0.0" -source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split2@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" + integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== + dependencies: + through2 "^2.0.2" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== dependencies: - amdefine ">=0.0.4" + through "2" + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.2.tgz#d5a804ce22695515638e798dbe23273de070a5fa" + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" -"statuses@>= 1.3.1 < 2", statuses@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" +ssri@^6.0.0, ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" readable-stream "^2.0.2" -stream-http@^2.3.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.6.2.tgz#bdfe40d2ee9262eb6bf2255bb3ad0ec0cdd6526d" +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" - readable-stream "^2.1.0" + readable-stream "^2.3.6" to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string-length@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== + dependencies: + astral-regex "^1.0.0" + strip-ansi "^5.2.0" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string_decoder@^0.10.25, string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +strong-log-transformer@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" + integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== + dependencies: + duplexer "^0.1.1" + minimist "^1.2.0" + through "^2.3.4" + +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + +supports-color@6.1.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== dependencies: - ansi-regex "^3.0.0" + has-flag "^4.0.0" -strip-json-comments@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" +supports-hyperlinks@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" + integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -supports-color@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== dependencies: - has-flag "^1.0.0" + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" +temp-write@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492" + integrity sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI= + dependencies: + graceful-fs "^4.1.2" + is-stream "^1.1.0" + make-dir "^1.0.0" + pify "^3.0.0" + temp-dir "^1.0.0" + uuid "^3.0.1" -supports-color@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" +temp@^0.8.1: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== dependencies: - has-flag "^1.0.0" + rimraf "~2.6.2" -supports-color@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.6.7" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" + integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: - has-flag "^3.0.0" + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" -supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= dependencies: - has-flag "^3.0.0" + thenify ">= 3.1.0 < 4" -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" +"thenify@>= 3.1.0 < 4": + version "3.3.0" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" + any-promise "^1.0.0" -tapable@^0.1.8, tapable@~0.1.8: - version "0.1.10" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" +throat@^4.0.0, throat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= -tar-pack@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" - dependencies: - debug "~2.2.0" - fstream "~1.0.10" - fstream-ignore "~1.0.5" - once "~1.3.3" - readable-stream "~2.1.4" - rimraf "~2.5.1" - tar "~2.2.1" - uid-number "~0.0.6" - -tar@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +through2@^2.0.0, through2@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" + readable-stream "~2.3.6" + xtend "~4.0.1" -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" +through2@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" -through@^2.3.6: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -timers-browserify@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== dependencies: setimmediate "^1.0.4" -tmp@0.0.28: - version "0.0.28" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" - dependencies: - os-tmpdir "~1.0.1" - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-fast-properties@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -topo@2.x.x: - version "2.0.2" - resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: - hoek "4.x.x" + kind-of "^3.0.2" -tough-cookie@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: - punycode "^1.4.1" + is-number "^3.0.0" + repeat-string "^1.6.1" -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= + +trim-off-newlines@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + dependencies: + utf8-byte-length "^1.0.1" + +tslib@^1.8.1, tslib@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= -tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0: +type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +type-fest@^0.8.0, type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.14: - version "1.6.14" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: - media-typer "0.3.0" - mime-types "~2.1.13" + is-typedarray "^1.0.0" typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -uglify-js@^2.6, uglify-js@~2.7.3: - version "2.7.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" +uglify-js@^3.1.4: + version "3.8.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.8.0.tgz#f3541ae97b2f048d7e7e3aa4f39fd8a1f5d7a805" + integrity sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ== dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + commander "~2.20.3" + source-map "~0.6.1" -uid-number@~0.0.6: +uid-number@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" +umask@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universal-user-agent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.1.tgz#fd8d6cb773a679a709e967ef8288a31fcc03e557" + integrity sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg== + dependencies: + os-name "^3.1.0" + +universal-user-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-5.0.0.tgz#a3182aa758069bf0e79952570ca757de3579c1d9" + integrity sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q== + dependencies: + os-name "^3.1.0" -unpipe@1.0.0, unpipe@~1.0.0: +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unset-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1, upath@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" -useragent@^2.1.10: - version "2.1.10" - resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.10.tgz#2456c5c2b722b47f3d8321ed257b490a3d9bb2af" - dependencies: - lru-cache "2.2.x" +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util@0.10.3, util@^0.10.3: +util-promisify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" + integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= + dependencies: + object.getownpropertydescriptors "^2.0.3" + +util.promisify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" -uuid@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" +uuid@^3.0.1, uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +v8-to-istanbul@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.2.tgz#387d173be5383dbec209d21af033dcb892e3ac82" + integrity sha512-G9R+Hpw0ITAmPSr47lSlc5A1uekSYzXxTMlFxso2xoffwo4jQnzbv1p9yXIinO8UMZKfAFewaCHwWvnH4Jb4Ug== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: - extsprintf "1.0.2" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= dependencies: - indexof "0.0.1" + builtins "^1.0.3" -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" -watchpack@^0.2.1: - version "0.2.9" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b" +watchpack@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== dependencies: - async "^0.9.0" - chokidar "^1.0.0" + chokidar "^2.0.2" graceful-fs "^4.1.2" + neo-async "^2.5.0" -webpack-core@~0.6.9: - version "0.6.9" - resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= dependencies: - source-list-map "~0.1.7" - source-map "~0.4.1" + defaults "^1.0.3" -webpack-dev-middleware@^1.0.11: - version "1.9.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.9.0.tgz#a1c67a3dfd8a5c5d62740aa0babe61758b4c84aa" +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-cli@^3.3.9: + version "3.3.11" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" + integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.41.2: + version "4.42.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: - memory-fs "~0.4.1" - mime "^1.3.4" - path-is-absolute "^1.0.0" - range-parser "^1.0.3" + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -webpack@^1.13.3: - version "1.14.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.14.0.tgz#54f1ffb92051a328a5b2057d6ae33c289462c823" +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== dependencies: - acorn "^3.0.0" - async "^1.3.0" - clone "^1.0.2" - enhanced-resolve "~0.9.0" - interpret "^0.6.4" - loader-utils "^0.2.11" - memory-fs "~0.3.0" - mkdirp "~0.5.0" - node-libs-browser "^0.7.0" - optimist "~0.6.0" - supports-color "^3.1.0" - tapable "~0.1.8" - uglify-js "~2.7.3" - watchpack "^0.2.1" - webpack-core "~0.6.9" - -which@^1.1.1, which@^1.2.1, which@^1.2.9: - version "1.2.12" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== dependencies: - isexe "^1.1.1" + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" -wide-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: - string-width "^1.0.1" + isexe "^2.0.0" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +windows-release@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" + integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== + dependencies: + execa "^1.0.0" -wordwrap@^1.0.0, wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== dependencies: - mkdirp "^0.5.1" + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" -ws@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" +write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: - options ">=0.0.5" - ultron "1.0.x" + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" -wtf-8@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" +write-json-file@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" + integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + pify "^3.0.0" + sort-keys "^2.0.0" + write-file-atomic "^2.0.0" -xmlhttprequest-ssl@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" +write-json-file@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" + integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.15" + make-dir "^2.1.0" + pify "^4.0.1" + sort-keys "^2.0.0" + write-file-atomic "^2.4.2" -xtend@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" +write-pkg@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.2.0.tgz#0e178fe97820d389a8928bc79535dbe68c2cff21" + integrity sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw== + dependencies: + sort-keys "^2.0.0" + write-json-file "^2.2.0" -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" + async-limiter "~1.0.0" -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" +ws@^7.0.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" + integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.1.0, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" + integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.1: + version "18.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.1.tgz#bf7407b915427fc760fcbbccc6c82b4f0ffcbd37" + integrity sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + +yargs@^12.0.1: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^14.2.2: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + +yargs@^15.0.0: + version "15.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.1" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= + dependencies: + fd-slicer "~1.0.1"